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()