from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel from app.schemas.bx.common import DatetimeToStr, OptDatetimeToStr class WalletSummaryOut(BaseModel): model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel) id: str owner_user_id: str owner_user_name: str total_amount: float used_amount: float balance: float invoice_count: int version: int create_time: Optional[DatetimeToStr] = None update_time: OptDatetimeToStr = None class LedgerOut(BaseModel): model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel) id: str owner_user_id: str entry_type: str amount: float invoice_id: Optional[str] = None reimburse_id: Optional[str] = None ref_ledger_id: Optional[str] = None remark: Optional[str] = None create_time: DatetimeToStr class InvoiceAttachmentOut(BaseModel): model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel) id: str file_name: Optional[str] = None file_path: Optional[str] = None file_type: Optional[str] = None class InvoiceOut(BaseModel): model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel) id: str owner_user_id: str owner_user_name: str amount: float upload_by: Optional[str] = None upload_by_name: Optional[str] = None remark: Optional[str] = None create_time: DatetimeToStr update_time: OptDatetimeToStr = None # 兼容旧前端:取首个附件 attachment_id: Optional[str] = None file_name: Optional[str] = None file_path: Optional[str] = None file_type: Optional[str] = None attachments: List[InvoiceAttachmentOut] = Field(default_factory=list)