From 03d52ddceacea1939aef8ee4c571cacdb8b2c055 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sun, 1 Jun 2025 13:12:27 +0700 Subject: (andri) fix bug selected shipping service --- indoteknik_custom/models/sale_order.py | 78 ++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index f1280b37..490e4581 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -249,7 +249,7 @@ class SaleOrder(models.Model): string="Attachment Bukti Cancel", readonly=False, ) nomor_so_pengganti = fields.Char(string='Nomor SO Pengganti', copy=False, tracking=3) - shipping_option_id = fields.Many2one("shipping.option", string="Selected Service Option", domain="['|', ('sale_order_id', '=', False), ('sale_order_id', '=', id)]") + shipping_option_id = fields.Many2one("shipping.option", string="Selected Service Option", help="Selected shipping option for delivery", tracking=True, domain="['|', ('sale_order_id', '=', False), ('sale_order_id', '=', id)]") select_shipping_option = fields.Selection([ ('biteship', 'Biteship'), @@ -306,20 +306,13 @@ class SaleOrder(models.Model): @api.onchange('carrier_id') def _onchange_carrier_id(self): + self.shipping_option_id = False + # self.delivery_amt = 0 + # self.delivery_service_type = False + if not self.carrier_id: - self.shipping_option_id = False - self.delivery_amt = 0 return {'domain': {'shipping_option_id': [('id', '=', -1)]}} - # ✅ Lewati validasi jika carrier bukan Biteship - if self.carrier_id.delivery_type != 'biteship': - _logger.info(f"Carrier {self.carrier_id.name} bertipe custom ({self.carrier_id.delivery_type}), tidak divalidasi.") - self.shipping_option_id = False - self.delivery_amt = 0 - return { - 'domain': {'shipping_option_id': [('id', '=', -1)]} - } - # Ambil provider dari rajaongkir_kurir self.env.cr.execute(""" SELECT name FROM rajaongkir_kurir @@ -329,56 +322,67 @@ class SaleOrder(models.Model): result = self.env.cr.fetchone() provider = result[0].lower() if result and result[0] else False - # Fallback ke nama carrier jika tidak ada di rajaongkir_kurir + # Fallback dari nama carrier if not provider: provider = self.carrier_id.name.lower().split()[0] if self.carrier_id.name else False - _logger.info(f"Carrier changed to {self.carrier_id.name}, provider: {provider}") + _logger.info(f"[Carrier Changed] {self.carrier_id.name}, Detected Provider: {provider}") - sale_order_id = self._origin.id if self._origin and self._origin.id else None - - # Cek shipping option untuk provider ini - if sale_order_id: - self.env.cr.execute(""" - SELECT COUNT(*) FROM shipping_option - WHERE LOWER(provider) LIKE %s AND sale_order_id = %s - """, (f'%{provider}%', sale_order_id)) - else: - self.env.cr.execute(""" - SELECT COUNT(*) FROM shipping_option - WHERE LOWER(provider) LIKE %s AND sale_order_id IS NULL - """, (f'%{provider}%',)) + # Ambil ID SO + sale_order_id = self._origin.id if self._origin else False + # Hitung jumlah shipping_option yang cocok + self.env.cr.execute(""" + SELECT COUNT(*) FROM shipping_option + WHERE LOWER(provider) LIKE %s AND sale_order_id = %s + """, (f'%{provider}%', sale_order_id)) count = self.env.cr.fetchone()[0] - _logger.info(f"Found {count} shipping options for provider {provider}") - # VALIDASI GAGAL + _logger.info(f"[Shipping Option Count] Provider: {provider} | SO ID: {sale_order_id} | Count: {count}") + + # Jika tidak ditemukan shipping option if count == 0: previous_carrier = self._origin.carrier_id if self._origin else False + previous_provider = False + self.carrier_id = previous_carrier + self.shipping_option_id = self._origin.shipping_option_id if self._origin else False + + # Rehitung provider untuk domain fallback + if previous_carrier: + self.env.cr.execute(""" + SELECT name FROM rajaongkir_kurir + WHERE delivery_carrier_id = %s LIMIT 1 + """, (previous_carrier.id,)) + prev_row = self.env.cr.fetchone() + previous_provider = prev_row[0].lower() if prev_row and prev_row[0] else previous_carrier.name.lower().split()[0] + + fallback_domain = [('id', '=', -1)] + if sale_order_id and previous_provider: + fallback_domain = [ + '|', + '&', ('sale_order_id', '=', sale_order_id), ('provider', 'ilike', f'%{previous_provider}%'), + '&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{previous_provider}%') + ] return { 'warning': { - 'title': "Shipping Method Tidak Tersedia", + 'title': "Shipping Option Tidak Ditemukan", 'message': ( - f"Shipping method '{self.carrier_id.name}' tidak tersedia pada pengiriman ini.\n" + f"Layanan kurir tidak tersedia untuk pengiriman ini.\n" f"Pilihan dikembalikan ke sebelumnya." ) }, - 'domain': {'shipping_option_id': [('id', '=', -1)]} + 'domain': {'shipping_option_id': fallback_domain} } - # ✅ Valid, baru reset shipping_option dan delivery amount - self.shipping_option_id = False - self.delivery_amt = 0 - + # Jika ditemukan, set domain normal domain = [ '|', '&', ('sale_order_id', '=', sale_order_id), ('provider', 'ilike', f'%{provider}%'), '&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{provider}%') ] - _logger.info(f"Final domain for shipping_option_id: {domain}") return {'domain': {'shipping_option_id': domain}} -- cgit v1.2.3