# controllers/invoice_controller.py from flask import Blueprint, request, jsonify, render_template from flask_login import login_required, current_user from model.Invoice import * from model.Log import LogHelper invoice_bp = Blueprint('invoice', __name__) # ------------------------------- Helpers ------------------------------- def handle_exception(func): """Decorator to handle exceptions and return JSON error responses.""" def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: return jsonify({"status": "error", "message": str(e)}), 500 wrapper.__name__ = func.__name__ return wrapper def log_action(action: str, detail: str): LogHelper.log_action(action, f"User {current_user.id} {detail}") # ------------------------------- Add Invoice ------------------------------- @invoice_bp.route('/add_invoice', methods=['GET', 'POST']) @login_required @handle_exception def add_invoice(): if request.method == 'POST': data = request.form village_name = data.get('village') village_result = get_village_id(village_name) if not village_result: return jsonify({"status": "error", "message": f"Village '{village_name}' not found"}), 400 village_id = village_result['Village_Id'] invoice_id = insert_invoice(data, village_id) # assign_subcontractor(data, village_id) insert_hold_types(data, invoice_id) log_action("Add invoice", f"added invoice '{data.get('pmc_no')}'") return jsonify({"status": "success", "message": "Invoice added successfully"}), 201 invoices = get_all_invoice_details() villages = get_all_villages() return render_template('add_invoice.html', invoices=invoices, villages=villages) # ------------------------------- Search Subcontractor ------------------------------- @invoice_bp.route('/search_subcontractor', methods=['POST']) @login_required @handle_exception def search_subcontractor(): query = request.form.get("query", "").strip() results = search_contractors(query) if not results: return "