+
    `ØjæŒ  ã                   óN  € ^ RI HtHtHt ^ RIHt ^ RIHtHtH	t	 ^ RI
Ht ^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ^ R	IHtHtHtHtHtHtHt ^ R
IHt ^RIHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't' ^ RI(H)t) ^ RI*H+t+H,t, ^ RI-H.t. ]! 4       t/]/Pa                  R4      ]! ]4      ]! ]! RR4      4      3R R ll4       t1]/Pa                  R]+] ,          R7      ^ ^d]! ]4      ]! ]! RR4      4      3R R ll4       t2]/Pa                  R4      ]! ]4      ]! ]! RR4      4      3R R ll4       t3]/Pi                  R] ^ÉR7      ]! ]4      ]! ]! RR4      4      3R R ll4       t5]/Pa                  R] R7      ]! ]4      ]! ]! RR4      4      3R  R! ll4       t6]/Pa                  R"4      ]! ]4      ]! ]! RR4      4      3R# R$ ll4       t7]/Pq                  R] R7      ]! ]4      ]! ]! RR%4      4      3R& R' ll4       t9]/Pq                  R(] R7      ]! ]4      ]! ]! RR%4      4      3R) R* ll4       t:]/Pi                  R+] R7      ]! ]4      ]! ]! RR,4      4      3R- R. ll4       t;]/Py                  R^ÌR/7      ]! ]4      ]! ]! RR04      4      3R1 R2 ll4       t=^ R3I>H?t? ]/Pa                  R44      ]! ]4      ]! ]! RR4      4      3R5 R6 ll4       t@]/Pa                  R7]+]#,          R7      ]! ]4      ]! ]! RR4      4      3R8 R9 ll4       tA]/Pa                  R:]+]#,          R7      ^ ^d]! ]4      ]! ]! RR4      4      3R; R< ll4       tB]/Pa                  R=]#R7      ]! ]4      ]! ]! RR4      4      3R> R? ll4       tC]/Pi                  R:]#^ÉR7      ]! ]4      ]! ]! RR4      4      3R@ RA ll4       tD]/Pi                  RB]#R7      ]! ]4      ]! ]! RR%4      4      3RC RD ll4       tE]/Pi                  RE]#R7      ]! ]4      ]! ]! RR,4      4      3RF RG ll4       tF]/Pq                  R=]#R7      ]! ]4      ]! ]! RR%4      4      3RH RI ll4       tG]/Py                  R=^ÌR/7      ]! ]4      ]! ]! RR04      4      3RJ RK ll4       tH^ RLI>HItI ^RMIHJtJHKtK ]/Pi                  RN]K^ÉR7      ]! ]4      ]! ]! RR4      4      3RO RP ll4       tL]/Pi                  RQ]KR7      ]! ]4      ]! ]! RR,4      4      3RR RS ll4       tM]/Pa                  RN]+]K,          R7      ]! ]4      ]! ]! RR4      4      3RT RU ll4       tNRV RW ltO]/Pa                  RX]+]&,          R7      RYRYRY]! ]4      ]! ]! RR4      4      3RZ R[ ll4       tP]/Pi                  RX]&^ÉR7      ]! ]4      ]! ]! RR4      4      3R\ R] ll4       tQ]/Pa                  R^]&R7      ]! ]4      ]! ]! RR4      4      3R_ R` ll4       tR]/Pq                  R^]&R7      ]! ]4      ]! ]! RR%4      4      3Ra Rb ll4       tS]/Py                  R^^ÌR/7      ]! ]4      ]! ]! RR04      4      3Rc Rd ll4       tTRY# )eé    )Ú	APIRouterÚDependsÚHTTPException©ÚAsyncSession)ÚselectÚfuncÚand_)Úselectinload)Úget_db)Úrequire_permission)Únext_document_number)ÚdatetimeÚdate)ÚRmPurchaseOrderÚ
RmPoDetailÚRmReceivingLogÚ	GrnDetailÚPoStatusMasterÚMonthlyProcurementPlanÚMonthlyProcurementPlanLine)ÚInventoryService)	ÚRmPurchaseOrderCreateÚRmPurchaseOrderResponseÚRmPurchaseOrderStatusUpdateÚRmReceivingLogCreateÚRmReceivingLogResponseÚMonthlyPlanCreateÚMonthlyPlanUpdateÚMonthlyPlanResponseÚMonthlyPlanLineResponse)ÚUUID)ÚListÚOptional)ÚDecimalz/po-statusesÚPROCUREMENTÚviewc                ó$   € V ^8„  d   QhR\         /# ©é   Údbr   )Úformats   "Ú@/var/www/html/audi_dev/backend/app/modules/procurement/routes.pyÚ__annotate__r.      s   € ÷ (ñ (œ|ñ (ó    c              ƒ  óþ   "  € V P                  \        \        4      P                  \        P                  P                  4       4      4      G Rj  x€L
 p\        VP                  4       P                  4       4      #  L+5i)zÀ
Fetch all available PO statuses (e.g., OPEN, APPROVED, CLOSED).
Purpose: Used by the frontend dropdowns to display valid status transitions
for Purchase Orders within the procurement module.
N)	Úexecuter   r   Úorder_byÚcodeÚascÚlistÚscalarsÚall©r+   Ú_Úresults   && r-   Úlist_po_statusesr;      sX   é € ð —:‘:œf¤^Ó4×=Ñ=¼n×>QÑ>Q×>UÑ>UÓ>WÓXÓY×Y€FÜ�—‘Ó ×$Ñ$Ó&Ó'Ð'ñ Zùs   ‚AA=ÁA;Á,A=z/purchase-orders)Úresponse_modelc                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r*   ÚskipÚlimitr+   ©Úintr   )r,   s   "r-   r.   r.   &   s$   € ÷ (ñ (Ü
ð(Üð(äñ(r/   c              ƒ  ó4  "  € \        \        4      P                  \        \        P                  4      4      P                  V 4      P                  V4      pVP                  V4      G Rj  x€L
 p\        VP                  4       P                  4       4      #  L+5i)zò
Fetch a paginated list of Purchase Orders along with their associated details.
Purpose: Serves the primary data grid on the PO Management page. Uses `selectinload`
to efficiently fetch child line items (details) avoiding N+1 query problems.
N)r   r   Úoptionsr   ÚdetailsÚoffsetr@   r1   r5   r6   r7   ©r?   r@   r+   r9   Ústmtr:   s   &&&&  r-   Úlist_purchase_ordersrI   %   sn   é € ô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰�‹ß	‰ˆu‹ð	 	ð —:‘:˜dÓ#×#€FÜ�—‘Ó ×$Ñ$Ó&Ó'Ð'ñ $ùó   ‚A(BÁ*BÁ+,Bz/purchase-orders/next-numberc                ó$   € V ^8„  d   QhR\         /# r)   r   )r,   s   "r-   r.   r.   :   s   € ÷ "ñ "Üñ"r/   c              ƒ  ó\   "  € \        V \        P                  R4      G Rj  x€L
 pRV/#  L5i)zU
Generate or preview the next sequential Purchase Order Number (e.g. PO-2026-00001).
ÚPONÚ	po_number)r   r   rN   )r+   r9   Únext_nos   && r-   Úget_next_po_numberrP   9   s/   é € ô )¨¬_×-FÑ-FÈÓM×M€GØ˜Ð!Ð!ñ Nùs   ‚,¡*¢	,)r<   Ústatus_codeÚcreatec                ó0   € V ^8„  d   QhR\         R\        /# ©r*   Údatar+   )r   r   )r,   s   "r-   r.   r.   E   s    € ÷ Fñ FÜ
ðFäñFr/   c              ƒ  óp  "  € \        R4      p. pV P                   FÂ  p\        \        VP                  ;'       g    R4      4      p\        \        VP                  4      4      p\        \        VP
                  4      4      pWx,          ^V^d,          ,           ,          p	W9,          p\        VP                  V\        R4      VVV	RR7      p
