This commit is contained in:
hamid zarghami
2025-05-18 15:03:19 +03:30
parent 1934db0b4e
commit a1531b121a
4 changed files with 40 additions and 20 deletions
+5 -5
View File
@@ -1,9 +1,9 @@
VITE_TOKEN_NAME = 'dsc_token' VITE_TOKEN_NAME = 'dsc_token'
VITE_REFRESH_TOKEN_NAME = 'dsc_refresh_token' VITE_REFRESH_TOKEN_NAME = 'dsc_refresh_token'
VITE_BASE_URL = 'http://192.168.1.113:4001' # VITE_BASE_URL = 'http://192.168.1.113:4001'
# VITE_BASE_URL = 'https://danak-zone-api.dev.danakcorp.com' VITE_BASE_URL = 'https://api-dzone.danakcorp.com'
VITE_DANAK_BASE_URL ='http://192.168.1.113:4000' # VITE_DANAK_BASE_URL ='http://192.168.1.113:4000'
VITE_SERVICE_ID = '7e3c2f08-b7e7-4402-ae5f-fea99cff56bd' VITE_SERVICE_ID = '7e3c2f08-b7e7-4402-ae5f-fea99cff56bd'
VITE_WORKSPACE_ID = 'workspace_id' VITE_WORKSPACE_ID = 'workspace_id'
# VITE_LOGIN_URL = 'https://console.danakcorp.com/auth/login' VITE_LOGIN_URL = 'https://console.danakcorp.com/auth/login'
VITE_LOGIN_URL = 'http://localhost:5174/auth/login' # VITE_LOGIN_URL = 'http://localhost:5174/auth/login'
+5 -2
View File
@@ -467,7 +467,7 @@
"error_empty": "همه فیلد ها را پر کنید", "error_empty": "همه فیلد ها را پر کنید",
"date_receipt": "تاریخ صورتحساب", "date_receipt": "تاریخ صورتحساب",
"last_date_receipt": "آخرین مهلت پرداخت", "last_date_receipt": "آخرین مهلت پرداخت",
"service": "سرویس", "service": "خدمت",
"status": "وضعیت تایید", "status": "وضعیت تایید",
"status_paid": "وضعیت پرداخت", "status_paid": "وضعیت پرداخت",
"PENDING": "در انتظار", "PENDING": "در انتظار",
@@ -487,7 +487,10 @@
"4": "چهارماهه", "4": "چهارماهه",
"5": "سالانه", "5": "سالانه",
"maxRecurringCycles": "حداکثر تعداد تکرار دوره", "maxRecurringCycles": "حداکثر تعداد تکرار دوره",
"WAIT_PAYMENT": "در انتظار پرداخت" "WAIT_PAYMENT": "در انتظار پرداخت",
"overdue": "سررسید شده",
"recurringPeriod": "دوره ای",
"lateFee": "جریمه"
}, },
"edit": "ویرایش", "edit": "ویرایش",
"transaction": { "transaction": {
+22 -13
View File
@@ -1,11 +1,11 @@
import { FC, useEffect, useState } from 'react' import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Tabs from '../../components/Tabs' import Tabs from '../../components/Tabs'
import { CloseCircle, FolderOpen, WalletCheck, WalletRemove, WalletSearch } from 'iconsax-react' import { FolderOpen, WalletCheck, WalletRemove, WalletSearch, WalletMinus } from 'iconsax-react'
import Td from '../../components/Td' import Td from '../../components/Td'
import { useGetInvoices } from './hooks/useReceiptData' import { useGetInvoices } from './hooks/useReceiptData'
import PageLoading from '../../components/PageLoading' import PageLoading from '../../components/PageLoading'
import { ReceiptItemType } from './types/ReceiptTypes' import { InvoiceStatus, ReceiptItemType } from './types/ReceiptTypes'
import { NumberFormat } from '../../config/func' import { NumberFormat } from '../../config/func'
import Select from '../../components/Select' import Select from '../../components/Select'
import Input from '../../components/Input' import Input from '../../components/Input'
@@ -13,14 +13,15 @@ import DatePickerComponent from '../../components/DatePicker'
import { useSearchParams } from 'react-router-dom' import { useSearchParams } from 'react-router-dom'
import moment from 'moment-jalaali' import moment from 'moment-jalaali'
import { CompanyItemType } from '../company/types/CompanyTypes' import { CompanyItemType } from '../company/types/CompanyTypes'
import Pagination from '../../components/Pagination'
type ActiveTabType = "PENDING" | "WAIT_PAYMENT" | "PAID" | "CANCELLED" | "EXPIRED" | ""
const ReceiptsList: FC = () => { const ReceiptsList: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const [page, setPage] = useState<number>(1)
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const [activeTab, setActiveTab] = useState<ActiveTabType>('PENDING') const [activeTab, setActiveTab] = useState<InvoiceStatus>('PENDING')
const [customerId, setCustomerId] = useState<string>('') const [customerId, setCustomerId] = useState<string>('')
const [search, setSearch] = useState<string>('') const [search, setSearch] = useState<string>('')
const [date, setDate] = useState<string>('') const [date, setDate] = useState<string>('')
@@ -31,7 +32,7 @@ const ReceiptsList: FC = () => {
const urlCustomerId = searchParams.get('user') const urlCustomerId = searchParams.get('user')
if (urlCustomerId) { if (urlCustomerId) {
setCustomerId(urlCustomerId) setCustomerId(urlCustomerId)
setActiveTab('') setActiveTab('PENDING')
} }
}, [searchParams]) }, [searchParams])
@@ -102,17 +103,17 @@ const ReceiptsList: FC = () => {
value: 'PAID' value: 'PAID'
}, },
{ {
icon: <CloseCircle color={activeTab === 'CANCELLED' ? 'black' : '#8C90A3'} size={22} />, icon: <FolderOpen color={activeTab === 'ARCHIVED' ? 'black' : '#8C90A3'} size={22} />,
label: t('receip.canceled'), label: t('receip.archive'),
value: 'CANCELLED' value: 'ARCHIVED'
}, },
{ {
icon: <FolderOpen color={activeTab === 'EXPIRED' ? 'black' : '#8C90A3'} size={22} />, icon: <WalletMinus color={activeTab === 'OVERDUE' ? 'black' : '#8C90A3'} size={22} />,
label: t('receip.archive'), label: t('receip.overdue'),
value: 'EXPIRED' value: 'OVERDUE'
}, },
]} ]}
onChange={(value) => setActiveTab(value as ActiveTabType)} onChange={(value) => setActiveTab(value as InvoiceStatus)}
/> />
</div> </div>
@@ -131,6 +132,7 @@ const ReceiptsList: FC = () => {
<Td text={t('receip.date_receipt')} /> <Td text={t('receip.date_receipt')} />
<Td text={t('receip.last_date_receipt')} /> <Td text={t('receip.last_date_receipt')} />
<Td text={t('receip.total')} /> <Td text={t('receip.total')} />
<Td text={t('receip.lateFee')} />
<Td text={t('receip.service')} /> <Td text={t('receip.service')} />
<Td text={t('receip.status')} /> <Td text={t('receip.status')} />
<Td text={t('receip.status_paid')} /> <Td text={t('receip.status_paid')} />
@@ -149,7 +151,8 @@ const ReceiptsList: FC = () => {
<Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} /> <Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} />
<Td text={moment(item.dueDate).format('jYYYY/jMM/jDD')} /> <Td text={moment(item.dueDate).format('jYYYY/jMM/jDD')} />
<Td text={NumberFormat(item.totalPrice)} /> <Td text={NumberFormat(item.totalPrice)} />
<Td text={t('receip.service')} /> <Td text={NumberFormat(item.lateFee)} />
<Td text={item.items[0]?.name} />
<Td text={item.status === 'APPROVED' || item.status === 'PAID' ? t('receip.approved') : t('receip.pending')} /> <Td text={item.status === 'APPROVED' || item.status === 'PAID' ? t('receip.approved') : t('receip.pending')} />
<Td text={t(`receip.${item.status}`)} /> <Td text={t(`receip.${item.status}`)} />
<Td text=''> <Td text=''>
@@ -166,6 +169,12 @@ const ReceiptsList: FC = () => {
</tbody> </tbody>
</table> </table>
<Pagination
totalPages={getInvoices.data?.data?.pager?.totalPages}
currentPage={page}
onPageChange={setPage}
/>
</div> </div>
} }
</div> </div>
+8
View File
@@ -24,6 +24,7 @@ export type ReceiptItemType = {
totalPrice: number; totalPrice: number;
subscriptionPlan?: string | null; subscriptionPlan?: string | null;
items: ReceiptItemType[]; items: ReceiptItemType[];
lateFee: number;
company: { company: {
name: string; name: string;
}; };
@@ -42,3 +43,10 @@ export type InvoiceUserItemType = {
email: string; email: string;
phone: string; phone: string;
}; };
export type InvoiceStatus =
| "PENDING"
| "WAIT_PAYMENT"
| "PAID"
| "ARCHIVED"
| "OVERDUE";