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 def add_subcontractor(): return render_template("subcontractor/add.html") @subcontractor_bp.route("/save", methods=["POST"]) @login_required def save_subcontractor(): 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) 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")