VP                  V
4       KÄ  	  V P                  '       d;   V P                  P                  4       '       d   V P                  P                  4       MRpV'       d‹   VP                  \        \        P                  4      P                  \        P                  V8H  4      4      G Rj  x€L
 P!                  4       pV'       d$   \#        V\        P                  R4      G Rj  x€L
 pM#\#        V\        P                  R4      G Rj  x€L
 p\        VV P$                  V P&                  V P(                  V P*                  V P,                  VP.                  VVR7	      pVP1                  V4       VP3                  4       G Rj  x€L
  ^ RIHp T! VP                  R	R
V'       d   VP8                  MRR7      pVP1                  V4       \        \        4      P;                  \=        \        P                  4      4      P                  \        P                  VP                  8H  4      pVP                  V4      G Rj  x€L
 pVP?                  4       pV#  EL¦ ELp ELO LØ L!5i)a3  
Create a new Purchase Order (Header) along with its line items (Details).
Purpose: This is the core entry point for ordering Raw Materials from vendors.
It automatically calculates line amounts including GST, aggregates the total
PO amount, and persists the hierarchical data (header + children) together.
ú0.0ç        ÚOPEN©Úrm_idÚ	order_qtyÚreceived_qtyÚ
unit_priceÚgst_percentÚline_amountÚline_statusNrM   )	rN   Ú	vendor_idÚ
order_dateÚexpected_delivery_dateÚ	status_idÚnotesÚ
created_byÚtotal_amountrE   ©ÚRmPoHistoryÚCREATEDzPurchase Order createdÚSystem©Úpo_idÚactionÚdescriptionÚcreated_by_name) r%   rE   Ústrr_   r\   r^   r   r[   ÚappendrN   Ústripr1   r   r   rn   ÚwhereÚscalar_one_or_noner   rb   rc   rd   re   rf   Úuser_idÚaddÚflushÚapp.models.rm_modelsrj   ÚnamerD   r   Ú
scalar_one)rU   r+   Úuserrh   Ú
po_detailsÚ	detail_inÚgstÚqtyÚpricer`   ÚdetailÚfinal_po_numberÚexistingÚporj   ÚhistoryrH   r:   s   &&&               r-   Úcreate_purchase_orderrˆ   D   sq  é € ô ˜5“>€LØ€Jà—\”\ˆ	Ü”c˜)×/Ñ/×6Ð6°3Ó7Ó8ˆÜ”c˜)×-Ñ-Ó.Ó/ˆÜœ˜I×0Ñ0Ó1Ó2ˆØ•k Q¨¨s­¥]Õ3ˆØÕ#ˆäØ—/‘/ØÜ  ›ØØØ#Øô
ˆð 	×Ñ˜&Ö!ñ! "ð$ 15··°À4Ç>Á>×CWÑCW×CYÒCY�d—n‘n×*Ñ*Ô,Ð_c€OßØŸ*™*¤V¬O×,AÑ,AÓ%B×%HÑ%HÌ×IbÑIbÐfuÑIuÓ%vÓw×w÷  Lñ  Ló  NˆßÜ$8¸¼_×=VÑ=VÐX\Ó$]×]ˆOøä 4°R¼×9RÑ9RÐTXÓ Y×Yˆä	Ø!Ø—.‘.Ø—?‘?Ø#×:Ñ:Ø—.‘.Ø�j‰jØ—<‘<Ø!Øô

€Bð ‡F�Fˆ2„JØ
�(‰(‹*×Ðå0ÙØ�h‰hØØ,ß%)˜Ÿ	š	¨xô	€Gð ‡F�Fˆ7„Oô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨¯©Ñ0Ó	1ð 	ð
 —:‘:˜dÓ#×#€FØ	×	Ñ	Ó	€BØ€IòI xâ]âYñ ñ  $ùs{   ‚C1L6Ã4L6Ä#L6Ä8AL6ÆL)ÆL6ÆL6Æ<L,Æ=#L6Ç L/Ç!A8L6ÉL2É L6É;BL6ÌL4ÌL6Ì,L6Ì/L6Ì2L6Ì4L6z/purchase-orders/{po_id}c                ó0   € V ^8„  d   QhR\         R\        /# ©r*   rn   r+   ©r"   r   )r,   s   "r-   r.   r.   �   s   € ÷ ñ Üðäñr/   c              ƒ  ó6  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hV#  L*5i)z*
Fetch a single Purchase Order by its ID.
Né”  úPurchase Order not found)
r   r   rD   r   rE   ru   rn   r1   rv   r   ©rn   r+   r9   rH   r:   r†   s   &&&   r-   Úget_purchase_orderr�   �   sz   é € ô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨Ñ-Ó	.ð 	ð
 —:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BßÜ˜CÐ!;Ó<Ð<Ø€Iñ	 $ùó   ‚A*BÁ,BÁ-BÂ	Bz /purchase-orders/{po_id}/historyc                ó0   € V ^8„  d   QhR\         R\        /# rŠ   r‹   )r,   s   "r-   r.   r.   ¤   s   € ÷ ñ Üðäñr/   c              ƒ   óÊ  "  € ^ RI Hp \        V4      P                  VP                  V 8H  4      P                  VP                  P                  4       4      pVP                  V4      G Rj  x€L
 pVP                  4       P                  4       pV Uu. uFA  pRVP                  RVP                  RVP                  RVP                  RVP                  /NKC  	  up#  Lpu upi 5i)r   ri   NÚ
history_idro   rp   rq   Ú
created_at)rz   rj   r   ru   rn   r2   r•   Údescr1   r6   r7   r”   ro   rp   rq   )rn   r+   r9   rj   rH   r:   r‡   Úhs   &&&     r-   Úget_po_historyr˜   £   sË   é € õ 1Ü�+Ó×$Ñ$ [×%6Ñ%6¸%Ñ%?Ó@×IÑIÈ+×J`ÑJ`×JeÑJeÓJgÓh€DØ—:‘:˜dÓ#×#€FØ�n‰nÓ×"Ñ"Ó$€Gñ ó	ñ ˆAð ˜!Ÿ,™,Ø�a—h‘hØ˜1Ÿ=™=Ø˜q×0Ñ0Ø˜!Ÿ,™,ó	
ñ ñ	ð 	ñ $ùò	ùs%   ‚A)C#Á+CÁ,&C#ÂACÃC#ÃC#Úeditc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r*   rn   rU   r+   )r"   r   r   )r,   s   "r-   r.   r.   º   s+   € ÷ Mñ MÜðMä
ðMô 	ñMr/   c              ƒ  óf  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  Vn
        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                   Uu/ uF  qwP                   VbK  	  pp. p	\#        R4      p
VP                   EF!  p\#        \%        VP&                  4      4      p\#        \%        VP(                  4      4      p\#        \%        VP*                  ;'       g    ^ 4      4      pWÍ,          ^V^d,          ,           ,          pW¯,          p
VP                   V9   dN   W‹P                   ,          pVVn        VVn        VVn        VVn        V	P/                  V4       W‹P                    Kë  \1        VP                   V\#        R4      VVVRR7      pV	P/                  V4       EK$  	  W–n        W¦n         VP5                  4       G Rj  x€L
  ^ RIHp T! VP                  RR	V'       d   VP:                  MR
R7      pVP=                  V4       VP5                  4       G Rj  x€L
  TPA                  T4      G Rj  x€L
  T#  ELŒu upi  L€ L)  \>         d   p\        RR\%        T4       24      hRp?ii ; i L=5i)zY
Update a Purchase Order by its ID.
Replaces existing line items with the provided ones.
Nr�   rŽ   rW   rY   rZ   ri   ÚUPDATEDzPurchase Order details updatedrl   rm   é�  zFailed to update PO: )!r   r   rD   r   rE   ru   rn   r1   rv   r   rN   rb   rc   rd   re   rf   r[   r%   rr   r\   r^   r_   r`   rs   r   rh   ry   rz   rj   r{   rx   Ú	ExceptionÚrefresh)rn   rU   r+   r}   rH   r:   r†   ÚdÚexisting_detailsÚnew_detailsrh   r   r�   r‚   r€   r`   rƒ   rj   r‡   Úes   &&&&                r-   Úupdate_purchase_orderr¤   ¹   s›  é € ô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨Ñ-Ó	.ð 	ð
 —:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BßÜ˜CÐ!;Ó<Ð<à—>‘>€B„LØ—>‘>€B„LØ—O‘O€B„MØ $× ;Ñ ;€BÔØ—>‘>€B„LØ�z‰z€B„Hà,.¯JªJÓ7©J qŸ™ š
©JÐÐ7Ø€Kä˜5“>€LØ—\•\ˆ	Ü”c˜)×-Ñ-Ó.Ó/ˆÜœ˜I×0Ñ0Ó1Ó2ˆÜ”c˜)×/Ñ/×4Ð4°1Ó5Ó6ˆØ•k Q¨¨s­¥]Õ3ˆØÕ#ˆà�?‰?Ð.Ô.Ø%§o¡oÕ6ˆFØ"ˆFÔØ %ˆFÔØ!$ˆFÔØ!,ˆFÔØ×Ñ˜vÔ&Ø §¡Ò1äØ—o‘oØÜ$ U›^Ø ØØ'Ø"ôˆFð ×Ñ˜v×&ñ3 "ð6 „Jà"„OðCØ�h‰h‹j×Ðå4ÙØ—(‘(ØØ8ß)-˜DŸIšI°8ô	
ˆð 	�‰ˆwŒØ�h‰h‹j×Ðð �*‰*�R‹.×ÐØ€Iò} $ùò 8ñF 	ñ 	øÜô CÜ˜CÐ#8¼¸Q»¸Ð!AÓBÐBûðCúñ ùs†   ‚A*L1Á,K8Á-L1Â	B L1Ä	K;ÄEL1É,L É?L Ê  L Ê!7L ËLËL ËL1Ë1L/Ë2L1Ë;L1Ì L ÌL ÌL,ÌL'Ì'L,Ì,L1z/purchase-orders/{po_id}/statusc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r*   rn   Ústatus_datar+   )r"   r   r   )r,   s   "r-   r.   r.   
  s&   € ÷ -ñ -Üð-ä,ð-ô 	ñ-r/   c              ƒ  óæ  "  € VP                  \        VP                  4      G Rj  x€L
 pV'       g   \        RR4      hVP                  R8X  d   VP
                  R9  d   \        RR4      h\        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  Vn        VP                  R8X  d,   VP                  Vn        \"        P$                  ! 4       Vn        VP)                  4       G Rj  x€L
  ^ R	IHp T! VP                  R
RVP.                   2V'       d   VP.                  MRR7      p	VP1                  V	4       VP)                  4       G Rj  x€L
  VP3                  V4      G Rj  x€L
  V#  EL¿ EL L‹ L' L5i)zE
Update the lifecycle status of a PO (e.g., from DRAFT to APPROVED).
Nr�   zInvalid status IDÚAPPROVEDé“  z)Only managers can approve purchase ordersr�   rŽ   ri   ÚSTATUS_CHANGEDzStatus changed to rl   rm   )ÚPROCUREMENT_MGRÚADMIN)Úgetr   re   r   r3   Ú	role_coder   r   rD   r   rE   ru   rn   r1   rv   rw   Úapproved_byr   ÚutcnowÚapproved_atry   rz   rj   r{   rx   rŸ   )
rn   r¦   r+   r}   Ústatus_existsrH   r:   r†   rj   r‡   s
   &&&&      r-   Úupdate_po_statusr³   	  s…  é € ð Ÿ&™&¤°×1FÑ1FÓG×G€MßÜ˜CÐ!4Ó5Ð5à×Ñ˜ZÔ'¨D¯N©NÐB^Ô,^Ü˜CÐ!LÓMÐMô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨Ñ-Ó	.ð 	ð
 —:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BßÜ˜CÐ!;Ó<Ð<à×(Ñ(€B„Là×Ñ˜ZÔ'ØŸ™ˆŒÜ!ŸšÓ*ˆŒà
�(‰(‹*×Ðå0ÙØ�h‰hØØ(¨×);Ñ);Ð(<Ð=ß%)˜Ÿ	š	¨xô	€Gð ‡F�Fˆ7„OØ
�(‰(‹*×Ðà
�*‰*�R‹.×ÐØ€IòI Hò $ñ ñ áùsj   ‚$G1¦G%§G1³B#G1ÃG(ÃG1Ã3A,G1ÅG+Å -G1Æ7G1ÇG-ÇG1ÇG/ÇG1Ç(G1Ç+G1Ç-G1Ç/G1z /purchase-orders/{po_id}/approveÚapprovec                ó0   € V ^8„  d   QhR\         R\        /# rŠ   r‹   )r,   s   "r-   r.   r.   :  s   € ÷ 5ñ 5Üð5äñ5r/   c              ƒ  ó  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      h\        \        4      P                  \        P                  VP                  8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       d   VP                  R8X  d   \        RR4      hVP                  VP                  8X  d   VP                   R8w  d   \        RR	4      h\        \        4      P                  \        P                  R8H  4      p	VP                  V	4      G Rj  x€L
 p
V
P                  4       pV'       d   VP                  Vn        VP                  Vn        \$        P&                  ! 4       Vn        VP+                  4       G Rj  x€L
  ^ R
IHp T! VP                  RRV'       d   VP0                  MRR7      pVP3                  V4       VP+                  4       G Rj  x€L
  VP5                  V4      G Rj  x€L
  V#  EL EL� Lê L€ L) L5i)z>
Approve a Purchase Order.
Requires PROCUREMENT_MGR or ADMIN.
Nr�   rŽ   r¨   r�   z"Purchase Order is already approvedr¬   r©   úSelf-approval is not allowedri   zPurchase Order approvedrl   rm   )r   r   rD   r   rE   ru   rn   r1   rv   r   r   Úidre   r3   rg   rw   r®   r¯   r   r°   r±   ry   rz   rj   r{   rx   rŸ   )rn   r+   r}   rH   r:   r†   Ústatus_stmtÚ
status_resÚ
status_objÚapproved_status_stmtÚapproved_status_resÚapproved_status_objrj   r‡   s   &&&           r-   Úapprove_purchase_orderr¿   9  sì  é € ô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨Ñ-Ó	.ð 	ð
 —:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BßÜ˜CÐ!;Ó<Ð<ô œÓ(×.Ñ.¬~×/@Ñ/@ÀBÇLÁLÑ/PÓQ€KØ—z‘z +Ó.×.€JØ×.Ñ.Ó0€Jç�j—o‘o¨Ô3Ü˜CÐ!EÓFÐFà	‡}�}˜Ÿ™Ô$¨¯©¸7Ô)BÜ˜CÐ!?Ó@Ð@ô "¤.Ó1×7Ñ7¼×8KÑ8KÈzÑ8YÓZÐØ "§
¡
Ð+?Ó @×@ÐØ-×@Ñ@ÓBÐçØ*×-Ñ-ˆŒà—\‘\€B„NÜ—_’_Ó&€B„NØ
�(‰(‹*×Ðå0ÙØ�h‰hØØ-ß%)˜Ÿ	š	¨xô	€Gð ‡F�Fˆ7„OØ
�(‰(‹*×Ðà
�*‰*�R‹.×ÐØ€IòO $ò /ñ Añ ñ áùs‡   ‚A*J
Á,I<Á-J
Â	AJ
Ã"I?Ã#J
Ã?BJ
ÆJÆJ
Æ4AJ
ÈJÈ J
È%7J
ÉJÉJ
É5JÉ6J
É?J
ÊJ
ÊJ
ÊJ
ÊJ
)rQ   Údeletec                ó0   € V ^8„  d   QhR\         R\        /# rŠ   r‹   )r,   s   "r-   r.   r.   r  s   € ÷ ñ Üðäñr/   c              ƒ  ó   "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  V4      G Rj  x€L
  VP                  4       G Rj  x€L
  R#  L[ L  L
5i)zS
Delete a Purchase Order permanently.
Purpose: Allows admin to remove a PO record.
Nr�   rŽ   )r   r   rD   r   rE   ru   rn   r1   rv   r   rÀ   ry   r�   s   &&&   r-   Údelete_purchase_orderrÃ   q  s�   é € ô 	ŒÓß	‰”œo×5Ñ5Ó6Ó	7ß	‰Œ×$Ñ$¨Ñ-Ó	.ð 	ð
 —:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BßÜ˜CÐ!;Ó<Ð<Ø
�)‰)�B‹-×ÐØ
�(‰(‹*×Òñ $ñ Ùùó<   ‚A*CÁ,CÁ-CÂ	 CÂ)C
Â*CÃCÃCÃ
CÃC)ÚASNLogz/purchase-orders/{po_id}/asnsc                ó0   € V ^8„  d   QhR\         R\        /# rŠ   r‹   )r,   s   "r-   r.   r.   Š  ó   € ÷ (ñ (Üð(äñ(r/   c              ƒ  óŽ  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      P                  \        P                  P                  4       4      pVP                  V4      G Rj  x€L
 p\        VP                  4       P                  4       4      #  L+5i)z,
Fetch all ASNs for a given Purchase Order.
N)r   rÅ   rD   r   rE   ru   rn   r2   r•   r–   r1   r5   r6   r7   ©rn   r+   r9   rH   r:   s   &&&  r-   Úget_po_asnsrÊ   ‰  s…   é € ô 	Œv‹ß	‰”œfŸn™nÓ-Ó	.ß	‰Œv�|‰|˜uÑ$Ó	%ß	‰”&×#Ñ#×(Ñ(Ó*Ó	+ð	 	ð —:‘:˜dÓ#×#€FÜ�—‘Ó ×$Ñ$Ó&Ó'Ð'ñ $ùó   ‚BCÂCÂ,Cz/purchase-orders/{po_id}/grnsc                ó0   € V ^8„  d   QhR\         R\        /# rŠ   r‹   )r,   s   "r-   r.   r.   œ  rÇ   r/   c              ƒ  óŽ  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      P                  \        P                  P                  4       4      pVP                  V4      G Rj  x€L
 p\        VP                  4       P                  4       4      #  L+5i)z,
Fetch all GRNs for a given Purchase Order.
N)r   r   rD   r   rE   ru   rn   r2   r•   r–   r1   r5   r6   r7   rÉ   s   &&&  r-   Úget_po_grnsrÎ   ›  sŠ   é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×#Ñ# uÑ,Ó	-ß	‰”.×+Ñ+×0Ñ0Ó2Ó	3ð	 	ð —:‘:˜dÓ#×#€FÜ�—‘Ó ×$Ñ$Ó&Ó'Ð'ñ $ùrË   z/grnc                ó<   € V ^8„  d   QhR\         R\         R\        /# r>   rA   )r,   s   "r-   r.   r.   ¯  s$   € ÷ (ñ (Ü
ð(Üð(äñ(r/   c              ƒ  ó4  "  € \        \        4      P                  \        \        P                  4      4      P                  V 4      P                  V4      pVP                  V4      G Rj  x€L
 p\        VP                  4       P                  4       4      #  L+5i)z,
Fetch a list of Goods Receipt Notes (GRN).
N)r   r   rD   r   rE   rF   r@   r1   r5   r6   r7   rG   s   &&&&  r-   Úlist_grnrÑ   ®  sn   é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰�‹ß	‰ˆu‹ð	 	ð —:‘:˜dÓ#×#€FÜ�—‘Ó ×$Ñ$Ó&Ó'Ð'ñ $ùrJ   z/grn/{grn_id}c                ó0   € V ^8„  d   QhR\         R\        /# ©r*   Úgrn_idr+   r‹   )r,   s   "r-   r.   r.   Á  s   € ÷ ñ Üðäñr/   c              ƒ  ó6  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hV#  L*5i)z4
Fetch a single Goods Receipt Note (GRN) by its ID.
Nr�   úGRN not found)
r   r   rD   r   rE   ru   rÔ   r1   rv   r   ©rÔ   r+   r9   rH   r:   Úgrns   &&&   r-   Úget_grnrÙ   À  sy   é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨Ñ.Ó	/ð 	ð
 —:‘:˜dÓ#×#€FØ
×
#Ñ
#Ó
%€CßÜ˜C Ó1Ð1Ø€Jñ	 $ùr‘   c                ó0   € V ^8„  d   QhR\         R\        /# rT   )r   r   )r,   s   "r-   r.   r.   Õ  s   € ÷ <ñ <Ü
ð<äñ<r/   c              ƒ  óž  "  € \        V P                  ;'       g$    \        V\         P                  R4      G Rj  x€L
 V P                  V P                  V P
                  V P                  V P                  V P                  V P                  ;'       g    RV P                  VP                  R7
      pVP                  V4       V P
                  '       d8   VP                  \        V P
                  4      G Rj  x€L
 pV'       d   RVn        VP!                  4       G Rj  x€L
  \#        V4       . pV P$                   FÞ  p\'        \)        VP*                  4      4      pVP,                  e   \'        \)        VP,                  4      4      MTp\'        \)        VP.                  ;'       g    R4      4      p	\1        VP2                  VP4                  VP6                  VVV	VP8                  VP:                  R7      p
VP                  V
4       VP=                  V
4       Kà  	  VP!                  4       G Rj  x€L
  \?        \         4      PA                  \C        \         P$                  4      4      PE                  \         P2                  VP2                  8H  4      pVPG                  V4      G Rj  x€L
 pVPI                  4       pV#  EL† ELÌ EL¨ L— L!5i)z…
Create a new Goods Receipt Note (GRN) when a delivery arrives.
Cross-module: updates PO line statuses and posts stock to inventory.
ÚGRNNÚ
PENDING_QA)
Ú
grn_numberrn   rb   Úasn_idÚreceived_dateÚvehicle_numberÚ	dc_numberÚ
grn_statusÚremarksrg   ÚRECEIVEDrX   ©rÔ   Úpo_detail_idr[   r]   Úaccepted_qtyÚrejected_qtyÚrejection_reasonÚstore_id)%r   rÞ   r   rn   rb   rß   rà   rá   râ   rã   rä   rw   rx   r­   rÅ   Ústatusry   r   rE   r%   rr   r]   rè   ré   r   rÔ   rç   r[   rê   rë   rs   r   rD   r   ru   r1   r|   )rU   r+   r}   rØ   ÚasnÚgrn_detailsr   Úrec_qtyÚacc_qtyÚrej_qtyrƒ   rH   r:   s   &&&          r-   Ú
create_grnrò   Ô  s  é € ô Ø—?‘?×fÐfÔ,@ÀÄ^×E^ÑE^Ð`eÓ,f×&fØ�j‰jØ—.‘.Ø�{‰{Ø×(Ñ(Ø×*Ñ*Ø—.‘.Ø—?‘?×2Ð2 lØ—‘Ø—<‘<ô€Cð ‡F�Fˆ3„Kà‡{‡{€{Ø—F‘Fœ6 4§;¡;Ó/×/ˆßØ#ˆCŒJà
�(‰(‹*×Ðä�RÔØ€Kà—\”\ˆ	Üœ#˜i×4Ñ4Ó5Ó6ˆØ:C×:PÑ:PÒ:\”'œ#˜i×4Ñ4Ó5Ô6ÐbiˆÜœ#˜i×4Ñ4×;Ð;¸Ó<Ó=ˆäØ—:‘:Ø"×/Ñ/Ø—/‘/Ø Ø Ø Ø&×7Ñ7Ø×'Ñ'ô	
ˆð 	�‰ˆvŒØ×Ñ˜6Ö"ñ! "ð$ �(‰(‹*×Ðô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨¯
©
Ñ2Ó	3ð 	ð
 —:‘:˜dÓ#×#€FØ
×
Ñ
Ó
€CØ€Jòe 'gò 0ò ñ. ñ $ùst   ‚8KºK »AKÂA KÃ#KÃ7KÃ8KÄKÄKÄBKÆ(B	KÈ1K	È2A7KÊ)KÊ*KËKËKË	KËKz/grn/{grn_id}/verifyc                ó0   € V ^8„  d   QhR\         R\        /# rÓ   r‹   )r,   s   "r-   r.   r.     s   € ÷ ñ Üðäñr/   c              ƒ   ó®  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G R j  x€L
 pVP                  4       pV'       g   \        RR4      hRVn
        VP                  4       G R j  x€L
  VP                  V4      G R j  x€L
  V#  Lb L! L
5i)Nr�   rÖ   ÚVERIFIED)r   r   rD   r   rE   ru   rÔ   r1   rv   r   rã   ry   rŸ   )rÔ   r+   r}   rH   r:   rØ   s   &&&   r-   Ú
verify_grnrö     s¨   é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨Ñ.Ó	/ð 	ð
 —:‘:˜dÓ#×#€FØ
×
#Ñ
#Ó
%€CßÜ˜C Ó1Ð1à€C„NØ
�(‰(‹*×ÐØ
�*‰*�S‹/×ÐØ€Jñ $ñ Ùùs<   ‚A*CÁ,CÁ-CÂ	&CÂ/CÂ0CÃCÃ	CÃCÃCz/grn/{grn_id}/approvec                ó0   € V ^8„  d   QhR\         R\        /# rÓ   r‹   )r,   s   "r-   r.   r.   )  s    € ÷ @ñ @Üð@äñ@r/   c              ƒ   óÜ  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G R j  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  R8X  d   \        RR4      hVP                  VP                  8X  d   VP                  R8w  d   \        RR4      h\        V4      pVP                  pVP                   EF  pVP                   '       g   K  VP                   ^ 8”  g   K+  VP#                  VP$                  VP&                  VP                   VP                  R	7      G R j  x€L
  VP)                  \*        VP,                  4      G R j  x€L
 p	V	'       g   K¢  V	P.                  ;'       g    \1        R
4      VP                   ,           V	n        V	P.                  V	P2                  8¼  d
   RV	n        Kû  RV	n        EK  	  RVn
        VP                  Vn        \8        P:                  ! 4       Vn        VP?                  4       G R j  x€L
  V'       Ed;   VP)                  \@        V4      G R j  x€L
 p
V
'       Ed   \        \*        4      P                  \*        P                  V8H  4      pVP                  V4      G R j  x€L
 pVPC                  4       PE                  4       p\D        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      pV'       dr   \        \F        4      P                  \F        PH                  R8H  4      pVP                  V4      G R j  x€L
 pVP                  4       pV'       d   VPJ                  V
n&        VP?                  4       G R j  x€L
  VPO                  V4      G R j  x€L
  V#  ELh EL_ EL: EL„ EL` EL Lr L3 L5i)Nr�   rÖ   r¨   r�   zGRN is already approvedr¬   r©   r·   ©r[   rë   rè   rÔ   rW   Ú	COMPLETEDÚPARTIALLY_RECEIVEDc              3   óz   "  € T F1  qP                   ;'       d    VP                   VP                  8¬  x € K3  	  R # 5i)N)r]   r\   )Ú.0Úlines   & r-   Ú	<genexpr>Úapprove_grn.<locals>.<genexpr>^  s1   é € ÐoÑfnÐ^b× 1Ñ 1× YÐ Y°d×6GÑ6GÈ4Ï>É>Ñ6YÔ YÓfnùs   ‚;™";FT)(r   r   rD   r   rE   ru   rÔ   r1   rv   r   rã   rg   rw   r®   r   rn   rè   Úgrn_postr[   rë   r­   r   rç   r]   r%   r\   ra   r¯   r   r°   r±   ry   r   r6   r7   r   r3   r¸   re   rŸ   )rÔ   r+   r}   rH   r:   rØ   Úinv_servicern   rƒ   Ú	po_detailr†   Úpo_stmtÚpo_resÚpo_linesÚall_completedr¹   rº   Úcompleted_statuss   &&&               r-   Úapprove_grnr	  (  sï  é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨Ñ.Ó	/ð 	ð
 —:‘:˜dÓ#×#€FØ
×
#Ñ
#Ó
%€CßÜ˜C Ó1Ð1à
‡~�~˜Ô#Ü˜CÐ!:Ó;Ð;à
‡~�~˜Ÿ™Ô%¨$¯.©.¸GÔ*CÜ˜CÐ!?Ó@Ð@ä" 2Ó&€KØ�I‰I€Eà—+•+ˆØ××Ò 6×#6Ñ#6¸Ö#:Ø×&Ñ&Ø—l‘lØŸ™Ø#×0Ñ0Ø—z‘zð	 'ó ÷ ð ð !Ÿf™f¤Z°×1DÑ1DÓE×EˆIß‰yØ*3×*@Ñ*@×*RÐ*RÄGÈEÃNÐV\×ViÑViÕ)i�	Ô&Ø×)Ñ)¨Y×-@Ñ-@Ô@Ø,7�IÖ)à,@�I×)ñ ð"  €C„NØ—l‘l€C„OÜ—o’oÓ'€C„OØ
�(‰(‹*×Ð÷ €uØ—6‘6œ/¨5Ó1×1ˆßˆ2ÜœZÓ(×.Ñ.¬z×/?Ñ/?À5Ñ/HÓIˆGØŸ:™: gÓ.×.ˆFØ—~‘~Ó'×+Ñ+Ó-ˆHß›CÑoÑfnÓoŸCŸCšCÑoÑfnÓoÓoˆMçÜ$¤^Ó4×:Ñ:¼>×;NÑ;NÐR]Ñ;]Ó^�Ø#%§:¡:¨kÓ#:×:�
Ø#-×#@Ñ#@Ó#BÐ ß#Ø#3×#6Ñ#6�B”Là
�(‰(‹*×ÐØ
�*‰*�S‹/×ÐØ€Jòm $ò ò Fò ò 2ò /ñ ;ñ
 Ùùsé   ‚A*O,Á,OÁ-O,Â	BO,Ä%O,Ä8A O,Å8OÅ9'O,Æ OÆ!	O,Æ/O,ÇBO,ÉOÉO,É'O,Ê O ÊO,ÊAO,ËO#Ë,O,Ë?O,ÌO,Ì0AO,Í3O&Í4O,Î$O,Î4O(Î5O,ÏO*ÏO,ÏO,ÏO,ÏO,Ï O,Ï#O,Ï&O,Ï(O,Ï*O,c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r*   rÔ   rU   r+   )r"   r   r   )r,   s   "r-   r.   r.   l  s+   € ÷ cñ cÜðcä
ðcô 	ñcr/   c              ƒ  óš	  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  Vn
        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                   ;'       g    RVn        VP"                  Vn        \%        V4      pVP                   Uu/ uF  qˆP&                  VbK  	  p	pVP                   EFî  p
\)        \+        V
P,                  4      4      pV
P.                  e   \)        \+        V
P.                  4      4      MTp\)        \+        V
P0                  ;'       g    R4      4      pV	P3                  V
P&                  4      pV'       Ed.   YÎP.                  ;'       g    \)        R4      ,
          pW¾n        WÎn        WÞn        V
P4                  Vn        V
P6                  Vn        V^ 8w  dË   VP9                  V
P:                  V
P6                  VRRVP                  R	7      G Rj  x€L
  VP3                  \<        V
P&                  4      G Rj  x€L
 pV'       d[   VP,                  ;'       g    \)        R4      V,           Vn        VP,                  VP>                  8¼  d   R
Vn         EK¹  RVn         EKÃ  EKÆ  EKÉ  \C        VP                  V
P&                  V
P:                  VVVV
P4                  V
P6                  R7      pVPE                  V4       V^ 8”  g   EK)  VPG                  V
P:                  V
P6                  VVP                  R7      G Rj  x€L
  VP3                  \<        V
P&                  4      G Rj  x€L
 pV'       g   EK—  VP,                  ;'       g    \)        R4      V,           Vn        VP,                  VP>                  8¼  d   R
Vn         EKç  RVn         EKñ  	   VPI                  4       G Rj  x€L
  TPM                  T4      G Rj  x€L
  T#  ELu upi  ELû ELÖ LÕ L¯ L1  \J         d   p\        RR\+        T4       24      hRp?ii ; i LE5i)zp
Update an existing Goods Receipt Note (GRN).
Adjusts inventory and PO line statuses based on delta quantities.
Nr�   rÖ   rÝ   rX   rW   ÚGRN_ADJUSTMENTrÜ   )r[   rë   r�   Útransaction_typeÚreference_typeÚreference_idrú   rû   ræ   rù   r�   zFailed to update GRN: )'r   r   rD   r   rE   ru   rÔ   r1   rv   r   rÞ   rn   rb   rà   rá   râ   rã   rä   r   rç   r%   rr   r]   rè   ré   r­   rê   rë   Úpost_transactionr[   r   r\   ra   r   rx   r  ry   rž   rŸ   )rÔ   rU   r+   r9   rH   r:   rØ   r  r    Úold_details_mapr   rï   rð   rñ   Ú
old_detailÚdiff_accr  rƒ   r£   s   &&&&               r-   Ú
update_grnr  k  sç  é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨Ñ.Ó	/ð 	ð
 —:‘:˜dÓ#×#€FØ
×
#Ñ
#Ó
%€CßÜ˜C Ó1Ð1à—_‘_€C„NØ—
‘
€C„IØ—N‘N€C„MØ×*Ñ*€CÔØ×,Ñ,€CÔØ—N‘N€C„MØ—_‘_×4Ð4¨€C„NØ—,‘,€C„Kä" 2Ó&€Kà25·+²+Ó>±+¨Q—~‘~ qÒ(±+€OÐ>à—\•\ˆ	Üœ#˜i×4Ñ4Ó5Ó6ˆØ:C×:PÑ:PÒ:\”'œ#˜i×4Ñ4Ó5Ô6ÐbiˆÜœ#˜i×4Ñ4×;Ð;¸Ó<Ó=ˆà$×(Ñ(¨×)?Ñ)?Ó@ˆ
ßˆ:Ø×"9Ñ"9×"KÐ"K¼WÀU»^ÕLˆHà&-Ô#Ø&-Ô#Ø&-Ô#Ø*3×*DÑ*DˆJÔ'Ø"+×"4Ñ"4ˆJÔà˜1Œ}Ø!×2Ñ2Ø#Ÿ/™/Ø&×/Ñ/Ø Ø%5Ø#(°s·z±zð 3ó ÷ ð ð #%§&¡&¬°Y×5KÑ5KÓ"L×L�	ßØ.7×.DÑ.D×.VÐ.VÌÐPUËÐZbÕ-b�IÔ*Ø ×-Ñ-°×1DÑ1DÔDØ0;˜	×-à0D˜	×-ò ò ô" Ø—z‘zØ&×3Ñ3Ø—o‘oØ$Ø$Ø$Ø!*×!;Ñ!;Ø"×+Ñ+ô	ˆFð �F‰F�6ŒNà˜�{Ø!×*Ñ*Ø#Ÿ/™/Ø&×/Ñ/Ø!(ØŸ:™:ð	 +ó ÷ ð ð #%§&¡&¬°Y×5KÑ5KÓ"L×L�	ß’9Ø.7×.DÑ.D×.VÐ.VÌÐPUËÐZaÕ-a�IÔ*Ø ×-Ñ-°×1DÑ1DÔDØ0;˜	×-à0D˜	×-ñu "ðxDØ�h‰h‹j×Ðð �*‰*�S‹/×ÐØ€Jòi $ùò  ?ò$ò Mñ*ñ Mñ 	øÜô DÜ˜CÐ#9¼#¸a»&¸Ð!BÓCÐCûðDúñ ùsé   ‚A*SÁ,R
Á-SÂ	BSÄ2SÅ RÅA:SÇ.SÇ?SÈBSÊRÊ'SÊ?RË SËSËB'SÎ6SÏRÏ'SÏ*RÏ+	SÏ:SÐA	SÑR Ñ*RÑ+R Ñ/SÒS	ÒSÒSÒSÒSÒSÒR ÒSÒ)SÓSÓSc                ó0   € V ^8„  d   QhR\         R\        /# rÓ   r‹   )r,   s   "r-   r.   r.   Ò  s   € ÷ ñ Üðäñr/   c              ƒ  ó   "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  V 8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  V4      G Rj  x€L
  VP                  4       G Rj  x€L
  R#  L[ L  L
5i)zO
Delete a GRN record permanently.
Purpose: Allows admin to remove a GRN entry.
Nr�   rÖ   )r   r   rD   r   rE   ru   rÔ   r1   rv   r   rÀ   ry   r×   s   &&&   r-   Ú
delete_grnr  Ñ  sœ   é € ô 	Œ~Óß	‰”œn×4Ñ4Ó5Ó	6ß	‰Œ~×$Ñ$¨Ñ.Ó	/ð 	ð
 —:‘:˜dÓ#×#€FØ
×
#Ñ
#Ó
%€CßÜ˜C Ó1Ð1Ø
�)‰)�C‹.×ÐØ
�(‰(‹*×Òñ $ñ ÙùrÄ   )Ú	DebitNote)ÚDebitNoteCreateÚDebitNoteResponsez/debit-notesc                ó0   € V ^8„  d   QhR\         R\        /# rT   )r  r   )r,   s   "r-   r.   r.   ì  s   € ÷ ñ Ü
ðäñr/   c           
   ƒ  ó�  "  € \        V P                  V P                  V P                  ;'       g$    \	        V\         P                  R4      G Rj  x€L
 V P
                  V P                  RVP                  R7      pVP                  V4       VP                  4       G Rj  x€L
  VP                  V4      G Rj  x€L
  V#  Lo L! L
5i)zU
Create a new Debit Note to settle discrepancies (e.g. shortages or rejected items).
ÚDNNÚDRAFT)rb   Úrejection_idÚ	dn_numberÚamountÚreasonrì   rg   )r  rb   r  r   r   r!  r"  rw   rx   ry   rŸ   )rU   r+   r}   Údns   &&& r-   Úcreate_debit_noter$  ë  sœ   é € ô 
Ø—.‘.Ø×&Ñ&Ø—.‘.×]Ð]Ô*>¸rÄ9×CVÑCVÐX\Ó*]×$]Ø�{‰{Ø�{‰{ØØ—<‘<ô
€Bð ‡F�Fˆ2„JØ
�(‰(‹*×ÐØ
�*‰*�R‹.×ÐØ€Iñ %^ñ Ùùs7   ‚ACÁC ÁACÂ CÂ!CÂ9CÂ:CÃCÃCz/debit-notes/{dn_id}/approvec                ó0   € V ^8„  d   QhR\         R\        /# )r*   Údn_idr+   r‹   )r,   s   "r-   r.   r.     s   € ÷ ñ Üðäñr/   c              ƒ   ób  "  € \        \        4      P                  \        P                  V 8H  4      pVP	                  V4      G R j  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  R8X  d   \        RR4      hVP                  VP                  8X  d   VP                  R8w  d   \        RR4      hRVn        VP                  Vn        \        P                  ! 4       Vn        VP                  4       G R j  x€L
  VP!                  V4      G R j  x€L
  V#  Lâ L! L
5i)	Nr�   zDebit Note not foundr¨   r�   zDebit Note is already approvedr¬   r©   r·   )r   r  ru   Údebit_note_idr1   rv   r   rì   rg   rw   r®   r¯   r   r°   r±   ry   rŸ   )r&  r+   r}   rH   r:   r#  s   &&&   r-   Úapprove_debit_noter)    sì   é € ô ”)Ó×"Ñ"¤9×#:Ñ#:¸eÑ#CÓD€DØ—:‘:˜dÓ#×#€FØ	×	"Ñ	"Ó	$€BçÜ˜CÐ!7Ó8Ð8à	‡y�y�JÔÜ˜CÐ!AÓBÐBà	‡}�}˜Ÿ™Ô$¨¯©¸7Ô)BÜ˜CÐ!?Ó@Ð@à€B„IØ—\‘\€B„NÜ—_’_Ó&€B„NØ
�(‰(‹*×ÐØ
�*‰*�R‹.×ÐØ€Iñ# $ñ Ùùs=   ‚AD/ÁD)ÁD/Á#B&D/Ä	D+Ä
D/Ä"D-Ä#D/Ä+D/Ä-D/c                ó$   € V ^8„  d   QhR\         /# r)   r   )r,   s   "r-   r.   r.     s   € ÷ "ñ "Üñ"r/   c              ƒ  óì   "  € V P                  \        \        4      P                  \        P                  P                  4       4      4      G Rj  x€L
 pVP                  4       P                  4       #  L"5i)z)
Fetch all Debit Notes for the ERP view.
N)r1   r   r  r2   r•   r–   r6   r7   r8   s   && r-   Úget_all_debit_notesr,    sX   é € ð —:‘:ÜŒyÓß	‰”)×&Ñ&×+Ñ+Ó-Ó	.ó÷ €Fð �>‰>Ó×ÑÓ!Ð!ñ	ùs   ‚AA4ÁA2Á#A4c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r*   r+   ÚplanÚreturn)r   r   r    )r,   s   "r-   r.   r.   -  s(   € ÷ Gñ G¬Lð GÔ@Vð GÔ[nñ Gr/   c              ƒ  óâ	  "  € \        VP                  VP                  ^4      pVP                  ^8X  d    \        VP                  ^,           ^^4      pM(\        VP                  VP                  ^,           ^4      pV P                  \	        \
        P                  \        P                  ! \        P                  ! \
        P                  4      ^ 4      P                  R4      4      P                  \        \
        P                  \        P                  8H  4      P                  \        \        P                   \        P"                  8H  4      P%                  \'        \        P(                  VP(                  8H  \        P*                  V8¬  \        P*                  V8  \        P,                  P/                  RR.4      4      4      P1                  \
        P                  4      4      G Rj  x€L
 pVP3                  4        Uu/ uF,  p\5        VP                  4      \7        VP8                  4      bK.  	  ppV P                  \	        \:        P                  \        P                  ! \        P                  ! \:        P<                  4      ^ 4      P                  R4      4      P                  \>        \:        P@                  \>        P@                  8H  4      P                  \        \>        P                  \        P                  8H  4      P%                  \'        \        P(                  VP(                  8H  \>        PB                  V8¬  \>        PB                  V8  4      4      P1                  \:        P                  4      4      G Rj  x€L
 pVP3                  4        Uu/ uF,  p\5        VP                  4      \7        VPD                  4      bK.  	  ppVPF                   U	u. uF–  p	\I        V	PJ                  V	PL                  V	P                  \7        V	PN                  4      VPQ                  \5        V	P                  4      R4      VPQ                  \5        V	P                  4      R4      V	PR                  R7      NK˜  	  p
p	\U        VPL                  VP(                  VP                  VP                  VPV                  VPX                  VPR                  VPZ                  V
R7	      #  ELòu upi  ELcu upi u up	i 5i)	zJ
Helper: attaches live-computed PO and GRN quantities to every plan line.
Útotal_orderedr  Ú	CANCELLEDNÚtotal_receivedrX   )Úline_idÚplan_idr[   Úplanned_qtyÚordered_qtyr]   r•   )	r5  rb   Ú	plan_yearÚ
plan_monthrf   rg   r•   Ú
updated_atÚlines).r   r8  r9  r1   r   r   r[   r	   ÚcoalesceÚsumr\   ÚlabelÚjoinr   rn   r   re   r¸   ru   r
   rb   rc   r3   Únotin_Úgroup_byr7   rr   Úfloatr1  r   r]   r   rÔ   rà   r3  r;  r!   r4  r5  r6  r­   r•   r    rf   rg   r:  )r+   r.  Ú	first_dayÚlast_dayÚordered_resultÚrowÚordered_mapÚreceived_resultÚreceived_maprþ   Úenriched_liness   &&         r-   Ú_enrich_plan_with_ordered_qtyrK  -  sˆ  é € ô
 �T—^‘^ T§_¡_°aÓ8€IØ‡�˜"ÔÜ˜Ÿ™¨Õ*¨A¨qÓ1‰ä˜Ÿ™¨¯©¸!Õ(;¸QÓ?ˆàŸ:™:ÜÜ×ÑÜ�MŠMœ$Ÿ(š(¤:×#7Ñ#7Ó8¸!Ó<×BÑBÀ?ÓSó	
