From f7db2aebc9e33092ba034f50b3de01e40f6cdca2 Mon Sep 17 00:00:00 2001 From: Deena Date: Wed, 6 Aug 2025 10:49:58 +0530 Subject: [PATCH 1/3] Reference for #6 --- .../sos_inside_sales_leads.cpython-310.pyc | Bin 6985 -> 6985 bytes .../views/sos_inside_sales_leads_view.xml | 2 +- .../models/__pycache__/sos_ir.cpython-310.pyc | Bin 13263 -> 13254 bytes sos_inventory/security/ir.model.access.csv | 1 + sos_marketing/models/sos_marketing_leads.py | 17 ++++ .../views/sos_marketing_leads_view.xml | 20 ++++ .../sos_proposal_boq.cpython-310.pyc | Bin 52165 -> 51648 bytes ...posal_customer_requirement.cpython-310.pyc | Bin 7506 -> 7583 bytes sos_sales/models/sos_proposal_boq.py | 68 ++++++++----- .../sos_proposal_customer_requirement.py | 2 + sos_sales/views/sos_proposal_boq_view.xml | 89 +++++++++--------- ...sos_proposal_customer_requirement_view.xml | 1 + sos_sales/views/sos_sales_leads_view.xml | 2 +- 13 files changed, 131 insertions(+), 71 deletions(-) diff --git a/sos_inside_sales/models/__pycache__/sos_inside_sales_leads.cpython-310.pyc b/sos_inside_sales/models/__pycache__/sos_inside_sales_leads.cpython-310.pyc index b37697ba8d87736ac4e6ef315ccfc81f65fa78eb..900f94156bf951eb8fbe1a6d895d06eadb0e1b05 100644 GIT binary patch delta 20 acmX?UcG8SHpO=@50SFeapSY3RP8t9`Y6X=5 delta 20 acmX?UcG8SHpO=@50SNfn`!;ghNdo{iUj$YF diff --git a/sos_inside_sales/views/sos_inside_sales_leads_view.xml b/sos_inside_sales/views/sos_inside_sales_leads_view.xml index 0e8622e..19d706a 100755 --- a/sos_inside_sales/views/sos_inside_sales_leads_view.xml +++ b/sos_inside_sales/views/sos_inside_sales_leads_view.xml @@ -11,7 +11,7 @@ - + diff --git a/sos_inventory/models/__pycache__/sos_ir.cpython-310.pyc b/sos_inventory/models/__pycache__/sos_ir.cpython-310.pyc index 1310398db536acf9f77ff15f8cb41ef9d9948a83..b1577ced1ff0889b998025119dafae45556ccc4f 100644 GIT binary patch delta 43 xcmX?~ek`3gpO=@50SFE>PRO{nk#_?-KfiBcNorAMVotGwPi9`~=Bw<#v;je&52OG9 delta 52 zcmX?>emtree,form,kanban + + sos_marketing_leads.search + sos_marketing_leads + + + + + + + + + + + + + + + sos_marketing_leads.view.tree @@ -16,6 +34,7 @@ + @@ -55,6 +74,7 @@ + diff --git a/sos_sales/models/__pycache__/sos_proposal_boq.cpython-310.pyc b/sos_sales/models/__pycache__/sos_proposal_boq.cpython-310.pyc index 9153736f4aec15d09f8fdd2c702cbe63fd68879b..9b8f470df6faf3f43c12290fbab649f31fbaa0ab 100644 GIT binary patch literal 51648 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 SZ(h}0k0<|sWi$V`ul#?IMnS6p literal 52165 zcmd^o349yJbvJH;Ab3+GB~cP|i;_k0K5SXmW!bVV`k*Y^j2#%_fD|Yapa!69!BlKV zPV6Lh;y7m$Cy|^}x!W|&)w^lh=IW6&U%P4AB+Zw`ZPFY{8b`jq|9iVTSO5!PrI`Nu z`Q$8Q-|?DwpsI-vch;i@T@&r@Z3AroX*9xw5vEBr18FvpS|BZA36LcQQU|0} zv;k=|ka{5PVkwZN2GRgznOF{Fxq&nS=@2V`tT2!!AS=ZxAgc_d8AwE|2C~{fT7aw( zYk{makR?FYiSZ zVjGZc2C`gu#$27+COyeb}?t`-4mT%$Q_9`TKbfTAfy?IZ5-Fx%_cUJH92 z8j$dMwl}c7f$fc;(e#LCypdha?9;^d7PdFT-ZF(oe8P>!t3}8q?Ayk^t!!^+dmHR% zOlm&R>_Co|GO_~5N&{KO$SNQa16j_ zZ)5jfxUNJQyW#2)`#5ed`&=ciR&o0bWWPfCfwYKg#I;i%ah*6Is2&D@4T@2wF$8;^ zxSs99Y`=l+BNPwqd?VWVCNakGE(O*u4x%lB;%3mf4DNN}khn$M%IV$qh<|*$fsKoo zDeQ6syItI&upI{WauHS76$W-E${G`gQ5QRbvo2_cYD94YKl*rdXCD{M+(dlYs= zVS5#pP}r3Un^xF9g&kGcRSKI?*wqS~RoH%oB^7p!!cq#mR$+4ryG~)p6m~#iQemSC zODpVp#^~+JDC`D>%`5Cig&kMeO$xh9VPgurTVV$kc0yq{D=e$9Lkhb`VYeu3L1DKl z?4-hOQ`jpMHmM>f0f;5*!?xQzs~L_*!{O~{~f#E%kIC2`ybf-K6ZZt?r*aD{p|inxWC2j z53u|H!2M6`{vf;m8E%c;A7b~n;r2KRT_{SkJ55AN@?`=jxX zO@I7B*Q8tgyZFHa!Bg(>Pq6F%iXT1@9RH;F5AmZ1T;snho)rIy-`|UW?DVI^f1PoQ zAB&$n;6mu%SIB>hpEB}kh5StXoRL3J$S=e>Mn0n>;+NuA;(x@i&-let;y3K`S@t=P z6rL8(F!DJ@o)yoD=O4v*9FH512aoqm6-*x~A;8}@U{&W1U!V`i0FN~B{!@UO2T0HCUtjDtf z&qh3(@O0wYd?o~Q3!Y1u<`<2)TRE*R;FusGSAS{X-Hi7D?`8Z;2HwYbKkxy@|H{Az z86N^Z%=lj$_z2^d0>6y$zkzK#p39N{FXMLyo-1Jg%7ZSSYy7KYu1z~Jv(_TJW0_1` zo`~*GrZcgbnOG)~N=9#rADd6e_-s6x(HhdJbaYOp=2Gd{O!RQ-ShmB66S2mL?2Tt) z2~6&4RM>>b)>|BrSb74Jz^3_R;@EsVM-suBb!?L*bZ2(?4Mw7o{d*&`^XW|Fa6F<1 zT&=Cn%hd#YQ?qdymAQ;(Yb@~(PN1;rkL-Rtd+?+qFa&sc!8Hw4!cy01_mu05`?N>+ z&bX(&lin#erm+4|&4YXflBrB2k(2?%kyS7{eVR9(Jgx=O@tB-Af*EdXZZ0k~Z$hNc zx;0-qJ~MgNB^wd+{FU2MbD3=^kxKOpnLm2QqcI^;$@DfV6Dm2L-lk8K8BleCs_&XR zp#`_k#AXkR*bdB&U1<-Dh%4J!sTsS>STqe!XJjHdr3H=J5?Vl{W@CwDwswzEk&)5Z zZ2YWSwt&1Aye>7te35M)ou54%myy(@!8eI`I@_27$Cz+BTbqM!zG3XFN2lXQBguHS z0Z`;75KK-*HeGvYS7&yK$xwS@bFqm;=0s%EuB$scL!F-U)w{1gFc#_Q>OCZvBQHRz z7=gP(cL((l09IIm{^3J%r49sk9~j$u^&z=Rch->exj$)2hk|3k zA_D`v0?Gg?5#C!-0WRUa^rbf-~uzKIl?zNIK?dU7h;JQkl# zY~7bgCelaZB63wK1=UJ(QBZ`eD+m|vg@gwX%mSaJ`qiV!Mf6ksbnlO zFXPd~Y-}pt>CviW95M)R5STNDmty8bHk_k$ee!&ml9`y7GM=2k%dp3=6}{i2K&1Ek z9I*+%+wP^VX}srC=(B|H5zn+|u2%TRTxSELvIk-CV)!Ui=iQfU-uyOHh(a9+Q=}flvAUPxZu8Qn|Q>!rx2yTFgsWKwzuTh=yWHp-XMp9Z^0bwwPPPtB} zJZ6&aCr}i7tqLOHjdkFq-|wGJp;`J zkvVus4^GsxHM=GzQuE17ns{wpY+@n`F)UNZRK)%V>gU!!}W7uQ|dC&cpSA}MV*bwsYJ5VYl+BlItt@N<{(iG3240U zI`tYeSDV&%W z3lc=OY}209>@0d&UE)U$o&bsKsH{uI=He5H$;3p&GCD|S+jZF%Pol7Ky!;WfQ^|&O z9}zo|?(`uw??g<_2SMs*?|H}DB70(zu*36d6MHzadmaK$^JgUbqIr795b~9ggX9Dr zn4C#W9m&ksvBx{l{`9kNi0or1+jszqWfHgun@rE8WJcbEP`bd3-wlFXM^O@A=}x!o zgy%l3T7}k@smeoGokBEz_gp-gj(7U`4YM?(YJbhQ55iVkq9RYiX~xS|-;_$tqOvfC z%7wrn>x2r?KpiVFPV#vCL@YTGx5$SX@=_sd_eVBF_ArZ4&z%z^iC9uhn8CoMBnSoHlS>S$~L5I!^$?2 ztu`~!owN4jti3sFU(VW}vkqjdNrrJba#ln$QA9JXh-O+X(FSwqP|iA>vyNm#X0)De zi@nEU@3q+bEcSkjeIQ$>1gM_he0Ohwe_w&SzrbBcZ?M3BsK7m3;2z1==jW%p5a=lc zdJBQRLZH787|6EfiT!I68KbrA@!k^Q`%2*bCGb+|4weW%R01C^fsbU{?90_%%A=>0 zM{g;QzEU3jr91|*%?I*2N}bVcz+StMeRg2K9cY`-pk2rzJ8;+z9LcuWWWL)L?Xg9B zZP7kkwBHsT(B~mNk=!ssYf|D7B2gcq>7jZpp>(9L2PGKRxhn;R(O1h2v5BKJo7)iCmy#GV z2{_Cig}Wi@F|*CPgh&`;C39q>brer8(sMCP2+#sO*_tu38=Y6VpuN_hy=AHPS%dbK z4cc!F+Fv&4fHmkq*`R~gpo3+D4q1Z^l?^&<4LV#l=!iAwh_<3!6Le$xm1~3U@_~Eu z0{4^;+?yA;w|wBfyuf|s1NY|z?k^vBATRL1ga@o@{&`_BpL9PQ8P_T3hZfvt+$XUk zVZnXeB^wqzr#)v}Zr1{~IzWp=SUWJUiJkS1YD;XVzgmmkOa=2je|jFHZY?lDlZ&{v zCJMF6)D)|?%;_VPbQw%A;+ZI`inI-t!$gr9rXvj~hvqvTgR0Jpxin_D)zRq0Oe~#_ zMlCbhc?A11o-_@&!=9i!==OPo&%tzOH&)a(={diM%5>ROrYl#O@)&Z1VQvOLn9fLO zDdch3)UwF(Oj$p6%ca!p3m;7Soq2uR3F=kQh2$xWY37<& zB$5r(;Ct|#qdslHg$4~$!$NoLZgDNRqwZrKYSd28XyTX9AYnrPY6R43^X7BV3sHN? zQ)CpBX&l%O@SGzhbI?;qjWblaWTs%qOQ&S+<%1wjdHfcF=jQtduKf>Q+>=%9M3ZZJViEk(VD|Os1@qOJ*uf^I~pi|4FQRp@m(!7Jdl& zzD~E+Sfn(t&FCRe`Wc?I-m;K9&u1@lUWdhrJVK>@n2gtv@eqvC<=6yYE=Rr2ui#mC z8#s2_!={(as8283S@$SjR2%YIt*&q|-cZ|Oz6=Td5|2^LjtgYqJdH-Sy+C^dg(%d& zkPk%#RSMsAWGOKfFJ2l;<7oT1E2GG)K zO(iPJbuE-(%{SE^Etip!RKA14wPNjurV&x7w4#%0BB3>7bayQ?UFN83&1R`dojU=2B9=<>Du7r^RX{f!Tmj8`1(YFOW9hh7Wn`<6o32J2FQ}zS zl^gVgFwkgl`<~7AIaP#{+xE~(XDCs%9qydyO=Q zE(PXfVj_NiiPeKtFNvgx-<@42Rz`Wpl-|1aLs5w-S}!E(cWlDpBckLZ!bFm3}8w1}ae*a6)CU5|u$G zRE8>18FE5pxDu6NCsal%Q5h+slH=bTQ+4N&S!ctS-Hzz=RHW16h)zBO+vTU2gYC+d z&%$!jyc zd&awf-G&rX)V|BR;5mh%$+2otmzCc^5 zphEGk<+`Ih5v(<-D2i?Ks>U3=^ikDpfWgy|I(_i+kn5;N@}Q1QPvP{$t5qxUt%MIE3nIGDYhq-|6fOG2fIv7D4|N6K1NT6bYGnj3WbnWTpCHx7~UJ|fzqgN1#)0Dp*x zl1uS&*xIQSYhVesL6hS4csy?XADX}Opk_yD#Y(jbn8q(E@o%|O7ojQAAdGZ4Q*{00(G zNWeg<6jEg%L4^bjq*@`>1`<+8$UtfoQez-tg@g?R6AUBIwFXkBkU9gYR|pNjsiX}G zX#mm)q){PF2GXREW&>$fNQ;5AC}fF&EKx|SfwU^5%|O}|(rzH_3R!9(OBJ%rK$aqsHjqw*Y%!3{3c18UwkTw)fn1`HE(6)BkZlIi zrI2nQJ*bUs3h6bFZiVz2NRLAL4Ww5g0|wHkkU<0KSICfo3@BvSKn4{uVjx2bxzs?0 z6>^z@j3{Kgfn2JP%MIi*h3qhp?FzZVKrUCvP9VEb8#@%T+d!^R$Q}dPsgS(}vP&UX z8pv*i>@$!(3c1Qa_A2CR1G!Qm`we8DLas58s}yprfn2SS>kMSSLJkedahR1%;;LV&N zSN2-x{e$Y;_3c%b{?FLFo!32B^C`bX+3}1%Ng0=aO~&7lQLsutdAkPjGh*_u zDrW08hm^irk17Tn{ar;$w>zZt4;3lh;gHfdD^hy7LrUMONGa-&(mz$C zbf-f~T184Rhm`)MBBjF)DgA3jO4J)V=oaO7D^d~;DSf{pC0udiC{I7ANNLg`r5{$L zH06*|WvP;INU5?^nRZC2vQ#nrOI6nDOHv#S%;J= zOO<;ZQmQOf793KlELBcAq*Pg|yuu-+%2MTChml{+5EL9$M zNU5?^dBh>5%2MU^4k=ZZDsON|sj^gg)FGwHQss>fDOHv#k2$1NS*pCrA*ISv<;@N$ zRhBAmaY(7MRC%jIN|mL`+ZehT9@EjXE&!HEK#k#0~LTpXmwN@Y(G z(p!Y|6(Rja$UqS?ScD7}A;U$;h-DSp$YFOe)Kd)g7DIi-P=7HrAb+2#D7W}cR}65? z6hYQBj8N7z49J>>0Sy$BA1sE3ilO0RXvDh0uByng>TX~?HsN}0us$2C-v%3ypQd`U zEc+XmdFYj8kN1`c-&X?fFM$t~zz0jNnZX*~t4w{scK-f}Vf%6aye^BgGWIatnfsGR3;InNO- zx1lv}XOZzfmhn*j88sFI-IF_u~kZ2 z9i>Ai5?u^k&8A;)5}lN(S#`e}Hh?!EIG>7?kCQD+2CpYKk&TGGld7NAD8tyMPiH*y zmXxdD5x}ztPx@*ErFHbQpU%0#=1$kqF-JC$mVvsaeG9HAo@v*#A2vL&1z^JiTNP}0 zU<<;A2exY1@W2*=EtIJd?o9Y}EhE_2v>Y3xu*=VFxV=YR@;aQzaz(MV2xfgUC@4+1 zgb(}Sfe1hL4bmY@q}SrY*$1*UV4t8*1h9cFf%Cdv;QnMQkSZWj1P!DXNHvgqM94sV zqDHrg@PcOnher@Iun-WnI6vTuHj26_%7xqb^%}n(mS8EHb*qyE%9{bNm}pMd{^Q=u_xOo*uTS=>f^t2S4@2`+w$?N zzW0kO(AM7|Uo??!bS}|PmD1>z$0hn8u2x-`M>k$+K{{1LTkH9(gI1e6S3!I9g2wj2 zwAO?}hPk_eq8Z!`q%BDs*8*AZ-owGu+1TBh4?_eLU?QHF(Q4HVLD6I?tsjc47PxhY z_w?(BYp54z`7Q@gg3c;tTrD(JS#F%BT(4nypnCEoYpHbalVF4{-vEpk8Vk=FzDTJX^Y*zg`L$KKrKu9G#QZlT79!X0(XW1=4K`SGO3 z?Miw@!^vDrkP6uvVKxy}q**oHiu6`I9@JAiM%&NYQ0up!tfCNH zh2$E+_D7rPTFWPp;xP$UE@Cyf~}!;tZC^zxRUke-8O?NB)l+ z`Hyhgg413qRv+~uC*o1}u`#oBaLZ!cEt;@^XugjFmBbVjHTyKd9 zzp|zBUuZj`R9{;N@Ec7Z4597A9kjFqtmXGWUw(%S%B&oMsRa(~9qS(IevJ7D4)R*9qjMc!c=$Wyj!a^ zZKy#JKiFBNh3OW6R1!x-=^9b*d}>y!OXEl_t_i_T`slID2`z-X{W9p@aPCg45jZd@ z6LZ}4(>6%?c^K!zd{Jqo3YIq^hYqUs845<#D*qlvXHfFaA>Q=EyKHEKj8;w8jq-p( z-cI2uAG|R$uh)Z*YG0?x*LjTOe``w3CZ+TB`;*WTCgT~Sjx_Iyf|I8glhaO<{%@Vr zt{05bt{05bK3hrv`TP&Pe|*Sg3L}|2a6^HB%z$*E2P2hf4|+rQ;~2lZ5hs@Eb`5@g za29!h809e-TJYFBZt%qA!OS-p2`ev270TyabOE4Vdo8qmCV{I2@Y3wK8CglwL@D6% z_Q;`6v$C8bLxtTer)%5FwV5 zGjSy)8$n~@2wg^C)~lrLQd;!{U$}&hN77bGtzM;Ny-e0DUH$CpqZ#?&fswsRc4xCdQ zdWdhCcb^J{h+-JN0rv6Sr`t<}4lhHzF#qc@LT)n#(k`N3_f)9nLPCdYeE!hWzAEzw z7T&I>UH1piXLtYhZ&;qpq*)PdYuJ|NB6^HVBgSP&bW78uR%;N@J+;uG*vx$VN-0xP z^P{^?W(-A+7BE7%i*6ig%+Jc8ch~GP^tyob#AodeV*qXT)|L83L^(BgX!n> z*xqZg_gU=y7W;t3K4`HIS?t3W`-ow$p|rYnM_$uXhe6HDO?w?Id|-67evXbh3%=9C za-~i2T_4j`945$SHQ)XbvflntBk#k@D(@$Q_l%q(8}HQMO%}XAg10vCu7uZ+FW-^z zPGqM*r68{YHbad-`m>;C=LOyZq94@c3lB0HE*NR^PextsWg`1v3W@j*!%62H0$@%R9c|S_2IzOT6{EiE)^Spek zUaCUf^D-Kw6cg{=_*$v%}}&jy&8?swzYT#!ktpJcmdZH=8?`5 zsMO2TK{xK{2VoI(gC>S?!m|{EGAL1X7vHf-mqTFLCvc{UE@C|mj4p~eMh<~hNuBHOpk z?NAi7CK~yn1DVB5M7s7Q&EEscwuyKgUt@^P%UIX!PK3gjd`@)Xt2(R9lp z$ks^S2U4;tiDUvF0Z8HlIVZZvMVBbyg8)(bpo)|zz1C59>1Xa67pWv>!ZcaL$C@yA zi%!YZ{9H7SPx{R0H;1+vqd8piiZ8B2)n`}CA!YU9lsFMRl9|OiO&Xt2!nakBbOzD$ z2LhP#8CNjHqj4sMG3JA4cb++8cH^ZPgg(B-!@1bsd+0A04~VQoI{3Bei%?mClw3*KqNoc6)xKFuqUSm&eFNcc@-ollQR zwRz!6@Ak-|NBS|c~FzG`M^Ur8JO%!}E0qaE$r(;7fC zk5*x8;{IX2P>XV>n)5Mg&dta*ma{w|Z`kd5-s1^8*Tj=mnpo0=62IqtA=S_W6~(4q zN}XTRf>ADCG^&N7bdxbA*06`8Q7Cg}NEr;5U$25Nl*US1i93ri;nqC@QQTyRwZVpH z`WSr+1s^4%FNS2&l0=9WJP=Es=tXO=P6fA_AHg?WE~i2J4yvRo(&gc9WnKHxSfn$N zq;S#dNDY8hcG3tyRiZT?Ha?rC6ezJHTJ;z{p~5xF`Wk33kPWD7=^IeU7Zx0~28Pn~ zAt(b0UZ0Hj&LWGsW8NVRo92vhP<5y(-4;jBE<0&$JL&kYBo+jfNGM**lIWnFn0}Jv{ z$&&#^fJ=JG@R8vs10n&}Gm{Y{gRc6MAu?*n2$NAuMjaXTWHgY`NJbMG&1AHYv4o6P zGTO)>y^vf=#xgRNlhHxO3Nlubv5Jfc8LP=yL&jP%){(KEj16RLBx4g9on&k#V+$Fy zlpwc~(M85KGP=p=A)}X!J~A$N+N<$2-P8%N!&C~e!_*3}!&D2f!_W&9T&$@ztGz?& zPNW_?u-6Xkvjh9>zyUjO&<-531BdOv5v|20^WC;+k1g73i}u-~{kG_Ur2bO#^Of+t zuZLBpxf{|oe29#+yJZj3@vDGPml+Q zZAix{`REWSJ0wlUCCvsUO;jZH+>(ZelJ{-D3xTy-O?iOV?vAkbzp38`(FrTs&`jET4Z&}I> zUMgv+|0YiKb$&d7I(Mk5uGQCMwg~F&>AEW4 zLELx>zwj2tZ`r5 zKOLZN_VFGK?|2ovF}xSpRf4Yr2jQ-sa*3KJaKD?V6?MQu9Ht&uOEo^?8LxpWESf~K zXo0JiT}u$3Ty=2Oi&oJl+Tm(o*HXjP$gX8#Ia2BX)h4)`#R{=ftP&BpTiCr?tPyJw zcL`i!u?{J^$6H~iJgrBbuu=}%-tjhI?P3%AFNM8cbb{_?#9S6%e!4?!!S{AA5nK7| ztt)`66kTH58IR}|J&dhltXK2_>o>j%8xez;;tXj^$F3iXn$wIZW*5-|h8{s~K($)F zrAjjo(=T!zUz-*{2)PLcJ~W7Lw8lgn*F?9F8*e&R>f;!{+=_NNU#lXHVrX{I2ql*w zXlDRdVFzX@C~kE-z`sEJ^l6y1)DRmk?`y!2Jcg0pOgu7%HQpP|bwwWPUruRNALP$9!dDBL-dgUffwb0s zR{}G)J1Ci*6eDyqmfa&a@O8Isc}eE1Zu9-?V%+l2`A|+TTS1 zYxd^G#%J-dJ$VD_kqy{yBs&?fN6AhG>@l*Fq51eTe-!6@)Bfbd%sjrPmq?nQn>$}k z-yGUcck;@mNR3zj@}_B+GAOP5xs`CRRz9R_kFIXUlyp;hfprDo!>WNyz0kAmdaDa12m ze2omMd`ZQ%OoDmL!NZNegU82F1^ksCeYnwp25R9!1PvDIxRXT}hV@yWKk#%IT^#N4 z455Rhu1yk!7phxBmq49bfD{narJ?hvhC74~r4Aj6-mQ5{bZa#i(5;0ppj)dpx;4s$ zUAIR5X15l8fx5MpB8J2V8YL+wvaM!sr|Z)2X~rg2r_VmC1iZxU&KIEeif^GQLB`cggrZ8UIWMbzSoRlJP?r*(G^$T-OAPxK5S& z8Tlkaoo~zw#r*wWL_+l@^2g--2^q|!s?(4^CG2Np{G5zmkijhcOS1injQ=6y*JP0N zmQRuK8!{>j>U0G`P2WBDWN!&Yj6d{tk<1b57@#M`XG`%3sd@hB>YceR?9RwtN8-uI zoz^nnNy=4yTeav?)JEmgluaAK&oAwd>17O|-GYAF62VfwSXQF_$_aQ$;=_Tgl(ehN zHY?O1za&qVj~ndRu}gK%7a*t45f5`GS@<;q{ksfaEJ#y_Nx#&|d>Fyc`g9TJP^>>i z+5QOPWjo7f+bYpJolEqcAYCZdNup~(^G(og7c9}Gk8-Yd0A7SN_k+MU@#IN!lHfUc zP7@#-X&L=4^s5B4rRKlF5U}^&D`ZT3O=q}471%CPzB_c3MflHsF ztQA&Sz79RgdQ4K5t0~Gx_Sa?kCiFj@h^bFeHe-_F$(y8f6iiZ9ie88fsA7tE4ib3_ zapRIa!JRL+J>|r9fY(K)vQ>FPTLy_+3M6y>pq>}5AebqllFPE1;uT0;JHgC+PLdcS z=H0~eJo&hAS$sQ4yf6Z3DaKa1Kw588%NHe&WQb~mq>QW~o1Ivuo@WIm%|c~U*`)Ji z$|}dBM6TLNmqf*QfVNQnV z>LnT%T1SMC9{OmIVwaX5Zv{yQ@&m^_L=dAY9{WL6Kz3b~5n?+jG6Fn84B`#d6&X-} z(D)GVGRcTAZqkO@1HL39nnVj+OWiyuz3^+c zn}A(p(4gj^KC0nC4$Z@P<1f#*9CY#^`548iJR#~)?^hp*oYHlXd)4yzz0EPd^9*Q! za`kEAYtCPexp$HW^EFR-K1a@6-$>d~eQHA$W;?5C0vE0)9$tp9CJ&oxQ=NlD;9yDN zN^@&3$UERx+p{tgN`u?~E$_jl{_RB{{8-))2%E~k>~ zw5a4Z<2~Dgn0kMA2~=`hMVCb-w@q~8o#_$17L{BdspHOg#h@5sG$MxaCXHz8^SQ^| z*kj#Tg)Pal3yov*?eW}nhIMnfH;Hv|@|*lV(6q&_2P~NK$p4^lKO%$XB=SGWuZ;FQdVx8z3Nz_}Y_JtBOW-ktH1Y=7)**H|l}VUXCPZNZ8O-}r zD*+ca$o^j~cG@t!rd5G5x= zA=@Y`YRFjn4O2?g@`{1Gh%hMzWIGvZUS688!&mnnB22HYTnfUYXCsaW6a`~vu67<| zkeXF`DVt7}tGSVeKJcLIT#!zcUhgPMlBN#M9DUde2wKMF4@4T;)Ct7M`%_ZkCctVi z;==l%+gKmOJrBZ%w~AH=gS=9x51iGoS@Vt_y^gRE4gfim1-(SUcUQ62>0Y|WK- zV~>hOlgPa;cE*2$s;`BrkJg%Uy=z`mBMh%u@1Y=lWb~7985wj~-y%kv$k`0zb=1_` zVacu_DP8ap*EIIY$7T#8hsVF1ydxN-sqDbp3=ajt4G>tf&-VX9$8B25sSJzsMc|PCDw5p zAhBs3w+-r%AXC!i_XfB&g03#VH$i@Pip>`Jy+vFCS#1s*b@`29BP6)DP=agC)ad$N z7jwn3M;=B6W*f$^78%bi)%NiILVXn2L5xT%vWq?nw3FV@L(+W0q732HR6C8xVuYH^-HEqqyb7F}atV zZTzOMgvXxve>npn+2$_{hMi^p#icLJP{_h(7~xdOhO*lAUq$zDmZia5OY ze+`GrRa9Ls7DN9fHE1b@?p=I_{xYRsilLFd$xw^M&|jzYOEI)1eP;~48cp{pq8Onz zB-cb9f5PE_Mf;?%W6{2sD2wvd6{T3TZ}D05C*@ca=`S{m{=6KETGDsMqHDmE-%>0} zu8U#Oei^r8(f*exi{ieh(o(d4@maKi(k~@Nk^W+{XbYuZN{U+2cgCV?!IZyIEK076 zVbK9OX~&`iFHsilD#xM&i_fBcow4W!Fy&#zqU5?579ExeI~E;&iL&V1%CYG1;Z7n{ReqV9v z2Kx*wHktwZzAT^iEIyz5us*IU zpX~S)8CYyS4N?YJ`(($bmJB%K)6L+_pC~>h*G2JZubj2z)0gT>(`srZR^!{r(-&c> zX+v2)wXF3l)>_l%vV3aEfHOYb0?w=_lB|Ow*G2JZpG?~F=}UFFX-`=`eG%51t}e@` zmIa^1;?wKO@~I^Q&iM2aaAuFcZ25W%=|)Sb2K5ET3AIein;QA1%wLmJB%K zQ~JQdyy8=Gb#`dJlt`r{?8fB>7{B5UBy3dE{Pnn;d=rk9WRx1MvRZ%@IG$d zPbq0j6>nORv@Jl=!mFgEElG<9lGL-36kw8643a+>L4#vSBM(VpUD7)vDMNO(oXigq+wZH0f(9SW<#UM9_la z3JwdKDmZM45~ZbrIBe8HMcs9wE2VDSsXOu9tB4QYfB*BH|K5Axz4z@i8}uQ)K2xGc zyP6oBOXwegGx1_EmW@`_O@n7mKr?JaoA4&`+5rjew*ZUKfjQGkkC`(p#*zUAmSUM; zmj77!UsfR4TCAX4C02=Cp<7{3(3;tApmK)##yOF)1y+mJE z<}%sN-Wf|+EN2xM8_c~Amzlv3aR;dtm4+phCO~fFE-HCJ5ExO(hKK?caX1U89Dpf^ zD0wFiUDApCDMb{LD)!V+oK_H}9bPs2VhGwb@)bIA#W))BhE93||0ef_`Q)rGueX#3 z#?2&|igd_?bkHcWNOhnA-LFiQ>icA?m^G=(Nd3tB25_5wUULy<*qE`+a)luv%k&RFv_Z+K#vPoj~R$fwx6wE~vdC+lWXyR89ge*>Y+ B0e}Di delta 872 zcmY+COHWfl6oBu!Z7)!Ip_JMOw7lQ%_frrMMSP%wqBb#2yQ%s^nUaJy3jNY9$UB48`&eF`z2rkCZc&-=dp8#NtoOtV+y7U=lI8^?K`J% z>6k%%nV2Q|;)Kh_9CEpsCtN%^7v^ID-6(t9lqHN}AsVoV(nLy=uviR}OmPa9U@4YS zuJfc)9){(jmPRojw1Nh$#42%cI(Jx&HFQ}m9uzJ^xH_yScL*DV%OuAKXv8KwjLp+} z&uG@ZI)X>{Rd#pILN2x}0v^NG327WWd3YR8Oh}%5Jc*}hEufA;ZXYs22w>w|t@KbtXILU!FxIixBN6bP_6 z(`&fL>eM#4&!&iD?7O-MS3)CE4FC_>$LLL%4Ba+c0cP1$%reZd3X8uA>0JX-uY}SN zXhkA|KD`#@2b9NQ3{cktBjA^LWgMEN%hnM&01GX{|BUomKNbQF6Q z+n&fM7_fS#jB$oK z 15: raise ValidationError("Number of UPS cannot be more than 15.") diff --git a/sos_sales/views/sos_proposal_boq_view.xml b/sos_sales/views/sos_proposal_boq_view.xml index 5d11f3a..28e00a0 100755 --- a/sos_sales/views/sos_proposal_boq_view.xml +++ b/sos_sales/views/sos_proposal_boq_view.xml @@ -13,12 +13,12 @@ - - + + - - + +

