2026-08-06 12:20:50 +05:30
|
|
|
from flask import (
|
|
|
|
|
Blueprint,
|
|
|
|
|
render_template,
|
|
|
|
|
request,
|
|
|
|
|
redirect,
|
|
|
|
|
url_for,
|
2026-08-07 10:29:15 +05:30
|
|
|
flash, jsonify
|
2026-08-06 12:20:50 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
from app.models.subcontractor_model import Subcontractor
|
|
|
|
|
from app.services.subcontractor_rate_service import SubcontractorRateService
|
|
|
|
|
from app.constants.messages import SuccessMessage, ErrorMessage
|
|
|
|
|
|
|
|
|
|
engi_bp = Blueprint(
|
|
|
|
|
"engineering",
|
|
|
|
|
__name__,
|
|
|
|
|
url_prefix="/engi"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@engi_bp.route("/")
|
|
|
|
|
def engineering_master():
|
|
|
|
|
|
|
|
|
|
return render_template(
|
|
|
|
|
"engineering/index.html",
|
|
|
|
|
title="Engineering Masters"
|
|
|
|
|
)
|
2026-08-07 10:29:15 +05:30
|
|
|
|
|
|
|
|
# Client rate model
|
|
|
|
|
@engi_bp.route("/client-rate")
|
|
|
|
|
def client_rates():
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
return render_template(
|
|
|
|
|
"engineering/client_rate.html",
|
|
|
|
|
title="Client Rate Master"
|
|
|
|
|
)
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
@engi_bp.route("/subcontractor-rate", methods=["GET", "POST"])
|
2026-08-06 12:20:50 +05:30
|
|
|
def add_subcontractor_rates():
|
2026-08-07 10:29:15 +05:30
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
subcontractors = Subcontractor.query.filter_by(status="Active").all()
|
|
|
|
|
|
|
|
|
|
if request.method == "POST":
|
2026-08-07 10:29:15 +05:30
|
|
|
result = SubcontractorRateService.save_or_update(request.form)
|
|
|
|
|
if result["success"]:
|
|
|
|
|
flash(result["message"], "success")
|
2026-08-06 12:20:50 +05:30
|
|
|
return redirect(url_for("engineering.add_subcontractor_rates"))
|
2026-08-07 10:29:15 +05:30
|
|
|
else:
|
|
|
|
|
flash(result["message"], "danger")
|
|
|
|
|
|
|
|
|
|
rates = SubcontractorRateService.get_all_rates()
|
2026-08-06 12:20:50 +05:30
|
|
|
|
|
|
|
|
return render_template(
|
2026-08-07 10:29:15 +05:30
|
|
|
"engineering/contractor_rate.html",
|
2026-08-06 12:20:50 +05:30
|
|
|
title="Subcontractor Rate Master",
|
2026-08-07 10:29:15 +05:30
|
|
|
subcontractors=subcontractors,
|
|
|
|
|
rates=rates
|
2026-08-06 12:20:50 +05:30
|
|
|
)
|
|
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
@engi_bp.route("/subcontractor-rate/edit/<int:rate_id>", methods=["GET", "POST"])
|
|
|
|
|
def edit_rate(rate_id):
|
|
|
|
|
|
|
|
|
|
subcontractors = Subcontractor.query.filter_by(status="Active").all()
|
|
|
|
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
|
|
|
|
|
result = SubcontractorRateService.save_or_update(request.form)
|
|
|
|
|
|
|
|
|
|
if result["success"]:
|
|
|
|
|
flash(result["message"], "success")
|
|
|
|
|
return redirect(url_for("engineering.add_subcontractor_rates"))
|
|
|
|
|
|
|
|
|
|
flash(result["message"], "danger")
|
|
|
|
|
|
|
|
|
|
rate = SubcontractorRateService.get_rate(rate_id)
|
|
|
|
|
|
|
|
|
|
rates = SubcontractorRateService.get_all_rates()
|
2026-08-06 12:20:50 +05:30
|
|
|
|
|
|
|
|
return render_template(
|
2026-08-07 10:29:15 +05:30
|
|
|
"engineering/contractor_rate.html",
|
|
|
|
|
subcontractors=subcontractors,
|
|
|
|
|
rate=rate,
|
|
|
|
|
rates=rates
|
2026-08-06 12:20:50 +05:30
|
|
|
)
|
|
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
@engi_bp.route("/subcontractor-rate/delete/<int:rate_id>")
|
|
|
|
|
def delete_rate(rate_id):
|
|
|
|
|
SubcontractorRateService.delete_rate(rate_id)
|
|
|
|
|
flash("Rate deleted successfully.", "success")
|
|
|
|
|
return redirect(url_for("engineering.add_subcontractor_rates"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@engi_bp.route("/check-rate")
|
|
|
|
|
def check_rate():
|
|
|
|
|
|
|
|
|
|
exists = SubcontractorRateService.check_duplicate(
|
|
|
|
|
subcontractor_id=request.args.get("subcontractor_id"),
|
|
|
|
|
category=request.args.get("category"),
|
|
|
|
|
item_name=request.args.get("item_name"),
|
|
|
|
|
rate_id=request.args.get("rate_id")
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return jsonify({
|
|
|
|
|
"exists": exists
|
|
|
|
|
})
|
|
|
|
|
|