summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/sale_order.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/sale_order.py')
-rwxr-xr-xindoteknik_custom/models/sale_order.py100
1 files changed, 77 insertions, 23 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 663cba58..a5e2f7c4 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -1813,10 +1813,10 @@ class SaleOrder(models.Model):
# rec.commitment_date = rec.expected_ready_to_ship
- @api.onchange('expected_ready_to_ship') #Hangle Onchange form Expected Ready to Ship
+ @api.onchange('expected_ready_to_ship')
def _onchange_expected_ready_ship_date(self):
self._validate_expected_ready_ship_date()
-
+
def _set_etrts_date(self):
for order in self:
if order.state in ('done', 'cancel', 'sale'):
@@ -1984,10 +1984,10 @@ class SaleOrder(models.Model):
# raise UserError('Kelurahan Real Delivery Address harus diisi')
def generate_payment_link_midtrans_sales_order(self):
- # midtrans_url = 'https://app.sandbox.midtrans.com/snap/v1/transactions' # dev - sandbox
- # midtrans_auth = 'Basic U0ItTWlkLXNlcnZlci1uLVY3ZDJjMlpCMFNWRUQyOU95Q1dWWXA6' # dev - sandbox
- midtrans_url = 'https://app.midtrans.com/snap/v1/transactions' # production
- midtrans_auth = 'Basic TWlkLXNlcnZlci1SbGMxZ2gzWGpSVW5scl9JblZzTV9OTnU6' # production
+ midtrans_url = 'https://app.sandbox.midtrans.com/snap/v1/transactions' # dev - sandbox
+ midtrans_auth = 'Basic U0ItTWlkLXNlcnZlci1uLVY3ZDJjMlpCMFNWRUQyOU95Q1dWWXA6' # dev - sandbox
+ # midtrans_url = 'https://app.midtrans.com/snap/v1/transactions' # production
+ # midtrans_auth = 'Basic TWlkLXNlcnZlci1SbGMxZ2gzWGpSVW5scl9JblZzTV9OTnU6' # production
so_number = self.name
so_number = so_number.replace('/', '-')
@@ -2000,8 +2000,8 @@ class SaleOrder(models.Model):
}
# ==== ENV ====
- # check_url = f'https://api.sandbox.midtrans.com/v2/{so_number}/status' # dev - sandbox
- check_url = f'https://api.midtrans.com/v2/{so_number}/status' # production
+ check_url = f'https://api.sandbox.midtrans.com/v2/{so_number}/status' # dev - sandbox
+ # check_url = f'https://api.midtrans.com/v2/{so_number}/status' # production
# =============================================
check_response = requests.get(check_url, headers=headers)
@@ -2241,7 +2241,7 @@ class SaleOrder(models.Model):
raise UserError("Payment Term pada Master Data Customer harus diisi")
if not partner.active_limit and term_days > 0:
raise UserError("Credit Limit pada Master Data Customer harus diisi")
- if order.payment_term_id != partner.property_payment_term_id:
+ if order.payment_term_id != partner.property_payment_term_id and not order.partner_id.id == 29179:
raise UserError("Payment Term berbeda pada Master Data Customer")
if (partner.customer_type == 'pkp' or order.customer_type == 'pkp') and order.npwp != partner.npwp:
raise UserError("NPWP berbeda pada Master Data Customer")
@@ -2324,7 +2324,7 @@ class SaleOrder(models.Model):
raise UserError("Payment Term pada Master Data Customer harus diisi")
if not partner.active_limit and term_days > 0:
raise UserError("Credit Limit pada Master Data Customer harus diisi")
- if order.payment_term_id != partner.property_payment_term_id:
+ if order.payment_term_id != partner.property_payment_term_id and not order.partner_id.id == 29179:
raise UserError("Payment Term berbeda pada Master Data Customer")
if (partner.customer_type == 'pkp' or order.customer_type == 'pkp') and order.npwp != partner.npwp:
raise UserError("NPWP berbeda pada Master Data Customer")
@@ -2871,6 +2871,7 @@ class SaleOrder(models.Model):
def action_apply_voucher(self):
for line in self.order_line:
if line.order_promotion_id:
+ _logger.warning(f"[CHECKOUT FAILED] Produk promo ditemukan: {line.product_id.display_name}")
raise UserError('Voucher tidak dapat digabung dengan promotion program')
voucher = self.voucher_id
@@ -2913,42 +2914,82 @@ class SaleOrder(models.Model):
self.apply_voucher_shipping()
def apply_voucher(self):
+ def _is_promo_line(line):
+ # TRUE jika baris tidak boleh kena voucher
+ if getattr(line, 'order_promotion_id', False):
+ return True # baris dari program promo
+ if (line.price_unit or 0.0) == 0.0:
+ return True # free item
+ if getattr(line, 'is_has_disc', False):
+ return True # sudah promo/flashsale/berdiskon
+ if (line.discount or 0.0) >= 100.0:
+ return True # safety
+ return False
+
+ # --- LOOP 1: susun input untuk voucher.apply() ---
order_line = []
for line in self.order_line:
+ if _is_promo_line(line):
+ continue
order_line.append({
'product_id': line.product_id,
'price': line.price_unit,
'discount': line.discount,
'qty': line.product_uom_qty,
- 'subtotal': line.price_subtotal
+ 'subtotal': line.price_subtotal,
})
+
+ if not order_line:
+ return
+
voucher = self.voucher_id.apply(order_line)
+ # --- LOOP 2: tulis hasilnya HANYA ke non-promo ---
for line in self.order_line:
+ if _is_promo_line(line):
+ continue
+
line.initial_discount = line.discount
voucher_type = voucher['type']
- used_total = voucher['total'][voucher_type]
- used_discount = voucher['discount'][voucher_type]
+ total_map = voucher['total'][voucher_type]
+ discount_map = voucher['discount'][voucher_type]
- manufacture_id = line.product_id.x_manufacture.id
if voucher_type == 'brand':
- used_total = used_total.get(manufacture_id)
- used_discount = used_discount.get(manufacture_id)
+ m_id = line.product_id.x_manufacture.id
+ used_total = (total_map or {}).get(m_id)
+ used_discount = (discount_map or {}).get(m_id)
+ else:
+ used_total = total_map
+ used_discount = discount_map
- if not used_total or not used_discount:
+ if not used_total or not used_discount or (line.product_uom_qty or 0.0) == 0.0:
continue
line_contribution = line.price_subtotal / used_total
line_voucher = used_discount * line_contribution
- line_voucher_item = line_voucher / line.product_uom_qty
+ per_item_voucher = line_voucher / line.product_uom_qty
+
+ has_ppn_11 = any(tax.id == 23 for tax in line.tax_id)
+ base_unit = line.price_unit / 1.11 if has_ppn_11 else line.price_unit
- line_price_unit = line.price_unit / 1.11 if any(tax.id == 23 for tax in line.tax_id) else line.price_unit
- line_discount_item = line_price_unit * line.discount / 100 + line_voucher_item
- line_voucher_item = line_discount_item / line_price_unit * 100
+ new_disc_value = base_unit * line.discount / 100 + per_item_voucher
+ new_disc_pct = (new_disc_value / base_unit) * 100
line.amount_voucher_disc = line_voucher
- line.discount = line_voucher_item
+ line.discount = new_disc_pct
+
+ _logger.info(
+ "[VOUCHER_APPLIED] SO=%s voucher=%s type=%s line_id=%s product=%s qty=%s discount_pct=%.2f amount_voucher=%s",
+ self.name,
+ getattr(self.voucher_id, "code", None),
+ voucher.get("type"),
+ line.id,
+ line.product_id.display_name,
+ line.product_uom_qty,
+ line.discount,
+ line.amount_voucher_disc,
+ )
self.amount_voucher_disc = voucher['discount']['all']
self.applied_voucher_id = self.voucher_id
@@ -3189,6 +3230,10 @@ class SaleOrder(models.Model):
# order._auto_set_shipping_from_website()
order._compute_etrts_date()
order._validate_expected_ready_ship_date()
+ # for line in order.order_line:
+ # updated_vals = line._update_purchase_info()
+ # if updated_vals:
+ # line.write(updated_vals)
# order._validate_delivery_amt()
# order._check_total_margin_excl_third_party()
# order._update_partner_details()
@@ -3287,12 +3332,15 @@ class SaleOrder(models.Model):
for order in self:
partner = order.partner_id.parent_id or order.partner_id
customer_payment_term = partner.property_payment_term_id
- if vals['payment_term_id'] != customer_payment_term.id:
+ if vals['payment_term_id'] != customer_payment_term.id and not order.partner_id.id == 29179:
raise UserError(
f"Payment Term berbeda pada Master Data Customer. "
f"Harap ganti ke '{customer_payment_term.name}' "
f"sesuai dengan payment term yang terdaftar pada customer."
)
+
+ if order.partner_id.id == 29179 and vals['payment_term_id'] not in [25,28]:
+ raise UserError(_("Pilih payment term 60 hari atau 30 hari."))
res = super(SaleOrder, self).write(vals)
@@ -3317,6 +3365,12 @@ class SaleOrder(models.Model):
if any(field in vals for field in ["order_line", "client_order_ref"]):
self._calculate_etrts_date()
+ # for order in self:
+ # for line in order.order_line:
+ # updated_vals = line._update_purchase_info()
+ # if updated_vals:
+ # line.write(updated_vals)
+
return res
def button_refund(self):