import { useMemo, useState } from "react"; import { useActionOnExpense, useActionOnPaymentRequest, usePaymentRequestDetail, } from "../../hooks/useExpense"; import { formatCurrency, formatFigure, getColorNameFromHex, getIconByFileType, localToUtc, } from "../../utils/appUtils"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import Avatar from "../common/Avatar"; import DatePicker from "../common/DatePicker"; import EmployeeSearchInput from "../common/EmployeeSearchInput"; import Error from "../common/Error"; import { defaultActionValues, ExpenseActionScheam, } from "../Expenses/ExpenseSchema"; import { ExpenseDetailsSkeleton } from "../Expenses/ExpenseSkeleton"; import ExpenseStatusLogs from "../Expenses/ExpenseStatusLogs"; import { useSelector } from "react-redux"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { useNavigate } from "react-router-dom"; import { usePaymentRequestContext } from "../../pages/PaymentRequest/PaymentRequestPage"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { EXPENSE_PROCESSED, EXPENSE_REJECTEDBY, EXPENSE_STATUS, PROCESS_EXPENSE, REVIEW_EXPENSE, } from "../../utils/constants"; import Label from "../common/Label"; import { FilelistView } from "../Expenses/Filelist"; import PaymentStatusLogs from "./PaymentStatusLogs"; import { defaultPRActionValues, PaymentRequestActionScheam, } from "./PaymentRequestSchema"; import ActionPaymentRequest from "./ActionPaymentRequest"; const ViewPaymentRequest = ({ requestId }) => { const [IsPaymentProcess, setIsPaymentProcess] = useState(false); const [clickedStatusId, setClickedStatusId] = useState(null); const [imageLoaded, setImageLoaded] = useState({}); const IsReview = useHasUserPermission(REVIEW_EXPENSE); const navigate = useNavigate(); const { data, isLoading, isError, error, isFetching } = usePaymentRequestDetail(requestId); const { setDocumentView, setModalSize, setVieRequest, setIsExpenseGenerate } = usePaymentRequestContext(); const ActionSchema = PaymentRequestActionScheam(IsPaymentProcess, data?.createdAt) ?? z.object({}); const { register, handleSubmit, setValue, reset, control, formState: { errors }, } = useForm({ resolver: zodResolver(ActionSchema), defaultValues: defaultPRActionValues, }); const userPermissions = useSelector( (state) => state?.globalVariables?.loginUser?.featurePermissions || [] ); const CurrentUser = useSelector( (state) => state?.globalVariables?.loginUser?.employeeInfo ); const nextStatusWithPermission = useMemo(() => { if (!Array.isArray(data?.nextStatus)) return []; return data.nextStatus.filter((status) => { const permissionIds = Array.isArray(status?.permissionIds) ? status.permissionIds : []; if (permissionIds?.length === 0) return true; if (permissionIds.includes(PROCESS_EXPENSE)) { setIsPaymentProcess(true); } return permissionIds.some((id) => userPermissions.includes(id)); }); }, [data, userPermissions]); const isRejectedRequest = useMemo(() => { return EXPENSE_REJECTEDBY.includes(data?.status?.id); }, [data]); const isCreatedBy = useMemo(() => { return data?.createdBy?.id === CurrentUser?.id; }, [data, CurrentUser]); const { mutate: MakeAction, isPending } = useActionOnPaymentRequest(() => { setClickedStatusId(null); reset(); }); const onSubmit = (formData) => { const Payload = { ...formData, paidAt: localToUtc(formData.paidAt), paymentRequestId: data.id, comment: formData.comment, }; MakeAction(Payload); }; if (isLoading) return ; if (isError) return ; const handleImageLoad = (id) => { setImageLoaded((prev) => ({ ...prev, [id]: true })); }; const STATUS_HEADING = { [EXPENSE_STATUS.daft]: "Payment Request - Initiation", [EXPENSE_STATUS.review_pending]: "Payment Request - Review & Validation", [EXPENSE_STATUS.approve_pending]: "Payment Request - Approval", [EXPENSE_STATUS.payment_pending]: "Payment Request - Processing & Disbursement", [EXPENSE_STATUS.payment_processed]: "Payment Request - Bills & Tax Invoices Upload", [EXPENSE_STATUS.payment_done]: "Payment Request - Reconciliation & Confirmation", }; return (
{STATUS_HEADING[data?.expenseStatus?.id] || "Payment Request Details"}

PR No : {data?.paymentRequestUID}
{data?.expenseStatus?.name}
{data?.project?.name || "—"}
{formatUTCToLocalTime(data?.dueDate)}
{data?.expenseCategory?.name}
{/* Row 2 */}
{data?.payee}
{formatFigure(data?.amount, { type: "currency", currency: data?.currency?.currencyCode, })}
{data?.gstNumber && (
{data?.gstNumber}
)}
{formatUTCToLocalTime(data?.createdAt, true)}
{/* Row 6 */} {data?.createdBy && (
{`${data?.createdBy?.firstName ?? ""} ${data?.createdBy?.lastName ?? "" }`.trim() || "N/A"}
)}
{data?.description}
{data?.paidTransactionId && ( <>
{data?.paidTransactionId}
{formatUTCToLocalTime(data?.paidAt)} {" "}
{data?.paidBy && (
{`${data?.paidBy?.firstName} ${data?.paidBy?.lastName}`.trim()}
)} )}
{data?.attachments?.length > 0 ? ( ) : (

No Attachment

)}
); }; export default ViewPaymentRequest;