@@ -26,9 +26,9 @@

Detailed Specifications




- - - + + + @@ -111,7 +111,7 @@

Spare/Additional Materials

- + @@ -219,7 +219,7 @@

Spare/Additional Materials

- + @@ -328,7 +328,7 @@

Spare/Additional Materials

- + @@ -436,7 +436,7 @@

Spare/Additional Materials

- + @@ -544,7 +544,7 @@

Spare/Additional Materials

- + @@ -651,7 +651,7 @@

Spare/Additional Materials

- + @@ -759,7 +759,7 @@

Spare/Additional Materials

- + @@ -867,7 +867,7 @@

Spare/Additional Materials

- + @@ -975,7 +975,7 @@

Spare/Additional Materials

- + @@ -1083,7 +1083,7 @@

Spare/Additional Materials

- + @@ -1190,7 +1190,7 @@

Spare/Additional Materials

- + @@ -1297,7 +1297,7 @@

Spare/Additional Materials

- + @@ -1404,7 +1404,7 @@

Spare/Additional Materials

- + @@ -1511,7 +1511,7 @@

Spare/Additional Materials

- + @@ -1618,7 +1618,7 @@

Spare/Additional Materials

- + @@ -1754,16 +1754,19 @@ --> - - - - - - - - - - + + + +

