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;
+};