from flask import Blueprint, render_template, request, redirect, flash, current_app, url_for from app.services.db_service 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(): current_app.logger.info("Opened Add Subcontractor Page") return render_template("subcontractor/add.html") # ---------------- SAVE ----------------- @subcontractor_bp.route("/save", methods=["POST"]) @login_required def save_subcontractor(): name = request.form.get("subcontractor_name", "").strip() if not name: current_app.logger.warning("Empty subcontractor name submitted") flash("Subcontractor name cannot be empty.", "danger") return redirect(url_for("subcontractor.add_subcontractor")) existing_sub = Subcontractor.query.filter_by(subcontractor_name=name).first() if existing_sub: current_app.logger.warning(f"Duplicate subcontractor attempt: {name}") flash(f"Subcontractor with name '{name}' already exists!", "danger") return redirect(url_for("subcontractor.add_subcontractor")) try: subcontractor = Subcontractor( subcontractor_name=name, contact_person=request.form.get("contact_person"), address=request.form.get("address"), mobile_no=request.form.get("mobile_no"), email_id=request.form.get("email_id"), gst_no=request.form.get("gst_no"), pan_no=request.form.get("pan_no") ) db.session.add(subcontractor) db.session.commit() current_app.logger.info(f"Subcontractor Created Successfully: {name}") flash("Subcontractor added successfully!", "success") except Exception: db.session.rollback() current_app.logger.exception("Error while saving subcontractor") flash("An error occurred while saving.", "danger") return redirect(url_for("subcontractor.subcontractor_list")) # ---------------- LIST (UPDATED WITH PAGINATION) ----------------- @subcontractor_bp.route("/list") @login_required def subcontractor_list(): page = request.args.get("page", 1, type=int) per_page = 10 # Change how many records per page pagination = Subcontractor.query.order_by( Subcontractor.created_at ).paginate( page=page, per_page=per_page, error_out=False ) subcontractors = pagination.items current_app.logger.info(f"Viewed Subcontractor List - Page {page}") return render_template( "subcontractor/list.html", subcontractors=subcontractors, pagination=pagination ) # ---------------- EDIT ----------------- @subcontractor_bp.route("/edit/") @login_required def edit_subcontractor(id): subcontractor = Subcontractor.query.get_or_404(id) current_app.logger.info(f"Editing Subcontractor ID: {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", "").strip() duplicate = Subcontractor.query.filter( Subcontractor.subcontractor_name == new_name, Subcontractor.id != id ).first() if duplicate: current_app.logger.warning(f"Duplicate update attempt: {new_name}") flash("Another subcontractor already uses this name.", "danger") return redirect(url_for("subcontractor.edit_subcontractor", id=id)) try: old_name = subcontractor.subcontractor_name subcontractor.subcontractor_name = new_name subcontractor.contact_person = request.form.get("contact_person") subcontractor.address = request.form.get("address") subcontractor.mobile_no = request.form.get("mobile_no") subcontractor.email_id = request.form.get("email_id") subcontractor.gst_no = request.form.get("gst_no") subcontractor.pan_no = request.form.get("pan_no") subcontractor.status = request.form.get("status") db.session.commit() current_app.logger.info(f"Subcontractor Updated: {old_name} → {new_name}") flash("Subcontractor updated successfully!", "success") except Exception: db.session.rollback() current_app.logger.exception("Error updating subcontractor") flash("Update failed!", "danger") return redirect(url_for("subcontractor.subcontractor_list")) # ---------------- DELETE ----------------- @subcontractor_bp.route("/delete/") @login_required def delete_subcontractor(id): subcontractor = Subcontractor.query.get_or_404(id) try: name = subcontractor.subcontractor_name db.session.delete(subcontractor) db.session.commit() current_app.logger.info(f"Subcontractor Deleted: {name}") flash("Subcontractor deleted successfully!", "success") except Exception: db.session.rollback() current_app.logger.exception("Error deleting subcontractor") flash("Delete failed!", "danger") return redirect(url_for("subcontractor.subcontractor_list"))