From 5966b9f4b5430caaedfa9fbd6b30fd047a497fbf Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 26 Jun 2025 10:33:33 +0700 Subject: reset voucher usage limit when canceled --- indoteknik_api/controllers/api_v1/voucher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py index 9ffeeace..610bcd60 100644 --- a/indoteknik_api/controllers/api_v1/voucher.py +++ b/indoteknik_api/controllers/api_v1/voucher.py @@ -74,7 +74,7 @@ class Voucher(controller.Controller): partner_voucher_orders = [] for order in voucher.order_ids: - if order.partner_id.id == user.partner_id.id: + if order.partner_id.id == user.partner_id.id and order.state != 'cancel': partner_voucher_orders.append(order) if voucher.limit_user > 0 and len(partner_voucher_orders) >= voucher.limit_user: -- cgit v1.2.3 From 71078342e5199834e3c0bc9d9844a426bb156260 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 26 Jun 2025 13:40:20 +0700 Subject: reset voucher usage limit when canceled --- indoteknik_api/controllers/api_v1/voucher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py index 610bcd60..0338360b 100644 --- a/indoteknik_api/controllers/api_v1/voucher.py +++ b/indoteknik_api/controllers/api_v1/voucher.py @@ -74,7 +74,7 @@ class Voucher(controller.Controller): partner_voucher_orders = [] for order in voucher.order_ids: - if order.partner_id.id == user.partner_id.id and order.state != 'cancel': + if order.partner_id.id == user.partner_id.id and order.state != 'cancel' and (order.payment_status or order.payment_status is None): partner_voucher_orders.append(order) if voucher.limit_user > 0 and len(partner_voucher_orders) >= voucher.limit_user: -- cgit v1.2.3 From b1c7b43c51c670e42a0dd2399139fbd9a600f121 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Thu, 24 Jul 2025 16:16:36 +0700 Subject: is disc item from web --- indoteknik_custom/models/sale_order_line.py | 14 ++++++++++++++ indoteknik_custom/views/sale_order.xml | 1 + 2 files changed, 15 insertions(+) diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index 5e9fc362..f2799319 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -1,6 +1,9 @@ from odoo import fields, models, api, _ from odoo.exceptions import UserError from datetime import datetime, timedelta +import logging + +__logger = logging.getLogger(__name__) class SaleOrderLine(models.Model): @@ -49,6 +52,17 @@ class SaleOrderLine(models.Model): qty_free_bu = fields.Float(string='Free BU', compute='_get_qty_free_bandengan') desc_updatable = fields.Boolean(string='desc boolean', default=True, compute='_get_desc_updatable') + is_has_disc = fields.Boolean('FlashSale Item', compute='_compute_is_has_disc', default=False) + + @api.depends('discount', 'order_id.source_id') + def _compute_is_has_disc(self): + for line in self: + line.is_has_disc = ( + line.discount > 0 and + line.order_id.source_id and + line.order_id.source_id.id == 59 + ) + def _get_outgoing_incoming_moves(self): outgoing_moves = self.env['stock.move'] incoming_moves = self.env['stock.move'] diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index 346dc0f8..532fccc2 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -289,6 +289,7 @@ + Date: Sat, 26 Jul 2025 09:23:07 +0700 Subject: push --- indoteknik_custom/views/refund_sale_order.xml | 199 -------------------------- 1 file changed, 199 deletions(-) delete mode 100644 indoteknik_custom/views/refund_sale_order.xml diff --git a/indoteknik_custom/views/refund_sale_order.xml b/indoteknik_custom/views/refund_sale_order.xml deleted file mode 100644 index 4f791722..00000000 --- a/indoteknik_custom/views/refund_sale_order.xml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - refund.sale.order.tree - refund.sale.order - - - - - - - - - - - - - - - - - - - - - - - - refund.sale.order.form - refund.sale.order - -
-
-
- -
- -
- - - -

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
-
-
- - - Refund Sales Order - refund.sale.order - tree,form - - - - -
-- cgit v1.2.3 From ae201ad5ac392a75da087a5e1215f9b8fcd50dba Mon Sep 17 00:00:00 2001 From: Miqdad Date: Sat, 26 Jul 2025 12:35:36 +0700 Subject: push --- indoteknik_custom/models/sale_order_line.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index f2799319..bc1fcd09 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -54,14 +54,29 @@ class SaleOrderLine(models.Model): is_has_disc = fields.Boolean('FlashSale Item', compute='_compute_is_has_disc', default=False) - @api.depends('discount', 'order_id.source_id') + @api.depends('product_id', 'price_unit', 'order_id.source_id') def _compute_is_has_disc(self): + website_source_id = 59 + excluded_pricelist_ids = [17022, 17027, 17026, 17025, 17024, 17023] + for line in self: - line.is_has_disc = ( - line.discount > 0 and - line.order_id.source_id and - line.order_id.source_id.id == 59 - ) + line.is_has_disc = False # default + + # Step 1: Bukan dari website? Skip + if not line.order_id.source_id or line.order_id.source_id.id != website_source_id: + continue + + # Step 2: Ambil semua pricelist item berdasarkan produk + pricelist_items = self.env['product.pricelist.item'].search([ + ('product_id', '=', line.product_id.id), + ('pricelist_id', 'not in', excluded_pricelist_ids), + ]) + + # Step 3: Jika ada pricelist_items, tandai sebagai flashsale + if pricelist_items: + line.is_has_disc = True + elif not pricelist_items: + line.is_has_disc = False def _get_outgoing_incoming_moves(self): outgoing_moves = self.env['stock.move'] -- cgit v1.2.3 From aeb450314a0440806ceb300c71c5776d42289ad4 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Sat, 26 Jul 2025 21:02:52 +0700 Subject: push --- indoteknik_api/controllers/api_v1/sale_order.py | 31 ++++++++++++++++++++----- indoteknik_custom/models/sale_order_line.py | 28 +++------------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index e1c643e5..fbf1dc15 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -470,28 +470,47 @@ class SaleOrder(controller.Controller): source = params['value']['source'] carts = user_cart.get_product_by_user(user_id=user_id, selected=True, source=source) + excluded_pricelist_ids = [ + int(config.get_param('product.pricelist.tier1_v2')), + int(config.get_param('product.pricelist.tier2_v2')), + int(config.get_param('product.pricelist.tier3_v2')), + int(config.get_param('product.pricelist.tier4_v2')), + ] + promotions = [] for cart in carts: if cart['cart_type'] == 'product': - order_line = request.env['sale.order.line'].create({ + cart_pricelist_id = cart['price'].get('pricelist_id') + + is_has_disc = False + if cart_pricelist_id and cart_pricelist_id not in excluded_pricelist_ids: + is_has_disc = True + elif params['value'].get('flash_sale'): # fallback jika pricelist_id tidak tersedia + is_has_disc = False + + line_vals = { 'company_id': 1, 'order_id': sale_order.id, 'product_id': cart['id'], 'product_uom_qty': cart['quantity'], - 'product_available_quantity': cart['available_quantity'] - }) + 'product_available_quantity': cart['available_quantity'], + 'price_unit': cart['price']['price'], + 'discount': cart['price']['discount_percentage'], + 'is_has_disc': is_has_disc + } + + order_line = request.env['sale.order.line'].create(line_vals) order_line.product_id_change() order_line.weight = order_line.product_id.weight order_line.onchange_vendor_id() - order_line.price_unit = cart['price']['price'] - order_line.discount = cart['price']['discount_percentage'] + elif cart['cart_type'] == 'promotion': promotions.append({ 'order_id': sale_order.id, 'program_line_id': cart['id'], 'quantity': cart['quantity'] }) - + sale_order._compute_etrts_date() request.env['sale.order.promotion'].create(promotions) diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index bc1fcd09..ff2e9009 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -2,8 +2,9 @@ from odoo import fields, models, api, _ from odoo.exceptions import UserError from datetime import datetime, timedelta import logging +from odoo.tools.float_utils import float_compare -__logger = logging.getLogger(__name__) +_logger = logging.getLogger(__name__) class SaleOrderLine(models.Model): @@ -52,31 +53,8 @@ class SaleOrderLine(models.Model): qty_free_bu = fields.Float(string='Free BU', compute='_get_qty_free_bandengan') desc_updatable = fields.Boolean(string='desc boolean', default=True, compute='_get_desc_updatable') - is_has_disc = fields.Boolean('FlashSale Item', compute='_compute_is_has_disc', default=False) + is_has_disc = fields.Boolean('FlashSale Item', default=False) - @api.depends('product_id', 'price_unit', 'order_id.source_id') - def _compute_is_has_disc(self): - website_source_id = 59 - excluded_pricelist_ids = [17022, 17027, 17026, 17025, 17024, 17023] - - for line in self: - line.is_has_disc = False # default - - # Step 1: Bukan dari website? Skip - if not line.order_id.source_id or line.order_id.source_id.id != website_source_id: - continue - - # Step 2: Ambil semua pricelist item berdasarkan produk - pricelist_items = self.env['product.pricelist.item'].search([ - ('product_id', '=', line.product_id.id), - ('pricelist_id', 'not in', excluded_pricelist_ids), - ]) - - # Step 3: Jika ada pricelist_items, tandai sebagai flashsale - if pricelist_items: - line.is_has_disc = True - elif not pricelist_items: - line.is_has_disc = False def _get_outgoing_incoming_moves(self): outgoing_moves = self.env['stock.move'] -- cgit v1.2.3 From d1911795581a7528aef706fd0f26ea7e9b8014c2 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Sun, 27 Jul 2025 13:23:20 +0700 Subject: done(?) --- indoteknik_api/controllers/api_v1/sale_order.py | 342 ++++++++++++++---------- 1 file changed, 199 insertions(+), 143 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index fbf1dc15..ccab2827 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -3,6 +3,9 @@ from odoo import http from datetime import datetime, timedelta from odoo.http import request import json +import logging + +_logger = logging.getLogger(__name__) class SaleOrder(controller.Controller): @@ -390,157 +393,210 @@ class SaleOrder(controller.Controller): @http.route(PREFIX_PARTNER + 'sale_order/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def create_partner_sale_order(self, **kw): - config = request.env['ir.config_parameter'] - product_pricelist_default_discount_id = int(config.get_param('product.pricelist.tier1_v2')) - user_pricelist = request.env.context.get('user_pricelist').id or False - - params = self.get_request_params(kw, { - 'user_id': ['number'], - 'partner_id': ['number'], - 'partner_shipping_id': ['required', 'number'], - 'partner_invoice_id': ['required', 'number'], - 'order_line': ['required', 'default:[]'], - 'po_number': [], - 'po_file': [], - 'type': [], - 'delivery_amount': ['number', 'default:0'], - 'carrier_id': [], - 'delivery_service_type': [], - 'flash_sale': ['boolean'], - 'note_website': [], - 'voucher': [], - 'source': [], - 'estimated_arrival_days': ['number', 'default:0'], - 'estimated_arrival_days_start': ['number', 'default:0'] - }) - - if not params['valid']: - return self.response(code=400, description=params) + _logger.info("=== START CREATE PARTNER SALE ORDER ===") + + try: + config = request.env['ir.config_parameter'] + product_pricelist_default_discount_id = int(config.get_param('product.pricelist.tier1_v2')) + user_pricelist = request.env.context.get('user_pricelist').id or False + _logger.info( + f"Config - Default Pricelist: {product_pricelist_default_discount_id}, User Pricelist: {user_pricelist}") + + params = self.get_request_params(kw, { + 'user_id': ['number'], + 'partner_id': ['number'], + 'partner_shipping_id': ['required', 'number'], + 'partner_invoice_id': ['required', 'number'], + 'order_line': ['required', 'default:[]'], + 'po_number': [], + 'po_file': [], + 'type': [], + 'delivery_amount': ['number', 'default:0'], + 'carrier_id': [], + 'delivery_service_type': [], + 'flash_sale': ['boolean'], + 'note_website': [], + 'voucher': [], + 'source': [], + 'estimated_arrival_days': ['number', 'default:0'], + 'estimated_arrival_days_start': ['number', 'default:0'] + }) - # Fetch partner details - sales_partner = request.env['res.partner'].browse(params['value']['partner_id']) - partner_invoice = request.env['res.partner'].browse(params['value']['partner_invoice_id']) - main_partner = partner_invoice.get_main_parent() - parameters = { - 'warehouse_id': 8, - 'carrier_id': 1, - 'sales_tax_id': 23, - 'pricelist_id': user_pricelist or product_pricelist_default_discount_id, - 'payment_term_id': 26, - 'team_id': 2, - 'company_id': 1, - 'currency_id': 12, - 'source_id': 59, - 'state': 'draft', - 'picking_policy': 'direct', - 'partner_id': params['value']['partner_id'], - 'partner_shipping_id': params['value']['partner_shipping_id'], - 'real_shipping_id': params['value']['partner_shipping_id'], - 'partner_invoice_id': main_partner.id, - 'real_invoice_id': params['value']['partner_invoice_id'], - 'partner_purchase_order_name': params['value']['po_number'], - 'partner_purchase_order_file': params['value']['po_file'], - 'delivery_amt': params['value']['delivery_amount'] * 1.10, - 'estimated_arrival_days': params['value']['estimated_arrival_days'], - 'estimated_arrival_days_start': params['value']['estimated_arrival_days_start'], - 'shipping_cost_covered': 'customer', - 'shipping_paid_by': 'customer', - 'carrier_id': params['value']['carrier_id'], - 'delivery_service_type': params['value']['delivery_service_type'], - 'flash_sale': params['value']['flash_sale'], - 'note_website': params['value']['note_website'], - 'customer_type': sales_partner.customer_type if sales_partner else 'nonpkp', # Get Customer Type from partner - 'npwp': sales_partner.npwp or '0', # Get NPWP from partner - 'sppkp': sales_partner.sppkp, # Get SPPKP from partner - 'email': sales_partner.email, # Get Email from partner - 'user_id': 11314 # User ID: Boy Revandi - } - - sales_partner = request.env['res.partner'].browse(parameters['partner_id']) - if sales_partner and sales_partner.user_id and sales_partner.user_id.id not in [25]: # 25: System - parameters['user_id'] = sales_partner.user_id.id - - if params['value']['type'] == 'sale_order': - parameters['approval_status'] = 'pengajuan1' - sale_order = request.env['sale.order'].with_context(from_website_checkout=True).create([parameters]) - sale_order.onchange_partner_contact() - - user_id = params['value']['user_id'] - user_cart = request.env['website.user.cart'] - source = params['value']['source'] - carts = user_cart.get_product_by_user(user_id=user_id, selected=True, source=source) - - excluded_pricelist_ids = [ - int(config.get_param('product.pricelist.tier1_v2')), - int(config.get_param('product.pricelist.tier2_v2')), - int(config.get_param('product.pricelist.tier3_v2')), - int(config.get_param('product.pricelist.tier4_v2')), - ] + _logger.info(f"Raw input params: {kw}") + _logger.info(f"Processed params: {params}") - promotions = [] - for cart in carts: - if cart['cart_type'] == 'product': - cart_pricelist_id = cart['price'].get('pricelist_id') + if not params['valid']: + _logger.error(f"Invalid params: {params}") + return self.response(code=400, description=params) - is_has_disc = False - if cart_pricelist_id and cart_pricelist_id not in excluded_pricelist_ids: - is_has_disc = True - elif params['value'].get('flash_sale'): # fallback jika pricelist_id tidak tersedia - is_has_disc = False + # Fetch partner details + sales_partner = request.env['res.partner'].browse(params['value']['partner_id']) + partner_invoice = request.env['res.partner'].browse(params['value']['partner_invoice_id']) + main_partner = partner_invoice.get_main_parent() + _logger.info( + f"Partner Info - Sales: {sales_partner.id}, Invoice: {partner_invoice.id}, Main: {main_partner.id}") - line_vals = { - 'company_id': 1, - 'order_id': sale_order.id, - 'product_id': cart['id'], - 'product_uom_qty': cart['quantity'], - 'product_available_quantity': cart['available_quantity'], - 'price_unit': cart['price']['price'], - 'discount': cart['price']['discount_percentage'], - 'is_has_disc': is_has_disc - } + parameters = { + 'warehouse_id': 8, + 'carrier_id': 1, + 'sales_tax_id': 23, + 'pricelist_id': user_pricelist or product_pricelist_default_discount_id, + 'payment_term_id': 26, + 'team_id': 2, + 'company_id': 1, + 'currency_id': 12, + 'source_id': 59, + 'state': 'draft', + 'picking_policy': 'direct', + 'partner_id': params['value']['partner_id'], + 'partner_shipping_id': params['value']['partner_shipping_id'], + 'real_shipping_id': params['value']['partner_shipping_id'], + 'partner_invoice_id': main_partner.id, + 'real_invoice_id': params['value']['partner_invoice_id'], + 'partner_purchase_order_name': params['value']['po_number'], + 'partner_purchase_order_file': params['value']['po_file'], + 'delivery_amt': params['value']['delivery_amount'] * 1.10, + 'estimated_arrival_days': params['value']['estimated_arrival_days'], + 'estimated_arrival_days_start': params['value']['estimated_arrival_days_start'], + 'shipping_cost_covered': 'customer', + 'shipping_paid_by': 'customer', + 'carrier_id': params['value']['carrier_id'], + 'delivery_service_type': params['value']['delivery_service_type'], + 'flash_sale': params['value']['flash_sale'], + 'note_website': params['value']['note_website'], + 'customer_type': sales_partner.customer_type if sales_partner else 'nonpkp', + 'npwp': sales_partner.npwp or '0', + 'sppkp': sales_partner.sppkp, + 'email': sales_partner.email, + 'user_id': 11314 + } + _logger.info(f"Order parameters: {parameters}") + + sales_partner = request.env['res.partner'].browse(parameters['partner_id']) + if sales_partner and sales_partner.user_id and sales_partner.user_id.id not in [25]: + parameters['user_id'] = sales_partner.user_id.id + _logger.info(f"Updated user_id from partner: {parameters['user_id']}") + + if params['value']['type'] == 'sale_order': + parameters['approval_status'] = 'pengajuan1' + _logger.info("Setting approval_status to 'pengajuan1'") + + sale_order = request.env['sale.order'].with_context(from_website_checkout=True).create([parameters]) + sale_order.onchange_partner_contact() + _logger.info(f"Created SO: {sale_order.id} - {sale_order.name}") + + user_id = params['value']['user_id'] + user_cart = request.env['website.user.cart'] + source = params['value']['source'] + _logger.info(f"Getting cart for user: {user_id}, source: {source}") + + carts = user_cart.get_product_by_user(user_id=user_id, selected=True, source=source) + _logger.info(f"Found {len(carts)} cart items") + + promotions = [] + for idx, cart in enumerate(carts, 1): + _logger.info(f"\n=== Processing Cart Item {idx}/{len(carts)} ===") + _logger.info(f"Full cart data: {cart}") + + if cart['cart_type'] == 'product': + product = request.env['product.product'].browse(cart['id']) + _logger.info(f"Product: {product.id} - {product.name}") + _logger.info(f"Cart Price Data: {cart['price']}") + + # Determine discount status based on: + # 1. has_flashsale flag from cart data + # 2. discount percentage > 0 + # 3. global flash sale parameter + is_flash_sale_item = cart.get('has_flashsale', False) + discount_percent = float(cart['price'].get('discount_percentage', 0)) + global_flash_sale = params['value'].get('flash_sale', False) - order_line = request.env['sale.order.line'].create(line_vals) - order_line.product_id_change() - order_line.weight = order_line.product_id.weight - order_line.onchange_vendor_id() + is_has_disc = False - elif cart['cart_type'] == 'promotion': - promotions.append({ - 'order_id': sale_order.id, - 'program_line_id': cart['id'], - 'quantity': cart['quantity'] - }) + # Item is considered discounted if: + # - It's specifically marked as flash sale item, OR + # - It has significant discount (>0%) and not affected by global flash sale + if is_flash_sale_item: + is_has_disc = True + _logger.info("Item is flash sale product - marked as discounted") + elif discount_percent > 0 and not global_flash_sale: + is_has_disc = True + _logger.info(f"Item has discount {discount_percent}% - marked as discounted") + elif global_flash_sale: + _logger.info("Global flash sale active but item not eligible - not marked as discounted") + + _logger.info(f"Final is_has_disc: {is_has_disc}") + + order_line = request.env['sale.order.line'].create({ + 'company_id': 1, + 'order_id': sale_order.id, + 'product_id': product.id, + 'product_uom_qty': cart['quantity'], + 'product_available_quantity': cart['available_quantity'], + 'price_unit': cart['price']['price'], + 'discount': discount_percent, + 'is_has_disc': is_has_disc + }) + _logger.info(f"Created order line: {order_line.id}") + + order_line.product_id_change() + order_line.weight = order_line.product_id.weight + order_line.onchange_vendor_id() + _logger.info(f"After onchanges - Price: {order_line.price_unit}, Disc: {order_line.discount}") + + elif cart['cart_type'] == 'promotion': + promotions.append({ + 'order_id': sale_order.id, + 'program_line_id': cart['id'], + 'quantity': cart['quantity'] + }) + _logger.info(f"Added promotion: {cart['id']}") + + _logger.info("Processing promotions...") + sale_order._compute_etrts_date() + request.env['sale.order.promotion'].create(promotions) + + if len(promotions) > 0: + _logger.info(f"Applying {len(promotions)} promotions") + sale_order.apply_promotion_program() + sale_order.add_free_product(promotions) + + voucher_code = params['value']['voucher'] + if voucher_code: + _logger.info(f"Processing voucher: {voucher_code}") + voucher = request.env['voucher'].search( + [('code', '=', voucher_code), ('apply_type', 'in', ['all', 'brand'])], limit=1) + voucher_shipping = request.env['voucher'].search( + [('code', '=', voucher_code), ('apply_type', 'in', ['shipping'])], limit=1) + + if voucher and len(promotions) == 0: + _logger.info("Applying regular voucher") + sale_order.voucher_id = voucher.id + sale_order.apply_voucher() + + if voucher_shipping and len(promotions) == 0: + _logger.info("Applying shipping voucher") + sale_order.voucher_shipping_id = voucher_shipping.id + sale_order.apply_voucher_shipping() + + cart_ids = [x['cart_id'] for x in carts] + if sale_order._requires_approval_margin_leader(): + sale_order.approval_status = 'pengajuan2' + _logger.info("Approval status set to 'pengajuan2'") + elif sale_order._requires_approval_margin_manager(): + sale_order.approval_status = 'pengajuan1' + _logger.info("Approval status set to 'pengajuan1'") - sale_order._compute_etrts_date() + sale_order._auto_set_shipping_from_website() + _logger.info("=== END CREATE PARTNER SALE ORDER ===") + return self.response({ + 'id': sale_order.id, + 'name': sale_order.name + }) - request.env['sale.order.promotion'].create(promotions) - - if len(promotions) > 0: - sale_order.apply_promotion_program() - sale_order.add_free_product(promotions) - - voucher_code = params['value']['voucher'] - voucher = request.env['voucher'].search([('code', '=', voucher_code),('apply_type', 'in', ['all', 'brand'])], limit=1) - voucher_shipping = request.env['voucher'].search([('code', '=', voucher_code),('apply_type', 'in', ['shipping'])], limit=1) - if voucher and len(promotions) == 0: - sale_order.voucher_id = voucher.id - sale_order.apply_voucher() - - if voucher_shipping and len(promotions) == 0: - sale_order.voucher_shipping_id = voucher_shipping.id - sale_order.apply_voucher_shipping() - - cart_ids = [x['cart_id'] for x in carts] - if sale_order._requires_approval_margin_leader(): #jika ada error tambahkan kondisi if params['value']['type'] == 'sale_order': - sale_order.approval_status = 'pengajuan2' - elif sale_order._requires_approval_margin_manager(): - sale_order.approval_status = 'pengajuan1' - # user_cart.browse(cart_ids).unlink() - sale_order._auto_set_shipping_from_website() - return self.response({ - 'id': sale_order.id, - 'name': sale_order.name - }) + except Exception as e: + _logger.error(f"Error in create_partner_sale_order: {str(e)}", exc_info=True) + return self.response(code=500, description=str(e)) @http.route(PREFIX_PARTNER + 'sale-order//awb', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized(private=True, private_key='partner_id') -- cgit v1.2.3 From e2c727fc2d1a2c9c3601368df7d4701d9b71fb82 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Mon, 28 Jul 2025 08:46:21 +0700 Subject: done(?) --- indoteknik_custom/models/sale_order_line.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index ff2e9009..428e1a9c 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -53,7 +53,7 @@ class SaleOrderLine(models.Model): qty_free_bu = fields.Float(string='Free BU', compute='_get_qty_free_bandengan') desc_updatable = fields.Boolean(string='desc boolean', default=True, compute='_get_desc_updatable') - is_has_disc = fields.Boolean('FlashSale Item', default=False) + is_has_disc = fields.Boolean('Website Disc?', default=False) def _get_outgoing_incoming_moves(self): -- cgit v1.2.3 From d5eb5c9139f016498cc70d6f241b8597b0b4b06b Mon Sep 17 00:00:00 2001 From: Miqdad Date: Mon, 28 Jul 2025 11:05:50 +0700 Subject: push --- indoteknik_custom/models/sale_order_line.py | 2 +- indoteknik_custom/views/sale_order.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py index 428e1a9c..64b9f9bc 100644 --- a/indoteknik_custom/models/sale_order_line.py +++ b/indoteknik_custom/models/sale_order_line.py @@ -53,7 +53,7 @@ class SaleOrderLine(models.Model): qty_free_bu = fields.Float(string='Free BU', compute='_get_qty_free_bandengan') desc_updatable = fields.Boolean(string='desc boolean', default=True, compute='_get_desc_updatable') - is_has_disc = fields.Boolean('Website Disc?', default=False) + is_has_disc = fields.Boolean('Flash Sale', default=False) def _get_outgoing_incoming_moves(self): diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index c166ecad..79ac3ed9 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -292,7 +292,7 @@ - +
Date: Mon, 28 Jul 2025 14:58:11 +0700 Subject: fix bug manufacturing --- indoteknik_custom/models/mrp_production.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indoteknik_custom/models/mrp_production.py b/indoteknik_custom/models/mrp_production.py index 7977bdf7..91da0597 100644 --- a/indoteknik_custom/models/mrp_production.py +++ b/indoteknik_custom/models/mrp_production.py @@ -156,7 +156,7 @@ class MrpProduction(models.Model): 'order_id': new_po.id }]) - new_po.button_confirm() + # new_po.button_confirm() self.is_po = True @@ -247,7 +247,7 @@ class CheckBomProduct(models.Model): @api.constrains('production_id', 'product_id') def _check_product_bom_validation(self): for record in self: - if record.production_id.sale_order.state not in ['sale', 'done']: + if record.production_id.sale_order and record.production_id.sale_order.state not in ['sale', 'done']: raise UserError(( "SO harus diconfirm terlebih dahulu." )) @@ -273,13 +273,13 @@ class CheckBomProduct(models.Model): if existing_lines: total_quantity = sum(existing_lines.mapped('quantity')) - if total_quantity < total_qty_in_moves: + if total_quantity > total_qty_in_moves: raise UserError(( "Quantity Product '%s' kurang dari quantity demand." ) % (record.product_id.display_name)) else: # Check if the quantity exceeds the allowed total - if record.quantity < total_qty_in_moves: + if record.quantity > total_qty_in_moves: raise UserError(( "Quantity Product '%s' kurang dari quantity demand." ) % (record.product_id.display_name)) -- cgit v1.2.3 From 827e375b8f20716e08b8e1556961cf243b6a6cb4 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Mon, 28 Jul 2025 17:58:17 +0700 Subject: push --- indoteknik_custom/views/sale_order.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index 79ac3ed9..d75120b7 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -290,9 +290,9 @@ + - Date: Tue, 29 Jul 2025 11:50:51 +0700 Subject: (andri) sales id customer benefits --- indoteknik_custom/models/commision.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py index 26b5df37..9f7df464 100644 --- a/indoteknik_custom/models/commision.py +++ b/indoteknik_custom/models/commision.py @@ -215,9 +215,8 @@ class CustomerCommision(models.Model): grouped_so_number = fields.Char(string='Group SO Number', compute='_compute_grouped_numbers') grouped_invoice_number = fields.Char(string='Group Invoice Number', compute='_compute_grouped_numbers') - sales_id = fields.Many2one('res.users', string="Sales", tracking=True, default=lambda self: self.env.user, - domain=lambda self: [ - ('groups_id', 'in', self.env.ref('sales_team.group_sale_salesman').id)]) + sales_id = fields.Many2one('res.users', string="Sales", tracking=True, required=True, + domain=[('groups_id', 'in', [94]),('id', '!=', 15710)]) date_approved_sales = fields.Datetime(string="Date Approved Sales", tracking=True) date_approved_marketing = fields.Datetime(string="Date Approved Marketing", tracking=True) -- cgit v1.2.3