commit 77ff4d5f81d3726dd11a67e7781974dc2e450fc4 Author: Suherdy Yacob Date: Fri Jan 2 17:01:03 2026 +0700 first commit diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/__manifest__.py b/__manifest__.py new file mode 100644 index 0000000..0867e3d --- /dev/null +++ b/__manifest__.py @@ -0,0 +1,16 @@ +{ + 'name': 'Purchase Order Tracking', + 'version': '1.0', + 'category': 'Purchase', + 'summary': 'Track changes in Purchase Order Lines', + 'description': """ + This module tracks changes in Purchase Order Lines (Product and Quantity) + and posts notifications to the Purchase Order chatter. + """, + 'author': 'Suherdy Yacob', + 'depends': ['purchase'], + 'data': [], + 'installable': True, + 'application': False, + 'license': 'LGPL-3', +} diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..7961c5e Binary files /dev/null and b/__pycache__/__init__.cpython-312.pyc differ diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..fa6c0e4 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1 @@ +from . import purchase_order_line diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..382c1bd Binary files /dev/null and b/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/models/__pycache__/purchase_order_line.cpython-312.pyc b/models/__pycache__/purchase_order_line.cpython-312.pyc new file mode 100644 index 0000000..805acf9 Binary files /dev/null and b/models/__pycache__/purchase_order_line.cpython-312.pyc differ diff --git a/models/purchase_order_line.py b/models/purchase_order_line.py new file mode 100644 index 0000000..6a27a30 --- /dev/null +++ b/models/purchase_order_line.py @@ -0,0 +1,58 @@ +from odoo import models, fields, api + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + @api.model_create_multi + def create(self, vals_list): + lines = super(PurchaseOrderLine, self).create(vals_list) + for line in lines: + if line.order_id: + # Log creation + msg = f"Line added: {line.product_id.display_name} (Qty: {line.product_qty})" + line.order_id.message_post(body=msg) + return lines + + def write(self, vals): + # Capture old values for tracking + changes = {} + track_fields = ['product_id', 'product_qty'] + + # Only track if relevant fields are being modified + if any(f in vals for f in track_fields): + for line in self: + changes[line.id] = { + 'product_id': line.product_id, + 'product_qty': line.product_qty, + } + + result = super(PurchaseOrderLine, self).write(vals) + + for line in self: + if line.id in changes: + old_data = changes[line.id] + + # Track Product Change + if 'product_id' in vals: + new_product = line.product_id + old_product = old_data['product_id'] + if old_product != new_product: + msg = f"Product changed on line: {old_product.display_name or 'None'} -> {new_product.display_name or 'None'}" + line.order_id.message_post(body=msg) + + # Track Quantity Change + if 'product_qty' in vals: + new_qty = line.product_qty + old_qty = old_data['product_qty'] + if old_qty != new_qty: + msg = f"Quantity changed for {line.product_id.display_name}: {old_qty} -> {new_qty}" + line.order_id.message_post(body=msg) + + return result + + def unlink(self): + for line in self: + if line.order_id and line.product_id: + msg = f"Line removed: {line.product_id.display_name} (Qty: {line.product_qty})" + line.order_id.message_post(body=msg) + return super(PurchaseOrderLine, self).unlink()