+ + + + + + + + +
No of PersonsCost
Man Month( 1 to 2 Yrs)
Man Month( 2 to 3 Yrs)
Man Month(Manager)
Total
@@ -1798,7 +1801,7 @@

Miscellaneous Cost

- + @@ -1812,20 +1815,20 @@

Final Cost

- - + + - - - - + + + + - + - - + + - +
Product Cost
Opreational Cost per Battery
Product Cost
Opreational Cost per Battery
Opreational Cost
Packing & Forwarding
Installation & Commissioning
Warranty (%)
Opreational Cost
Packing & Forwarding
Installation & Commissioning
Warranty (%)
Warranty Cost
Warranty Cost
Additional Warranty
MSP Per Battery
Additional Warranty
MSP Per Battery
Final MSP
Final MSP
diff --git a/sos_sales/views/sos_proposal_customer_requirement_view.xml b/sos_sales/views/sos_proposal_customer_requirement_view.xml index bd54e83..6160b9a 100755 --- a/sos_sales/views/sos_proposal_customer_requirement_view.xml +++ b/sos_sales/views/sos_proposal_customer_requirement_view.xml @@ -37,6 +37,7 @@ + diff --git a/sos_sales/views/sos_sales_leads_view.xml b/sos_sales/views/sos_sales_leads_view.xml index 33dea9c..4a822f4 100755 --- a/sos_sales/views/sos_sales_leads_view.xml +++ b/sos_sales/views/sos_sales_leads_view.xml @@ -8,7 +8,7 @@ - + -- 2.34.1 From faa8f2ff3b3a420399e2cb714dd3a7651b9251c5 Mon Sep 17 00:00:00 2001 From: Deena Date: Mon, 11 Aug 2025 11:14:47 +0530 Subject: [PATCH 2/3] Reference #7 --- .../sos_proposal_boq.cpython-310.pyc | Bin 51648 -> 61066 bytes ...s_sales_achievement_report.cpython-310.pyc | Bin 26278 -> 26508 bytes sos_sales/models/sos_proposal_boq.py | 504 +++++++++++++++++- .../models/sos_sales_achievement_report.py | 22 +- sos_sales/views/sos_proposal_boq_view.xml | 126 +---- 5 files changed, 531 insertions(+), 121 deletions(-) diff --git a/sos_sales/models/__pycache__/sos_proposal_boq.cpython-310.pyc b/sos_sales/models/__pycache__/sos_proposal_boq.cpython-310.pyc index 9b8f470df6faf3f43c12290fbab649f31fbaa0ab..bc5e6a94c8593a085e7f4cd51eb2957f537ebc32 100644 GIT binary patch literal 61066 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 literal 51648 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 SZ(h}0k0<|sWi$V`ul#?IMnS6p diff --git a/sos_sales/models/__pycache__/sos_sales_achievement_report.cpython-310.pyc b/sos_sales/models/__pycache__/sos_sales_achievement_report.cpython-310.pyc index 7b98b7b4a0e64ba59602e88f5fe30e96aa334464..8e696706b0aae3f04da2c4a3b2f6c21772ad873d 100644 GIT binary patch delta 811 zcmaJ<&rcIk5Z-y)ZOgXX7TQvXkQfh!O*Azq67dKTC8bz?D5k-t@wJs=C~k{Uc(wTB zLM&c}gAo)OBT+8~_h6zn#)C)Y#HANwyyzdG2?x~oRwdDcyO}RD-+XVf@0(qF2jva$ zSm6emYvow%T|jNf`vvV-5|UV6&RBA1`I|HyW06Jj9UUaFc$F- z9}+1O(8I50%=4_KOyv@jIo)Ac;*{V!grY29K|q>wHRV$B!gNZPjf_wT%4+H%EJqUh z1EI5ySp!x?`B1r8+YZ=mL&U+^39(hX?+59%LP9SVP8qE{v!j||wn8O$GF4%2; zjeh_r;pSM>mF7R7(aW8fX~iGOpxJ%)2*4~B6LU~9zbBReuHfBdOY^Mo?jHjOId|RM zNKOzgI!gOt3Fqle*PM`ATP!vkE*yK=?thzz`ZyJui=XmwAcT<<fb;%z?Lln%s qty + name_map, curr_map, price_map = {}, {}, {} + + for model in models: + if model not in self.env: + continue + for l in self.env[model].search([('ref_id', '=', rec.id)]): + unit_price = l.unit_price or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.component_id.id, l.uom, curr_id, unit_price) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + # Use part number (fallback to component name if needed) + name_map[key] = (getattr(l.component_id, 'part_no', False) or l.component_id.name or '') + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = unit_price + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_spare_html = "No Material items." + continue + + def fmt_price(amount, currency): + return format_amount(self.env, amount, currency) if currency else f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{key[1] or ''}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: + rec.merged_spare_html = "No Material items." + continue + + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_spare_html = f""" + + + + + + + + + + + {rows_html} +
Material NameUoMUnit PriceTotal QtyTotal Price
+ """ + def _compute_merged_miscellaneous_html(self): + for rec in self: + lines = self.env['sos_proposal_miscellaneous_items'].search([('ref_id', '=', rec.id)]) + + # Group by (component, currency, cost) + agg = defaultdict(float) + name_map = {} + curr_map = {} + price_map = {} + + for l in lines: + cost = l.cost or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.name, curr_id, cost) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + name_map[key] = l.name or '' + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = cost + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_miscellaneous_html = "No Miscellaneous items." + continue + + def fmt_price(amount, currency): + if currency: + return format_amount(self.env, amount, currency) + return f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: # Skip rows with qty = 0 + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: # If all rows were skipped + rec.merged_miscellaneous_html = "No Miscellaneous items." + continue + + # Add grand total row + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_miscellaneous_html = f""" + + + + + + + + + + {rows_html} +
NameUnit PriceTotal QtyTotal Price
+ """ + def _compute_merged_installation_kit_html(self): + for rec in self: + lines = self.env['sos_proposal_line_material_installation'].search([('ref_id', '=', rec.id)]) + + # Group by (component, uom, currency, unit_price) + agg = defaultdict(float) + name_map = {} + curr_map = {} + price_map = {} + + for l in lines: + unit_price = l.unit_price or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.component_id.id, l.uom, curr_id, unit_price) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + name_map[key] = l.component_id.part_no or '' + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = unit_price + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_installation_kit_html = "No Material items." + continue + + def fmt_price(amount, currency): + if currency: + return format_amount(self.env, amount, currency) + return f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: # Skip rows with qty = 0 + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{key[1] or ''}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: # If all rows were skipped + rec.merged_installation_kit_html = "No Material items." + continue + + # Add grand total row + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_installation_kit_html = f""" + + + + + + + + + + + {rows_html} +
Material NameUoMUnit PriceTotal QtyTotal Price
+ """ + def _compute_merged_material_html(self): + for rec in self: + lines = self.env['sos_proposal_boq_material'].search([('ref_id', '=', rec.id)]) + + # Group by (component, uom, currency, unit_price) + agg = defaultdict(float) + name_map = {} + curr_map = {} + price_map = {} + + for l in lines: + unit_price = l.unit_price or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.component_id.id, l.uom, curr_id, unit_price) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + name_map[key] = l.component_id.part_no or '' + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = unit_price + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_material_html = "No Material items." + continue + + def fmt_price(amount, currency): + if currency: + return format_amount(self.env, amount, currency) + return f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: # Skip rows with qty = 0 + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{key[1] or ''}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: # If all rows were skipped + rec.merged_material_html = "No Material items." + continue + + # Add grand total row + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_material_html = f""" + + + + + + + + + + + {rows_html} +
Material NameUoMUnit PriceTotal QtyTotal Price
+ """ + def _compute_merged_sfg_html(self): + for rec in self: + lines = self.env['sos_proposal_boq_sfg'].search([('ref_id', '=', rec.id)]) + + # Group by (component, uom, currency, unit_price) + agg = defaultdict(float) + name_map = {} + curr_map = {} + price_map = {} + + for l in lines: + unit_price = l.unit_price or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.component_id.id, l.uom, curr_id, unit_price) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + name_map[key] = l.component_id.name or '' + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = unit_price + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_sfg_html = "No SFG items." + continue + + def fmt_price(amount, currency): + if currency: + return format_amount(self.env, amount, currency) + return f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: # Skip rows with qty = 0 + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{key[1] or ''}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: # If all rows were skipped + rec.merged_sfg_html = "No SFG items." + continue + + # Add grand total row + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_sfg_html = f""" + + + + + + + + + + + {rows_html} +
SFG NameUoMUnit PriceTotal QtyTotal Price
+ """ + def _compute_merged_fg_html(self): + for rec in self: + lines = self.env['sos_proposal_boq_fg'].search([('ref_id', '=', rec.id)]) + + # Group by (component, uom, currency, unit_price) + agg = defaultdict(float) + name_map = {} + curr_map = {} + price_map = {} + + for l in lines: + unit_price = l.unit_price or 0.0 + curr_id = l.currency_id.id if l.currency_id else False + key = (l.component_id.id, l.uom, curr_id, unit_price) + + agg[key] += float(l.quantity or 0) + if key not in name_map: + name_map[key] = l.component_id.name or '' + curr_map[key] = l.currency_id if l.currency_id else False + price_map[key] = unit_price + + rows_sorted = sorted(agg.items(), key=lambda it: name_map[it[0]].lower()) + if not rows_sorted: + rec.merged_fg_html = "No FG items." + continue + + def fmt_price(amount, currency): + if currency: + return format_amount(self.env, amount, currency) + return f"{amount:.2f}" + + total_sum = 0.0 + rows_html = "" + for key, qty in rows_sorted: + if not qty: # Skip rows with qty = 0 + continue + total_price = qty * price_map[key] + total_sum += total_price + rows_html += ( + f"" + f"{name_map[key]}" + f"{key[1] or ''}" + f"{fmt_price(price_map[key], curr_map[key])}" + f"{qty:.2f}" + f"{fmt_price(total_price, curr_map[key])}" + f"" + ) + + if not rows_html: # If all rows were skipped + rec.merged_fg_html = "No FG items." + continue + + # Add grand total row + currency_for_total = curr_map[rows_sorted[0][0]] if rows_sorted else False + rows_html += ( + f"" + f"Grand Total:" + f"{fmt_price(total_sum, currency_for_total)}" + f"" + ) + + rec.merged_fg_html = f""" + + + + + + + + + + + {rows_html} +
FG NameUoMUnit PriceTotal QtyTotal Price
+ """ + @api.model def create(self, vals): res = super().create(vals) @@ -662,10 +1120,22 @@ class Battery_Installation_Requirement(models.Model): record.total_fg_cost = sum(line.total_price for line in record.line_ids_fg) def action_ce_esign_btn(self): body_html = f""" -

