refactor(backend): update financial record model, schema and expense claims

- models/financial_record.py: update financial record model
- schemas/reimbursement.py: update reimbursement schema
- services/expense_claims.py: update expense claims service
This commit is contained in:
caoxiaozhu
2026-05-13 06:54:27 +00:00
parent 9459476d82
commit 999872a060
3 changed files with 37 additions and 2 deletions

View File

@@ -44,6 +44,7 @@ class ExpenseClaim(Base):
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
employee = relationship("Employee", foreign_keys=[employee_id])
items = relationship(
"ExpenseClaimItem",
back_populates="claim",
@@ -51,6 +52,28 @@ class ExpenseClaim(Base):
order_by="asc(ExpenseClaimItem.item_date)",
)
@property
def employee_position(self) -> str | None:
return str(self.employee.position).strip() if self.employee is not None and self.employee.position else None
@property
def employee_grade(self) -> str | None:
return str(self.employee.grade).strip() if self.employee is not None and self.employee.grade else None
@property
def manager_name(self) -> str | None:
if self.employee is None:
return None
if self.employee.manager is not None and self.employee.manager.name:
return str(self.employee.manager.name).strip() or None
return None
@property
def role_labels(self) -> list[str]:
if self.employee is None or not self.employee.roles:
return []
return [str(role.name).strip() for role in sorted(self.employee.roles, key=lambda item: item.name) if role.name]
class ExpenseClaimItem(Base):
__tablename__ = "expense_claim_items"

View File

@@ -91,6 +91,10 @@ class ExpenseClaimRead(BaseModel):
employee_name: str
department_id: str | None
department_name: str
employee_position: str | None = None
employee_grade: str | None = None
manager_name: str | None = None
role_labels: list[str] = Field(default_factory=list)
project_code: str | None
expense_type: str
reason: str

View File

@@ -98,7 +98,11 @@ class ExpenseClaimService:
def list_claims(self, current_user: CurrentUserContext) -> list[ExpenseClaim]:
stmt = (
select(ExpenseClaim)
.options(selectinload(ExpenseClaim.items))
.options(
selectinload(ExpenseClaim.items),
selectinload(ExpenseClaim.employee).selectinload(Employee.manager),
selectinload(ExpenseClaim.employee).selectinload(Employee.roles),
)
.order_by(ExpenseClaim.created_at.desc(), ExpenseClaim.occurred_at.desc())
)
stmt = self._apply_claim_scope(stmt, current_user)
@@ -107,7 +111,11 @@ class ExpenseClaimService:
def get_claim(self, claim_id: str, current_user: CurrentUserContext) -> ExpenseClaim | None:
stmt = (
select(ExpenseClaim)
.options(selectinload(ExpenseClaim.items))
.options(
selectinload(ExpenseClaim.items),
selectinload(ExpenseClaim.employee).selectinload(Employee.manager),
selectinload(ExpenseClaim.employee).selectinload(Employee.roles),
)
.where(ExpenseClaim.id == claim_id)
)
stmt = self._apply_claim_scope(stmt, current_user)