Files
Comparison_Project/app/services/subcontractor_rate_service.py

102 lines
2.9 KiB
Python
Raw Normal View History

2026-08-06 12:20:50 +05:30
from app.services.db_service import db
from app.models.subcontractor_rate_model import SubcontractorRate
from sqlalchemy import func
2026-08-06 12:20:50 +05:30
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()
2026-08-06 12:20:50 +05:30
)
# 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)
2026-08-06 12:20:50 +05:30
db.session.commit()
return {
"success": True,
"message": "Saved Successfully."
}
2026-08-06 12:20:50 +05:30
@staticmethod
def get_all_rates():
return (
SubcontractorRate.query
.order_by(SubcontractorRate.created_at.desc())
.all()
)
2026-08-06 12:20:50 +05:30
@staticmethod
def get_rate(rate_id):
return SubcontractorRate.query.get_or_404(rate_id)
def delete_rate(rate_id):
2026-08-06 12:20:50 +05:30
rate = SubcontractorRate.query.get_or_404(rate_id)
db.session.delete(rate)
2026-08-06 12:20:50 +05:30
db.session.commit()
2026-08-06 12:20:50 +05:30
@staticmethod
def check_duplicate(subcontractor_id, category, item_name, rate_id=None):
2026-08-06 12:20:50 +05:30
query = SubcontractorRate.query.filter(
SubcontractorRate.subcontractor_id == subcontractor_id,
SubcontractorRate.category == category,
func.lower(SubcontractorRate.item_name) == item_name.strip().lower()
)
2026-08-06 12:20:50 +05:30
if rate_id:
query = query.filter(SubcontractorRate.id != int(rate_id))
2026-08-06 12:20:50 +05:30
return query.first() is not None