diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-05-21 09:18:39 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-05-21 09:18:39 +0700 |
| commit | afb745b1e000f4d3c3dba1723ce4a19f44b8c510 (patch) | |
| tree | 3fa306cbbc607e860f6568389ce18261a9dea356 | |
| parent | c109f6704106c59d37715b9e22f464e6f5b106db (diff) | |
(andri) fix edit shipping option
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 95 |
1 files changed, 35 insertions, 60 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index b2faf9f3..bcc4d5c4 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -363,75 +363,50 @@ class SaleOrder(models.Model): domain = [('id', '=', -1)] # Tidak ada opsi _logger.info(f"Final domain for shipping_option_id: {domain}") - - # Masih menggunakan pendekatan mengembalikan domain karena ini yang paling efektif - # meskipun ada peringatan deprecated return {'domain': {'shipping_option_id': domain}} @api.model - def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): - res = super(SaleOrder, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) + def fields_get(self, allfields=None, attributes=None): + res = super().fields_get(allfields=allfields, attributes=attributes) - if view_type == 'form': - doc = etree.XML(res['arch']) + # 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'): - # Filter carrier_id: hanya yang dari Biteship - carrier_ids = self.get_biteship_carrier_ids() - carrier_ids_str = '(' + ','.join(str(x) for x in carrier_ids) + ')' if carrier_ids else '(-1,)' - for node in doc.xpath("//field[@name='carrier_id']"): - node.set('domain', "[('id', 'in', %s)]" % carrier_ids_str) + sale_id = self.env.context['params']['id'] - # PERBAIKAN UTAMA: Filter shipping_option_id saat form dibuka dalam mode edit - sale_id = self._context.get('active_id') - if sale_id: - # Ambil carrier_id dari database untuk record yang sedang diedit - self.env.cr.execute("SELECT carrier_id FROM sale_order WHERE id = %s", (sale_id,)) - carrier_result = self.env.cr.fetchone() - carrier_id = carrier_result[0] if carrier_result else None - - if carrier_id: - # Cari provider dari rajaongkir_kurir - self.env.cr.execute(""" - SELECT name FROM rajaongkir_kurir - WHERE delivery_carrier_id = %s - LIMIT 1 - """, (carrier_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 = None - - if row and row[0]: - provider = row[0].lower() - else: - # Fallback ke nama carrier - self.env.cr.execute("SELECT name FROM delivery_carrier WHERE id = %s", (carrier_id,)) - row = self.env.cr.fetchone() - if row and row[0]: - provider = row[0].lower().split()[0] - - if provider: - _logger.info(f"fields_view_get - Found provider: {provider} for carrier_id: {carrier_id}") - - # PENTING: Query untuk mendapatkan shipping options yang sesuai - # Ambil semua options yang memiliki provider yang cocok - # Dan prioritaskan yang terkait dengan sale_order ini - domain_str = f""" - [ - '|', - '&', ('sale_order_id', '=', {sale_id}), ('provider', 'ilike', '%{provider}%'), - '&', ('sale_order_id', '=', False), ('provider', 'ilike', '%{provider}%') - ] - """ - - # Set domain ke field shipping_option_id - for node in doc.xpath("//field[@name='shipping_option_id']"): - node.set('domain', domain_str) - # Tambahkan options untuk mencegah quick create - node.set('options', "{'no_create': True, 'no_quick_create': True}") - - _logger.info(f"Setting domain in fields_view_get: {domain_str}") + 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}") - res['arch'] = etree.tostring(doc, encoding='unicode') return res + + @api.onchange('select_shipping_option') def _onchange_select_shipping_option(self): self.shipping_option_id = False |
