summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2024-11-26 13:44:33 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2024-11-26 13:44:33 +0700
commit3f3fd6fcaa74cf3e3dd6e73d7ddb95ff537742b8 (patch)
tree750643804a564ce22e8dbc0b84f96a0908a04890
parent130390b0c4c8c37f5a69d3833f5f1ad9e60e787d (diff)
push
-rwxr-xr-xindoteknik_custom/models/purchase_order.py34
-rwxr-xr-xindoteknik_custom/models/sale_order.py2
-rw-r--r--indoteknik_custom/models/vendor_approval.py9
-rw-r--r--indoteknik_custom/views/vendor_approval.xml4
4 files changed, 42 insertions, 7 deletions
diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py
index 3397616d..26dc5102 100755
--- a/indoteknik_custom/models/purchase_order.py
+++ b/indoteknik_custom/models/purchase_order.py
@@ -595,10 +595,19 @@ class PurchaseOrder(models.Model):
if line.product_uom_qty > line.product_id.plafon_qty + line.product_uom_qty and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError('Product '+line.product_id.name+' melebihi plafon, harus Approval MD')
+ def check_different_vendor_so_po(self):
+ vendor_po = self.partner_id.id
+ for line in self.order_line:
+ if not line.so_line_id:
+ continue
+ if line.so_line_id.vendor_id.id != vendor_po:
+ raise UserError("Produk "+line.product_id.name+" memiliki vendor berbeda dengan SO (Vendor PO: "+str(self.partner_id.name)+", Vendor SO: "+str(line.so_line_id.vendor_id.name)+")")
+
def button_confirm(self):
res = super(PurchaseOrder, self).button_confirm()
current_time = datetime.now()
self.check_ppn_mix()
+ self.check_different_vendor_so_po()
# self.check_data_vendor()
if self.amount_untaxed >= 50000000 and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
@@ -736,12 +745,12 @@ class PurchaseOrder(models.Model):
template.send_mail(self.id, force_send=True)
def po_approve(self):
- # if self.amount_untaxed >= 50000000 and not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
- # raise UserError("Hanya Merchandiser yang bisa approve")
greater_than_plafon, message = self._get_msg_plafon_qty()
+ different_vendor_message = self.check_different_vendor_so() # Panggil fungsi check_different_vendor_so
+
if self.env.user.is_leader or self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError("Bisa langsung Confirm")
- elif self.total_percent_margin == self.total_so_percent_margin and self.matches_so and not greater_than_plafon:
+ elif self.total_percent_margin == self.total_so_percent_margin and self.matches_so and not greater_than_plafon and not different_vendor_message:
raise UserError("Bisa langsung Confirm")
else:
reason = ''
@@ -757,13 +766,30 @@ class PurchaseOrder(models.Model):
# Check Plafon Qty and Get Message every Line Product
if greater_than_plafon:
reason += message
+ # Check for Different Vendor Message
+ if different_vendor_message:
+ reason += different_vendor_message
+
# Post a highlighted message to lognote
self.message_post(
body=f"<div style='background-color: #fdf2e9; border: 1px solid #f5c6cb; padding: 10px;'>"
- f"<b>Note (Pinned):</b><br>{reason}</div>",
+ f"<b>Note (Pinned):</b><br>{reason}</div>",
subtype_id=self.env.ref("mail.mt_note").id
)
+
+ def check_different_vendor_so(self):
+ vendor_po = self.partner_id.id
+ message = ''
+ for line in self.order_line:
+ if not line.so_line_id:
+ continue
+ if line.so_line_id.vendor_id.id != vendor_po:
+ product_code = line.product_id.display_name or 'Unknown'
+ message += (f"Produk {product_code} memiliki vendor berbeda dengan SO "
+ f"(Vendor PO: {self.partner_id.name}, Vendor SO: {line.so_line_id.vendor_id.name}), ")
+ return message if message else None
+
def _get_msg_plafon_qty(self):
message = ''
greater_than_plafon = False
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 6475f29f..315a338a 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -883,7 +883,7 @@ class SaleOrder(models.Model):
def validate_different_vendor(self):
if self.vendor_approval_id.filtered(lambda v: v.state == 'draft'):
- draft_names = ", ".join(self.vendor_approval_id.filtered(lambda v: v.state == 'draft').mapped('name'))
+ draft_names = ", ".join(self.vendor_approval_id.filtered(lambda v: v.state == 'draft').mapped('number'))
raise UserError(f"SO ini sedang dalam review Vendor Approval: {draft_names}")
if self.vendor_approval_id and all(v.state != 'draft' for v in self.vendor_approval_id):
diff --git a/indoteknik_custom/models/vendor_approval.py b/indoteknik_custom/models/vendor_approval.py
index ad323c29..01d2e6a2 100644
--- a/indoteknik_custom/models/vendor_approval.py
+++ b/indoteknik_custom/models/vendor_approval.py
@@ -35,9 +35,16 @@ class VendorApproval(models.Model):
vals['number'] = self.env['ir.sequence'].next_by_code('vendor.approval') or '0'
result = super(VendorApproval, self).create(vals)
return result
+
+ def check_state_so(self):
+ for rec in self:
+ if rec.order_id.state != 'draft':
+ raise UserError(f"SO {rec.order_id.name} sudah tidak bisa diubah")
+
def action_approve(self):
for rec in self:
+ self.check_state_so()
if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError('Hanya Merchandiser yang bisa approve')
@@ -57,12 +64,14 @@ class VendorApproval(models.Model):
def action_reject(self):
for rec in self:
+ self.check_state_so()
if not self.env.user.has_group('indoteknik_custom.group_role_merchandiser'):
raise UserError('Hanya Merchandiser yang bisa cancel')
rec.state = 'cancel'
rec.order_line_id.vendor_id = rec.vendor_md_id.id
+ rec.order_line_id.purchase_price = rec.purchase_price_md
message = "Vendor Approval rejected by %s" % (self.env.user.name)
self.order_id.message_post(body=message)
diff --git a/indoteknik_custom/views/vendor_approval.xml b/indoteknik_custom/views/vendor_approval.xml
index 80458b58..359c67d4 100644
--- a/indoteknik_custom/views/vendor_approval.xml
+++ b/indoteknik_custom/views/vendor_approval.xml
@@ -5,12 +5,12 @@
<field name="name">vendor.approval.tree</field>
<field name="model">vendor.approval</field>
<field name="arch" type="xml">
- <tree default_order="create_date desc" create="0">
+ <tree default_order="create_date desc" create="0" editable="bottom">
<field name="number"/>
<field name="create_date_so"/>
<field name="order_id"/>
<field name="partner_id"/>
- <field name="state"/>
+ <field name="state" readonly="1" widget="badge" decoration-danger="state == 'cancel'" decoration-success="state == 'done'"/>
<field name="product_id"/>
<field name="sales_price" optional="hide"/>
<field name="product_uom_qty" optional="hide"/>