Create order

This commit is contained in:
hamid zarghami
2026-02-22 09:50:36 +03:30
parent 502e8c538f
commit d357a5000b
7 changed files with 164 additions and 145 deletions
+1 -1
View File
@@ -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}
+43 -36
View File
@@ -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>
+6
View File
@@ -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: ({
+6
View File
@@ -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;
};
+2 -2
View File
@@ -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[];
}; };
+1 -1
View File
@@ -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 />} />