summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-05-29 22:13:46 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-05-29 22:13:46 +0700
commitd6c59069035919e270d4940a39242fe5d5291982 (patch)
tree74d9a6dccfce17462dff889579a825606cf3ce69
parent711885733186a090be447099f1b7979e89ada85d (diff)
(andri) tambah validasi pada shipping method
-rwxr-xr-xindoteknik_custom/models/sale_order.py83
1 files changed, 41 insertions, 42 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index e4564c7d..946761ce 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -306,64 +306,63 @@ class SaleOrder(models.Model):
@api.onchange('carrier_id')
def _onchange_carrier_id(self):
- self.shipping_option_id = False
- self.delivery_amt = 0
-
if not self.carrier_id:
+ self.shipping_option_id = False
+ self.delivery_amt = 0
return {'domain': {'shipping_option_id': [('id', '=', -1)]}}
-
- # Cari provider dari carrier yang dipilih langsung dari rajaongkir_kurir
+
+ # Ambil provider 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
+
+ # Fallback: pakai nama carrier
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)
+
+ sale_order_id = self._origin.id if self._origin else False
+
+ # Cek jumlah shipping option dengan provider tersebut
self.env.cr.execute("""
SELECT COUNT(*) FROM shipping_option
- WHERE LOWER(provider) LIKE %s
- """, (f'%{provider}%',))
-
+ 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}")
-
- # 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
-
+
+ # VALIDASI GAGAL
+ if count == 0:
+ previous_carrier = self._origin.carrier_id if self._origin else False
+ self.carrier_id = previous_carrier
+
+ return {
+ 'warning': {
+ 'title': "Shipping Method Tidak Tersedia",
+ 'message': (
+ f"Shipping method '{provider}' tidak tersedia pada pengiriman ini.\n"
+ f"Pilihan dikembalikan ke sebelumnya."
+ )
+ },
+ 'domain': {'shipping_option_id': [('id', '=', -1)]}
+ }
+
+ # ✅ Valid, baru reset shipping_option dan delivery amount
+ self.shipping_option_id = False
+ self.delivery_amt = 0
+
+ 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}}