diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-05-29 22:13:46 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-05-29 22:13:46 +0700 |
| commit | d6c59069035919e270d4940a39242fe5d5291982 (patch) | |
| tree | 74d9a6dccfce17462dff889579a825606cf3ce69 | |
| parent | 711885733186a090be447099f1b7979e89ada85d (diff) | |
(andri) tambah validasi pada shipping method
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 83 |
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}} |