Below Proposal is waiting for your Updation

+

Below BOQ is waiting for your updation.

+

Customer Name: {self.customer_name or ''}

+

Location: {self.location or ''}

+

Number of Batteries: {self.number_of_batteries or ''}

""" + sequence_util = self.env['sos_common_scripts'] - sequence_util.send_group_email(self.env,'sos_proposal_boq',self.id,"deenalaura.m@sosaley.in","Proposal System - BOQ Submitted",body_html,'sos_inventory.sos_finance_user') + sequence_util.send_group_email( + self.env, + 'sos_proposal_boq', + self.id, + "deenalaura.m@sosaley.in", + f"Proposal System - BOQ Submitted for {self.customer_name}", + body_html, + 'sos_inventory.sos_finance_user' + ) return sequence_util.action_assign_signature( self, 'boq_submitted_by_name', diff --git a/sos_sales/models/sos_sales_achievement_report.py b/sos_sales/models/sos_sales_achievement_report.py index 25b26ca..7bb5410 100755 --- a/sos_sales/models/sos_sales_achievement_report.py +++ b/sos_sales/models/sos_sales_achievement_report.py @@ -694,16 +694,31 @@ class SOS_Sales_Achievement_Report_Brief(models.Model): report.write({ new_field_billed: (getattr(report, new_field_billed, 0.0) or 0.0) + new_billed_amount }) - # Optionally create billing collection entry (if needed) - if new_billed_amount > 0: + # Optionally create billing collection entry (if needed + domain = [ + ('ref_id', '=', report.id), + ('sales_person', '=', report.sales_person.id), + ('customer_name', '=', vals.get('customer_name', rec.customer_name.id)) + ] + + existing = self.env['sos_billing_collection'].search(domain, limit=1) + + if not existing: self.env['sos_billing_collection'].create({ 'ref_id': report.id, 'customer_name': vals.get('customer_name', rec.customer_name.id), 'sales_person': report.sales_person.id, 'action_status': 'Billed', 'date_of_action': new_billed_date, + 'po_no':vals.get('po_no'), 'value': new_billed_amount }) + else: + existing.write({ + 'value': new_billed_amount, + 'po_no':vals.get('po_no'), + 'date_of_action': new_billed_date + }) return super(SOS_Sales_Achievement_Report_Brief, self).write(vals) @@ -748,7 +763,8 @@ class SOS_Sales_Achievement_Report_Brief(models.Model): 'sales_person': report.sales_person.id, 'action_status': 'Billed', 'date_of_action': billed_date, - 'value': billed_value + 'value': billed_value, + 'po_no':vals.get('po_no') }) new_record = super(SOS_Sales_Achievement_Report_Brief, self).create(vals) return new_record diff --git a/sos_sales/views/sos_proposal_boq_view.xml b/sos_sales/views/sos_proposal_boq_view.xml index 28e00a0..f70bcc1 100755 --- a/sos_sales/views/sos_proposal_boq_view.xml +++ b/sos_sales/views/sos_proposal_boq_view.xml @@ -40,6 +40,7 @@ +

Finished Goods

@@ -1654,115 +1655,38 @@
- - - -

- + - - + + -- 2.34.1 From 611cb5e418004ff4db8851eab869a6ca443c43c5 Mon Sep 17 00:00:00 2001 From: Deena Date: Mon, 11 Aug 2025 16:26:29 +0530 Subject: [PATCH 3/3] Reference #9 --- sos_inventory/__manifest__.py | 1 + .../sos_deliverables_boq.cpython-310.pyc | Bin 12598 -> 14117 bytes .../sos_dock_audit.cpython-310.pyc | Bin 20128 -> 20283 bytes .../__pycache__/sos_fir.cpython-310.pyc | Bin 10711 -> 11361 bytes .../sos_inventory_customers.cpython-310.pyc | Bin 1280 -> 1644 bytes .../models/__pycache__/sos_ir.cpython-310.pyc | Bin 13254 -> 13422 bytes .../sos_sales_order.cpython-310.pyc | Bin 5815 -> 5493 bytes sos_inventory/models/sos_deliverables_boq.py | 48 +++ sos_inventory/models/sos_dock_audit.py | 15 +- sos_inventory/models/sos_fir.py | 32 +- .../models/sos_inventory_customers.py | 24 +- sos_inventory/models/sos_ir.py | 9 + sos_inventory/models/sos_sales_order.py | 20 +- sos_inventory/report/sos_boq_labels.xml | 303 +++++++++++------- sos_inventory/report/sos_boq_report.xml | 100 ++++++ sos_inventory/report/sos_fir_report.xml | 26 +- .../views/sos_deliverables_boq_view.xml | 58 +++- sos_inventory/views/sos_dock_audit_view.xml | 2 + sos_inventory/views/sos_fir_view.xml | 12 +- .../views/sos_order_delivery_plan_view.xml | 2 +- 20 files changed, 489 insertions(+), 163 deletions(-) create mode 100755 sos_inventory/report/sos_boq_report.xml diff --git a/sos_inventory/__manifest__.py b/sos_inventory/__manifest__.py index 90f48b2..5408d67 100755 --- a/sos_inventory/__manifest__.py +++ b/sos_inventory/__manifest__.py @@ -114,6 +114,7 @@ 'report/mme_history_card_report.xml', 'report/sos_boq_labels.xml', 'report/shelflife_report.xml', + 'report/sos_boq_report.xml', 'data/send_indent_plan_email_template.xml', 'data/selection_item.xml' diff --git a/sos_inventory/models/__pycache__/sos_deliverables_boq.cpython-310.pyc b/sos_inventory/models/__pycache__/sos_deliverables_boq.cpython-310.pyc index 36ffa6638c1e115df553ac5d1599f0f20bc1aeb2..bb729ebc4f951fc13c42b9ced37913b111cb8f49 100644 GIT binary patch delta 5417 zcmc&&YfxLq71kB9Brq?5KnMg#0t*C2U6sv~iqH+?mFmG)>d=AvY;)oxT%0cIzL^IMZ`hLJ~4$ zNc*GG-0z+}d-m+^dF@J>xL(sC34P+xpCAKpu!;R3+BM(5IFx(WCtml%=TyhiH9F^S0CAV4C!=1p|!CBi$3$TRYF49WcK)9Q4x_%vXk_{yO-=Dz3}cMeWV}W{bYa)!h3-1CPVNZBzuMw_Pt>}YtiZF zZl@Sjd7;d<4)Z>VdJcIcVs-^XC2q;dKGYO-hH{ton1?(gKF;itL=qpnb%F|KNFNS`DS(Z#v#ZywPoK@Z4c#+I{(U zzwCEhT4fUeP6a{Z3cFH;7_e07C0wMiZM!JuEb^^faqw0}fMD$t_coq>UCp-~PG&wC4p7 zzPI+h(gsx1j?jV7iLe8q3!$1Vq(8i+8_AsrxJ}xR&NxRWGWuJRg^o>Z)LnBU~I3_*9Ze-jLs@dzArR99(8GdPEQu0AeO$I#P zqz#0PY%t3xJjHBTgVX5SRCu^=Hv@4@aachFqvBD>%14#QgbM=aqyQ?3imW-NBZoFi189Cu1%BG_&p zuqgqUO^NvA5Xz;xWD<0a2F8{cm%W-*QgjCT?_>j{2`Xh_ib|;z@TeK_Wi}s_3p~1IHk09j*2$kKxcue%jD#t{hI3m$-ChP}H%nORs6`3lj;UN1_uC0k@fZ9zZ5e@T61{q zh=OE(TOe5^o9KX-4m>r@mqk8*-cZ2nyc)GX^K1ljy?YXfVD^1 zK!?``qTl z5(K`#=YR^QlZa*c9fk6fqz5I!EU(0Be-_E5I}B@k!Sn%<1|!S9i6Y-(2TLm3d71qS zwqHQNZPR xZAqxuqb+3R6VsSn<4>oT5m7>HZuz|9U>D7h=w+i22JP3G%X#H@5b<0Ew za|+XqE)y5@4(^OcGGAaME)-Dp>A$e&-v}y%iwLU?le-|S5!h$SHw$;?&X!Ls6BRm} z`TnSAv6bzMM@3QuEEgonQGttGIVi5%%FECv^v?*(xd1oV#HOK=BI z@PP^yd$&Rt4~oQy`f#Nc%tJ?4B%+!txBl;epozu-ZNM3M2=FM3*N1orM74fcBY%?hU(J7IrY{UT2P5__boa6_anV4J&&`*0qbkgI9PeGj1!AgprB z{s7!uAR8NEUH~xx4aB#>m%N-O=VAQA5j)fgRorZRvD{*O zW}X@^;24~5*^+q=I(pg5)uqBcezdFqUq^c>F~^Q}3;ZLrzl@Z}j&?ZMNd-UJ4HpVX zCH#G3Csq8v8lz;mP)MrD`WYpuAr8(f;=Ec?2R!&QiStb40r<6AAGWiD4m&f~R8B`+ zj&}J0!VdxV&^#ph_53nYuK?K9^i`z!4gAMQ{RH6}fL$40Ga$N;_^AqgnQ(%jL_CmE zvH1&xw-I;^+4ByP%T Z%rJ_>?#n-xzQK}uAg3&6U5+JR_aD}4Lb(6{ delta 4058 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 AfdBvi delta 6186 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 ZUA{(q99Wz?;@aZc$=x*k_XU^-M z*S+&){M_2Glb^5p;P>E5PxkzF*QxLumQqj9=wRH3WseS*J$uAyteq54|&?xi~I1Q&~Gf>KzQP=j{C+DyA?53EbUsGgeOrk8FKCd;Tr zlOSoKcH9?rGINw$1H;>j;s!HytHyRFxix90CZ#jiNDxf=`p*w*4m=CtaW?}D`VRX> zeFWBC;^tCc+(!wOc8K@G(x|TyQXe89m8o3j8$g4FEMP zcgfun&7r|P(vUK!xOWdqhXbfEDAQc39+XE3@%5GCCecvrZ*fTwiULm@o7U9arY*Ovf$5@Dnk(w3*^WDXuH__j%dH3Eh6gqetl4CMD`cLR zdsF#GtZ+xylDtY1=|Ii~1Px&$Pv?I~OkN+pL|XWaF`dNae9V!Ottdo4 zo}5Z0k4d6x%;M*23;lNjdw_RE_QI%wLM7i9DdLfWT(V7wX8?1A&n!5UjYD`sMJB}R zG$422>jRnJ3+f4Zh|ej!i)_uX!aanv>@O~vjTT-3GkT%_2Gy{knn_)@9QnacJ)P*$ zVvZN=>(}kHnI2#}(OrzMEH=mj{#tPZ*`2vktdPhE@%)J=;$#fM5Jk(2yr$;TC9F4@DVl1~lG+-$G`jlxK=5x&24DtU&# zU0U8Cyknqj6hUl(1I_j#$N-+w2u7Yi?NEJyiS6a=_HC&06t6CuLeB7|Wh0YEkb&`g zG8{XW2UJvIVvEPJG|n=ZU{}IGe!|uABstEvmN%0x_&enn1IJNeA%CsnNpg|5R_c(< z$;ygChG#pP&xBYwY~>d!r?!cBPohl*;WPrOvULDA&d%7h;igTy8;_lyG@t@5YX`Yk z;5rOD_80yuBDNDCJ^|a7!ZGx<>+Z9ChI}aVUO~Q)ul7{pn8}YTO76t)Dup>on{A- z8S2xu&H>F#>fHuAgcbt`&+&W4RfLWpxgTMaYvbyM#W8st-;V-#c`mrp8O4U{;`n%K z!gBhrGw>*R`CTSUZqea(5=tAngI(DK*w_*SF_^Kux8*XGB?mCu2r7g(K zp+<^d9#>R;09nr>ynuiWW-lU~;9u32^7%EnWEXF)iB*sYQArUXt~Z`MxOsvVnU`xS z2sHhp@n#WQjK&D?1yGt6G`Fzt_>$T?H@=SiHxS-LcnjeS0?sRYA7Ki@2MA(1UPbCY zgf$4_jK7DJ7?!h0i2?c?snZy)|7#%s;FoL1ldt*JNmcyrTTceQ0iIXFPX$W2GU1nT z{}Bf-tE(bs`RuwV43J(oD{vmn^9VmsS5D5O&&+3alL^_$f16l!{Vw_mG-~)AlNPu9 zhi}l!etmE#vx)9Q>Rp7N5wL;mD}RIyyUNU~G77=$7!Gj^CxJ delta 1995 zcma)+U2IfU5P*BO+fugOb-M++?H1bIQs_bz1fo$|N?Tee(3VnB1aY~&=g__M?%wv? zZL$89pQ??BA_Jm{@)H__X!vmxf=XiWNun_bO7+SMfk2E8#DphbaONx$V|bv=emgre zXJ+oq+;eU1c$d%edOcbA2a9*c_su`;o6lT#T3x9DT-3$k`=U?g zQAnwRCrEmb^P^}m$w+v)3VtuDN`EtH5@R;}JoyP`r1PijVkOJa=oIz{?1+{UFv00jGMDs5{e*ohUmVTO@f*Bs9a6qo{!1UxS*6;BP7(+z-(Hfo6S5JGdkH;M zPRioiP^Ok_RSV6U(#TQxEHs-Ph4IkV>if^*WVf`gmIW9f>XItUa7I=`9fjetVs;kx zmnCu!P?8|ro)(12)EagUI;P%MN?8v}rtM?n;7rrl5vVN>RXRmR((V&_%CM3#E_B02 zA?lSBBa@{SHka3ws^>UD%1;T$2*(M_;Z%7!TLBl#i%Z5x@xRSFh`Jy5RJ5T>d&LI! z5qw@zQb@ydCUyxklUN>rD;3l8)mo`G?S-6h-K^#0RiO3tNo!E>SU*mkmd?p(F)b}6 z)$UoSkgtIm4z7KjY(6QrSh5%0b!#A*lJAl-zh8@W55Vw+KXL&=3$eVpZQ&$`=30PeyTFWaOP{K8T%%k)SSxFG*6%afT$dFyE1M z4C@T$Tte|C?5GN}OHf}u6~3)H$u6hmi~y^9i2T)f+6m~IX>{YAk=fco1MiG8aDHYK z_v_D@^TSus=?;Eux?S_K+|12<*chMs4={N(U0>bIo>Xg?ZE)KOXoL9fYu%=ZZR&|7 zwS=%Ac&*)_c<^;}>B@&JHFHm?e(k`s@+{#dfmT8OM7Tk1$-R!^-7GL?m9p!qFJrUb z(l3*J1|dlJg)mO|jX)EW^APRP0{O57shOx7DKjTZ9=e4=ybK#g_shQxD_}t;Z^8N5 dtNk=HNnMpxCMr)vis9*+iV0f47s#LD`v;Ax7c2k( diff --git a/sos_inventory/models/__pycache__/sos_inventory_customers.cpython-310.pyc b/sos_inventory/models/__pycache__/sos_inventory_customers.cpython-310.pyc index 2d548e467efc3716f6f4628249bc15bc572e7977..7fc552896dc8dc495ac19a7cd22d226b0567941e 100644 GIT binary patch delta 750 zcmYLHJ#W)M7`_jGoRc&ZT1rzy6a=b>ge*WXQFUVOQcx!pjL%J-UTo)VQiyB?ks`{7 zEG9ro*ce$EnfMJiut(xY@Lt-gC%uo~kLTX6^V`b5T0LG`svtO*|9n39YW=MD@VE*l z1EC=4FMu3R5yvx}Se#7p3>73NaxVj%U``KBxz|P9_>MoK4`?5AlUv8EpgGm?!pPB- zcF_zMW^O(~&+iphZuN}h?pZDycsB4@Ws<#EagjsvpZFmR=Udk&hwk z`5~a_Dk~sq6W|2F6s*9o0$3ufkQ8V@z=9=0Z)8X6-M5LdWsnHZ50sf^O&KQOG9s@Z zDB~!W{0COfO9&r|FwM$M`t*jX_#*J4j^=FWY8C*)b`5IXt}I&vL+r{HR>QTB`j_rkf*bTP%Y`Z0ecf^GdSss4*sp-v62(f`Ug!8!l{ delta 392 zcmYL@&q~8U5XN`*Ut+K&TESW*^`M7>6ny|swnuxZR|%zwmKtlj2`$J5#puc7-V`By z1h0ax(LAq~mKNE{zU++%tC1$kT=n#LuO_sv-f2aZ$mxM7 z>4dEn?r5xI8(U!FB5V*FOu%4i@daJr1^%|p8%LdxvZ}L(-8`2ST(=u^!m#THf$IuK V@BXlzcU3iGJ^O$8+f`MIJ3ld{TW$aV diff --git a/sos_inventory/models/__pycache__/sos_ir.cpython-310.pyc b/sos_inventory/models/__pycache__/sos_ir.cpython-310.pyc index b1577ced1ff0889b998025119dafae45556ccc4f..1cb55d4d457740040442d6e35405c488e850e1cb 100644 GIT binary patch delta 2344 zcmb7EYiv_h96#sw_V#t#_1$%Ex~^--HdrTU2tgAxIv>%97)>B0?zCI)pdF_hBzj9t z_#zOJ>G2b6x+TQu1Q9A2{F&m~A7`B`v~2EPR+kl|HD_v6L8iQ*_6_ zI-}|pRci#5D2sqImu^{R?!vb2eh7jQM$NX#vy@TR$ZT^K2okNO1lCO$1ddf}HnGw`SEpwk8PDRZ#0*yrJ5l7Q?+UIYHQ*n7KJ1sc%jft`5;US*O|X zcYuzA@(kQvQ?!J4T=R;>XsB{j_rlB*SgSep#1!3qpnyqtgT?u}1>W7}KKWsvf{;Re zpFrmv(5Ah)8)!eTFYjrTg}@rqUf$DMH>XZ!TaDpDCOo) z!o@#8m`B)x@FBu6gckt}dnq@P87_j=N60&g@G-(u2&by)wgZ&*iG}t=iocAkBLIda z&q{`MFV9b84QFXIyEB*Bna^eU6R0sGZnt+uFofaD7fR#V;fZ{)klB@;7%eifzN5=! z=5QQ!Pl#Mc(pJmt6LF|xL*NXu&BUKU>MTI@YDbawv`|8vl9SfH9_pbgmFr(s3QA$1 zJyf~tl*MGMH>z4>DoHX`s00FqDtBbNllrMD&c-(S=GB*+G$=LIZB&c68@ol%i(8#X zI=+FBDJyql_#XibTWRtY4XWS$-DY<4Z zkbzFPA>K@+>A~uSgpDc}k#j+O-@T8X6VD}M;RRqAj(mY-3lo__k^h44Rx#HV5;IAM z>sQqO8evhKN;c6e;@jkY^=D*UMYu-9mHvp}snbeYZQwQ{4h=L{AM4p*p(n-beQ(e+ z!qK0u{D!*M5pE!Ggx?V?2!9~N5FSUki7<_D2LZ=r*oF!d*^w;gUn1)Sf;r0}q~1d? zH((Gc3(Sk}MM^>{Lr8+~9r(VDFoWItS_^W>%wTXiRE#lcV zKWw$5*nv<*6Bke~a24>?&~S0rc(H)Z%d`G_EA2tu2819Q_>l4<_z?o8Kx|4sVhscN zomg1gw`1ikG8fkDLIfR}T`>D$wqmLFdg-;|qM-PN$PIMTC=}O98^!wr4@d8nXDFp& zDU%yns_?CJQ+!3GTo?P(y==v$7`CPVf)$n1&~4KiXbE;C`KY#u(NIV7Ixw68lt)D zhTsF5kW`Nk2Kvw<3JQw24~iN;BR**~MjjSTu%af4AAQgmAJmz%yC}#@o7~?$ch1b5 znfagX&lBgzeMPU=#qjUl15*-nqI>J?nzDTz+HR8j&$PF2A*ka#iydY809j37~#inw>U{OJh!tQ>nZ`vVK)Pm z5%Zi-(E-CdX%h#*X9lu9v{aqAP@z_41i-(VX)GJq2jmQaNvk-H3HGx7w#3M5-2 z)w9i1cgbX{lOjb3*s$x5YrtOuW=@cKDPOLfz zjy25Gj0l7wa+qU}LF}>ZYFSszw(F)slZoOJgD7Tlo0k8?x@S3O`)kJ1D zF{nCbEqH{ETUZf>>vRM@He-=uWAyE~zZf4XwgVqK&~6Ocr~O!#6BbuOXk}n+XO*xS zp6OIyoLYen=rlvHWY$3?6h6Zp4VF%7Q<`AZ{}R;dqvjomUvmc{=(-fT(3OixT*vWk z;Ja&zm*^c=I)_o`$iF(H&x9F3DH7C(k~1;I_iZc0F(Qe(Pc$>oJ84wus)YWR;t;B< z5-8Ov!G5zfGMbnUG>O!86Kl+>8+Wdo6(pv;l_=VK3_F%E*UXg!M|IX>MwQlT6W6IV z47%~%gZel1GJ2sG`WoS5mT?Y#NFUZJF*Bx;#f(1i>#U-iv6(bvOg+y@?^ZP4ov0G2 z{{|vu@j^6JTGmntyKP(*QqzjHW=salVFe7#S~-Kk8>C^d5|1OThcL@9X$@>E%Z$j& z9h+)vJN=v=t8H20;~T{a{9lmqijDXZCkQ7ATL~`^juEyY>dw;Gcy_c1IdPh7FA-iQ z+)X%BdvodIocGH+x_ZNPS7{=*dn~&v8j(j-%D1Tl4kxmBBp`qTEFF>wP&K8Q|Yq>0w>YXFE4+vkgOalkNRAo~eD@zum&0m+65+{Ionf zFkHP%F5eQqBM8Fx1PkFuLXxna@B`rp;dcTlQFm-8lyi8jc$-Y82uh|6v^q{u3Xjn0 zZ^C}UUxX}Uy-e(+yo8|@I~P6(b?a2GVM?faRb8uw zTOBqVY_t$X$8*v*oZ?Yzp;HqPxn=ma`>u9Ux0i~g?AUm#8FYUnGFsfTw^*QykcWZR zk8D95UXsg3mcxQOtUFq#EvQSsj%9yNBZ(1oIXAM-P2ve^AHU~^bh&<2(&i1NV~hU* DmO&WD diff --git a/sos_inventory/models/__pycache__/sos_sales_order.cpython-310.pyc b/sos_inventory/models/__pycache__/sos_sales_order.cpython-310.pyc index b4a5ee00a19d6452455af113431d737b428e1a85..b5bd074ec6f67e914fa6b9b560815c8c5fbc96d5 100644 GIT binary patch delta 962 zcmY+B-%C?r7{~YQwByljXTLW$bGkX*51r0AZJMQ(wYwGiLScnVpmdEb<`$ zK;H|%R#eckE#bT&TfCg$p;hm~dSUE{>5++9c8-6JlXExgP8lCyr9KpcPg6qJ5Yo_HWC% z7}+=uV2aila|voHwL#H(sr6wRhiGkvc1TjUW_51`DpJLCTLQ!SH0x+S zwocH%KXC2`&^=zYv>ZWztD3Z~mrED;ZWlQ&aZIr<=6RT`rY+3?a&_Dq2I+DUccsv-M%U@MNfpqWoSfrVESL8eQ)!u~q^ zpfbO6)M&|6=bR~kPIlkb2G7_lSJM8HuYO9XNwYK4r4jbcH3p-s-Cc%5_Sl_)1NPZ{ z)&80p4LE_#~F@W9ETi7 t99!(WCl)`TSW}9H#pQ*NaA>VEaQ#C9=qm^5$}0Z{{Yld@K^u< delta 1284 zcmY+DO>7%Q6vy}NuAPlzI~#vHO~_Z1X48B%P12;$lu|wp&;}7&iiKoZep}nYwcFWk zRF^FVB~m1$2&$2gK$V)d5~32QQVo<4=FQss z*Tkc#Xgv}MDRlk#L%IA@|IO%!L6MxfoA)j>4K%T52XaxnW4#+=(wpQBj7#4mc|!Ua z`8Xz}Pmm9l6inR(OrwF}9W9q^vkb9po27`Qu~#NFmyzi}J7w(-lP3Gxv6m(d{w`Qe zQFxGw4B;@2P~oTAh4qIDOo+ve;72gi`XqP{V3D6N`ZJ!g9;DGh!$9>`#~ru<9x%pTV+a`k*m%GDbvNaK zr+I-*4U{Xd@UhNcBP&$yZ#eNA(EWZZ9{K`$1@g5kZi78bj-3+noRHJ}m##dVY%Pa7 z0rb}C$S^dED$P8(bTVRSG@RE+JlItbs1?;y*$}k`sAiRQ6#+F*y{MG{bqwsNH#ARk z{+-{|5InU)&w=9VZopGE)m_b_yrx*ev$8Ee?bMxorCHmsYi^x2^2Mu;Tfby8hrK`> zvloTDL}CSftz^6GyZ|{NZ;=ifcYZb?>)Jpfk@66|m z)q>;X^Q=oe9u^{MT&6MMh!|3J=mQ-RV5--XYpZMdwL;Z)RvFrCy2$K;YglYe%X7iWL3oGKC`hiPzw5xmFN7_9V?P~Q& zU$VIkTDjMuIGOnVo%8%VGYet<*jx@8^SYjbR;p(f`Uhyz3RtSI)#{F~ovl0M1Fsf} zZ#(RBUW`qdUy5R%k@(uV)iZ2?@5YY95`P?Pz(am6J`WH02k|$}mRM#8`AWz){LlC# zJmQ0i*@0^UG=y9i@{SNsi1>%FPkB9&>3vVwRUunK9t!zd$Tq)|7&jk~^^JP1ST58` bHv5*}HZyRS|BBelow Deliverables/BOQ is waiting for your Approval

+ """ + sequence_util.send_group_email(self.env,'sos_deliverables_boq',self.id,"deenalaura.m@sosaley.in","Deliverables/BOQ Approval Request",body_html,'sos_inventory.sos_ce_head') + # Email part ends return sequence_util.action_assign_signature( self, 'prepared_by', 'prepared_on' ) + def action_ce_verified_esign_btn(self): + sequence_util = self.env['sos_common_scripts'] + # Email part + body_html = f""" +

