From a9af2cde8a7050d524b73af454f30ea6c3f77715 Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Fri, 6 Feb 2026 15:11:58 +0530 Subject: [PATCH] update itr and ao from and auto save mat ceadit and utility --- .gitignore | 10 + AppCode/AOHandler.py | 11 +- AppCode/DocumentHandler.py | 307 +++++++++++---- AppCode/ITRHandler.py | 36 +- AppCode/MatCreditHandler.py | 148 ++++--- 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 -> 8290 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 -> 7674 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 1260 -> 1260 bytes .../DocumentHandler.cpython-311.pyc | Bin 10482 -> 0 bytes .../DocumentHandler.cpython-312.pyc | Bin 8676 -> 0 bytes .../DocumentHandler.cpython-313.pyc | Bin 9583 -> 12225 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 7933 -> 8456 bytes AppCode/__pycache__/LoginAuth.cpython-311.pyc | Bin 3155 -> 0 bytes AppCode/__pycache__/LoginAuth.cpython-312.pyc | Bin 2715 -> 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 | 59 ++- static/css/summary.css | 365 ++++++++++++------ static/js/ao_calc.js | 38 +- static/js/itr_calc.js | 28 +- static/js/summary_preview.js | 55 +++ templates/add_ao.html | 22 +- templates/add_itr.html | 2 +- templates/display_ao.html | 2 + templates/mat_credit.html | 2 +- templates/summary_reports.html | 42 +- templates/update_ao.html | 19 +- templates/view_docs.html | 6 +- 43 files changed, 825 insertions(+), 327 deletions(-) delete mode 100644 AppCode/__pycache__/AOHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/AOHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/CITHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/CITHandler.cpython-312.pyc delete mode 100644 AppCode/__pycache__/Config.cpython-311.pyc delete mode 100644 AppCode/__pycache__/Config.cpython-312.pyc delete mode 100644 AppCode/__pycache__/DocumentHandler.cpython-311.pyc delete mode 100644 AppCode/__pycache__/DocumentHandler.cpython-312.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__/LoginAuth.cpython-311.pyc delete mode 100644 AppCode/__pycache__/LoginAuth.cpython-312.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/.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/AOHandler.py b/AppCode/AOHandler.py index 7aa648c..9e0979d 100644 --- a/AppCode/AOHandler.py +++ b/AppCode/AOHandler.py @@ -32,6 +32,8 @@ class AOHandler: # Add AO record def add_ao(self, data): + + try: fields = [ 'year', 'gross_total_income', 'disallowance_14a', 'disallowance_37', 'deduction_80ia_business', 'deduction_80ia_misc', 'deduction_80ia_other', @@ -40,13 +42,18 @@ class AOHandler: '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' + 'sat', 'tax_on_assessment', 'refund', 'Remarks','created_at' ] values = [data.get(f, 0) for f in fields] - self.cursor.callproc("InsertAO", values) self.conn.commit() + except Exception as e: + self.conn.rollback() + raise e + finally: + self.cursor.close() + self.conn.close() # UPDATE AO RECORD by AO id def update_ao(self, id, data): 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/ITRHandler.py b/AppCode/ITRHandler.py index 2cec0cb..0714ca1 100644 --- a/AppCode/ITRHandler.py +++ b/AppCode/ITRHandler.py @@ -41,21 +41,29 @@ class ITRHandler: # INSERT ITR RECORD using procedure "add_itr" def add_itr(self, data): - columns = [ - 'year', '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','created_at' - ] - values = [data.get(col, 0) for col in columns] + try: + columns = [ + 'year', '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','created_at' + ] + values = [data.get(col, 0) for col in columns] + + # Call your stored procedure + self.cursor.callproc("InsertITR", values) + self.conn.commit() + except Exception as e: + self.conn.rollback() + raise e + finally: + self.cursor.close() + self.conn.close() - # Call your stored procedure - self.cursor.callproc("InsertITR", values) - self.conn.commit() # update itr by id def update(self, id, data): diff --git a/AppCode/MatCreditHandler.py b/AppCode/MatCreditHandler.py index e2cf3e6..e31ea66 100644 --- a/AppCode/MatCreditHandler.py +++ b/AppCode/MatCreditHandler.py @@ -1,15 +1,18 @@ from AppCode.Config import DBConfig + class MatCreditHandler: def __init__(self): - # db = DBConfig() self.conn = DBConfig.get_db_connection() self.cursor = self.conn.cursor(dictionary=True) - # get all Mat credit data + # -------------------------------------------------- + # FETCH ALL MAT CREDIT + UTILIZATION (For UI Display) + # -------------------------------------------------- def fetch_all(self): try: + self.cursor.callproc("GetMatCedit") result_sets = self.cursor.stored_results() mat_rows = next(result_sets).fetchall() @@ -18,30 +21,78 @@ class MatCreditHandler: return mat_rows, utilization_rows finally: self.cursor.close() + self.conn.close() - # Save Mat credit data single row + # -------------------------------------------------- + # SAVE / UPDATE SINGLE MAT ROW (FROM MANUAL UI) + # -------------------------------------------------- @staticmethod def save_single(data): conn = DBConfig.get_db_connection() cur = conn.cursor(dictionary=True) + try: + # Save / Update MAT Credit + cur.callproc( + "SaveOrUpdateMatCredit", + ( + data["financial_year"], + data["mat_credit"], + data["balance"], + data.get("remarks", "") + ) + ) - cur.callproc("SaveOrUpdateMatCredit",( - data["financial_year"], - data["mat_credit"], - data["balance"] - )) - - result = next(cur.stored_results()).fetchone() - mat_id = result["mat_id"] - - if not mat_id: - raise Exception("mat_id not returned from procedure") + mat_id = None + for result in cur.stored_results(): + mat_id = result.fetchone()["mat_id"] + # Save utilization rows for u in data.get("utilization", []): + if float(u["amount"]) > 0: + cur.callproc( + "InsertMatUtilization", + (mat_id, u["year"], u["amount"]) + ) + + conn.commit() + + except Exception as e: + conn.rollback() + raise e + finally: + cur.close() + conn.close() + + # -------------------------------------------------- + # AUTO SAVE MAT FROM ITR (MAIN LOGIC) + # -------------------------------------------------- + @staticmethod + def save_from_itr(year, mat_created, mat_utilized, remarks="Auto from"): + conn = DBConfig.get_db_connection() + cur = conn.cursor(dictionary=True) + + try: + mat_created = float(mat_created or 0) + mat_utilized = float(mat_utilized or 0) + + balance = mat_created - mat_utilized + + # Save / Update MAT Credit + cur.callproc( + "SaveOrUpdateMatCredit", + (year, mat_created, balance, remarks) + ) + + mat_id = None + for result in cur.stored_results(): + mat_id = result.fetchone()["mat_id"] + + # Save utilization only if used + if mat_utilized > 0: cur.callproc( "InsertMatUtilization", - (mat_id, u["year"], u["amount"]) + (mat_id, year, mat_utilized) ) conn.commit() @@ -49,56 +100,29 @@ class MatCreditHandler: except Exception as e: conn.rollback() raise e - finally: cur.close() conn.close() - - # save all Mat credit data - # @staticmethod - # def save_bulk(rows): - # conn = DBConfig.get_db_connection() - # cur = conn.cursor() - # skipped = [] - # try: - # for row in rows: - # cur.execute( - # "SELECT id FROM mat_credit WHERE financial_year=%s", - # (row["financial_year"],) - # ) - # if cur.fetchone(): - # skipped.append(row["financial_year"]) - # continue + # -------------------------------------------------- + # DELETE MAT CREDIT SAFELY (OPTIONAL) + # -------------------------------------------------- + def delete_by_year(self, financial_year): + try: + self.cursor.execute( + "DELETE FROM mat_credit WHERE financial_year=%s", + (financial_year,) + ) + self.conn.commit() + finally: + self.cursor.close() + self.conn.close() - # cur.execute(""" - # INSERT INTO mat_credit (financial_year, mat_credit, balance) - # VALUES (%s,%s,%s) - # """, (row["financial_year"], row["mat_credit"], row["balance"])) - - # mat_id = cur.lastrowid - - # for u in row["utilization"]: - # cur.execute(""" - # INSERT INTO mat_utilization - # (mat_credit_id, utilized_year, utilized_amount) - # VALUES (%s,%s,%s) - # """, (mat_id, u["year"], u["amount"])) - - # conn.commit() - # return skipped - - # except Exception: - # conn.rollback() - # raise - - # finally: - # cur.close() - # conn.close() - - # CLOSE CONNECTION + # -------------------------------------------------- + # CLOSE CONNECTION (MANUAL USE) + # -------------------------------------------------- def close(self): - self.cursor.close() - self.conn.close() - - + if self.cursor: + self.cursor.close() + if self.conn: + self.conn.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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 jt)w)Xbl{3I%s>;sGTwzTW`RgF1&#e((GH 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 delta 20 acmexm{mYvBGcPX}0}zBSY23*DUKRjL-UiVC diff --git a/AppCode/__pycache__/Config.cpython-311.pyc b/AppCode/__pycache__/Config.cpython-311.pyc deleted file mode 100644 index 7ac6d23377465a7bf28a4e47d4d53e5d5fd572a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmah|%}*0S6rbI8OS^z&i3NcuJs1p8YH0+65)+_CFnnkW8nDS`>8w!F?!xTyQ7-nt z!2<^lByi+}A8_zb0n2?>cOZzbS`lW(@&B`hS)bbd4QdvD(S=I!g3+FB7od-$O{ z^PNZNH{00FTUne%VX=iU!dw&W59X4n-TQ}aN7EJ7 znw*IHu-!tc6^%twJ#)4VZo#}OqTurIV6V%==kgG+&*f3&@~Faomxo^s;J_N%1#Nqd z>M0S6@S1AskM|Gg+Q-Zc6-OqMZ-?cy7us{a66AzmeIkY{Euor=L^Hxlcq9+W38!^UQ`2Tf z*TVYr9IPUaYrB_vXLZA*-bI6DV_q?gWu0K^$BL;;D~8(cr$R1oEM#e*5=SSrsSjnunX$B>oqab+c$H%v9x z5$*2ijCI7Kv9AAE-3OOqslNI70UfKUa#=*?^HiEqO&L$im#<%Kw#z1R%~lO+jpqOb z^jAc6q4iI{f^9#8ZO2kmQMzBj(A{F_(J{leQUKLGI7LF8c+Q}Ngn&pwaDJ4Prz~p< zl#)zESeL}sM^v^38XcKshF8`PBmwBOd26Fxy^vxK^hoX zxo5zJu?kRd`ia!MQNP)=-TSrWQ0gj5U4_?24%KidMT=4tsL;KQ#OCBd>*F7dhoPQg zsHZS`6uk49tmn6zcT$JJSTPtY44w#5i4O?yNPtrh^3|`UE(wb*%VI*HqJmbvM4WOV z67Zyj0rPOZrSBZ;vkPfz4-xSM`GW%GFAVVpQILMCY_5l8zIi5DaB z7!l0$l!l4BWR49GF|DUiR#QxM@l3y5G_`}S;#aB)z_cp?V8-rr#X!M~P<<+4lSQ!P zqW)HSt=BJeOM8{K?yQHMs=N*7y&t)4`>hio$S>U%{kFt4a}MiDU$a4y4eoubUnsTteDBZIhTJ(@m$QR7IRVX9_2 zmDS8?1aS+EjIS`oa^PmBte!K)mhqCRRd6J=Z8Q~HH(R&*-nH*ay(>@lt1QjCQa82u zu5ZK(6Ppv?J8pey+4bF98Q%9^eT~=iYx%9VH}bAGvNCuiNWXZGAQm0K)nuVkW|oT% zi`N>3aAgv(MD4hpDXXlrrJlI^N?mw>J1B*t%V767c5obb0Gbbg=dV-Z#NU7_E6+b{ CZXVD8 diff --git a/AppCode/__pycache__/Config.cpython-313.pyc b/AppCode/__pycache__/Config.cpython-313.pyc index 45757f667930257a4da0301274dd3bb45a8f0b6e..6a4f56d35a1ffc828090ea0fcfbd935ed76fa66f 100644 GIT binary patch delta 20 acmaFE`G%AGGcPX}0}#BbXxYg9kOcrmnFf>q delta 20 acmaFE`G%AGGcPX}0}xc~Y23*DkOcrl1O{UO diff --git a/AppCode/__pycache__/DocumentHandler.cpython-311.pyc b/AppCode/__pycache__/DocumentHandler.cpython-311.pyc deleted file mode 100644 index b68a4c06779497ee0afcbccfad9ef87376da0d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10482 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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 index e8cf652d137a9b8bc8b0e78fbb9777c12e83c694..cbff30ccc645f0fd2bb685810cfc4fc12b4607d4 100644 GIT binary patch delta 6372 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 diff --git a/AppCode/__pycache__/FileHandler.cpython-311.pyc b/AppCode/__pycache__/FileHandler.cpython-311.pyc deleted file mode 100644 index 1a058aaa564b9e5cf41e16a30188f401103952cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcma)4&1(}u6rcU*cGEOfYbXj{1P=y@#6Sy*Erxuw!E{raRwXVhYi6{YZnAN9Yf}%B zLk=E1iIQtUs7n0<{4-kUA3JrSXO_`6gTuuwn|`8yZ2Qcvq|gG^6AY$1Zc z7Zt?~$oN4hN<=P?_1$-sJ~zB$airQfQL)@ad*HS|a4iP#81$g9V8*h^l3B$zp$j}Y zldw}_QVl<4Qr&i$3}T(hz}A`KdZuTU*!Wh>c1-M!^e#bylMFx$c`&6ul?S}nKOvaP z+}kHCd=byiNPsCqf0DKq5tvHqmg^bLW<+M9<1)2kZW3%!m-1{Zw7!zdCsIZxpG&1z zKcf?#^Ym5nj=t^^>gtKqa#qt*&UV#rT7M9aW~(KqLe|WBVaN4IB^sNH-ik-#vH0vi ztbYc+i0g@3E$LvQ4-N8WZHHY;E|Jn^ns;thpXF(i64N6Z*4deNiY45eFko$DZgV+q8j{#)T|yTy2&i0HT3t$DVOQ}u55unY7Gc=9Lc-UH}Jf*`a}py98M 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 index 7047dc732c6c70085f52a136340d21174931801f..a982d038073b536753e86bf6ea3074f746fce91e 100644 GIT binary patch delta 790 zcmaKqUr19?9LLYu-M!v>J)5(6cdxo#x6EW9Vp<}mf*Wp51^Z+95JB7AWzukRt`AXx zB?Pk41EYR9Hn0$zD<`|5i;ZXMg}WQyyf) z6(Ak}V2USq1r<7&*K>+b!IQMq&l}JHy<7t@VBlY2Uh!``|6X_rZ9$PNiC*231}-F1 z(=(IVDNDrJOePUep11g9CTpgG0(m9|BnzfYf$r`nAH|m07gSvVMY|&DC7Yx=bJ6V@ z(9!)?>3-b2+_9Lxk-lXv^}q8ReAJwayivM~0&r9>49^d5B7Xt-m+F^|b#!D4xfWvc zu}$PHAnyj!i}Ie!S3tgX)bPi#FgicFfqdUe3h*5L`dOX@uG$@7lWO)7^a9e?k$-ES zI~Uz8^0c*E6#t+0-Rz*Zm=i-9xLzM}+aGjMwd&>>H95?2tNXp7K5n&-r+SU!!U9+m zI>S9&lFOUY9PA46I7Ab$lR;&0FoY?B0(LP?9}3_o!yrS9VTh=et#BY8sjP!AOyXz= zj^|gA36hkQYk|g07havLR zvkjwUMO~EfFtwYt6y&((Cg(IeNoYOrZ2q2h+1`#LEU|phD(0i#5BPC4E3%H|ijAEZ zj89EuQnm8_F*amp}h zvQ8G^Qe-V=1*({A$E9Ns3}iGgd}84g=IUVoD8is`c3IGDRr-SB=^7I?W*9GEye6cy zGQETCf}q(4HU>`K$z8n4e4GqI=3pZ_r5$BiHm7m7Fe()}0Zr0mD-r-wMT#K86-2m! z2zLAg>f7qs!zRJ}*Z9&D;6*b1=G1E*DQzNdPLk#g>#`l#*IhlnBz1 z3M8sHly#Jq4fG5QG?|K0Co@WCCqnQzr*YMKFeL zUL#e*VseW$IVZn3wTKsF5vyY#?zW`Kyq4-~w`RshtTSX`73Qc*a$O~FKJ5r`=Q jB0$#M;;_lhPbtkwwJTaa`HF%ne>oGQ)F%cI304FE3HxzT 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__/YearGet.cpython-311.pyc b/AppCode/__pycache__/YearGet.cpython-311.pyc deleted file mode 100644 index b264802faba8043c16e8f9acba696f9950b69469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2184 zcma)7-D?|15a0V!PWIV~V^yg>2uh_IWLv^Du2UQ1U|S}bCW7LmU`63jbZ1xQth4vz zI1*B8N*+uR)P;ge2~D|C{f(H$f)&yd6( z(g+tJl!TJBL_I@EMxueU z#CwvHSmI5;vLdJP9XX$|42eC{Zl_NSC;4-0>-P8%){dZ=R6?SC)Dl{^$5rC%0!h@b z^dWdUvb}-5ttlZm8k4vWU)dvNGx@BVOXEU>#Y96NSd;Uj^jOTOxtwe)>MR-Sj?6aJ zRQ!U{Sxr_}HR3yXR$Q1)J|xhUWRL)p}OZ*!*dH(diUTt1sjyH;|miG8i~y5 zEPU|+aw3R7OiilV5w;|xFHxP*r_dTI(;ar_cd$)6?>vqkeNbjf%;k67sas}A3YOS7 z>XOryP~K^803ayQorzDO5+r^Ikq9!j?dQW)oG4HMO{s!-_@qQw6e(UF3}cZ8kx3KC;@)Oz*@e{3!d|^*v_(bC-vT=&8 xmb!x}>ZtJpwlWEaIHwkRQKKvg5aD2kGzR!$?~I$D|Ch1yzs&0AAr zWH+ed01^@8M5C$-$3*ndzmQye!GhM-HkB&%)Ek0GZRw@+cD*=>=%FL+yqPy2Z{EC_ z*&jWgRs(vV=BW@**~L{ERYLL)GRC z;x}-To*YYlW~kUm8pTvTm)4RotmkL-rQ|1*$(UZuX?jXAlJ|xqw{o(cRqv*j;w7V? zW+Ow_BJU4JhKGi)Cf^o)Ih-8N=O=YVO*S$Z&6iAGlG3?!L6Vj`oLy(f1+f@|fL74U zuHIT#wAvNj?;2WTH{5m6zny-Ru89Lxao~s0o;a{Cez3+qY&!;ZB%fv#7~+NG;P@Wg zZ5z1}WE$AFA#<9?rld?cd8W`js?h&o$u%t;%6Z`!x*tNQ!jze_UeeL3uw^!eHaVG| zhuH7Kn^(9pr%*m{_lVwbvv78W+ZbR`!R?%&&}G^watf8{I9O8fRk$JwqJq^%L^mTi z7R@!&-lQEWgz$xm>oxyO+12z<;+lartGK>$#T#ppDxxK31{J9=J8iNh=!#`;BoZKm z5rBdVL?X+=$EEnEcLGxw>v$~8V-lCi%PCFEV_i1eje?Fo0;DFF z$LU%e9UtUsuELsf4G zyt>7gLg!X=r~g0*)z5c7y!8)waEm9#5XAWPc>DMj^t?kDkGh`sb`mTqUDz@LfL2hQ7dG40+iJY8%KHxZ9>TlV-J9NZ?@zoBdqHVB z>>@LVRE#832*J3!l*mXcZl?GM`+G(YZD##VYD~KUex~g*b~`n6?XKruCWNpmRC$J)I9El|IiNcBYX)2Bo{_E 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 1b2dfa6..72d5e9a 100644 --- a/main.py +++ b/main.py @@ -15,6 +15,7 @@ from AppCode.AOHandler import AOHandler from AppCode.CITHandler import CITHandler from AppCode.ITATHandler import ITATHandler from AppCode.MatCreditHandler import MatCreditHandler +import subprocess @@ -59,7 +60,6 @@ def view_documents(): docHandler.View(request=request) return render_template('view_docs.html', documents=docHandler.documents, years=docHandler.years) - # Upload file documents @app.route('/uploads/') @auth.login_required @@ -68,20 +68,26 @@ def uploaded_file(filename): filepath = os.path.join(FileHandler.UPLOAD_FOLDER, secure_filename(filename)) if not os.path.exists(filepath): - abort(404) + flash("Unsupported file type for viewing", "warning") + return redirect(url_for('view_documents')) file_ext = filename.rsplit('.', 1)[-1].lower() # --- View Mode --- if mode == 'view': + # pdf if file_ext == 'pdf': return send_file(filepath, mimetype='application/pdf') + # Word + elif file_ext in ['doc', 'docx']: + return send_file(filepath, as_attachment=True) + # Excel elif file_ext in ['xls', 'xlsx']: - # Excel cannot be rendered in-browser by Flask; trigger download instead return send_file(filepath, as_attachment=False, download_name=filename, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') else: - return abort(415) # Unsupported type for viewing + flash("Unsupported file type for viewing", "warning") + return redirect(url_for('view_documents')) - return send_file(filepath, as_attachment=True) + return send_file(filepath, as_attachment=True, download_name=filename) @@ -105,13 +111,21 @@ def display_itr(): def add_itr(): if request.method == 'POST': itr = ITRHandler() + mat = MatCreditHandler() itr.add_itr(request.form) itr.close() - if 'documents' in request.files: doc = DocumentHandler() doc.Upload(request) + # AUTO SAVE MAT FROM ITR + mat.save_from_itr( + year=request.form["year"], + mat_created=float(request.form.get("mat_credit_created", 0)), + mat_utilized=float(request.form.get("mat_credit_utilized", 0)), + remarks="Created via ITR" + ) + # flash("ITR record added successfully!", "success") flash("ITR record and documents uploaded successfully!", "success") return redirect(url_for('display_itr')) @@ -166,11 +180,25 @@ def display_ao(): def add_ao(): if request.method == 'POST': ao = AOHandler() + mat = MatCreditHandler() ao.add_ao(request.form) ao.close() + + if 'documents' in request.files: + doc = DocumentHandler() + doc.Upload(request) + + # AUTO SAVE MAT FROM ITR + mat.save_from_itr( + year=request.form["year"], + mat_created=float(request.form.get("mat_credit_created", 0)), + mat_utilized=float(request.form.get("mat_credit_utilized", 0)), + remarks="Created via ITR" + ) + flash("AO record added successfully!", "success") return redirect(url_for('display_ao')) - return render_template('add_ao.html') + return render_template('add_ao.html',current_date=date.today().isoformat()) # 3. UPDATE AO record @app.route('/ao/update/', methods=['GET', 'POST']) @@ -449,6 +477,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']) @@ -519,6 +558,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/ao_calc.js b/static/js/ao_calc.js index 8e5b445..0241981 100644 --- a/static/js/ao_calc.js +++ b/static/js/ao_calc.js @@ -46,16 +46,6 @@ document.addEventListener("DOMContentLoaded", function () { 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); - - // // --- edu_cess --- - // var per_cess = getValue("persentage_cess") - // var edu_cess = (tax_payable + surcharge) * (per_cess / 100); - // setValue("edu_cess", edu_cess); - // --- SURCHARGE --- var percent = getValue("persentage"); var surcharge = tax_payable * (percent / 100); @@ -70,11 +60,37 @@ document.addEventListener("DOMContentLoaded", function () { 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; + var total_tax = total_tax_payable - mat_credit + interest_234c; setValue("total_tax", total_tax); // --- ASSESSMENT --- diff --git a/static/js/itr_calc.js b/static/js/itr_calc.js index 1ca7d5d..d6ac2f2 100644 --- a/static/js/itr_calc.js +++ b/static/js/itr_calc.js @@ -61,16 +61,36 @@ document.addEventListener("DOMContentLoaded", function () { 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)); + // 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_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; + var total_tax = total_tax_payable + interest_234c; setValue("total_tax", total_tax); // --- ASSESSMENT --- 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/add_ao.html b/templates/add_ao.html index 0ca4943..c5bef34 100644 --- a/templates/add_ao.html +++ b/templates/add_ao.html @@ -10,7 +10,8 @@

