From bc4b9c778e230ca3a78afc8ba9d48a666e4afdc7 Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Thu, 6 Aug 2026 12:20:50 +0530 Subject: [PATCH] New rate model added --- app/__init__.py | 2 +- app/config.py | 12 +- app/models/subcontractor_rate_model.py | 23 ++ app/routes/auth.py | 3 +- app/routes/engineering.py | 16 -- app/routes/engineering_master_routes.py | 56 +++++ app/services/abstract_service.py | 24 +-- app/services/subcontractor_rate_service.py | 65 ++++++ app/templates/base.html | 105 ++++++--- app/templates/engineering/add.html | 50 ----- app/templates/engineering/add_rate.html | 236 +++++++++++++++++++++ app/templates/engineering/index.html | 83 ++++++++ app/templates/login.html | 5 +- app/templates/subcontractor/add.html | 192 +++++++++++++---- app/templates/subcontractor_report.html | 2 +- app/templates/test.html | 119 ----------- 16 files changed, 723 insertions(+), 270 deletions(-) create mode 100644 app/models/subcontractor_rate_model.py delete mode 100644 app/routes/engineering.py create mode 100644 app/routes/engineering_master_routes.py create mode 100644 app/services/subcontractor_rate_service.py delete mode 100644 app/templates/engineering/add.html create mode 100644 app/templates/engineering/add_rate.html create mode 100644 app/templates/engineering/index.html delete mode 100644 app/templates/test.html diff --git a/app/__init__.py b/app/__init__.py index 99e90a9..8838957 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -38,7 +38,7 @@ def register_blueprints(app): # new from app.routes.activity_routes import activity_bp - from app.routes.engineering import engi_bp + from app.routes.engineering_master_routes import engi_bp app.register_blueprint(auth_bp) app.register_blueprint(user_bp) diff --git a/app/config.py b/app/config.py index 8203a71..54b2182 100644 --- a/app/config.py +++ b/app/config.py @@ -21,4 +21,14 @@ class Config: ) SQLALCHEMY_TRACK_MODIFICATIONS = False - \ No newline at end of file + + + # LDAP Configuration New + LDAP_SERVER = os.getenv("LDAP_SERVER") + LDAP_PORT = int(os.getenv("LDAP_PORT", 389)) + LDAP_USE_SSL = os.getenv("LDAP_USE_SSL", "False").lower() == "true" + + LDAP_BASE_DN = os.getenv("LDAP_BASE_DN") + LDAP_DOMAIN = os.getenv("LDAP_DOMAIN") + + LDAP_SEARCH_BASE = os.getenv("LDAP_SEARCH_BASE") \ No newline at end of file diff --git a/app/models/subcontractor_rate_model.py b/app/models/subcontractor_rate_model.py new file mode 100644 index 0000000..5a8f8fb --- /dev/null +++ b/app/models/subcontractor_rate_model.py @@ -0,0 +1,23 @@ +from app import db +from datetime import datetime + +class SubcontractorRate(db.Model): + __tablename__ = "subcontractor_rates" + + id = db.Column(db.Integer, primary_key=True) + subcontractor_id = db.Column(db.Integer, db.ForeignKey("subcontractors.id"), nullable=False) + subcontractor = db.relationship("Subcontractor", backref="rate_master") + + category = db.Column(db.String(50), nullable=False) + item_code = db.Column(db.String(50), nullable=False) + item_name = db.Column(db.String(200), nullable=False) + unit = db.Column(db.String(20)) + rate = db.Column(db.Numeric(12,2), nullable=False) + effective_from = db.Column(db.Date, nullable=False) + effective_to = db.Column(db.Date) + status = db.Column(db.String(20), default="Active") + created_at = db.Column(db.DateTime, default=datetime.now) + + def __repr__(self): + return f"" + \ No newline at end of file diff --git a/app/routes/auth.py b/app/routes/auth.py index ecf10b4..88d6855 100644 --- a/app/routes/auth.py +++ b/app/routes/auth.py @@ -34,8 +34,9 @@ def login(): session.clear() session["user_id"] = user.id session["user_name"] = user.name + session["email"] = user.email session.permanent = True - + current_app.logger.info(f"Login successful. User={user.name}") flash(SuccessMessage.LOGIN, "success") return redirect(url_for("dashboard.dashboard")) diff --git a/app/routes/engineering.py b/app/routes/engineering.py deleted file mode 100644 index 30691ee..0000000 --- a/app/routes/engineering.py +++ /dev/null @@ -1,16 +0,0 @@ -from flask import Blueprint -from app.models.width_model import Width - -engi_bp = Blueprint("engineering",__name__, url_prefix="/engi") - - -@engi_bp.route("/add") -def add_width_md(): - - return True - - -@engi_bp.route("/list") -def display_list(): - - return True \ No newline at end of file diff --git a/app/routes/engineering_master_routes.py b/app/routes/engineering_master_routes.py new file mode 100644 index 0000000..71cb99f --- /dev/null +++ b/app/routes/engineering_master_routes.py @@ -0,0 +1,56 @@ +from flask import ( + Blueprint, + render_template, + request, + redirect, + url_for, + flash +) + +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" + ) + + +@engi_bp.route("/subcontractor-rate") +def add_subcontractor_rates(): + subcontractors = Subcontractor.query.filter_by(status="Active").all() + + if request.method == "POST": + try: + SubcontractorRateService.save_rate(request.form) + flash(SuccessMessage.SAVE, "success") + return redirect(url_for("engineering.add_subcontractor_rates")) + except Exception as e: + flash(ErrorMessage.INTERNAL_SERVER_ERROR, "danger") + + return render_template( + "engineering/add_rate.html", + title="Subcontractor Rate Master", + subcontractors=subcontractors + ) + +@engi_bp.route("/client-rate") +def client_rates(): + + return render_template( + "engineering/client_rate.html", + title="Client Rate Master" + ) + diff --git a/app/services/abstract_service.py b/app/services/abstract_service.py index 46851f0..62e55d8 100644 --- a/app/services/abstract_service.py +++ b/app/services/abstract_service.py @@ -257,18 +257,18 @@ class AbstractReportService: def laying_summary(self): f = self.filters() data = [ - ("150 mm Pipe","RM",Laying.pipe_150_mm), - ("200 mm Pipe","RM",Laying.pipe_200_mm), - ("250 mm Pipe","RM",Laying.pipe_250_mm), - ("300 mm Pipe","RM",Laying.pipe_300_mm), - ("350 mm Pipe","RM",Laying.pipe_350_mm), - ("400 mm Pipe","RM",Laying.pipe_400_mm), - ("450 mm Pipe","RM",Laying.pipe_450_mm), - ("500 mm Pipe","RM",Laying.pipe_500_mm), - ("600 mm Pipe","RM",Laying.pipe_600_mm), - ("700 mm Pipe","RM",Laying.pipe_700_mm), - ("900 mm Pipe","RM",Laying.pipe_900_mm), - ("1200 mm Pipe","RM",Laying.pipe_1200_mm), + ("150 mm Dia","RM",Laying.pipe_150_mm), + ("200 mm Dia","RM",Laying.pipe_200_mm), + ("250 mm Dia","RM",Laying.pipe_250_mm), + ("300 mm Dia","RM",Laying.pipe_300_mm), + ("350 mm Dia","RM",Laying.pipe_350_mm), + ("400 mm Dia","RM",Laying.pipe_400_mm), + ("450 mm Dia","RM",Laying.pipe_450_mm), + ("500 mm Dia","RM",Laying.pipe_500_mm), + ("600 mm Dia","RM",Laying.pipe_600_mm), + ("700 mm Dia","RM",Laying.pipe_700_mm), + ("900 mm Dia","RM",Laying.pipe_900_mm), + ("1200 mm Dia","RM",Laying.pipe_1200_mm), ] return self.make_summary(data, Laying, f) diff --git a/app/services/subcontractor_rate_service.py b/app/services/subcontractor_rate_service.py new file mode 100644 index 0000000..951c378 --- /dev/null +++ b/app/services/subcontractor_rate_service.py @@ -0,0 +1,65 @@ +from app.services.db_service import db +from app.models.subcontractor_rate_model import SubcontractorRate + + +class SubcontractorRateService: + + @staticmethod + def save_rate(form): + + rate = SubcontractorRate( + subcontractor_id=form.get("subcontractor_id"), + category=form.get("category"), + item_code=form.get("item_code"), + item_name=form.get("item_name"), + unit=form.get("unit"), + rate=form.get("rate"), + effective_from=form.get("effective_from"), + effective_to=form.get("effective_to") or None, + status=form.get("status") + ) + + db.session.add(rate) + db.session.commit() + return rate + + + @staticmethod + def get_all_rates(): + + return ( + SubcontractorRate.query + .order_by(SubcontractorRate.created_at.desc()) + .all() + ) + @staticmethod + def get_rate(rate_id): + + return SubcontractorRate.query.get_or_404(rate_id) + + @staticmethod + def update_rate(rate_id, form): + + rate = SubcontractorRate.query.get_or_404(rate_id) + + rate.subcontractor_id = form.get("subcontractor_id") + rate.category = form.get("category") + rate.item_code = form.get("item_code") + rate.item_name = form.get("item_name") + rate.unit = form.get("unit") + rate.rate = form.get("rate") + rate.effective_from = form.get("effective_from") + rate.effective_to = form.get("effective_to") or None + rate.status = form.get("status") + + db.session.commit() + return rate + + @staticmethod + def delete_rate(rate_id): + + rate = SubcontractorRate.query.get_or_404(rate_id) + + db.session.delete(rate) + + db.session.commit() \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index d8c9c17..cca715e 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -124,66 +124,109 @@ Client vs Subcontractor - + - - + +