2026-08-06 12:20:50 +05:30
|
|
|
from app.services.db_service import db
|
|
|
|
|
from app.models.subcontractor_rate_model import SubcontractorRate
|
2026-08-07 10:29:15 +05:30
|
|
|
from sqlalchemy import func
|
2026-08-06 12:20:50 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
class SubcontractorRateService:
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
2026-08-07 10:29:15 +05:30
|
|
|
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
|
|
|
)
|
|
|
|
|
|
2026-08-07 10:29:15 +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()
|
2026-08-07 10:29:15 +05:30
|
|
|
|
|
|
|
|
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-07 10:29:15 +05:30
|
|
|
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
@staticmethod
|
|
|
|
|
def get_rate(rate_id):
|
|
|
|
|
|
|
|
|
|
return SubcontractorRate.query.get_or_404(rate_id)
|
|
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
def delete_rate(rate_id):
|
2026-08-06 12:20:50 +05:30
|
|
|
rate = SubcontractorRate.query.get_or_404(rate_id)
|
2026-08-07 10:29:15 +05:30
|
|
|
db.session.delete(rate)
|
2026-08-06 12:20:50 +05:30
|
|
|
db.session.commit()
|
2026-08-07 10:29:15 +05:30
|
|
|
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
@staticmethod
|
2026-08-07 10:29:15 +05:30
|
|
|
def check_duplicate(subcontractor_id, category, item_name, rate_id=None):
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2026-08-07 10:29:15 +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
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
if rate_id:
|
|
|
|
|
query = query.filter(SubcontractorRate.id != int(rate_id))
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2026-08-07 10:29:15 +05:30
|
|
|
return query.first() is not None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|