feat: pallets and boxes for deals
This commit is contained in:
		@@ -31,6 +31,7 @@ export type { BillStatusUpdateRequest } from './models/BillStatusUpdateRequest';
 | 
				
			|||||||
export type { Body_upload_passport_image } from './models/Body_upload_passport_image';
 | 
					export type { Body_upload_passport_image } from './models/Body_upload_passport_image';
 | 
				
			||||||
export type { Body_upload_product_barcode_image } from './models/Body_upload_product_barcode_image';
 | 
					export type { Body_upload_product_barcode_image } from './models/Body_upload_product_barcode_image';
 | 
				
			||||||
export type { Body_upload_product_image } from './models/Body_upload_product_image';
 | 
					export type { Body_upload_product_image } from './models/Body_upload_product_image';
 | 
				
			||||||
 | 
					export type { BoxSchema } from './models/BoxSchema';
 | 
				
			||||||
export type { CancelDealBillRequest } from './models/CancelDealBillRequest';
 | 
					export type { CancelDealBillRequest } from './models/CancelDealBillRequest';
 | 
				
			||||||
export type { CancelDealBillResponse } from './models/CancelDealBillResponse';
 | 
					export type { CancelDealBillResponse } from './models/CancelDealBillResponse';
 | 
				
			||||||
export type { ClientCreateRequest } from './models/ClientCreateRequest';
 | 
					export type { ClientCreateRequest } from './models/ClientCreateRequest';
 | 
				
			||||||
@@ -45,11 +46,14 @@ export type { ClientUpdateRequest } from './models/ClientUpdateRequest';
 | 
				
			|||||||
export type { ClientUpdateResponse } from './models/ClientUpdateResponse';
 | 
					export type { ClientUpdateResponse } from './models/ClientUpdateResponse';
 | 
				
			||||||
export type { CreateBarcodeTemplateAttributeRequest } from './models/CreateBarcodeTemplateAttributeRequest';
 | 
					export type { CreateBarcodeTemplateAttributeRequest } from './models/CreateBarcodeTemplateAttributeRequest';
 | 
				
			||||||
export type { CreateBarcodeTemplateAttributeResponse } from './models/CreateBarcodeTemplateAttributeResponse';
 | 
					export type { CreateBarcodeTemplateAttributeResponse } from './models/CreateBarcodeTemplateAttributeResponse';
 | 
				
			||||||
 | 
					export type { CreateBoxInDealSchema } from './models/CreateBoxInDealSchema';
 | 
				
			||||||
 | 
					export type { CreateBoxInPalletSchema } from './models/CreateBoxInPalletSchema';
 | 
				
			||||||
export type { CreateDealBillRequest } from './models/CreateDealBillRequest';
 | 
					export type { CreateDealBillRequest } from './models/CreateDealBillRequest';
 | 
				
			||||||
export type { CreateDealBillResponse } from './models/CreateDealBillResponse';
 | 
					export type { CreateDealBillResponse } from './models/CreateDealBillResponse';
 | 
				
			||||||
export type { CreateExpenseTagRequest } from './models/CreateExpenseTagRequest';
 | 
					export type { CreateExpenseTagRequest } from './models/CreateExpenseTagRequest';
 | 
				
			||||||
export type { CreateMarketplaceRequest } from './models/CreateMarketplaceRequest';
 | 
					export type { CreateMarketplaceRequest } from './models/CreateMarketplaceRequest';
 | 
				
			||||||
export type { CreateMarketplaceResponse } from './models/CreateMarketplaceResponse';
 | 
					export type { CreateMarketplaceResponse } from './models/CreateMarketplaceResponse';
 | 
				
			||||||
 | 
					export type { CreatePalletResponse } from './models/CreatePalletResponse';
 | 
				
			||||||
export type { CreatePaymentRecordRequest } from './models/CreatePaymentRecordRequest';
 | 
					export type { CreatePaymentRecordRequest } from './models/CreatePaymentRecordRequest';
 | 
				
			||||||
export type { CreatePaymentRecordResponse } from './models/CreatePaymentRecordResponse';
 | 
					export type { CreatePaymentRecordResponse } from './models/CreatePaymentRecordResponse';
 | 
				
			||||||
export type { CreatePayRateRequest } from './models/CreatePayRateRequest';
 | 
					export type { CreatePayRateRequest } from './models/CreatePayRateRequest';
 | 
				
			||||||
@@ -61,6 +65,7 @@ export type { CreatePriceCategoryResponse } from './models/CreatePriceCategoryRe
 | 
				
			|||||||
export type { CreateServiceKitSchema } from './models/CreateServiceKitSchema';
 | 
					export type { CreateServiceKitSchema } from './models/CreateServiceKitSchema';
 | 
				
			||||||
export type { CreateServicesKitRequest } from './models/CreateServicesKitRequest';
 | 
					export type { CreateServicesKitRequest } from './models/CreateServicesKitRequest';
 | 
				
			||||||
export type { CreateServicesKitResponse } from './models/CreateServicesKitResponse';
 | 
					export type { CreateServicesKitResponse } from './models/CreateServicesKitResponse';
 | 
				
			||||||
 | 
					export type { CreateShippingProductSchema } from './models/CreateShippingProductSchema';
 | 
				
			||||||
export type { CreateShippingWarehouseRequest } from './models/CreateShippingWarehouseRequest';
 | 
					export type { CreateShippingWarehouseRequest } from './models/CreateShippingWarehouseRequest';
 | 
				
			||||||
export type { CreateShippingWarehouseResponse } from './models/CreateShippingWarehouseResponse';
 | 
					export type { CreateShippingWarehouseResponse } from './models/CreateShippingWarehouseResponse';
 | 
				
			||||||
export type { CreateTaskResponse } from './models/CreateTaskResponse';
 | 
					export type { CreateTaskResponse } from './models/CreateTaskResponse';
 | 
				
			||||||
@@ -133,10 +138,12 @@ export type { DealUpdateServiceQuantityRequest } from './models/DealUpdateServic
 | 
				
			|||||||
export type { DealUpdateServiceQuantityResponse } from './models/DealUpdateServiceQuantityResponse';
 | 
					export type { DealUpdateServiceQuantityResponse } from './models/DealUpdateServiceQuantityResponse';
 | 
				
			||||||
export type { DealUpdateServiceRequest } from './models/DealUpdateServiceRequest';
 | 
					export type { DealUpdateServiceRequest } from './models/DealUpdateServiceRequest';
 | 
				
			||||||
export type { DealUpdateServiceResponse } from './models/DealUpdateServiceResponse';
 | 
					export type { DealUpdateServiceResponse } from './models/DealUpdateServiceResponse';
 | 
				
			||||||
 | 
					export type { DeleteBoxResponse } from './models/DeleteBoxResponse';
 | 
				
			||||||
export type { DeleteExpenseResponse } from './models/DeleteExpenseResponse';
 | 
					export type { DeleteExpenseResponse } from './models/DeleteExpenseResponse';
 | 
				
			||||||
export type { DeleteExpenseTagResponse } from './models/DeleteExpenseTagResponse';
 | 
					export type { DeleteExpenseTagResponse } from './models/DeleteExpenseTagResponse';
 | 
				
			||||||
export type { DeleteMarketplaceRequest } from './models/DeleteMarketplaceRequest';
 | 
					export type { DeleteMarketplaceRequest } from './models/DeleteMarketplaceRequest';
 | 
				
			||||||
export type { DeleteMarketplaceResponse } from './models/DeleteMarketplaceResponse';
 | 
					export type { DeleteMarketplaceResponse } from './models/DeleteMarketplaceResponse';
 | 
				
			||||||
 | 
					export type { DeletePalletResponse } from './models/DeletePalletResponse';
 | 
				
			||||||
export type { DeletePaymentRecordRequest } from './models/DeletePaymentRecordRequest';
 | 
					export type { DeletePaymentRecordRequest } from './models/DeletePaymentRecordRequest';
 | 
				
			||||||
export type { DeletePaymentRecordResponse } from './models/DeletePaymentRecordResponse';
 | 
					export type { DeletePaymentRecordResponse } from './models/DeletePaymentRecordResponse';
 | 
				
			||||||
export type { DeletePayRateRequest } from './models/DeletePayRateRequest';
 | 
					export type { DeletePayRateRequest } from './models/DeletePayRateRequest';
 | 
				
			||||||
@@ -146,6 +153,7 @@ export type { DeletePositionResponse } from './models/DeletePositionResponse';
 | 
				
			|||||||
export type { DeletePriceCategoryRequest } from './models/DeletePriceCategoryRequest';
 | 
					export type { DeletePriceCategoryRequest } from './models/DeletePriceCategoryRequest';
 | 
				
			||||||
export type { DeletePriceCategoryResponse } from './models/DeletePriceCategoryResponse';
 | 
					export type { DeletePriceCategoryResponse } from './models/DeletePriceCategoryResponse';
 | 
				
			||||||
export type { DeleteShiftResponse } from './models/DeleteShiftResponse';
 | 
					export type { DeleteShiftResponse } from './models/DeleteShiftResponse';
 | 
				
			||||||
 | 
					export type { DeleteShippingProductResponse } from './models/DeleteShippingProductResponse';
 | 
				
			||||||