÷ 
‰Œoœz×/Ñ/´?×3HÑ3HÑHÓ	Iß	‰Œnœo×7Ñ7¼>×;LÑ;LÑLÓ	Mß	‰ÜÜ×)Ñ)¨T¯^©^Ñ;Ü×*Ñ*¨iÑ7Ü×*Ñ*¨XÑ5Ü×#Ñ#×*Ñ*¨G°[Ð+AÓBó	ó

÷ 
‰”*×"Ñ"Ó	#ó÷ €Nð" HV×GYÑGYÔG[Ó\ÑG[À”3�s—y‘y“>¤5¨×):Ñ):Ó#;Ò;ÑG[€KÐ\àŸJ™JÜÜ�O‰OÜ�MŠMœ$Ÿ(š(¤9×#9Ñ#9Ó:¸AÓ>×DÑDÐEUÓVó	
÷ 
‰Œnœi×.Ñ.´.×2GÑ2GÑGÓ	Hß	‰Œoœ~×3Ñ3´×7LÑ7LÑLÓ	Mß	‰ÜÜ×)Ñ)¨T¯^©^Ñ;Ü×,Ñ,°	Ñ9Ü×,Ñ,¨xÑ7óó

÷ 
‰”)—/‘/Ó	"ó÷ €Oð  JY×I\ÑI\ÔI^Ó_ÑI^À#”C˜Ÿ	™	“N¤E¨#×*<Ñ*<Ó$=Ò=ÑI^€LÐ_ð —J’Jóñ ˆDô 	 Ø—L‘LØ—L‘LØ—*‘*Ü˜d×.Ñ.Ó/Ø#Ÿ™¬¨D¯J©J«¸Ó=Ø%×)Ñ)¬#¨d¯j©j«/¸3Ó?Ø—‘÷	
ñ ð ð ô Ø—‘Ø—.‘.Ø—.‘.Ø—?‘?Ø�j‰jØ—?‘?Ø—?‘?Ø—?‘?Øô
ð 
òeùò" ]òùò  `ùòùsQ   ‚G&S/Ç(SÇ)S/Ç?2SÈ1ES/Í?S"Î S/Î2S%ÏS/ÏBS*Ñ4A'S/ÓS/Ó%
S/z/monthly-plansNc                óŠ   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\         \        ,          R\        /# )r*   rb   ÚyearÚmonthr+   )r$   r"   rB   r   )r,   s   "r-   r.   r.   x  sB   € ÷ Gñ GÜœ�~ðGä
”3�-ðGô ”C�=ðGô 	ñ	Gr/   c              ƒ  óÆ  "  € \        \        4      P                  \        \        P                  4      4      P                  \        P                  P                  4       \        P                  P                  4       4      pV '       d#   VP                  \        P                  V 8H  4      pV'       d#   VP                  \        P                  V8H  4      pV'       d#   VP                  \        P                  V8H  4      pVP                  V4      G Rj  x€L
 pVP                  4       P                  4       pV Uu. uF  p\        W84      G Rj  x€L
 NK  	  up#  LE Lu upi 5i)z’
