From ab8af8d4bbab0fa20b9afe9f62f1ef525d2ba15f Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 30 Jun 2026 08:40:53 +0200 Subject: [PATCH] Groupe Gestionnaire + import CSV des operations --- compta/__pycache__/__init__.cpython-310.pyc | Bin 111 -> 0 bytes compta/__pycache__/admin.cpython-310.pyc | Bin 5658 -> 0 bytes compta/__pycache__/apps.cpython-310.pyc | Bin 435 -> 0 bytes compta/__pycache__/models.cpython-310.pyc | Bin 12716 -> 0 bytes compta/__pycache__/services.cpython-310.pyc | Bin 9595 -> 0 bytes compta/__pycache__/urls.cpython-310.pyc | Bin 659 -> 0 bytes compta/__pycache__/views.cpython-310.pyc | Bin 4952 -> 0 bytes .../__pycache__/views_saisie.cpython-310.pyc | Bin 5515 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 131 -> 0 bytes .../__pycache__/seed_demo.cpython-310.pyc | Bin 3418 -> 0 bytes .../seed_reference.cpython-310.pyc | Bin 2408 -> 0 bytes compta/management/commands/seed_reference.py | 36 +++- compta/templates/compta/base.html | 1 + compta/templates/compta/import_csv.html | 95 ++++++++++ compta/urls.py | 2 + compta/views_import.py | 168 ++++++++++++++++++ config/__pycache__/__init__.cpython-310.pyc | Bin 111 -> 0 bytes config/__pycache__/asgi.cpython-310.pyc | Bin 281 -> 0 bytes config/__pycache__/settings.cpython-310.pyc | Bin 3189 -> 0 bytes config/__pycache__/urls.cpython-310.pyc | Bin 553 -> 0 bytes config/__pycache__/wsgi.cpython-310.pyc | Bin 281 -> 0 bytes 21 files changed, 297 insertions(+), 5 deletions(-) delete mode 100644 compta/__pycache__/__init__.cpython-310.pyc delete mode 100644 compta/__pycache__/admin.cpython-310.pyc delete mode 100644 compta/__pycache__/apps.cpython-310.pyc delete mode 100644 compta/__pycache__/models.cpython-310.pyc delete mode 100644 compta/__pycache__/services.cpython-310.pyc delete mode 100644 compta/__pycache__/urls.cpython-310.pyc delete mode 100644 compta/__pycache__/views.cpython-310.pyc delete mode 100644 compta/__pycache__/views_saisie.cpython-310.pyc delete mode 100644 compta/management/commands/__pycache__/__init__.cpython-310.pyc delete mode 100644 compta/management/commands/__pycache__/seed_demo.cpython-310.pyc delete mode 100644 compta/management/commands/__pycache__/seed_reference.cpython-310.pyc create mode 100644 compta/templates/compta/import_csv.html create mode 100644 compta/views_import.py delete mode 100644 config/__pycache__/__init__.cpython-310.pyc delete mode 100644 config/__pycache__/asgi.cpython-310.pyc delete mode 100644 config/__pycache__/settings.cpython-310.pyc delete mode 100644 config/__pycache__/urls.cpython-310.pyc delete mode 100644 config/__pycache__/wsgi.cpython-310.pyc diff --git a/compta/__pycache__/__init__.cpython-310.pyc b/compta/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 97dd05d924632e2e7f2d092701c5556c70b450b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmd1j<>g`k0TZlX-=vgNNq6_kYHf|0AF1bQUCw| diff --git a/compta/__pycache__/admin.cpython-310.pyc b/compta/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index 6f05201011cb2f1aeef40d1eb005da1127b5db7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 diff --git a/compta/__pycache__/apps.cpython-310.pyc b/compta/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index 871e9a1cbb1f4ba0228f95d2d41f5c1e8e3c79e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmYk2y-ve05PdqEguT--ui>=R`3dLZKYOm2ql2af!O>+i89s<@`bYNY@G diff --git a/compta/__pycache__/models.cpython-310.pyc b/compta/__pycache__/models.cpython-310.pyc deleted file mode 100644 index 92e79de986559572a9d02230b98737fce1882efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12716 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 Xdn_}S#dQS#&y9_aJux;u`S||>KRw?m diff --git a/compta/__pycache__/services.cpython-310.pyc b/compta/__pycache__/services.cpython-310.pyc deleted file mode 100644 index cbcd67545f5e67aeb882953e77311442a8d42dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9595 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 diff --git a/compta/__pycache__/urls.cpython-310.pyc b/compta/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 59866f791f56e5381630fb3e0ba07dc34f7a4296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmYk4OHRWu5Qgn0ZPUD3T3%PEkjMoPLL7h%yKW-WF>R{6WG4l32X27Gnk#wBswV)k zV%)e@9Qn_D|7h%y?IH+Vg5&Dve)HKQHuKu+m;;Ev$WP zV{9*MN;ri+w>Etk!0_Eda*zfvGUOr+!87C|IS?2MxxE>|*w6%XE}R&eB6%<~bc*D| znWmMq2;lsY%rAD>A(>NUm#kXvXbb&q!e1o1{yvB$OJu?u7noc>6-+>+M#oqe=PcvR z^k_vH&t=WiNCn%P$A(hg%z!UbCRmjec~lE2*>j|(9W!ptX43JZYRe)u?l>_z&9LnX zGi?x;EaA9S)r9=DEJPJ;5xB%AT8>+8Jd@rp>zbTi@lbbY>`>S8!#q?TY*@Z3u4|D> zfj3VS5jOrrU&}y?qh+K;zY*bS(eFV7T0#`%VL2Xm#YHZ^h?wexmcMXWWM#$hWKwxu czA5J>E1*vKt-cp|iQ*HV`ZTmc+Wnm0e@V)@BLDyZ diff --git a/compta/__pycache__/views.cpython-310.pyc b/compta/__pycache__/views.cpython-310.pyc deleted file mode 100644 index 1ed4767780fb933fb3845876b9612fc48937c326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4952 zcmbtY%WoUU8Q<9#mrqd-+j1T*kp_(kBuZKYMcO!SRXM2}#Byt?KB#qx)y_y-cF9#{ zXK9J1w>V3zJ$l;->)CrYBiTuup1bE7*-gBjzvmm- zOG>?9FX)x`%BcIilvH}vy{eIeq}HqN)tM#g-NxP$FZ0S1Yp=Jm{F;$p z;%vuif9q?U%i3-;?eb6wyc(%`h28R6gu0DUM}~{!9m%kb^i9Swx?wKSI{UvxO&n2Zgf6Y-Dxq zGj>96XY6tY*&f+)O?e|Wvbp`4y>-QyNj?r`D|sVVaS~@ZcP=+{Ma*y7KK^aHBm*pD|jKHJS3}EXJlm(dB*ycem4bWxL&wD~b>)O3@_h&n8 zw?Kf_HA~5BBrO0^?(Bz|=tSz#%lMiRqPAUOHfxy2e=c7~(*=bQK6E&P&j11`?3CEe zxRqP7slao>gIh5>b#^Reo9`3kM)sL~;*6Xza2o+z@ZULg<0)?a<=xmyCPde}XzM zUA1muZXSFN`(aiw^T?rD+vV-yr3w3Zm>un>q2wD!s+SZ{`-e%oA13XZc0LaKIqmwR zXHN&(xf6oun*$Vg!dSZ>=W*YZN$#P~X8P4|=piv%-Q3-W~fBFXg9>{F+krF|GZS)QaL8p;=R3bMz2 zbtE#O{rs3brBV0OMe1k=1Xx&R%) zMmsSSx(DH#Q)ot+6GypY<3P`BP{qA*ksjXmaCJhD2}X0|C{3EQE7OM=taAaJ*RiJp zp(Pc1dOOMn@3*3(P-a4X zkgJ2Y-h->HMW7ktY)3sl7Q@S-Qekuidspwb4&p@g!=Cuywdd@$;p$e=@vU1FOtYA1 znA48_{?(t`wsawB@1cwljBOoE$HHYGXIvnoc01Th2O~1dttv413Ot}BP%a#r_(w^U zIrQ%#OgTuQ4JK?WtPjZW&LdTOE1h+L;Bpj;DdzlBqROTgJ0;Sf-giePcu+wX_X(04b4mp1T`3 z(R23xQ>M#YBykTo$aY!#+mvRc+TTiIbk)ITq~ZZS4(qoNKw6>~BO6Wo!{wsdk3uvE zQh@e%RH$;L?b}E*ckgea*xk~8WM*ow7Cfee%m9a|lMS?QG$3_Qywit;?^rzuBb7rH z$Ty1>M5Y^XOO&=tkzgxa`z9qy<*zWMcKT^guTgT3k!Hsxi%O6()+zLLraRZmMRk7X zD>M$N9Cm*`3fWp;Au;b9DGI)Y4C|SzsOUvgxdbjBvD;FI!>kP6e>7Czd3_y zz?d%EYbcRN|I>A3g6}VIi;_gct@*@k#;q|7sz|^Tt|4RVYZTg5?# zO{#~vN|PA3Gmaj0YKc~t-Js<#;RHF|r271Xx=t!!zin!teLWI$_6xFc#!MGXuec%gE#SBzG|5_Mws_`?-B821>UAeDqf&US@v;8 zc^}2l+uCg1-W^tV!~9X}m-lvdHb2tUtyIws7k(ximduy?pA0YECpwU)X(jPK-Gx%z z^>t-)A3?yh51aR(;(p$Wd+_*_+3BSuKJ3GdOr3)E5=x=9hYXqwTVdHra-yrzY*}40 zUj~W3WLQYc;_5bAb~!v>wsR0?$li662-eR#v(>%byStm8Xk6^(rk*S(DJ4YWz7UFu zIWvlBmMpSt>P8A|PtiT2tKU4)YW6imXCIDa-Dwn*`yDOzvZ1#Q$N{Ptex8D~zQ(&@ z|1jO4z$)YY4OrIE22zHU5SE#As8e;)=?MR-6tS~8X~~Y@)S_Hv#qEPap!O+|NwVUO z`vfh8S1-}cwe!(E`E6=4Nx2CJCRL$pgh`@JY9}e7C`^((p)narhnR!InBN-ObZ`R; w=83pTe>Y_Bq6n-SqyHt4nxpjXzzNEMYgcjkUBXkrQ>(C`X_p{1@YEaZ-vtf6k^lez diff --git a/compta/__pycache__/views_saisie.cpython-310.pyc b/compta/__pycache__/views_saisie.cpython-310.pyc deleted file mode 100644 index 01ad69af42c6603562eebad47c603187df9d04aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5515 zcmZ`-O>7*=b?)l!>F$}~&+wlVC90*Bb~U@wn7iwEV_TN3NNZs2UCLN#*T^LHU^vyJ zdek#LtghzDL=TXJ${_&=DDcg;fSHrQcyr7pxtTC>4d9dOX6LlXB|t8TVO#!Qb@NBE zO|pwsuc}^Ez4yIW?^QfGSuybQ!RDRr=T{Bmzo>Ec$3o+4_>vI{ZZr+fxEZmY*))4r z(_+-NBD+^=mUP{YoSxfsb-fgMy>hdx>rPbZRh!k`L~{admwVAl-fn{H0`YRy`2 zra9A_ZO-=QnsdGR=6r9VxzJl|E@JE)ukh*<)?DHfeDaCWT;}t9n%6*C3Ceti&pt8s zS@Rs9x^L7M(l0W@sN8RdNf`KPKimqB4g>#7s0MyKI64$<8OD8ov)%8sLlO8%xZTHy zM&*Y8LEM+^zVy-F#;7gdzj4dwM~8!;p9I&Ex_|BHuoJaq&At`)~Liaden3&jY^`g~aA)lOcx{@nY>@5SkEzHUEA zC2^vV5HhEbSc=c(`^hut`o{!WU+2Z@hO zh+rT>)Ekx0pkt$MD)(;C3485G)!ysxwxf{W8w9!J>P*=jobcc41xeE04ieO-qIf&( zw?wd$LaH1r91-++Ae4tDNFDhZ6l2uOs`Bp1ipsg8rJ&re=fYAG??WHKam)KwJJe^R z4QVwf?{-IqyP*tJ`NLp4>;(^Y+p2sAJKBy#7$~;hG3gM+57o=~?%+#qq1c<2MrI63 z85=P|^4J`iV`DIxv3>S!ZE$MCI^ctDVY2L%`0AUoUpz-axiLw;KkZ zB&|dvwlVmgvRgdpEMP=JhH0`jR$~*)d@e4a`NH9B5a`o~`w$grbXnKTu;m}ZET5U& zJTOPr*x=TZF*M5sJu`XfhxRjTXq}9=xPy`Q*hsEq)_nsbtamVDr&f1y;2StWu*E%;vyQ#$wxs_6V!C$%`Q-oC}%5-B!E%s#A#nD zCwLqtGO647tWvw*4+3Rxwv#|y#zZZwyf{yMrdq}7Fm7O&Xvrc9hgF#U+`(s>H8#&| z<}vd(qK>YO7o_$ABp#qUJCPe_2W(^k6inLPl63I7BvEd0`+#*lUV@z139ZE4ZIgQk zrYw&tV`EeuL&CiLBM*+KvO!jHDzsKB?CTRg0KEjXhg+(Ydj_;qvLi@L+cpIF2DYWj zno1Mvo~oX*N|c*Bk3^M;5m^IhLYqUPW;@5mkN`=!)zr?=^rEUHW8MbX;IU+VLR7J! zc!i29wDeRGL{Jv&nfx6WH6ps5hjG{m5-~&LW;H2z+=)_{Il)kTfkB)+7jnj zC-OT~5aiEj(Q9?!ZG*@1RnQaSWty|lnGMa&LX#$Q{!iQlxkFy#_=oT?iBALGDG}gD zEHk=L*pU8PoISF{oU}88n-Vs@&-Mw5^52^)xP6AswlQ=wGug=8QH@u|j2W4oe56}d z-74{kN2d6$rc7#zE7HupYkbEWdU9qo3$yjcCNp+6Pxnu2?wfQ5KE7;>&VKUx?Y zcWKRXMm+7OOl)N3kyq@mHfE4UC98-}vr2bSd@7f^^WEjl%&g4DjG3&$XAc~Bwwcii zJSLp9ilC z`{r=E7_&BJPZ_+qt+iCkO2e6KMy~OT`z)Kre}A8?8cW8iF}jG>rG1jktn>?sROKb? z(%Cn&DM-iSm-#CP?r=_C*8Ou?t>849P4g=Uh;OpF(JN!R6>`~K)v|jvo9kYI3}1Uz zIxEAhR5gaVT(0tKSa(71`6{oYzF5>>M}4WNzk&L4QNNCQe#Wc(2I|lh@OzavP(KH( zt;$#BYZ-L4&wwB~JP!$-2W4fSJu-lZf67*}^D9Q5q{W68vIS~EQa>m(xt3iZJYwXJ zv$dxz`SDY>v!AVwYSbG13;&!(6meWEIR0C;iE>~Fg0`(-v=%)$P$3q|j_qW6EYbEmz0{YO}lVfQ=x@^$_uf9r{nt&#;mJD3eL zT+CLVn#odutGE9YuH+lp#cX~#p9w5HDm^vDtzy>avy0H-pJnqXzmShZ?VV@tpX7Gd zuIBll^DiEhhCc1=J6DF6!pzkoJY_vvcC^CHsfcQ=&%t$X($?5!3tMIKGG21WSPcqn_3zI|}{ zn1e^!T`M;VH-jh&l%XbjdFiV*iUTqmOdtqU{A*!RsH^L~EGP{@UVOi;v!y4hG)tn>06RJqB+ zjwFfQ`X+IuC6IPuV77o|IK>gy$v8$qA?3$6`S*=-$%7s}af$#(i!%+ZM^ zcM(`n;-r%q#okobo9pX)_IhLeO;rvkvr3X6sJnSc=j7Yf(VX&5SWZ$J(F%GP3w)`W zyje`96iYdXFJ&t0CFK^$l&YRx*xN~Q0LlewNMIhf5D`jB>RJz_@@Ts)x!X=DGW{6r z0-t1j?hj>*Wa>Cq+cWD8RgPN6mQjt)sJRlI%EOBg8&Ue9oJdQCW)*N&C6KW2G?u!S zwEM}4HPj&z4UBJ~OMHxi(j?8sru{1Sn1uxfe}I2VE)x0(|9?yPcM-Mr;tBxS*icsy|M+0Sh}BG~2xWmw3y z7SVTE_jt_tUCpwY^V~DfgR5grVEpN?jeL3ySsB*GuZQ|FJIBs56W_%DFIR~BJoq`3 zaqAr1d2TKLkUY#_8@~0G! zZUqTHn};k@ybE;14N4yI!jeOI?L}e(fyu)LSjBj;ibWzENKw^_LCM2d$WAJg+?WW- zFt3;g06Upqo(a>7g@&s(0F5@C1D~e8+OBd~Q<|zzbw-a`qx!wVy9w@T6x^b~M|*DD WsJW0XG*M&M&5Gl>m5Mnz#eNU4De*4= diff --git a/compta/management/commands/__pycache__/__init__.cpython-310.pyc b/compta/management/commands/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index bfc5c527b93d6d7309bd7555e9ad79a7668d1e0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmd1j<>g`kg7>$avOx4>5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Goa(-?>Nuqvk xVqRi;YHn&?i9S#S$V(~KkB`sH%PfhH*DI*J#bJ}1pHiBWY6sF^%mgG@7y$Js92fuq diff --git a/compta/management/commands/__pycache__/seed_demo.cpython-310.pyc b/compta/management/commands/__pycache__/seed_demo.cpython-310.pyc deleted file mode 100644 index 03fcc9299e8a3faba87684c44622124efd1250d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3418 zcmZu!OK%&=5uP`P!aVLxQK@7} z@cZ*W*ZZ5(lJs{zIsemOvI<{30D`2Bgk+@na-eh+nU7Up4YZCX#+t7OM#m6i-OmMP z#|-kFd|-8~pwKA<#ZECObxJ|GQw}Pfir_Q+sbIP@ElXcWD2L2%C1hgbwc43M`L2Wqu%(4;Gz9Zj4|pG+`|NiF8;<|JlTVp9pl6Y<*^fj;p3wq0#(+t z*a4?Lw+FB2eiYh)6T-Yccm>>`3gIBKj=_7WCbQfIcD=yyVW=U8V)$EFcVgU(0uVzr zlUc1(Cz#O`PO#j=%m-H7^7cY}G6QA8A7-w()I0DfW~DZDXhKgo@;i9X3-Hqe2M(Hc zMfAy;b1t{){7-?&Dtz%g5G-|M0E&X-j*1kdek*k}q`_tCEH|+?SpvS3OLgq?k-7$# zbpDpF;+HrW__*%MAan9tfI$(y$MD5(;CL#fQeTEod9938s`jo}RhZ{SCbhU^s--zX^G?!YFoeLA5D!Mq~ znHM|@=+Z<_6;)4pE>Czq5j>y5S(%yKE3!_20G6v`WeLh=ZCs1z4%i)_h$C31fxIFx$GQt zbrKD3yOFABaX}Js&7+!-{sl;1JJitiL&z?tQa6NDRm7P~)rFJ^r!5Jo#{ZSNIg#SA z-BtY35fJYYR(iP8Xxv<0xpn)_ z-Fx?I1~cIaPu^&cIH9`_S*lA999E%D@{*4rQ}mpKvI_^8#5jQL)%CqyOdJ|{1T!56 zj_0$fFbM>=2YJGAqoAfRHH-pg3UQytHMOR^&#$=ww%cnvTf>SQg%nO-bzrI9Bd}X; z(*${uy_EzWSP%TQH!`>H(i|9+}L+NwE2Lwp>eyxA25>}HG?$x z(IV~^5tWm_G{TDwEz?PtwqtKF_GFfGP@k7>~M#bES+BQItuV1ucUE|}b9xk;xcat6~xl9OE~KWB2A znG@*7q{dIOGTtuayX=}Y{xY~Kmn;f%ecm9&OzweR5fa2yKs{4mfL+QUIg-d%!1(@Z zmd2K{W{oG?C0OA-SiE%Fwm}cajD1-1G0#x(AApo)Ls4W?He^j!WbNP92Q62WE!C8* zkCswaE-9w0eEeTJBi6NlRf}BG%A`Mlv<@0!UX;xbrmFnjP|7ea%GyWcgQ1n-B#qBL zzzjIyq;oTK!Z)uE%gxOCdS>o6JbSa-4V?gYyUgl#g9t(A3gcq83lHC)>}Zhq2jn;4 zmk7%_(&1}mAUrw796F{1mMCIvyEe;m-7bn;(3nG6Pb)wMWe9Lcq3IM5W0z6i3HPG9 z8xdST3wC`MnqI>HCt;=RChA}z_G1BWfz&e)W>DjxCLFOD=xQfoqTA*d2xnv$SpQ)Q mFJ6%_`<#0m1cdv@%m-O)e#NU&%stkmB3x-vSyYPJocbS6?9V#@ diff --git a/compta/management/commands/__pycache__/seed_reference.cpython-310.pyc b/compta/management/commands/__pycache__/seed_reference.cpython-310.pyc deleted file mode 100644 index bacd0e648fd1e16603457805dc1004af2c77b650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2408 zcmZuy%WoS+7~l7c+@3N&$@s)xE&lICC)ttLC;WUYNTGqa(! z))G>B>7h4HAf%R4^EYtxjlTfR5l-dI2_(WdyDmuuE6umx%=ep_?>*_{q^rR9-5)Ex zxS}Y($;t6gN^iknzW~8XN5LxAA~n`Jnksoc(qp4z6uc3cvDL9+yJN>r$59pH^eRNd z=DrHlDyUshr=XRBy8CL^2BZs^iDIQ%(8+>M74$?wr^m<%K+Y5^CkuM2p#MQ`>z(Sh zf@gnJJCpc4p2KIJs-3Aj3Ol*xfcV%85FZ_Er!*w2=KcE3w;n?Y^KhCZqXPh7 z;^EOjoYvjDn8f{*lZ1OWJU04?dZQN}B@s#jLOqgreVXDd;9;70s1N5eFW5o58S&zf z5ee?48LhkSLxw=V8(#kj-vMll5}4QfPdr8l_9^KSO5jZQHCUt6RAJvHK^UV5*ohUy zNHdLL53cFLT0xY=L{yrHlfnk!EQ1DnAtwWKu~A=I5ZblHfxcK@5LRPhX>nmenAfi? z$ls?+@E@3s#d-r!R~97d8c3I}O6k%ykP7qiVgn>*<4XN1fR-)~^hUi=tJaLcnN9En zIER#Whn#ucFbSD3_oQI;wJNnY26GQ6VH_210Wc$UFANBy(;!}btrehb4u1D!ARr8p zN4S?}Jd7gni?A{2lZ25~I#Xg#me_Fgipsl5TyXRhEU!{2tQpyd@Y@(2M5BWsjpw~C zI6et^2Aa%6XoD;U6$_QhZLjrW+u)s5iozo1l=Knvc2X)+Ar6BuB4emgLQgGkL5hI$ zAswQ08xSNKBg|3)0?5p7f?Bb5YdE; z#nS!lK*r+DC!H8L|nGd2gE3yq8VNd2rOJ>NQtXSC-dW_gd?IW1(@C%Cr=Ay452A zXJR_*V`vF}O8tNm;Dmw0fD5;|ywSRIf9-B-oys&7=GPQ@g|OEjHk+;Wb)iQjsZ9%u zaSSCWOvax?MCf3$u*RO$(3a4^YdSblXdEUy7CI7nztVN3%z zrMic%=D_M%)jBjZdJ}*FjJH0S<+ot4vp|T_QQR3c%BZLzCH<}mAXGA_7wR#|X;hRtP8aeL6V6tCvC0BYX3~gUN#|m7p zwrhH!KK%p$v mouvement neutre (hors calculs fiscaux). CATEGORIES = [ ("Vente de produits finis", "vente", False, 1), ("Prestation de services", "vente", False, 2), @@ -35,6 +35,30 @@ CATEGORIES = [ ("Virement interne", "neutre", True, 5), ] +# Permissions du groupe "Gestionnaire entreprise" +GROUPE_NOM = "Gestionnaire entreprise" +PERMS_COMPLETES = ["client", "facture", "lignefacture", "depense", "paiement"] # add/change/delete/view +PERMS_CHANGE = ["entreprise"] # view + change (pas add/delete, ni gestion des accès) +PERMS_VUE = ["categorie", "bareme"] # view seulement + + +def charger_groupes(): + g, _ = Group.objects.get_or_create(name=GROUPE_NOM) + perms = [] + for model in PERMS_COMPLETES: + for action in ("add", "change", "delete", "view"): + perms += list(Permission.objects.filter( + content_type__app_label="compta", codename=f"{action}_{model}")) + for model in PERMS_CHANGE: + for action in ("view", "change"): + perms += list(Permission.objects.filter( + content_type__app_label="compta", codename=f"{action}_{model}")) + for model in PERMS_VUE: + perms += list(Permission.objects.filter( + content_type__app_label="compta", codename=f"view_{model}")) + g.permissions.set(perms) + return g + def charger_reference(stdout=None, style=None): for act, urssaf, ab, vl, sca, tb, tm in BAREMES_2026: @@ -47,14 +71,16 @@ def charger_reference(stdout=None, style=None): c, _ = Categorie.objects.update_or_create( nom=nom, defaults=dict(usage=usage, exclure_calculs=excl, ordre=ordre)) cat[nom] = c + g = charger_groupes() if stdout and style: stdout.write(style.SUCCESS( - f"Référence chargée : {len(BAREMES_2026)} barèmes, {len(cat)} catégories.")) + f"Référence : {len(BAREMES_2026)} barèmes, {len(cat)} catégories, " + f"groupe « {g.name} » ({g.permissions.count()} permissions).")) return cat class Command(BaseCommand): - help = "Charge les barèmes et catégories de référence (sans démo)." + help = "Charge barèmes, catégories et le groupe Gestionnaire (sans démo)." def handle(self, *args, **options): charger_reference(self.stdout, self.style) diff --git a/compta/templates/compta/base.html b/compta/templates/compta/base.html index 9bb265d..7f34b1c 100644 --- a/compta/templates/compta/base.html +++ b/compta/templates/compta/base.html @@ -54,6 +54,7 @@ Déclaration URSSAF Déclaration TVA + Saisir + Importer Admin diff --git a/compta/templates/compta/import_csv.html b/compta/templates/compta/import_csv.html new file mode 100644 index 0000000..6ba137e --- /dev/null +++ b/compta/templates/compta/import_csv.html @@ -0,0 +1,95 @@ + + + + + +JB Compta — Import CSV + + + +

Import d'un relevé (CSV)

+ + +
+

Format attendu

+
Colonnes séparées par ; (en-tête facultatif) :
+ date ; libelle ; categorie ; activite ; taux_tva ; regime ; montant +
+ • montant négatif = dépense, positif = vente · regime : nationale / intracom / import (vide = nationale) + · activite : vente / service_bic / service_bnc · une catégorie « neutre » (TVA payée, Urssaf, remboursement) n'entre pas dans les calculs.
+ Exemple : 2026-06-25;ALTISSIMO;Vente de produits finis;vente;20;;168.40 +
+
+ + {% if erreurs %}{% for e in erreurs %}
{{ e }}
{% endfor %}{% endif %} + + {% if resultat %} +
Import terminé : + {% for k, v in resultat.items %}{{ v }} {{ k }}{% if not forloop.last %} · {% endif %}{% endfor %}. + Va voir dans les dépenses et + les factures. +
+ {% endif %} + +
+ {% csrf_token %} + + + + + + +
+ + +
+
+ + {% if lignes %} +
+

Aperçu — {{ lignes|length }} ligne(s)

+ + + + {% for l in lignes %} + + + + + + + {% endfor %} + +
#DateLibelléCatégorieTypeTauxRégimeMontant
{{ l.n }}{{ l.date }}{{ l.libelle }}{{ l.categorie_nom }}{% if l.categorie_nom and not l.categorie %} ⚠️{% endif %}{{ l.type }}{{ l.taux }} %{{ l.regime }}{{ l.montant }} €
+
⚠️ = catégorie non reconnue (sera laissée vide). Vérifie, puis clique « Importer ».
+
+ {% endif %} + + diff --git a/compta/urls.py b/compta/urls.py index 17229a3..cc0d9ff 100644 --- a/compta/urls.py +++ b/compta/urls.py @@ -1,6 +1,7 @@ from django.urls import path from . import views from . import views_saisie +from . import views_import urlpatterns = [ path("dashboard/", views.dashboard, name="dashboard"), @@ -8,6 +9,7 @@ urlpatterns = [ path("declaration/urssaf/", views.declaration_urssaf, name="declaration_urssaf"), path("declaration/tva/", views.declaration_tva, name="declaration_tva"), path("saisie/", views_saisie.saisie_paiement, name="saisie_paiement"), + path("import/", views_import.import_csv, name="import_csv"), path("export/ventes/", views.export_ventes, name="export_ventes"), path("export/tva/", views.export_tva, name="export_tva"), path("export/urssaf/", views.export_urssaf, name="export_urssaf"), diff --git a/compta/views_import.py b/compta/views_import.py new file mode 100644 index 0000000..ec83fe7 --- /dev/null +++ b/compta/views_import.py @@ -0,0 +1,168 @@ +""" +Import d'un relevé d'opérations au format CSV. +Colonnes : date ; libelle ; categorie ; activite ; taux_tva ; regime ; montant +- montant négatif = dépense, positif = vente (ou neutre si catégorie neutre). +Aperçu avant enregistrement. +""" +import csv +import io +from decimal import Decimal, InvalidOperation +from datetime import datetime + +from django.contrib.auth.decorators import login_required +from django.shortcuts import render + +from .models import (Entreprise, Client, Facture, LigneFacture, Paiement, + Depense, Categorie, Activite, RegimeTva) + +COLONNES = ["date", "libelle", "categorie", "activite", "taux_tva", "regime", "montant"] +CENT = Decimal("0.01") + + +def _dec(v, d="0"): + try: + return Decimal(str(v or d).replace(",", ".").replace(" ", "").strip() or d) + except (InvalidOperation, AttributeError): + return Decimal(d) + + +def _date(s): + s = (s or "").strip() + for fmt in ("%Y-%m-%d", "%d/%m/%Y", "%d-%m-%Y"): + try: + return datetime.strptime(s, fmt).date() + except ValueError: + continue + return None + + +def _activite(s): + s = (s or "").strip().lower() + table = {"vente": "vente", "service_bic": "service_bic", "service_bnc": "service_bnc", + "bic": "service_bic", "bnc": "service_bnc"} + return table.get(s, "") + + +def _regime(s): + s = (s or "").strip().lower() + if s in ("intracom", "intracommunautaire", "ue"): + return RegimeTva.INTRACOM + if s in ("import", "hors ue"): + return RegimeTva.IMPORT + return RegimeTva.NATIONALE + + +def _parse(text, cats): + """Retourne (lignes, erreurs). Chaque ligne = dict prêt à créer + aperçu.""" + text = text.lstrip("") + delim = ";" if text.count(";") >= text.count(",") else "," + reader = csv.reader(io.StringIO(text), delimiter=delim) + rows = list(reader) + if not rows: + return [], ["Fichier vide."] + # En-tête optionnel + start = 1 if rows and rows[0] and rows[0][0].strip().lower() in ("date", "date ") else 0 + lignes, erreurs = [], [] + for n, raw in enumerate(rows[start:], start=start + 1): + if not any(c.strip() for c in raw): + continue + c = (raw + [""] * 7)[:7] + dt = _date(c[0]) + montant = _dec(c[6]) + if dt is None: + erreurs.append(f"Ligne {n} : date invalide « {c[0]} ».") + continue + if montant == 0: + erreurs.append(f"Ligne {n} : montant nul.") + continue + cat = cats.get((c[2] or "").strip().lower()) + taux = _dec(c[4]) + regime = _regime(c[5]) + neutre = bool(cat and cat.exclure_calculs) + if montant > 0: + typ = "Mouvement neutre" if neutre else "Vente" + else: + typ = "Dépense neutre" if neutre else "Dépense" + lignes.append({ + "n": n, "date": dt, "libelle": (c[1] or "").strip() or "(sans libellé)", + "categorie": cat, "categorie_nom": (c[2] or "").strip(), + "activite": _activite(c[3]), "taux": taux, "regime": regime, + "montant": montant, "neutre": neutre, "type": typ, + }) + return lignes, erreurs + + +def _creer(entreprise, l): + montant = l["montant"] + if montant > 0: + if l["neutre"]: + Paiement.objects.create(entreprise=entreprise, date=l["date"], + libelle=l["libelle"], montant_total=montant, + sens="credit", categorie=l["categorie"]) + return "vente_neutre" + client, _ = Client.objects.get_or_create(entreprise=entreprise, nom=l["libelle"]) + ttc = montant + ht = (ttc / (Decimal("1") + l["taux"] / Decimal("100"))).quantize(CENT) + annee = l["date"].year + base = Facture.objects.filter(entreprise=entreprise, + numero__startswith=f"{annee}-").count() + 1 + numero = f"{annee}-{base:03d}" + while Facture.objects.filter(entreprise=entreprise, numero=numero).exists(): + base += 1 + numero = f"{annee}-{base:03d}" + f = Facture.objects.create( + entreprise=entreprise, client=client, numero=numero, + activite=l["activite"] or entreprise.activite, date_emission=l["date"], + date_encaissement=l["date"], statut="encaissee") + LigneFacture.objects.create(facture=f, designation=l["libelle"], + quantite=Decimal("1"), prix_unitaire_ht=ht, + taux_tva=l["taux"]) + f.recompute_totaux() + return "vente" + # Dépense + abs_m = -montant + if l["regime"] in (RegimeTva.INTRACOM, RegimeTva.IMPORT): + ttc, tva = abs_m, Decimal("0") + elif l["neutre"]: + ttc, tva = abs_m, Decimal("0") + else: + ttc = abs_m + tva = (abs_m * l["taux"] / (Decimal("100") + l["taux"])).quantize(CENT) if l["taux"] else Decimal("0") + Depense.objects.create( + entreprise=entreprise, date=l["date"], libelle=l["libelle"], + categorie=l["categorie"], activite=l["activite"], regime_tva=l["regime"], + taux_tva=l["taux"] if l["regime"] != RegimeTva.NATIONALE else Decimal("0"), + montant_ttc=ttc, montant_tva=tva) + return "depense" + + +@login_required +def import_csv(request): + entreprises = Entreprise.accessibles(request.user) + cats = {c.nom.strip().lower(): c for c in Categorie.objects.all()} + ctx = {"entreprises": entreprises, "colonnes": COLONNES} + + if request.method == "POST": + entreprise = entreprises.filter(pk=request.POST.get("entreprise")).first() + texte = request.POST.get("texte", "") + fichier = request.FILES.get("fichier") + if fichier: + texte = fichier.read().decode("utf-8-sig", "ignore") + lignes, erreurs = _parse(texte, cats) + ctx.update({"lignes": lignes, "erreurs": erreurs, "texte": texte, + "entreprise_id": int(request.POST.get("entreprise") or 0)}) + + if request.POST.get("action") == "import": + if not entreprise: + erreurs.append("Sélectionne une entreprise.") + if not lignes: + erreurs.append("Aucune ligne valide à importer.") + if not erreurs: + compteur = {} + for l in lignes: + k = _creer(entreprise, l) + compteur[k] = compteur.get(k, 0) + 1 + ctx["resultat"] = compteur + ctx["lignes"] = None # import fait + ctx["erreurs"] = erreurs + return render(request, "compta/import_csv.html", ctx) diff --git a/config/__pycache__/__init__.cpython-310.pyc b/config/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index a49be8e2a26143958b5ea74d602ac7d4a3d00060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmd1j<>g`kf)6*HvOx4>5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Gea(-S~X1acS gd}dx|NqoFsLFFwDo80`A(wtN~klJDg`k0`^-@SxbTRV-N=!umCv@KwPW?BvKes7;_k+Kr~YhV=hw^6C*<^Ll*M_ zmK5d`mW3c5Q!_&pYYJm9gC^@spbiE8U00iN)!e@reZmIho0cC7Jnox5Qk$ z9R1w=wVN;31(i#6G9G36KE5=hBP%uCPL zOU^G!)dLw;!~`_{7JF)5S!NN?I4+?2l+?7u(wvf8+(`DUWGLbUDg+b1_#kHMgY@ea eRNmsS$<0qG%}KRm1S%=!01_MwJdAuyT#NuncuHLW diff --git a/config/__pycache__/settings.cpython-310.pyc b/config/__pycache__/settings.cpython-310.pyc deleted file mode 100644 index 918c024d6549cb2d8250e38aa9ced87f4c799912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3189 zcma(TO>^7E6$^qS#1C7R6YBNWiHe<)mQN0&S3X(nujH$vj2R zvq#FFzNb5LBu(aUdRcjjfd4+uk{s4a9?y~dP6p?2{;RZ8AgSj?T)@R6)j2~7_zccG zRh_dEdlt_hsn6%}xg+G9!wdNQSBk_h;be9g7inrit`S>hd&11d-xL=fBj5#O87U6|1vinaMB$F#A5ky% zqp(!n^TK{q`u?w9mp)r7RieQ#_KaLN8nIG9SZU}{Z}8neV+t@MA@jEdcHbvqNW!>; zNon7sz9+Hx0}}50Gy>89h`DP!es9+&v}6FjM8XpO?%RD5M8lz^-<%R{M>O{Q5O{%Y zNFzMz3G2#6?nf|LDI>16y?D0?Kt6~(?BXZ}rHLj~*SHpX1H!YI?0BOf<{3)j5e<8) zke&PloQAIgA6tSUR-U6LN~}IXPZ5Md>IlMdUja9%&9cVPEw06MM0o0uFs_0r8jOr* z`b2EZQ!J)D9YhC&mQ|{OJ}R_-tI)GB{j|`NPF`gsj{UIDjNu{ILC)QdqCjvkVb2nx z=V0RJs-Kz7^_FW}m5$YQKezsnT)%I*m7xpS>>wn zAxDv1jfZ)V;<@{Q&*B~g$%6~9W+J;YiiXr<6=ja;CBd^iv8iHrYHqi)X?MY}R;RvR zZ`xcbXOl%NL(Tvf#nj(6JUsBjGe{u@{5E)?%V&+xC00>?m zBreZN#E=8M9UnrPXT+&uudF946Rv@eaX=0{N(^}oetc-y;ywV_IHe`m4|aVpD)JdI zrbM;`wkfbvymw~}n3y~*XpeDIQsq|-0%HeJXh6Ec^nX|x-7zXKJo3rG6zj(`ws_$1 zX**0mX3^Bf_L7^e7p-6i+C6^y( zk};wIOI9aJVlo&8UQCQ_kR~B!#)MFnq1By`S(l4MjLDy37m7*`jEX2LYss})J+E>Z zm~4;w$@Mqjq~!64usFFf;T6hcU<;4FMzipAa%YD5)QhhXIH5re%C4D}&#h*aYt?$k z=DOK#yAsN_+TD7qX(ty!0n~Tnfc1UD8xFzA@&<$ue2(R(XC5 z$g)STf(NGp7iyiv8!V0})J&rW#nC=wkZ|@GldMkFyAv)r$`FEw5p2s%gcO?yz+H*X zNN$!l(S>E}r3JChy==TZ zJ?^Y&28k2%;{SHm#n(2qGtk+(zzBT~($VI*je51(u(r&O#S5KQtLtud8W83+KG(H2 z+6}X7*?fM>Uat%OM!jN+%;j@cvug@NZN6k~b|0SRo%_ga)PdN7gfBMWrLYO9;#OK! z3l!EjEZ1p4s_BqqZvECLO`Z`@*MVboL32gy&hrykn8S4&bb$_=FI26Xx!LHtuwl!s z)vZRA&ox?*yFzNJ{fjpXm2Uw3KHS_WAP>X?gAHNOltNlZ1$AC6pruqn%b^97LG$n; z&^0}$K!*5-35RfRRmP5vs<{*yUYi|~d(+6(PCqh|mD_-8GvA^BHz Nlu-fqLQCtZ{{n(P0geCw diff --git a/config/__pycache__/urls.cpython-310.pyc b/config/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index df50348c0a73ce851d3e3358f3b44ea745786295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmYjOv5wR*5VhlMlHFuiC+?&a>!r~i`(cFk&*|mDW*Eb7>W}= zMSD>#Vfmh|SHEa4TXR2?pjEeyd^|{Z@TuzR_6SH$@eV;5tlbBNpO25J{mo_hs@H>) z<&Up-<;(D*vd&1S`fi;6bH^vI(FUyqEL&M>Rh#}PcFy2nlts_Rd<)VZu6t=vZO6Qx_HD?vZ`Uiof<|`xepB}}Og`k0=8RDSxbTRV-N=!umCv@KwPW?BvKes7;_k+Kr~YhV=hw^6C*<^Ll*M_ zmK5d`mW3c5Q!_&pYYJm9gC^@spbiE8U00<;Cfl@reZmIho0cC7Jnox5Qk$ z9R1w=wVN;31(i#6G9G36KE5=hBP%uCPL zOU^G!)dLw;!~`_{7JF)5S!NN?I4+?2l+?7u(wvf8+(`DUWGLbUDg+b1_#kHMgY@ea eRNmsS$<0qG%}KRm1S%=!01_MwJdAuyT#Nu=$x5C8