import { ChangeEvent, FC, Fragment, useState } from 'react' import { useTranslation } from 'react-i18next' import Button from '../../components/Button' import { Add, TickCircle, TickSquare, Trash } from 'iconsax-react' import Select from '../../components/Select' import Input from '../../components/Input' import { CreateReceiptType, ReceiptCreateItemsType } from './types/ReceiptTypes' import { useFormik } from 'formik' import * as Yup from 'yup' import { toast } from 'react-toastify' import PageLoading from '../../components/PageLoading' import { useCreateInvoice } from './hooks/useReceiptData' import { useNavigate } from 'react-router-dom' import { Pages } from '../../config/Pages' import { ErrorType } from '../../helpers/types' import { ReceiptTypeEnum } from './enum/ReceipEnum' import SwitchComponent from '../../components/Switch' import { useGetCompanies } from '../company/hooks/useCompanyData' import { CompanyItemType } from '../company/types/CompanyTypes' import moment from 'moment-jalaali' const CreateReceipt: FC = () => { const navigate = useNavigate() const { t } = useTranslation('global') const [items, setItems] = useState([]) const [customer, setCustomer] = useState() const [isRecurring, setIsRecurring] = useState(false) const [type, setType] = useState(ReceiptTypeEnum.DAILY) const [maxRecurringCycles, setMaxRecurringCycles] = useState(0) const getCustomers = useGetCompanies(1) const createInvoice = useCreateInvoice() const formik = useFormik({ initialValues: { name: '', count: '', unitPrice: '', discount: '' }, validationSchema: Yup.object({ name: Yup.string().required(t('errors.required')), count: Yup.string().required(t('errors.required')), unitPrice: Yup.string().required(t('errors.required')), }), onSubmit: (values) => { setItems((prev) => [...prev, { count: +values.count, discount: +values.discount, name: values.name, unitPrice: +values.unitPrice }]) formik.resetForm() } }) const handleChangeCustomer = (e: ChangeEvent) => { const value = e.target.value const customer = getCustomers.data?.data?.companies?.find((item: CompanyItemType) => item.id === value) setCustomer(customer) } const handleSubmit = () => { if (customer) { const params: CreateReceiptType = { companyId: customer?.id, items: items, isRecurring: isRecurring, recurringPeriod: isRecurring ? +type : undefined, maxRecurringCycles: isRecurring ? maxRecurringCycles : undefined } createInvoice.mutate(params, { onSuccess: () => { toast.success(t('success')) navigate(Pages.receipts.index) }, onError(error: ErrorType) { toast.error(error.response?.data?.error.message[0]) }, }) } } const handleRemove = (index: number) => { setItems((prev) => prev.filter((_, i) => i !== index)) } return (
{ getCustomers.isPending ? :
{t('receip.add_receip')}
{/*
{t('receip.customer_information')}
*/}
{ return { label: t(`receip.${item}`), value: item } })} onChange={(e) => setType(e.target.value as ReceiptTypeEnum)} /> setMaxRecurringCycles(+e.target.value)} />
}
{t('receip.receipt_information')}
{t('receip.number')}
{items.length + 1}
{t('receip.product_name')}
{t('receip.count')}
{t('receip.unit_amount')}
formik.setFieldValue('unitPrice', e.target.value)} seprator />
{t('receip.discount')}
{t('receip.total_amount')}
{ if (formik.errors.name || formik.errors.count || formik.errors.unitPrice || formik.errors.discount) { toast.error(t('receip.error_empty')) } else { formik.handleSubmit() } }} className='size-10 border border-border rounded-xl flex justify-center items-center'>
{ items.map((item, index: number) => { return (
{ index === 0 &&
{t('receip.number')}
}
{index + 1}
{ index === 0 &&
{t('receip.product_name')}
}
{ index === 0 &&
{t('receip.count')}
}
{ index === 0 &&
{t('receip.unit_amount')}
}
{ index === 0 &&
{t('receip.discount')}
}
{ index === 0 &&
{t('receip.total_amount')}
}
handleRemove(index)} className='size-10 border border-border rounded-xl flex justify-center items-center'>
) }) }
{t('receip.tax')}
{((items.reduce((acc, item) => acc + (Number(item.unitPrice) || 0) * (Number(item.count) || 0) - (Number(item.unitPrice) || 0) * (Number(item.count) || 0) * (Number(item.discount) / 100 || 0), 0)) * 0.10).toFixed(1)}
{t('receip.total')}
{( items.reduce((acc, item) => acc + (Number(item.unitPrice) || 0) * (Number(item.count) || 0) - (Number(item.unitPrice) || 0) * (Number(item.count) || 0) * (Number(item.discount) / 100 || 0), 0) * 1.10 ).toFixed(1)}
{t('ticket.title_hint')}
سوالات - مشکلاتی که به یک موضوع مربوط میشوند را در یک درخواست پشتیبانی پیگیر باشید و چند درخواست برای یک موضوع باز نکنید.
لطفاً برای بررسی و رفع مشکلات احتمالی صبور باشید بررسی و رفع مشکلات در برخی موارد زمان گیر است.
پاسخگویی 24 ساعته تلفنی را تنها از میهن وب هاست می توانید انتظار داشته باشید .بخش پشتیبانی در هر ساعتی حتی در روز های تعطیل آماده پیگیری سریع مشکلات کاربران است.
}
) } export default CreateReceipt