diff --git a/app/routes/file_report.py b/app/routes/file_report.py index 5846ab3..f7db588 100644 --- a/app/routes/file_report.py +++ b/app/routes/file_report.py @@ -167,7 +167,8 @@ def client_vs_all_subcontractor(): qty_cols = [...] # (Keep your existing list) mh_dc_qty_cols = [...] # (Keep your existing list) - + mh_lay_qty_cols =[...] + def aggregate_df(df, group_cols, sum_cols): if df.empty: # Create an empty DF with the correct columns to avoid Merge/Key Errors @@ -183,10 +184,11 @@ def client_vs_all_subcontractor(): df_sub_tr_grp = aggregate_df(contractorBill.df_tr, ["Location", "MH_NO"], qty_cols) df_sub_mh_grp = aggregate_df(contractorBill.df_mh, ["Location", "MH_NO"], qty_cols) df_sub_dc_grp = aggregate_df(contractorBill.df_dc, ["Location", "MH_NO"], mh_dc_qty_cols) + df_sub_lay_grp = aggregate_df(contractorBill.df_dc, ["Location", "MH_NO"], mh_lay_qty_cols) # --- FINAL MERGE LOGIC --- # We check if "Location" exists in the client data. If not, we add it to prevent the KeyError. - for df_client in [clientBill.df_tr, clientBill.df_mh, clientBill.df_dc]: + for df_client in [clientBill.df_tr, clientBill.df_mh, clientBill.df_dc, clientBill.df_laying ]: if not df_client.empty and "Location" not in df_client.columns: df_client["Location"] = "Unknown" @@ -194,6 +196,7 @@ def client_vs_all_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")) df_dc_cmp = clientBill.df_dc.merge(df_sub_dc_grp, on=["Location", "MH_NO"], how="left", suffixes=("_Client", "_Sub")) + df_lay_cmp = clientBill.df_laying.merge(df_sub_lay_grp, on=["Location", "MH_NO"], how="left", suffixes=("_Client", "_Sub")) except KeyError as e: flash(f"Merge Error: Missing column {str(e)}. Check if 'Location' is defined in your database models.", "danger") return render_template("generate_comparison_client_vs_subcont.html", tables=tables, ra_val=ra_val) @@ -203,6 +206,7 @@ def client_vs_all_subcontractor(): tables["tr"] = df_tr_cmp.to_html(classes='table table-striped table-hover table-sm', index=False) 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) + tables["laying"] = df_lay_cmp.to_html(classes='table table-striped table-hover table-sm', index=False) return render_template("client_report.html", tables=tables, ra_val=ra_val) diff --git a/app/routes/subcontractor_routes.py b/app/routes/subcontractor_routes.py index d1242cb..5a6a4b6 100644 --- a/app/routes/subcontractor_routes.py +++ b/app/routes/subcontractor_routes.py @@ -2,9 +2,108 @@ from flask import Blueprint, render_template, request, redirect, flash from app import db from app.models.subcontractor_model import Subcontractor from app.utils.helpers import login_required - + subcontractor_bp = Blueprint("subcontractor", __name__, url_prefix="/subcontractor") - + +# ---------------- ADD ----------------- +@subcontractor_bp.route("/add") +@login_required +def add_subcontractor(): + return render_template("subcontractor/add.html") +@subcontractor_bp.route("/save", methods=["POST"]) +@login_required +def save_subcontractor(): + # 1. Get and clean the name from the form + name = request.form.get("subcontractor_name", "").strip() + + # 2. Basic validation: Ensure the name isn't empty + if not name: + flash("Subcontractor name cannot be empty.", "danger") + return redirect("/subcontractor/add") + + # 3. Check if a subcontractor with this name already exists + existing_sub = Subcontractor.query.filter_by(subcontractor_name=name).first() + + if existing_sub: + flash(f"Subcontractor with name '{name}' already exists!", "danger") + return redirect("/subcontractor/add") + + # 4. If no duplicate is found, proceed to save + try: + subcontractor = Subcontractor( + subcontractor_name=name, + contact_person=request.form.get("contact_person"), + mobile_no=request.form.get("mobile_no"), + email_id=request.form.get("email_id"), + gst_no=request.form.get("gst_no") + ) + + db.session.add(subcontractor) + db.session.commit() + flash("Subcontractor added successfully!", "success") + + except Exception as e: + db.session.rollback() + flash("An error occurred while saving. Please try again.", "danger") + + return redirect("/subcontractor/list") + +# ---------------- LIST ----------------- +@subcontractor_bp.route("/list") +@login_required +def subcontractor_list(): + subcontractors = Subcontractor.query.all() + return render_template("subcontractor/list.html", subcontractors=subcontractors) + +# ---------------- EDIT ----------------- +@subcontractor_bp.route("/edit/") +@login_required +def edit_subcontractor(id): + subcontractor = Subcontractor.query.get_or_404(id) + return render_template("subcontractor/edit.html", subcontractor=subcontractor) + +# ---------------- UPDATE ----------------- +@subcontractor_bp.route("/update/", methods=["POST"]) +@login_required +def update_subcontractor(id): + subcontractor = Subcontractor.query.get_or_404(id) + new_name = request.form.get("subcontractor_name") + + # Check if the new name is taken by someone ELSE (not this current ID) + duplicate = Subcontractor.query.filter( + Subcontractor.subcontractor_name == new_name, + Subcontractor.id != id + ).first() + + if duplicate: + flash("Another subcontractor already uses this name.", "danger") + return redirect(f"/subcontractor/edit/{id}") + + subcontractor.subcontractor_name = new_name + + db.session.commit() + + flash("Subcontractor updated successfully!", "success") + return redirect("/subcontractor/list") + +# ---------------- DELETE ----------------- +@subcontractor_bp.route("/delete/") +@login_required +def delete_subcontractor(id): + subcontractor = Subcontractor.query.get_or_404(id) + + db.session.delete(subcontractor) + db.session.commit() + + flash("Subcontractor deleted successfully!", "success") + return redirect("/subcontractor/list") +from flask import Blueprint, render_template, request, redirect, flash +from app import db +from app.models.subcontractor_model import Subcontractor +from app.utils.helpers import login_required + +subcontractor_bp = Blueprint("subcontractor", __name__, url_prefix="/subcontractor") + # ---------------- ADD ----------------- @subcontractor_bp.route("/add") @login_required @@ -14,50 +113,71 @@ def add_subcontractor(): @subcontractor_bp.route("/save", methods=["POST"]) @login_required def save_subcontractor(): - subcontractor = Subcontractor( - subcontractor_name=request.form.get("subcontractor_name"), - contact_person=request.form.get("contact_person"), - mobile_no=request.form.get("mobile_no"), - email_id=request.form.get("email_id"), - gst_no=request.form.get("gst_no") - ) - db.session.add(subcontractor) - db.session.commit() - - flash("Subcontractor added successfully!", "success") + name = request.form.get("subcontractor_name", "").strip() + if not name: + flash("Subcontractor name cannot be empty.", "danger") + return redirect("/subcontractor/add") + existing_sub = Subcontractor.query.filter_by(subcontractor_name=name).first() + + if existing_sub: + flash(f"Subcontractor with name '{name}' already exists!", "danger") + return redirect("/subcontractor/add") + try: + subcontractor = Subcontractor( + subcontractor_name=name, + contact_person=request.form.get("contact_person"), + mobile_no=request.form.get("mobile_no"), + email_id=request.form.get("email_id"), + gst_no=request.form.get("gst_no") + ) + + db.session.add(subcontractor) + db.session.commit() + flash("Subcontractor added successfully!", "success") + + except Exception as e: + db.session.rollback() + flash("An error occurred while saving. Please try again.", "danger") + return redirect("/subcontractor/list") - + # ---------------- LIST ----------------- @subcontractor_bp.route("/list") @login_required def subcontractor_list(): subcontractors = Subcontractor.query.all() return render_template("subcontractor/list.html", subcontractors=subcontractors) - + # ---------------- EDIT ----------------- @subcontractor_bp.route("/edit/") @login_required def edit_subcontractor(id): subcontractor = Subcontractor.query.get_or_404(id) return render_template("subcontractor/edit.html", subcontractor=subcontractor) - + # ---------------- UPDATE ----------------- @subcontractor_bp.route("/update/", methods=["POST"]) @login_required def update_subcontractor(id): subcontractor = Subcontractor.query.get_or_404(id) - - subcontractor.subcontractor_name = request.form.get("subcontractor_name") - subcontractor.contact_person = request.form.get("contact_person") - subcontractor.mobile_no = request.form.get("mobile_no") - subcontractor.email_id = request.form.get("email_id") - subcontractor.gst_no = request.form.get("gst_no") - + new_name = request.form.get("subcontractor_name") + + # Check if the new name is taken by someone ELSE (not this current ID) + duplicate = Subcontractor.query.filter( + Subcontractor.subcontractor_name == new_name, + Subcontractor.id != id + ).first() + + if duplicate: + flash("Another subcontractor already uses this name.", "danger") + return redirect(f"/subcontractor/edit/{id}") + + subcontractor.subcontractor_name = new_name db.session.commit() - + flash("Subcontractor updated successfully!", "success") return redirect("/subcontractor/list") - + # ---------------- DELETE ----------------- @subcontractor_bp.route("/delete/") @login_required @@ -68,4 +188,4 @@ def delete_subcontractor(id): db.session.commit() flash("Subcontractor deleted successfully!", "success") - return redirect("/subcontractor/list") + return redirect("/subcontractor/list") \ No newline at end of file diff --git a/app/templates/subcontractor_report.html b/app/templates/subcontractor_report.html index 17b9e4f..47768f4 100644 --- a/app/templates/subcontractor_report.html +++ b/app/templates/subcontractor_report.html @@ -1,34 +1,6 @@ {% extends "base.html" %} {% block content %} -<<<<<<< HEAD -
-<<<<<<< HEAD -

Generate Subcontractor Report

-======= -

Generate Subcontractor Report

->>>>>>> pankaj-dev - - {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} - {% for category, message in messages %} - - ) - {% endfor %} - {% endif %} - {% endwith %} - -<<<<<<< HEAD -
-
-======= -
- ->>>>>>> pankaj-dev -=======

Generate Subcontractor Report

@@ -37,25 +9,11 @@
->>>>>>> pankaj-dev
-
- -
- - -
- - -======= @@ -89,11 +47,7 @@
-<<<<<<< HEAD ->>>>>>> pankaj-dev -======= ->>>>>>> pankaj-dev