List all Monthly Procurement Plans.
Supports optional filtering by vendor_id, year, and month.
Each line includes computed ordered_qty from POs.
N)r   r   rD   r   r;  r2   r8  r–   r9  ru   rb   r1   r6   r7   rK  )	rb   rM  rN  r+   r9   rH   r:   ÚplansÚps	   &&&&&    r-   Úlist_monthly_plansrR  w  s  é € ô 	Ô%Ó&ß	‰”Ô4×:Ñ:Ó;Ó	<ß	‰Ô(×2Ñ2×7Ñ7Ó9Ô;Q×;\Ñ;\×;aÑ;aÓ;cÓ	dð 	÷
 Ø�z‰zÔ0×:Ñ:¸iÑGÓHˆßØ�z‰zÔ0×:Ñ:¸dÑBÓCˆßØ�z‰zÔ0×;Ñ;¸uÑDÓEˆà—:‘:˜dÓ#×#€FØ�N‰NÓ× Ñ Ó"€EÙ@EÓFÁ¸1Ô/°Ó6×6Ò6ÁÑFÐFñ $á6ùÒFùsB   ‚B/E!Â2)E!Ã6E!ÄEÄ&E!Ä9EÅE
ÅEÅE!ÅEÅE!c                ó0   € V ^8„  d   QhR\         R\        /# rT   )r   r   )r,   s   "r-   r.   r.   –  s   € ÷ /9ñ /9Ü
ð/9äñ/9r/   c              ƒ  ó¸  "  € VP                  \        \        4      P                  \	        \        P
                  V P
                  8H  \        P                  V P                  8H  \        P                  V P                  8H  4      4      4      G Rj  x€L
 pVP                  4       '       d   \        RR4      h\        V P
                  V P                  V P                  V P                  \        VRR4      R7      pVP                  V4       VP                  4       G Rj  x€L
  V P                   FP  pVP                  \        VP                   VP"                  \%        \'        VP(                  4      4      R7      4       KR  	  VP+                  4       G Rj  x€L
  VP-                  V4      G Rj  x€L
  VP                  \        \        4      P/                  \1        \        P                  4      4      P                  \        P                   VP                   8H  4      4      G Rj  x€L
 pVP3                  4       p\5        W4      G Rj  x€L
 #  EL½ EL2 L¼ L¥ L1 L5i)z}
Create a new Monthly Procurement Plan for a vendor + month.
Raises 409 if a plan already exists for that vendor/year/month.
Ni™  zHA plan already exists for this vendor and month. Edit the existing plan.rw   )rb   r8  r9  rf   rg   ©r5  r[   r6  )r1   r   r   ru   r
   rb   r8  r9  rv   r   rf   Úgetattrrx   ry   r;  r   r5  r[   r%   rr   r6  ÚcommitrŸ   rD   r   r|   rK  )rU   r+   r}   r…   r.  Úline_inr:   s   &&&    r-   Úcreate_monthly_planrY  •  sÆ  é € ð —Z‘ZÜÔ%Ó&×,Ñ,ÜÜ&×0Ñ0°D·N±NÑBÜ&×0Ñ0°D·N±NÑBÜ&×1Ñ1°T·_±_ÑDóó	
