From 77ff4d5f81d3726dd11a67e7781974dc2e450fc4 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 2 Jan 2026 17:01:03 +0700 Subject: [PATCH] first commit --- __init__.py | 1 + __manifest__.py | 16 +++++ __pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes models/__init__.py | 1 + models/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 231 bytes .../purchase_order_line.cpython-312.pyc | Bin 0 -> 3345 bytes models/purchase_order_line.py | 58 ++++++++++++++++++ 7 files changed, 76 insertions(+) create mode 100644 __init__.py create mode 100644 __manifest__.py create mode 100644 __pycache__/__init__.cpython-312.pyc create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/purchase_order_line.cpython-312.pyc create mode 100644 models/purchase_order_line.py 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 0000000000000000000000000000000000000000..7961c5e854d786e8cfa07f1eef50d2ac44597cd8 GIT binary patch literal 211 zcmXwyKMKMy6vp#fC`BkZsCVdMaB~okAl(F)P?}(iZC**zAs5jzcouKa!Nti<=+?R7QH9c~_z?=$NBK+-!N#S%*z7C2Gst&J<;Cl|Unv5zgerrP60E gM5QYy#JcrkydzdutG$T{F!AjaJ|O@+*}_CrzB>jtBme*a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..382c1bd16033b2815b3b77b28cc8edbb3b7a8c08 GIT binary patch literal 231 zcmX@j%ge<81X9z&GnIh!V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9i2>VNJ$c z!Ud&8$r*{osqy(mDXB&AIhlE>ews|T7>byI3RW_F1{w1!Tt6c}H&ws5G$XYrrBXkj zvLquvFF8LYRX;x^Ki|+oKe@EHBtJJXB_%(vSRc*ElA^@q?99A${am1ioMQd>_{_Y_ olK6PNg34bUHbBABoK(9a4xl|CHx+{zAD9^#8SgPD7O??20MgSxVgLXD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..805acf9e35ece8be5536b10b769903f54f0df6cb GIT binary patch literal 3345 zcmbVPO>7&-6`t82a!HXA^-oucOv|z)Dvg-fk`=3};UsF^+Kyt&jtel7w-k3JlOnnD z?$R=eB`lx@LL(}w9vsO?4b$jB4x9qcDLLjCpqE`q0f|L{3TO}QO|?|i@u_ciDaxkl z9y$PL-^`nNKQr%r^Y~}4*NvdP{@Jf$oC~49k-=VL%f!xmK&&7E2{?h0IE<52m`c)N z8Y2pwMgnyU3ABjg+}_6h?<3l#!)%5Lvi~H5AZ1VD^L%+~Kq7Mk37Cvh&*^ahO>Eow3v_qz3Q{XfwX#k_ zzpX<^!;i4d%uyOOhNdPE%F!AfCo-y$oY(CJ>*OR5kU}zk-#%&pzng30RjiVz$P;-37H^gvPybh zlw~K#H62k|jHsf?S%=5R1k*h)OF}xT651ogl=(y?!>1xi(X89!TvIcqCn+jQWLD(o zB}EN7OhyqCGp6f$B%$z$n4+32xd_E%$j79U%B<<)`Dh}dC_Jx_^9+!-_-s0KRZ5B> zC4E(tg-qytM!hPfq7Z8#Nsy$s-w8$2iYg_+B`KwZ_AZ;Z?N#MSbS{>f4cWn2%_h1B z<}-3VsLT3aik$)5d18!`g6`=e`n#`nv#s}Gi{Tr39NX}n%Cn`G15Xg+8p@BA8k&EX z`!u)Z?=D1$RB|I$q{bmG@8C}$R%0j!`6E!XRE}25u?cyD zA#Wf{GRm)QF!L8LI;kJNPWZ0P7l>f-uNo4c~@~{0y&PfFL)6GU!kA0uJKwFUWI24ZLOI z8IvJ^pb$Bb>++A_`^+^uE2hL7^YY1T|H~=4Ajed3U^F2`VdKex%Gx&AskqKjDVtr&%zdWg* zn9`>r`gF25oi(PjPe>I1jM_%%ru~`5KPRJur>RvM9J%kk>n-|^8vdi-(7ONVrhk;E zJyaN5Z|*B~b`?7ZjLw1O)1}UyLeA(M0;;{U(7VwdECs-qucfb~;_(UN_=G-mQNQ?+ zetAm&=!$-2T93x{={dbKQA^49pyUWRzukv?ZF#Q@kojV&5uCKJ9}Kms6bnUpJJI4W zSKUbcq2XGn0i4&NGO5X{h5Ude6s)d+)W9K?3E@_&hjAQg&+4X8FH|NGcrz+5g<7e7 z;LSLQDleB^xzwM7%nZn4Qo2rR7nul`$zCfzgPfgPBxLPWBVc8v+H12$WG9x_J5;6}r7ojY#D1pp4m zTO}9In{J+m+9sV4f%fqHwR9vwiZK{*d@KbuQ%sdf&2KhYB@l0yG<*^;C1%w<76iz| zThm)Ez@lOz!Sg|E9}5BeQx-H^cxH7Z5*4!N=`B=h=wAHA7Rwdc4ukF3p`2{%4vieI zZ4+v@=`h>&pEH6( {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()