summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ab_openstreetmap/views/templates.xml4
-rwxr-xr-xindoteknik_custom/models/sale_order.py83
2 files changed, 48 insertions, 39 deletions
diff --git a/ab_openstreetmap/views/templates.xml b/ab_openstreetmap/views/templates.xml
index bb5cb581..1f5a729b 100644
--- a/ab_openstreetmap/views/templates.xml
+++ b/ab_openstreetmap/views/templates.xml
@@ -2,10 +2,6 @@
<data>
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
- <!-- GANTI dengan versi beta agar mendukung importLibrary (WAJIB untuk AdvancedMarkerElement) -->
- <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB7bG9aSNAJnSrj0Z7f1abFsqKVoiJfsPE&amp;v=beta&amp;libraries=marker,maps" async="true" defer="true"/>
-
- <!-- Tambahkan Google Maps Widget JS -->
<script type="text/javascript" src="/ab_openstreetmap/static/src/js/googlemap_widget.js"/>
</xpath>
</template>
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index f53d375b..e54053ff 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -421,39 +421,19 @@ class SaleOrder(models.Model):
@api.onchange('carrier_id')
def _onchange_carrier_id(self):
- # ───────────────────────────────────────────────────────────────
- # 1. abaikan onchange kalau SO masih draft / belum tersimpan
- # ───────────────────────────────────────────────────────────────
if not self._origin or not self._origin.id:
return
- sale_order_id = self._origin.id # id SO asli (sudah tersimpan)
-
- # ───────────────────────────────────────────────────────────────
- # 2. Jika SO BELUM mempunyai satupun shipping.option ⇒
- # jangan lakukan validasi apa-apa; cukup reset field & domain
- # ───────────────────────────────────────────────────────────────
- total_so_options = self.env['shipping.option'].search_count(
- [('sale_order_id', '=', sale_order_id)]
- )
- if total_so_options == 0:
- # belum pernah estimasi ongkir ⇒ biarkan user ganti carrier
- self.shipping_option_id = False
- return {'domain': {'shipping_option_id': [('id', '=', -1)]}}
-
- # ───────────────────────────────────────────────────────────────
- # 3. (kode lama) – mulai validasi hanya jika sudah ada option
- # ───────────────────────────────────────────────────────────────
+ sale_order_id = self._origin.id
self.shipping_option_id = False
if not self.carrier_id:
return {'domain': {'shipping_option_id': [('id', '=', -1)]}}
- # cari provider dari mapping rajaongkir_kurir
+ # Ambil provider dari mapping
self.env.cr.execute("""
SELECT name FROM rajaongkir_kurir
- WHERE delivery_carrier_id = %s
- LIMIT 1
+ WHERE delivery_carrier_id = %s LIMIT 1
""", (self.carrier_id.id,))
row = self.env.cr.fetchone()
provider = row[0].lower() if row and row[0] else (
@@ -462,36 +442,69 @@ class SaleOrder(models.Model):
_logger.info(f"[Carrier Changed] {self.carrier_id.name}, Detected Provider: {provider}")
- # hitung berapa option yg match provider BARU
- self.env.cr.execute("""
- SELECT COUNT(*) FROM shipping_option
- WHERE LOWER(provider) LIKE %s AND sale_order_id = %s
- """, (f'%{provider}%', sale_order_id))
- matched = self.env.cr.fetchone()[0] or 0
+ # ───────────────────────────────────────────────────────────────
+ # Validasi koordinat untuk kurir instan
+ # ───────────────────────────────────────────────────────────────
+ instan_kurir = ['gojek', 'grab', 'lalamove', 'borzo', 'rara', 'deliveree']
+ if provider in instan_kurir:
+ lat = self.real_shipping_id.latitude
+ lng = self.real_shipping_id.longtitude
+ def is_invalid(val):
+ try:
+ return not val or float(val) == 0.0
+ except (ValueError, TypeError):
+ return True
+
+ if is_invalid(lat) or is_invalid(lng):
+ self.carrier_id = self._origin.carrier_id
+ self.shipping_option_id = self._origin.shipping_option_id or False
+ return {
+ 'warning': {
+ 'title': "Alamat Belum Pin Point",
+ 'message': (
+ "Kurir instan seperti Gojek, Grab, Lalamove, Borzo, Rara, dan Deliveree "
+ "membutuhkan alamat pengiriman yang sudah Pin Point.\n\n"
+ "Silakan tentukan lokasi dengan tepat pada Pin Point Location yang tersedia di kontak."
+ )
+ },
+ 'domain': {'shipping_option_id': [('id', '=', -1)]}
+ }
+
+ # ───────────────────────────────────────────────────────────────
+ # Baru cek apakah shipping option sudah ada
+ # ───────────────────────────────────────────────────────────────
+ total_so_options = self.env['shipping.option'].search_count([
+ ('sale_order_id', '=', sale_order_id)
+ ])
+ if total_so_options == 0:
+ return {'domain': {'shipping_option_id': [('id', '=', -1)]}}
+
+ # Validasi: apakah shipping option ada untuk provider ini?
+ matched = self.env['shipping.option'].search_count([
+ ('sale_order_id', '=', sale_order_id),
+ ('provider', 'ilike', provider),
+ ])
if matched == 0:
- # provider baru tidak ada di option yang SUDAH dibuat → kembalikan ke carrier lama
- prev_carrier = self._origin.carrier_id
- self.carrier_id = prev_carrier
+ self.carrier_id = self._origin.carrier_id
self.shipping_option_id = self._origin.shipping_option_id or False
return {
'warning': {
'title': "Shipping Option Tidak Ditemukan",
'message': (
- "Layanan kurir tidak tersedia untuk pengiriman ini.\n"
+ "Layanan kurir ini tidak tersedia pada pengiriman ini. "
"Pilihan dikembalikan ke sebelumnya."
)
},
'domain': {'shipping_option_id': [('id', '=', -1)]}
}
- # kalau match ada → set domain normal (hanya option dengan provider itu)
+ # Kalau semua valid, kembalikan domain normal
domain = [
'|',
'&', ('sale_order_id', '=', sale_order_id), ('provider', 'ilike', f'%{provider}%'),
'&', ('sale_order_id', '=', False), ('provider', 'ilike', f'%{provider}%')
]
-
return {'domain': {'shipping_option_id': domain}}
@api.onchange('shipping_option_id')