diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-05-24 10:15:37 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-05-24 10:15:37 +0700 |
| commit | 89b157500f517659bb931f6ec81d47f2390ebfd2 (patch) | |
| tree | d9e84ec239c944c9d1365094f0350ed260ec9444 | |
| parent | 48a2eae94b66f7bb8916dcd984bce17fbb36d45e (diff) | |
(andri) validasi shipping option jika tidak sesuai dengan shipping method
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 100 |
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') |
