summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-05-20 23:16:24 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-05-20 23:16:24 +0700
commitc109f6704106c59d37715b9e22f464e6f5b106db (patch)
tree16fb86df02826784a9006edf7fd603f6092aabc5
parentd38635f75fe52cbc958d96e577a83d8b3e1e1272 (diff)
(andri) fix list shipping option sesuai dengan method yang dipilih
-rwxr-xr-xindoteknik_custom/models/sale_order.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 2b2e518a..b2faf9f3 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -302,6 +302,136 @@ class SaleOrder(models.Model):
'gojek','grab','deliveree','lalamove','jne','tiki','ninja','lion','rara','sicepat','jnt','pos','idexpress','rpx','wahana','jdl','pos','anteraja','sap','paxel','borzo'
]
+ @api.onchange('carrier_id')
+ def _onchange_carrier_id(self):
+ self.shipping_option_id = False
+ self.delivery_amt = 0
+
+ if not self.carrier_id:
+ return {'domain': {'shipping_option_id': [('id', '=', -1)]}}
+
+ # Cari provider dari carrier yang dipilih langsung dari rajaongkir_kurir
+ self.env.cr.execute("""
+ SELECT name FROM rajaongkir_kurir
+ WHERE delivery_carrier_id = %s
+ LIMIT 1
+ """, (self.carrier_id.id,))
+
+ result = self.env.cr.fetchone()
+ provider = result[0].lower() if result and result[0] else False
+
+ # Fallback jika tidak ditemukan di rajaongkir_kurir
+ if not provider:
+ # Gunakan nama carrier, ambil kata pertama
+ provider = self.carrier_id.name.lower().split()[0] if self.carrier_id.name else False
+
+ # Log untuk debugging
+ _logger.info(f"Carrier changed to {self.carrier_id.name}, provider: {provider}")
+
+ # PENTING: self.id mungkin False atau NewId pada saat onchange
+ # Perlu memeriksa apakah ini adalah record baru atau yang sudah ada
+ sale_order_id = False
+ if hasattr(self, '_origin') and self._origin:
+ sale_order_id = self._origin.id
+
+ # Cek jika ada shipping options dengan provider ini (tanpa filter sale_order_id dulu)
+ self.env.cr.execute("""
+ SELECT COUNT(*) FROM shipping_option
+ WHERE LOWER(provider) LIKE %s
+ """, (f'%{provider}%',))
+
+ count = self.env.cr.fetchone()[0]
+ _logger.info(f"Found {count} shipping options for provider {provider}")
+
+ # Buat domain untuk shipping_option_id
+ if count > 0:
+ # Jika ada options yang tersedia, buat domain yang lebih permisif
+ domain = [
+ '|',
+ ('provider', 'ilike', f'%{provider}%'),
+ ('provider', '=', provider)
+ ]
+
+ # Jika ini record yang sudah ada, tambahkan filter sale_order_id
+ if sale_order_id:
+ domain = [
+ '|',
+ '&', ('sale_order_id', '=', sale_order_id), ('provider', 'ilike', f'%{provider}%'),
+ '&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{provider}%')
+ ]
+ else:
+ 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)
+
+ if view_type == 'form':
+ doc = etree.XML(res['arch'])
+
+ # 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)
+
+ # 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,))
+ 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}")
+
+ 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