diff --git a/src/langs/fa.json b/src/langs/fa.json index 314ee6c..dff0a88 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -201,7 +201,27 @@ "date_factor": "تاریخ صدور فاکتور", "due_date": "تاریخ سررسید فاکتور", "factor_number": "شماره فاکتور", - "status_factor": "وضعیت فاکتور" + "status_factor": "وضعیت فاکتور", + "customer": "مشتری", + "receipt_information": "اطلاعات صورتحساب", + "number": "شماره", + "product_name": "نام کالا", + "count": "تعداد", + "unit_amount": "مبلغ واحد", + "discount": "تخفیف(٪)", + "total_amount": "مبلغ کل(ریال)", + "tax": "مالیات بر ارزش افزوده (۰.۹ درصد)", + "total": "جمع", + "error_empty": "همه فیلد ها را پر کنید", + "date_receipt": "تاریخ صورتحساب", + "last_date_receipt": "آخرین مهلت پرداخت", + "service": "سرویس", + "status": "وضعیت تایید", + "status_paid": "وضعیت پرداخت", + "PENDING": "در انتظار", + "PAID": "پرداخت شده", + "CANCELED": "لغو شده", + "EXPIRED": "منقضی شده" }, "edit": "ویرایش", "transaction": { diff --git a/src/pages/profile/Profile.tsx b/src/pages/profile/Profile.tsx index c1af689..fe553c8 100644 --- a/src/pages/profile/Profile.tsx +++ b/src/pages/profile/Profile.tsx @@ -2,7 +2,7 @@ import { FC, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import AvatarImage from '../../assets/images/avatar_image.png' import Button from '../../components/Button' -import { DocumentUpload, Edit } from 'iconsax-react' +import { DocumentUpload, Edit, TickCircle } from 'iconsax-react' import Input from '../../components/Input' import DatePickerComponent from '../../components/DatePicker' import Select from '../../components/Select' @@ -258,16 +258,25 @@ const Profile: FC = () => { error_text={formik.touched.userAddress && formik.errors.userAddress ? formik.errors.userAddress : ''} /> + +
+ +
+ -
-
+
diff --git a/src/pages/receipts/Detail.tsx b/src/pages/receipts/Detail.tsx index 9b38620..e1739de 100644 --- a/src/pages/receipts/Detail.tsx +++ b/src/pages/receipts/Detail.tsx @@ -3,10 +3,14 @@ import { useTranslation } from 'react-i18next' import { Edit } from 'iconsax-react' import StatusCircle from '../../components/StatusCircle' import SamanImage from '../../assets/images/saman.png' +import { useParams } from 'react-router-dom' +import { useGetInvoiceDetail } from './hooks/useReceiptData' const ReceiptsDetail: FC = () => { + const { id } = useParams() const { t } = useTranslation('global') + const getInvoce = useGetInvoiceDetail(id ? id : '') return (
diff --git a/src/pages/receipts/List.tsx b/src/pages/receipts/List.tsx index 5c08b04..79fcfda 100644 --- a/src/pages/receipts/List.tsx +++ b/src/pages/receipts/List.tsx @@ -1,15 +1,21 @@ import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import Tabs from '../../components/Tabs' -import { Calendar, CloseCircle, Eye, FolderOpen, MoneyChange, WalletCheck, WalletRemove, WalletSearch } from 'iconsax-react' +import { CloseCircle, Eye, FolderOpen, WalletCheck, WalletRemove } from 'iconsax-react' import Td from '../../components/Td' import { Link } from 'react-router-dom' import { Pages } from '../../config/Pages' +import { useGetInvoices } from './hooks/useReceiptData' +import PageLoading from '../../components/PageLoading' +import { NumberFormat } from '../../config/func' +import { ReceiptItemType } from './types/ReceiptTypes' +import moment from 'moment-jalaali' const ReceiptsList: FC = () => { const { t } = useTranslation('global') - const [activeTab, setActiveTab] = useState('unpaid') + const [activeTab, setActiveTab] = useState<"PENDING" | "PAID" | "CANCELED" | "EXPIRED">('PENDING') + const getInvoices = useGetInvoices(activeTab) return (
@@ -22,87 +28,97 @@ const ReceiptsList: FC = () => { active={activeTab} items={[ { - icon: , + icon: , label: t('receip.dont_pay'), - value: 'unpaid' + value: 'PENDING' }, { - icon: , - label: t('receip.dont_confrim'), - value: 'not_confimed' - }, - { - icon: , + icon: , label: t('receip.paid'), - value: 'paid' + value: 'PAID' }, { - icon: , + icon: , label: t('receip.canceled'), - value: 'canceled' + value: 'CANCELED' }, { - icon: , - label: t('receip.returned'), - value: 'returned' - }, - { - icon: , - label: t('receip.its_time'), - value: 'time' - }, - { - icon: , + icon: , label: t('receip.archive'), - value: 'archive' + value: 'EXPIRED' }, ]} - onChange={setActiveTab} + onChange={(value) => setActiveTab(value as "PENDING" | "PAID" | "CANCELED" | "EXPIRED")} />
-
- - - - - - - - - - - - -
- - - - - - - -
- - - - - - - - - - -
- - - - - - - -
-
+ { + getInvoices.isPending ? +
+ +
+ : +
+ + + + + + + { + getInvoices.data?.data?.invoices?.map((item: ReceiptItemType, index: number) => { + return ( + + + + + + + + ) + }) + } + + +
+ {/* */} + + + + + + + +
+ {/* */} + +
+ {moment(item.createdAt).format('jYYYY-jMM-jDD HH:mm')} +
+
+
+ {moment(item.dueDate).format('jYYYY-jMM-jDD HH:mm')} +
+
+ +
+ { + item.items.map((item => { + return ( +
{item.name} ({item.count})
+ ) + })) + } +
+
+ + + + + +
+
+ }
) } diff --git a/src/pages/receipts/hooks/useReceiptData.ts b/src/pages/receipts/hooks/useReceiptData.ts new file mode 100644 index 0000000..8608b27 --- /dev/null +++ b/src/pages/receipts/hooks/useReceiptData.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import * as api from "../service/ReceiptService"; + +export const useGetInvoices = (status: string) => { + return useQuery({ + queryKey: ["invoices", status], + queryFn: () => api.getInvoice(status), + }); +}; + +export const useGetInvoiceDetail = (id: string) => { + return useQuery({ + queryKey: ["invoice", id], + queryFn: () => api.getInvoiceDetail(id), + enabled: !!id, + }); +}; diff --git a/src/pages/receipts/service/ReceiptService.ts b/src/pages/receipts/service/ReceiptService.ts new file mode 100644 index 0000000..e8f6a2e --- /dev/null +++ b/src/pages/receipts/service/ReceiptService.ts @@ -0,0 +1,11 @@ +import axios from "../../../config/axios"; + +export const getInvoice = async (status: string) => { + const { data } = await axios.get(`/invoices/user?status=${status}`); + return data; +}; + +export const getInvoiceDetail = async (id: string) => { + const { data } = await axios.get(`/invoices/${id}`); + return data; +}; diff --git a/src/pages/receipts/types/ReceiptTypes.ts b/src/pages/receipts/types/ReceiptTypes.ts new file mode 100644 index 0000000..b9962cd --- /dev/null +++ b/src/pages/receipts/types/ReceiptTypes.ts @@ -0,0 +1,19 @@ +export type ReceiptItemType = { + id: string; + createdAt: string; + updatedAt: string; + name: string; + count: string | number; + unitPrice: string | number; + discount: string | number; + totalPrice: number; + subscriptionPlan?: string | null; + items: ReceiptItemType[]; + user: { + firstName: string; + lastName: string; + }; + dueDate: string; + status: "PENDING" | "PAID" | "CANCELED" | "EXPIRED"; + paidAt: string; +};