from pydantic import BaseModel from datetime import date from typing import Optional, List # ----------------------- # Customer Schemas # ----------------------- class CustomerBase(BaseModel): full_name: str email: str phone: Optional[str] = None date_of_birth: Optional[date] = None age: Optional[int] = None gender: Optional[str] = None street_address: Optional[str] = None city: Optional[str] = None state: Optional[str] = None zip_code: Optional[str] = None home_branch_id: Optional[int] = None customer_since: Optional[date] = None employment_status: Optional[str] = None annual_income: Optional[float] = None credit_score: Optional[int] = None preferred_contact_method: Optional[str] = None class Customer(CustomerBase): customer_id: str class Config: orm_mode = True # ----------------------- # Account Schemas # ----------------------- class AccountBase(BaseModel): customer_id: str account_type: str open_date: date balance: float branch_id: Optional[int] = None class Account(AccountBase): account_id: str account_number: str class Config: orm_mode = True # ----------------------- # Transaction Schemas # ----------------------- class TransactionBase(BaseModel): account_id: str branch_id: Optional[int] = None transaction_type: str amount: float date: date balance_after: float vendor: Optional[str] = None transaction_location: Optional[str] = None class Transaction(TransactionBase): transaction_id: str class Config: orm_mode = True # ----------------------- # Nested Schemas # ----------------------- class AccountWithTransactions(Account): transactions: Optional[List[Transaction]] = [] class CustomerWithAccounts(Customer): accounts: Optional[List[AccountWithTransactions]] = []