From c55433a1b71705f943bd6ce2853cf7bfe135f7c8 Mon Sep 17 00:00:00 2001 From: 7nimor <7nimor@gmail.com> Date: Tue, 27 Jan 2026 14:21:46 +0330 Subject: [PATCH] update excel --- .../excel_processing.cpython-39.pyc | Bin 51388 -> 52145 bytes app/__pycache__/views.cpython-39.pyc | Bin 122214 -> 122241 bytes app/excel_processing.py | 53 +++++++++++++++++- app/views.py | 16 +++--- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/app/__pycache__/excel_processing.cpython-39.pyc b/app/__pycache__/excel_processing.cpython-39.pyc index c368ed6db7df8976001d7af0d8658a82531f57bb..91a1fcfd6ff880b344c6f1ed9a78e7ae903b80e1 100644 GIT binary patch delta 1621 zcmZ`(TWlLe6rI^!8^^Jom+i!l*pBTcaUPUMX-gU!^579Dkfw!}(liaZi5o|9(q)36 znw6!PB0g|PwI2k9NH(g(LsTe=C?BPwN|Ok_5PyzA1p$>nz&BFAxHGY;Ruy|SXYRRk z=I-3PkFPJNtM99>F{jf`@S0hAW9rfmtF8~ORK=0{aP;GNZOO8B`AQ$nf!WsmL1SP1K= z#99wR4?La~RV0i$h#PL`H9XutKo;pp$nbJ6^!c!`*~=KO=N?|akKno+4 zH6`fh^%xtFu>{6c9b3VIER4~FFC)4UgC}xImZlXHd*Psz_DFnE;!_fzmN+Q!8Hvx{ z;iGa|!Q_YF5axLf^E@wZHhV(md_nq?(jSt$4$Gq~WNx1Y1NR(dSZ@0e`jZ}`fx97& zmAX0h1m`*y!G1LeR!<hxANRpAJeoGU7axHi*>TARHj42eGCyW4n;cNPxhIThyu;VT=aviAK^k%oN5E zfm1LljC*$G|G^AOu(?gLnN8TtKG94#4P)~CRu?V0pR3}{V9nf*ZEWTqiH#BiS<1s0 z3rQA47D-kZQJF0YefUv!z^gKoGvC4;@{@MtTcKBYECJ)K0QgUc!9>0dCJU6uAlXfL zEZ@!@`HljS8)8RD;*44P<}1%RODBx6iF1z5aeV@vQNh+OT)RehCo1$WDIxlC`~l5{ z5Q>+IpKqU!6hA3`TwIN`mOlOQ-R-xw-zj}jT-`pOFoU7}=J5Iwer34nym@Q=sOJyi z-VpGefS(22G;f510sT+m=L8%Uupr<)0dJe9u8*jldY$>pWY8>K-=pX&X642K>Nfi} zqW-^yMipQYpb7X#z-Q*rnJA5$*^Lo;)%fDjePUzzkX;yNTm1VAP2;sU}vDrn3%z;hlqz=XA zvr=I;YNswVo5M{VG>B$H^U_*cO}z>Z)%X7-xJrwCF|7y-!vwO==2iJ~m{YvSe+4b%Ge_f==z5oCK delta 928 zcmZWnNlz3(6t3#-nUG;NW~E0Nmk{)j+UXa8Kny3Lr;>CjpWAvaN{Q+Jy@pWN{iCwAh)%U%xUM*eAkK`8*W$y)# z$3^h_ed+eq^v7lI!m2NZRK?zp{brT2@_er0;L3b1T<{bImz@HQK-RIo0FJtsvI1Qr0Fe^r}{5`=Vdgb z7KrIE7wVG4*nx2` z?1TMq0P1rN+=Y^t^k$|&$*gRTgrfltGG&o0Nze#QIfar8vy&4{{%e~MwnNa&WMOOB zvKc#>mzCm?TA>ZvvrbB&!wi6C2BFgoF;@x?G#NL;EDT*L$xCw&P>-+>i?k8U2T|`- z38E%2DLl`hn`I&>_6V`V7WL1D!-yFbs3OOENI-8+%F=5Rn#0g4oNWRR3p^sQPhh{m zl)$6^jL|tOAF2C&XCtaBXKlINPBJA>qeAU$G%lVaK_ThT9XZw2{(TNxCy4CtN- zn^6`74Nn?mcqbSGMjY=eYO^Q-EsGbOmu@gP4MTQgp{~ab6e-6dU3L*T z1HNXqxeo$7_&4OFHok!*(71ARn6R1O@Ro%I!5Zw4e3RE z;sc-DbNY3d=hLsBti<2EqCB;>;Ge>bPHnhn!!-ZCHqLWTD|mi=nAY;I>!ZAVqn*!h z#QFG@IF0f58g7L+AS)#*uMfvu0qUm_3A>Nqf7?r2_(-yn bPbXc<52Y%?8#iM#wKBN*jnWivcz5>?mgfa? diff --git a/app/__pycache__/views.cpython-39.pyc b/app/__pycache__/views.cpython-39.pyc index db36bc7041338ca4e7feaaf885c42ab1e887b5dd..2c5413aada5812e75ebdb6201db7903aa674f221 100644 GIT binary patch delta 1587 zcmY*YTTC2P7@mLjHnTee%bkK~8zc>;QSe2ieP9D|EopruIBB6|TBvqMcwy#6&k%<~pHCeK~K_#R`h}IUF zFfMjh@;T4G5y`k3d}zuRJC&huB$|)|iC9FnxuDXXl+f4apH>v9RY@f^Tj-TX6ry1o zEv4FGuRPQi(d5vv$gmo-y*VRAY|oB~7R|vOlFj!-hU9QeOUN{PuN+a8q|JAzZE`|3 zAXskHbUrxc56a0@A9f!Y7?4#J!#qLc7@02+o*0pBF`qY-iqh1*@@Ps{H59$=$2FNG zBMFqbkVaz3Au0tGDUxVaRl96Y*WJm)L^w7q+wP!3J3nj-`E%%sAS~qIoe}wVLKM=f zNV4tEjYXTu6&V0?bOA~XuKzKkvFmLZGrsKVLt4;%2nLPA-Hi~<40k^PFqk>p^N)`o z1BR&w@)j6dT~B6y>z{COQG}L&L^E=9PC)m+lfSaaZjXK{Le!`}QIk14m2x6deWKZm z?D^Rk)z;n@4x#h zaxB86%bab7%Bda1jR?0Rdr;4N!+Ur%5|s2A7OMiN$Bn@h8!^`Vji-obGSWO z9OWE;tx03!Y}%nYb>5k5D%bGVlZ0N#VK@c*8I9S1L#_Gv{+}-CAyF=fFT8XfyAT${YKEE6g9t8bc&rU zM9(t4FkZe0AqFiK|3~FLv`T8%_Qk8D;!|vhsW0gwDf}f**}@1>q||_R)ck51Y8uEE z{hj5MtWa`+l8^(*=ah_LOqh%#C9fc2QzTYv&THY0;6o+T=X?ad(CgGLrdOlqPfJn^*uZw+@Io$ V>+t99EO&3frW-b`wcBtG{sVG%>2Cl4 delta 1586 zcmY*Ye`p(Z6u)=5B}&wcop} zrd$ZM6DHWr8sTRBK_YB0oQeiH>C`E$vyO?5;*hHhM3E`@pCJAr_`a9KksROm{k-=+ z-}gT6?wf^6{BNtgBui3&!5fv4oLQ9kIq9l&6t1qRwVi-N1^0 zS_8ylMC+9eH993v>j@`-jSpexSawErT1M2#+qtoXF%?T-At9nEa;ityonUt=rOl1b zC|H1o`_f9UoGtt_uq%(=h$`z^+7YX>7_yP69qCW&Dlr_Xu7MNid)`nJ$F@Zy3#8(mOge&!^!l*$K=}9NpuMew4Pw0l~&K5P~F=C(+N2oCHbp0$t=~UL8 zg|8}b2gkYTxK3bLCit4%Hy*0jQTQ`*74*UlvM*!mGbHo1z z{W>sA2ap$`aDDL6@~_9TULl8}3qW#ZHNGq&{qOWIEN)w~7bVCQ+D^8Y&*d{5M%qpu z2;lbg=>+w@cvbAg{I{RKi%$0PF+XlMHoiFkIlJhAd$EMQ;f4Kp!iF%M-HrQ77aZS1 z{TMv6M{uREM7JmAK=HPoKpDg}r}5UI#&z7tlzr2L{ho#fbOc;Oxb#y{NRPMYA;}g! z3R{Al&#Yh%V!nzw#6lH&5&KOqiJM-<_nZfJF3BP0mmtTPJ~D6m-1xj3_bGxK=gCi| zfQxr?h%5X2KEs>z7JYexH~B?S{3SLQsDv;gR3kyRRKN@>fh9J_jWOvajxmI+0}OqR zGHJGpG5xOq5lufWTtP*DiE$BEbMbptnE>gmK)MRNiZXH~KcI&kmJY*f6hx?$Ru%Na;xAo}@@Nj`Wa(CA| zjrjEsBA0;>D?;_5$Xz>tg(mkA!N>YwoBhNh^!nkNz4S6X>46RV$1`vWV8fD^p&hPT z`DM6^_Xr(g3;EJId=IqS>&p=2_mMR!n9f4JqR1WX0jhD78hSwq{oBOIEecbVv+l9O zuft97U7_CB_FpTon{D1iC)0$gIV1|Gifp=#tlqa^1J-QmZFq^jlh&$~K11tuQulr| z7dVo$J}Sa3$XRcmhrRZ-5`2e$J{z6OLeSN=PTQ^7$3K7@o?7oCWtigY(jTwFEL%-m tKVN}n`_O0bR6Xa7bvRt(*vNTMtSiyB3BUh8UEl}!-UplZ))t(H{{UAv>(T%K diff --git a/app/excel_processing.py b/app/excel_processing.py index ca23291..67cfb4a 100644 --- a/app/excel_processing.py +++ b/app/excel_processing.py @@ -2629,9 +2629,9 @@ def all_products_transport_excel(request): transports = transports.filter( build_query(filterset_class.Meta.fields, search) ) + transports = transports.order_by('-date', '-create_date') transports = transports.iterator(chunk_size=2000) - excel_options = [ 'ردیف', 'کد رهگیری', @@ -2664,7 +2664,19 @@ def all_products_transport_excel(request): worksheet.insert_rows(1) cell = worksheet.cell(row=1, column=1) cell.alignment = Alignment(horizontal='center', vertical='center') + header_list2 = [ + 'محصول', + 'تعداد بار', + 'حجم بار (کیلوگرم)', + 'تعداد بار داخل استان', + 'حجم بار داخل استان', + 'درصد بار داخل استان', + 'تعداد بار خارج استان', + 'حجم بار خارج استان', + 'درصد بار خارج استان', + ] + create_header(worksheet, header_list2, 5, 2, height=20.8, border_style='thin') if 'date1' in request.GET: date1 = datetime.datetime.strptime(str(request.GET['date1']), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(request.GET['date2']), '%Y-%m-%d').date() @@ -2716,6 +2728,30 @@ def all_products_transport_excel(request): l += 1 create_value(worksheet, list1, l + 1, 1) + aggregation = AllProductsTransport.objects.filter(**filters).aggregate( + total=Sum('quantity'), + input_total=Sum('quantity', filter=Q(out=False)), + output_total=Sum('quantity', filter=Q(out=True)), + input_count=Count('id', filter=Q(out=False)), + output_count=Count('id', filter=Q(out=True)), + total_count=Count('id'), + ) + + total_count = aggregation['total_count'] or 0 + total_quantity = aggregation['total'] or 0 + input_quantity = aggregation['input_total'] or 0 + output_quantity = aggregation['output_total'] or 0 + input_count = aggregation['input_count'] or 0 + output_count = aggregation['output_count'] or 0 + + if total_count > 0 and (input_quantity + output_quantity) > 0: + input_percent = round((input_quantity / (input_quantity + output_quantity)) * 100, 1) + output_percent = round((output_quantity / (input_quantity + output_quantity)) * 100, 1) + else: + input_percent = 0 + output_percent = 0 + + list2 = [ 'مجموع==>', @@ -2744,6 +2780,21 @@ def all_products_transport_excel(request): ] create_value(worksheet, list2, l + 3, 1, color='green') + value_header_list2 = [ + product_type if product_type else '-', + int(total_count), + int(total_quantity), + int(input_count), + int(input_quantity), + input_percent, + int(output_count), + int(output_quantity), + output_percent, + + ] + + create_value(worksheet, value_header_list2, 3, 5, border_style='thin') + workbook.save(output) output.seek(0) diff --git a/app/views.py b/app/views.py index 5b302c6..862ada3 100644 --- a/app/views.py +++ b/app/views.py @@ -4510,10 +4510,8 @@ class AllProductsTransportViewSet(viewsets.ModelViewSet): pagination_class = CustomPagination filterset_class = AllProductsTransportFilterSet - def list(self, request, *args, **kwargs): - transports = self.filter_queryset(self.get_queryset()) - + filters = {"trash": False} product_type = request.GET.get('product_type') destination_province = request.GET.get('destination_province') date1 = request.GET.get('date1') @@ -4521,21 +4519,23 @@ class AllProductsTransportViewSet(viewsets.ModelViewSet): search = request.GET.get('search') if product_type and product_type != 'undefined': - transports = transports.filter(product=product_type) + filters['product'] = product_type if destination_province and destination_province != 'undefined': - transports = transports.filter(destination_province=destination_province) + filters['destination_province'] = destination_province if date1 and date2 and date1 != 'undefined' and date2 != 'undefined': try: start_date = datetime.datetime.strptime(str(date1), '%Y-%m-%d') end_date = datetime.datetime.strptime(str(date2), '%Y-%m-%d') - transports = transports.filter(date__gte=start_date, date__lte=end_date) + filters['date__gte'] = start_date + filters['date__lte'] = end_date except ValueError: pass - if search: - if search != 'undefined' and search.strip(): + transports = AllProductsTransport.objects.filter(**filters).order_by('-date', '-create_date') + + if search and search != 'undefined' and search.strip(): transports = transports.filter( build_query(self.filterset_class.Meta.fields, search) )