diff options
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 91 |
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): |
