summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-05-10 15:36:55 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-05-10 15:36:55 +0700
commitad3eb842d881ad89b0239075695dc2ccf424031f (patch)
tree85f3f38f9de7fb2304ae5bfda4f6404b11112d49
parent0362205a2ac1404fffccdd02691f121a4ffac76e (diff)
(andri) add log note PO Confirm di purchase Pricelist
-rwxr-xr-xindoteknik_custom/models/purchase_order.py122
1 files changed, 119 insertions, 3 deletions
diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py
index 98b367d0..a3e2c388 100755
--- a/indoteknik_custom/models/purchase_order.py
+++ b/indoteknik_custom/models/purchase_order.py
@@ -580,10 +580,11 @@ class PurchaseOrder(models.Model):
purchase_pricelist = self.env['purchase.pricelist'].search([
('product_id', '=', line.product_id.id),
('vendor_id', '=', line.order_id.partner_id.id)
- ])
- purchase_pricelist = purchase_pricelist.with_context(update_by='system')
+ ])
+
if not purchase_pricelist:
- purchase_pricelist.create([{
+ # Buat pricelist baru dengan context
+ new_pricelist = self.env['purchase.pricelist'].with_context(update_by='system').create([{
'vendor_id': line.order_id.partner_id.id,
'product_id': line.product_id.id,
'product_price': 0,
@@ -591,12 +592,52 @@ class PurchaseOrder(models.Model):
'system_price': price_unit,
'system_last_update': current_time
}])
+
+ # Buat lognote untuk pricelist baru
+ message = f"""
+ <b>New Purchase Pricelist Created from PO</b><br/>
+ <b>PO:</b> <a href="#id={line.order_id.id}&model=purchase.order&view_type=form">{line.order_id.name}</a><br/>
+ <b>System Price:</b> {price_unit:,.2f}<br/>
+ <b>System Tax:</b> {taxes.name if taxes else 'No Tax'}<br/>
+ <b>System Update:</b> {current_time}<br/>
+ """
+ new_pricelist.message_post(body=message, subtype_id=self.env.ref("mail.mt_note").id)
else:
+ # Simpan nilai lama untuk logging
+ old_values = {
+ 'system_price': purchase_pricelist.system_price,
+ 'taxes_system_id': purchase_pricelist.taxes_system_id,
+ }
+
+ # Update dengan context
+ purchase_pricelist = purchase_pricelist.with_context(update_by='system')
purchase_pricelist.write({
'system_last_update': current_time,
'taxes_system_id': taxes.id,
'system_price': price_unit
})
+
+ # Buat lognote jika ada perubahan
+ changes = []
+ if old_values['system_price'] != price_unit:
+ changes.append(f"<li><b>System Price</b>: {old_values['system_price']:,.2f} → {price_unit:,.2f}</li>")
+ if old_values['taxes_system_id'] != taxes:
+ old_tax_name = old_values['taxes_system_id'].name if old_values['taxes_system_id'] else 'No Tax'
+ new_tax_name = taxes.name if taxes else 'No Tax'
+ changes.append(f"<li><b>System Tax</b>: {old_tax_name} → {new_tax_name}</li>")
+
+ if changes:
+ message = f"""
+ <b>System Fields Updated from PO</b><br/>
+ <b>PO:</b> <a href="#id={line.order_id.id}&model=purchase.order&view_type=form">{line.order_id.name}</a><br/>
+ <b>Changes:</b>
+ <ul>
+ {"".join(changes)}
+ <li><b>System Update</b>: {current_time}</li>
+ </ul>
+ <b>Updated By:</b> {self.env.user.name}
+ """
+ purchase_pricelist.message_post(body=message, subtype_id=self.env.ref("mail.mt_note").id)
def _compute_date_planned(self):
for order in self:
@@ -1198,8 +1239,83 @@ class PurchaseOrder(models.Model):
if not self.env.context.get('skip_check_payment'):
self.with_context(skip_check_payment=True)._check_payment_term()
self.with_context(notify_tax=True)._check_tax_rule()
+ # Tambahkan pemanggilan method untuk handle pricelist system update
+ self._handle_pricelist_system_update(vals)
return res
+ def _handle_pricelist_system_update(self, vals):
+ if 'order_line' in vals or any(key in vals for key in ['state', 'approval_status']):
+ for order in self:
+ # Hanya proses jika PO sudah approved
+ if order.state in ['purchase', 'done'] and order.approval_status == 'approved':
+ self._process_pricelist_update(order)
+
+ def _process_pricelist_update(self, order):
+ for line in order.order_line:
+ pricelist = self._get_related_pricelist(line.product_id, order.partner_id)
+
+ if pricelist:
+ # Simpan nilai lama
+ old_values = self._get_pricelist_old_values(pricelist)
+
+ # Update dan cek perubahan
+ self._update_and_log_pricelist(pricelist, line, old_values)
+
+ def _get_related_pricelist(self, product_id, vendor_id):
+ return self.env['purchase.pricelist'].search([
+ ('product_id', '=', product_id.id),
+ ('vendor_id', '=', vendor_id.id)
+ ], limit=1)
+
+ def _get_pricelist_old_values(self, pricelist):
+ return {
+ 'system_price': pricelist.system_price,
+ 'taxes_system_id': pricelist.taxes_system_id,
+ 'system_last_update': pricelist.system_last_update
+ }
+
+ def _update_and_log_pricelist(self, pricelist, po_line, old_values):
+ changes = []
+ current_time = fields.Datetime.now()
+
+ # Cek perubahan System Price
+ if pricelist.system_price != po_line.price_unit:
+ if old_values['system_price'] != po_line.price_unit:
+ changes.append(f"<li><b>System Price</b>: {old_values['system_price']:,.2f} → {po_line.price_unit:,.2f}</li>")
+
+ # Cek perubahan System Tax
+ if pricelist.taxes_system_id != po_line.taxes_id:
+ old_tax = old_values['taxes_system_id']
+ old_tax_name = old_tax.name if old_tax else 'No Tax'
+ new_tax_name = po_line.taxes_id.name if po_line.taxes_id else 'No Tax'
+ if old_tax != po_line.taxes_id:
+ changes.append(f"<li><b>System Tax</b>: {old_tax_name} → {new_tax_name}</li>")
+
+ # Update fields jika ada perubahan
+ if changes:
+ pricelist.with_context(update_by='system').write({
+ 'system_price': po_line.price_unit,
+ 'taxes_system_id': po_line.taxes_id.id if po_line.taxes_id else False,
+ 'system_last_update': current_time
+ })
+
+ # Buat lognote
+ self._create_pricelist_lognote(pricelist, po_line, changes, current_time)
+
+ def _create_pricelist_lognote(self, pricelist, po_line, changes, timestamp):
+ message = f"""
+ <b>System Fields Updated from PO</b><br/>
+ <b>PO:</b> <a href="#id={po_line.order_id.id}&model=purchase.order&view_type=form">{po_line.order_id.name}</a><br/>
+ <b>Changes:</b>
+ <ul>
+ {"".join(changes)}
+ <li><b>System Update</b>: {timestamp}</li>
+ </ul>
+ <b>Updated By:</b> {self.env.user.name}
+ """
+
+ pricelist.message_post(body=message, subtype_id=self.env.ref("mail.mt_note").id)
+
class PurchaseOrderUnlockWizard(models.TransientModel):
_name = 'purchase.order.unlock.wizard'
_description = 'Wizard untuk memberikan alasan unlock PO'