import React, { useState } from "react"; import { EXPENSE_DRAFT, EXPENSE_REJECTEDBY, ITEMS_PER_PAGE, } from "../../utils/constants"; import { formatCurrency, formatFigure, getColorNameFromHex, useDebounce, } from "../../utils/appUtils"; import { usePaymentRequestList } from "../../hooks/useExpense"; import { formatDate, formatUTCToLocalTime } from "../../utils/dateUtils"; import Avatar from "../../components/common/Avatar"; import { usePaymentRequestContext } from "../../pages/PaymentRequest/PaymentRequestPage"; import { ExpenseTableSkeleton } from "../Expenses/ExpenseSkeleton"; import ConfirmModal from "../common/ConfirmModal"; import { useNavigate } from "react-router-dom"; import { useSelector } from "react-redux"; import Error from "../common/Error"; import Pagination from "../common/Pagination"; import PaymentRequestFilterChips from "./PaymentRequestFilterChips"; const PaymentRequestList = ({ filters, filterData, removeFilterChip, clearFilter, search, groupBy = "submittedBy" }) => { const { setManageRequest, setVieRequest } = usePaymentRequestContext(); const navigate = useNavigate(); const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [deletingId, setDeletingId] = useState(null); const SelfId = useSelector( (store) => store?.globalVariables?.loginUser?.employeeInfo?.id ); const groupByField = (items, field) => { return items.reduce((acc, item) => { let key; let displayField; switch (field) { case "transactionDate": key = item?.transactionDate?.split("T")[0]; displayField = "Transaction Date"; break; case "status": key = item?.status?.displayName || "Unknown"; displayField = "Status"; break; case "submittedBy": key = `${item?.createdBy?.firstName ?? ""} ${item.createdBy?.lastName ?? "" }`.trim(); displayField = "Submitted By"; break; case "project": key = item?.project?.name || "Unknown Project"; displayField = "Project"; break; case "paymentMode": key = item?.paymentMode?.name || "Unknown Mode"; displayField = "Payment Mode"; break; case "expensesType": key = item?.expensesType?.name || "Unknown Type"; displayField = "Expense Category"; break; case "createdAt": key = item?.createdAt?.split("T")[0] || "Unknown Date"; displayField = "Created Date"; break; default: key = "Others"; displayField = "Others"; } const groupKey = `${field}_${key}`; // unique key for object property if (!acc[groupKey]) { acc[groupKey] = { key, displayField, items: [] }; } acc[groupKey].items.push(item); return acc; }, {}); }; const paymentRequestColumns = [ { key: "paymentRequestUID", label: "Request ID", align: "text-start mx-2", getValue: (e) =>
{e.paymentRequestUID || "N/A"} {e.isAdvancePayment && Adv}
, }, { key: "title", label: "Request Title", align: "text-start", getValue: (e) => e.title || "N/A", }, { key: "createdAt", label: "Created At", align: "text-start", getValue: (e) => formatUTCToLocalTime(e?.createdAt), }, { key: "payee", label: "Payee", align: "text-start", getValue: (e) => e.payee || "N/A", }, { key: "dueDate", label: "Due Date", align: "text-start", getValue: (e) => formatUTCToLocalTime(e?.dueDate), }, { key: "amount", label: "Amount", align: "text-end", getValue: (e) => formatFigure(e?.amount, { type: "currency", currency: e?.currency?.currencyCode, }), }, { key: "expenseStatus", label: "Status", align: "text-center", getValue: (e) => ( {e?.expenseStatus?.name || "Unknown"} ), }, ]; const [currentPage, setCurrentPage] = useState(1); const debouncedSearch = useDebounce(search, 500); const { data, isLoading, isError, error, isRefetching, refetch } = usePaymentRequestList( ITEMS_PER_PAGE, currentPage, filters, true, debouncedSearch ); if (isError) { return ; } const header = [ "Request ID", "Request Title", "Created At", "Due Date", "Amount", "Status", "Action", ]; if (isLoading) return ; const grouped = groupBy ? Object.fromEntries( Object.entries(groupByField(data?.data ?? [], groupBy)).sort( ([keyA], [keyB]) => keyA.localeCompare(keyB) ) ) : { All: data?.data ?? [] }; const IsGroupedByDate = [ { key: "transactionDate", displayField: "Transaction Date" }, { key: "createdAt", displayField: "created Date" }, ]?.includes(groupBy); const paginate = (page) => { if (page >= 1 && page <= (data?.totalPages ?? 1)) { setCurrentPage(page); } }; const canEditExpense = (paymentRequest) => { return ( (paymentRequest?.expenseStatus?.id === EXPENSE_DRAFT || paymentRequest?.recurringPayment?.isVariable === true || EXPENSE_REJECTEDBY.includes(paymentRequest?.expenseStatus.id)) && paymentRequest?.createdBy?.id === SelfId ); }; const canDetetExpense = (request) => { return ( request?.expenseStatus?.id === EXPENSE_DRAFT && request?.createdBy?.id === SelfId ); }; const handleDelete = (id) => { setDeletingId(id); DeleteExpense( { id }, { onSettled: () => { setDeletingId(null); setIsDeleteModalOpen(false); }, } ); }; return ( <> {IsDeleteModalOpen && ( setIsDeleteModalOpen(false)} // loading={isPending} paramData={deletingId} /> )}
{paymentRequestColumns.map((col) => ( ))} {Object.keys(grouped).length > 0 ? ( Object.values(grouped).map(({ key, displayField, items }) => ( {items?.map((paymentRequest) => ( {paymentRequestColumns.map( (col) => (col.isAlwaysVisible || groupBy !== col.key) && ( ) )} ))} )) ) : ( )}
{col.label} Action
{" "} {displayField} :{" "} {" "} {IsGroupedByDate ? formatUTCToLocalTime(key) : key}
{col?.customRender ? col?.customRender(paymentRequest) : col?.getValue(paymentRequest)}
setVieRequest({ requestId: paymentRequest.id, view: true, }) } > {canEditExpense(paymentRequest) && (
  • setManageRequest({ IsOpen: true, RequestId: paymentRequest.id, }) } > Modify
  • {canDetetExpense(paymentRequest) && (
  • { setIsDeleteModalOpen(true); setDeletingId(paymentRequest.id); }} > Delete
  • )}
)}

No Request Found

{/* Pagination */}
); }; export default PaymentRequestList;