""" Pydantic Models and Schemas """ from pydantic import BaseModel from typing import Optional, List from datetime import datetime # Customer Schemas class CustomerBase(BaseModel): """Base customer schema""" name: str email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None class CustomerCreate(BaseModel): """Schema for creating a customer""" name: str cvr_number: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None postal_code: Optional[str] = None city: Optional[str] = None website: Optional[str] = None is_active: bool = True class CustomerUpdate(BaseModel): """Schema for updating a customer""" name: Optional[str] = None cvr_number: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None postal_code: Optional[str] = None city: Optional[str] = None website: Optional[str] = None is_active: Optional[bool] = None class Customer(CustomerBase): """Full customer schema""" id: int created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True # Contact Schemas class ContactBase(BaseModel): """Base contact schema""" first_name: str last_name: str email: Optional[str] = None phone: Optional[str] = None mobile: Optional[str] = None title: Optional[str] = None department: Optional[str] = None class ContactCreate(ContactBase): """Schema for creating a contact""" company_ids: List[int] = [] # List of customer IDs to link to is_primary: bool = False # Whether this is the primary contact for first company role: Optional[str] = None notes: Optional[str] = None is_active: bool = True class ContactUpdate(BaseModel): """Schema for updating a contact""" first_name: Optional[str] = None last_name: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None mobile: Optional[str] = None title: Optional[str] = None department: Optional[str] = None is_active: Optional[bool] = None class ContactCompanyLink(BaseModel): """Schema for linking/unlinking a contact to a company""" customer_id: int is_primary: bool = False role: Optional[str] = None notes: Optional[str] = None class CompanyInfo(BaseModel): """Schema for company information in contact context""" id: int name: str is_primary: bool role: Optional[str] = None notes: Optional[str] = None class Contact(ContactBase): """Full contact schema""" id: int is_active: bool vtiger_id: Optional[str] = None created_at: datetime updated_at: Optional[datetime] = None companies: List[CompanyInfo] = [] # List of linked companies class Config: from_attributes = True # Hardware Schemas class HardwareBase(BaseModel): """Base hardware schema""" serial_number: str model: str customer_id: int class HardwareCreate(HardwareBase): """Schema for creating hardware""" pass class Hardware(HardwareBase): """Full hardware schema""" id: int created_at: datetime class Config: from_attributes = True # Vendor Schemas class VendorBase(BaseModel): """Base vendor schema""" name: str email: Optional[str] = None phone: Optional[str] = None class VendorCreate(BaseModel): """Schema for creating a vendor""" name: str cvr_number: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None postal_code: Optional[str] = None city: Optional[str] = None website: Optional[str] = None domain: Optional[str] = None email_pattern: Optional[str] = None category: str = 'general' priority: int = 50 notes: Optional[str] = None is_active: bool = True class VendorUpdate(BaseModel): """Schema for updating a vendor""" name: Optional[str] = None cvr_number: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None postal_code: Optional[str] = None city: Optional[str] = None website: Optional[str] = None domain: Optional[str] = None email_pattern: Optional[str] = None category: Optional[str] = None priority: Optional[int] = None notes: Optional[str] = None is_active: Optional[bool] = None class Vendor(VendorBase): """Full vendor schema""" id: int cvr_number: Optional[str] = None address: Optional[str] = None postal_code: Optional[str] = None city: Optional[str] = None country: Optional[str] = None website: Optional[str] = None domain: Optional[str] = None category: str priority: int notes: Optional[str] = None is_active: bool created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True