From 871daf603663025773515184e308e0e5ca845b8f Mon Sep 17 00:00:00 2001 From: "pramod.mahajan" Date: Mon, 3 Nov 2025 14:48:42 +0530 Subject: [PATCH] added api Get Advance Payment --- .../AdvancePayment/AdvancePaymentList.jsx | 4 +- src/components/Expenses/ExpenseList.jsx | 4 +- src/components/Expenses/ExpenseSkeleton.jsx | 17 +- .../PaymentRequest/ManagePaymentRequest.jsx | 2 +- .../PaymentRequest/PaymentRequestList.jsx | 168 ++++++++++++++++++ .../PaymentRequest/PaymentRequestSchema.js | 0 src/hooks/useExpense.js | 24 ++- .../AdvancePayment/AdvancePaymentPage.jsx | 4 +- .../PaymentRequest/PaymentRequestList.jsx | 150 ---------------- .../PaymentRequest/PaymentRequestPage.jsx | 9 +- src/repositories/ExpsenseRepository.jsx | 13 +- 11 files changed, 214 insertions(+), 181 deletions(-) create mode 100644 src/components/PaymentRequest/PaymentRequestList.jsx rename src/{pages => components}/PaymentRequest/PaymentRequestSchema.js (100%) delete mode 100644 src/pages/PaymentRequest/PaymentRequestList.jsx diff --git a/src/components/AdvancePayment/AdvancePaymentList.jsx b/src/components/AdvancePayment/AdvancePaymentList.jsx index 5f4681d5..4bbe830a 100644 --- a/src/components/AdvancePayment/AdvancePaymentList.jsx +++ b/src/components/AdvancePayment/AdvancePaymentList.jsx @@ -1,6 +1,8 @@ import React from "react"; +import { useExpenseTransactions } from "../../hooks/useExpense"; const AdvancePaymentList = ({ employeeId }) => { + const {data,isError, isLoading,isFetching,error} = useExpenseTransactions(employeeId) const record = { openingBalance: 25000.0, rows: [ @@ -71,7 +73,6 @@ const AdvancePaymentList = ({ employeeId }) => { { id: 20, description: "Closing Balance", credit: 0.0, debit: 0.0 }, ], }; - let currentBalance = record.openingBalance; const rowsWithBalance = record.rows.map((r) => { currentBalance += r.credit - r.debit; @@ -134,6 +135,7 @@ const AdvancePaymentList = ({ employeeId }) => { currency: "INR", }) : (
+ {new Date().toISOString()} Projec Name {row[col.key]}
)} diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index 16159a1c..03b33bb9 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -184,8 +184,8 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText }) => { ), }, ]; - - if (isInitialLoading && !data) return ; + const headers = ["Expense Type","Payment Mode","Submitted By","Submitted","Amount","Status","Action"] + if (isInitialLoading && !data) return ; if (isError) return
{error?.message}
; const grouped = groupBy diff --git a/src/components/Expenses/ExpenseSkeleton.jsx b/src/components/Expenses/ExpenseSkeleton.jsx index dbe1a5d7..6566bbd3 100644 --- a/src/components/Expenses/ExpenseSkeleton.jsx +++ b/src/components/Expenses/ExpenseSkeleton.jsx @@ -143,7 +143,7 @@ const SkeletonCell = ({ /> ); -export const ExpenseTableSkeleton = ({ groups = 3, rowsPerGroup = 3 }) => { +export const ExpenseTableSkeleton = ({ groups = 3, rowsPerGroup = 3, headers }) => { return (
{ > - - - - - - - + ))} + diff --git a/src/components/PaymentRequest/ManagePaymentRequest.jsx b/src/components/PaymentRequest/ManagePaymentRequest.jsx index 1eba646d..31754535 100644 --- a/src/components/PaymentRequest/ManagePaymentRequest.jsx +++ b/src/components/PaymentRequest/ManagePaymentRequest.jsx @@ -5,7 +5,7 @@ import { useForm } from 'react-hook-form'; import { useExpenseType } from '../../hooks/masterHook/useMaster'; import DatePicker from '../common/DatePicker'; import { useCreatePaymentRequest, useUpdatePaymentRequest } from '../../hooks/useExpense'; -import { defaultPaymentRequest, PaymentRequestSchema } from '../../pages/PaymentRequest/PaymentRequestSchema'; +import { defaultPaymentRequest, PaymentRequestSchema } from './PaymentRequestSchema'; import { zodResolver } from '@hookform/resolvers/zod'; import { formatFileSize, localToUtc } from '../../utils/appUtils'; diff --git a/src/components/PaymentRequest/PaymentRequestList.jsx b/src/components/PaymentRequest/PaymentRequestList.jsx new file mode 100644 index 00000000..62e7b132 --- /dev/null +++ b/src/components/PaymentRequest/PaymentRequestList.jsx @@ -0,0 +1,168 @@ +import React, { useState } from "react"; +import { ITEMS_PER_PAGE } from "../../utils/constants"; +import { useDebounce } from "../../utils/appUtils"; +import { formatDate } from "../../utils/dateUtils"; +import { usePaymentRequestList } from "../../hooks/useExpense"; +import ExpenseSkeleton, { + ExpenseTableSkeleton, +} from "../Expenses/ExpenseSkeleton"; + +const PaymentRequestList = ({ setManagePaymentRequestModal, search }) => { + const paymentRequestColumns = [ + { key: "paymentRequestUID", label: "Request ID", align: "text-start mx-2" }, + { key: "title", label: "Request Title", align: "text-start" }, + { key: "payee", label: "Payee", align: "text-start" }, + { key: "createdAt", label: "Submitted On", align: "text-start" }, + { key: "amount", label: "Amount", align: "text-start" }, + { key: "expenseStatus", label: "Status", align: "text-start" }, + ]; + + const [currentPage, setCurrentPage] = useState(1); + const debouncedSearch = useDebounce(search, 500); + + const { data, isLoading, isError, error, isFetching } = usePaymentRequestList( + ITEMS_PER_PAGE, + currentPage, + {}, + true, + debouncedSearch + ); + + const paymentRequestData = data?.data || []; + const totalPages = data?.data?.totalPages || 1; + + if (isError) { + return ( +
+

Failed to load payment requests.

+ {error?.message || "Something went wrong."} +
+ ); + } + const header = [ + "Expense ID", + "Expense Category", + "Payment Mode", + "Sumitted By", + "Submitted", + "Amount", + "Status", + "Action", + ]; + if (isLoading) return ; + return ( +
+
+
-
Expense Type
+ {headers.map((header)=>( +
+
{header}
-
Payment Mode
-
Submitted BySubmittedAmountStatusAction
+ + + {paymentRequestColumns.map((col) => ( + + ))} + + + + + + {isLoading || isFetching ? ( + + + + ) : paymentRequestData.length > 0 ? ( + paymentRequestData.map((row) => ( + + + + + + + + + + )) + ) : ( + + + + )} + +
+ {col.label} + Action
+ Loading Payment Requests... +
{row.paymentRequestUID}{row.title}{row.payee}{formatDate(row.createdAt)} + {row.currency?.symbol} + {row.amount} + + + {row.expenseStatus?.displayName || "Unknown"} + + +
+ + console.log( + "View clicked for:", + row.paymentRequestUID + ) + } + > + + + setManagePaymentRequestModal({ + IsOpen: true, + expenseId: row.id, // Pass ID for editing + }) + } + > +
+
+ No Payment Requests Found +
+
+ + {/* Pagination */} + {totalPages > 1 && ( +
+ +
+ )} + + ); +}; + +export default PaymentRequestList; diff --git a/src/pages/PaymentRequest/PaymentRequestSchema.js b/src/components/PaymentRequest/PaymentRequestSchema.js similarity index 100% rename from src/pages/PaymentRequest/PaymentRequestSchema.js rename to src/components/PaymentRequest/PaymentRequestSchema.js diff --git a/src/hooks/useExpense.js b/src/hooks/useExpense.js index 164724a4..ebfd6659 100644 --- a/src/hooks/useExpense.js +++ b/src/hooks/useExpense.js @@ -263,7 +263,8 @@ export const useHasAnyPermission = (permissionIdsInput) => { return permissionIds.some((id) => permissions.includes(id)); }; -// ---------------------------Payment Request--------------------------------------------- +//#region Payment Request +// ---------------------------Get Payment Request--------------------------------------------- export const usePaymentRequestList = ( pageSize, pageNumber, @@ -281,10 +282,9 @@ export const usePaymentRequestList = ( }); }; -// CREATE PAYMENT REQUEST +// ---------------------------Put Post Payment Request--------------------------------------- export const useCreatePaymentRequest = (onSuccessCallBack) => { const queryClient = useQueryClient(); - return useMutation({ mutationFn: async (payload) => { await ExpenseRepository.CreatePaymentRequest(payload); @@ -303,7 +303,6 @@ export const useCreatePaymentRequest = (onSuccessCallBack) => { }, }); }; - export const useUpdatePaymentRequest = (onSuccessCallBack) => { const queryClient = useQueryClient(); return useMutation({ @@ -322,4 +321,19 @@ export const useUpdatePaymentRequest = (onSuccessCallBack) => { showToast("Something went wrong.Please try again later.", "error"); }, }); -}; \ No newline at end of file +}; +//#endregion + +//#region Advance Payment +export const useExpenseTransactions = (employeeId)=>{ + return useQuery({ + queryKey:["transaction",employeeId], + queryFn:async()=> { + debugger + const resp = await ExpenseRepository.GetTranctionList(employeeId); + return resp.data + }, + enabled:!!employeeId + }) +} +//#endregion \ No newline at end of file diff --git a/src/pages/AdvancePayment/AdvancePaymentPage.jsx b/src/pages/AdvancePayment/AdvancePaymentPage.jsx index 96ef7d25..305df58e 100644 --- a/src/pages/AdvancePayment/AdvancePaymentPage.jsx +++ b/src/pages/AdvancePayment/AdvancePaymentPage.jsx @@ -30,14 +30,14 @@ const AdvancePaymentPage = () => { - + ); diff --git a/src/pages/PaymentRequest/PaymentRequestList.jsx b/src/pages/PaymentRequest/PaymentRequestList.jsx deleted file mode 100644 index 528086db..00000000 --- a/src/pages/PaymentRequest/PaymentRequestList.jsx +++ /dev/null @@ -1,150 +0,0 @@ -import React, { useState } from "react"; -import { ITEMS_PER_PAGE } from "../../utils/constants"; -import { useDebounce } from "../../utils/appUtils"; -import { usePaymentRequestList } from "../../hooks/useExpense"; -import { formatDate } from "../../utils/dateUtils"; - -const PaymentRequestList = ({ setManagePaymentRequestModal, search }) => { - const paymentRequestColumns = [ - { key: "paymentRequestUID", label: "Request ID", align: "text-start mx-2" }, - { key: "title", label: "Request Title", align: "text-start" }, - { key: "payee", label: "Payee", align: "text-start" }, - { key: "createdAt", label: "Submitted On", align: "text-start" }, - { key: "amount", label: "Amount", align: "text-start" }, - { key: "expenseStatus", label: "Status", align: "text-start" }, - ]; - - const [currentPage, setCurrentPage] = useState(1); - const debouncedSearch = useDebounce(search, 500); - - const { data, isLoading, isError, error, isFetching } = usePaymentRequestList( - ITEMS_PER_PAGE, - currentPage, - {}, - true, - debouncedSearch - ); - - const paymentRequestData = data?.data || []; - const totalPages = data?.data?.totalPages || 1; - - if (isError) { - return ( -
-

Failed to load payment requests.

- {error?.message || "Something went wrong."} -
- ); - } - - return ( -
-
- - - - {paymentRequestColumns.map((col) => ( - - ))} - - - - - - {isLoading || isFetching ? ( - - - - ) : paymentRequestData.length > 0 ? ( - paymentRequestData.map((row) => ( - - - - - - - - - - )) - ) : ( - - - - )} - -
- {col.label} - Action
- Loading Payment Requests... -
{row.paymentRequestUID}{row.title}{row.payee}{formatDate(row.createdAt)} - {row.currency?.symbol} - {row.amount} - - - {row.expenseStatus?.displayName || "Unknown"} - - -
- - console.log("View clicked for:", row.paymentRequestUID) - } - > - - - setManagePaymentRequestModal({ - IsOpen: true, - expenseId: row.id, // Pass ID for editing - }) - } - > -
-
- No Payment Requests Found -
-
- - {/* Pagination */} - {totalPages > 1 && ( -
- -
- )} -
- ); -}; - -export default PaymentRequestList; diff --git a/src/pages/PaymentRequest/PaymentRequestPage.jsx b/src/pages/PaymentRequest/PaymentRequestPage.jsx index 92dc36bd..aa8b23e7 100644 --- a/src/pages/PaymentRequest/PaymentRequestPage.jsx +++ b/src/pages/PaymentRequest/PaymentRequestPage.jsx @@ -1,8 +1,7 @@ import React, { useState } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import GlobalModel from "../../components/common/GlobalModel"; -import ManagePaymentRequest from "../../components/PaymentRequest/ManagePaymentRequest"; -import PaymentRequestList from "./PaymentRequestList"; +import PaymentRequestList from "../../components/PaymentRequest/PaymentRequestList"; const PaymentRequestPage = () => { const [ManagePaymentRequestModal, setManagePaymentRequestModal] = useState({ @@ -33,7 +32,7 @@ const PaymentRequestPage = () => { className="form-control form-control-sm w-auto" placeholder="Search Payment Req.." value={search} - onChange={(e) => setSearch(e.target.value)} + onChange={(e) => setSearch(e.target.value)} /> @@ -67,7 +66,7 @@ const PaymentRequestPage = () => { setManagePaymentRequestModal({ IsOpen: null, expenseId: null }) } > - @@ -80,7 +79,7 @@ const PaymentRequestPage = () => { {/* Payment Request List */}
diff --git a/src/repositories/ExpsenseRepository.jsx b/src/repositories/ExpsenseRepository.jsx index 91c52c13..aebb9cd8 100644 --- a/src/repositories/ExpsenseRepository.jsx +++ b/src/repositories/ExpsenseRepository.jsx @@ -2,28 +2,33 @@ import { api } from "../utils/axiosClient"; const ExpenseRepository = { + //#region Expense GetExpenseList: (pageSize, pageNumber, filter, searchString) => { const payloadJsonString = JSON.stringify(filter); return api.get(`/api/expense/list?pageSize=${pageSize}&pageNumber=${pageNumber}&filter=${payloadJsonString}&searchString=${searchString}`); }, - GetExpenseDetails: (id) => api.get(`/api/Expense/details/${id}`), CreateExpense: (data) => api.post("/api/Expense/create", data), UpdateExpense: (id, data) => api.put(`/api/Expense/edit/${id}`, data), DeleteExpense: (id) => api.delete(`/api/Expense/delete/${id}`), - ActionOnExpense: (data) => api.post('/api/expense/action', data), - GetExpenseFilter: () => api.get('/api/Expense/filter'), + //#endregion + +//#region Payment Request GetPaymentRequestList: (pageSize, pageNumber, filter, isActive, searchString) => { const payloadJsonString = JSON.stringify(filter); return api.get(`/api/Expense/get/payment-requests/list?isActive=${isActive}&pageSize=${pageSize}&pageNumber=${pageNumber}&filter=${payloadJsonString}&searchString=${searchString}`); }, - CreatePaymentRequest: (data) => api.post("/api/expense/payment-request/create", data), UpdatePaymentRequest: (id, data) => api.put(`/api/Expense/payment-request/edit/${id}`, data), + //#endregion + + //#region Advance Payment + GetTranctionList:()=>api.get(`/get/transactions/${employeeId}`) + //#endregion } export default ExpenseRepository;