summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-06-04 15:21:27 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-06-04 15:21:27 +0700
commite846e6fef3274839e9f9b21984a753205d31970e (patch)
treef21f917450ce38428b7f34f96c389c13b2fe7bac
parent570555a44d521ebc593490c35e5dfdb30790c201 (diff)
<miqdad> unify write method
-rwxr-xr-xindoteknik_custom/models/sale_order.py174
1 files changed, 78 insertions, 96 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 07e9a97e..705d16ef 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -866,7 +866,6 @@ class SaleOrder(models.Model):
def _validate_delivery_amt(self):
is_indoteknik = self.carrier_id.id == 1 or self.shipping_cost_covered == 'indoteknik'
is_active_id = not self.env.context.get('active_id', [])
-
if is_indoteknik and is_active_id:
if self.delivery_amt == 0:
if self.carrier_id.id == 1:
@@ -1743,11 +1742,7 @@ class SaleOrder(models.Model):
# self.total_margin_excl_third_party = round(
# (original_net_margin / (self.amount_untaxed - self.fee_third_party)) * 100, 2)
- def write(self, vals):
- import logging
- _logger = logging.getLogger(__name__)
-
- # Simpan nilai margin sebelumnya untuk field yang mempengaruhi perhitungan
+ def _prepare_before_margin_values(self, vals):
margin_sebelumnya = {}
margin_affecting_fields = [
@@ -1755,99 +1750,37 @@ class SaleOrder(models.Model):
'ongkir_ke_xpdc', 'shipping_cost_covered', 'order_line'
]
- if any(field in vals for field in margin_affecting_fields):
- for order in self:
- if order.amount_untaxed > 0:
- # LOGIC PENTING: Kapan Before Margin harus diupdate?
-
- current_before = order.total_margin_excl_third_party or 0
-
- # CASE 1: Before margin masih kosong, simpan margin saat ini
- if current_before == 0:
- margin_sebelumnya[order.id] = order.total_percent_margin
- _logger.info(
- f"CASE 1 - SO {order.name}: Before margin kosong, simpan {order.total_percent_margin}%")
+ if not any(field in vals for field in margin_affecting_fields):
+ return {}
- # CASE 2: Ada perubahan biaya_lain_lain
- elif 'biaya_lain_lain' in vals:
- old_biaya = order.biaya_lain_lain or 0
- new_biaya = vals['biaya_lain_lain'] or 0
-
- _logger.info(f"SO {order.name}: Biaya lain-lain berubah dari {old_biaya} ke {new_biaya}")
-
- # Jika sebelumnya tidak ada biaya_lain_lain, dan sekarang ada
- if old_biaya == 0 and new_biaya > 0:
- # Simpan margin saat ini sebagai "before margin"
- margin_sebelumnya[order.id] = order.total_percent_margin
- _logger.info(f"Menyimpan before margin: {order.total_percent_margin}%")
-
- # Jika biaya_lain_lain dihapus (dari ada jadi 0)
- elif old_biaya > 0 and new_biaya == 0:
- # Before margin tetap tidak berubah (sudah tersimpan sebelumnya)
- _logger.info(f"Biaya dihapus, before margin tetap: {current_before}%")
- # TIDAK mengubah before margin
-
- # CASE 3: Perubahan field lain (fee_third_party, dll)
- elif any(field in vals for field in
- ['fee_third_party', 'delivery_amt', 'ongkir_ke_xpdc', 'order_line']):
- # Simpan margin saat ini sebelum perubahan
- margin_sebelumnya[order.id] = order.total_percent_margin
- _logger.info(f"CASE 3 - Field lain berubah, simpan {order.total_percent_margin}%")
-
- # Validasi dan proses lainnya...
for order in self:
- if order.state in ['sale', 'cancel']:
- if 'order_line' in vals:
- new_lines = vals.get('order_line', [])
- for command in new_lines:
- if command[0] == 0:
- raise UserError(
- "SO tidak dapat ditambahkan produk baru karena SO sudah menjadi sale order.")
-
- if 'carrier_id' in vals:
- for order in self:
- for picking in order.picking_ids:
- if picking.state == 'assigned':
- picking.carrier_id = vals['carrier_id']
-
- try:
- helper_ids = self._get_helper_ids()
- if str(self.env.user.id) in helper_ids:
- vals['helper_by_id'] = self.env.user.id
- except:
- pass
-
- # Jalankan super write
- res = super(SaleOrder, self).write(vals)
-
- # Update before margin jika diperlukan
- if margin_sebelumnya:
- for order_id, margin_value in margin_sebelumnya.items():
- _logger.info(f"Updating before margin untuk SO {order_id}: {margin_value}%")
-
- self.env.cr.execute("""
- UPDATE sale_order
- SET total_margin_excl_third_party = %s
- WHERE id = %s
- """, (margin_value, order_id))
-
- self.env.cr.commit()
- self.invalidate_cache(['total_margin_excl_third_party'])
-
- # Validasi lainnya
- if any(field in vals for field in ['delivery_amt', 'carrier_id', 'shipping_cost_covered']):
- try:
- self._validate_delivery_amt()
- except:
- pass
+ if order.amount_untaxed <= 0:
+ continue
- if any(field in vals for field in ["order_line", "client_order_ref"]):
- try:
- self._calculate_etrts_date()
- except:
- pass
+ current_before = order.total_margin_excl_third_party or 0
+
+ # CASE 1: Before margin masih kosong → ambil dari item_percent_margin
+ if current_before == 0:
+ line_margin = 0
+ for line in order.order_line:
+ if line.item_percent_margin is not None:
+ line_margin = line.item_percent_margin
+ break
+ margin_sebelumnya[order.id] = line_margin
+ _logger.info(f"[BEFORE] SO {order.name}: Before margin kosong, ambil dari order line: {line_margin}%")
+ else:
+ # CASE 2: Ada perubahan field yang mempengaruhi margin
+ for field in margin_affecting_fields:
+ if field in vals:
+ old_val = getattr(order, field, 0) or 0
+ new_val = vals[field] or 0
+ if old_val != new_val:
+ margin_sebelumnya[order.id] = order.total_percent_margin
+ _logger.info(
+ f"[BEFORE] SO {order.name}: {field} berubah dari {old_val} ke {new_val}, simpan {order.total_percent_margin}%")
+ break
- return res
+ return margin_sebelumnya
@api.onchange('sales_tax_id')
def onchange_sales_tax_id(self):
@@ -2184,4 +2117,53 @@ class SaleOrder(models.Model):
else:
order.ready_to_ship_status_detail = "On Track"
else:
- order.ready_to_ship_status_detail = 'On Track' \ No newline at end of file
+ order.ready_to_ship_status_detail = 'On Track'
+
+ def write(self, vals):
+
+ margin_sebelumnya = self._prepare_before_margin_values(vals)
+
+ for order in self:
+ if order.state in ['sale', 'cancel']:
+ if 'order_line' in vals:
+ for command in vals.get('order_line', []):
+ if command[0] == 0:
+ raise UserError(
+ "SO tidak dapat ditambahkan produk baru karena SO sudah menjadi sale order.")
+
+ if 'carrier_id' in vals:
+ for order in self:
+ for picking in order.picking_ids:
+ if picking.state == 'assigned':
+ picking.carrier_id = vals['carrier_id']
+
+ try:
+ helper_ids = self._get_helper_ids()
+ if str(self.env.user.id) in helper_ids:
+ vals['helper_by_id'] = self.env.user.id
+ except:
+ pass
+
+ res = super(SaleOrder, self).write(vals)
+
+ # Update before margin setelah write
+ if margin_sebelumnya:
+ for order_id, margin_value in margin_sebelumnya.items():
+ _logger.info(f"[UPDATE] SO ID {order_id}: Set before margin ke {margin_value}%")
+ self.env.cr.execute("""
+ UPDATE sale_order
+ SET total_margin_excl_third_party = %s
+ WHERE id = %s
+ """, (margin_value, order_id))
+
+ self.env.cr.commit()
+ self.invalidate_cache(['total_margin_excl_third_party'])
+
+ # Validasi setelah write
+ if any(field in vals for field in ['delivery_amt', 'carrier_id', 'shipping_cost_covered']):
+ self._validate_delivery_amt()
+
+ if any(field in vals for field in ["order_line", "client_order_ref"]):
+ self._calculate_etrts_date()
+
+ return res \ No newline at end of file