import datetime from typing import List, Optional, Union from pydantic import constr from schemas.base import BaseSchema, OkMessageSchema from schemas.billing import DealBillRequestSchema from schemas.board import BoardSchema from schemas.client import ClientSchema from schemas.group import DealGroupSchema 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, DealStatusHistorySchema from schemas.user import UserSchema # region Entities class FastDeal(BaseSchema): name: str client: ClientSchema comment: str acceptance_date: datetime.datetime class DealSummary(BaseSchema): id: int name: str client_name: str created_at: datetime.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] delivery_date: Optional[datetime.datetime] = None receiving_slot_date: Optional[datetime.datetime] = None bill_request: Optional[DealBillRequestSchema] = None group: Optional[DealGroupSchema] = None class DealServiceSchema(BaseSchema): service: ServiceSchema quantity: int price: int employees: List[UserSchema] is_fixed_price: bool class DealProductServiceSchema(BaseSchema): service: ServiceSchema price: int employees: List[UserSchema] is_fixed_price: bool class DealProductSchema(BaseSchema): product: ProductSchema services: List[DealProductServiceSchema] quantity: int comment: str = "" class DealEmployeesSchema(BaseSchema): user: UserSchema created_at: datetime.datetime class DealSchema(BaseSchema): id: int name: str client_id: int created_at: datetime.datetime status: StatusSchema board: BoardSchema services: List[DealServiceSchema] products: List[DealProductSchema] status_history: List[DealStatusHistorySchema] is_deleted: bool is_completed: bool is_locked: bool is_accounted: bool client: ClientSchema comment: str shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None bill_request: Optional[DealBillRequestSchema] = None group: Optional[DealGroupSchema] = None manager: Optional[UserSchema] = None pallets: List[PalletSchema] = [] boxes: List[BoxSchema] = [] employees: List[DealEmployeesSchema] = [] delivery_date: Optional[datetime.datetime] = None receiving_slot_date: Optional[datetime.datetime] = None class DealGeneralInfoSchema(BaseSchema): name: str is_deleted: bool is_completed: bool is_accounted: bool comment: str shipping_warehouse: Optional[str] = None delivery_date: Optional[datetime.datetime] = None receiving_slot_date: Optional[datetime.datetime] = None manager: Optional[UserSchema] = None board: BoardSchema status: StatusSchema 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 DealChangeStatusRequest(BaseSchema): deal_id: int new_status: int class DealCreateRequest(BaseSchema): name: str status_id: int class DealQuickCreateRequest(BaseSchema): name: constr(strip_whitespace=True) client_name: constr(strip_whitespace=True) comment: str acceptance_date: datetime.datetime shipping_warehouse: constr(strip_whitespace=True) base_marketplace: BaseMarketplaceSchema status_id: int class DealSummaryRequest(BaseSchema): pass class DealAddServicesRequest(BaseSchema): deal_id: int services: list[DealServiceSchema] class DealUpdateServiceQuantityRequest(BaseSchema): deal_id: int service_id: int quantity: int class DealUpdateServiceRequest(BaseSchema): deal_id: int service: DealServiceSchema class DealAddServiceRequest(BaseSchema): deal_id: int service_id: int quantity: int price: int class DealDeleteServiceRequest(BaseSchema): deal_id: int service_id: int class DealDeleteServicesRequest(BaseSchema): deal_id: int service_ids: List[int] class DealUpdateProductQuantityRequest(BaseSchema): deal_id: int product_id: int quantity: int class DealAddProductRequest(BaseSchema): deal_id: int product: DealProductSchema class DealDeleteProductRequest(BaseSchema): deal_id: int product_id: int class DealDeleteProductsRequest(BaseSchema): deal_id: int product_ids: List[int] class DealUpdateGeneralInfoRequest(BaseSchema): deal_id: int data: DealGeneralInfoSchema class DealSummaryReorderRequest(BaseSchema): deal_id: int status_id: int index: int deadline: datetime.datetime | None = None comment: str | None = None class DealDeleteRequest(BaseSchema): deal_id: int class DealUpdateProductRequest(BaseSchema): deal_id: int product: DealProductSchema class DealServicesCopyRequest(BaseSchema): deal_id: int source_product_id: int destination_product_ids: List[int] class DealProductAddKitRequest(BaseSchema): deal_id: int product_id: int kit_id: int class DealAddKitRequest(BaseSchema): deal_id: int kit_id: int class DealCreateGuestUrlRequest(BaseSchema): deal_id: int class DealCompleteRequest(BaseSchema): deal_id: int class DealPrefillRequest(BaseSchema): old_deal_id: int new_deal_id: int class DealRecalculatePriceRequest(BaseSchema): deal_id: int class ManageEmployeeRequest(BaseSchema): deal_id: int user_id: int is_assign: bool class CreateDealsFromExcelRequest(BaseSchema): client_id: int status_id: int products: list[ProductFromExcelSchema] # endregion Requests # region Responses class DealUpdateProductQuantityResponse(OkMessageSchema): pass class DealDeleteServicesResponse(OkMessageSchema): pass class DealGetAllResponse(BaseSchema): deals: List[DealSchema] class DealChangeStatusResponse(BaseSchema): ok: bool class DealCreateResponse(BaseSchema): ok: bool class DealQuickCreateResponse(BaseSchema): deal_id: int class DealSummaryResponse(BaseSchema): summaries: List[DealSummary] class DealAddServicesResponse(BaseSchema): ok: bool message: str class DealUpdateServiceQuantityResponse(BaseSchema): ok: bool message: str class DealUpdateServiceResponse(OkMessageSchema): pass class DealAddServiceResponse(OkMessageSchema): pass class DealDeleteServiceResponse(OkMessageSchema): pass class DealDeleteProductResponse(OkMessageSchema): pass class DealDeleteProductsResponse(OkMessageSchema): pass class DealAddProductResponse(OkMessageSchema): pass class DealUpdateGeneralInfoResponse(OkMessageSchema): pass class DealSummaryReorderResponse(OkMessageSchema): pass class DealDeleteResponse(OkMessageSchema): pass class DealUpdateProductResponse(OkMessageSchema): pass class DealServicesCopyResponse(OkMessageSchema): pass class DealProductAddKitResponse(OkMessageSchema): pass class DealAddKitResponse(OkMessageSchema): pass class DealCreateGuestUrlResponse(OkMessageSchema): url: str class DealCompleteResponse(OkMessageSchema): pass class DealPrefillResponse(OkMessageSchema): pass class DealRecalculatePriceResponse(OkMessageSchema): pass class ManageEmployeeResponse(OkMessageSchema): pass class GetAvailableEmployeesToAssignResponse(BaseSchema): employees: list[UserSchema] class ParseDealsExcelResponse(BaseSchema): rows: list[ParsedProductRowSchema] errors: list[str] class CreateDealsFromExcelResponse(OkMessageSchema): pass # endregion Responses