summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-05-21 09:18:39 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-05-21 09:18:39 +0700
commitafb745b1e000f4d3c3dba1723ce4a19f44b8c510 (patch)
tree3fa306cbbc607e860f6568389ce18261a9dea356
parentc109f6704106c59d37715b9e22f464e6f5b106db (diff)
(andri) fix edit shipping option
-rwxr-xr-xindoteknik_custom/models/sale_order.py95
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