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, PaginationInfoSchema from schemas.billing import CardBillRequestSchema from schemas.board import BoardSchema from schemas.card_tag import CardTagSchema from schemas.chat import ChatSchema 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: Optional[str] created_at: datetime status: StatusSchema board: BoardSchema total_price: int rank: int base_marketplace: Optional[BaseMarketplaceSchema] = None total_products: int tags: list[CardTagSchema] attributes: list[CardAttributeSchema] shipment_warehouse_id: Optional[int] shipment_warehouse_name: Optional[str] bill_requests: list[CardBillRequestSchema] 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_services_profit_accounted: bool is_locked: bool services: List[CardServiceSchema] products: List[CardProductSchema] client_id: Optional[int] client: Optional[ClientSchema] shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None bill_requests: list[CardBillRequestSchema] = [] group: Optional[CardGroupSchema] = None manager: Optional[UserSchema] = None pallets: List[PalletSchema] = [] boxes: List[BoxSchema] = [] employees: List[CardEmployeesSchema] = [] tags: List[CardTagSchema] = [] class CardSchema(BaseCardSchema): attributes: list[CardAttributeSchema] chat: Optional[ChatSchema] class CardGeneralInfoSchema(BaseSchemaWithAttributes): name: str is_deleted: bool is_completed: bool comment: str manager: Optional[UserSchema] = None board_id: int status_id: int client_id: Optional[int] tags: List[str] class ProductsAndServicesGeneralInfoSchema(BaseSchema): shipping_warehouse: Optional[str] = None is_services_profit_accounted: bool 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 GetCardSummariesRequest(BaseSchema): full: bool card_id: Optional[int | str] = None card_name: Optional[str] = None marketplace_key: Optional[str] = None shipping_warehouse_id: Optional[int] = None client_id: Optional[int] = None project_id: Optional[int] = None board_id: Optional[int] = None status_id: Optional[int] = None class CardCreateRequest(BaseSchema): name: str status_id: int class CardQuickCreateRequest(BaseSchema): name: constr(strip_whitespace=True) client_name: Optional[constr(strip_whitespace=True)] comment: str acceptance_date: datetime shipping_warehouse: Optional[constr(strip_whitespace=True)] base_marketplace: Optional[BaseMarketplaceSchema] status_id: int 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 ProductsAndServicesGeneralInfoRequest(BaseSchema): card_id: int data: ProductsAndServicesGeneralInfoSchema class UpdateCardManagerRequest(BaseSchema): card_id: int manager_id: Optional[int] class UpdateCardClientRequest(BaseSchema): card_id: int client_id: int 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] pagination_info: PaginationInfoSchema 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 ProductsAndServicesGeneralInfoResponse(OkMessageSchema): pass class UpdateCardManagerResponse(OkMessageSchema): pass class UpdateCardClientResponse(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