summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-06-01 13:12:27 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-06-01 13:12:27 +0700
commit03d52ddceacea1939aef8ee4c571cacdb8b2c055 (patch)
treed3cadfc653f4f740e181f393e28aef03168f7f31
parentb6928c9bffc486b471d4c335c2550cbc1bf7d841 (diff)
(andri) fix bug selected shipping service
-rwxr-xr-xindoteknik_custom/models/sale_order.py78
1 files 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}}