From a8e47af61c86ea9e13f18c0133e8c687573bf392 Mon Sep 17 00:00:00 2001 From: Swapnil9693 Date: Thu, 5 Feb 2026 14:57:38 +0530 Subject: [PATCH 1/2] Summary report UI improvements and JS preview logic --- .env | 24 -- .gitignore | 10 + AppCode/DocumentHandler.py | 307 +++++++++++---- AppCode/__pycache__/AOHandler.cpython-311.pyc | Bin 6450 -> 0 bytes AppCode/__pycache__/AOHandler.cpython-312.pyc | Bin 5475 -> 0 bytes AppCode/__pycache__/AOHandler.cpython-313.pyc | Bin 7623 -> 0 bytes .../__pycache__/CITHandler.cpython-311.pyc | Bin 5941 -> 0 bytes .../__pycache__/CITHandler.cpython-312.pyc | Bin 5116 -> 0 bytes .../__pycache__/CITHandler.cpython-313.pyc | Bin 7674 -> 0 bytes AppCode/__pycache__/Config.cpython-311.pyc | Bin 1376 -> 0 bytes AppCode/__pycache__/Config.cpython-312.pyc | Bin 1316 -> 0 bytes AppCode/__pycache__/Config.cpython-313.pyc | Bin 1263 -> 0 bytes .../DocumentHandler.cpython-311.pyc | Bin 10482 -> 0 bytes .../DocumentHandler.cpython-312.pyc | Bin 8676 -> 0 bytes .../DocumentHandler.cpython-313.pyc | Bin 9583 -> 0 bytes .../__pycache__/FileHandler.cpython-311.pyc | Bin 1040 -> 0 bytes .../__pycache__/FileHandler.cpython-312.pyc | Bin 933 -> 0 bytes .../__pycache__/FileHandler.cpython-313.pyc | Bin 1078 -> 0 bytes .../__pycache__/ITATHandler.cpython-311.pyc | Bin 5216 -> 0 bytes .../__pycache__/ITATHandler.cpython-312.pyc | Bin 4670 -> 0 bytes .../__pycache__/ITATHandler.cpython-313.pyc | Bin 7685 -> 0 bytes .../__pycache__/ITRHandler.cpython-311.pyc | Bin 6898 -> 0 bytes .../__pycache__/ITRHandler.cpython-312.pyc | Bin 5837 -> 0 bytes .../__pycache__/ITRHandler.cpython-313.pyc | Bin 7857 -> 0 bytes AppCode/__pycache__/LoginAuth.cpython-311.pyc | Bin 3155 -> 0 bytes AppCode/__pycache__/LoginAuth.cpython-312.pyc | Bin 2715 -> 0 bytes AppCode/__pycache__/LoginAuth.cpython-313.pyc | Bin 2735 -> 0 bytes AppCode/__pycache__/YearGet.cpython-311.pyc | Bin 2184 -> 0 bytes AppCode/__pycache__/YearGet.cpython-312.pyc | Bin 1862 -> 0 bytes AppCode/__pycache__/YearGet.cpython-313.pyc | Bin 2580 -> 0 bytes main.py | 17 + static/css/summary.css | 365 ++++++++++++------ static/js/summary_preview.js | 55 +++ templates/summary_reports.html | 47 ++- templates/upload.html | 2 +- 35 files changed, 585 insertions(+), 242 deletions(-) delete mode 100644 .env delete mode 100644 AppCode/__pycache__/AOHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/AOHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/AOHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/CITHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/CITHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/CITHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/Config.cpython-311.pyc delete mode 100644 AppCode/__pycache__/Config.cpython-312.pyc delete mode 100644 AppCode/__pycache__/Config.cpython-313.pyc delete mode 100644 AppCode/__pycache__/DocumentHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/DocumentHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/DocumentHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/FileHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/FileHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/FileHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/ITATHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/ITATHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/ITATHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/ITRHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/ITRHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/ITRHandler.cpython-313.pyc delete mode 100644 AppCode/__pycache__/LoginAuth.cpython-311.pyc delete mode 100644 AppCode/__pycache__/LoginAuth.cpython-312.pyc delete mode 100644 AppCode/__pycache__/LoginAuth.cpython-313.pyc delete mode 100644 AppCode/__pycache__/YearGet.cpython-311.pyc delete mode 100644 AppCode/__pycache__/YearGet.cpython-312.pyc delete mode 100644 AppCode/__pycache__/YearGet.cpython-313.pyc create mode 100644 static/js/summary_preview.js diff --git a/.env b/.env deleted file mode 100644 index 8d571af..0000000 --- a/.env +++ /dev/null @@ -1,24 +0,0 @@ -# ----------------------------- -# Flask App Configuration -# ----------------------------- -FLASK_ENV=development -FLASK_DEBUG=True -FLASK_HOST=0.0.0.0 -FLASK_PORT=5010 - -# ----------------------------- -# Security -# ----------------------------- -SECRET_KEY=secret1234 - -# ----------------------------- -# Database Configuration -# ----------------------------- -DB_DIALECT=mysql -# DB_DRIVER=pymysql -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_NAME=test_income_taxdb -DB_USER=root -DB_PASSWORD=root - diff --git a/.gitignore b/.gitignore index 4a2326d..c823ac0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,13 @@ logs/ +# Environment variables +.env + +# Python cache +__pycache__/ +*.pyc + +# OS / Editor +.vscode/ +.idea/ diff --git a/AppCode/DocumentHandler.py b/AppCode/DocumentHandler.py index 81df6df..833cd35 100644 --- a/AppCode/DocumentHandler.py +++ b/AppCode/DocumentHandler.py @@ -1,4 +1,6 @@ -from flask import Flask, render_template, request, redirect, url_for, send_from_directory, abort, flash,send_file +from flask import ( + render_template, request, send_file, jsonify +) from werkzeug.utils import secure_filename import pandas as pd import os @@ -17,11 +19,40 @@ class DocumentHandler: self.isSuccess = False self.resultMessage = "" - # VIEW DOCUMENTS + # ========================= + # Utility: Parse Year + # ========================= + def parse_year(self, year_value): + """ + Accepts: + - '2026' + - 'AY 2026-2027' + Returns: + - 2026 (int) + """ + if not year_value: + return None + + year_value = year_value.strip() + + if year_value.isdigit(): + return int(year_value) + + try: + # "AY 2026-2027" → 2026 + return int(year_value.split()[1].split('-')[0]) + except Exception: + return None + + # ========================= + # View Documents + # ========================= def View(self, request): - year = request.args.get('year', '') + year_raw = request.args.get('year', '') stage = request.args.get('stage', '') + year = self.parse_year(year_raw) + dbconfig = DBConfig() connection = dbconfig.get_db_connection() @@ -30,15 +61,13 @@ class DocumentHandler: return cursor = connection.cursor(dictionary=True) - # --- FILTER QUERY --- + cursor.callproc("GetDocuments", [year, stage]) - # fetch first result set for result in cursor.stored_results(): self.documents = result.fetchall() break - # ---- GET YEARS FROM STORED PROCEDURE ---- cursor.callproc("GetYear") for result in cursor.stored_results(): @@ -49,55 +78,72 @@ class DocumentHandler: cursor.close() connection.close() + self.isSuccess = True + # ========================= # Upload Documents + # ========================= def Upload(self, request): dbconfig = DBConfig() connection = dbconfig.get_db_connection() - if connection: - cursor = connection.cursor() - files = request.files.getlist('documents') - year = request.form['year'] - stage = request.form['stage'] + if not connection: + return - for file in files: - extension = file.filename.rsplit('.', 1)[1] - if extension not in FileHandler.ALLOWED_EXTENSIONS: - print("Skip invalid file type : ",extension) - continue + cursor = connection.cursor() - filename = secure_filename(file.filename) - filepath = os.path.join(FileHandler.UPLOAD_FOLDER, filename) - file.save(filepath) + files = request.files.getlist('documents') + year_raw = request.form.get('year') + stage = request.form.get('stage') - cursor.callproc('InsertDocument', [ filename, filepath, extension, year, stage ]) + year = self.parse_year(year_raw) - connection.commit() - cursor.close() - connection.close() - # return redirect(url_for('view_documents')) + if not year: + self.resultMessage = "Invalid year selected." + return - def Summary_report(self, request): - dbconfig = DBConfig() - connection = dbconfig.get_db_connection() + for file in files: + if '.' not in file.filename: + continue - year_str = request.args.get('year') + extension = file.filename.rsplit('.', 1)[1].lower() - # If year not selected - if not year_str or not year_str.isdigit(): - yearGetter = YearGet() - allYears = yearGetter.get_year_by_model("AllYearsInAllModel") - yearGetter.close() - return render_template( - 'summary_reports.html', - years=allYears, - message="Please select a valid year to download." + if extension not in FileHandler.ALLOWED_EXTENSIONS: + print("Skipping invalid file:", extension) + continue + + filename = secure_filename(file.filename) + filepath = os.path.join(FileHandler.UPLOAD_FOLDER, filename) + + file.save(filepath) + + cursor.callproc( + 'InsertDocument', + [filename, filepath, extension, year, stage] ) - # Convert year to int (IMPORTANT FIX) - year = int(year_str) + connection.commit() + cursor.close() + connection.close() + + # ========================= + # Summary Preview (JSON) + # ========================= + def Summary_preview(self, request): + """ + Returns JSON preview of summary report for selected year. + """ + year_raw = request.args.get("year") + year = self.parse_year(year_raw) + + if not year: + return jsonify([]) + + dbconfig = DBConfig() + connection = dbconfig.get_db_connection() + if not connection: + return jsonify([]) try: stages = { @@ -112,11 +158,111 @@ class DocumentHandler: for stage_name, table_name in stages.items(): cursor = connection.cursor(dictionary=True) cursor.callproc("sp_get_stage_data", [table_name, year]) - rows = [] for result in cursor.stored_results(): rows = result.fetchall() + stage_data[stage_name] = pd.DataFrame(rows) if rows else pd.DataFrame() + cursor.close() + columns = [ + 'gross_total_income', 'disallowance_14a', + 'disallowance_37', '-', + 'deduction_80ia_business', + 'deduction_80ia_misc', + 'deduction_80ia_other', + 'deduction_sec37_disallowance', + 'deduction_80g', '-', + 'net_taxable_income', + 'tax_30_percent', + 'tax_book_profit_18_5', + 'tax_payable', 'surcharge', + 'edu_cess', 'total_tax_payable', + 'mat_credit_created', + 'mat_credit_utilized', + 'interest_234c', 'total_tax', + '-', 'advance_tax', 'tds', + 'tcs', 'sat', + 'tax_on_assessment', + 'refund', 'Remarks' + ] + + particulars = [ + "Gross Total Income", "Add: Disallowance u/s 14A", + "Add: Disallowance u/s 37", "GTI as per", + "Less: Deduction u/s 80IA - On Business Income", + "- On Misc Receipts", "- On Other", + "- On Sec 37 Disallowance", + "Less: Deduction u/s 80G", " ", + "Net Taxable Income", "Tax @ 30%", + "Tax @ 18.5% on Book Profit", + "Tax Payable", "Surcharge @ %", + "Education Cess @ %", "Total Tax Payable", + "Add: MAT Credit Created", + "Less: MAT Credit Utilized", + "Add: Interest u/s 234C", + "Total Tax", " ", + "Advance Tax", "TDS", "TCS", "SAT", + "Tax on Regular Assessment", + "Refund", "Remarks" + ] + + def safe_get(df, col): + return df[col].values[0] if col in df.columns and not df.empty else 0 + + preview = [] + for i, part in enumerate(particulars): + preview.append({ + "Particular": part, + "ITR": safe_get(stage_data['ITR'], columns[i]), + "AO": safe_get(stage_data['AO'], columns[i]), + "CIT": safe_get(stage_data['CIT'], columns[i]), + "ITAT": safe_get(stage_data['ITAT'], columns[i]), + }) + + return jsonify(preview) + + finally: + connection.close() + + def Summary_report(self, request): + dbconfig = DBConfig() + connection = dbconfig.get_db_connection() + + year_raw = request.args.get('year') + + # Safely parse year to int + try: + year = int(year_raw) + except (TypeError, ValueError): + year = None + + if not year: + yearGetter = YearGet() + allYears = yearGetter.get_year_by_model("AllYearsInAllModel") + yearGetter.close() + + return render_template( + 'summary_reports.html', + years=allYears, + message="Please select a valid year to download." + ) + + try: + stages = { + "ITR": "itr", + "AO": "ao", + "CIT": "cit", + "ITAT": "itat", + } + + stage_data = {} + + for stage_name, table_name in stages.items(): + cursor = connection.cursor(dictionary=True) + cursor.callproc("sp_get_stage_data", [table_name, year]) + rows = [] + for result in cursor.stored_results(): + rows = result.fetchall() stage_data[stage_name] = pd.DataFrame(rows) if rows else pd.DataFrame() cursor.close() @@ -124,25 +270,45 @@ class DocumentHandler: return df[col].values[0] if col in df.columns and not df.empty else "-" particulars = [ - "Gross Total Income", "Add: Disallowance u/s 14A", "Add: Disallowance u/s 37", - "GTI as per", "Less: Deduction u/s 80IA - On Business Income", "- On Misc Receipts", - "- On Other", "- On Sec 37 Disallowance", "Less: Deduction u/s 80G", " ", - "Net Taxable Income", "Tax @ 30%", "Tax @ 18.5% on Book Profit", - "Tax Payable", "Surcharge @ %", "Education Cess @ %", "Total Tax Payable","Add: MAT Credit Created", - "Less: MAT Credit Utilized", "Add: Interest u/s 234C", "Total Tax", " ", + "Gross Total Income", "Add: Disallowance u/s 14A", + "Add: Disallowance u/s 37", "GTI as per", + "Less: Deduction u/s 80IA - On Business Income", + "- On Misc Receipts", "- On Other", + "- On Sec 37 Disallowance", + "Less: Deduction u/s 80G", " ", + "Net Taxable Income", "Tax @ 30%", + "Tax @ 18.5% on Book Profit", + "Tax Payable", "Surcharge @ %", + "Education Cess @ %", "Total Tax Payable", + "Add: MAT Credit Created", + "Less: MAT Credit Utilized", + "Add: Interest u/s 234C", + "Total Tax", " ", "Advance Tax", "TDS", "TCS", "SAT", - "Tax on Regular Assessment", "Refund" , "Remarks" + "Tax on Regular Assessment", + "Refund", "Remarks" ] columns = [ - 'gross_total_income', 'disallowance_14a', 'disallowance_37', - '-', 'deduction_80ia_business','deduction_80ia_misc', - 'deduction_80ia_other', 'deduction_sec37_disallowance','deduction_80g', '-', - 'net_taxable_income', 'tax_30_percent','tax_book_profit_18_5', - 'tax_payable','surcharge', 'edu_cess', 'total_tax_payable', - 'mat_credit_created','mat_credit_utilized' , 'interest_234c','total_tax', '-', - 'advance_tax', 'tds', 'tcs', 'sat', - 'tax_on_assessment', 'refund', 'Remarks' + 'gross_total_income', 'disallowance_14a', + 'disallowance_37', '-', + 'deduction_80ia_business', + 'deduction_80ia_misc', + 'deduction_80ia_other', + 'deduction_sec37_disallowance', + 'deduction_80g', '-', + 'net_taxable_income', + 'tax_30_percent', + 'tax_book_profit_18_5', + 'tax_payable', 'surcharge', + 'edu_cess', 'total_tax_payable', + 'mat_credit_created', + 'mat_credit_utilized', + 'interest_234c', 'total_tax', + '-', 'advance_tax', 'tds', + 'tcs', 'sat', + 'tax_on_assessment', + 'refund', 'Remarks' ] data = { @@ -155,56 +321,44 @@ class DocumentHandler: df = pd.DataFrame(data) - # ===== Excel Export ===== output = io.BytesIO() + with pd.ExcelWriter(output, engine='xlsxwriter') as writer: - sheet_name = f"AY {year} - {year + 1}" + sheet_name = f"AY {year}-{year + 1}" df.to_excel(writer, index=False, sheet_name=sheet_name, startrow=2) workbook = writer.book worksheet = writer.sheets[sheet_name] - # ===== Company Heading ===== - company_heading = workbook.add_format({ + title = workbook.add_format({ 'bold': True, 'font_size': 14, - 'font_color': 'black', - 'align': 'center', - 'valign': 'middle' + 'align': 'center' }) worksheet.merge_range( 0, 0, 0, len(df.columns) - 1, "Laxmi Civil Engineering Services Pvt Ltd", - company_heading + title ) - # ===== Header Format ===== header = workbook.add_format({ 'bold': True, 'align': 'center', - 'valign': 'middle', 'bg_color': '#007bff', 'font_color': 'white', 'border': 1 }) - cell = workbook.add_format({ - 'border': 1, - 'align': 'left', - 'valign': 'middle' - }) + cell = workbook.add_format({'border': 1}) - # Write headers for col_num, col_name in enumerate(df.columns): worksheet.write(2, col_num, col_name, header) - max_len = max(df[col_name].astype(str).map(len).max(), len(col_name)) + 2 - worksheet.set_column(col_num, col_num, max_len) + worksheet.set_column(col_num, col_num, 25) - # Write data rows - for row in range(3, len(df) + 3): + for row in range(len(df)): for col in range(len(df.columns)): - worksheet.write(row, col, df.iloc[row - 3, col], cell) + worksheet.write(row + 3, col, df.iloc[row, col], cell) worksheet.freeze_panes(3, 1) @@ -219,3 +373,4 @@ class DocumentHandler: finally: connection.close() + diff --git a/AppCode/__pycache__/AOHandler.cpython-311.pyc b/AppCode/__pycache__/AOHandler.cpython-311.pyc deleted file mode 100644 index f37200ff9a15274b3b0077803924cecb9a1af956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6450 zcmc&2S!^4}b#{3z4@sm%Qny0aiY+;jBh#|1x{hthI^s5wn%Z$|`PkCjl}wr9GP5ho zQpr{*0z@qglu2F4N!^AG0*8hT)E{k;kA9>;T=a7(EFfY40|JVC4U;kj= zzHnc-KYZXTdTS?M37;EICXY*kc+O<$-sBSDcs`bhDLlX2SZOb}xq(2rAHWKF;P24< zd-MK&&ELOjz2+_K`nR?dfcnqz{yu;eRNy?<+#6iSI@fVyI?wfJT#w526dL`jj!oeI z<&9wfdayqq3~Rw~5i!ml9juNQf*otpn^HcwTMO=9omidNYzVH_;|4$)-O4oT9Vl@R z{{rC2gpy)rnQFhF3x@qhg0ZA5Pb3%?1jAx3#R_aIP->Ku;K6h=Bu*-r2SJ)N5kO{>b62JbHCbFIigT&C4!x2goJVHCmo*jc6z%u-%%E7f$+AOj+@P2LU= z>yjA3q;VEYvdk-z5{ZN3q0WtXg_sNmAuUD{QIX#_5Frg!E&C6WWo)WnlxfmDAi`T<9zrUYPLWB_$3h~qL zi;{Gi2V%xPTZw3d{5RiO<*yot2C%QOv|OA5r)yxQLiS z>S75+1UI1Y;r#HaHe`300dTPemCI5z{;eBgibluwv;r(??C?~`Kw47UL&WonzDOx1(L}h{ zriUZk4s~5W@i488(DiHpLLpN%ohF6LO^+dalun@%rV46xG`c`ROJLOw3fdIN_)Q9- zaxVxV-!h~D^bM`rKj!Mx`W@N9Jhw;V_Nd&Rtx@d)C@MFgaRVwhK$8#W2G_FAwdA=r zjcZfO@0Y}=BoOw^6A4gBGZsBbVo-`Nkgs`0#ki=52FJk<(44K}An-Bx>}4w=km)jI zU(g`vb3r9anLulW?KNFLf@v~UwCZHwLhfSjRGtfKTv+A8U&T1n>HrU=gWA(Wnhrk+ z<7xwJ70b3_27E@TouP+hW)iYhJ+ZY#;}W=6>PNAj?^7g3f`ng$>T*Mc8~RWl8s)tJ z%>1-uDv=JfM{ULQt59if(=GHYDX)TG#t&*V~t*F_U5SKRegC> z${}!foz)l*pfm>*&;!c0lHvrH;J)jr&??n6Hz_7?(wVXkV41>-f2A-57OOF@Zicq5gbmU326DhkYL+AYE`dpw~ z>qfXe?Na*6-yr$=l&hASGeBY5^-~wsK%=(EEFy!l-iAryE}ekRK#r~FbHp}I)1Sx3 zTN*;vPz>ztd}o^3nkS?f#dN@^h9`f7!?A!;%x}@}*k7~Px*)MGmFKz)ktj7|a3j;Iu0 zm`}*W5lbZFk*El5Rsl;%e45hkx*C_SF5(#E@Nm~-7ZbB^>=-BR;VJ$!q@*#(cwvGq zmJr0N#3f%6;ee5d%!{AUWM|p)($dM7Ukr_5Ea5}F&0B&JRRm0RfUrq{I7cDZ9>*{b z4hT4skdxq%i5<8JYv8kV>??FE90VwG;)VkSEM%<8#w6kxSyDv##1wIlU5$$IAL;}X zPLX(#eiOS+nG6)dG-Jo~3QD|8Z1YRI&Y@(yA}#9QQi4eWQ8rnC2Z*y<@V%_$$8QoX%- z?}+9dQN1JovZJ<+n{97(-0aBM9{_0=vg7v-tAS(rz%eaw4D{T$|HJWuf5(P@&$@q4 zZt#P^Kb}|pd-DD>n*WUIKT`9sVtnjF4gYob$9|slq`LK8F8T2>*$g}YG z5qf^iY5C}R57h5Ftz&hL`*jvt_cFBZYo+yP{Nrtw`$xUw0n6V5HmFbby6Jr=wK1M2 zE}oy4gax=N;E9LlUtNgAjUG%x8E&DVg95rbo}l2n6wsszF9NuYbT^}`HKwV84rs)d zuK`#wpQ4qu4Z*(4z~!(tLsnk~{(#L>L?-C3w>?!vCg}FsKt)Z^W1*iWsAp|$6mto1 zyKKPV?Z6)$&_FO=|fqAm@ty6kW$y2Db5d_^ICh K*%$QcRQ(sN4Y>IL diff --git a/AppCode/__pycache__/AOHandler.cpython-312.pyc b/AppCode/__pycache__/AOHandler.cpython-312.pyc deleted file mode 100644 index ef05e4a66a7361dbeaf4399f4d867a5f6171391f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5475 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 diff --git a/AppCode/__pycache__/CITHandler.cpython-311.pyc b/AppCode/__pycache__/CITHandler.cpython-311.pyc deleted file mode 100644 index 86c8608ea28edb93ccedb00aa450140efdd12c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5941 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 CZXVD8 diff --git a/AppCode/__pycache__/Config.cpython-313.pyc b/AppCode/__pycache__/Config.cpython-313.pyc deleted file mode 100644 index c2eec6e9ab2002aa52a2873b2c56579ae803b934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1263 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

