summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-05-24 10:15:37 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-05-24 10:15:37 +0700
commit89b157500f517659bb931f6ec81d47f2390ebfd2 (patch)
treed9e84ec239c944c9d1365094f0350ed260ec9444
parent48a2eae94b66f7bb8916dcd984bce17fbb36d45e (diff)
(andri) validasi shipping option jika tidak sesuai dengan shipping method
-rwxr-xr-xindoteknik_custom/models/sale_order.py100
1 files changed, 64 insertions, 36 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index a41e001b..d61e3641 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -367,46 +367,74 @@ class SaleOrder(models.Model):
_logger.info(f"Final domain for shipping_option_id: {domain}")
return {'domain': {'shipping_option_id': domain}}
- @api.model
- def fields_get(self, allfields=None, attributes=None):
- res = super().fields_get(allfields=allfields, attributes=attributes)
-
- # Aktifkan hanya kalau sedang buka form Sales Order (safety check)
- if self.env.context.get('params', {}).get('model') == 'sale.order' and \
- self.env.context.get('params', {}).get('id'):
-
- sale_id = self.env.context['params']['id']
-
- # Ambil carrier_id dari SO yang sedang dibuka
- self.env.cr.execute("SELECT carrier_id FROM sale_order WHERE id = %s", (sale_id,))
- row = self.env.cr.fetchone()
- carrier_id = row[0] if row else None
+ @api.onchange('shipping_option_id')
+ def _onchange_shipping_option_id(self):
+ if not self.shipping_option_id or not self.carrier_id:
+ return
- provider = None
- if carrier_id:
- self.env.cr.execute("""
- SELECT name FROM rajaongkir_kurir WHERE delivery_carrier_id = %s LIMIT 1
- """, (carrier_id,))
- row = self.env.cr.fetchone()
- if row and row[0]:
- provider = row[0].lower()
- else:
- self.env.cr.execute("SELECT name FROM delivery_carrier WHERE id = %s", (carrier_id,))
- row = self.env.cr.fetchone()
- provider = row[0].lower().split()[0] if row and row[0] else ''
+ # Ambil provider dari carrier
+ self.env.cr.execute("""
+ SELECT name FROM rajaongkir_kurir
+ WHERE delivery_carrier_id = %s LIMIT 1
+ """, (self.carrier_id.id,))
+ row = self.env.cr.fetchone()
+ provider = row[0].lower() if row and row[0] else self.carrier_id.name.lower().split()[0]
- if provider:
- domain = [
- '|',
- '&', ('sale_order_id', '=', sale_id), ('provider', 'ilike', f'%{provider}%'),
- '&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{provider}%')
- ]
+ selected_provider = (self.shipping_option_id.provider or '').lower()
- if 'shipping_option_id' in res:
- res['shipping_option_id']['domain'] = domain
- _logger.info(f"fields_get - Injected domain for shipping_option_id: {domain}")
+ if provider not in selected_provider:
+ warning_msg = {
+ 'title': "Opsi Tidak Valid",
+ 'message': f"Opsi pengiriman '{self.shipping_option_id.name}' tidak cocok dengan metode '{self.carrier_id.name}'. Dikembalikan ke sebelumnya."
+ }
- return res
+ # Kembalikan ke nilai lama (jika record sudah disimpan)
+ self.shipping_option_id = self._origin.shipping_option_id if self._origin else False
+ return {'warning': warning_msg}
+
+ # Jika valid
+ self.delivery_amt = self.shipping_option_id.price
+ self.delivery_service_type = self.shipping_option_id.courier_service_code
+
+ # @api.model
+ # def fields_get(self, allfields=None, attributes=None):
+ # res = super().fields_get(allfields=allfields, attributes=attributes)
+
+ # # Aktifkan hanya kalau sedang buka form Sales Order (safety check)
+ # if self.env.context.get('params', {}).get('model') == 'sale.order' and \
+ # self.env.context.get('params', {}).get('id'):
+
+ # sale_id = self.env.context['params']['id']
+
+ # # Ambil carrier_id dari SO yang sedang dibuka
+ # self.env.cr.execute("SELECT carrier_id FROM sale_order WHERE id = %s", (sale_id,))
+ # row = self.env.cr.fetchone()
+ # carrier_id = row[0] if row else None
+
+ # provider = None
+ # if carrier_id:
+ # self.env.cr.execute("""
+ # SELECT name FROM rajaongkir_kurir WHERE delivery_carrier_id = %s LIMIT 1
+ # """, (carrier_id,))
+ # row = self.env.cr.fetchone()
+ # if row and row[0]:
+ # provider = row[0].lower()
+ # else:
+ # self.env.cr.execute("SELECT name FROM delivery_carrier WHERE id = %s", (carrier_id,))
+ # row = self.env.cr.fetchone()
+ # provider = row[0].lower().split()[0] if row and row[0] else ''
+
+ # if provider:
+ # domain = [
+ # '|',
+ # '&', ('sale_order_id', '=', sale_id), ('provider', 'ilike', f'%{provider}%'),
+ # '&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{provider}%')
+ # ]
+
+ # if 'shipping_option_id' in res:
+ # res['shipping_option_id']['domain'] = domain
+ # _logger.info(f"fields_get - Injected domain for shipping_option_id: {domain}")
+ # return res
@api.onchange('select_shipping_option')