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:
@@ -44,6 +44,7 @@ class ExpenseClaim(Base):
|
|||||||
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
|
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
employee = relationship("Employee", foreign_keys=[employee_id])
|
||||||
items = relationship(
|
items = relationship(
|
||||||
"ExpenseClaimItem",
|
"ExpenseClaimItem",
|
||||||
back_populates="claim",
|
back_populates="claim",
|
||||||
@@ -51,6 +52,28 @@ class ExpenseClaim(Base):
|
|||||||
order_by="asc(ExpenseClaimItem.item_date)",
|
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):
|
class ExpenseClaimItem(Base):
|
||||||
__tablename__ = "expense_claim_items"
|
__tablename__ = "expense_claim_items"
|
||||||
|
|||||||
@@ -91,6 +91,10 @@ class ExpenseClaimRead(BaseModel):
|
|||||||
employee_name: str
|
employee_name: str
|
||||||
department_id: str | None
|
department_id: str | None
|
||||||
department_name: str
|
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
|
project_code: str | None
|
||||||
expense_type: str
|
expense_type: str
|
||||||
reason: str
|
reason: str
|
||||||
|
|||||||
@@ -98,7 +98,11 @@ class ExpenseClaimService:
|
|||||||
def list_claims(self, current_user: CurrentUserContext) -> list[ExpenseClaim]:
|
def list_claims(self, current_user: CurrentUserContext) -> list[ExpenseClaim]:
|
||||||
stmt = (
|
stmt = (
|
||||||
select(ExpenseClaim)
|
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())
|
.order_by(ExpenseClaim.created_at.desc(), ExpenseClaim.occurred_at.desc())
|
||||||
)
|
)
|
||||||
stmt = self._apply_claim_scope(stmt, current_user)
|
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:
|
def get_claim(self, claim_id: str, current_user: CurrentUserContext) -> ExpenseClaim | None:
|
||||||
stmt = (
|
stmt = (
|
||||||
select(ExpenseClaim)
|
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)
|
.where(ExpenseClaim.id == claim_id)
|
||||||
)
|
)
|
||||||
stmt = self._apply_claim_scope(stmt, current_user)
|
stmt = self._apply_claim_scope(stmt, current_user)
|
||||||
|
|||||||
Reference in New Issue
Block a user