from app.services.db_service import db from app.models.client_rate_model import ClientRate from sqlalchemy import func class ClientRateService: @staticmethod def save_or_update(form): rate_id = form.get("id") category = form.get("category") item_name = form.get("item_name").strip() # ----------------------------- # Duplicate Validation # ----------------------------- duplicate = ( ClientRate.query .filter( ClientRate.category == category, func.lower(ClientRate.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 Client." } # ----------------------------- # Insert / Update # ----------------------------- if rate_id: rate = ClientRate.query.get_or_404(rate_id) else: rate = ClientRate() 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 ( ClientRate.query .order_by(ClientRate.created_at.desc()) .all() ) @staticmethod def get_rate(rate_id): return ClientRate.query.get_or_404(rate_id) def delete_rate(rate_id): rate = ClientRate.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 = ClientRate.query.filter( ClientRate.category == category, func.lower(ClientRate.item_name) == item_name.strip().lower() ) if rate_id: query = query.filter(ClientRate.id != int(rate_id)) return query.first() is not None