37 lines
1.2 KiB
Python
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()
|