export type { DeleteShippingWarehouseRequest } from './models/DeleteShippingWarehouseRequest';
 | 
					export type { DeleteShippingWarehouseRequest } from './models/DeleteShippingWarehouseRequest';
 | 
				
			||||||
export type { DeleteShippingWarehouseResponse } from './models/DeleteShippingWarehouseResponse';
 | 
					export type { DeleteShippingWarehouseResponse } from './models/DeleteShippingWarehouseResponse';
 | 
				
			||||||
export type { ExpenseSchemaBase } from './models/ExpenseSchemaBase';
 | 
					export type { ExpenseSchemaBase } from './models/ExpenseSchemaBase';
 | 
				
			||||||
@@ -195,6 +203,7 @@ export type { MarketplaceCreateSchema } from './models/MarketplaceCreateSchema';
 | 
				
			|||||||
export type { MarketplaceSchema } from './models/MarketplaceSchema';
 | 
					export type { MarketplaceSchema } from './models/MarketplaceSchema';
 | 
				
			||||||
export type { NotificationChannel } from './models/NotificationChannel';
 | 
					export type { NotificationChannel } from './models/NotificationChannel';
 | 
				
			||||||
export type { PaginationInfoSchema } from './models/PaginationInfoSchema';
 | 
					export type { PaginationInfoSchema } from './models/PaginationInfoSchema';
 | 
				
			||||||
 | 
					export type { PalletSchema } from './models/PalletSchema';
 | 
				
			||||||
export type { PassportImageSchema } from './models/PassportImageSchema';
 | 
					export type { PassportImageSchema } from './models/PassportImageSchema';
 | 
				
			||||||
export type { PaymentRecordCreateSchema } from './models/PaymentRecordCreateSchema';
 | 
					export type { PaymentRecordCreateSchema } from './models/PaymentRecordCreateSchema';
 | 
				
			||||||
export type { PaymentRecordGetSchema } from './models/PaymentRecordGetSchema';
 | 
					export type { PaymentRecordGetSchema } from './models/PaymentRecordGetSchema';
 | 
				
			||||||
@@ -248,6 +257,7 @@ export type { ServiceUpdateCategoryRequest } from './models/ServiceUpdateCategor
 | 
				
			|||||||
export type { ServiceUpdateCategoryResponse } from './models/ServiceUpdateCategoryResponse';
 | 
					export type { ServiceUpdateCategoryResponse } from './models/ServiceUpdateCategoryResponse';
 | 
				
			||||||
export type { ServiceUpdateRequest } from './models/ServiceUpdateRequest';
 | 
					export type { ServiceUpdateRequest } from './models/ServiceUpdateRequest';
 | 
				
			||||||
export type { ServiceUpdateResponse } from './models/ServiceUpdateResponse';
 | 
					export type { ServiceUpdateResponse } from './models/ServiceUpdateResponse';
 | 
				
			||||||
 | 
					export type { ShippingProductSchema } from './models/ShippingProductSchema';
 | 
				
			||||||
export type { ShippingWarehouseSchema } from './models/ShippingWarehouseSchema';
 | 
					export type { ShippingWarehouseSchema } from './models/ShippingWarehouseSchema';
 | 
				
			||||||
export type { StartPauseByShiftIdResponse } from './models/StartPauseByShiftIdResponse';
 | 
					export type { StartPauseByShiftIdResponse } from './models/StartPauseByShiftIdResponse';
 | 
				
			||||||
export type { StartPauseByUserIdResponse } from './models/StartPauseByUserIdResponse';
 | 
					export type { StartPauseByUserIdResponse } from './models/StartPauseByUserIdResponse';
 | 
				
			||||||
@@ -256,6 +266,9 @@ export type { SynchronizeMarketplaceRequest } from './models/SynchronizeMarketpl
 | 
				
			|||||||
export type { TaskInfoResponse } from './models/TaskInfoResponse';
 | 
					export type { TaskInfoResponse } from './models/TaskInfoResponse';
 | 
				
			||||||
export type { TimeTrackingData } from './models/TimeTrackingData';
 | 
					export type { TimeTrackingData } from './models/TimeTrackingData';
 | 
				
			||||||
export type { TimeTrackingRecord } from './models/TimeTrackingRecord';
 | 
					export type { TimeTrackingRecord } from './models/TimeTrackingRecord';
 | 
				
			||||||
 | 
					export type { UpdateBoxRequest } from './models/UpdateBoxRequest';
 | 
				
			||||||
 | 
					export type { UpdateBoxResponse } from './models/UpdateBoxResponse';
 | 
				
			||||||
 | 
					export type { UpdateBoxSchema } from './models/UpdateBoxSchema';
 | 
				
			||||||
export type { UpdateExpenseRequest } from './models/UpdateExpenseRequest';
 | 
					export type { UpdateExpenseRequest } from './models/UpdateExpenseRequest';
 | 
				
			||||||
export type { UpdateExpenseResponse } from './models/UpdateExpenseResponse';
 | 
					export type { UpdateExpenseResponse } from './models/UpdateExpenseResponse';
 | 
				
			||||||
export type { UpdateExpenseSchema } from './models/UpdateExpenseSchema';
 | 
					export type { UpdateExpenseSchema } from './models/UpdateExpenseSchema';
 | 
				
			||||||
@@ -270,6 +283,9 @@ export type { UpdatePriceCategoryResponse } from './models/UpdatePriceCategoryRe
 | 
				
			|||||||
export type { UpdateServiceKitSchema } from './models/UpdateServiceKitSchema';
 | 
					export type { UpdateServiceKitSchema } from './models/UpdateServiceKitSchema';
 | 
				
			||||||
export type { UpdateServicesKitRequest } from './models/UpdateServicesKitRequest';
 | 
					export type { UpdateServicesKitRequest } from './models/UpdateServicesKitRequest';
 | 
				
			||||||
export type { UpdateServicesKitResponse } from './models/UpdateServicesKitResponse';
 | 
					export type { UpdateServicesKitResponse } from './models/UpdateServicesKitResponse';
 | 
				
			||||||
 | 
					export type { UpdateShippingProductRequest } from './models/UpdateShippingProductRequest';
 | 
				
			||||||
 | 
					export type { UpdateShippingProductResponse } from './models/UpdateShippingProductResponse';
 | 
				
			||||||
 | 
					export type { UpdateShippingProductSchema } from './models/UpdateShippingProductSchema';
 | 
				
			||||||
export type { UpdateShippingWarehouseRequest } from './models/UpdateShippingWarehouseRequest';
 | 
					export type { UpdateShippingWarehouseRequest } from './models/UpdateShippingWarehouseRequest';
 | 
				
			||||||
export type { UpdateShippingWarehouseResponse } from './models/UpdateShippingWarehouseResponse';
 | 
					export type { UpdateShippingWarehouseResponse } from './models/UpdateShippingWarehouseResponse';
 | 
				
			||||||
export type { UpdateTimeTrackingRecordRequest } from './models/UpdateTimeTrackingRecordRequest';
 | 
					export type { UpdateTimeTrackingRecordRequest } from './models/UpdateTimeTrackingRecordRequest';
 | 
				
			||||||
@@ -296,6 +312,7 @@ export { PositionService } from './services/PositionService';
 | 
				
			|||||||
export { ProductService } from './services/ProductService';
 | 
					export { ProductService } from './services/ProductService';
 | 
				
			||||||
export { RoleService } from './services/RoleService';
 | 
					export { RoleService } from './services/RoleService';
 | 
				
			||||||
export { ServiceService } from './services/ServiceService';
 | 
					export { ServiceService } from './services/ServiceService';
 | 
				
			||||||
 | 
					export { ShippingService } from './services/ShippingService';
 | 
				
			||||||
export { ShippingWarehouseService } from './services/ShippingWarehouseService';
 | 
					export { ShippingWarehouseService } from './services/ShippingWarehouseService';
 | 
				
			||||||
export { StatisticsService } from './services/StatisticsService';
 | 
					export { StatisticsService } from './services/StatisticsService';
 | 
				
			||||||
