from decimal import Decimal from typing import Optional from pydantic import BaseModel, Field, ConfigDict # Import nested schemas from ..line_customs.schemas import ( LineCustomCreate, LineCustomUpdate, LineCustomResponse ) from ..line_descriptions.schemas import ( LineDescriptionCreate, LineDescriptionUpdate, LineDescriptionResponse ) from ..line_quantities.schemas import ( LineQuantityCreate, LineQuantityUpdate, LineQuantityResponse ) from ..line_financials.schemas import ( LineFinancialCreate, LineFinancialUpdate, LineFinancialResponse ) from ..line_references.schemas import ( LineReferenceCreate, LineReferenceUpdate, LineReferenceResponse ) # ============================================================================ # LINE ITEM SCHEMAS # ============================================================================ class LineItemBase(BaseModel): """Base schema for line items""" line_number: int = Field(..., description="Line number") # Part identification part_number: Optional[str] = Field(None, max_length=50, description="Part number") component_part_number: Optional[str] = Field(None, max_length=50, description="Component part number") class_code: Optional[str] = Field(None, max_length=20, description="Class code") # Unit of measure unit_of_measure: Optional[str] = Field(None, max_length=10, description="Unit of measure") alternate_unit: Optional[str] = Field(None, max_length=10, description="Alternate unit") uma_key: Optional[str] = Field(None, max_length=2, description="UMA key") auxiliary_unit: Optional[str] = Field(None, max_length=5, description="Auxiliary unit") # Permits and certificates permit_number: Optional[str] = Field(None, max_length=20, description="Permit number") page_line: Optional[str] = Field(None, max_length=10, description="Page line") has_certificate: Optional[bool] = Field(None, description="Has certificate") certificate_number: Optional[str] = Field(None, max_length=10, description="Certificate number") octave_permit: Optional[str] = Field(None, max_length=20, description="Octave permit") permits_ped: Optional[str] = Field(None, max_length=500, description="PED permits") # FDA has_fda_code: Optional[bool] = Field(None, description="Has FDA code") fda_key: Optional[str] = Field(None, max_length=10, description="FDA key") # Subitem flags is_subitem: Optional[bool] = Field(None, description="Is subitem") contains_subitems: Optional[bool] = Field(None, description="Contains subitems") includes_subitems: Optional[bool] = Field(None, description="Includes subitems") subitem_number: Optional[bool] = Field(None, description="Subitem number") # Special flags is_military_mcia: Optional[bool] = Field(None, description="Is military merchandise") # IV32 iv32_type_key: Optional[str] = Field(None, max_length=5, description="IV32 type key") iv32_number: Optional[str] = Field(None, max_length=35, description="IV32 number") # Export specific scrap_invoice: Optional[str] = Field(None, max_length=15, description="Scrap invoice") consecutive_destination: Optional[int] = Field(None, description="Consecutive destination") ctm_section: Optional[str] = Field(None, max_length=3, description="CTM section") # Tax payment tax_payment: Optional[bool] = Field(None, description="Tax payment") payment_method: Optional[str] = Field(None, max_length=9, description="Payment method") igi_amount: Optional[Decimal] = Field(None, description="IGI amount") igi_payment_method: Optional[str] = Field(None, max_length=9, description="IGI payment method") # FCC fcc_key: Optional[str] = Field(None, max_length=30, description="FCC key") # Valuation method valuation_method: Optional[str] = Field(None, max_length=2, description="Valuation method") valuation_determined_value: Optional[Decimal] = Field(None, description="Valuation determined value") valuation_reason: Optional[str] = Field(None, max_length=500, description="Valuation reason") # Container rules container_rule: Optional[str] = Field(None, max_length=50, description="Container rule") container_parts_ii: Optional[str] = Field(None, max_length=50, description="Container parts II") # APHIS consecutive_aphis: Optional[int] = Field(None, description="Consecutive APHIS") # BOM/Commercial bom_version: Optional[int] = Field(None, description="BOM version") bill_version: Optional[int] = Field(None, description="Bill version") # TLCAN value tlcan_value: Optional[Decimal] = Field(None, description="TLCAN value") # Identifier identifier: Optional[str] = Field(None, max_length=2, description="Identifier") # Validation fields validation_zero: Optional[int] = Field(None, description="Validation zero") validation_one: Optional[int] = Field(None, description="Validation one") # Material type material_type: Optional[str] = Field(None, max_length=50, description="Material type") # Order concept order_type: Optional[str] = Field(None, max_length=50, description="Order type") line_concept: Optional[str] = Field(None, max_length=50, description="Line concept") # Review dispatch review_dispatch: Optional[str] = Field(None, max_length=10, description="Review dispatch") # Take component from PT take_component_pt: Optional[int] = Field(None, description="Take component from PT") # Pallet pallet2: Optional[int] = Field(None, description="Pallet 2") # Wildcard field wildcard_field: Optional[str] = Field(None, max_length=100, description="Wildcard field") class LineItemCreate(LineItemBase): """Schema for creating line item with all nested data""" financial: Optional[LineFinancialCreate] = Field(None, description="Financial data for this line") quantity: Optional[LineQuantityCreate] = Field(None, description="Quantity data for this line") customs: Optional[LineCustomCreate] = Field(None, description="Customs data for this line") description: Optional[LineDescriptionCreate] = Field(None, description="Description data for this line") reference: Optional[LineReferenceCreate] = Field(None, description="Reference data for this line") class LineItemUpdate(LineItemBase): """Schema for updating line item with all nested data""" line_number: Optional[int] = Field(None, description="Line number") financial: Optional[LineFinancialUpdate] = Field(None, description="Financial data for this line") quantity: Optional[LineQuantityUpdate] = Field(None, description="Quantity data for this line") customs: Optional[LineCustomUpdate] = Field(None, description="Customs data for this line") description: Optional[LineDescriptionUpdate] = Field(None, description="Description data for this line") reference: Optional[LineReferenceUpdate] = Field(None, description="Reference data for this line") class LineItemResponse(LineItemBase): """Schema for line item response with all nested data""" id: int item_id: int financial: Optional[LineFinancialResponse] = None quantity: Optional[LineQuantityResponse] = None customs: Optional[LineCustomResponse] = None description: Optional[LineDescriptionResponse] = None reference: Optional[LineReferenceResponse] = None model_config = ConfigDict(from_attributes=True)