test_bx_reimburse_title_seq.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """标题序号须避开唯一索引仍占用的号,包括已软删记录。"""
  2. from datetime import date, datetime
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.orm import sessionmaker
  5. from app.models.bx_models import BxReimburseApply
  6. from app.utils.bx_codegen import allocate_reimburse_title_seq, preview_reimburse_title_seq
  7. TENANT = "shanxia2.0"
  8. REIMBURSE_DATE = date(2026, 9, 20)
  9. def _session():
  10. engine = create_engine("sqlite://")
  11. BxReimburseApply.__table__.create(engine)
  12. return sessionmaker(bind=engine)()
  13. def _apply(*, title_seq: int, del_flag: int, apply_code: str) -> BxReimburseApply:
  14. now = datetime(2026, 9, 20, 19, 0, 0)
  15. return BxReimburseApply(
  16. id=apply_code,
  17. apply_code=apply_code,
  18. title=f"系统管理员报销单20260920{title_seq:03d}",
  19. reimburse_date=REIMBURSE_DATE,
  20. title_seq=title_seq,
  21. applicant_id="u1",
  22. applicant_name="系统管理员",
  23. expense_id="67",
  24. expense_name="职工福利费",
  25. amount=1,
  26. status="draft",
  27. tenant_no=TENANT,
  28. create_dept_id="dept",
  29. create_time=now,
  30. update_time=now,
  31. del_flag=del_flag,
  32. )
  33. def test_allocate_title_seq_skips_soft_deleted_row():
  34. db = _session()
  35. db.add(_apply(title_seq=1, del_flag=1, apply_code="BX20260920001"))
  36. db.commit()
  37. assert allocate_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2
  38. assert preview_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2
  39. def test_allocate_title_seq_still_increments_live_row():
  40. db = _session()
  41. db.add(_apply(title_seq=1, del_flag=0, apply_code="BX20260920001"))
  42. db.commit()
  43. assert allocate_reimburse_title_seq(db, TENANT, REIMBURSE_DATE) == 2