from app.services.db_service import db from app.models.subcontractor_rate_model import SubcontractorRate from sqlalchemy import func class SubcontractorRateService: @staticmethod def save_or_update(form): rate_id = form.get("id") subcontractor_id = form.get("subcontractor_id") category = form.get("category") item_name = form.get("item_name").strip() # ----------------------------- # Duplicate Validation # ----------------------------- duplicate = ( SubcontractorRate.query .filter( SubcontractorRate.subcontractor_id == subcontractor_id, SubcontractorRate.category == category, func.lower(SubcontractorRate.item_name) == item_name.lower() ) .first() ) # Ignore current record while editing if duplicate and (not rate_id or duplicate.id != int(rate_id)): return { "success": False, "message": "Category and Rate already exists for this Subcontractor." } # ----------------------------- # Insert / Update # ----------------------------- if rate_id: rate = SubcontractorRate.query.get_or_404(rate_id) else: rate = SubcontractorRate() rate.subcontractor_id = subcontractor_id rate.category = category rate.item_code = form.get("item_code") rate.item_name = 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") if not rate_id: db.session.add(rate) db.session.commit() return { "success": True, "message": "Saved Successfully." } @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) def delete_rate(rate_id): rate = SubcontractorRate.query.get_or_404(rate_id) db.session.delete(rate) db.session.commit() @staticmethod def check_duplicate(subcontractor_id, category, item_name, rate_id=None): query = SubcontractorRate.query.filter( SubcontractorRate.subcontractor_id == subcontractor_id, SubcontractorRate.category == category, func.lower(SubcontractorRate.item_name) == item_name.strip().lower() ) if rate_id: query = query.filter(SubcontractorRate.id != int(rate_id)) return query.first() is not None