| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- from typing import List, Optional
- from pydantic import BaseModel, ConfigDict, Field, field_validator
- from pydantic.alias_generators import to_camel
- from app.schemas.common import DatetimeToStr, OptDatetimeToStr
- class ReimburseDetailCreate(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- expense_item_id: int
- amount: float
- remark: Optional[str] = None
- class ReimburseDetailOut(BaseModel):
- model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
- id: int
- expense_id: int
- expense_name: str
- amount: float
- remark: Optional[str] = None
- class ReimburseApplyCreate(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- title: Optional[str] = None
- apply_date: Optional[str] = None
- details: List[ReimburseDetailCreate] = Field(..., min_length=1)
- remark: Optional[str] = None
- @field_validator("details")
- @classmethod
- def details_must_not_be_empty(cls, v):
- if not v or len(v) < 1:
- raise ValueError("至少需要一条报销明细")
- return v
- class ReimburseApplyUpdate(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- details: Optional[List[ReimburseDetailCreate]] = None
- remark: Optional[str] = None
- class ReimburseApplyOut(BaseModel):
- model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
- id: int
- apply_code: str
- applicant_id: int
- applicant_name: str
- title: str
- expense_id: Optional[int] = None
- expense_name: str
- amount: float
- current_node: Optional[str] = None
- apply_time: DatetimeToStr = Field(validation_alias="create_time")
- status: Optional[str] = None
- remark: Optional[str] = None
- invoice_count: int = 0
- attach_count: int = 0
- pay_status: Optional[str] = None
- pay_time: OptDatetimeToStr = None
- pay_user_name: Optional[str] = None
- actual_amount: Optional[float] = None
- offset_advance_id: Optional[int] = None
- offset_amount: Optional[float] = None
- details: Optional[List[ReimburseDetailOut]] = None
- class ReimburseApprovalCreate(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- approval_status: Optional[str] = None
- approval_opinion: Optional[str] = None
- class ReimburseApprovalOut(BaseModel):
- model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
- id: int
- reimburse_id: int
- node_name: str
- node_order: int
- approval_status: str
- approval_opinion: Optional[str] = None
- approver_name: str
- approval_time: OptDatetimeToStr = None
- class PaymentRequest(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- code: str
- type: str
- action: str
- offset_advance_id: Optional[int] = None
- offset_amount: Optional[float] = None
- class OffsetRequest(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- reimburse_id: int
- advance_id: int
- offset_amount: float
- remark: Optional[str] = None
- class PayRequest(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- pay_remark: Optional[str] = None
- actual_amount: Optional[float] = None
- class OffsetItem(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- advance_id: int
- offset_amount: float
- class BatchOffsetRequest(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- items: List[OffsetItem]
- pay_amount: float = 0
- remark: Optional[str] = None
- class ReimburseOffsetRecordOut(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- advance_id: int
- advance_apply_code: str
- advance_applicant_name: Optional[str] = None
- advance_reason: Optional[str] = None
- offset_amount: float
- remark: Optional[str] = None
- operator: Optional[str] = None
- create_time: OptDatetimeToStr = None
- class ReimburseMyStatsOut(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- total_count: int
- pending_count: int
- approved_count: int
- rejected_count: int
- approved_amount: float
- month_apply_amount: float
- month_apply_count: int
- class ReimburseApproverPendingStatsOut(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- pending_total: int
- month_pending_amount: float
- class PaymentFinanceStatsOut(BaseModel):
- model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
- pending_count: int
- paid_count: int
- offset_count: int
- month_processed_amount: float
|