Create order
This commit is contained in:
@@ -91,5 +91,5 @@ export const Paths = {
|
|||||||
update: '/print/update/',
|
update: '/print/update/',
|
||||||
form: '/print/form/',
|
form: '/print/form/',
|
||||||
},
|
},
|
||||||
convertToOrder: '/convert-to-order/',
|
convertToOrder: '/convert-to-order',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ const InvoiceItemRow: FC<Props> = ({
|
|||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{item.id && (
|
{item.id && (
|
||||||
<Link to={Paths.convertToOrder + '/' + item.id}>
|
<Link to={Paths.convertToOrder + '?invoiceItemId=' + item.id}>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={onConvertToOrder}
|
onClick={onConvertToOrder}
|
||||||
|
|||||||
@@ -5,40 +5,49 @@ import Input from '@/components/Input'
|
|||||||
import Select from '@/components/Select'
|
import Select from '@/components/Select'
|
||||||
import UploadBox from '@/components/UploadBox'
|
import UploadBox from '@/components/UploadBox'
|
||||||
import Button from '@/components/Button'
|
import Button from '@/components/Button'
|
||||||
import { useGetUsers } from '../user/hooks/useUserData'
|
|
||||||
import { useGetProducts } from './hooks/useOrderData'
|
|
||||||
import { useMultiUpload } from '@/pages/uploader/hooks/useUploader'
|
import { useMultiUpload } from '@/pages/uploader/hooks/useUploader'
|
||||||
import { OrderStatusEnum } from './enum/OrderEnum'
|
|
||||||
import type { ConvertToOrderItemType } from './types/Types'
|
import type { ConvertToOrderItemType } from './types/Types'
|
||||||
|
import { useConverToOrder, useGetProducts } from './hooks/useOrderData'
|
||||||
|
import { useGetCategory } from '@/pages/product/hooks/useProductData'
|
||||||
|
import { useGetUsers } from '@/pages/user/hooks/useUserData'
|
||||||
|
import { useSearchParams } from 'react-router-dom'
|
||||||
|
|
||||||
const initialValues: ConvertToOrderItemType = {
|
const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType => ({
|
||||||
|
invoiceItemId: invoiceItemId ?? '',
|
||||||
|
productId: '',
|
||||||
userId: '',
|
userId: '',
|
||||||
invoiceItemId: '',
|
|
||||||
typeId: '',
|
typeId: '',
|
||||||
estimatedDays: 0,
|
estimatedDays: 0,
|
||||||
productId: '',
|
|
||||||
title: '',
|
title: '',
|
||||||
attachments: [],
|
attachments: [],
|
||||||
}
|
})
|
||||||
|
|
||||||
const validationSchema = Yup.object({
|
const getValidationSchema = (invoiceItemId: string | null) =>
|
||||||
userId: Yup.string().required('انتخاب کاربر اجباری است.'),
|
Yup.object({
|
||||||
invoiceItemId: Yup.string(),
|
invoiceItemId: Yup.string(),
|
||||||
|
productId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب محصول اجباری است.'),
|
||||||
|
userId: invoiceItemId ? Yup.string() : Yup.string().required('انتخاب کاربر اجباری است.'),
|
||||||
typeId: Yup.string().required('انتخاب نوع اجباری است.'),
|
typeId: Yup.string().required('انتخاب نوع اجباری است.'),
|
||||||
estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'),
|
estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'),
|
||||||
productId: Yup.string().required('انتخاب محصول اجباری است.'),
|
|
||||||
title: Yup.string().required('عنوان اجباری است.'),
|
title: Yup.string().required('عنوان اجباری است.'),
|
||||||
})
|
})
|
||||||
|
|
||||||
const ConvertToOrders: FC = () => {
|
const ConvertToOrders: FC = () => {
|
||||||
const { data: users } = useGetUsers()
|
|
||||||
const { data: products } = useGetProducts()
|
const [searchParams] = useSearchParams()
|
||||||
|
const invoiceItemId = searchParams.get('invoiceItemId')
|
||||||
const multiUpload = useMultiUpload()
|
const multiUpload = useMultiUpload()
|
||||||
const [attachmentFiles, setAttachmentFiles] = useState<File[]>([])
|
const [attachmentFiles, setAttachmentFiles] = useState<File[]>([])
|
||||||
|
const { data: categories } = useGetCategory()
|
||||||
|
const { data: users } = useGetUsers()
|
||||||
|
const { data: products } = useGetProducts()
|
||||||
|
|
||||||
|
const { mutate: converToOrder, isPending } = useConverToOrder()
|
||||||
|
|
||||||
const formik = useFormik<ConvertToOrderItemType>({
|
const formik = useFormik<ConvertToOrderItemType>({
|
||||||
initialValues,
|
initialValues: getInitialValues(invoiceItemId),
|
||||||
validationSchema,
|
validationSchema: getValidationSchema(invoiceItemId),
|
||||||
|
enableReinitialize: true,
|
||||||
onSubmit: async (values) => {
|
onSubmit: async (values) => {
|
||||||
const attachments: string[] = [...values.attachments]
|
const attachments: string[] = [...values.attachments]
|
||||||
|
|
||||||
@@ -51,12 +60,14 @@ const ConvertToOrders: FC = () => {
|
|||||||
|
|
||||||
const payload: ConvertToOrderItemType = {
|
const payload: ConvertToOrderItemType = {
|
||||||
...values,
|
...values,
|
||||||
|
invoiceItemId: invoiceItemId ?? values.invoiceItemId ?? '',
|
||||||
|
productId: invoiceItemId ? undefined : values.productId,
|
||||||
|
userId: invoiceItemId ? undefined : values.userId,
|
||||||
estimatedDays: Number(values.estimatedDays),
|
estimatedDays: Number(values.estimatedDays),
|
||||||
attachments,
|
attachments,
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Submit:', payload)
|
await converToOrder(payload)
|
||||||
// TODO: call API
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -69,11 +80,12 @@ const ConvertToOrders: FC = () => {
|
|||||||
onSubmit={formik.handleSubmit}
|
onSubmit={formik.handleSubmit}
|
||||||
className="space-y-6"
|
className="space-y-6"
|
||||||
>
|
>
|
||||||
|
{!invoiceItemId && (
|
||||||
<div className="rowTwoInput">
|
<div className="rowTwoInput">
|
||||||
<Select
|
<Select
|
||||||
items={
|
items={
|
||||||
users?.data?.map((item) => ({
|
users?.data?.map((item) => ({
|
||||||
label: item.firstName && item.lastName ? `${item.firstName} ${item.lastName}` : item.phone,
|
label: item.firstName ? `${item.firstName} ${item.lastName}` : item.phone,
|
||||||
value: item.id,
|
value: item.id,
|
||||||
})) ?? []
|
})) ?? []
|
||||||
}
|
}
|
||||||
@@ -84,39 +96,34 @@ const ConvertToOrders: FC = () => {
|
|||||||
formik.touched.userId && formik.errors.userId ? formik.errors.userId : ''
|
formik.touched.userId && formik.errors.userId ? formik.errors.userId : ''
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Select
|
<Select
|
||||||
items={
|
items={
|
||||||
products?.data?.map((item) => ({
|
products?.data?.map((item) => ({
|
||||||
label: item.title,
|
label: item.title,
|
||||||
value: item.id,
|
value: String(item.id),
|
||||||
})) ?? []
|
})) ?? []
|
||||||
}
|
}
|
||||||
label="محصول"
|
label="محصول"
|
||||||
placeholder="انتخاب محصول"
|
placeholder="انتخاب محصول"
|
||||||
{...formik.getFieldProps('productId')}
|
{...formik.getFieldProps('productId')}
|
||||||
error_text={
|
error_text={
|
||||||
formik.touched.productId && formik.errors.productId ? formik.errors.productId : ''
|
formik.touched.productId && formik.errors.productId
|
||||||
}
|
? formik.errors.productId
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="rowTwoInput">
|
|
||||||
<Input
|
|
||||||
label="شناسه آیتم فاکتور"
|
|
||||||
{...formik.getFieldProps('invoiceItemId')}
|
|
||||||
error_text={
|
|
||||||
formik.touched.invoiceItemId && formik.errors.invoiceItemId
|
|
||||||
? formik.errors.invoiceItemId
|
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="rowTwoInput">
|
||||||
|
|
||||||
<Select
|
<Select
|
||||||
items={Object.values(OrderStatusEnum).map((item) => ({
|
items={
|
||||||
label: item,
|
categories?.data?.map((item) => ({
|
||||||
value: item,
|
label: item.title,
|
||||||
}))}
|
value: String(item.id),
|
||||||
|
})) ?? []
|
||||||
|
}
|
||||||
label="نوع"
|
label="نوع"
|
||||||
placeholder="انتخاب نوع"
|
placeholder="انتخاب نوع"
|
||||||
{...formik.getFieldProps('typeId')}
|
{...formik.getFieldProps('typeId')}
|
||||||
@@ -156,7 +163,7 @@ const ConvertToOrders: FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<Button type="submit" isLoading={multiUpload.isPending}>
|
<Button type="submit" isLoading={multiUpload.isPending || isPending}>
|
||||||
ثبت
|
ثبت
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -57,6 +57,12 @@ export const useCreateOrder = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useConverToOrder = () => {
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: api.converToOrder,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const useUpdateOrder = () => {
|
export const useUpdateOrder = () => {
|
||||||
return useMutation({
|
return useMutation({
|
||||||
mutationFn: ({
|
mutationFn: ({
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import axios from "@/config/axios";
|
import axios from "@/config/axios";
|
||||||
import type {
|
import type {
|
||||||
AddTicketType,
|
AddTicketType,
|
||||||
|
ConvertToOrderItemType,
|
||||||
CreateFinalOrderType,
|
CreateFinalOrderType,
|
||||||
OrderDetailResponseType,
|
OrderDetailResponseType,
|
||||||
OrderItemResponseType,
|
OrderItemResponseType,
|
||||||
@@ -82,3 +83,8 @@ export const getOrderItem = async (itemId?: number) => {
|
|||||||
);
|
);
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const converToOrder = async (params: ConvertToOrderItemType) => {
|
||||||
|
const { data } = await axios.post(`/admin/orders`, params);
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|||||||
@@ -178,11 +178,11 @@ export interface CreateFinalOrderType extends CreateBaseOrderType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type ConvertToOrderItemType = {
|
export type ConvertToOrderItemType = {
|
||||||
userId: string;
|
|
||||||
invoiceItemId: string;
|
invoiceItemId: string;
|
||||||
|
productId?: string;
|
||||||
|
userId?: string;
|
||||||
typeId: string;
|
typeId: string;
|
||||||
estimatedDays: number;
|
estimatedDays: number;
|
||||||
productId: string;
|
|
||||||
title: string;
|
title: string;
|
||||||
attachments: string[];
|
attachments: string[];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ const MainRouter: FC = () => {
|
|||||||
<Route path={Paths.order.details + ":id"} element={<OrderDetail />} />
|
<Route path={Paths.order.details + ":id"} element={<OrderDetail />} />
|
||||||
<Route path={Paths.order.create} element={<NewOrder />} />
|
<Route path={Paths.order.create} element={<NewOrder />} />
|
||||||
<Route path={Paths.order.edit + ":id"} element={<EditOrder />} />
|
<Route path={Paths.order.edit + ":id"} element={<EditOrder />} />
|
||||||
<Route path={Paths.convertToOrder + ":id"} element={<ConvertToOrders />} />
|
<Route path={Paths.convertToOrder} element={<ConvertToOrders />} />
|
||||||
|
|
||||||
<Route path={Paths.print.list} element={<SectionList />} />
|
<Route path={Paths.print.list} element={<SectionList />} />
|
||||||
<Route path={Paths.print.create} element={<CreateSection />} />
|
<Route path={Paths.print.create} element={<CreateSection />} />
|
||||||
|
|||||||
Reference in New Issue
Block a user