export { TaskService } from './services/TaskService';
 | 
					export { TaskService } from './services/TaskService';
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/client/models/BoxSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/client/models/BoxSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { ProductSchema } from './ProductSchema';
 | 
				
			||||||
 | 
					export type BoxSchema = {
 | 
				
			||||||
 | 
					    id: number;
 | 
				
			||||||
 | 
					    quantity: number;
 | 
				
			||||||
 | 
					    product: ProductSchema;
 | 
				
			||||||
 | 
					    palletId: (number | null);
 | 
				
			||||||
 | 
					    dealId: (number | null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/CreateBoxInDealSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/CreateBoxInDealSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type CreateBoxInDealSchema = {
 | 
				
			||||||
 | 
					    productId: (number | null);
 | 
				
			||||||
 | 
					    quantity: (number | null);
 | 
				
			||||||
 | 
					    dealId: (number | null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/CreateBoxInPalletSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/CreateBoxInPalletSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type CreateBoxInPalletSchema = {
 | 
				
			||||||
 | 
					    productId: (number | null);
 | 
				
			||||||
 | 
					    quantity: (number | null);
 | 
				
			||||||
 | 
					    palletId: (number | null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/client/models/CreatePalletResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/CreatePalletResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type CreatePalletResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/CreateShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/CreateShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type CreateShippingProductSchema = {
 | 
				
			||||||
 | 
					    productId: (number | null);
 | 
				
			||||||
 | 
					    quantity: (number | null);
 | 
				
			||||||
 | 
					    palletId: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,12 +2,14 @@
 | 
				
			|||||||
/* istanbul ignore file */
 | 
					/* istanbul ignore file */
 | 
				
			||||||
/* tslint:disable */
 | 
					/* tslint:disable */
 | 
				
			||||||
/* eslint-disable */
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { BoxSchema } from './BoxSchema';
 | 
				
			||||||
import type { ClientSchema } from './ClientSchema';
 | 
					import type { ClientSchema } from './ClientSchema';
 | 
				
			||||||
import type { DealBillRequestSchema } from './DealBillRequestSchema';
 | 
					import type { DealBillRequestSchema } from './DealBillRequestSchema';
 | 
				
			||||||
import type { DealGroupSchema } from './DealGroupSchema';
 | 
					import type { DealGroupSchema } from './DealGroupSchema';
 | 
				
			||||||
import type { DealProductSchema } from './DealProductSchema';
 | 
					import type { DealProductSchema } from './DealProductSchema';
 | 
				
			||||||
import type { DealServiceSchema } from './DealServiceSchema';
 | 
					import type { DealServiceSchema } from './DealServiceSchema';
 | 
				
			||||||
import type { DealStatusHistorySchema } from './DealStatusHistorySchema';
 | 
					import type { DealStatusHistorySchema } from './DealStatusHistorySchema';
 | 
				
			||||||
 | 
					import type { PalletSchema } from './PalletSchema';
 | 
				
			||||||
import type { ServicePriceCategorySchema } from './ServicePriceCategorySchema';
 | 
					import type { ServicePriceCategorySchema } from './ServicePriceCategorySchema';
 | 
				
			||||||
import type { ShippingWarehouseSchema } from './ShippingWarehouseSchema';
 | 
					import type { ShippingWarehouseSchema } from './ShippingWarehouseSchema';
 | 
				
			||||||
import type { UserSchema } from './UserSchema';
 | 
					import type { UserSchema } from './UserSchema';
 | 
				
			||||||
@@ -30,6 +32,8 @@ export type DealSchema = {
 | 
				
			|||||||
    category?: (ServicePriceCategorySchema | null);
 | 
					    category?: (ServicePriceCategorySchema | null);
 | 
				
			||||||
    group?: (DealGroupSchema | null);
 | 
					    group?: (DealGroupSchema | null);
 | 
				
			||||||
    manager?: (UserSchema | null);
 | 
					    manager?: (UserSchema | null);
 | 
				
			||||||
 | 
					    pallets?: Array<PalletSchema>;
 | 
				
			||||||
 | 
					    boxes?: Array<BoxSchema>;
 | 
				
			||||||
    deliveryDate?: (string | null);
 | 
					    deliveryDate?: (string | null);
 | 
				
			||||||
    receivingSlotDate?: (string | null);
 | 
					    receivingSlotDate?: (string | null);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								src/client/models/DeleteBoxResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/DeleteBoxResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type DeleteBoxResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/client/models/DeletePalletResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/DeletePalletResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type DeletePalletResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/client/models/DeleteShippingProductResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/DeleteShippingProductResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type DeleteShippingProductResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/client/models/PalletSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/client/models/PalletSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { BoxSchema } from './BoxSchema';
 | 
				
			||||||
 | 
					import type { ShippingProductSchema } from './ShippingProductSchema';
 | 
				
			||||||
 | 
					export type PalletSchema = {
 | 
				
			||||||
 | 
					    id: number;
 | 
				
			||||||
 | 
					    boxes: Array<BoxSchema>;
 | 
				
			||||||
 | 
					    shippingProducts: Array<ShippingProductSchema>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/client/models/ShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/client/models/ShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { ProductSchema } from './ProductSchema';
 | 
				
			||||||
 | 
					export type ShippingProductSchema = {
 | 
				
			||||||
 | 
					    id: number;
 | 
				
			||||||
 | 
					    quantity: number;
 | 
				
			||||||
 | 
					    product: ProductSchema;
 | 
				
			||||||
 | 
					    palletId: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/client/models/UpdateBoxRequest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/client/models/UpdateBoxRequest.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { CreateBoxInDealSchema } from './CreateBoxInDealSchema';
 | 
				
			||||||
 | 
					import type { CreateBoxInPalletSchema } from './CreateBoxInPalletSchema';
 | 
				
			||||||
 | 
					import type { UpdateBoxSchema } from './UpdateBoxSchema';
 | 
				
			||||||
 | 
					export type UpdateBoxRequest = {
 | 
				
			||||||
 | 
					    data: (CreateBoxInDealSchema | CreateBoxInPalletSchema | UpdateBoxSchema);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/client/models/UpdateBoxResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/UpdateBoxResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type UpdateBoxResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/UpdateBoxSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/UpdateBoxSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type UpdateBoxSchema = {
 | 
				
			||||||
 | 
					    productId: (number | null);
 | 
				
			||||||
 | 
					    quantity: (number | null);
 | 
				
			||||||
 | 
					    boxId: (number | null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/UpdateShippingProductRequest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/UpdateShippingProductRequest.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { CreateShippingProductSchema } from './CreateShippingProductSchema';
 | 
				
			||||||
 | 
					import type { UpdateShippingProductSchema } from './UpdateShippingProductSchema';
 | 
				
			||||||
 | 
					export type UpdateShippingProductRequest = {
 | 
				
			||||||
 | 
					    data: (CreateShippingProductSchema | UpdateShippingProductSchema);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/client/models/UpdateShippingProductResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/client/models/UpdateShippingProductResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type UpdateShippingProductResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/UpdateShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/UpdateShippingProductSchema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type UpdateShippingProductSchema = {
 | 
				
			||||||
 | 
					    productId: (number | null);
 | 
				
			||||||
 | 
					    quantity: (number | null);
 | 
				
			||||||
 | 
					    shippingProductId: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										183
									
								
								src/client/services/ShippingService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								src/client/services/ShippingService.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,183 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do not edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { CreatePalletResponse } from '../models/CreatePalletResponse';
 | 
				
			||||||
 | 
					import type { DeleteBoxResponse } from '../models/DeleteBoxResponse';
 | 
				
			||||||
 | 
					import type { DeletePalletResponse } from '../models/DeletePalletResponse';
 | 
				
			||||||
 | 
					import type { DeleteShippingProductResponse } from '../models/DeleteShippingProductResponse';
 | 
				
			||||||
 | 
					import type { UpdateBoxRequest } from '../models/UpdateBoxRequest';
 | 
				
			||||||
 | 
					import type { UpdateBoxResponse } from '../models/UpdateBoxResponse';
 | 
				
			||||||
 | 
					import type { UpdateShippingProductRequest } from '../models/UpdateShippingProductRequest';
 | 
				
			||||||
 | 
					import type { UpdateShippingProductResponse } from '../models/UpdateShippingProductResponse';
 | 
				
			||||||
 | 
					import type { CancelablePromise } from '../core/CancelablePromise';
 | 
				
			||||||
 | 
					import { OpenAPI } from '../core/OpenAPI';
 | 
				
			||||||
 | 
					import { request as __request } from '../core/request';
 | 
				
			||||||
 | 
					export class ShippingService {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Create Pallet
 | 
				
			||||||
 | 
					     * @returns CreatePalletResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static createPallet({
 | 
				
			||||||
 | 
					        dealId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        dealId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<CreatePalletResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'POST',
 | 
				
			||||||
 | 
					            url: '/shipping/pallet/{deal_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'deal_id': dealId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Delete Pallet
 | 
				
			||||||
 | 
					     * @returns DeletePalletResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static deletePallet({
 | 
				
			||||||
 | 
					        palletId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        palletId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<DeletePalletResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'DELETE',
 | 
				
			||||||
 | 
					            url: '/shipping/pallet/{pallet_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'pallet_id': palletId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Update Shipping Product
 | 
				
			||||||
 | 
					     * @returns UpdateShippingProductResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static updateShippingProduct({
 | 
				
			||||||
 | 
					        requestBody,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        requestBody: UpdateShippingProductRequest,
 | 
				
			||||||
 | 
					    }): CancelablePromise<UpdateShippingProductResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'POST',
 | 
				
			||||||
 | 
					            url: '/shipping/product',
 | 
				
			||||||
 | 
					            body: requestBody,
 | 
				
			||||||
 | 
					            mediaType: 'application/json',
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Delete Shipping Product
 | 
				
			||||||
 | 
					     * @returns DeleteShippingProductResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static deleteShippingProduct({
 | 
				
			||||||
 | 
					        shippingProductId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        shippingProductId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<DeleteShippingProductResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'DELETE',
 | 
				
			||||||
 | 
					            url: '/shipping/product/{shipping_product_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'shipping_product_id': shippingProductId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Update Box
 | 
				
			||||||
 | 
					     * @returns UpdateBoxResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static updateBox({
 | 
				
			||||||
 | 
					        requestBody,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        requestBody: UpdateBoxRequest,
 | 
				
			||||||
 | 
					    }): CancelablePromise<UpdateBoxResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'POST',
 | 
				
			||||||
 | 
					            url: '/shipping/box',
 | 
				
			||||||
 | 
					            body: requestBody,
 | 
				
			||||||
 | 
					            mediaType: 'application/json',
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Delete Box
 | 
				
			||||||
 | 
					     * @returns DeleteBoxResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static deleteBox({
 | 
				
			||||||
 | 
					        boxId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        boxId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<DeleteBoxResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'DELETE',
 | 
				
			||||||
 | 
					            url: '/shipping/box/{box_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'box_id': boxId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate Deal Qr Code
 | 
				
			||||||
 | 
					     * @returns any Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static getDealQrCodePdf({
 | 
				
			||||||
 | 
					        dealId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        dealId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<any> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'GET',
 | 
				
			||||||
 | 
					            url: '/shipping/pdf/deal/{deal_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'deal_id': dealId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate Deal Qr Code
 | 
				
			||||||
 | 
					     * @returns any Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static getPalletsPdf({
 | 
				
			||||||
 | 
					        dealId,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        dealId: number,
 | 
				
			||||||
 | 
					    }): CancelablePromise<any> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'GET',
 | 
				
			||||||
 | 
					            url: '/shipping/pdf/pallets/{deal_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'deal_id': dealId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -24,6 +24,7 @@ import ServicePriceCategoryForm from "../pages/ServicesPage/modals/ServicePriceC
 | 
				
			|||||||
import ScanningModal from "./ScanningModal/ScanningModal.tsx";
 | 
					import ScanningModal from "./ScanningModal/ScanningModal.tsx";
 | 
				
			||||||
import ExpenseFormModal from "../pages/AdminPage/tabs/Expenses/modals/ExpenseFormModal.tsx";
 | 
					import ExpenseFormModal from "../pages/AdminPage/tabs/Expenses/modals/ExpenseFormModal.tsx";
 | 
				
			||||||
import ExpenseTagsModal from "../pages/AdminPage/tabs/Expenses/modals/ExpenseTagsModal.tsx";
 | 
					import ExpenseTagsModal from "../pages/AdminPage/tabs/Expenses/modals/ExpenseTagsModal.tsx";
 | 
				
			||||||
 | 
					import ShippingProductModal from "../pages/LeadsPage/tabs/ShippingTab/modals/ShippingProductModal.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const modals = {
 | 
					export const modals = {
 | 
				
			||||||
    enterDeadline: EnterDeadlineModal,
 | 
					    enterDeadline: EnterDeadlineModal,
 | 
				
			||||||
@@ -52,4 +53,5 @@ export const modals = {
 | 
				
			|||||||
    scanningModal: ScanningModal,
 | 
					    scanningModal: ScanningModal,
 | 
				
			||||||
    expenseFormModal: ExpenseFormModal,
 | 
					    expenseFormModal: ExpenseFormModal,
 | 
				
			||||||
    expenseTagsModal: ExpenseTagsModal,
 | 
					    expenseTagsModal: ExpenseTagsModal,
 | 
				
			||||||
 | 
					    shippingProductModal: ShippingProductModal,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,14 @@
 | 
				
			|||||||
import { Box, Drawer, rem, Tabs } from "@mantine/core";
 | 
					import { Box, Drawer, rem, Tabs } from "@mantine/core";
 | 
				
			||||||
import { FC, useEffect } from "react";
 | 
					import { FC, useEffect } from "react";
 | 
				
			||||||
import { useDealPageContext } from "../../contexts/DealPageContext.tsx";
 | 
					import { useDealPageContext } from "../../contexts/DealPageContext.tsx";
 | 
				
			||||||
import { IconBox, IconCalendarUser, IconSettings, IconUser } from "@tabler/icons-react";
 | 
					import { IconBox, IconCalendarUser, IconCubeSend, IconSettings, IconUser } from "@tabler/icons-react";
 | 
				
			||||||
import DealStatusChangeTable from "../../components/DealStatusChangeTable/DealStatusChangeTable.tsx";
 | 
					import DealStatusChangeTable from "../../components/DealStatusChangeTable/DealStatusChangeTable.tsx";
 | 
				
			||||||
import DealEditDrawerGeneralTab from "./tabs/DealEditDrawerGeneralTab.tsx";
 | 
					import DealEditDrawerGeneralTab from "./tabs/DealEditDrawerGeneralTab.tsx";
 | 
				
			||||||
import { useQueryClient } from "@tanstack/react-query";
 | 
					import { useQueryClient } from "@tanstack/react-query";
 | 
				
			||||||
import ProductAndServiceTab from "../../tabs/ProductAndServiceTab/ProductAndServiceTab.tsx";
 | 
					import ProductAndServiceTab from "../../tabs/ProductAndServiceTab/ProductAndServiceTab.tsx";
 | 
				
			||||||
import { motion } from "framer-motion";
 | 
					import { motion } from "framer-motion";
 | 
				
			||||||
import ClientTab from "./tabs/ClientTab.tsx";
 | 
					import ClientTab from "./tabs/ClientTab.tsx";
 | 
				
			||||||
 | 
					import ShippingTab from "../../tabs/ShippingTab/ShippingTab.tsx";
 | 
				
			||||||
// import styles from './DealEditDrawer.module.css';
 | 
					// import styles from './DealEditDrawer.module.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// const useDealServicesTableState = () => {
 | 
					// const useDealServicesTableState = () => {
 | 
				
			||||||
@@ -348,6 +349,11 @@ const DealEditDrawer: FC = () => {
 | 
				
			|||||||
                        leftSection={<IconBox />}>
 | 
					                        leftSection={<IconBox />}>
 | 
				
			||||||
                        Товары и услуги
 | 
					                        Товары и услуги
 | 
				
			||||||
                    </Tabs.Tab>
 | 
					                    </Tabs.Tab>
 | 
				
			||||||
 | 
					                    <Tabs.Tab
 | 
				
			||||||
 | 
					                        value={"shipment"}
 | 
				
			||||||
 | 
					                        leftSection={<IconCubeSend />}>
 | 
				
			||||||
 | 
					                        Отгрузка
 | 
				
			||||||
 | 
					                    </Tabs.Tab>
 | 
				
			||||||
                </Tabs.List>
 | 
					                </Tabs.List>
 | 
				
			||||||
                <Tabs.Panel value={"general"}>
 | 
					                <Tabs.Panel value={"general"}>
 | 
				
			||||||
                    <motion.div
 | 
					                    <motion.div
 | 
				
			||||||
@@ -392,6 +398,16 @@ const DealEditDrawer: FC = () => {
 | 
				
			|||||||
                        </Box>
 | 
					                        </Box>
 | 
				
			||||||
                    </motion.div>
 | 
					                    </motion.div>
 | 
				
			||||||
                </Tabs.Panel>
 | 
					                </Tabs.Panel>
 | 
				
			||||||
 | 
					                <Tabs.Panel value={"shipment"}>
 | 
				
			||||||
 | 
					                    <motion.div
 | 
				
			||||||
 | 
					                        initial={{ opacity: 0 }}
 | 
				
			||||||
 | 
					                        animate={{ opacity: 1 }}
 | 
				
			||||||
 | 
					                        transition={{ duration: 0.2 }}>
 | 
				
			||||||
 | 
					                        <Box p={rem(10)}>
 | 
				
			||||||
 | 
					                            <ShippingTab />
 | 
				
			||||||
 | 
					                        </Box>
 | 
				
			||||||
 | 
					                    </motion.div>
 | 
				
			||||||
 | 
					                </Tabs.Panel>
 | 
				
			||||||
            </Tabs>
 | 
					            </Tabs>
 | 
				
			||||||
        </Drawer>
 | 
					        </Drawer>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										51
									
								
								src/pages/LeadsPage/tabs/ShippingTab/ShippingTab.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/pages/LeadsPage/tabs/ShippingTab/ShippingTab.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					import ShippingTree from "./components/ShippingTree.tsx";
 | 
				
			||||||
 | 
					import { Button, Group, rem, ScrollArea, Stack } from "@mantine/core";
 | 
				
			||||||
 | 
					import useShipping from "./hooks/useShipping.tsx";
 | 
				
			||||||
 | 
					import useShippingQrs from "./hooks/useShippingQrs.tsx";
 | 
				
			||||||
 | 
					import { IconPrinter, IconQrcode } from "@tabler/icons-react";
 | 
				
			||||||
 | 
					import { ReactNode } from "react";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ShippingTab = () => {
 | 
				
			||||||
 | 
					    const {
 | 
				
			||||||
 | 
					        onCreateBoxInDealClick,
 | 
				
			||||||
 | 
					        onCreatePalletClick,
 | 
				
			||||||
 | 
					    } = useShipping();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {
 | 
				
			||||||
 | 
					        onGetDealQrPdfClick,
 | 
				
			||||||
 | 
					        onGetPalletsPdfClick,
 | 
				
			||||||
 | 
					        onGetBoxesPdfClick,
 | 
				
			||||||
 | 
					    } = useShippingQrs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getButton = (label: string, func: () => void, icon?: ReactNode) => {
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <Button
 | 
				
			||||||
 | 
					                variant={"default"}
 | 
				
			||||||
 | 
					                onClick={func}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					                <Group gap={rem(10)}>
 | 
				
			||||||
 | 
					                    {icon}
 | 
				
			||||||
 | 
					                    {label}
 | 
				
			||||||
 | 
					                </Group>
 | 
				
			||||||
 | 
					            </Button>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Stack h={"94vh"}>
 | 
				
			||||||
 | 
					            <Group>
 | 
				
			||||||
 | 
					                {getButton("Добавить паллет", onCreatePalletClick)}
 | 
				
			||||||
 | 
					                {getButton("Добавить короб", onCreateBoxInDealClick)}
 | 
				
			||||||
 | 
					                {getButton("Сделка", onGetDealQrPdfClick, <IconQrcode />)}
 | 
				
			||||||
 | 
					                {getButton("Паллеты", onGetPalletsPdfClick, <IconPrinter />)}
 | 
				
			||||||
 | 
					                {getButton("Короба", onGetBoxesPdfClick, <IconPrinter />)}
 | 
				
			||||||
 | 
					            </Group>
 | 
				
			||||||
 | 
					            <ScrollArea>
 | 
				
			||||||
 | 
					                <ShippingTree />
 | 
				
			||||||
 | 
					            </ScrollArea>
 | 
				
			||||||
 | 
					        </Stack>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ShippingTab;
 | 
				
			||||||
@@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					import useShippingTableColumns from "../hooks/shippingTableColumns.tsx";
 | 
				
			||||||
 | 
					import { BaseTable } from "../../../../../components/BaseTable/BaseTable.tsx";
 | 
				
			||||||
 | 
					import { BoxSchema, ShippingService } from "../../../../../client";
 | 
				
			||||||
 | 
					import { ActionIcon, Flex, Tooltip } from "@mantine/core";
 | 
				
			||||||
 | 
					import { IconEdit, IconTrash } from "@tabler/icons-react";
 | 
				
			||||||
 | 
					import { MRT_TableOptions } from "mantine-react-table";
 | 
				
			||||||
 | 
					import { modals } from "@mantine/modals";
 | 
				
			||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					import useUpdateDeal from "../hooks/useUpdateDeal.tsx";
 | 
				
			||||||
 | 
					import { notifications } from "../../../../../shared/lib/notifications.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = {
 | 
				
			||||||
 | 
					    items: BoxSchema[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const BoxesTable = ({ items }: Props) => {
 | 
				
			||||||
 | 
					    const columns = useShippingTableColumns<BoxSchema>();
 | 
				
			||||||
 | 
					    const { update } = useUpdateDeal();
 | 
				
			||||||
 | 
					    const { selectedDeal: deal } = useDealPageContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onDeleteClick = (box: BoxSchema) => {
 | 
				
			||||||
 | 
					        ShippingService.deleteBox({
 | 
				
			||||||
 | 
					            boxId: box.id,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                notifications.guess(ok, { message });
 | 
				
			||||||
 | 
					                if (ok) update();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onEditClick = (box: BoxSchema) => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        modals.openContextModal({
 | 
				
			||||||
 | 
					            modal: "shippingProductModal",
 | 
				
			||||||
 | 
					            title: "Редактирование короба",
 | 
				
			||||||
 | 
					            withCloseButton: false,
 | 
				
			||||||
 | 
					            innerProps: {
 | 
				
			||||||
 | 
					                deal,
 | 
				
			||||||
 | 
					                updateOnSubmit: update,
 | 
				
			||||||
 | 
					                isBox: true,
 | 
				
			||||||
 | 
					                shippingData: {
 | 
				
			||||||
 | 
					                    boxId: box.id,
 | 
				
			||||||
 | 
					                    productId: box.product.id,
 | 
				
			||||||
 | 
					                    quantity: box.quantity,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <BaseTable
 | 
				
			||||||
 | 
					            data={items}
 | 
				
			||||||
 | 
					            columns={columns}
 | 
				
			||||||
 | 
					            restProps={
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    enableSorting: false,
 | 
				
			||||||
 | 
					                    enableColumnActions: false,
 | 
				
			||||||
 | 
					                    enableRowActions: true,
 | 
				
			||||||
 | 
					                    enableRowNumbers: true,
 | 
				
			||||||
 | 
					                    positionActionsColumn: "last",
 | 
				
			||||||
 | 
					                    renderRowActions: ({ row }) => (
 | 
				
			||||||
 | 
					                        <Flex gap="md">
 | 
				
			||||||
 | 
					                            <Tooltip label="Удалить">
 | 
				
			||||||
 | 
					                                <ActionIcon
 | 
				
			||||||
 | 
					                                    onClick={() => onDeleteClick(row.original)}
 | 
				
			||||||
 | 
					                                    variant={"default"}>
 | 
				
			||||||
 | 
					                                    <IconTrash />
 | 
				
			||||||
 | 
					                                </ActionIcon>
 | 
				
			||||||
 | 
					                            </Tooltip>
 | 
				
			||||||
 | 
					                            <Tooltip label="Редактировать">
 | 
				
			||||||
 | 
					                                <ActionIcon
 | 
				
			||||||
 | 
					                                    onClick={() => onEditClick(row.original)}
 | 
				
			||||||
 | 
					                                    variant={"default"}>
 | 
				
			||||||
 | 
					                                    <IconEdit />
 | 
				
			||||||
 | 
					                                </ActionIcon>
 | 
				
			||||||
 | 
					                            </Tooltip>
 | 
				
			||||||
 | 
					                        </Flex>
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                } as MRT_TableOptions<BoxSchema>
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default BoxesTable;
 | 
				
			||||||
@@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					import useShippingTableColumns from "../hooks/shippingTableColumns.tsx";
 | 
				
			||||||
 | 
					import { BaseTable } from "../../../../../components/BaseTable/BaseTable.tsx";
 | 
				
			||||||
 | 
					import { ShippingProductSchema, ShippingService } from "../../../../../client";
 | 
				
			||||||
 | 
					import { ActionIcon, Flex, Tooltip } from "@mantine/core";
 | 
				
			||||||
 | 
					import { IconEdit, IconTrash } from "@tabler/icons-react";
 | 
				
			||||||
 | 
					import { MRT_TableOptions } from "mantine-react-table";
 | 
				
			||||||
 | 
					import { notifications } from "../../../../../shared/lib/notifications.ts";
 | 
				
			||||||
 | 
					import useUpdateDeal from "../hooks/useUpdateDeal.tsx";
 | 
				
			||||||
 | 
					import { modals } from "@mantine/modals";
 | 
				
			||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = {
 | 
				
			||||||
 | 
					    items: ShippingProductSchema[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ShippingProductsTable = ({ items }: Props) => {
 | 
				
			||||||
 | 
					    const columns = useShippingTableColumns<ShippingProductSchema>();
 | 
				
			||||||
 | 
					    const { update } = useUpdateDeal();
 | 
				
			||||||
 | 
					    const { selectedDeal: deal } = useDealPageContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onDeleteClick = (shippingProduct: ShippingProductSchema) => {
 | 
				
			||||||
 | 
					        ShippingService.deleteShippingProduct({
 | 
				
			||||||
 | 
					            shippingProductId: shippingProduct.id,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                notifications.guess(ok, { message });
 | 
				
			||||||
 | 
					                update();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onEditClick = (shippingProduct: ShippingProductSchema) => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        modals.openContextModal({
 | 
				
			||||||
 | 
					            modal: "shippingProductModal",
 | 
				
			||||||
 | 
					            title: "Редактирование товара на паллете",
 | 
				
			||||||
 | 
					            withCloseButton: false,
 | 
				
			||||||
 | 
					            innerProps: {
 | 
				
			||||||
 | 
					                deal,
 | 
				
			||||||
 | 
					                updateOnSubmit: update,
 | 
				
			||||||
 | 
					                isBox: false,
 | 
				
			||||||
 | 
					                shippingData: {
 | 
				
			||||||
 | 
					                    shippingProductId: shippingProduct.id,
 | 
				
			||||||
 | 
					                    productId: shippingProduct.product.id,
 | 
				
			||||||
 | 
					                    quantity: shippingProduct.quantity,
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <BaseTable
 | 
				
			||||||
 | 
					            data={items}
 | 
				
			||||||
 | 
					            columns={columns}
 | 
				
			||||||
 | 
					            restProps={
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    enableSorting: false,
 | 
				
			||||||
 | 
					                    enableColumnActions: false,
 | 
				
			||||||
 | 
					                    enableRowActions: true,
 | 
				
			||||||
 | 
					                    enableRowNumbers: true,
 | 
				
			||||||
 | 
					                    positionActionsColumn: "last",
 | 
				
			||||||
 | 
					                    renderRowActions: ({ row }) => (
 | 
				
			||||||
 | 
					                        <Flex gap="md">
 | 
				
			||||||
 | 
					                            <Tooltip label="Удалить">
 | 
				
			||||||
 | 
					                                <ActionIcon
 | 
				
			||||||
 | 
					                                    onClick={() => onDeleteClick(row.original)}
 | 
				
			||||||
 | 
					                                    variant={"default"}>
 | 
				
			||||||
 | 
					                                    <IconTrash />
 | 
				
			||||||
 | 
					                                </ActionIcon>
 | 
				
			||||||
 | 
					                            </Tooltip>
 | 
				
			||||||
 | 
					                            <Tooltip label="Редактировать">
 | 
				
			||||||
 | 
					                                <ActionIcon
 | 
				
			||||||
 | 
					                                    onClick={() => onEditClick(row.original)}
 | 
				
			||||||
 | 
					                                    variant={"default"}>
 | 
				
			||||||
 | 
					                                    <IconEdit />
 | 
				
			||||||
 | 
					                                </ActionIcon>
 | 
				
			||||||
 | 
					                            </Tooltip>
 | 
				
			||||||
 | 
					                        </Flex>
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                } as MRT_TableOptions<ShippingProductSchema>
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ShippingProductsTable;
 | 
				
			||||||
							
								
								
									
										151
									
								
								src/pages/LeadsPage/tabs/ShippingTab/components/ShippingTree.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								src/pages/LeadsPage/tabs/ShippingTab/components/ShippingTree.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
				
			|||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					import { Accordion, ActionIcon, Button, Center, Group, rem, Stack, Title, Tooltip } from "@mantine/core";
 | 
				
			||||||
 | 
					import { BoxSchema, PalletSchema, ShippingProductSchema } from "../../../../../client";
 | 
				
			||||||
 | 
					import ShippingProductsTable from "./ShippingProductsTable.tsx";
 | 
				
			||||||
 | 
					import BoxesTable from "./BoxesTable.tsx";
 | 
				
			||||||
 | 
					import { IconBox, IconPlus, IconSpace, IconTrash } from "@tabler/icons-react";
 | 
				
			||||||
 | 
					import useShipping from "../hooks/useShipping.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ShippingTree = () => {
 | 
				
			||||||
 | 
					    const { selectedDeal: deal } = useDealPageContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {
 | 
				
			||||||
 | 
					        onCreateBoxInPallet,
 | 
				
			||||||
 | 
					        onCreateShippingProduct,
 | 
				
			||||||
 | 
					        onDeletePalletClick,
 | 
				
			||||||
 | 
					        palletIds,
 | 
				
			||||||
 | 
					    } = useShipping();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const sortById = (data?: PalletSchema[] | BoxSchema[] | ShippingProductSchema[]) => {
 | 
				
			||||||
 | 
					        return data?.sort((a, b) => a.id - b.id);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getPallets = () => {
 | 
				
			||||||
 | 
					        const sortedPallets = sortById(deal?.pallets) as PalletSchema[];
 | 
				
			||||||
 | 
					        const pallets = sortedPallets?.map(((pallet, index) => {
 | 
				
			||||||
 | 
					            palletIds.push(pallet.id.toString());
 | 
				
			||||||
 | 
					            return (
 | 
				
			||||||
 | 
					                <Accordion.Item key={pallet.id} value={pallet.id.toString()}>
 | 
				
			||||||
 | 
					                    <Center>
 | 
				
			||||||
 | 
					                        <Accordion.Control icon={<IconSpace />}>
 | 
				
			||||||
 | 
					                            Паллет {index + 1}
 | 
				
			||||||
 | 
					                        </Accordion.Control>
 | 
				
			||||||
 | 
					                        {removePalletButton(pallet.id)}
 | 
				
			||||||
 | 
					                    </Center>
 | 
				
			||||||
 | 
					                    <Accordion.Panel>
 | 
				
			||||||
 | 
					                        {getPalletContent(pallet)}
 | 
				
			||||||
 | 
					                    </Accordion.Panel>
 | 
				
			||||||
 | 
					                </Accordion.Item>
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        })) ?? [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (deal?.boxes && deal?.boxes.length > 0) {
 | 
				
			||||||
 | 
					            const boxes = deal?.boxes.sort((b1, b2) => (b1.id - b2.id));
 | 
				
			||||||
 | 
					            const itemValue = "noPallets";
 | 
				
			||||||
 | 
					            const boxesWithoutPallet = (
 | 
				
			||||||
 | 
					                <Accordion.Item key={-1} value={itemValue}>
 | 
				
			||||||
 | 
					                    <Accordion.Control icon={<IconBox />}>
 | 
				
			||||||
 | 
					                        Короба без паллетов
 | 
				
			||||||
 | 
					                    </Accordion.Control>
 | 
				
			||||||
 | 
					                    <Accordion.Panel>
 | 
				
			||||||
 | 
					                        <BoxesTable items={boxes} />
 | 
				
			||||||
 | 
					                    </Accordion.Panel>
 | 
				
			||||||
 | 
					                </Accordion.Item>
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            pallets.unshift(boxesWithoutPallet);
 | 
				
			||||||
 | 
					            palletIds.push(itemValue);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return pallets;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const removePalletButton = (palletId: number) => {
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <Tooltip label="Удалить паллет">
 | 
				
			||||||
 | 
					                <ActionIcon
 | 
				
			||||||
 | 
					                    variant={"default"}
 | 
				
			||||||
 | 
					                    onClick={() => onDeletePalletClick(palletId)}
 | 
				
			||||||
 | 
					                    mx={"md"}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <IconTrash />
 | 
				
			||||||
 | 
					                </ActionIcon>
 | 
				
			||||||
 | 
					            </Tooltip>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const createBoxOrShippingProductButton = (palletId: number, isBox: boolean) => {
 | 
				
			||||||
 | 
					        const createButtonLabel = isBox ? "Добавить короб" : "Добавить товар";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <Button
 | 
				
			||||||
 | 
					                variant={"default"}
 | 
				
			||||||
 | 
					                onClick={() => {
 | 
				
			||||||
 | 
					                    if (isBox) {
 | 
				
			||||||
 | 
					                        onCreateBoxInPallet(palletId);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        onCreateShippingProduct(palletId);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					                <Group gap={rem(5)}>
 | 
				
			||||||
 | 
					                    <IconPlus />
 | 
				
			||||||
 | 
					                    {createButtonLabel}
 | 
				
			||||||
 | 
					                </Group>
 | 
				
			||||||
 | 
					            </Button>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getPalletContent = (pallet: PalletSchema) => {
 | 
				
			||||||
 | 
					        const isEmpty = pallet.boxes.length === 0 && pallet.shippingProducts.length === 0;
 | 
				
			||||||
 | 
					        const isBox = pallet.boxes.length > 0;
 | 
				
			||||||
 | 
					        const title = isEmpty ? "Пустой" : isBox ? "Короба" : "Товары";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let palletButtons;
 | 
				
			||||||
 | 
					        if (isEmpty) {
 | 
				
			||||||
 | 
					            palletButtons = [
 | 
				
			||||||
 | 
					                createBoxOrShippingProductButton(pallet.id, true),
 | 
				
			||||||
 | 
					                createBoxOrShippingProductButton(pallet.id, false),
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            palletButtons = [
 | 
				
			||||||
 | 
					                createBoxOrShippingProductButton(pallet.id, isBox),
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const boxes = sortById(pallet.boxes) as BoxSchema[];
 | 
				
			||||||
 | 
					        const shippingProducts = sortById(pallet.shippingProducts) as ShippingProductSchema[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let table;
 | 
				
			||||||
 | 
					        if (!isEmpty) {
 | 
				
			||||||
 | 
					            if (isBox) {
 | 
				
			||||||
 | 
					                table = (<BoxesTable items={boxes} />);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                table = (<ShippingProductsTable items={shippingProducts} />);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <Stack gap={rem(5)}>
 | 
				
			||||||
 | 
					                <Group justify={"space-between"}>
 | 
				
			||||||
 | 
					                    <Title order={6}>{title}</Title>
 | 
				
			||||||
 | 
					                    <Group gap={rem(10)}>
 | 
				
			||||||
 | 
					                        {...palletButtons}
 | 
				
			||||||
 | 
					                    </Group>
 | 
				
			||||||
 | 
					                </Group>
 | 
				
			||||||
 | 
					                {table}
 | 
				
			||||||
 | 
					            </Stack>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Accordion
 | 
				
			||||||
 | 
					            multiple={true}
 | 
				
			||||||
 | 
					            defaultValue={palletIds}
 | 
				
			||||||
 | 
					            bd={"solid 1px gray"}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            {getPallets()}
 | 
				
			||||||
 | 
					        </Accordion>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ShippingTree;
 | 
				
			||||||
@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					import { useMemo } from "react";
 | 
				
			||||||
 | 
					import { MRT_ColumnDef, MRT_RowData } from "mantine-react-table";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useShippingTableColumns = <T extends MRT_RowData>() => {
 | 
				
			||||||
 | 
					    return useMemo<MRT_ColumnDef<T>[]>(
 | 
				
			||||||
 | 
					        () => [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                header: "Название",
 | 
				
			||||||
 | 
					                accessorKey: "product.name",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                header: "Артикул",
 | 
				
			||||||
 | 
					                accessorKey: "product.article",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                header: "Размер",
 | 
				
			||||||
 | 
					                accessorKey: "product.size",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                header: "Количество",
 | 
				
			||||||
 | 
					                accessorKey: "quantity",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        [],
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useShippingTableColumns;
 | 
				
			||||||
							
								
								
									
										108
									
								
								src/pages/LeadsPage/tabs/ShippingTab/hooks/useShipping.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								src/pages/LeadsPage/tabs/ShippingTab/hooks/useShipping.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					import { ShippingService } from "../../../../../client";
 | 
				
			||||||
 | 
					import { notifications } from "../../../../../shared/lib/notifications.ts";
 | 
				
			||||||
 | 
					import { modals } from "@mantine/modals";
 | 
				
			||||||
 | 
					import { Text } from "@mantine/core";
 | 
				
			||||||
 | 
					import useUpdateDeal from "./useUpdateDeal.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useShipping = () => {
 | 
				
			||||||
 | 
					    const { selectedDeal: deal } = useDealPageContext();
 | 
				
			||||||
 | 
					    const { update } = useUpdateDeal();
 | 
				
			||||||
 | 
					    const palletIds: string[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onCreatePalletClick = () => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ShippingService.createPallet({
 | 
				
			||||||
 | 
					            dealId: deal.id,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                notifications.guess(ok, { message });
 | 
				
			||||||
 | 
					                update();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onDeletePallet = (palletId: number) => {
 | 
				
			||||||
 | 
					        ShippingService.deletePallet({
 | 
				
			||||||
 | 
					            palletId: palletId,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                if (!ok) notifications.guess(ok, { message });
 | 
				
			||||||
 | 
					                update();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onDeletePalletClick = (palletId: number) => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        modals.openConfirmModal({
 | 
				
			||||||
 | 
					            title: "Удаление паллета",
 | 
				
			||||||
 | 
					            children: <Text size="sm">Вы уверены что хотите удалить паллет?</Text>,
 | 
				
			||||||
 | 
					            labels: { confirm: "Да", cancel: "Нет" },
 | 
				
			||||||
 | 
					            confirmProps: { color: "red" },
 | 
				
			||||||
 | 
					            onConfirm: () => onDeletePallet(palletId),
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const openShippingModal = (
 | 
				
			||||||
 | 
					        title: string,
 | 
				
			||||||
 | 
					        isBox: boolean,
 | 
				
			||||||
 | 
					        palletId?: number,
 | 
				
			||||||
 | 
					        dealId?: number,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        modals.openContextModal({
 | 
				
			||||||
 | 
					            modal: "shippingProductModal",
 | 
				
			||||||
 | 
					            title,
 | 
				
			||||||
 | 
					            withCloseButton: false,
 | 
				
			||||||
 | 
					            innerProps: {
 | 
				
			||||||
 | 
					                deal,
 | 
				
			||||||
 | 
					                updateOnSubmit: update,
 | 
				
			||||||
 | 
					                isBox,
 | 
				
			||||||
 | 
					                shippingData: {
 | 
				
			||||||
 | 
					                    dealId,
 | 
				
			||||||
 | 
					                    palletId,
 | 
				
			||||||
 | 
					                    productId: null,
 | 
				
			||||||
 | 
					                    quantity: null,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onCreateBoxInDealClick = () => {
 | 
				
			||||||
 | 
					        openShippingModal(
 | 
				
			||||||
 | 
					            "Добавление короба",
 | 
				
			||||||
 | 
					            true,
 | 
				
			||||||
 | 
					            undefined,
 | 
				
			||||||
 | 
					            deal?.id,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onCreateBoxInPallet = (palletId: number) => {
 | 
				
			||||||
 | 
					        openShippingModal(
 | 
				
			||||||
 | 
					            "Добавление короба",
 | 
				
			||||||
 | 
					            true,
 | 
				
			||||||
 | 
					            palletId,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onCreateShippingProduct = (palletId: number) => {
 | 
				
			||||||
 | 
					        openShippingModal(
 | 
				
			||||||
 | 
					            "Добавление товара на паллет",
 | 
				
			||||||
 | 
					            false,
 | 
				
			||||||
 | 
					            palletId,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        onCreateBoxInDealClick,
 | 
				
			||||||
 | 
					        onCreateBoxInPallet,
 | 
				
			||||||
 | 
					        onCreateShippingProduct,
 | 
				
			||||||
 | 
					        onCreatePalletClick,
 | 
				
			||||||
 | 
					        onDeletePalletClick,
 | 
				
			||||||
 | 
					        palletIds,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useShipping;
 | 
				
			||||||
@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useShippingQrs = () => {
 | 
				
			||||||
 | 
					    const { selectedDeal: deal } = useDealPageContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const basePdfUrl = `${import.meta.env.VITE_API_URL}/shipping/pdf`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getPdf = (url: string) => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        const pdfWindow = window.open(url);
 | 
				
			||||||
 | 
					        if (!pdfWindow) return;
 | 
				
			||||||
 | 
					        pdfWindow.print();
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onGetDealQrPdfClick = () => {
 | 
				
			||||||
 | 
					        getPdf(`${basePdfUrl}/deal/${deal?.id}`);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onGetPalletsPdfClick = () => {
 | 
				
			||||||
 | 
					        getPdf(`${basePdfUrl}/pallets/${deal?.id}`);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onGetBoxesPdfClick = () => {
 | 
				
			||||||
 | 
					        getPdf(`${basePdfUrl}/boxes/${deal?.id}`);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        onGetDealQrPdfClick,
 | 
				
			||||||
 | 
					        onGetPalletsPdfClick,
 | 
				
			||||||
 | 
					        onGetBoxesPdfClick,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useShippingQrs;
 | 
				
			||||||
							
								
								
									
										18
									
								
								src/pages/LeadsPage/tabs/ShippingTab/hooks/useUpdateDeal.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/pages/LeadsPage/tabs/ShippingTab/hooks/useUpdateDeal.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					import { useDealPageContext } from "../../../contexts/DealPageContext.tsx";
 | 
				
			||||||
 | 
					import { DealService } from "../../../../../client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useUpdateDeal = () => {
 | 
				
			||||||
 | 
					    const { selectedDeal: deal, setSelectedDeal } = useDealPageContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const update = () => {
 | 
				
			||||||
 | 
					        if (!deal) return;
 | 
				
			||||||
 | 
					        DealService.getDealById({ dealId: deal.id })
 | 
				
			||||||
 | 
					            .then(data => {
 | 
				
			||||||
 | 
					                setSelectedDeal(data);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return { update };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useUpdateDeal;
 | 
				
			||||||
@@ -0,0 +1,156 @@
 | 
				
			|||||||
 | 
					import { useForm } from "@mantine/form";
 | 
				
			||||||
 | 
					import { ContextModalProps } from "@mantine/modals";
 | 
				
			||||||
 | 
					import { Button, Flex, NumberInput, rem, Select, Text } from "@mantine/core";
 | 
				
			||||||
 | 
					import getRestProducts from "../utils/getRestProducts.tsx";
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    CreateBoxInDealSchema,
 | 
				
			||||||
 | 
					    CreateBoxInPalletSchema,
 | 
				
			||||||
 | 
					    CreateShippingProductSchema,
 | 
				
			||||||
 | 
					    DealProductSchema,
 | 
				
			||||||
 | 
					    DealSchema,
 | 
				
			||||||
 | 
					    ShippingService,
 | 
				
			||||||
 | 
					    UpdateBoxSchema,
 | 
				
			||||||
 | 
					    UpdateShippingProductSchema,
 | 
				
			||||||
 | 
					} from "../../../../../client";
 | 
				
			||||||
 | 
					import { notifications } from "../../../../../shared/lib/notifications.ts";
 | 
				
			||||||
 | 
					import { ShippingData, ShippingModalForm, ShippingProductOption } from "../types/ShippingProductData.tsx";
 | 
				
			||||||
 | 
					import { useEffect, useState } from "react";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = {
 | 
				
			||||||
 | 
					    updateOnSubmit: () => void;
 | 
				
			||||||
 | 
					    deal: DealSchema;
 | 
				
			||||||
 | 
					    isBox: boolean;
 | 
				
			||||||
 | 
					    shippingData: Partial<ShippingData>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ShippingProductModal = ({
 | 
				
			||||||
 | 
					                                  context,
 | 
				
			||||||
 | 
					                                  id,
 | 
				
			||||||
 | 
					                                  innerProps,
 | 
				
			||||||
 | 
					                              }: ContextModalProps<Props>) => {
 | 
				
			||||||
 | 
					    const [restProducts, setRestProducts] = useState<Map<number, DealProductSchema>>(new Map());
 | 
				
			||||||
 | 
					    const [restProductsSelectData, setRestProductSelectData] = useState<ShippingProductOption[]>([]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getRestProductQuantity = () => {
 | 
				
			||||||
 | 
					        if (form.values.productId) {
 | 
				
			||||||
 | 
					            const restProduct = restProducts.get(Number(form.values.productId));
 | 
				
			||||||
 | 
					            if (restProduct) {
 | 
				
			||||||
 | 
					                return restProduct.quantity;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return 10000;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const initialValues: ShippingModalForm = {
 | 
				
			||||||
 | 
					        quantity: innerProps.shippingData.quantity ?? 0,
 | 
				
			||||||
 | 
					        productId: innerProps.shippingData.productId,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const form = useForm<ShippingModalForm>({
 | 
				
			||||||
 | 
					        initialValues,
 | 
				
			||||||
 | 
					        validate: {
 | 
				
			||||||
 | 
					            productId: productId => !productId && "Необходимо выбрать товар",
 | 
				
			||||||
 | 
					            quantity: quantity => quantity > getRestProductQuantity() ? "Слишком много товара" :
 | 
				
			||||||
 | 
					                quantity === 0 && "Слишком мало товара",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    useEffect(() => {
 | 
				
			||||||
 | 
					        const data = getRestProducts({
 | 
				
			||||||
 | 
					            deal: innerProps.deal,
 | 
				
			||||||
 | 
					            unaccountedValues: innerProps.shippingData as UpdateShippingProductSchema | UpdateBoxSchema,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        setRestProducts(data.restProducts);
 | 
				
			||||||
 | 
					        setRestProductSelectData(data.restProductsSelectData);
 | 
				
			||||||
 | 
					    }, [innerProps.deal]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const updateBox = () => {
 | 
				
			||||||
 | 
					        const data = {
 | 
				
			||||||
 | 
					            ...innerProps.shippingData,
 | 
				
			||||||
 | 
					            ...form.values,
 | 
				
			||||||
 | 
					        } as CreateBoxInPalletSchema | CreateBoxInDealSchema | UpdateBoxSchema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ShippingService.updateBox({
 | 
				
			||||||
 | 
					            requestBody: { data },
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                notifications.guess(ok, { message: message });
 | 
				
			||||||
 | 
					                innerProps.updateOnSubmit();
 | 
				
			||||||
 | 
					                if (ok) context.closeContextModal(id);
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const updateShippingProduct = () => {
 | 
				
			||||||
 | 
					        const data = {
 | 
				
			||||||
 | 
					            ...innerProps.shippingData,
 | 
				
			||||||
 | 
					            ...form.values,
 | 
				
			||||||
 | 
					        } as CreateShippingProductSchema | UpdateShippingProductSchema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ShippingService.updateShippingProduct({
 | 
				
			||||||
 | 
					            requestBody: { data },
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					            .then(({ ok, message }) => {
 | 
				
			||||||
 | 
					                notifications.guess(ok, { message: message });
 | 
				
			||||||
 | 
					                innerProps.updateOnSubmit();
 | 
				
			||||||
 | 
					                if (ok) context.closeContextModal(id);
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            .catch(err => console.log(err));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const onSubmit = () => {
 | 
				
			||||||
 | 
					        if (innerProps.isBox) {
 | 
				
			||||||
 | 
					            updateBox();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            updateShippingProduct();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const getRestQuantityText = () => {
 | 
				
			||||||
 | 
					        if (!form.values.productId) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const restQuantityInDeal = getRestProductQuantity();
 | 
				
			||||||
 | 
					        const restQuantity = restQuantityInDeal - form.values.quantity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (restQuantity >= 0) {
 | 
				
			||||||
 | 
					            return <Text>Осталось распределить {restQuantity} шт.</Text>;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return <Text>Введено слишком большое количество.<br />Доступно {restQuantityInDeal} шт.</Text>;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <form onSubmit={form.onSubmit(() => onSubmit())}>
 | 
				
			||||||
 | 
					            <Flex
 | 
				
			||||||
 | 
					                direction={"column"}
 | 
				
			||||||
 | 
					                gap={rem(10)}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					                <Select
 | 
				
			||||||
 | 
					                    data={restProductsSelectData}
 | 
				
			||||||
 | 
					                    label={"Товар"}
 | 
				
			||||||
 | 
					                    placeholder={"Выберите товар"}
 | 
				
			||||||
 | 
					                    {...form.getInputProps("productId")}
 | 
				
			||||||
 | 
					                    value={form.values.productId?.toString()}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                {getRestQuantityText()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <NumberInput
 | 
				
			||||||
 | 
					                    label={"Количество"}
 | 
				
			||||||
 | 
					                    hideControls
 | 
				
			||||||
 | 
					                    {...form.getInputProps("quantity")}
 | 
				
			||||||
 | 
					                    min={0}
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <Button
 | 
				
			||||||
 | 
					                    variant={"default"}
 | 
				
			||||||
 | 
					                    type={"submit"}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    Сохранить
 | 
				
			||||||
 | 
					                </Button>
 | 
				
			||||||
 | 
					            </Flex>
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ShippingProductModal;
 | 
				
			||||||
@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					    CreateBoxInDealSchema,
 | 
				
			||||||
 | 
					    CreateBoxInPalletSchema,
 | 
				
			||||||
 | 
					    CreateShippingProductSchema,
 | 
				
			||||||
 | 
					    UpdateBoxSchema,
 | 
				
			||||||
 | 
					    UpdateShippingProductSchema,
 | 
				
			||||||
 | 
					} from "../../../../../client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type ShippingModalForm = {
 | 
				
			||||||
 | 
					    quantity: number;
 | 
				
			||||||
 | 
					    productId?: number | null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type ShippingProductOption = {
 | 
				
			||||||
 | 
					    value: string;
 | 
				
			||||||
 | 
					    label: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type ShippingData =
 | 
				
			||||||
 | 
					    CreateBoxInDealSchema
 | 
				
			||||||
 | 
					    | CreateBoxInPalletSchema
 | 
				
			||||||
 | 
					    | UpdateBoxSchema
 | 
				
			||||||
 | 
					    | CreateShippingProductSchema
 | 
				
			||||||
 | 
					    | UpdateShippingProductSchema;
 | 
				
			||||||
@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					import { ShippingProductOption } from "../types/ShippingProductData.tsx";
 | 
				
			||||||
 | 
					import { DealProductSchema, DealSchema, ProductSchema } from "../../../../../client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UnaccountedValues = {
 | 
				
			||||||
 | 
					    boxId?: number | null;
 | 
				
			||||||
 | 
					    shippingProductId?: number | null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = {
 | 
				
			||||||
 | 
					    deal?: DealSchema;
 | 
				
			||||||
 | 
					    unaccountedValues: UnaccountedValues;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getRestProducts = ({
 | 
				
			||||||
 | 
					                             deal,
 | 
				
			||||||
 | 
					                             unaccountedValues,
 | 
				
			||||||
 | 
					                         }: Props) => {
 | 
				
			||||||
 | 
					    const totalProducts = new Map(
 | 
				
			||||||
 | 
					        deal?.products.map(product => [product.product.id, product]),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const distributedProducts = new Map();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const accountProduct = (product: ProductSchema, quantity: number) => {
 | 
				
			||||||
 | 
					        const productId = product.id;
 | 
				
			||||||
 | 
					        if (distributedProducts.has(productId)) {
 | 
				
			||||||
 | 
					            const prodData = distributedProducts.get(productId);
 | 
				
			||||||
 | 
					            distributedProducts.set(productId, { product, quantity: quantity + prodData.quantity });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            distributedProducts.set(productId, { product, quantity });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    deal?.boxes?.forEach((box) => {
 | 
				
			||||||
 | 
					        if (box.id === unaccountedValues.boxId) return;
 | 
				
			||||||
 | 
					        accountProduct(box.product, box.quantity);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    deal?.pallets?.forEach(pallet => {
 | 
				
			||||||
 | 
					        pallet.shippingProducts.forEach(shippingProduct => {
 | 
				
			||||||
 | 
					            if (shippingProduct.id === unaccountedValues.shippingProductId) return;
 | 
				
			||||||
 | 
					            accountProduct(shippingProduct.product, shippingProduct.quantity);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        pallet.boxes.forEach((box) => {
 | 
				
			||||||
 | 
					            if (box.id === unaccountedValues.boxId) return;
 | 
				
			||||||
 | 
					            accountProduct(box.product, box.quantity);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const restProducts = new Map<number, DealProductSchema>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    totalProducts.entries().forEach(([key, product]) => {
 | 
				
			||||||
 | 
					        const distributedProduct = distributedProducts.get(key);
 | 
				
			||||||
 | 
					        if (distributedProduct) {
 | 
				
			||||||
 | 
					            if (product.quantity > distributedProduct.quantity) {
 | 
				
			||||||
 | 
					                const restQuantity = product.quantity - distributedProduct.quantity;
 | 
				
			||||||
 | 
					                restProducts.set(key, { ...product, quantity: restQuantity });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            restProducts.set(key, product);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const restProductsSelectData: ShippingProductOption[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    restProducts.forEach(
 | 
				
			||||||
 | 
					        (restProduct, id) => {
 | 
				
			||||||
 | 
					            restProductsSelectData.push({ value: String(id), label: restProduct.product.name });
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        restProducts,
 | 
				
			||||||
 | 
					        restProductsSelectData,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default getRestProducts;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user