"""标题序号须避开唯一索引仍占用的号,包括已软删记录。""" from datetime import date, datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from app.models.bx_models import BxReimburseApply from app.utils.bx_codegen import allocate_reimburse_title_seq, preview_reimburse_title_seq TENANT = "shanxia2.0" REIMBURSE_DATE = date(2026, 9, 20) def _session(): engine = create_engine("sqlite://") BxReimburseApply.__table__.create(engine) return sessionmaker(bind=engine)() def _apply(*, title_seq: int, del_flag: int, apply_code: str) -> BxReimburseApply: now = datetime(2026, 9, 20, 19, 0, 0) return BxReimburseApply( id=apply_code, apply_code=apply_code, title=f"系统管理员报销单20260920{title_seq:03d}", reimburse_date=REIMBURSE_DATE, title_seq=title_seq, applicant_id="u1", applicant_name="系统管理员", expense_id="67", expense_name="职工福利费", amount=1, status="draft", tenant_no=TENANT, create_dept_id="dept", create_time=now, update_time=now, del_flag=del_flag, ) def test_allocate_title_seq_skips_soft_deleted_row(): db = _session() db.add(_apply(title_seq=1, del_flag=1, apply_code="BX20260920001")) db.commit() assert allocate_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2 assert preview_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2 def test_allocate_title_seq_still_increments_live_row(): db = _session() db.add(_apply(title_seq=1, del_flag=0, apply_code="BX20260920001")) db.commit() assert allocate_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2