from __future__ import annotations from datetime import date, datetime from decimal import Decimal from typing import Any from pydantic import BaseModel, ConfigDict, Field class ReimbursementCreate(BaseModel): request_no: str employee_id: str title: str category: str amount: Decimal reason: str | None = None class ReimbursementRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: str request_no: str employee_id: str title: str category: str status: str amount: Decimal reason: str | None created_at: datetime updated_at: datetime class ExpenseClaimItemRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: str item_date: date item_type: str item_reason: str item_location: str item_amount: Decimal invoice_id: str | None created_at: datetime updated_at: datetime class ExpenseClaimAttachmentAnalysisRead(BaseModel): severity: str label: str headline: str summary: str points: list[str] = Field(default_factory=list) suggestion: str = "" class ExpenseClaimAttachmentRead(BaseModel): file_name: str storage_key: str media_type: str size_bytes: int uploaded_at: datetime | None = None previewable: bool = True analysis: ExpenseClaimAttachmentAnalysisRead | None = None class ExpenseClaimItemUpdate(BaseModel): item_date: date | None = None item_type: str | None = None item_reason: str | None = None item_location: str | None = None item_amount: Decimal | None = None invoice_id: str | None = None class ExpenseClaimItemCreate(BaseModel): item_date: date | None = None item_type: str | None = None item_reason: str | None = None item_location: str | None = None item_amount: Decimal | None = None invoice_id: str | None = None class ExpenseClaimRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: str claim_no: str employee_id: str | None 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 location: str amount: Decimal currency: str invoice_count: int occurred_at: datetime submitted_at: datetime | None status: str approval_stage: str | None risk_flags_json: list[Any] = Field(default_factory=list) created_at: datetime updated_at: datetime items: list[ExpenseClaimItemRead] = Field(default_factory=list) class ExpenseClaimActionResponse(BaseModel): message: str claim_id: str status: str | None = None class ExpenseClaimAttachmentActionResponse(BaseModel): message: str claim_id: str item_id: str invoice_id: str | None = None attachment: ExpenseClaimAttachmentRead | None = None class ExpenseClaimItemActionResponse(BaseModel): message: str claim_id: str item_id: str