From a939d3bb4cf6b9f5588b655e04b37b6d1d738d40 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Tue, 17 Feb 2026 11:12:25 +0330 Subject: [PATCH] bills --- src/config/Pages.ts | 3 +- src/langs/fa.json | 10 ++++ src/pages/bill/List.tsx | 74 ++++++++++++++++++++++++ src/pages/bill/hooks/useBillData.ts | 9 ++- src/pages/bill/service/Service.ts | 5 ++ src/pages/bill/types/Types.ts | 10 ++++ src/router/Main.tsx | 2 + src/shared/components/ReceiptSubMenu.tsx | 12 ++-- 8 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 src/pages/bill/List.tsx diff --git a/src/config/Pages.ts b/src/config/Pages.ts index d40cff2..a352eb1 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -125,7 +125,6 @@ export const Pages = { bill: { createBillWater: "/receipts/bill/water/create", createBillCharge: "/receipts/bill/charge/create", - ListBillWater: "/receipts/bill/water/list", - ListBillCharge: "/receipts/bill/charge/list", + list: "/receipts/bills/list", }, }; diff --git a/src/langs/fa.json b/src/langs/fa.json index 1c2837e..2fca96f 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -861,6 +861,16 @@ "register_date": "تاریخ ثبت نام", "company": "شرکت" }, + "bill": { + "list": "لیست قبض‌ها", + "row": "ردیف", + "created_at": "تاریخ ایجاد", + "type": "نوع", + "business": "کسب‌وکار", + "invoice_count": "تعداد صورتحساب", + "water_bill": "قبض آب", + "monthly_charge": "شارژ ماهانه" + }, "request": { "request_list": "لیست درخواست ها", "details": "جزئیات درخواست", diff --git a/src/pages/bill/List.tsx b/src/pages/bill/List.tsx new file mode 100644 index 0000000..7c8f278 --- /dev/null +++ b/src/pages/bill/List.tsx @@ -0,0 +1,74 @@ +import { FC, Fragment, useState } from 'react' +import { useGetBills } from './hooks/useBillData' +import Td from '../../components/Td' +import PageLoading from '../../components/PageLoading' +import { BillItemType } from './types/Types' +import moment from 'moment-jalaali' +import Pagination from '../../components/Pagination' +import { useTranslation } from 'react-i18next' +import { Link } from 'react-router-dom' +import { Pages } from '../../config/Pages' +import { Eye } from 'iconsax-react' + +const BillsList: FC = () => { + const { t } = useTranslation('global') + const [page, setPage] = useState(1) + const { data, isLoading } = useGetBills(page) + + const getBillTypeLabel = (type: BillItemType['type']) => { + return type === 'water_bill' ? t('bill.water_bill') : t('bill.monthly_charge') + } + + return ( +
+
{t('bill.list')}
+ {isLoading ? ( + + ) : ( + +
+ + + + + + + {data?.data?.bills?.map((item: BillItemType, index: number) => ( + + + + + ))} + +
+ + + + +
+ + + + + {item.invoiceCount} + + + + + +
+
+
+ +
+
+ )} +
+ ) +} + +export default BillsList diff --git a/src/pages/bill/hooks/useBillData.ts b/src/pages/bill/hooks/useBillData.ts index c96738f..42d531c 100644 --- a/src/pages/bill/hooks/useBillData.ts +++ b/src/pages/bill/hooks/useBillData.ts @@ -1,4 +1,4 @@ -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import * as api from "../service/Service"; export const useCreateBill = () => { @@ -12,3 +12,10 @@ export const useCreateCharge = () => { mutationFn: api.createChargeBill, }); }; + +export const useGetBills = (page: number = 1) => { + return useQuery({ + queryKey: ["bills", page], + queryFn: () => api.getBills(page), + }); +}; diff --git a/src/pages/bill/service/Service.ts b/src/pages/bill/service/Service.ts index 28f8ffa..e986ae9 100644 --- a/src/pages/bill/service/Service.ts +++ b/src/pages/bill/service/Service.ts @@ -10,3 +10,8 @@ export const createChargeBill = async (params: CreateBillChargeType) => { const { data } = await axios.post("/bills/charge", params); return data; }; + +export const getBills = async (page: number = 1) => { + const { data } = await axios.get(`/bills?page=${page}`); + return data; +}; diff --git a/src/pages/bill/types/Types.ts b/src/pages/bill/types/Types.ts index bbaf393..41ba09c 100644 --- a/src/pages/bill/types/Types.ts +++ b/src/pages/bill/types/Types.ts @@ -11,3 +11,13 @@ export type CreateBillChargeType = { chargeRate: number; dueDays: number; }; + +export type BillItemType = { + id: string; + createdAt: string; + updatedAt: string; + deletedAt: string | null; + type: 'water_bill' | 'monthly_charge'; + business: string; + invoiceCount: number; +}; diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 715f731..2a159c8 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -57,6 +57,7 @@ import UpdateSlider from '../pages/slider/Update' import CreateSlider from '../pages/slider/Create' import CreateBill from '../pages/bill/Create' import CreateCharge from '../pages/bill/CreateCharge' +import BillsList from '../pages/bill/List' const MainRouter: FC = () => { const { hasSubMenu } = useSharedStore() @@ -128,6 +129,7 @@ const MainRouter: FC = () => { } /> } /> + } /> diff --git a/src/shared/components/ReceiptSubMenu.tsx b/src/shared/components/ReceiptSubMenu.tsx index 40bdff4..300d3ee 100644 --- a/src/shared/components/ReceiptSubMenu.tsx +++ b/src/shared/components/ReceiptSubMenu.tsx @@ -30,7 +30,7 @@ const ReceiptSubMenu: FC = () => {
{ @@ -51,11 +51,11 @@ const ReceiptSubMenu: FC = () => { link={Pages.bill.createBillCharge} /> - {/* */} + isActive={isActive('bills/list')} + link={Pages.bill.list} + />
)