From 8f59cc67231513392d8de36bc0e615ecb9912d3b Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Tue, 24 Dec 2024 18:33:17 +0300 Subject: [PATCH] update --- .../__pycache__/settings.cpython-311.pyc | Bin 6094 -> 6067 bytes car_inventory/settings.py | 12 +-- inventory/__pycache__/models.cpython-311.pyc | Bin 46060 -> 49995 bytes inventory/__pycache__/urls.cpython-311.pyc | Bin 11404 -> 11815 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 61859 -> 68911 bytes inventory/migrations/0014_payment_refund.py | 43 ++++++++++ inventory/signals.py | 75 ++++++++++-------- 7 files changed, 87 insertions(+), 43 deletions(-) create mode 100644 inventory/migrations/0014_payment_refund.py diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index 95d4c00bff955dae0f15fa114cf93e2bb2926aea..862c29ac606349b1e1a486426e9eb546cc8379e3 100644 GIT binary patch delta 453 zcmZ9HIZpy{5XJYuY*1H;7OsLW2r9Q6qRZuh2OhoMBo-tO)CJLA$Zk!pf|r zg`dE}imzaAW#we8^d-NSnU|Sl<~`@+e2+e#DzUCV+Gge1r;Bq98s;z$zwNaI`4PZ^ zCD<2T*If@JI+aAiJLhDQcRocK7ZDN}S26m_j6}zbM=$<8bxW-@Y zd>v~+#T5pm2gaD_k`oWCs2h`87KeJDwH!RdDc`q8)W#h`ZpZuCo{i7NGXjUK11RYx|$Um=kZioN? delta 476 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 delta 665 zcmXAn+e;L26vuaFvYjSpH=nd6NyoYEP2C3rEtcMje25UT9bFY2T`wz|<|Pqah_0Fu z2MUC!2gQ7hsTYX|ygu{?^qSza`=C90&iT!c`TWl3`#bad&A@DSujC?|x~_%r+FKtk z+>E`C)X3#4-`t;-Ft1o}TxroP72&sBT`@kWjJCm~l7@^v0lWG(tp!Vwt8$HZ$A9Tv z@?UwH|JqaiH(uCZ?g+(Kg4L?MaBv}3t4MbPqqe97pX$C!+FLwO!h5;^_l-p<4}S~? zd1@q(*Bdg(2h3;89}TUToG{}i)dMDVu9`{Ywwb(`m!fjH5x&?~xQXj#s^v@`vKDoY zSSjQO<_@!L)nQU)Q=YZc$RcyiPK({{!Dri6+Hv8(-GWRx#D2#>K6mJWfccLZbsI6s zGRIxobd7o7Qs)`xW}JFD;`PWG=0{HUnP*Hh!958&WtQs=t`8H2c&&$!OIm8D%wPEk zUL<6W(De%P-y%2&npPc8Pzol3LP zCbPvjRjycbtRRDDg;VBIo7Jv3bDS&Q91mqmo64EsN;D@DKGvymY0X-CRy%dBBy$oy z$2pT-lgyLoIo_#v8O#QHPH?8UQq8IKoajt*8O=s|);QCBt_*Vqy=Z}Hra9AJ4;~qaE&!zHI=RDVZ^L*C=^8$KL zb1rl(GB2WMBecKRyx6tGyu?*uuAs7X=TcXtxe}h0whZSo*K+f6SCzTSRc)?z)tGBs zE6ghhml+-BT4`Phc%RaiqKV_rjyvz=>Q>&)xuIR~`2-n^ckb3uEx=308r zbJn@)&Gqy=*}1{B(Y%qK^PQVqo6VcyS!pY9ZgFijZxv*6nSJvW82)F_2Iynn24yk3 z?v%-VQi1)hD*_O}kMuE{iJ&3)4#eAo&({mb(?VlYj>ybAb@-ewXVmV=WjpOxTtD2x07wD^cLTS5P=7W*00oE&kb>tAZso|A?T?N=kb#@ST zHDK3Je~TmfyNB>=0l$v$k@{qW_pJwlS|W&4n1=}J0ACOI^&sB(0r3)k1K>9jz9<6U zN%&2G-%R*=dnG7776ui5q>p*8kBGJa(bf>r)Ci(|puBAply^7Pyc25P6;-_bgf|1e zA*y&?g!gR+f*qlzBjx)R5$yyTONb^?ylxP$ae{a~RMQGIo2X{w@Ejm~vkwStL=dT7 zNi%l9w-7#3y}i(E>x5;r9TZ*;9RBSkVllkBB@#E#?K>ivPr&cH z;rIRUdq4bsfcSI)pKk%5$QgE0?n77G4d@=2VB_cgDXMw^a6YJ754Jnr{`(2v3;2VC zkDOqq34aLihY24!zc}K3wj)4rG>U9zsQNvCy?26W-zHoi;EqKV?JVJs1OC3KqMalB z3BX(Kk1E@FFpUQ$SjK};dU8VPLr{8ZLg~Xc`6ij^^y#?LIi?sfX*097d#ue~hr4~f z+h%u)iOZUs-JR`T=`DGUyOXtBoi*)VwjYZIO5zgbDJ9@0SSf;;2+9!58mLV;su1G1 zU*}4n3?-tX!|H7lm7Wf#!z(Imj%F{*)3){vwrxvSr0uA%be(T8BKL2g~IM z4)81KbBzpnCAHeUmS%Um*M7IxVzYX!Y&QQYeU^~Ji!$;SnSjI;&pNTvJ|vF~kTP7n zST7bSJzlHV!-)F~5@pu}meS9yK8;0vlhFWl=TKD?fEQoqs=TUdaRadJ@4Y z1pNpOA!tNE48Dy|2=3*%*;x{UZx1ZX_6Y?z6r!TOZqsH~g;YfVKm_bJiI4~5^I6Vp zp`WMaR)Ibna&v?Pti)Oo?B+-ErmUo)iuH6hH`_fPM%s;UaWj`?uhr?WU5g=hq5_Mg z&V|Mvd0Yn2WvsF?zQ>g!oa3s=+ue;&X40^TzRgDRBLGCD3+Qk$ep zNez!8J+fz~5pV$EdOe4Q2=3!Ulba>AoFlzzAJYz4^ZNv$gMVHyW$AJxB=tOpPtPNG z0l|w11`s3zFvUvtLh9LzrTY*(%WDe@a%mutN0)xtF6-T^tnJ|G*;a>rUnv;kWBgR% zF;H*DlrQ8-m#`LE4SNZ}cX;O17b~$4<{8+jNykD0i7`%lI~pQ$bdU@*aYYp~*w1JMg7xP(U+&H+|sa=?1~~25>Y9>>cF(69l1lR$LQchFV+fFqc9?GaN@z4Z}u$ zh#kc$eF%O;2sg9YnWbqzbx2e=9UiYq5hfuvC&q`Q_wbIAcuCafLDXE~L;iTlzJPqQ zN?#Qc-a_7QBk15?&77?YsI{al(}&`Ql;N>6hdoSq<_D}PAxv@{W--Rm?iJ&=qKa$K zJ&pBe6EPUyA2y0ilwtCR#1U0#)TGCw1e!ejNE7x2=tp|2g!^>hf0s>{`#!>!69S_K z!|j?NXIz+^q+y&Gn~^d?Anb%BRk&7vjSVP~v&VxQpD}6B%CoxCqnNFQ$p6BBFnc!` zZ`qt~x$r6fr@7_AYy9Ti#ljzWzsta9&0AdbIX3wR1iwdc2!Kh>+TfQc?1h*Yn*&e7 z=dBd7`A74rD;l9_g{1#Uk^M@6er@WoH#=G!%~o98Xeh#Znag*~pS|b?uplLgN}3L$ zqO;xMWuHQ^sIqo+*xPMnaMIijp8~(-@6Def{FVQ8ev$Aw&s{KEvaSJs=YnG4KL>gj z92aUEflaL`F49GPy_dj#Gps2M^L2be@F>4?(ScY(T$k~K+voC|_oNL>TWplm++t)g zzXd{=2fMM-*i^&rFtq?ELDa(Rv{)RtQdu4C9+=iNqn9HI2}b@1ZG*gMn8qY$j);p0 zMi8U|FwIv>hCAlYY7vK1a7-$ug7!UXC_|&c4~*sCDrN{Xc+t}D!%XaVrSpGV`nxvB z$H>@gST`CM)Q(9->j$lj(WJi?Fj?x!3FJhpWx!y2CA}WzYnSBoY@}A}0Dr|`<_*+k;4;ZVq z3G4OvKGqOP`~)@>1FlQzMgz!iOMQ zCm?$!3%ZDq#^oyuRht0uWfeblDWBJ_oZ@Q)W+rVk)r)a3g{$07H}fzWfH^=aYC?s$ zoU^B)Oj^fLP3%zwhY>_w%pqMTV+bH^CG(&P`I(L+E??!42F5V3XVr)zDRTDkJJ*+Q zpamt)W!-JJv|C+vDa50ZqhK!%8^u=`s<-g@rw9o38+<}wieWfE*)2lxkJevGpg95w zJRs%AYoD%(R<#t+Flx9&kS_{4#dunmDJ%_nN2K|Z@2{ILoaQgqwJ&VM0+MnDauLQc zka~mR!ua}7r)w%dP&ZY$pC7J2s75BxsE;RZm|mnrK9d5GU5NV;d^(Dt55YygV?&N= zIzGO`4{k8f5=vfGT9NKS3@+qs5&-a!+wht6j&6csBa)pDA_9kBRM3L5MtlQ<^!L*;AgY)#_nhpHsD@uNA+wUuh3;GK-6~QG0q)K#FWA1}p zf!DFk6yk8YbmbEBlDiUw7x{v_YH7+Fc>N9~ztLN{@S38QHMI1>l~7oTzE{F3#Za(4g;A@A!fM^$-?*etcLlL!-(#y zk7LJZ)W}t6!Bwnqv|HPo?Ge6$RE`?>M-F2#b|1kt`0=1E@ZU9@md1H8-*7aYKe&A# zEF#G}PR?A03Q~}QM3uW~mmPMy)U)V{;y>GA5`M)0wqqKxYZiFk4Fg}Y^MD%16Ew~E zKkqEap_rR|HF^9Pz|n>ngO^Z0gWv}LmE~?p7d51dy^Wt2qZVK@SA_CG@;_ia6U>C)Yt0va z0oGyQZ&>v-sI_0SmkS$JTmZIofYXW`R5JOs*d%oTt&BAy*ogqn7bNgAc<`))qTbNI zQC{D)Tc|UCKH*`QXgAi5O{>t15>>FPw0rGQ=j>+S-emw0tBHoTZW8$?e6g*z z5e0(H!tM5~Qa{noXpt5Z0{dl4Cv!679eqgPU_{0ce8@ky?T~u15#10sXRqZi*dLrh z!=jK@ej1jqv&_9M(}dsgivXql+rP9_3O)=Wq#)pN?1L_%`OcNxoW9E4Nb*_96pU312WC1` zgdALz7#vE`p!Ly$s|rYyfaeBv)H_n+1nx5 z+Kr`7{;U1PDjIwvPwZOm+k>Sqphk76_Rsd9y?l;cnGCNP|YiQrc2ZD5V#9gh{0|xJ3@HuZX<%72=2u)1Z$v9 zW@=gQ`q7O1K}DMMUn0Dh)~O8#23n%X#*QL~klPUBB~c?hA5FV0NJ(m>l`~?|Jcd{V z^?a9ajU@dsY82T!7U3(P>$Pq_U2-NSQ)HvXT7%W2JFcA$r? z&p*~UF%5In(NryYA{661f~Y>}e#9Vvh2@1K4@m=XKMcS_!g2mTj!vondQtkZf6>~G z80Lqt83b-_y(bU|JwyiP`XC3gOgn|xfu;98DyS$mGnIeVx1oXbxf~my$vPXJAX`g* z7$(J0MD!tOML-+7i}*zOA}QA|rFR~IW&=ADX=buSe)3qp3Ql2Vo+tS9rP`TLY#7dJnNDxw)hlSPNG zG~bi)sh|JpzVv^T3A%uk2=?+>C%UAuyue>LaisQ9D2$ROM4hs+hG{gZ&CAFMJI)#r zkkfby%MhIAhwq;yaes=&@QpKeKL3FOu4uM0#+`OdiNOK9t*fA>Nd?jT#nUJRf(K8Z zHS$F#7fNzG9g^d3Ck?7+kmx$spIV;tPxu(ok>{}t!BymO->HStQv5tF#h(gB{#<`y z^L0SO&RvhaAJYK1Ra+rH47q(Wj4*S+=A#YLOTd{Sc$541TuC`E!D>)*`popzFGKn5 z@)56KMQVktAR6!QA_;;Yb4~k=;>xz{VJp0mMrk`oA3h@1qC^J~(}L zqtyEM1Fbvx$7d5%uOY$f{EufVa^Aqlh@pQA%Mkpx(`Og(!{^eap?@nl^!J?4x4jPN zaYIi%_$EUS2VOK<<40c;7<~!HegN$Mz!M+bDn$ST-4C9W8|kD9^HL_c7`La>4JW!7 zS7q{o3-jhiEG!ps>|+odML^Dx>OTRmq6$(}4)1>UBtLZ_tAU(m(k2KaHUybM49oUH zOJRXB%{H>*K$@MFKys~g1h#ENIhJ=Hi4(vQ2TI?e^(t*TfKK+pb;cvX|k>AlO zR%=R(wt|V8adL!351Np05oSSFco};cF^)e%u@HPIhsjm}6w+Rszx?O|$t-?EJ0|U8 z9#~lpJ$6`F^D?r*01?gr$1g3SvV*}{TEs#E$C;ouj~HWhI%%PSNlvMfmwDaARH^5Q zeD}oyLC;TKJbq^*u)f_UYY4?1n_Oe_m^w)L{fG|wu?B)fzUPTRT;zvM)^QaM2Ky!K z0$;FTopCGEO2jRKQc=}O2@E*L7)$TaIR%ZSHhAFx;_yzVSBiF2P%jTZy^_B_%&nJ9 zLIJ<;(xx4a*i!VQLbSe7w+=&{=t0NFC?Og6@1wXg}gj3mEXFd zy>1uCIkW41ql@xsLR-uIQ?pWy;$(wOKcKl_do;aKOhz#0H=6}=@ zXYQDrtc>rDdt4tBsjNHxdR#=$5^V8MEulK%re;qfR5YMeGZSqI z6Z3d#ps_TaraSIo*(36xmVzCQ@6mK?JQ+Zm#=n@JGCM$KOSrBbKUO^&Z&|P@P)B<3 z`SA>_XVKY`qz1Y*Hk~c``lJYbXuGw$GJ|!x<(91Avn>JM&{XK-T^M|VHnM}ykLPgf z&VtFhZXM9(220^BF6=Gt@jUFTN&vM>k39RlZu;a9xy+^?-z7ojtqEe`hKzv^J(HqH zsfF#l^Qp?&qN2*`X=Cqz+5KG~xcubF+h}jLJN8}63_qBr_f4Quj8Q!j+b=&cAMSVwqL2q3i1x;B13uzJIB<@{ zo&eOu1E9iI*wiz~Dp=rT#qDUemo9cfCeG=pfCnF3w`g{|Ix4ErM>GS2UfC^~ETvr@ z0juO|<>%EG68%QgU`h}Czq;!BI{%Dn>E*`VKj`+aY?NLGn|J%0-TvlpNv{!%fHg(C z&?$Ah)dz>LAlEp(#)1^2SG25iG6(9_NP2~L=>vKVjRa|V>`k~3!{sN^L2Gh`BLr9D z;_xZ}-2U=-MfILeE3MpOq8FBbr_W+_;T<^$2ofA#yUWtv>1u*YXIh)R#R@(hIX5ETaWNUB95X3;Gu{xy5&CtbI6yAHc2l7I0mkTcG#kt|`9ECT3&#brZ zcR{?8x6W>ZTvlF-o8_&ROd+oUw1iQOsOkXq*ljDi3_812++YEE)NeX-KEEdpx4fBU#nMS=EDUEQ49qLs^aftj0lg`lvpAMDHse))x=y zO@6&;L|-C7Eob$A^zx_-*O#SrI zFJ!9p_^%N3X>KLSQhZ^KxK4hj{41HPPTng23;xf7m#GRBs$LR$T2FG*-ZW z7&a`>XQ4h9MCdcG#GgB}FV3&d8qF)j-`OAQ()_x-5nbW1u5d_K93r3n0O8;<4TAJdzG9uuF zPI9c)+n*;b zIt;$`C1alg8O3hwGkp3D09c&JpU068#F&iz4U01)78P2P!VX=)JNjgdHq~-u9fLrD zpbxskl=y^~^|;kYZ5xPrukyEBk@APFa7gL(w$repoVt^k)ck~(WRb=FYoY=7$PgLSY#qnkbae4zp8iLs4?fU#D@}n4{9%H zM~w4^jq`?#3;f0fBgV>MW98tAhCyTHka4@;xP4HO0xn@hS1_zA7}8Dg>!yt8W(@0Q zyt=@@XuW??!=P@)kZ!wQw|zv{G^}eH(%JkvTkon-L&k`qc-T-pWH9*+rV&Hgu%YbL zsqft7U*9-rC>t_Z{RZpET0`rwp>@dM@EaU(E~C+pXmW=&xkH-Ce$C_&&D3Gd)WOn* zch&>I|C*^on(cng_7P3fu%>B9WAkflpbABN?+Q3sg*h)g&!4}%m{(Tj^SpjXUV4Y{GJ2Cgrur4wHb0LJnzu&`b$U5@`zM zAPI#Y>M?_6`B(~VE)Pt(415n+um@*I&_bofU+c26-C?F#3>E&2ra8bryqf9L7)~^t zv>dmbzjH`a!yr)Spl~s3?WOE}N4+@WHh#Ii#>Ze`azL=~hn3JN5-kU|x8=+=ts2 zDWOf8rc?N-Sk{4H4+2!97>~I+PaR%?9}5ZLXc)I9@O_H#i0@;hkAb`Y(s5|uypF=Y z{m|^VQ_)NaTOs!ZakDE-%`-sFvlRokuD>TN`Xy8m)zaO2hwXL=H4}{_O52Zs5^9(E zzdoCnaR}cV5zwJUDH0-Br{HDJ1#*L>e9!yoT>IDp{?>CTkRKd*?u;PBbLR^--}ubn zSV|D@$uwDPbRg@IoHZUaQ6wHr4Ax@79njXe{4c}wUROFE|E+`IHTYEv=)Rrp_t?EV zAm;Zx3RQb$qe;AcX&P^N@dzc{ZrAyv!0`450@1RGb5IKiwqj$I-0e%@+XrS!nbJ9= zji(28Zkh`ew>u>oYcx#bD99n~bt3{&cm+0vU^g~3m73~!DGlO}{}{~S>)yO)V8(ZL z3zN?Vt6mGqLwtKc24G=LCrwQ=C)D+gj$RiT`?!Nl!;Ckzg5FS_D4+uPf$&dOQk zv!w&vcd*qQ$)`jdG%iLC_wXy<&#Q?xgA_R8G=z&;C`Veg~Zi7@b%4*0g!KCpCY zIevmCyq39(c6KC>1xQ2{v%6qF$`+u0s{n{fr+Xiy0b;B+o1}}&*oQ!xcPwv@vWm)9 z=I-o>p5497Pra5SzgIEv{A)I0?C|;8H#&Si2YrZo_)Ll4Jt*v2B%yIa0i)-Em!Sp` z$l=0z|BvSL58h~uZA9{Aa`^gz5zM7Ob~zGN$@!norVaetoA(Rw9k63>t;$+~#fOk~ zB|Jsg&i{O?Y}WH&e{3~UAxF3XJZ3pG$w@PlK6_6B(izlucK_lZ2znvw2M!~=P_JdN8J>dN3OM(y0m4ZfC-kv})$$B=SJUGT| zGd^uWKx2CpNpOJ4KG;@7Y(wxQmXYW*&;ikCpo!z1NJJMm#|c&txPME2N4m^No(FO# zf$zh8N5NnG;diDrB7ZxAyO0xyC%Ud*DNW}FEJW}Kj?j4(kvH&}KmII^qUQ{-a(?Q( zu^H#nxKlH77@M)HG&?R~6J!~*OotzsVn4>YOi_z-r<(3J((NGl;{vi93V!yTEui9` zy<5i@{Uokt5>x~4frBZ=*@JhH!Yx6}kdmq})8HOXyBn{6bhg{1i`x$1`Hq4g`$;zO zT%UPISy^eD*X3j_fMKlwLcF-{-83D1+h6uR8WrYCVYvl4(r4ec#v|_*=-PpBa9oY8 zlcF%6_g=QH14#X0q`|vEPrX;W_5oDg*jFoOV}}##SgW<&(IuS|UPX$21hf(!!ly*vDxFQ5!b9|rYdJz>tz7NX~e1hbeyyAnTSYo!1Cgp(ZgJGc&E#_Lh zsD`^`@U14;{)FaK*j0=tP=xUY4Cj;hT{X|`u47IP^ow6?%Ye(6-}~9lB5eCMca1wy zRO~e+odx5d4Ps5AK#a+9i3P%%N7*w-DXU z`-Y~QqYMKJ69AbXLh9QJaR^Bo5zw%}ckST|PyoK-fBZ0wUmKi~*jv|ICs7=cM5q;) z@n?ru3EliJ!_%V~LYM^6`W?~aJ=i3If9I~B2ZEt{zz}Nq7eC*!K1v5g?M6EsI(T54 z2bKm4(broVd~+XmvH)U~U^=P%nm_Q3g+6GcnyY`YE%!K*92&2Q`>_l`oK)@1FH)p| zxL?wO>jTR`@h^LXY_vLd0I9FQQ^02g9PwrT*2q*}suGX~k)jbOZeuq0Azm^YAQC5y z@8gQ`-}?E+mUIfZ#xjIDNH&b_lDcpzXiIf`<%bz6_`?BUh`jZ~l7=YiX5%GeXOQ}v z+S6GiMv$xIfBLXeYW{4{j!weYbv_YG)_r}e-@t~>V>1YfmAw7usoeEZzSPutIUju2 zIPmO8Yve_*gI=Y>c1_rB<0zKWBKK2V7e;x`C;3UV8YUp-A>pwBfC#Rkm$`Rmw zQrb|!i5%<>U~$-s>0h=3s(C`^)_L%CzYCvasV)MamCAuPK2ZyJ15oh726&}{vRcW9 zq&(8GawA{+s)66pm&EV7LS?ER1tgB*XpgJxRz9x8BhnNFY?tGq75ZF{xdN=8kp~Yv zlX_I%v>*~Ty9(Is8hrSDHe4IS6Gbc;`-VHRYl)F5BHH6p=BE#MjirCWcD7U-*Uf9O zVcXkKW_@f=3&$8%U!3zb7_& z*Wc7;j%f3TwfR?9-H7v7ZXVR;4{5jfwOdBC4a3@oA?*&oc1Q2Ze@W1X_ObC{8(GX+ z{Qn)a#q3EOpi2lY1Mp1Ho-T9{BI%c11F}|B-^KrO^^JZr_5E2jmIz1<&jg?u*#Vd? z@DF}9vz1{2MT~{7&O2O?-vpTe+TQ9e^|ZN} zx49Gk#01V#F*Q&OCrlkqH~}hkx~-TcNaS@l^Aj+aE5^VVfSHze-^>$q{E?f5J1|=d zCvy_NHm^7EM*=W{lV$_u9E<^iPOro1DfQxC4S@#m9u!_opx`kil&z_hPQ5&k7|!{1 zh7YG9!wd5aZxgT#1b9b);pG5^87VO_oV|4S8_)kka$#PAS2=hVd8HxBuDLk~V z5aEW%O}&rdfwib4#nSyCR);1L2l?f7?p8Q@mF{cRBUM6^)#GTc!X!tJ+cimnjRu^r`>8T^SppvEK< zWr8RXLMaN`d(!TP;SPi0mVjZH&oFXl7?V@nOwlj}i4?C<1Vv#E1ueAX)51&3BE#i} zoGZBqjCJzD!oI(&7lYw;I_(wg9Uz2$$UOg@ulvoMdAeTuH!8~<9RGh*wqfx0{|8R} z=2YB<^>Sh6Eg8ZuVr259BRRL^RMez^w_Ebrhy@TrVgcM#K-@ya0SMu+ple|6A1yJ} X(}+Ti6aYdLSTO1KD5Rwd6omaBdti$w delta 16126 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 LOLaF0uygxgDY6v- diff --git a/inventory/migrations/0014_payment_refund.py b/inventory/migrations/0014_payment_refund.py new file mode 100644 index 00000000..4e5748f9 --- /dev/null +++ b/inventory/migrations/0014_payment_refund.py @@ -0,0 +1,43 @@ +# Generated by Django 5.1.4 on 2024-12-24 14:43 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0013_salequotation_is_paid'), + ] + + operations = [ + migrations.CreateModel( + name='Payment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), + ('payment_method', models.CharField(choices=[('cash', 'cash'), ('credit', 'credit'), ('transfer', 'transfer'), ('debit', 'debit'), ('SADAD', 'SADAD')], max_length=50, verbose_name='method')), + ('reference_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='reference number')), + ('payment_date', models.DateField(auto_now_add=True, verbose_name='date')), + ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='inventory.salequotation')), + ], + options={ + 'verbose_name': 'payment', + 'verbose_name_plural': 'payments', + }, + ), + migrations.CreateModel( + name='Refund', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), + ('reason', models.TextField(blank=True, verbose_name='reason')), + ('refund_date', models.DateField(auto_now_add=True, verbose_name='refund date')), + ('payment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='refund', to='inventory.payment')), + ], + options={ + 'verbose_name': 'refund', + 'verbose_name_plural': 'refunds', + }, + ), + ] diff --git a/inventory/signals.py b/inventory/signals.py index 77e62bca..ea65b4c4 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -1,18 +1,9 @@ from random import randint -from django.db.models.signals import post_save, post_delete,pre_delete +from django.db.models.signals import post_save, post_delete, pre_delete, pre_save from django.dispatch import receiver -from django_ledger.views import JournalEntryCreateView -from django_ledger.models import ( - EntityModel, - VendorModel, - CustomerModel, - UnitOfMeasureModel, - AccountModel, - ItemModelAbstract, - ItemModel -) -from django.contrib.auth import get_user_model +from django.utils import timezone +from django_ledger.models import EntityModel from django.utils.translation import gettext_lazy as _ @@ -73,25 +64,22 @@ def update_car_status_on_reservation_delete(sender, instance, **kwargs): @receiver(post_save, sender=models.Dealer) def create_ledger_entity(sender, instance, created, **kwargs): if created: - # Group.objects.get(name=instance.dealer_type.lower()).user_set.add(instance.user) - try: - entity, created = EntityModel.objects.get_or_create( - name=instance.get_root_dealer.name, - admin=instance.get_root_dealer.user, - # address_1=instance.address, - accrual_method=False, - fy_start_month=1, - depth=0, - ) - if created: - default_coa = entity.create_chart_of_accounts( - assign_as_default=True, commit=True, coa_name=_("Chart of Accounts") - ) - if default_coa: - entity.populate_default_coa( - activate_accounts=True, coa_model=default_coa - ) - print(f"Ledger entity created for Dealer: {instance.name}") + entity, created = EntityModel.objects.get_or_create( + name=instance.get_root_dealer.name, + admin=instance.get_root_dealer.user, + # address_1=instance.address, + accrual_method=False, + fy_start_month=1, + depth=0, + ) + print(entity) + if created: + default_coa = entity.create_chart_of_accounts(assign_as_default=True, + commit=True, + coa_name=_("Chart of Accounts")) + if default_coa: + entity.populate_default_coa(activate_accounts=True, coa_model=default_coa) + print(f"Ledger entity created for Dealer: {instance.name}") # entity.create_account( # coa_model=coa, @@ -156,7 +144,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs): entity = EntityModel.objects.filter(name=instance.dealer.name).first() entity.create_vendor( - vendor_name=instance.name, + name=instance.name, vendor_number=instance.crn, address_1=instance.address, phone=instance.phone_number, @@ -264,3 +252,26 @@ def create_customer(sender, instance, created, **kwargs): # default_amount=instance.cost_price, # ) # print(f"Inventory item updated with CarFinance data for Car: {instance.car}") + + +@receiver(pre_save, sender=models.SaleQuotation) +def update_quotation_status(sender, instance, **kwargs): + if instance.valid_until and timezone.now() > instance.valid_until: + instance.status = 'expired' + # instance.total_price = instance.calculate_total_price() + + +@receiver(post_save, sender=models.Payment) +def update_status_on_payment(sender, instance, created, **kwargs): + if created: + quotation = instance.sale_quotation + total_payments = sum(payment.amount for payment in quotation.payments.all()) + if total_payments >= quotation.amount: + quotation.status = 'completed' + # SalesInvoice.objects.create(sales_order=order) + elif total_payments > 0: + quotation.status = 'partially_paid' + else: + quotation.status = 'pending' + quotation.save() +