import datetime from typing import List, Optional, Union from pydantic import constr, field_validator from schemas.base import BaseSchema, OkMessageSchema from schemas.billing import DealBillRequestSchema from schemas.client import ClientSchema from schemas.marketplace import BaseMarketplaceSchema from schemas.product import ProductSchema from schemas.service import ServiceSchema from schemas.shipping_warehouse import ShippingWarehouseSchema 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 changed_at: datetime.datetime created_at: datetime.datetime deadline: datetime.datetime status: int total_price: int rank: int base_marketplace: Optional[BaseMarketplaceSchema] = None shipment_warehouse_id: Optional[int] shipment_warehouse_name: Optional[str] class DealServiceSchema(BaseSchema): service: ServiceSchema quantity: int price: int employees: List[UserSchema] class DealProductServiceSchema(BaseSchema): service: ServiceSchema price: int employees: List[UserSchema] class DealProductSchema(BaseSchema): product: ProductSchema services: List[DealProductServiceSchema] quantity: int class DealStatusHistorySchema(BaseSchema): user: UserSchema changed_at: datetime.datetime from_status: int to_status: int next_status_deadline: datetime.datetime | None comment: str | None = None class DealSchema(BaseSchema): id: int name: str client_id: int created_at: datetime.datetime current_status: int services: List[DealServiceSchema] products: List[DealProductSchema] status_history: List[DealStatusHistorySchema] is_deleted: bool is_completed: bool is_locked: bool client: ClientSchema comment: str shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None bill_request: Optional[DealBillRequestSchema] = None class DealGeneralInfoSchema(BaseSchema): name: str is_deleted: bool is_completed: bool comment: str shipping_warehouse: Optional[str] = None # endregion Entities # region Requests class DealChangeStatusRequest(BaseSchema): deal_id: int new_status: int class DealCreateRequest(BaseSchema): name: str 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 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: 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 # 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 # endregion Responses