## File: your_app/schemas.py from pydantic import BaseModel from typing import List, Optional from datetime import datetime from decimal import Decimal # Use Decimal for currency # --- NEW SCHEMAS FOR CIM WORKFLOW --- class CardCreate(BaseModel): # This schema receives sensitive card info just once. card_number: str expiration_date: str # Format: "YYYY-MM" cvv: str class Card(BaseModel): # This schema is for displaying saved card info. It is NOT sensitive. id: int customer_id: int last_four: str card_brand: Optional[str] = None expiration_month: int expiration_year: int class Config: orm_mode = True class TransactionCreateByCardID(BaseModel): # This is the NEW way to create a charge, using an internal card_id. card_id: int charge_amount: Decimal # Use Decimal # Fields for Level 2 data tax_amount: Optional[Decimal] = Decimal("0.0") # Your other business-related IDs service_id: Optional[int] = None delivery_id: Optional[int] = None # --- YOUR EXISTING SCHEMAS (UPDATED) --- class TransactionBase(BaseModel): preauthorize_amount: Optional[Decimal] = None charge_amount: Optional[Decimal] = None transaction_type: int service_id: Optional[int] = None delivery_id: Optional[int] = None card_id: Optional[int] = None payment_gateway: int = 1 rejection_reason: Optional[str] = None class TransactionCreate(TransactionBase): charge_amount: Decimal card_number: str expiration_date: str # MM/YY cvv: str class TransactionAuthorize(TransactionBase): preauthorize_amount: Decimal card_number: str expiration_date: str cvv: str class TransactionCapture(BaseModel): charge_amount: Decimal auth_net_transaction_id: str class Transaction(TransactionBase): id: int transaction_type: int status: int auth_net_transaction_id: Optional[str] = None customer_id: int created_at: datetime class Config: orm_mode = True class CustomerBase(BaseModel): account_number: Optional[str] = None customer_last_name: Optional[str] = None customer_first_name: Optional[str] = None customer_town: Optional[str] = None customer_state: Optional[int] = None customer_zip: Optional[str] = None customer_first_call: Optional[datetime] = None customer_email: Optional[str] = None customer_automatic: Optional[int] = None customer_phone_number: Optional[str] = None customer_home_type: Optional[int] = None customer_apt: Optional[str] = None customer_address: Optional[str] = None company_id: Optional[int] = None customer_latitude: Optional[str] = None customer_longitude: Optional[str] = None correct_address: Optional[bool] = None class Customer(CustomerBase): id: int # --- ADD THIS FIELD --- auth_net_profile_id: Optional[str] = None class Config: orm_mode = True # --- ADD THIS NEW SCHEMA --- class TransactionAuthorizeByCardID(BaseModel): # This is for creating an AUTHORIZATION using an internal card_id. card_id: int preauthorize_amount: Decimal # Use Decimal # Fields for Level 2 data (important for rates!) tax_amount: Optional[Decimal] = Decimal("0.0") # Your other business-related IDs service_id: Optional[int] = None delivery_id: Optional[int] = None # --- Your TransactionCapture schema is perfect and needs NO changes --- class TransactionCapture(BaseModel): charge_amount: Decimal auth_net_transaction_id: str