ó÷ €Hð ×"Ñ"×$Ò$Ü˜CÐ!kÓlÐlä!Ø—.‘.Ø—.‘.Ø—?‘?Ø�j‰jÜ˜4 ¨DÓ1ô€Dð ‡F�Fˆ4„LØ
�(‰(‹*×Ðà—:”:ˆØ
�‰Ô)Ø—L‘LØ—-‘-Ü¤ G×$7Ñ$7Ó 8Ó9ô
ö 	ñ ð �)‰)‹+×ÐØ
�*‰*�TÓ
×Ðà—:‘:ÜÔ%Ó&ß	‰”Ô4×:Ñ:Ó;Ó	<ß	‰Ô%×-Ñ-°·±Ñ=Ó	>ó÷ €Fð
 ×ÑÓ€DÜ.¨rÓ8×8Ð8òMò( ñ Ùññ 9ùsu   ‚BIÂIÂIÂ*A3IÄIÄA7IÆIÆIÆ.IÆ/A5IÈ$IÈ%"IÉIÉIÉIÉIÉIÉIÉIz/monthly-plans/{plan_id}c                ó0   € V ^8„  d   QhR\         R\        /# ©r*   r5  r+   r‹   )r,   s   "r-   r.   r.   É  s   € ÷ 9ñ 9Üð9äñ9r/   c              ƒ  óX  "  € VP                  \        \        4      P                  \	        \        P
                  4      4      P                  \        P                  V 8H  4      4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      h\        W4      G Rj  x€L
 #  L; L5i)z8Fetch a single Monthly Plan by ID with live ordered_qty.Nr�   úMonthly plan not found)r1   r   r   rD   r   r;  ru   r5  rv   r   rK  ©r5  r+   r9   r:   r.  s   &&&  r-   Úget_monthly_planr_  È  sˆ   é € ð —:‘:ÜÔ%Ó&ß	‰”Ô4×:Ñ:Ó;Ó	<ß	‰Ô%×-Ñ-°Ñ8Ó	9ó÷ €Fð
 ×$Ñ$Ó&€DßÜ˜CÐ!9Ó:Ð:Ü.¨rÓ8×8Ð8ññ 9ùs*   ‚A(B*Á*B&Á+B*ÂB*Â!B(Â"B*Â(B*c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r*   r5  rU   r+   )r"   r   r   )r,   s   "r-   r.   r.   Û  s&   € ÷ )9ñ )9Üð)9ä
ð)9ô 	ñ)9r/   c              ƒ  ó.  "  € VP                  \        \        4      P                  \	        \        P
                  4      4      P                  \        P                  V 8H  4      4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  e   VP                  Vn
        \        VP
                  4       F  pVP                  V4      G Rj  x€L
  K  	  VP                  4       G Rj  x€L
  VP
                   FP  pVP                  \        VP                  VP                   \#        \%        VP&                  4      4      R7      4       KR  	  VP)                  4       G Rj  x€L
  VP                  \        \        4      P                  \	        \        P
                  4      4      P                  \        P                  V 8H  4      4      G Rj  x€L
 pVP+                  4       p\-        W%4      G Rj  x€L
 #  ELœ EL+ EL Lœ L2 L5i)u¤   
