diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-05-20 23:16:24 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-05-20 23:16:24 +0700 |
| commit | c109f6704106c59d37715b9e22f464e6f5b106db (patch) | |
| tree | 16fb86df02826784a9006edf7fd603f6092aabc5 | |
| parent | d38635f75fe52cbc958d96e577a83d8b3e1e1272 (diff) | |
(andri) fix list shipping option sesuai dengan method yang dipilih
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 130 |
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 |
