summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/sale_order.py
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-08-13 09:48:41 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-08-13 09:48:41 +0700
commit7644260c8b660c71aa1f9232cb50acea551798c2 (patch)
treebdbad5e360bd7d638b340c6d96d19dc8c7912d00 /indoteknik_custom/models/sale_order.py
parentd1e55b12466b6c93cc4a3e23dab59d3ce3795d45 (diff)
parenta2d087032e5b14901f4128c81b58143bcff4286f (diff)
<hafid> merging odoo-backup
Diffstat (limited to 'indoteknik_custom/models/sale_order.py')
-rwxr-xr-xindoteknik_custom/models/sale_order.py81
1 files changed, 73 insertions, 8 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 72f5dd4c..aa534d0c 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -163,7 +163,7 @@ class SaleOrder(models.Model):
carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method', tracking=3)
have_visit_service = fields.Boolean(string='Have Visit Service', compute='_have_visit_service',
help='To compute is customer get visit service')
- delivery_amt = fields.Float(string='Delivery Amt', copy=False)
+ delivery_amt = fields.Float(string='Delivery Amt', copy=False, tracking=True)
shipping_cost_covered = fields.Selection([
('indoteknik', 'Indoteknik'),
('customer', 'Customer')
@@ -1116,8 +1116,9 @@ class SaleOrder(models.Model):
break
if not selected_option and shipping_options:
+ if not self.env.context.get('from_website_checkout'):
+ _logger.info(f"[DEFAULT] Tidak ada yang cocok, pakai opsi pertama: {shipping_options[0].name}")
selected_option = shipping_options[0]
- _logger.info(f"[DEFAULT] Tidak ada yang cocok, pakai opsi pertama: {selected_option.name}")
# ❗ Ganti carrier_id hanya jika BELUM terisi sama sekali (contoh: user dari backend)
if not self.carrier_id:
@@ -1137,9 +1138,18 @@ class SaleOrder(models.Model):
# Set shipping option dan nilai ongkir
if selected_option:
- self.shipping_option_id = selected_option.id
- self.delivery_amt = selected_option.price
- self.delivery_service_type = selected_option.courier_service_code
+ if self.env.context.get('from_website_checkout'):
+ # Simpan di context sebagai nilai sementara
+ self = self.with_context(
+ _temp_delivery_amt=selected_option.price,
+ _temp_delivery_service=selected_option.courier_service_code,
+ _temp_shipping_option=selected_option.id
+ )
+ else:
+ self.shipping_option_id = selected_option.id
+ self.delivery_amt = selected_option.price
+ self.delivery_service_type = selected_option.courier_service_code
+
message_lines = [f"<b>Estimasi Ongkos Kirim Biteship:</b><br/>"]
for courier, options in courier_options.items():
@@ -2159,7 +2169,12 @@ class SaleOrder(models.Model):
# if order.validate_partner_invoice_due():
# return self._create_notification_action('Notification',
# 'Terdapat invoice yang telah melewati batas waktu, mohon perbarui pada dokumen Due Extension')
-
+
+ if not order.with_context(ask_approval=True)._is_request_to_own_team_leader():
+ return self._create_notification_action(
+ 'Peringatan',
+ 'Hanya bisa konfirmasi SO tim Anda.'
+ )
if order._requires_approval_margin_leader():
order.approval_status = 'pengajuan2'
return self._create_approval_notification('Pimpinan')
@@ -2169,6 +2184,12 @@ class SaleOrder(models.Model):
self.check_limit_so_to_invoice()
order.approval_status = 'pengajuan1'
return self._create_approval_notification('Sales Manager')
+ elif order._requires_approval_team_sales():
+ self.check_product_bom()
+ self.check_credit_limit()
+ self.check_limit_so_to_invoice()
+ order.approval_status = 'pengajuan1'
+ return self._create_approval_notification('Team Sales')
raise UserError("Bisa langsung Confirm")
@@ -2385,12 +2406,20 @@ class SaleOrder(models.Model):
return self._create_notification_action('Notification',
'Terdapat invoice yang telah melewati batas waktu, mohon perbarui pada dokumen Due Extension')
+ if not order._is_request_to_own_team_leader():
+ return self._create_notification_action(
+ 'Warning',
+ 'Hanya bisa konfirmasi SO tim Anda.'
+ )
if order._requires_approval_margin_leader():
order.approval_status = 'pengajuan2'
return self._create_approval_notification('Pimpinan')
elif order._requires_approval_margin_manager():
order.approval_status = 'pengajuan1'
return self._create_approval_notification('Sales Manager')
+ elif order._requires_approval_team_sales():
+ order.approval_status = 'pengajuan1'
+ return self._create_approval_notification('Team Sales')
order.approval_status = 'approved'
order._set_sppkp_npwp_contact()
@@ -2491,8 +2520,36 @@ class SaleOrder(models.Model):
return self.total_percent_margin <= 15 and not self.env.user.is_leader
def _requires_approval_margin_manager(self):
- return 15 < self.total_percent_margin <= 24 and not self.env.user.is_sales_manager and not self.env.user.id == 375 and not self.env.user.is_leader
- # return self.total_percent_margin >= 15 and not self.env.user.is_leader and not self.env.user.is_sales_manager
+ return 15 < self.total_percent_margin < 18 and not self.env.user.is_sales_manager and not self.env.user.id == 375 and not self.env.user.is_leader
+
+ def _requires_approval_team_sales(self):
+ return (
+ 18 <= self.total_percent_margin <= 24
+ and self.env.user.id not in [11, 9, 375] # Eko, Ade, Putra
+ and not self.env.user.is_sales_manager
+ and not self.env.user.is_leader
+ )
+
+
+ def _is_request_to_own_team_leader(self):
+ user = self.env.user
+
+ # Pengecualian Pak Akbar & Darren
+ if user.is_leader or user.is_sales_manager:
+ return True
+
+ if user.id in (3401, 20, 3988): # admin (fida, nabila, ninda)
+ return True
+
+ if self.env.context.get("ask_approval") and user.id in (3401, 20, 3988):
+ return True
+
+ salesperson_id = self.user_id.id
+ approver_id = user.id
+ team_leader_id = self.team_id.user_id.id
+
+ return salesperson_id == approver_id or approver_id == team_leader_id
+
def _create_approval_notification(self, approval_role):
title = 'Warning'
@@ -2903,6 +2960,14 @@ class SaleOrder(models.Model):
order.select_shipping_option = 'biteship'
order.action_estimate_shipping()
+ temp_price = self.env.context.get('_temp_delivery_amt')
+ temp_service = self.env.context.get('_temp_delivery_service')
+ temp_option_id = self.env.context.get('_temp_shipping_option')
+ if temp_price and temp_option_id:
+ order.shipping_option_id = temp_option_id
+ order.delivery_amt = temp_price
+ order.delivery_service_type = temp_service
+
# Restore pilihan user setelah estimasi
if user_carrier_id and user_service:
# Dapatkan provider