From 1e987a110cbe4e32c893aada14a22abf4a0481b5 Mon Sep 17 00:00:00 2001 From: Swapnil9693 Date: Fri, 12 Dec 2025 15:25:31 +0530 Subject: [PATCH] Solapur_12-12 --- main.py | 210 ++++++++++++++++++++++++++++++++++++ templates/upload_excel.html | 12 +++ 2 files changed, 222 insertions(+) create mode 100644 main.py create mode 100644 templates/upload_excel.html diff --git a/main.py b/main.py new file mode 100644 index 0000000..f9e8b7e --- /dev/null +++ b/main.py @@ -0,0 +1,210 @@ +from flask import Flask, request, render_template +from sqlalchemy import create_engine +import pandas as pd + +app = Flask(__name__) + +# ---------------------- SQL CONNECTION ------------------------- +engine = create_engine("mysql+pymysql://root:tiger@localhost/solapur_db") + + +# ---------------------- COLUMN MAPPING ------------------------- +contractor_map = { + 'Location': 'location', + + 'ID of Manhole ': 'id_of_mh', + 'Ex. dia of MH Excavation ': 'ex_dia_excavation', + 'Area of MH Excavation ': 'area_excavation', + + 'Soft Murum/\n0 to 1.5': 'sm_0_1_5', + 'Soft Murum/\n1.5 to 3.0': 'sm_1_5_3_0', + 'Soft Murum/\n3.0 to 4.0': 'sm_3_0_4_0', + + 'Hard Murum/WBM\n0 to 1.5': 'hm_0_1_5', + 'Hard Murum/WBM\n1.5 to 3.0': 'hm_1_5_3_0', + + 'Soft Rock\n0 to 1.5': 'sr_0_1_5', + 'Soft Rock\n1.5 to 3.0': 'sr_1_5_3_0', + + 'Hard Rock\n0 to 1.5': 'hr_0_1_5', + 'Hard Rock\n1.5 to 3.0': 'hr_1_5_3_0', + 'Hard Rock\n3.0 to 4.50': 'hr_3_0_4_5', + 'Hard Rock\n4.5 to 6.0': 'hr_4_5_6_0', + 'Hard Rock\n6.0 To 7.5': 'hr_6_0_7_5', + + 'Soft Murum/Soil\n0 to 1.5': 'sms_0_1_5', + 'Soft Murum/Soil\n1.5 to 3.0': 'sms_1_5_3_0', + 'Soft Murum/Soil\n3.0 to 4.0': 'sms_3_0_4_0', + + 'Hard Murum/WBM\n0 to 1.5.1': 'hmwbm_0_1_5', + 'Hard Murum/WBM\n1.5 & Above': 'hmwbm_1_5_above', + + 'Soft Rock\n0 to 1.5.1': 'sr2_0_1_5', + 'Soft Rock\n1.5 & Above': 'sr2_1_5_above', + + 'Hard Rock\n0 to 1.5.1': 'hr2_0_1_5', + 'Hard Rock\n1.5 & Above': 'hr2_1_5_above', + 'Hard Rock\n3.0 to 4.50.1': 'hr2_3_0_4_5', + 'Hard Rock\n4.5 to 6': 'hr2_4_5_6', + 'Hard Rock\n6.0 To 7.5.1': 'hr2_6_0_7_5', + + 'Total': 'total' +} + +client_map = { + 'Location': 'location', + ' MH NOS': 'mh_nos', + + 'GL (m)': 'gl', + 'MH Invert Level (m)': 'mh_invert_level', + 'MH Top Level (m)': 'mh_top_level', + 'Ex.Level (m)': 'ex_level', + 'MH Cutting Depth (m)': 'mh_cutting_depth', + 'MH Depth': 'mh_depth', + 'Inner dia of MH (m)': 'inner_dia', + 'Dia of MH Cutting (m)': 'cut_dia', + 'Area of Ex. MH (Sqm)': 'area_exc_mh', + + 'Marshi / Muddy / Slushy\n 0 to \n1.5 m': 'mms_0_1_5', + 'Marshi / Muddy / Slushy\n1.5 to 3.0 m': 'mms_1_5_3_0', + 'Marshi / Muddy / Slushy\n3.0 to 4.5m': 'mms_3_0_4_5', + + ' Soil / Soft Murum \n0 to 1.5 m': 'ssm_0_1_5', + 'Soil / Soft Murum \n1.5 to 3.0 m': 'ssm_1_5_3_0', + 'Soil / Soft Murum \n3.0 to 4.5m': 'ssm_3_0_4_5', + + ' HM & WBM\n0 to 1.5 m': 'hmwbm_0_1_5', + 'HM & WBM\n1.5 to 3.0 m': 'hmwbm_1_5_3_0', + 'HM & WBM\n3.0 to 4.5m': 'hmwbm_3_0_4_5', + + ' Soft Rock/Asphalt Rd \n0 to 1.5 m': 'srar_0_1_5', + ' Soft Rock/Asphalt Rd\n1.5 to 3.0 m': 'srar_1_5_3_0', + ' Soft Rock/Asphalt Rd\n3.0 to 4.5m': 'srar_3_0_4_5', + + ' Hard Rock \n0 to 1.5 m': 'hr_0_1_5', + 'Hard Rock \n1.5 to 3.0 m': 'hr_1_5_3_0', + 'Hard Rock \n3.0 to 4.5 m': 'hr_3_0_4_5', + 'Hard Rock \n4.5 to 6 m': 'hr_4_5_6', + 'Hard Rock 6.0 to \n7.5m': 'hr_6_0_7_5', + + # SECOND SET + 'Marshi / Muddy / Slushy 0 to \n1.5 m': 'mms2_0_1_5', + 'Marshi / Muddy / Slushy\n1.5 to 3.0 m.1': 'mms2_1_5_3_0', + 'Marshi / Muddy / Slushy\n3.0 to 4.5m.1': 'mms2_3_0_4_5', + + ' Soil / Soft Murum \n0 to 1.5 m': 'ssm2_0_1_5', + 'Soil / Soft Murum \n1.5 to 3.0 m': 'ssm2_1_5_3_0', + 'Soil / Soft Murum 3.0 to 4.5m': 'ssm2_3_0_4_5', + + ' HM & WBM\n0 to 1.5 m.1': 'hmwbm2_0_1_5', + 'HM & WBM\n1.5 to 3.0 m.1': 'hmwbm2_1_5_3_0', + 'HM & WBM\n3.0 to 4.5m.1': 'hmwbm2_3_0_4_5', + + ' Soft Rock/Asphalt Rd \n0 to 1.5 m.1': 'srar2_0_1_5', + 'Soft Rock/Asphalt Rd \n1.5 to 3.0 m': 'srar2_1_5_3_0', + 'Soft Rock/Asphalt Rd \n3.0 to 4.5m': 'srar2_3_0_4_5', + + ' Hard Rock \n0 to 1.5 m.1': 'hr2_0_1_5', + 'Hard Rock\n1.5 to 3.0 m': 'hr2_1_5_3_0', + 'Hard Rock\n3.0 to 4.5 m': 'hr2_3_0_4_5', + 'Hard Rock\n4.5 to 6 m': 'hr2_4_5_6', + 'Hard Rock\n6.0 to \n7.5m': 'hr2_6_0_7_5' +} +@app.route("/", methods=["GET", "POST"]) +def index(): + return render_template("upload_excel.html") + +# ---------------------- UPLOAD ROUTE ------------------------- +@app.route("/upload_excel", methods=["GET", "POST"]) +def upload_excel(): + if request.method == "POST": + file = request.files["file"] + + if not file: + return "No file uploaded!", 400 + + # Read both sheets + df1 = pd.read_excel(file, sheet_name=0) + df2 = pd.read_excel(file, sheet_name=1) + + print("\n---- SHEET 1 COLUMNS ----") + print(df1.columns.tolist()) + print("\n---- SHEET 2 COLUMNS ----") + print(df2.columns.tolist()) + + # Rename using mapping + df1 = df1.rename(columns=contractor_map) + df2 = df2.rename(columns=client_map) + + # Keep only mapped (known) columns (ignore if some mapped names don't exist) + df1 = df1[[c for c in contractor_map.values() if c in df1.columns]] + df2 = df2[[c for c in client_map.values() if c in df2.columns]] + + # Fill empty numeric cells with 0 + df1 = df1.fillna(0) + df2 = df2.fillna(0) + + # ------------------- DIFFERENCE CALCULATION (EXACT COLUMNS) ------------------- + # Excel formula: SUM(sheet2 AC:AS) - SUM(sheet1 Q:AB) + # Map those ranges to the cleaned column names (these lists reflect that mapping) + + contractor_cols = [ + + 'sms_0_1_5','sms_1_5_3_0','sms_3_0_4_0', + 'hmwbm_0_1_5','hmwbm_1_5_above','sr2_0_1_5','sr2_1_5_above', + 'hr2_0_1_5','hr2_1_5_above','hr2_3_0_4_5','hr2_4_5_6','hr2_6_0_7_5' + ] + + client_cols = [ + + 'mms2_0_1_5','mms2_1_5_3_0','mms2_3_0_4_5', + 'ssm2_0_1_5','ssm2_1_5_3_0','ssm2_3_0_4_5', + 'hmwbm2_0_1_5','hmwbm2_1_5_3_0','hmwbm2_3_0_4_5', + 'srar2_0_1_5','srar2_1_5_3_0','srar2_3_0_4_5', + 'hr2_0_1_5','hr2_1_5_3_0','hr2_3_0_4_5','hr2_4_5_6','hr2_6_0_7_5' + ] + + # For safety, only use columns that exist in the DataFrames — missing ones treated as zeros + contractor_present = [c for c in contractor_cols if c in df1.columns] + client_present = [c for c in client_cols if c in df2.columns] + + # Add any missing columns with zeros so sums align (keeps row alignment) + for c in contractor_cols: + if c not in df1.columns: + df1[c] = 0.0 + for c in client_cols: + if c not in df2.columns: + df2[c] = 0.0 + + # Now compute difference exactly like your Excel formula + df_difference = pd.DataFrame() + # If location exists in df1 use it, else try df2, else blank + if 'location' in df1.columns: + df_difference["location"] = df1["location"] + elif 'location' in df2.columns: + df_difference["location"] = df2["location"] + else: + df_difference["location"] = "" + print("Contractor columns being summed:", [c for c in contractor_cols if c in df1.columns]) + print("Client columns being summed:", [c for c in client_cols if c in df2.columns]) + print("Contractor sum per row:") + print(df1[contractor_cols].sum(axis=1).round(2)) + + print("Client sum per row:") + print(df2[client_cols].sum(axis=1).round(2)) + + df_difference["difference"] = df2[client_cols].sum(axis=1) - df1[contractor_cols].sum(axis=1) + + # ---------------- INSERT INTO DATABASE ----------------------- + df1.to_sql("mh_exc_contractor", con=engine, if_exists="append", index=False) + df2.to_sql("mh_exc_client", con=engine, if_exists="append", index=False) + df_difference.to_sql("mh_exc_difference", con=engine, if_exists="append", index=False) + + return "Excel uploaded and ALL tables updated successfully!" + + return render_template("upload_excel.html") + + +# ---------------------- RUN FLASK APP ------------------------- +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000, debug=True) diff --git a/templates/upload_excel.html b/templates/upload_excel.html new file mode 100644 index 0000000..a5e268a --- /dev/null +++ b/templates/upload_excel.html @@ -0,0 +1,12 @@ + + + +

Upload Manhole Excel

+ +
+ + +
+ + +