from datetime import datetime, date from typing import List, Optional, Union from pydantic import constr from schemas.attribute import CardAttributeSchema from schemas.base import BaseSchema, OkMessageSchema from schemas.billing import CardBillRequestSchema from schemas.board import BoardSchema from schemas.client import ClientSchema from schemas.group import CardGroupSchema from schemas.marketplace import BaseMarketplaceSchema from schemas.product import ProductSchema from schemas.service import ServiceSchema from schemas.shipping import PalletSchema, BoxSchema from schemas.shipping_warehouse import ShippingWarehouseSchema, BaseShippingWarehouseSchema from schemas.status import StatusSchema, CardStatusHistorySchema from schemas.user import UserSchema # region Entities class BaseSchemaWithAttributes(BaseSchema): attributes: dict[str, Union[bool, str, int, float, date, datetime, None]] = None def validate_attributes(cls, value): for attr_name, attr_value in value.items(): if not isinstance(attr_value, (str, int, float, date, datetime, None)): raise ValueError(f"Invalid type for attribute '{attr_name}': {type(attr_value)}") return value class CardSummary(BaseSchema): id: int name: str client_name: str created_at: datetime status: StatusSchema board: BoardSchema total_price: int rank: int base_marketplace: Optional[BaseMarketplaceSchema] = None total_products: int shipment_warehouse_id: Optional[int] shipment_warehouse_name: Optional[str] bill_request: Optional[CardBillRequestSchema] = None group: Optional[CardGroupSchema] = None class CardServiceSchema(BaseSchema): service: ServiceSchema quantity: int price: int employees: List[UserSchema] is_fixed_price: bool class CardProductServiceSchema(BaseSchema): service: ServiceSchema price: int employees: List[UserSchema] is_fixed_price: bool class CardProductSchema(BaseSchema): product: ProductSchema services: List[CardProductServiceSchema] quantity: int comment: str = "" class CardEmployeesSchema(BaseSchema): user: UserSchema created_at: datetime class BaseCardSchema(BaseSchema): id: int name: str comment: str created_at: datetime status: StatusSchema board: BoardSchema status_history: List[CardStatusHistorySchema] is_deleted: bool is_completed: bool is_locked: bool services: List[CardServiceSchema] products: List[CardProductSchema] client_id: int client: ClientSchema shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None bill_request: Optional[CardBillRequestSchema] = None group: Optional[CardGroupSchema] = None manager: Optional[UserSchema] = None pallets: List[PalletSchema] = [] boxes: List[BoxSchema] = [] employees: List[CardEmployeesSchema] = [] class CardSchema(BaseCardSchema): attributes: list[CardAttributeSchema] class CardGeneralInfoSchema(BaseSchemaWithAttributes): name: str is_deleted: bool is_completed: bool comment: str shipping_warehouse: Optional[str] = None manager: Optional[UserSchema] = None board_id: int status_id: int class OptionalShippingWarehouseSchema(BaseShippingWarehouseSchema): id: Optional[int] = None class ParsedCityBreakdownSchema(BaseSchema): base_marketplace: BaseMarketplaceSchema shipping_warehouse: OptionalShippingWarehouseSchema quantity: int class ParsedProductRowSchema(BaseSchema): barcode: str products: list[ProductSchema] breakdowns: list[ParsedCityBreakdownSchema] class CityBreakdownFromExcelSchema(BaseSchema): base_marketplace: BaseMarketplaceSchema shipping_warehouse: OptionalShippingWarehouseSchema quantity: int class ProductFromExcelSchema(BaseSchema): product_id: int cities_breakdown: list[CityBreakdownFromExcelSchema] # endregion Entities # region Requests class CardChangeStatusRequest(BaseSchema): card_id: int new_status: int class CardCreateRequest(BaseSchema): name: str status_id: int class CardQuickCreateRequest(BaseSchema): name: constr(strip_whitespace=True) client_name: constr(strip_whitespace=True) comment: str acceptance_date: datetime shipping_warehouse: constr(strip_whitespace=True) base_marketplace: BaseMarketplaceSchema status_id: int class CardSummaryRequest(BaseSchema): pass class CardAddServicesRequest(BaseSchema): card_id: int services: list[CardServiceSchema] class CardUpdateServiceQuantityRequest(BaseSchema): card_id: int service_id: int quantity: int class CardUpdateServiceRequest(BaseSchema): card_id: int service: CardServiceSchema class CardAddServiceRequest(BaseSchema): card_id: int service_id: int quantity: int price: int class CardDeleteServiceRequest(BaseSchema): card_id: int service_id: int class CardDeleteServicesRequest(BaseSchema): card_id: int service_ids: List[int] class CardUpdateProductQuantityRequest(BaseSchema): card_id: int product_id: int quantity: int class CardAddProductRequest(BaseSchema): card_id: int product: CardProductSchema class CardDeleteProductRequest(BaseSchema): card_id: int product_id: int class CardDeleteProductsRequest(BaseSchema): card_id: int product_ids: List[int] class CardUpdateGeneralInfoRequest(BaseSchema): card_id: int data: CardGeneralInfoSchema class CardSummaryReorderRequest(BaseSchema): card_id: int status_id: int index: int deadline: datetime | None = None comment: str | None = None class CardDeleteRequest(BaseSchema): card_id: int class CardUpdateProductRequest(BaseSchema): card_id: int product: CardProductSchema class CardServicesCopyRequest(BaseSchema): card_id: int source_product_id: int destination_product_ids: List[int] class CardProductAddKitRequest(BaseSchema): card_id: int product_id: int kit_id: int class CardAddKitRequest(BaseSchema): card_id: int kit_id: int class CardCreateGuestUrlRequest(BaseSchema): card_id: int class CardCompleteRequest(BaseSchema): card_id: int class CardPrefillRequest(BaseSchema): old_card_id: int new_card_id: int class CardRecalculatePriceRequest(BaseSchema): card_id: int class ManageEmployeeRequest(BaseSchema): card_id: int user_id: int is_assign: bool class CreateCardsFromExcelRequest(BaseSchema): client_id: int status_id: int products: list[ProductFromExcelSchema] # endregion Requests # region Responses class CardUpdateProductQuantityResponse(OkMessageSchema): pass class CardDeleteServicesResponse(OkMessageSchema): pass class CardGetAllResponse(BaseSchema): cards: List[CardSchema] class CardChangeStatusResponse(BaseSchema): ok: bool class CardCreateResponse(BaseSchema): ok: bool class CardQuickCreateResponse(BaseSchema): card_id: int class CardSummaryResponse(BaseSchema): summaries: List[CardSummary] class CardAddServicesResponse(BaseSchema): ok: bool message: str class CardUpdateServiceQuantityResponse(BaseSchema): ok: bool message: str class CardUpdateServiceResponse(OkMessageSchema): pass class CardAddServiceResponse(OkMessageSchema): pass class CardDeleteServiceResponse(OkMessageSchema): pass class CardDeleteProductResponse(OkMessageSchema): pass class CardDeleteProductsResponse(OkMessageSchema): pass class CardAddProductResponse(OkMessageSchema): pass class CardUpdateGeneralInfoResponse(OkMessageSchema): pass class CardSummaryReorderResponse(OkMessageSchema): pass class CardDeleteResponse(OkMessageSchema): pass class CardUpdateProductResponse(OkMessageSchema): pass class CardServicesCopyResponse(OkMessageSchema): pass class CardProductAddKitResponse(OkMessageSchema): pass class CardAddKitResponse(OkMessageSchema): pass class CardCreateGuestUrlResponse(OkMessageSchema): url: str class CardCompleteResponse(OkMessageSchema): pass class CardPrefillResponse(OkMessageSchema): pass class CardRecalculatePriceResponse(OkMessageSchema): pass class ManageEmployeeResponse(OkMessageSchema): pass class GetAvailableEmployeesToAssignResponse(BaseSchema): employees: list[UserSchema] class ParseCardsExcelResponse(BaseSchema): rows: list[ParsedProductRowSchema] errors: list[str] class CreateCardsFromExcelResponse(OkMessageSchema): pass # endregion Responses