From d357a5000bd33d0415de89226cc3fd801e959335 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 22 Feb 2026 09:50:36 +0330 Subject: [PATCH] Create order --- src/config/Paths.tsx | 2 +- .../invoice/components/InvoiceItemRow.tsx | 2 +- src/pages/order/ConvertToOrders.tsx | 287 +++++++++--------- src/pages/order/hooks/useOrderData.ts | 6 + src/pages/order/service/OrderService.ts | 6 + src/pages/order/types/Types.ts | 4 +- src/router/MainRouter.tsx | 2 +- 7 files changed, 164 insertions(+), 145 deletions(-) diff --git a/src/config/Paths.tsx b/src/config/Paths.tsx index 0aee870..b170245 100644 --- a/src/config/Paths.tsx +++ b/src/config/Paths.tsx @@ -91,5 +91,5 @@ export const Paths = { update: '/print/update/', form: '/print/form/', }, - convertToOrder: '/convert-to-order/', + convertToOrder: '/convert-to-order', }; diff --git a/src/pages/invoice/components/InvoiceItemRow.tsx b/src/pages/invoice/components/InvoiceItemRow.tsx index dd1ab23..9898d0b 100644 --- a/src/pages/invoice/components/InvoiceItemRow.tsx +++ b/src/pages/invoice/components/InvoiceItemRow.tsx @@ -123,7 +123,7 @@ const InvoiceItemRow: FC = ({ )} {item.id && ( - + ({ + invoiceItemId: invoiceItemId ?? '', + productId: '', + userId: '', + typeId: '', + estimatedDays: 0, + title: '', + attachments: [], }) +const getValidationSchema = (invoiceItemId: string | null) => + Yup.object({ + invoiceItemId: Yup.string(), + productId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب محصول اجباری است.'), + userId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب کاربر اجباری است.'), + typeId: Yup.string().required('انتخاب نوع اجباری است.'), + estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'), + title: Yup.string().required('عنوان اجباری است.'), + }) + const ConvertToOrders: FC = () => { - const { data: users } = useGetUsers() - const { data: products } = useGetProducts() - const multiUpload = useMultiUpload() - const [attachmentFiles, setAttachmentFiles] = useState([]) - const formik = useFormik({ - initialValues, - validationSchema, - onSubmit: async (values) => { - const attachments: string[] = [...values.attachments] + const [searchParams] = useSearchParams() + const invoiceItemId = searchParams.get('invoiceItemId') + const multiUpload = useMultiUpload() + const [attachmentFiles, setAttachmentFiles] = useState([]) + const { data: categories } = useGetCategory() + const { data: users } = useGetUsers() + const { data: products } = useGetProducts() - if (attachmentFiles.length > 0) { - const result = await multiUpload.mutateAsync(attachmentFiles) - result?.data?.forEach((item) => { - attachments.push(item.url) - }) - } + const { mutate: converToOrder, isPending } = useConverToOrder() - const payload: ConvertToOrderItemType = { - ...values, - estimatedDays: Number(values.estimatedDays), - attachments, - } + const formik = useFormik({ + initialValues: getInitialValues(invoiceItemId), + validationSchema: getValidationSchema(invoiceItemId), + enableReinitialize: true, + onSubmit: async (values) => { + const attachments: string[] = [...values.attachments] - console.log('Submit:', payload) - // TODO: call API - }, - }) + if (attachmentFiles.length > 0) { + const result = await multiUpload.mutateAsync(attachmentFiles) + result?.data?.forEach((item) => { + attachments.push(item.url) + }) + } - return ( -
-

تبدیل به سفارش

+ const payload: ConvertToOrderItemType = { + ...values, + invoiceItemId: invoiceItemId ?? values.invoiceItemId ?? '', + productId: invoiceItemId ? undefined : values.productId, + userId: invoiceItemId ? undefined : values.userId, + estimatedDays: Number(values.estimatedDays), + attachments, + } -
-
-
- ({ - label: item.title, - value: item.id, - })) ?? [] - } - label="محصول" - placeholder="انتخاب محصول" - {...formik.getFieldProps('productId')} - error_text={ - formik.touched.productId && formik.errors.productId ? formik.errors.productId : '' - } - /> -
+ return ( +
+

تبدیل به سفارش

-
- +
+ + {!invoiceItemId && ( +
+ ({ + label: item.title, + value: String(item.id), + })) ?? [] + } + label="محصول" + placeholder="انتخاب محصول" + {...formik.getFieldProps('productId')} + error_text={ + formik.touched.productId && formik.errors.productId + ? formik.errors.productId + : '' + } + /> +
+ )} - + -
+
+ -
- -
+ +
-
- -
- -
-
- ) +
+ +
+ +
+ +
+ +
+
+ ) } export default ConvertToOrders diff --git a/src/pages/order/hooks/useOrderData.ts b/src/pages/order/hooks/useOrderData.ts index 2c586e0..af79424 100644 --- a/src/pages/order/hooks/useOrderData.ts +++ b/src/pages/order/hooks/useOrderData.ts @@ -57,6 +57,12 @@ export const useCreateOrder = () => { }); }; +export const useConverToOrder = () => { + return useMutation({ + mutationFn: api.converToOrder, + }); +}; + export const useUpdateOrder = () => { return useMutation({ mutationFn: ({ diff --git a/src/pages/order/service/OrderService.ts b/src/pages/order/service/OrderService.ts index 52765c2..749300b 100644 --- a/src/pages/order/service/OrderService.ts +++ b/src/pages/order/service/OrderService.ts @@ -1,6 +1,7 @@ import axios from "@/config/axios"; import type { AddTicketType, + ConvertToOrderItemType, CreateFinalOrderType, OrderDetailResponseType, OrderItemResponseType, @@ -82,3 +83,8 @@ export const getOrderItem = async (itemId?: number) => { ); return data; }; + +export const converToOrder = async (params: ConvertToOrderItemType) => { + const { data } = await axios.post(`/admin/orders`, params); + return data; +}; diff --git a/src/pages/order/types/Types.ts b/src/pages/order/types/Types.ts index bd14874..5cd3cd7 100644 --- a/src/pages/order/types/Types.ts +++ b/src/pages/order/types/Types.ts @@ -178,11 +178,11 @@ export interface CreateFinalOrderType extends CreateBaseOrderType { } export type ConvertToOrderItemType = { - userId: string; invoiceItemId: string; + productId?: string; + userId?: string; typeId: string; estimatedDays: number; - productId: string; title: string; attachments: string[]; }; diff --git a/src/router/MainRouter.tsx b/src/router/MainRouter.tsx index d73ce0a..f8d0d20 100644 --- a/src/router/MainRouter.tsx +++ b/src/router/MainRouter.tsx @@ -88,7 +88,7 @@ const MainRouter: FC = () => { } /> } /> } /> - } /> + } /> } /> } />