-o&(YRhqSY9R8wc0vs{_MJ4 z>$T?l)|@D~uiSn1Q}4jNkz4x3+NGYtj`roQ2fm}9cn8X-`#<%Zxz{m&ZPB=Nr~nR- zrU%~VKJlFS{uaH1pZbRGakqSn%}cKoLWh>45B$eJ@eMsTY2DU*_g8l0bT0(v12^fS zqbYy-D=qT)7RKhs-Wt#MK6JPi8s;0otuCxOPOhPVWtg}R3UV%(=1n(ymv-HY-rsrO zb8leIv}*6i8aZ+61o&zKA?ylT>RKk3t}e9{0!QWykNi7I{+5Ej1^h(i`d#IQ-Q{4o z9152k8XsG9tS7!ti~;lDE0wZH5||@Uf0;fqK&Cnj^omqUH|SWGRMEts}Lg zn<%(<&Gp@Uwd}567@i+q>|C5#*5BK`>h65luwyZ_`0B4(N}&lejmu8hA{Xn1X|4_KAldkgNpOWx%@_l`VpcdhAg zPhS~PV8^24-L56oults$U!5)1wSoWNF-**LJ#5_h?#Pn!{o40xe;p|{;$>1ZOx#qL zeLJv+e@VSGvK;zw&j)+%HQguvVbA@Jdo6|bzK`7xU@Fv@^syQ<`uZ?d^4dvcalLu= z`q`VrjiE1G0a%me-~p`8<(F3)PLvx$W&ikB294XgW|ur&6{prW>kNT>gTyzY=gc>v zci|=YYd<2ikpD>M8a$x?s8-4c zU4w^=A9YCiW3Itt=6^MJYJlkXj-J5aDfJ&)_rb@%HM?{YkBZ{GW`@p@4cQ ztivy{82%y=(HOyJ#57=FL^MYtSEi|iT*G2_INOFJe9d9shv+>dS)CI0u=vqXim)e? z!*299&^k$Kg6q~sO~ZOO;nOreIi4UijdCMQANI4@T_aj6uf(lg(z}%WBIZ&Gd%^Qs zd0mp7!PXguy_{vHr&_1^Sb~#1z|u4RWfs40NN1b;>V+M4EPlOUO*q1`vG{T%ogbnt zIm=y1v{qih;Oy5(1)??s|A0Vo>~&1}R}hIdMHqaJz_B8ot@44 F{{l**1V;b> diff --git a/AppCode/__pycache__/DocumentHandler.cpython-313.pyc b/AppCode/__pycache__/DocumentHandler.cpython-313.pyc deleted file mode 100644 index 7e86f3471409d59eab28a8ff72688a7ac6013034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9583 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 S91x(?C>(R$kG~lF;=cf&5cx>} diff --git a/AppCode/__pycache__/FileHandler.cpython-312.pyc b/AppCode/__pycache__/FileHandler.cpython-312.pyc deleted file mode 100644 index 095e62d6c24583c8c16b74075647f8319da26c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933 zcma)4&1(}u6o0e3O*c)`Y7Irvg9k5rh{QkzMGGZKKQL}eKUBiPvSvoR>3%u0wTY)5 zdhsL$AtyobqSQaY|G|qQVi}K~yj3FzJvoz2N~#y<@Z0x$Z{F{H%)ZZN$3UFMiy3zX z0eq8WaJ0VBy(o+hV8F4ELQam&7dSuZFut(_Zh=_3&hYhYq z_yJd29^;yzEv^Z(#ZxSHVz6wEVk`Lf$Ldi8b|Z8ZA-c#Ka`q>%EoDhaM*MNntqa ze=>A23Og@g2Y#g>oq3jdnt6WfOD_L0mw%^y)^8r@6Ld<%O=FDfwjDS=v28wP+kS|* zJZX>H_Mqn;Ms@2-vO4+X5TdSC>OEq(qPKbQ2MNYiIwPxrB^ptdrCy(xvcq7C# zCtUQj1X+!qks!C<1Nr={AYd2xx!Die^g(XAv#__&sqR%@o_&4oQ*LJG_F)QAQ$G}S yWU{LctVB%e7)q~=MDt{wBmG7)%q+biZp#0Q$tDg}gwR(=|JKrI@+S!B$^8M+3f>C< diff --git a/AppCode/__pycache__/FileHandler.cpython-313.pyc b/AppCode/__pycache__/FileHandler.cpython-313.pyc deleted file mode 100644 index de33b2b039f2e663531bae978b8f436e0a01a414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 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 diff --git a/AppCode/__pycache__/ITATHandler.cpython-313.pyc b/AppCode/__pycache__/ITATHandler.cpython-313.pyc deleted file mode 100644 index 9901af21876eef03444813e6235a6bd8f37efab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7685 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 Kd_fTE!~YL^Ai9PC diff --git a/AppCode/__pycache__/ITRHandler.cpython-311.pyc b/AppCode/__pycache__/ITRHandler.cpython-311.pyc deleted file mode 100644 index 3233e6c8dfeb7989d90da9b021dfb82db3f0e3ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6898 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 Np5wXZ4MZtp{2yZS1VR7+ diff --git a/AppCode/__pycache__/ITRHandler.cpython-313.pyc b/AppCode/__pycache__/ITRHandler.cpython-313.pyc deleted file mode 100644 index 351f0f8be539f7e9bf44799eb4bbf24a09960355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7857 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 diff --git a/AppCode/__pycache__/LoginAuth.cpython-311.pyc b/AppCode/__pycache__/LoginAuth.cpython-311.pyc deleted file mode 100644 index 9c2d8372a86f371af014d8aa9d3210d4815a20d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3155 zcmb7G%}*Og6rWwMy_^yY{js+{^}*VrtkN;}?po|*UN z&3p5HZ)SdMYH}bb1D^#G+ct#$pq>4~RU3O5Xgom}VManpCd?$+Fq^c5ElDoSC9Pp= z(iXNQ`7qB=85U${zsl3cERsDbgay6L0biG8(KN!=#|Yb=u?W3@YLu`8^K-~=|C4t8 zye51gWyK6hq!g`%h$$?Rh$1F4QdAK&o{0CdqO53kBH{!QV~WOSi4=*aiDr#UQF&40 zWl@$B>6G6>?4Xc+ti9|E9pCJPDV^C{_skZh`LgNV%QJBFf%wpy-3R^G> zl*1OVlGB81>4ijUGOH}c_9xM~R;U)Jd%psCf|LV1%qTTy5i&cUN0AyYkM7jkTU1v= z!7R35Zh`&DYSw~nkI^%beo>q8kogbV_-A0{i<+g_-k^oW2%Hu|8W#nJbGG*+>bz!| z{_v*8-I$%b>1Q-PDJqL;ESvU|Zifr%-fd71+fg$Np*!^jnY+5fWW&UN>n51ZerVSI zw%L|Lvtgq!SG8jz&tPk{9n2$z0;pQBZ30@#vHd|BbUAcX3@s{2 z$uAHZdd+5lLgOGalbU5gRP>xXl#+xVIewP7;g6gEBGc%3y>IfDFV24qX3F!EQ`cug z^Hb@il$4HQdH$2Y;7p1dcQg86ZdrztVQ@G&I1(5P3gq3yz0BQ#>;*#)pi^4*kuK2k#z7AvWB2`59aEY$CW%pU2wKk(@qs)!1w^wMj^}zo zw{dn49T`zrvm4~)_klo2ov!ukYqRUKtFvY2akcGSAyIUWm7HU$bFA$0Je}UUR_q=r zb&nKXfs!krIs^KWevZ(?TeC+ZG!-Kejr}~MSqUf?{T7XrMJZ0aAVK%wnkIwrpn7eR#3Ukvw3Cvqhi}&scmqTTjv2sj^_1_uY11i*?3Usd)Zz%wc1k@ z#!JF@g>4c>DhSAH3vyhnjd<%bmWzU~B={<c@{1iHWULDwL%d_W4HGR$hV*vZqXVOq5BLur_hC~ zh2D$}C_I2tgwB!1EHU@&qx;fHiUQ6yVQ+gN=ASf=H9L%wApN%p03rDGIRRq)bl{V z$ggl zmVV9EAD2edY5X-Io=wG+bXt-Ly&nu)%=W#pPZ%CuBBLNeA4KxcKq?l7VRq3i_5Xjn j=pFUnzg^@}&EGESQq5n5>t|pi8p&%q_SX>%eTV)5waLD; diff --git a/AppCode/__pycache__/LoginAuth.cpython-312.pyc b/AppCode/__pycache__/LoginAuth.cpython-312.pyc deleted file mode 100644 index cfc6d1f06261d830997df9932a49ef4cd96faeb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2715 zcmb7G(Qng67(Y99oP?B?rnGcvgzcJel!7WG2BTwwf>gFuQ6$ggoHnf;hqFUz z)S^zRv{pkalQz*wNaLZCg4hF()Bc6Mq@)s?6~v_RvbRDWHu1FY>^M!kKCqMg-JS3I zzWeTezwhpTZD>8urhoJz^e64Og{w9yQ_#4NFv5(AG$zhyY@F3RagWBuIgO9= znm6v%gt)*^9Ts$GzdC0B^Qb<}ANSjB4#sU=7L6jzFCpxG%sMm019L*e_ZRI%1k3+{ znp3hQoiVLOqGYf_Bva9{s%$EjK$M#~#V{=&QE-|lNz)Q?M3quHvG|lK8&j5GD29>N zGZ7E*fkOhTLqq`ah_U!tB4>>VL;TQB!dELywN*I;jr&MJaR#F}i6U34@2-Mb z?7`e5`xEc_!QLhGxT>|l{0~pU<7#}^SLcD9LlOU&#mTU^y!U;TF4Xdjet6yDu3a6! z9$_p&Q_LwH8#{K6EGe{3LjGO>H;RxEKYn?0{%B~i=6Xm-xx z?eOzm+dm~Kok^RL6dh6Zq^ufeqqYhK)%XI$B6``_x_W2j&coKHjmOI2?jJ_JA9)t; z+X(j+J}!k%-Sh4BZ_A5XI@V^NhI$LbPx4Ru&i&RK{dRQi;x|{zE$zj3`U`WLEvL)j zBkQAuOQoYj;HTJf>LndI{qyi<%Y~Pr?uR3#&_FRbP=O#&UZ82F=ghq`Y8q7P50kwz z$~^#pnG`m=Umu!7_a;Ek24^QD zyiEs-PpXPccCq3SB3+F&MKaiExCTyp~UrXx>PY#oowTJOOt~#A9)WqNa!l z8iYDFsIDlAPH14`&?Mjd-{9!B8F3JcsN5W0ySV;QskwidyDI<-0{d6nR@zoOS32+A zF7!NUEgW9%Ecs8rVjKK}6%PuW*`lp2v0ibmoK=x+sO$+O`X+$40N&2^s;Uk65X|+@ zBKo88;DgUL8jqHn4i;Pc3KN@6L*=%^>p~$|5>J-ehKfx?zlU1x;bN#~EwvHqDF%BS z4%2rMyd~bHArDY72*L^N^D2$@?~KFFqAJsOj`UDd5d;KO_U~W5`PHEc%lUgLBbv8p zYb$`7+Lrg*Q;$K89Rp=6AW52zb1EfwP?B!uWYwWM>4RYsqk_720;ZS~dP~`YK7WiL zh$ZxzZRbx^Mg+diQKUL!k$uj?X~xbX`#87H|Lu2^0~CeK@~3i{q^awwLFh^9%(8Rl zH@*=k*0baksL+RoaTLUshhdl(XyO@~*gz96(D4m){5c9gN9})ey-eF{1i}vMUpYZh AS^xk5 diff --git a/AppCode/__pycache__/LoginAuth.cpython-313.pyc b/AppCode/__pycache__/LoginAuth.cpython-313.pyc deleted file mode 100644 index aab739603afdfc7213eb59580f413b9dba8f1513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2735 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 YphJeDs9#a=7bO141}Xm$0%V!}3#^8WA^-pY diff --git a/AppCode/__pycache__/YearGet.cpython-313.pyc b/AppCode/__pycache__/YearGet.cpython-313.pyc deleted file mode 100644 index 4f6509ea8d122cb654a914d0e67cd916825d4bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2580 zcmbVOTTdHD6rR2Mg2AL1H)|Zn5Ql07a?%P2&`V@4xs-rXHcl@ft<16}4rUi-7d5C4 ziK40ksS%`7)FM?1kBQocwEqBp0WKtVw`oXiPA{vNPFg-IhVP8 z=gjU@SNjoZk1l?a`-Mg5HxS%LWV`LOlI|9gkVFljcPUK8fu{#(%p62bNMa&LV%urQ z7_$?!$UOogw$teP73uqj^Q0&dcYqewla~qh~cmpHeSmu1Ir+sZNci zrl))LadotOB+2PH%PY${EoaKIRqKwrBRq+1v=DL)Jq$&Qq2v#t^X|m8(%3Xxhc0pkeGC~i@geu8rzHvkpQi_X z2vwmtnP1}uMTbw*31S&1pT=cTBO39#GY{MO;Yv7T z_G{3GN#1CDicggLER{uXGlx-@BFM4WIRfmbfx$WHy>sz?jCI^CdT|vAXL*%OK0l3h z#i}t(9joIqR*l)bX;|K@YATnA*5an-jG4UUD??1j7H0>sxM`fzOwog@A(Rio$XaGf zwK$m2uy`ky#bW(q!(s@vDAfSS$DM|2z|n>6FZ3Zg&zhEEG1VOHv@@MUHy%-|7>w&@TqZ}Eb4lyCe?ygYim-?{A$btd@~2M zCDzl(tof>YqRd*D0zS$Ss#IbbKxE^;=cVy4Q6Ie0M(<%lq6w0ppFJvm-r-IMn0F~ zY~+)^0{NaHE7*HURVD#U{a12^X<(=~7Oy%&hzO@d8aKlrr$SH_|m1;cd47lZ)Zt9%{%;J)7Y#=Vc$+fHo;PXAgToX3$e}zvF;^* zNjOpzS_?w!hLF57QxIPNf`81Q!*3Fh*B|;SyE3zUdA&|t4~S2G4~F)`yrTl#_aN-~kjIl65*er5aY|k{R1B3DL#cIMMY{~)B$2IZ_a1CR@**H3 zPRKP>@&*>G7OIL~q2LuZy$vAy7JQ4rh2VX!fB~NbNp@f;QA45+9!#i)nl8&2iac%t0=RG%RWHkinK5&UoH0$D8=Ey%LzeF% zdsb)hkdhb(oR0y({S0lhG}pQ9uj0bn(E!)+XO!k5jtdxyoK;hP<&(~zl=DLow5xq` wx7a(dx8uX1?#*d=-*Ptf4(=oh$Vvm!W{aUH>SuK1ClvmRJxWEk5h1qQzfgSx-2eap diff --git a/main.py b/main.py index 57459f8..e39b29b 100644 --- a/main.py +++ b/main.py @@ -443,6 +443,17 @@ def summary_report(): docHandler = DocumentHandler() return docHandler.Summary_report(request=request) +@app.route('/summary/download', methods=['GET']) +@auth.login_required +def download_summary(): + year_raw = request.args.get('year') + if not year_raw: + return "Year parameter is required", 400 + + docHandler = DocumentHandler() + # reuse your existing Summary_report method + return docHandler.Summary_report(request=request) + # check year in table existe or not by using ajax calling. # @app.route('/check_year', methods=['POST']) @@ -513,6 +524,12 @@ def save_mat_row(): finally: mat.close() +@app.route("/summary/preview") +def summary_preview_route(): + handler = DocumentHandler() + return handler.Summary_preview(request) + + # save mat credit bulk data # @app.route("/save_mat_all", methods=["POST"]) # @auth.login_required diff --git a/static/css/summary.css b/static/css/summary.css index 1888f4c..d83932b 100644 --- a/static/css/summary.css +++ b/static/css/summary.css @@ -1,153 +1,278 @@ -/* ================= GLOBAL FORM ELEMENTS ================= */ +/* ================= PAGE WRAPPER ================= */ +.main { + margin-left: 260px; + width: calc(100% - 260px); + margin-top: 80px; + padding: 20px; + transition: all 0.3s ease; +} + +/* ================= CONTAINER ================= */ +.container { + width: 100%; + max-width: none; + margin: 0; + padding: 25px 30px; + background: #ffffff; + border-radius: 12px; + box-shadow: 0 8px 22px rgba(0, 0, 0, 0.08); +} + +/* ================= PAGE TITLE ================= */ +.container h2 { + text-align: center; + color: #007bff; + font-size: 22px; + font-weight: 700; + margin-bottom: 20px; +} + +h3 { + text-align: center; + margin-top: 10px; +} + +/* ================= FORM ================= */ +form { + width: 100%; +} + form label { - display: block; - margin-top: 10px; - font-weight: bold; - color: #333; + display: block; + margin-top: 10px; + font-weight: 600; + color: #333; } -select { - width: 100%; - max-width: 300px; - /* restrict width on desktop/laptop */ - padding: 10px 12px; - border: 1px solid #ccc; - border-radius: 6px; - margin-top: 6px; - font-size: 15px; - background-color: white; - cursor: pointer; - transition: 0.2s; +/* ================= INPUTS ================= */ +form input, +form select { + width: 100%; + padding: 10px 12px; + margin-top: 6px; + border: 1px solid #ccc; + border-radius: 6px; + background-color: #f8f9ff; + font-size: 14px; } -select:focus { - border-color: #007bff; - box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); - outline: none; +form input:focus, +form select:focus { + outline: none; + border-color: #007bff; + box-shadow: 0 0 6px rgba(0, 123, 255, 0.35); +} + +/* ================= AUTO FIELDS ================= */ +.auto { + background-color: #d5edd7; + font-weight: 600; +} + +/* ================= FORM GROUP ================= */ +.form-group { + margin-bottom: 16px; + display: flex; + flex-direction: column; + font-weight: 600; +} + +/* Inline two columns */ +.form-group.inline-2 { + flex-direction: row; + gap: 16px; +} + +.form-group.inline-2 > div { + flex: 1; } /* ================= BUTTONS ================= */ button { - margin-top: 20px; - padding: 10px 18px; - background-color: #007bff; - color: white; - border: none; - cursor: pointer; - border-radius: 6px; - font-size: 15px; - font-weight: 600; - transition: 0.3s; + display: block; + width: 60%; + margin: 25px auto 0; + padding: 12px 20px; + background-color: #28a745; + color: #fff; + border: none; + border-radius: 6px; + font-size: 15px; + font-weight: 600; + cursor: pointer; + transition: 0.3s; } button:hover { - background-color: #0069d9; -} - -/* ================= MAIN CONTAINER ================= */ -.main { - margin-left: 260px; - /* sidebar width if exists */ - padding: 70px 30px 40px 30px; - /* top padding for navbar */ - margin-top: 50px; - /* extra top spacing */ - width: auto; - transition: 0.3s; -} - -.container { - max-width: 800px; - margin: 0 auto; - background: #ffffff; - padding: 35px 40px; - border-radius: 12px; - box-shadow: 0 8px 22px rgba(0, 0, 0, 0.08); + background-color: #218838; + box-shadow: 0 4px 10px rgba(40, 167, 69, 0.35); } /* ================= BACK BUTTON ================= */ .back-btn { - display: inline-block; - margin-top: 20px; - padding: 10px 18px; - background-color: #007bff; - color: white; - font-size: 15px; - font-weight: 600; - border-radius: 6px; - text-decoration: none; - transition: 0.3s; + display: inline-block; + margin-top: 20px; + padding: 10px 18px; + background-color: #007bff; + color: #fff; + font-size: 15px; + font-weight: 600; + border-radius: 6px; + text-decoration: none; + transition: 0.3s; } .back-btn:hover { - background-color: #006ae6; + background-color: #006ae6; } -/* ================= MESSAGES ================= */ +/* ================= STICKY FILTER BAR ================= */ +.head { + position: sticky; + top: 60px; + background: #fff; + z-index: 1000; + padding: 15px 0; + border-bottom: 1px solid #ccc; +} + +/* ================= SELECT + DOWNLOAD ================= */ +.select-download-wrapper { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 10px; +} + +.select-download-wrapper select { + max-width: 300px; +} + +select { + width: 100%; + max-width: 300px; + padding: 10px 12px; + border: 1px solid #ccc; + border-radius: 6px; + margin-top: 6px; + font-size: 15px; + background-color: white; + cursor: pointer; + transition: 0.2s; +} + +select:focus { + border-color: #007bff; + box-shadow: 0 0 5px rgba(0,123,255,0.5); + outline: none; +} + +/* ================= DOWNLOAD BUTTON ================= */ +#downloadBtn { + display: none; + padding: 10px 20px; + font-size: 16px; + background-color: #28a745; + color: #fff; + text-decoration: none; + border-radius: 4px; + white-space: nowrap; + transition: 0.3s; +} + +#downloadBtn:hover { + background-color: #218838; +} + +/* ================= TABLE PREVIEW ================= */ +#previewContent { + max-height: 60vh; + overflow-y: auto; + overflow-x: auto; + width: 100%; + margin-top: 15px; +} + +#previewContent table { + width: 100%; + min-width: 600px; + border-collapse: collapse; +} + +#previewContent th, +#previewContent td { + padding: 10px; + border: 1px solid #ccc; + white-space: nowrap; +} + +/* Sticky table header */ +#previewContent th { + position: sticky; + top: 0; + background-color: #007bff; + color: #fff; + z-index: 10; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +/* ================= MESSAGE ================= */ .message { - margin-top: 15px; - color: #555; - font-size: 14px; + margin-top: 15px; + color: #555; + font-size: 14px; } /* ================= RESPONSIVE ================= */ - -/* Tablets (<= 992px) */ @media (max-width: 992px) { - .main { - margin-left: 0; - /* remove sidebar spacing */ - padding: 50px 20px 20px 20px; - } + .main { + margin-left: 0; + width: 100%; + padding: 20px; + } - .container { - padding: 25px 20px; - } - - select { - max-width: 100%; - /* full width */ - } - - button { - width: 100%; - /* full width */ - padding: 12px 0; - } + button { + width: 100%; + } +} + +@media (max-width: 768px) { + .container { + padding: 18px; + } + + .container h2 { + font-size: 18px; + } + + .form-group.inline-2 { + flex-direction: column; + gap: 10px; + } } -/* Mobile (<= 576px) */ @media (max-width: 576px) { - .main { - padding: 40px 15px 15px 15px; - } + .main { + padding: 15px; + margin-top: 70px; + } - .container { - padding: 20px; - } + #previewContent table { + min-width: 500px; + } - h2 { - font-size: 22px; - text-align: center; - } + #previewContent th, + #previewContent td { + font-size: 13px; + padding: 8px; + } +} - select { - font-size: 14px; - padding: 10px; - } - - button { - font-size: 14px; - padding: 12px 0; - } - - .back-btn { - width: 100%; - text-align: center; - padding: 12px 0; - } - - .message { - font-size: 13px; - } -} \ No newline at end of file +@media (max-width: 420px) { + form input, + form select { + font-size: 13px; + padding: 9px; + } +} diff --git a/static/js/summary_preview.js b/static/js/summary_preview.js new file mode 100644 index 0000000..cf1ab60 --- /dev/null +++ b/static/js/summary_preview.js @@ -0,0 +1,55 @@ +document.getElementById("year").addEventListener("change", function () { + const year = this.value; + + const downloadBtn = document.getElementById("downloadBtn"); + const previewDiv = document.getElementById("preview"); + const contentDiv = document.getElementById("previewContent"); + + if (!year) { + downloadBtn.style.display = "none"; + previewDiv.style.display = "none"; + contentDiv.innerHTML = ""; + return; + } + + downloadBtn.href = `/summary/download?year=${year}`; + downloadBtn.style.display = "inline-block"; + + fetch(`/summary/preview?year=${year}`) + .then(res => res.json()) + .then(data => { + let html = ` + + + + + + + + + + `; + + data.forEach(row => { + html += ` + + + + + + `; + }); + + html += `
ParticularITRAOCITITAT
${row.Particular}${row.ITR}${row.AO}${row.CIT}${row.ITAT}
`; + contentDiv.innerHTML = html; + + // Show preview + previewDiv.style.display = "block"; + + + + + + }) + .catch(err => console.error("Preview load error:", err)); +}); diff --git a/templates/summary_reports.html b/templates/summary_reports.html index def7dd6..d07082d 100644 --- a/templates/summary_reports.html +++ b/templates/summary_reports.html @@ -1,32 +1,37 @@ -{% extends "base.html" %} - -{% block title %}Download Summary Report{% endblock %} - +{% extends "base.html" %} {% block title %}Download Summary Report{% endblock %} {% block extra_css %} - - -{% endblock %} - -{% block content %} + +{% endblock %} {% block content %}
+

Download Year-wise Summary Report

{% if message %}

{{ message }}

{% endif %} -
- - +
+ - - + Download Summary Report +
+
+ +
- -{% endblock %} \ No newline at end of file +{% endblock %} {% block extra_js %} + +{% endblock %} diff --git a/templates/upload.html b/templates/upload.html index 19c2c93..bf2100c 100644 --- a/templates/upload.html +++ b/templates/upload.html @@ -9,7 +9,7 @@ {% block content %}

Upload Income Tax Documents

-
+ -- 2.49.1 From b8d540263b9da8c574af6188ad4deef23f21037e Mon Sep 17 00:00:00 2001 From: Swapnil9693 Date: Sat, 7 Feb 2026 18:36:31 +0530 Subject: [PATCH 2/2] AO_Form_New_Updated --- .env | 2 +- static/js/ao_calc.js | 235 +++++++++++++++++++++++++----------------- templates/add_ao.html | 132 ++++++++++++++++-------- 3 files changed, 229 insertions(+), 140 deletions(-) diff --git a/.env b/.env index 6ef70f0..246791d 100644 --- a/.env +++ b/.env @@ -21,5 +21,5 @@ DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=test_income_taxdb DB_USER=root -DB_PASSWORD=root +DB_PASSWORD=tiger diff --git a/static/js/ao_calc.js b/static/js/ao_calc.js index 0241981..79796ad 100644 --- a/static/js/ao_calc.js +++ b/static/js/ao_calc.js @@ -1,107 +1,150 @@ document.addEventListener("DOMContentLoaded", function () { + function getValue(id) { + var el = document.getElementsByName(id)[0]; + return el ? parseFloat(el.value) || 0 : 0; + } - function getValue(id) { - var el = document.getElementsByName(id)[0]; - return el ? parseFloat(el.value) || 0 : 0; + function setValue(id, val) { + var el = document.getElementsByName(id)[0]; + if (el) el.value = Number(val).toFixed(2); + } + + window.calculate = function () { + // --- BASIC INPUTS --- + var gross_total_income = getValue("gross_total_income"); + var disallowance_14a = getValue("disallowance_14a"); + var disallowance_37 = getValue("disallowance_37"); + + // -- total gross income -- + var gross_total = gross_total_income + disallowance_37 + disallowance_14a; + setValue("gti_as_per_ao", gross_total); + // console.log("gross_total income:: " + gross_total) + + // --- DEDUCTIONS --- + var d80_business = getValue("deduction_80ia_business"); + var d80_misc = getValue("deduction_80ia_misc"); + var d80_other = getValue("deduction_80ia_other"); + var d80_sec37 = getValue("deduction_sec37_disallowance"); + + // -- TAX A CALCULATIONS -- + var per_a = getValue("per_a"); + var tax_a = getValue("tax_a"); + var per_surcharge_a = getValue("per_surcharge_a"); + var surcharge_a = getValue("surcharge_a"); + var per_cess_a = getValue("per_cess_a"); + var edu_cess_a = getValue("edu_cess_a"); + + // -- TAX b CALCULATIONS -- + + var tax_book_profit = getValue("tax_book_profit"); + console.log(tax_book_profit); + + var per_surcharge_b = getValue("per_surcharge_b"); + var surcharge_b = getValue("surcharge_b"); + var per_cess_b = getValue("per_cess_b"); + var edu_cess_b = getValue("edu_cess_b"); + + var deduction = d80_business + d80_misc + d80_other + d80_sec37 - 1.35; + + var deduction_80g = getValue("deduction_80g"); + + // --- NET TAXABLE INCOME --- + var net_taxable_income = gross_total - deduction - deduction_80g; + setValue("net_taxable_income", net_taxable_income); + + // --- TAX (A)% AMOUNT --- + var tax_a = net_taxable_income * (per_a / 100); + setValue("tax_a", tax_a); + + // --- SURCHARGE (A)% AMOUNT --- + var surcharge_a = tax_a * (per_surcharge_a / 100); + setValue("surcharge_a", surcharge_a); + + // --- CESS (A)% AMOUNT --- + var edu_cess_a = (surcharge_a + tax_a) * (per_cess_a / 100); + setValue("edu_cess_a", edu_cess_a); + + //SUM OF (A)% + var sum_of_a = tax_a + surcharge_a + edu_cess_a; + + setValue("sum_of_a", sum_of_a); + + //----------------------------------------------------------------------------------------------------------- + //----------------------------------------------------------------------------------------------------------- + + // --- SURCHARGE (B)% AMOUNT --- + var surcharge_b = tax_book_profit * (per_surcharge_b / 100); + setValue("surcharge_b", surcharge_b); + + // --- CESS (B)% AMOUNT --- + var edu_cess_b = (surcharge_b + tax_book_profit) * (per_cess_b / 100); + setValue("edu_cess_b", edu_cess_b); + + //SUM OF (B)% + var sum_of_b = tax_book_profit + surcharge_b + edu_cess_b; + + setValue("sum_of_b", sum_of_b); + + // --- TAX PAYABLE (18.5%) --- + var tax185 = getValue("tax_book_profit_18_5"); + + // --- Education Cess 3% --- + var tax_payable = tax_a > tax_book_profit ? tax_a : tax_book_profit; + setValue("tax_payable", tax_payable); + + // --- SURCHARGE --- + var percent = getValue("persentage"); + var surcharge = tax_payable * (percent / 100); + setValue("surcharge", surcharge); + + // --- EDUCATION CESS --- + var per_cess = getValue("persentage_cess"); + var edu_cess = (tax_payable + surcharge) * (per_cess / 100); + setValue("edu_cess", edu_cess); + + // --- total tax payable --- + var total_tax_payable = sum_of_a > sum_of_b ? sum_of_a : sum_of_b; + setValue("total_tax_payable", total_tax_payable); + + // // --- mat_credit_created --- new + // setValue("mat_credit_created", Math.max(tax185 - total_tax_payable, 0)); + // // --- mat credit_utilized --- new + // setValue("mat_credit_utilized", Math.max(total_tax_payable - tax185, 0)); + + // --- MAT credit and utilized --- + var a = sum_of_a; + var b = sum_of_b; + var result = 0; + var zero = 0; + if (b > a) { + result = a - b; + setValue("mat_credit_created", result); + setValue("mat_credit_utilized", zero); } - function setValue(id, val) { - var el = document.getElementsByName(id)[0]; - if (el) el.value = Number(val).toFixed(2); + if (a > b) { + result = b - a; + setValue("mat_credit_utilized", result); + setValue("mat_credit_created", zero); } - window.calculate = function () { + // --- FINAL TAX --- + var mat_credit_uti = getValue("mat_credit_utilized"); + var interest_234c = getValue("interest_234c"); - // --- BASIC INPUTS --- - var gross_total_income = getValue("gross_total_income"); - var disallowance_14a = getValue("disallowance_14a"); - var disallowance_37 = getValue("disallowance_37"); + // var total_tax = total_tax_payable + mat_credit + interest_234c; + var total_tax = total_tax_payable + interest_234c - mat_credit_uti; + setValue("total_tax", total_tax); - // -- total gross income -- - var gross_total = gross_total_income + disallowance_37 + disallowance_14a - // console.log("gross_total income:: " + gross_total) + // --- ASSESSMENT --- + var adv_tax = getValue("advance_tax"); + var tds = getValue("tds"); + var tcs = getValue("tcs"); + var tax_on_regular_assessment = getValue("tax_on_assessment"); - // --- DEDUCTIONS --- - var d80_business = getValue("deduction_80ia_business"); - var d80_misc = getValue("deduction_80ia_misc"); - var d80_other = getValue("deduction_80ia_other"); - var d80_sec37 = getValue("deduction_sec37_disallowance"); + var all_tax = adv_tax + tds + tcs + tax_on_regular_assessment; - var deduction = d80_business + d80_misc + d80_other + d80_sec37 - 1.35; - - var deduction_80g = getValue("deduction_80g"); - - // --- NET TAXABLE INCOME --- - var net_taxable_income = gross_total - deduction - deduction_80g; - setValue("net_taxable_income", net_taxable_income); - - // --- TAX 30% --- - var tax30 = net_taxable_income * 0.30; - setValue("tax_30_percent", tax30); - - // --- TAX PAYABLE (18.5%) --- - var tax185 = getValue("tax_book_profit_18_5"); - - // --- Education Cess 3% --- - var tax_payable = (tax30 > tax185) ? tax30 : tax185; - setValue("tax_payable", tax_payable); - - // --- SURCHARGE --- - var percent = getValue("persentage"); - var surcharge = tax_payable * (percent / 100); - setValue("surcharge", surcharge); - - // --- EDUCATION CESS --- - var per_cess = getValue("persentage_cess"); - var edu_cess = (tax_payable + surcharge) * (per_cess / 100); - setValue("edu_cess", edu_cess); - - // --- total tax payable --- - var total_tax_payable = tax_payable + surcharge + edu_cess; - setValue("total_tax_payable", total_tax_payable); - - // // --- mat_credit_created --- new - // setValue("mat_credit_created", Math.max(tax185 - total_tax_payable, 0)); - // // --- mat credit_utilized --- new - // setValue("mat_credit_utilized", Math.max(total_tax_payable - tax185, 0)); - - // --- MAT credit and utilized --- - var a = tax185 - var b = total_tax_payable - var result = 0 - if (a > b) { - result = a - b - setValue("mat_credit_created", result); - } - else { - setValue("mat_credit_created", result); - } - - if (b > a) { - result = b - a - setValue("mat_credit_utilized", result); - } - else { - setValue("mat_credit_utilized", result); - } - - // --- FINAL TAX --- - var mat_credit = getValue("mat_credit_utilized"); - var interest_234c = getValue("interest_234c"); - - // var total_tax = total_tax_payable + mat_credit + interest_234c; - var total_tax = total_tax_payable - mat_credit + interest_234c; - setValue("total_tax", total_tax); - - // --- ASSESSMENT --- - var adv_tax = getValue("advance_tax"); - var tds = getValue("tds"); - var tcs = getValue("tcs"); - var tax_on_regular_assessment = getValue("tax_on_assessment"); - - var all_tax = adv_tax + tds + tcs + tax_on_regular_assessment; - - var refund = total_tax - all_tax; - setValue("refund", refund); - }; + var refund = total_tax - all_tax; + setValue("refund", refund); + }; }); diff --git a/templates/add_ao.html b/templates/add_ao.html index c5bef34..c5d3f32 100644 --- a/templates/add_ao.html +++ b/templates/add_ao.html @@ -1,6 +1,7 @@ {% extends "base.html" %} {% block title %}Add New AO Record{% endblock %} + {% block extra_css %} @@ -8,8 +9,7 @@ {% block content %}
- -

New Assessing Officer Form

+

New AO Form

@@ -27,7 +27,6 @@
-
@@ -42,6 +41,12 @@
+
+
+ + +
+
@@ -54,13 +59,12 @@
- +
-
Less: Deduction 80G:
- -
-
- -
- - + + +
+
+ +
+
+ +
- - + +
+
+ + +
+
+ + +
+ +
+ +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
@@ -134,9 +180,12 @@
-
- - + +
+
+ + +
@@ -162,11 +211,10 @@
- +
-
@@ -183,11 +231,9 @@
- - {% endblock %} {% block extra_js %} -- 2.49.1