summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindoteknik_custom/models/sale_order.py91
1 files changed, 50 insertions, 41 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 8cf38040..e5297011 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -2312,61 +2312,70 @@ class SaleOrder(models.Model):
order_line.order_id.use_button = True
def _auto_set_shipping_from_website(self):
- # Jalankan hanya jika context menandakan ini proses checkout
if not self.env.context.get('from_website_checkout'):
- _logger.info("[AutoSetShipping] Dilewati karena bukan dari website checkout (context tidak ada)")
return
for order in self:
- _logger.info(f"[AutoSetShipping] Proses otomatis untuk SO: {order.name}")
-
- # Validasi: pastikan source_id = Website
+ # Validasi source website
if not order.source_id or order.source_id.id != 59:
- _logger.warning(f"[AutoSetShipping] SO {order.name} bukan dari Website (source_id.id != 59)")
continue
- # Abaikan jika shipping method adalah Self Pick Up
+ # Skip jika Self Pick Up
if order.carrier_id and order.carrier_id.id == 32:
order.select_shipping_option = 'custom'
- _logger.info(f"[AutoSetShipping] SO {order.name} menggunakan Self Pick Up. Set ke custom.")
continue
+ # Simpan pilihan user sebelum estimasi
+ user_carrier_id = order.carrier_id.id if order.carrier_id else None
+ user_service = order.delivery_service_type
+ user_amount = order.delivery_amt
+
+ # Jalankan estimasi untuk refresh data
order.select_shipping_option = 'biteship'
order.action_estimate_shipping()
- if not (order.delivery_service_type and order.carrier_id):
- _logger.warning(f"[AutoSetShipping] SO {order.name} tidak memiliki delivery_service_type atau carrier_id")
- continue
-
- # Cari provider dari mapping rajaongkir_kurir
- self.env.cr.execute("""
- SELECT name FROM rajaongkir_kurir
- WHERE delivery_carrier_id = %s LIMIT 1
- """, (order.carrier_id.id,))
- result = self.env.cr.fetchone()
- provider = result[0].lower() if result and result[0] else ''
-
- if not provider and order.carrier_id.name:
- provider = order.carrier_id.name.lower().split()[0]
-
- if not provider:
- _logger.warning(f"[AutoSetShipping] Provider tidak ditemukan untuk carrier_id: {order.carrier_id.id}")
- continue
-
- # Cari shipping option berdasarkan courier_service_code + provider
- matched_option = self.env['shipping.option'].search([
- ('sale_order_id', '=', order.id),
- ('courier_service_code', '=', order.delivery_service_type),
- ('provider', 'ilike', provider),
- ], limit=1)
-
- if matched_option:
- order.shipping_option_id = matched_option.id
- order.delivery_amt = matched_option.price
- _logger.info(f"[AutoSetShipping] Match: {matched_option.name} | Provider: {provider} | Price: {matched_option.price}")
- else:
- _logger.warning(f"[AutoSetShipping] Tidak ditemukan match untuk SO {order.name} dengan service_code '{order.delivery_service_type}' dan provider '{provider}'")
-
+ # Restore pilihan user setelah estimasi
+ if user_carrier_id and user_service:
+ # Dapatkan provider
+ self.env.cr.execute("SELECT name FROM rajaongkir_kurir WHERE delivery_carrier_id = %s LIMIT 1", (user_carrier_id,))
+ result = self.env.cr.fetchone()
+ provider = result[0].lower() if result else order.env['delivery.carrier'].browse(user_carrier_id).name.lower().split()[0]
+
+ # Cari opsi yang cocok (prioritas: service code > nama > harga > fallback)
+ domain_options = [
+ [('courier_service_code', '=', user_service), ('provider', 'ilike', provider)], # exact service
+ [('name', 'ilike', user_service), ('provider', 'ilike', provider)], # nama service
+ [('price', '=', user_amount), ('provider', 'ilike', provider)] if user_amount > 0 else None, # harga sama
+ [('provider', 'ilike', provider)] # fallback
+ ]
+
+ matched_option = None
+ for domain in domain_options:
+ if domain:
+ matched_option = self.env['shipping.option'].search([('sale_order_id', '=', order.id)] + domain, limit=1)
+ if matched_option:
+ break
+
+ # Set opsi yang cocok atau buat manual
+ if matched_option:
+ order.shipping_option_id = matched_option.id
+ order.delivery_amt = matched_option.price
+ order.delivery_service_type = matched_option.courier_service_code
+
+ # Notif jika harga berubah
+ if user_amount > 0 and abs(matched_option.price - user_amount) > 1000:
+ order.message_post(body=f"Harga shipping berubah dari Rp {user_amount:,} ke Rp {matched_option.price:,}")
+
+ elif user_amount > 0:
+ # Buat opsi manual jika tidak ada yang cocok
+ manual_option = self.env['shipping.option'].create({
+ 'name': f"{provider.upper()} - {user_service}",
+ 'price': user_amount,
+ 'provider': provider,
+ 'courier_service_code': user_service,
+ 'sale_order_id': order.id,
+ })
+ order.shipping_option_id = manual_option.id
@api.model
def create(self, vals):