From d21daaa83fcd7ee73308efe96b3f2e5973ace51c Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Tue, 2 Dec 2025 00:36:46 +0530 Subject: [PATCH] AO, cit, itat report download code commit. --- AppCode/AOHandler.py | 43 +++ AppCode/CITHandler.py | 43 +++ AppCode/ITATHandler.py | 35 ++- AppCode/ITRHandler.py | 4 +- AppCode/__pycache__/AOHandler.cpython-313.pyc | Bin 3537 -> 5499 bytes .../__pycache__/CITHandler.cpython-313.pyc | Bin 3473 -> 5141 bytes .../DocumentHandler.cpython-313.pyc | Bin 3624 -> 3624 bytes .../__pycache__/ITATHandler.cpython-313.pyc | Bin 3391 -> 4694 bytes .../__pycache__/ITRHandler.cpython-313.pyc | Bin 5852 -> 5893 bytes main | 0 main.py | 279 +++++++++++------- 11 files changed, 301 insertions(+), 103 deletions(-) delete mode 100644 main diff --git a/AppCode/AOHandler.py b/AppCode/AOHandler.py index 4f1e313..c90af37 100644 --- a/AppCode/AOHandler.py +++ b/AppCode/AOHandler.py @@ -1,5 +1,8 @@ from AppCode.Config import DBConfig import mysql.connector +import pandas as pd +import io + @@ -91,3 +94,43 @@ class AOHandler: def close(self): self.cursor.close() self.conn.close() + + def ao_report_download(self, selected_year): + try: + # Call stored proc to fetch year-wise records + self.cursor.callproc("GetAOByYear", [selected_year]) + + rows = [] + for result in self.cursor.stored_results(): + rows = result.fetchall() + + if not rows: + return None + + df = pd.DataFrame(rows) + + # TRANSPOSE + df_transposed = df.transpose() + df_transposed.insert(0, 'Field', df_transposed.index) + + # Rename columns: Record 1, 2, 3... + record_cols = { + i: f"Record {i}" + for i in df_transposed.columns if isinstance(i, int) + } + df_transposed.rename(columns=record_cols, inplace=True) + df_transposed.reset_index(drop=True, inplace=True) + + # Excel Output + output = io.BytesIO() + with pd.ExcelWriter(output, engine="xlsxwriter") as writer: + df_transposed.to_excel(writer, index=False, sheet_name="AO_Vertical") + worksheet = writer.sheets["AO_Vertical"] + worksheet.set_column(0, 0, 30) + + output.seek(0) + return output + + except mysql.connector.Error as e: + print("MySQL Error:", e) + return None \ No newline at end of file diff --git a/AppCode/CITHandler.py b/AppCode/CITHandler.py index eba7500..dc697d6 100644 --- a/AppCode/CITHandler.py +++ b/AppCode/CITHandler.py @@ -1,5 +1,9 @@ from AppCode.Config import DBConfig import mysql.connector +import pandas as pd +import io + + class CITHandler: @@ -75,3 +79,42 @@ class CITHandler: def close(self): self.cursor.close() self.conn.close() + + + def cit_report_download(self, selected_year): + try: + # Call stored procedure + self.cursor.callproc("GetCITByYear", [selected_year]) + + rows = [] + for result in self.cursor.stored_results(): + rows = result.fetchall() + + if not rows: + return None + + df = pd.DataFrame(rows) + + # Excel output + output = io.BytesIO() + with pd.ExcelWriter(output, engine="xlsxwriter") as writer: + + for i, (_, row) in enumerate(df.iterrows(), start=1): + # Convert row to vertical format + vertical_df = pd.DataFrame(row).reset_index() + vertical_df.columns = ['Field', 'Value'] + + start_row = (i - 1) * (len(vertical_df) + 3) # gap between blocks + vertical_df.to_excel( + writer, + sheet_name='CIT_Report', + index=False, + startrow=start_row + ) + + output.seek(0) + return output + + except mysql.connector.Error as e: + print("MySQL Error:", e) + return None \ No newline at end of file diff --git a/AppCode/ITATHandler.py b/AppCode/ITATHandler.py index 8c71f1e..f90f5a4 100644 --- a/AppCode/ITATHandler.py +++ b/AppCode/ITATHandler.py @@ -1,6 +1,8 @@ -# AppCode/ITATHandler.py -from AppCode.Config import DBConfig +from AppCode.Config import DBConfig +import mysql.connector +import pandas as pd +import io class ITATHandler: @@ -59,7 +61,34 @@ class ITATHandler: self.conn.commit() - # CLOSE CONNECTION + + def itat_report_download(self, selected_year): + try: + # Call stored procedure + self.cursor.callproc("GetITATByYear", [selected_year]) + + rows = [] + for result in self.cursor.stored_results(): + rows = result.fetchall() + + if not rows: + return None + + df = pd.DataFrame(rows) + + # Excel output + output = io.BytesIO() + with pd.ExcelWriter(output, engine="xlsxwriter") as writer: + df.T.to_excel(writer, header=False, sheet_name="ITAT_Report") + + output.seek(0) + return output + + except mysql.connector.Error as e: + print("MySQL Error:", e) + return None + + # CLOSE CONNECTION def close(self): self.cursor.close() self.conn.close() diff --git a/AppCode/ITRHandler.py b/AppCode/ITRHandler.py index 9105348..10c1145 100644 --- a/AppCode/ITRHandler.py +++ b/AppCode/ITRHandler.py @@ -116,7 +116,6 @@ class ITRHandler: - def itr_report_download(self, selected_year): try: @@ -137,6 +136,9 @@ class ITRHandler: df_transposed = df.transpose() df_transposed.insert(0, 'Field', df_transposed.index) + print("df-->",df_transposed) + + record_cols = { i: f"Record {i}" for i in df_transposed.columns if isinstance(i, int) diff --git a/AppCode/__pycache__/AOHandler.cpython-313.pyc b/AppCode/__pycache__/AOHandler.cpython-313.pyc index fcb2feacecdc9a59e314bfc9a0a31bf8866be0d7..a1d3fca281b78972fa469cbf94c679026b6e5ebd 100644 GIT binary patch delta 2012 zcmZWqU2qds6u!Hg-TZ8}ByG~PX_BTtl%}*uqaa|h1lsT?RI&tQ3eBv^w#25p^=>+C z88zw)Gd`t62hedS;{%!TrA~d|5fvC8oRL5^@q#mq;|p)GMLWVcdT&C~GTuzi{q8yE zp7Y&v&+g`$o_5u&2!aXV@#RN7@gJ;nH4U%!;ngQV1R`}99HJoQC73=;L#8zAAX}O_ z$TfggATmxM>bB7&1^`e$cf6Y#nEPONqZ2@0G(qzi?=vG~VCaCP#1b-mWc(`EOHuqH zLu(XeS)69hQX$@-IHo(=@ej@gL(jMV-vV`BiEpBbj?LBW%4P$q-&1keQ<$ z8HKiIHt62l9-{yl1H*=LdH_PD!&Fw~xfO)zZPt!7{!D;kXpwV^UfEVZDhV2!5m>aII;Bv820CYan#BlYF zH~|QAqAtwUfEVcqeWVot9;Z_D3Ww7*RyMEAVZF$T+)lbgr)f=JLD8wkp7-Gl&M!xRa)VV#GY!s-`Lk8%2}Ii{_mSW?~GrR}EDl@+`)R zDQpUDswxSf-joze-EtpoWmIhtfN2yUzPT<>c6!H7zWMF9T>?v7-kUSrV4aVg}?3_L%M^zZ}9{15mA5{}m6N-jX z`nWQgkfJhH>S9oxgvZDh(@a8}nTGMC41E;hWMwR_$U(#hh9W0qn2blI1m3{Lm6$w( zOxjslPDT`ILViRp`keX5ta$7-?;wOK+~sS8JXS)|laMqcbYOw#$rv&YNU5Y0gm@z| zCZVKgld2{oF0N=e2|PiZUnkC{xQ2B}Nr}pci7QFOL7AjOJd`z@y3B))t4P0hHYsZd zhY&wF6O|JuOGiM4q#BXQ8gV7A8s?0*;Uc7P6_8Go<#EJL%xZ5ZkTI$%iX2U<5V55b zzT@LD#ehi`d-`ef9sogmv$aE z;QOFRZxmb)Ew+pN9G|ze=Pd2>XBN&Z3@up(9y%J+x`HRwdS(3bc;2%k=h^YIXIDB{ zXll9Af4To&Q}=~|KN!&b%3mC4a21-Gf44g>p1yE;zWttkQ<^Svpr!4a`KtMgnzT@` zxSvHoment~^SuMP-hm~{V9^9ToAYk}UAKRQWtwY$bNeq*U%z$3dUIcX`+*e(*f*xq zflH2g>pYWw_pYt|7q`F20;{VCuy@e_te$e*?C_2DJB0uKQYv50;>#wlAHQS4XzybV zI9*qqpE^HtrMU-~<;aDR`QSp|UHhIJ!Gf(NZ|ln0y0Y7^+rQs^hu~8MZ^t#^s*s(? zc~gDqg9V#AZ|lt2I*kDe!Sk!QoB|e=j#w`!dj-|AtB^qYb}f2&WA@omNve3`l3Vh;M5+kO^f z9}UT8r}TIo^$D5J&2P|fDzj|f${9%ybY(h)w)*87nsxqZ=wMyYO1#NC(Pzk<7CJoe zEXIhN#Ggn>gQtj9s<^;+GHIdVh4=9qw-V6YSQHtGqJ9N!_d)%APSkWzp2#Pmrvv0oWe8>nX7pz8Vk}}*0I`|8nTnVt7?c=- znWY$lSxlKgdKegrSSF_EFxpL=Xe(UAozA7neT&o4-y<twTs*|^iC<}h&V`7ym5(KGY1rnO9lRt>4`QKvAtt>9g0Sgrc zfh55y_<*ci95%W6DWy57c12-8E+Y^Zivx)d%#4hTcNvs#Gl+fX2xnxJ`osVt!5RS* CdOhs` diff --git a/AppCode/__pycache__/CITHandler.cpython-313.pyc b/AppCode/__pycache__/CITHandler.cpython-313.pyc index 6adc0a6ec63646f5ba31ebaf5713531c3ce239c7..f4bd2cae3f6829a0943d3434615769d400a94a38 100644 GIT binary patch delta 1724 zcmZuxPjFL37~g%#%b)jNI)RWTP0}<;Lz-wq85yKdq=crGKLV0RR3<X0z<0@sxyurJQRD-o9L9A2STgOEI7k~gXpDDlo`0V``Se2sjKe3^1NM!eN6>jhNS|37gy? z1Z0B;$i|%B+Xo;N=AGO{ z2<`Ki4WB{inGf*)aIkA$viuC;uKC}rryx9Bi-=F*@mf%dx98Ur=vl0EHPCqfl z{IwH8Uu}=EQY}CLMnJ}*ThS$@AFU~^(GW;;JEyqP$(A@(#(A1jObe;@ro{$Ln`Emjq(xcW zZ47{;X8;g^UUgdeW@Q8PfT<4Zb9}>3=VYmwh?#^z5Ojm+x(%zxFc$zFG+Y223%+6K z0K+f{GJ$50RHzm-IjZ5Nyg|(%*GeHvnXaZzwxy*FI2{z6A|<4ebvg`(!CL%S%P}Io zi8R`C2PRIT945keNgY3riyFc)NK8l>DJtjz1qZ0et6DXOHNp=SQK>-qcXFjM^nmr3 z-nQ8ks+6%d6f+P(eIFq$tK>!z;fqQEjT4KiQD0m>k6D9Wkd98sC*BGSVqC_1Vq36C zmDtG^dKQ3PbRk@&K&;7}mK(w>5LYads`=P`=;<+gtHe-33bAPAEMmUIs3LTZ@S_vz2PI<7mlXx&wK68Wj*9RVTvW7} z4YTGUHWignzN(=@c7olMk>$W`I?lo{F_p)(%9ut>YnMl0k-#i5P$MFKh_F`7=So>> zXVtGE%k&VbHtHUD@x$zG5l6nLWwCyn*+TieQYz;P#Lp%}b!{|kdx^nG>Z$h8Qhfwg zxK5kzo_)(zaY|gahwJw6?Af`|x$KgC@Sdw}(%A5auAQ4Xx9sn&`+NWJ@0lEGc!Ssa zXZjbt-ItON4WOg%KNE2K8s3ikPS@4bmrl=y7oA;`+~cYVczoA9UwFRsO`7h~y|b6j z&JNA(z3tq8W9WX@_PNbJdarxu+i&ESx(?2W({QGDI&nV|{kHUVX>P}2WY=Jqa@X@6P?t z9*4n}wyXV9{mYJM-4R^{oXvOF?wnL+b4&K3&}q7!Y(rv7WVlEUo+hFNrQ32%{Wi_7>C(t(!2Rs%vL)iy~km- z_Jg$D#73?9O6@PHv-Od{@t%K$Fz>^gm^B?ZAZDrgY!N>$P@b47w9GjbpJKao3a**p r3$?dx?w*TOW)D(j^J&EZA^a0`-T|$5fa4CZKCx6F^gRM>)uaCpr)8bm delta 285 zcmbQLF;SZDGcPX}0}xCK(an_PoX97krvv0oWe8>nX7pz8Vk}}*0I`|8nTnVt7?c=- znWY$lSxlKgdKegrSSF_EFxpL=Xe(00ozA7neT&Q4GsGh?FC{0n=q1a>7fy_fY@4;2 z>KNI0fXa)VCp&TrZ$89a%*ZAN;s=5Geyo?77?n3GaqMSgG~WD(Gm??fZL$sbFGlal z<~+LmnoLC?Cl+x72|rDq$p?iZCd&!yvax_nP@NnotStDIi-}dLND!oo6-a2ZPVN#` zGcq#XWl+A&AoiWblaW#C69b3@n*#s{ CyFBjz diff --git a/AppCode/__pycache__/DocumentHandler.cpython-313.pyc b/AppCode/__pycache__/DocumentHandler.cpython-313.pyc index cdbe22f3bd4f86e87aba6058381be5ea07c751a1..9f94aa43cdb809a3f2421504b70339c8c50f5754 100644 GIT binary patch delta 19 ZcmZ1>vqFaJGcPX}0}#x;y^%|f4*)hF1qlEE delta 19 ZcmZ1>vqFaJGcPX}0}$Lu-^eA$2LLra1keBg diff --git a/AppCode/__pycache__/ITATHandler.cpython-313.pyc b/AppCode/__pycache__/ITATHandler.cpython-313.pyc index 04e27a1330f48140798193dc309d84b229c3adad..bd47b5eff1aadeddf0dda4ea43ad7deca976973d 100644 GIT binary patch delta 1449 zcmZux%}*Og6rb7k?)tlS!5^$0+c=cqG(}Y<@&$w#9Je%uCM+mwL0Bt1b}Y=UJG%&I zQ#sAOl8qbDvWwB1*1{o&_7L?#Lt3Qf(wQ|bwCY>!dvD+T=6%iE z`A&S&;oft(?10c~KfF=6Wv{w}<9+1oHjsb>FN1d>hB2x$ml@2O(tl+sp?{XNCem+*|9V4NH`70@OX0k9a+g1 z5q>6o`(qD;w!6$H5V|*Ru%AOdK-_3oYM-$!8*#3af$@!D;UojQH*^~T_11RnXTk@8 zX+$89mnHAsTf}-BL~2RL>ot$%W;qK1$b(5M1yLF^OK#{*9tRUl55ZAVER)WLMzHRt zb|~YZ=io!(j(GJPBAOcU%1JIpV$U%QQ1}VU*sHa6*i!a20f%yemn;$|@#k2xgE`O$kg$y!uD6j+Pj+zW10-X^zF5>27jQvG zn9Kx^lzc%!>Biw_#!$JWVm-ka{Bf0jOVZW%VwW&h@%e-Y zJBSg}{$Y|Mz_c$0Q_32)l&s5XO!gT}K{bTIB^_zQ?;DOwi!-Qr%}l_6w#&Bt^Ie4|nWB8`q)?0_(xBBQmS%X$VQT5=|SIs(X`roQsYl|gvv+2ufq+R2%s zs-dacZ;oE*s-19-^H&H2OSK!$H+gzhXeVoToyW`1ok1@A$7zNWv6lik!V*@)oh+4x z)GX?5Tw$1AEXFJ5sC54`DL757e2Ls)vW73v?H4JdKJbT>nJ&%4xAx7c+4&;6fTzg< k`8|PljIj7F3nBa!9Nz~1ZP2m}Z2OjL5Q@(M<>vms0W#57O8@`> delta 312 zcmcbnvR{htGcPX}0}!l_(ajWMpU5W>qypqkWe8>nX7pz8Vk}}*V31%?VhCoEVhCn7 zWdf;XU?^frXVGMR31Vt8-r{g^a?a07%S=xO3BUj&l=0ba;zV1iBJOl9P3~LVo*|AQ z9*KD=IjKc2S%E5&87B*JiEL(Klwo9K-z?8m&B(~Jc{Xz|BcteMO;$T5Mup88>{?8W zI-4hR0_7|x^K+X|W)fJ#Xfb)cfEc6w1Vex#F@gqcAVZ5)Cr=Vo*89rC z#41%J2oxv+iTY_W-{NyDC~(eCN!5cmxQH1hS!6$%Ur0j55y%HQyjTcGd|+l|WPHk? Q{GH8)QR))|kN_J70IXv^#Q*>R diff --git a/AppCode/__pycache__/ITRHandler.cpython-313.pyc b/AppCode/__pycache__/ITRHandler.cpython-313.pyc index 4a43b758d50cddb3c27d1e41fa00648d97ac8449..81d733ed8bf28862d240476823390710fa014aca 100644 GIT binary patch delta 465 zcmcbk+p5R=nU|M~0SMTq>Smtb$a{!~v1juI9$QA4Xkm~r2n4f)vYIkM*a{4xtU)4^ z1^HBY#UUaL454h%5|f?zlqFe1+4vZYnc|szl^7Vf859`u*z?$c>ZK>w^NDh^1+!Z+ zf%VHyzQ`yn$`;HP%mEUKmV=oTq%e6RqYPgjM>GdqNNMs%K5>1{U@l80CWbstpmC}& zIRqWb8O$Bb6U=ML477kVNDX8GHxDaNK^|8qSCA%%&&m|c6wEg{mtU4q8^oVHkKc|_ zXYxmW8KxkE$-nufxe-3*pR6dL&L}Y1Q$U7|H6=|~*KTr(zz#;m$r6IClNSlDS5SfN^;Cjz1q(r4se5zzU-wfT+^KchE4!$B!WSvP)$L*|mMmMn)w zxImJOMyXE>AhJjl=pX=RXJ2># delta 489 zcmYjOJ4*vW5Z=AJ&AlJFJj57cLVW85JPdN6qD8K;yY)awAt`Mv)WSkhQ5!p%zhGfw zApxz`B(>K1BYa?G?c zq%~^h_?SnWYUZJ7Rj~wz)<9+OPyLUvObJZ|LK(5`A$Z1_9AS#gm1Z$