From e4837b203abbbc4de71516aa763460f4106dc7d7 Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Sat, 17 Jan 2026 14:50:30 +0530 Subject: [PATCH] modify file_report --- .env | 26 ++++ app/routes/file_report.py | 278 +------------------------------------- 2 files changed, 27 insertions(+), 277 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..c4c74c7 --- /dev/null +++ b/.env @@ -0,0 +1,26 @@ +# ----------------------------- +# Flask App Configuration +# ----------------------------- +FLASK_ENV=development +FLASK_DEBUG=True +FLASK_HOST='0.0.0.0' +FLASK_PORT=5001 + +# ----------------------------- +# Security +# ----------------------------- +SECRET_KEY=change-this-to-strong-secret-key + +# ----------------------------- +# Database Configuration +# ----------------------------- +DB_DIALECT=mysql +DB_DRIVER=pymysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_NAME=comparisondb +DB_USER=root +DB_PASSWORD=root + +# DATABASE_URL=mysql+pymysql://root:root@localhost/comparisondb + diff --git a/app/routes/file_report.py b/app/routes/file_report.py index 1e9f3ac..5846ab3 100644 --- a/app/routes/file_report.py +++ b/app/routes/file_report.py @@ -13,53 +13,8 @@ from app.models.laying_model import Laying from app.models.mh_ex_client_model import ManholeExcavationClient from app.models.tr_ex_client_model import TrenchExcavationClient from app.models.mh_dc_client_model import ManholeDomesticChamberClient -<<<<<<< HEAD -from app.utils.helpers import login_required -<<<<<<< HEAD - -import pandas as pd -import io -from enum import Enum - -# --- 1. DEFINE BLUEPRINT FIRST (Prevents NameError) --- -file_report_bp = Blueprint("file_report", __name__, url_prefix="/file") - -class BillType(Enum): - Client = 1 - Subcontractor = 2 - -# --- 2. DEFINE CLASSES --- -class SubcontractorBill: - def __init__(self): - # Initialize as empty DataFrames so .to_excel() always exists - self.df_tr = pd.DataFrame() - self.df_mh = pd.DataFrame() - self.df_dc = pd.DataFrame() - - def Fetch(self, RA_Bill_No, subcontractor_id): - # Query data filtered by both Bill No and Subcontractor ID - trench = TrenchExcavation.query.filter_by(RA_Bill_No=RA_Bill_No, subcontractor_id=subcontractor_id).all() - mh = ManholeExcavation.query.filter_by(RA_Bill_No=RA_Bill_No, subcontractor_id=subcontractor_id).all() - dc = ManholeDomesticChamber.query.filter_by(RA_Bill_No=RA_Bill_No, subcontractor_id=subcontractor_id).all() - - # Convert SQL objects to DataFrames - self.df_tr = pd.DataFrame([c.__dict__ for c in trench]) - self.df_mh = pd.DataFrame([c.__dict__ for c in mh]) - self.df_dc = pd.DataFrame([c.__dict__ for c in dc]) - - # Clean Columns (remove SQLAlchemy internal state) - drop_cols = ["id", "created_at", "_sa_instance_state"] - - for df in [self.df_tr, self.df_mh, self.df_dc]: - if not df.empty: - df.drop(columns=drop_cols, errors="ignore", inplace=True) - -# --- 3. DEFINE ROUTES --- -======= -======= from app.models.laying_client_model import LayingClient ->>>>>>> pankaj-dev # --- BLUEPRINT DEFINITION --- file_report_bp = Blueprint("file_report", __name__, url_prefix="/file") @@ -118,113 +73,12 @@ class SubcontractorBill: if not df.empty: df.drop(columns=drop_cols, errors="ignore", inplace=True) -<<<<<<< HEAD -<<<<<<< HEAD -# --- ROUTES --- - -# @file_report_bp.route("/report", methods=["GET", "POST"]) -# @login_required -# def report_file(): -# subcontractors = Subcontractor.query.all() -# if request.method == "POST": -# subcontractor_id = request.form.get("subcontractor_id") -# ra_bill_no = request.form.get("ra_bill_no") -# download_all = request.form.get("download_all") == "true" - -# if not subcontractor_id: -# flash("Please select a subcontractor.", "danger") -# return render_template("report.html", subcontractors=subcontractors) - -# subcontractor = Subcontractor.query.get(subcontractor_id) -# bill_gen = SubcontractorBill() - -# if download_all: -# bill_gen.Fetch(subcontractor_id=subcontractor_id) -# file_name = f"{subcontractor.subcontractor_name}_ALL_BILLS.xlsx" -# else: -# if not ra_bill_no: -# flash("Please enter an RA Bill Number.", "danger") -# return render_template("report.html", subcontractors=subcontractors) -# bill_gen.Fetch(RA_Bill_No=ra_bill_no, subcontractor_id=subcontractor_id) -# file_name = f"{subcontractor.subcontractor_name}_RA_{ra_bill_no}_Report.xlsx" - -# if bill_gen.df_tr.empty and bill_gen.df_mh.empty and bill_gen.df_dc.empty: -# flash("No data found for this selection.", "warning") -# return render_template("report.html", subcontractors=subcontractors) - -# output = io.BytesIO() -# with pd.ExcelWriter(output, engine="xlsxwriter") as writer: -# bill_gen.df_tr.to_excel(writer, index=False, sheet_name="Tr.Ex.") -# bill_gen.df_mh.to_excel(writer, index=False, sheet_name="MH.Ex.") -# bill_gen.df_dc.to_excel(writer, index=False, sheet_name="MH & DC") -# output.seek(0) -# return send_file(output, download_name=file_name, as_attachment=True, mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") - -# return render_template("report.html", subcontractors=subcontractors) ->>>>>>> pankaj-dev -======= - ->>>>>>> pankaj-dev -======= # --- subcontractor report only --- -<<<<<<< HEAD ->>>>>>> pankaj-dev -@file_report_bp.route("/report", methods=["GET", "POST"]) -======= @file_report_bp.route("/Subcontractor_report", methods=["GET", "POST"]) ->>>>>>> pankaj-dev @login_required def report_file(): subcontractors = Subcontractor.query.all() -<<<<<<< HEAD -<<<<<<< HEAD - - if request.method == "POST": - subcontractor_id = request.form.get("subcontractor_id") - ra_bill_no = request.form.get("ra_bill_no") # Collected from the updated HTML - - if not subcontractor_id or not ra_bill_no: - flash("Please select a subcontractor and enter an RA Bill Number.", "danger") - return render_template("report.html", subcontractors=subcontractors) - - subcontractor = Subcontractor.query.get(subcontractor_id) - - # Instantiate and Fetch Data - bill_gen = SubcontractorBill() - bill_gen.Fetch(RA_Bill_No=ra_bill_no, subcontractor_id=subcontractor_id) - - # Check if any data was found - if bill_gen.df_tr.empty and bill_gen.df_mh.empty and bill_gen.df_dc.empty: - flash(f"No data found for {subcontractor.subcontractor_name} in RA Bill {ra_bill_no}", "warning") - return render_template("report.html", subcontractors=subcontractors) - - # WRITE EXCEL FILE - output = io.BytesIO() - file_name = f"{subcontractor.subcontractor_name}_RA_{ra_bill_no}_Report.xlsx" - - with pd.ExcelWriter(output, engine="xlsxwriter") as writer: - bill_gen.df_tr.to_excel(writer, index=False, sheet_name="Tr.Ex.") - bill_gen.df_mh.to_excel(writer, index=False, sheet_name="MH.Ex.") - bill_gen.df_dc.to_excel(writer, index=False, sheet_name="MH & DC") - - output.seek(0) - return send_file( - output, - download_name=file_name, - as_attachment=True, - mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" - ) - - return render_template("report.html", subcontractors=subcontractors) - -# (ClientBill class and client_vs_all_subcontractor route would follow here...) - - -======= - tables = None # Match the variable name used in HTML -======= tables = None ->>>>>>> pankaj-dev selected_sc_id = None ra_bill_no = None download_all = False @@ -286,17 +140,8 @@ def report_file(): download_all=download_all ) -<<<<<<< HEAD -<<<<<<< HEAD ->>>>>>> pankaj-dev -======= -# --- client comparison --- ->>>>>>> pankaj-dev -@file_report_bp.route("/client_vs_subcont", methods=["GET", "POST"]) -======= # --- client report only --- @file_report_bp.route("/client_report", methods=["GET", "POST"]) ->>>>>>> pankaj-dev @login_required def client_vs_all_subcontractor(): tables = {"tr": None, "mh": None, "dc": None} @@ -314,121 +159,6 @@ def client_vs_all_subcontractor(): clientBill.Fetch(RA_Bill_No=RA_Bill_No) contractorBill = SubcontractorBill() contractorBill.Fetch(RA_Bill_No=RA_Bill_No) -<<<<<<< HEAD - - # GROUP SUBCONTRACTOR DATA - qty_cols = [ - "Soft_Murum_0_to_1_5_total", - "Soft_Murum_1_5_to_3_0_total", - "Soft_Murum_3_0_to_4_5_total", - "Hard_Murum_0_to_1_5_total", - "Hard_Murum_1_5_and_above_total", - "Soft_Rock_0_to_1_5_total", - "Soft_Rock_1_5_and_above_total", - "Hard_Rock_0_to_1_5_total", - "Hard_Rock_1_5_to_3_0_total", - "Hard_Rock_3_0_to_4_5_total", - "Hard_Rock_4_5_to_6_0_total", - "Hard_Rock_6_0_to_7_5_total" - ] - - mh_dc_qty_cols = [ - "d_0_to_0_75", - "d_0_76_to_1_05", - "d_1_06_to_1_65", - "d_1_66_to_2_15", - "d_2_16_to_2_65", - "d_2_66_to_3_15", - "d_3_16_to_3_65", - "d_3_66_to_4_15", - "d_4_16_to_4_65", - "d_4_66_to_5_15", - "d_5_16_to_5_65", - "d_5_66_to_6_15", - "d_6_16_to_6_65", - "d_6_66_to_7_15", - "d_7_16_to_7_65", - "d_7_66_to_8_15", - "d_8_16_to_8_65", - "d_8_66_to_9_15", - "d_9_16_to_9_65", - "Domestic_Chambers" - ] - - df_sub_tr_grp = (contractorBill.df_tr.groupby(["Location", "MH_NO"], as_index=False)[qty_cols].sum()) - - df_sub_mh_grp = (contractorBill.df_mh.groupby(["Location", "MH_NO"], as_index=False)[qty_cols].sum()) - - df_sub_dc_grp = (contractorBill.df_dc.groupby(["Location", "Node_No"], as_index=False)[mh_dc_qty_cols].sum()) - - # MERGE CLIENT VS SUBCONTRACTOR - df_tr_cmp = clientBill.df_tr.merge( - df_sub_tr_grp, - on=["Location", "MH_NO"], - how="left", - suffixes=("_Client", "_Sub") - ) - - df_mh_cmp = clientBill.df_mh.merge( - df_sub_mh_grp, - on=["Location", "MH_NO"], - how="left", - suffixes=("_Client", "_Sub") - ) - - if "MH_NO" in clientBill.df_dc.columns: - clientBill.df_dc.rename(columns={"MH_NO": "Node_No"}, inplace=True) - - df_dc_cmp = clientBill.df_dc.merge( - df_sub_dc_grp, - on=["Location", "Node_No"], - how="left", - suffixes=("_Client", "_Sub") - ) - - # CALCULATE DIFFERENCE - for col in qty_cols: - if f"{col}_Client" in df_tr_cmp.columns: - df_tr_cmp[f"{col}_Diff"] = ( - df_tr_cmp[f"{col}_Client"].fillna(0) - - df_tr_cmp[f"{col}_Sub"].fillna(0) - ) - - print("Sum of df_tr_cmp::",df_tr_cmp) - - df_mh_cmp[f"{col}_Diff"] = ( - df_mh_cmp[f"{col}_Client"].fillna(0) - - df_mh_cmp[f"{col}_Sub"].fillna(0) - ) - print("Sum of df_mh_cmp::",df_mh_cmp) - - - df_dc_cmp["Domestic_Chambers_Diff"] = ( - df_dc_cmp["Domestic_Chambers_Client"].fillna(0) - - df_dc_cmp["Domestic_Chambers_Sub"].fillna(0) - ) - - - # EXPORT EXCEL - output = io.BytesIO() - file_name = f"Client_vs_All_Subcontractor_RA_{RA_Bill_No}.xlsx" - - with pd.ExcelWriter(output, engine="xlsxwriter") as writer: - df_tr_cmp.to_excel(writer, sheet_name="Tr.Ex", index=False) - df_mh_cmp.to_excel(writer, sheet_name="Mh.Ex", index=False) - df_dc_cmp.to_excel(writer, sheet_name="MH & DC", index=False) - - output.seek(0) - - return send_file( - output, - download_name=file_name, - as_attachment=True, - mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" - ) - - return render_template("generate_comparison_client_vs_subcont.html") -======= # --- SAFETY CHECK: Verify data exists before merging --- if clientBill.df_tr.empty and clientBill.df_mh.empty: @@ -474,12 +204,6 @@ def client_vs_all_subcontractor(): tables["mh"] = df_mh_cmp.to_html(classes='table table-striped table-hover table-sm', index=False) tables["dc"] = df_dc_cmp.to_html(classes='table table-striped table-hover table-sm', index=False) -<<<<<<< HEAD - return render_template("generate_comparison_client_vs_subcont.html", tables=tables, ra_val=ra_val) - ->>>>>>> pankaj-dev -======= return render_template("client_report.html", tables=tables, ra_val=ra_val) - ->>>>>>> pankaj-dev + \ No newline at end of file