Below Deliverables/BOQ is waiting for your Approval

+ """ + sequence_util.send_group_email(self.env,'sos_deliverables_boq',self.id,"deenalaura.m@sosaley.in","Deliverables/BOQ Approval Request",body_html,'sos_inventory.sos_scg_group_manager') + # Email part ends + return sequence_util.action_assign_signature( + self, + 'ce_verified_by', + 'ce_verified_on' + ) + def action_scg_head_verified_esign_btn(self): + sequence_util = self.env['sos_common_scripts'] + # Email part + body_html = f""" +

Below Deliverables/BOQ is waiting for your Approval

+ """ + sequence_util.send_group_email(self.env,'sos_deliverables_boq',self.id,"deenalaura.m@sosaley.in","Deliverables/BOQ Approval Request",body_html,'sos_inventory.sos_qa_user') + # Email part ends + return sequence_util.action_assign_signature( + self, + 'scg_head_verified_by', + 'scg_head_verified_on' + ) + def action_scg_esign_btn(self): sequence_util = self.env['sos_common_scripts'] return sequence_util.action_assign_signature( @@ -185,6 +231,7 @@ class sos_deliverables_boq_Line_Material(models.Model): ref_id = fields.Many2one('sos_deliverables_boq', string="Materials", ondelete="cascade") component_id = fields.Many2one('sos_material', string="Material Name", required=True) + display_name = fields.Char(string="Display Name", related="component_id.name", store=True) uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram')], default="Nos",string="Uom") currency_id = fields.Many2one('res.currency', string='Currency') material_code = fields.Char(related="component_id.material_code",string="Material Code") @@ -306,6 +353,7 @@ class sos_deliverables_Material_installationkit(models.Model): ref_id = fields.Many2one('sos_deliverables_boq', string="Materials", ondelete="cascade") component_id = fields.Many2one('sos_material', string="Material Name", required=True) + display_name = fields.Char(string="Display Name", related="component_id.name", store=True) uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram'), ('Packs', 'Packs')], default="Nos",string="Uom") currency_id = fields.Many2one('res.currency', string='Currency') material_code = fields.Char(related="component_id.material_code",string="Material Code") diff --git a/sos_inventory/models/sos_dock_audit.py b/sos_inventory/models/sos_dock_audit.py index 1e55618..83d6754 100755 --- a/sos_inventory/models/sos_dock_audit.py +++ b/sos_inventory/models/sos_dock_audit.py @@ -17,12 +17,15 @@ class SOS_Dock_Audit(models.Model): deliverables_boq_id = fields.Many2one('sos_deliverables_boq', string="Deliverables/BOQ Id") fg_name = fields.Selection( [ - ('BHMS 1.2V', 'BHMS 1.2V'), - ('BHMS 2V', 'BHMS 2V'), - ('BHMS 12V', 'BHMS 12V'), + ('BHMS 1.2V', 'BHMS 1.2V'), + ('BHMS 2V', 'BHMS 2V'), + ('BHMS 12V', 'BHMS 12V'), + ('BHMS 48V', 'BHMS 48V'), + ('BMS-HV', 'BMS-HV'), ('BMS-LV 100A', 'BMS-LV 100A'), - ('BMS-LV 40A', 'BMS-LV 40A'), - ('MC 250W', 'MC 250W'), + ('BMS-LV 40A', 'BMS-LV 40A'), + ('SBMS 55A', 'SBMS 55A'), + ('MC 250W', 'MC 250W'), ('HeartTarang', 'HeartTarang') ], string="Product Type",required=True) @@ -384,6 +387,7 @@ class sos_dock_audit_Line_Material(models.Model): ref_id = fields.Many2one('sos_dock_audit', string="Materials", ondelete="cascade") component_id = fields.Many2one('sos_material', string="Material Name", required=True) + display_name = fields.Char(string="Display Name", related="component_id.name", store=True) uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram')], default="Nos",string="Uom") currency_id = fields.Many2one('res.currency', string='Currency') material_code = fields.Char(related="component_id.material_code",string="Material Code") @@ -689,6 +693,7 @@ class sos_dock_audit_Material_installationkit(models.Model): ref_id = fields.Many2one('sos_dock_audit', string="Materials", ondelete="cascade") component_id = fields.Many2one('sos_material', string="Material Name", required=True) + display_name = fields.Char(string="Display Name", related="component_id.name", store=True) uom = fields.Selection([('meters', 'Meters'),('Nos', 'Nos'),('coils', 'Coils'), ('litre', 'litre'), ('kg', 'Kilogram')], default="Nos",string="Uom") currency_id = fields.Many2one('res.currency', string='Currency') material_code = fields.Char(related="component_id.material_code",string="Material Code") diff --git a/sos_inventory/models/sos_fir.py b/sos_inventory/models/sos_fir.py index e2302b6..9ab45da 100755 --- a/sos_inventory/models/sos_fir.py +++ b/sos_inventory/models/sos_fir.py @@ -51,21 +51,45 @@ class FIR_Only(models.Model): stores_received_on = fields.Date(string="Stores Received On") ncmr_ref = fields.Many2one('sos_ncmr',string="NCMR Reference (If any Rejected)") customer_name = fields.Many2one('sos_inventory_customers', string="Customer Name", required=True) - remarks = fields.Text(string="Remarks") test_log = fields.Binary("Test Log", required=False, attachment=True) test_log_filename = fields.Char("Test Log Filename") rejected_line_ids = fields.One2many('sos_fir_rejected_lines', 'ref_id', string="Finished Goods",copy=True, ondelete='cascade') serial_no_line_ids = fields.One2many('sos_fir_serial_no_lines', 'ref_id',copy=True) - sd_card_data = fields.Binary("SD Card Data", required=False, attachment=True) sd_card_data_filename = fields.Char("SD Card Data Filename") - cloud_data = fields.Binary("Cloud Data", required=False, attachment=True) cloud_data_filename = fields.Char("Cloud Data Filename") - firmware_data = fields.Binary("Firmware Data", required=False, attachment=True) firmware_data_filename = fields.Char("Firmware Data Filename") + serial_no_parse = fields.Text(string="Serial no's to parse") + def parse_serial_nos(self): + self.ensure_one() + if not self.serial_no_parse: + return + + # Split into clean serial numbers + serial_numbers = [ + line.strip() for line in self.serial_no_parse.splitlines() if line.strip() + ] + + SerialLine = self.env['sos_fir_serial_no_lines'] + + for serial in serial_numbers: + # Check if already exists for this ref_id + exists = SerialLine.search([ + ('ref_id', '=', self.id), + ('serial_no', '=', serial) + ], limit=1) + + if not exists: + SerialLine.create({ + 'ref_id': self.id, + 'serial_no': serial, + 'inspection_decision': 'PASS', # default + }) + + @api.onchange('batch_size') def _onchange_batch_size(self): if self._origin and self.batch_size is not False: diff --git a/sos_inventory/models/sos_inventory_customers.py b/sos_inventory/models/sos_inventory_customers.py index b9c0615..b54768a 100755 --- a/sos_inventory/models/sos_inventory_customers.py +++ b/sos_inventory/models/sos_inventory_customers.py @@ -18,18 +18,30 @@ class sos_inventory_customers(models.Model): new_name = (vals.get('customer_name') or '').lower() if new_name and len(new_name) >= 5: - existing_customers = self.search([]) + # Words/phrases to exclude + blacklist = [ + 'private limited', 'pvt ltd', 'pvt. ltd.', 'ltd', 'llp', 'inc', 'co', 'company', 'corporation' + ] + def clean_name(name): + for word in blacklist: + name = name.replace(word, '') + return name.strip() + + new_name_clean = clean_name(new_name) + + existing_customers = self.search([]) for customer in existing_customers: existing_name = (customer.customer_name or '').lower() + existing_name_clean = clean_name(existing_name) - # Check all substrings of length 5 or more - for i in range(len(new_name) - 4): - substring = new_name[i:i+5] - if substring in existing_name: + # Check all substrings of length 7 or more + for i in range(len(new_name_clean) - 6): + substring = new_name_clean[i:i+7] + if substring in existing_name_clean: raise UserError( f"A customer with a similar name already exists: '{customer.customer_name}' " f"(matched substring: '{substring}')" ) - return super(sos_inventory_customers, self).create(vals) \ No newline at end of file + return super().create(vals) \ No newline at end of file diff --git a/sos_inventory/models/sos_ir.py b/sos_inventory/models/sos_ir.py index ed8d164..6a19daa 100755 --- a/sos_inventory/models/sos_ir.py +++ b/sos_inventory/models/sos_ir.py @@ -217,6 +217,11 @@ class SOS_IR(models.Model): for item in self.line_ids_material: # Fetch the component related to the current item component = self.env['sos_material'].browse(item.component_id.id) + if self.supplier_name and self.supplier_name.id not in component.suppliers.ids: + component.write({ + 'suppliers': [(4, self.supplier_name.id)] + }) + if component.shelf_life == "yes": shelflife_line_values = { 'ir_ref_no':self.id, @@ -301,6 +306,10 @@ class SOS_IR(models.Model): for item in self.line_ids_sfg: # PO update part sfg_component = self.env['sos_sfg'].browse(item.component_id.id) + if self.service_provider_name and self.service_provider_name.id not in sfg_component.service_providers.ids: + sfg_component.write({ + 'service_providers': [(4, self.service_provider_name.id)] + }) if self.wo_planned_at == "outsource": if self.wo_no: if not self.orr_no: diff --git a/sos_inventory/models/sos_sales_order.py b/sos_inventory/models/sos_sales_order.py index d7a1ab4..3ee5d5b 100755 --- a/sos_inventory/models/sos_sales_order.py +++ b/sos_inventory/models/sos_sales_order.py @@ -25,7 +25,7 @@ class SOS_SalesOrder(models.Model): ], string="Product Name",required=True) line_ids = fields.One2many('sos_sales_order_line', 'ref_id',copy=True) - customer_name = fields.Char(string="Customer Name") + customer_name = fields.Many2one('sos_inventory_customers',string="Customer Name") lead_time = fields.Datetime(string="Lead Time") customer_po_no = fields.Char(string="PO No") customer_po_date = fields.Datetime(string="PO Date") @@ -58,7 +58,7 @@ class SOS_SalesOrder(models.Model): 'sales_id':self.id, 'fg_name':self.fg_name, 'quantity':self.qty, - 'customer_name':self.customer_name, + 'customer_name':self.customer_name.customer_name, 'lead_time':self.lead_time, 'customer_po_no':self.customer_po_no, 'customer_po_date':self.customer_po_date @@ -109,15 +109,15 @@ class SOS_SalesOrder(models.Model): sequence_util = self.env['sos_common_scripts'] return sequence_util.generate_sequence('sos_sales_order','SALES', 'order_id') - @api.model - def create(self, vals): - customer_name = vals.get('customer_name') - if customer_name: - existing = self.env['sos_inventory_customers'].search([('customer_name', '=', customer_name)], limit=1) - if not existing: - self.env['sos_inventory_customers'].create({'customer_name': customer_name}) + # @api.model + # def create(self, vals): + # customer_name = vals.get('customer_name') + # if customer_name: + # existing = self.env['sos_inventory_customers'].search([('customer_name', '=', customer_name)], limit=1) + # if not existing: + # self.env['sos_inventory_customers'].create({'customer_name': customer_name}) - return super(SOS_SalesOrder, self).create(vals) + # return super(SOS_SalesOrder, self).create(vals) class SOS_SalesOrder_Line(models.Model): _name = 'sos_sales_order_line' diff --git a/sos_inventory/report/sos_boq_labels.xml b/sos_inventory/report/sos_boq_labels.xml index 86ae22f..c7a8ea7 100755 --- a/sos_inventory/report/sos_boq_labels.xml +++ b/sos_inventory/report/sos_boq_labels.xml @@ -86,131 +86,192 @@ } -
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
No of PersonsCost
No of PersonsCost per Day
Man Month( 1 to 2 Yrs)
Man Month( 2 to 3 Yrs)
Man Month( 2 to 3 Yrs)
Man Month( 3 to 5 Yrs)
Man Month(Manager)
Total
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Set No#/
Battery
No.
Name + + + + + + +
UOM + + + + + + +
Qty + + + + + + +
S.No
+ + - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Set No#/
Battery
No.
Name
UOM
Qty
S.No
-
-
- - -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Set No#/
Battery
No.
Name
UOM
Qty
S.No
-
-
- -
-
-
-
-
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Set No#/
Battery
No.
Name + + + + + + +
UOM + + + + + + +
Qty + + + + + + +
S.No
+ +
+
-
+
-
- + +
+ + + + + \ No newline at end of file diff --git a/sos_inventory/report/sos_boq_report.xml b/sos_inventory/report/sos_boq_report.xml new file mode 100755 index 0000000..4ab3776 --- /dev/null +++ b/sos_inventory/report/sos_boq_report.xml @@ -0,0 +1,100 @@ + + + + + + BOQ Report + sos_deliverables_boq + qweb-pdf + sos_inventory.report_boq + + \ No newline at end of file diff --git a/sos_inventory/report/sos_fir_report.xml b/sos_inventory/report/sos_fir_report.xml index 88073d7..f99c570 100755 --- a/sos_inventory/report/sos_fir_report.xml +++ b/sos_inventory/report/sos_fir_report.xml @@ -45,10 +45,7 @@ Sampling Size - - Serial No - - + @@ -56,10 +53,7 @@ Sampling Size - - Serial No - - + @@ -74,7 +68,21 @@ -

+ + + + + + + + + + + + + +
Serial No's
+ - @@ -307,6 +353,8 @@
Verified By + QA Verified By



+
+ diff --git a/sos_inventory/views/sos_dock_audit_view.xml b/sos_inventory/views/sos_dock_audit_view.xml index f2d52c0..db5c7a5 100755 --- a/sos_inventory/views/sos_dock_audit_view.xml +++ b/sos_inventory/views/sos_dock_audit_view.xml @@ -108,6 +108,7 @@ + @@ -122,6 +123,7 @@ + diff --git a/sos_inventory/views/sos_fir_view.xml b/sos_inventory/views/sos_fir_view.xml index f31eb38..de4fe21 100755 --- a/sos_inventory/views/sos_fir_view.xml +++ b/sos_inventory/views/sos_fir_view.xml @@ -20,11 +20,12 @@ - +
+ - + @@ -61,6 +62,13 @@
+ + + +
Parse Serial No's
+

+ + diff --git a/sos_inventory/views/sos_order_delivery_plan_view.xml b/sos_inventory/views/sos_order_delivery_plan_view.xml index 77bbb78..bc79c39 100755 --- a/sos_inventory/views/sos_order_delivery_plan_view.xml +++ b/sos_inventory/views/sos_order_delivery_plan_view.xml @@ -62,7 +62,7 @@ - +
Finished Goods
-- 2.34.1