New Assessing Officer Form

-
+ +
@@ -19,11 +20,12 @@ -- Please select Assessment Year -- - - -
+
+ + +
@@ -170,9 +172,15 @@
-
- - +
+
+ + +
+
+ + +
diff --git a/templates/add_itr.html b/templates/add_itr.html index c112eff..d45dc75 100644 --- a/templates/add_itr.html +++ b/templates/add_itr.html @@ -23,7 +23,7 @@
- +
diff --git a/templates/display_ao.html b/templates/display_ao.html index 149cede..2877760 100644 --- a/templates/display_ao.html +++ b/templates/display_ao.html @@ -22,6 +22,7 @@ Gross Total Income Net Taxable Income Total Tax + Created Record Date Actions @@ -32,6 +33,7 @@ {{ ao.gross_total_income }} {{ ao.net_taxable_income }} {{ ao.total_tax }} + {{ ao.created_at.strftime('%Y-%m-%d') }} Edit diff --git a/templates/mat_credit.html b/templates/mat_credit.html index 7552245..a11f146 100644 --- a/templates/mat_credit.html +++ b/templates/mat_credit.html @@ -42,7 +42,7 @@ {% for row in mat_rows %} - {{ row.financial_year }} + {{ row.financial_year }}-{{ row.financial_year | int + 1 }} {% for y in added_years %} diff --git a/templates/summary_reports.html b/templates/summary_reports.html index def7dd6..e475d51 100644 --- a/templates/summary_reports.html +++ b/templates/summary_reports.html @@ -1,32 +1,34 @@ -{% 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 %} {% block extra_js %} + {% endblock %} \ No newline at end of file diff --git a/templates/update_ao.html b/templates/update_ao.html index 9229ffa..42a0fdd 100644 --- a/templates/update_ao.html +++ b/templates/update_ao.html @@ -8,7 +8,7 @@ {% block content %}
-

Update AO Record for Year {{ record.year }}--{{ record.year + 1 }}

+

Update AO Record for Year {{ record.year }} - {{ record.year + 1 }}

@@ -169,6 +169,23 @@
+ +
+
+ + +
+ +
+ + +
+
+ diff --git a/templates/view_docs.html b/templates/view_docs.html index 2e04993..1bb81a1 100644 --- a/templates/view_docs.html +++ b/templates/view_docs.html @@ -27,7 +27,11 @@ - + {% with messages = get_flashed_messages(with_categories=true) %} + {% for category, message in messages %} +
{{ message }}
+ {% endfor %} + {% endwith %}