费用管理内容优化-初步

This commit is contained in:
Cheng Zhou
2026-01-13 16:49:55 +08:00
parent 0c7c03069a
commit 1db36f40b0
43 changed files with 5229 additions and 26 deletions
+57
View File
@@ -0,0 +1,57 @@
import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
from app.schemas.contract_fee_payment import ContractFeePaymentRead
from app.schemas.fee_attachment import FeeAttachmentRead
class ContractFeeCreate(BaseModel):
project_id: uuid.UUID
center_id: uuid.UUID
contract_amount: Decimal = Field(ge=0)
contract_cases: int = Field(ge=0)
actual_cases: Optional[int] = Field(default=None, ge=0)
settlement_amount: Optional[Decimal] = Field(default=None, ge=0)
final_payment_amount: Optional[Decimal] = Field(default=None, ge=0)
class ContractFeeUpdate(BaseModel):
contract_amount: Optional[Decimal] = Field(default=None, ge=0)
contract_cases: Optional[int] = Field(default=None, ge=0)
actual_cases: Optional[int] = Field(default=None, ge=0)
settlement_amount: Optional[Decimal] = Field(default=None, ge=0)
final_payment_amount: Optional[Decimal] = Field(default=None, ge=0)
class ContractFeeRead(BaseModel):
id: uuid.UUID
project_id: uuid.UUID
center_id: uuid.UUID
contract_amount: Decimal
contract_cases: int
actual_cases: Optional[int]
settlement_amount: Optional[Decimal]
final_payment_amount: Optional[Decimal]
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
class ContractFeeListItem(ContractFeeRead):
center_name: str
paid_total: Decimal
verified_total: Decimal
unpaid_balance: Decimal
unverified_balance: Decimal
last_paid_date: Optional[date]
last_verified_date: Optional[date]
class ContractFeeDetail(ContractFeeRead):
payments: list[ContractFeePaymentRead]
attachments: dict[str, list[FeeAttachmentRead]]
@@ -0,0 +1,40 @@
import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
class ContractFeePaymentCreate(BaseModel):
amount: Decimal = Field(ge=0)
paid_date: Optional[date] = None
verified_date: Optional[date] = None
is_paid: bool = False
is_verified: bool = False
remark: Optional[str] = None
class ContractFeePaymentUpdate(BaseModel):
amount: Optional[Decimal] = Field(default=None, ge=0)
paid_date: Optional[date] = None
verified_date: Optional[date] = None
is_paid: Optional[bool] = None
is_verified: Optional[bool] = None
remark: Optional[str] = None
class ContractFeePaymentRead(BaseModel):
id: uuid.UUID
contract_fee_id: uuid.UUID
seq: int
amount: Decimal
paid_date: Optional[date]
verified_date: Optional[date]
is_paid: bool
is_verified: bool
remark: Optional[str]
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
+24
View File
@@ -0,0 +1,24 @@
import uuid
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict
from app.schemas.user import UserDisplay
class FeeAttachmentRead(BaseModel):
id: uuid.UUID
entity_type: str
entity_id: uuid.UUID
file_type: str
filename: str
mime_type: Optional[str]
size: int
storage_key: Optional[str]
url: Optional[str]
uploaded_by: Optional[UserDisplay]
uploaded_by_id: Optional[uuid.UUID] = None
uploaded_at: datetime
model_config = ConfigDict(from_attributes=True)
+11
View File
@@ -0,0 +1,11 @@
from typing import Generic, TypeVar
from pydantic.generics import GenericModel
T = TypeVar("T")
class FeeApiResponse(GenericModel, Generic[T]):
data: T | None = None
error: str | dict | None = None
meta: dict | None = None
+55
View File
@@ -0,0 +1,55 @@
import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
class SpecialExpenseCreate(BaseModel):
project_id: uuid.UUID
center_id: Optional[uuid.UUID] = None
category: str
amount: Decimal = Field(ge=0)
happen_date: Optional[date] = None
description: Optional[str] = None
is_paid: bool = False
paid_date: Optional[date] = None
is_verified: bool = False
verified_date: Optional[date] = None
class SpecialExpenseUpdate(BaseModel):
center_id: Optional[uuid.UUID] = None
category: Optional[str] = None
amount: Optional[Decimal] = Field(default=None, ge=0)
happen_date: Optional[date] = None
description: Optional[str] = None
is_paid: Optional[bool] = None
paid_date: Optional[date] = None
is_verified: Optional[bool] = None
verified_date: Optional[date] = None
class SpecialExpenseRead(BaseModel):
id: uuid.UUID
project_id: uuid.UUID
center_id: Optional[uuid.UUID]
category: str
amount: Decimal
happen_date: Optional[date]
description: Optional[str]
is_paid: bool
paid_date: Optional[date]
is_verified: bool
verified_date: Optional[date]
created_by: Optional[uuid.UUID]
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
class SpecialExpenseListItem(SpecialExpenseRead):
center_name: Optional[str]
attachments_count: int