ifixkart-backend/Backend/app/services/code_generator_service.py

37 lines
1.2 KiB
Python

from sqlalchemy.orm import Session
from sqlalchemy import select
from app.models.UserModel import User
class CodeGeneratorService:
@staticmethod
def generate_next_code(db: Session, entity_type: str, prefix: str) -> str:
# Resolve table and column mappings
if entity_type == "User":
model_class = User
column_attr = User.employee_code
else:
raise ValueError(f"Unsupported entity type for code generation: {entity_type}")
# Query highest code using write-lock to prevent race conditions
stmt = (
select(column_attr)
.where(column_attr.like(f"{prefix}%"))
.order_by(column_attr.desc())
.limit(1)
.with_for_update()
)
result = db.execute(stmt)
last_code = result.scalar_one_or_none()
prefix_len = len(prefix)
if last_code and last_code[prefix_len:].isdigit():
last_number = int(last_code[prefix_len:])
new_number = last_number + 1
else:
new_number = 1
# Zero-pad suffix to 4 digits (e.g. TEC0001)
return f"{prefix}{new_number:04d}"
code_generator_service = CodeGeneratorService()