Update a Monthly Plan â€” replaces all lines and updates notes.
Plans remain fully editable even after POs have been raised (ordered_qty is always live-computed).
Nr�   r]  rU  )r1   r   r   rD   r   r;  ru   r5  rv   r   rf   r5   rÀ   ry   rx   r   r[   r%   rr   r6  rW  r|   rK  )r5  rU   r+   r9   r:   r.  rþ   rX  s   &&&&    r-   Úupdate_monthly_planrb  Ú  s�  é € ð —:‘:ÜÔ%Ó&ß	‰”Ô4×:Ñ:Ó;Ó	<ß	‰Ô%×-Ñ-°Ñ8Ó	9ó÷ €Fð
 ×$Ñ$Ó&€DßÜ˜CÐ!9Ó:Ð:à‡z�zÒØ—Z‘ZˆŒ
ô �T—Z‘ZÖ ˆØ�i‰i˜‹o×Òñ !à
�(‰(‹*×Ðà—:”:ˆØ
�‰Ô)Ø—L‘LØ—-‘-Ü¤ G×$7Ñ$7Ó 8Ó9ô
ö 	ñ ð �)‰)‹+×ÐØ—:‘:ÜÔ%Ó&ß	‰”Ô4×:Ñ:Ó;Ó	<ß	‰Ô%×-Ñ-°Ñ8Ó	9ó÷ €Fð
 ×ÑÓ€DÜ.¨rÓ8×8Ð8ò?ò 	Úñ ññ 9ùsu   ‚A(HÁ*HÁ+HÂAHÃH	ÃHÃ:HÃ;A7HÅ2HÅ3A+HÇHÇ"HÈHÈHÈ	HÈHÈHÈHÈHc                ó0   € V ^8„  d   QhR\         R\        /# r[  r‹   )r,   s   "r-   r.   r.     s   € ÷ ñ Üðäñr/   c              ƒ  óP  "  € VP                  \        \        4      P                  \        P                  V 8H  4      4      G Rj  x€L
 pVP                  4       pV'       g   \        RR4      hVP                  V4      G Rj  x€L
  VP                  4       G Rj  x€L
  R#  L[ L  L
5i)z(Delete a Monthly Plan and all its lines.Nr�   r]  )	r1   r   r   ru   r5  rv   r   rÀ   rW  r^  s   &&&  r-   Údelete_monthly_planre    sˆ   é € ð —:‘:ÜÔ%Ó&×,Ñ,Ô-C×-KÑ-KÈwÑ-VÓWó÷ €Fð ×$Ñ$Ó&€DßÜ˜CÐ!9Ó:Ð:Ø
�)‰)�D‹/×ÐØ
�)‰)‹+×Òññ Ùùs<   ‚AB&ÁB ÁB&Á! B&ÂB"ÂB&ÂB$ÂB&Â"B&Â$B&)UÚfastapir   r   r   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   r	   r
   Úsqlalchemy.ormr   Úapp.core.databaser   Úapp.core.securityr   Úapp.core.numberingr   r   r   rz   r   r   r   r   r   r   r   Úapp.modules.inventory.servicer   Úschemasr   r   r   r   r   r   r   r    r!   Úuuidr"   Útypingr#   r$   Údecimalr%   Úrouterr­   r;   rI   rP   Úpostrˆ   r�   r˜   Úputr¤   r³   r¿   rÀ   rÃ   Úapp.models.vendor_portalrÅ   rÊ   rÎ   rÑ   rÙ   rò   rö   r	  r  r  r  r  r  r$  r)  r,  rK  rR  rY  r_  rb  re  © r/   r-   Ú<module>rw     sî  ðç 5Ñ 5Ý /ß )Ñ )Ý 'Ý $Ý 0Ý 3ß #÷÷ ñ õ ;÷÷ õ õ
 ß !Ý á	‹€à‡�ˆNÓÙ.5°f«oÁÑI[Ð\iÐkqÓIrÓAsö (ó ð(ð ‡�Ð¨tÐ4KÕ/L€ÓMà Ù˜v“ÙÑ  °Ó7Ó8ö(ó Nð(ð& ‡�Ð*Ó+á˜v“ÙÑ  °Ó7Ó8ö"ó ,ð"ð ‡�ÐÐ0GÐUX€ÓYñ ˜v“Ù	Ñ# M°8Ó<Ó	=öFó ZðFðT ‡�Ð&Ð7N€ÓOñ ˜v“ÙÑ  °Ó7Ó8öó Pðð& ‡�Ð.Ó/ñ ˜v“ÙÑ  °Ó7Ó8öó 0ðð* ‡�Ð&Ð7N€ÓOñ ˜v“Ù	Ñ# M°6Ó:Ó	;ö	Mó PðMð^ ‡�Ð-Ð>U€ÓVñ ˜v“Ù	Ñ# M°6Ó:Ó	;ö	-ó Wð-ð^ ‡�Ð/Ð@W€ÓXñ ˜v“Ù	Ñ# M°9Ó=Ó	>ö5ó Yð5ðn ‡�Ð)°s€Ó;ñ ˜v“ÙÑ  °Ó9Ó:öó <ðõ* ,à‡�Ð+Ó,ñ ˜v“ÙÑ  °Ó7Ó8ö(ó -ð(ð" ‡�Ð+¸DÐAWÕ<X€ÓYñ ˜v“ÙÑ  °Ó7Ó8ö(ó Zð(ð$ ‡�ˆF 4Ð(>Õ#?€Ó@à Ù˜v“ÙÑ  °Ó7Ó8ö(ó Að(ð" ‡�ˆOÐ,B€ÓCñ ˜v“ÙÑ  °Ó7Ó8öó Dðð& ‡�ˆVÐ$:È€ÓLñ ˜v“Ù	Ñ# M°8Ó<Ó	=ö<ó Mð<ð| ‡�Ð#Ð4J€ÓKñ ˜v“Ù	Ñ# M°6Ó:Ó	;öó Lðð( ‡�Ð$Ð5K€ÓLñ ˜v“Ù	Ñ# M°9Ó=Ó	>ö@ó Mð@ðD ‡�ˆOÐ,B€ÓCñ ˜v“ÙÑ  °Ó7Ó8ö	có DðcðJ ‡�ˆ¨C€Ó0ñ ˜v“ÙÑ  °Ó9Ó:öó 1ðõ* /ß 7ð ‡�ˆ^Ð,=È3€ÓOñ ˜v“Ù	Ñ# M°8Ó<Ó	=öó Pðð, ‡�Ð+Ð<M€ÓNñ ˜v“Ù	Ñ# M°9Ó=Ó	>öó Oðð2 ‡�ˆN¨4Ð0AÕ+B€ÓCá˜v“ÙÑ  °Ó7Ó8ö"ó Dð"õ GðT ‡�Ð¨TÐ2EÕ-F€ÓGà $ØØÙ˜v“ÙÑ  °Ó7Ó8öGó HðGð: ‡�ÐÐ.AÈs€ÓSñ ˜v“Ù	Ñ# M°8Ó<Ó	=ö/9ó Tð/9ðd ‡�Ð&Ð7J€ÓKñ ˜v“ÙÑ  °Ó7Ó8ö9ó Lð9ð" ‡�Ð&Ð7J€ÓKñ ˜v“ÙÑ  °Ó7Ó8ö	)9ó Lð)9ðX ‡�Ð)°s€Ó;ñ ˜v“ÙÑ  °Ó9Ó:öó <òr/   