import { useMemo, useState } from "react"; import { useActionOnExpense, useActionOnPaymentRequest, usePaymentRequestDetail, } from "../../hooks/useExpense"; import { formatCurrency, 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_REJECTEDBY, PROCESS_EXPENSE, REVIEW_EXPENSE, } from "../../utils/constants"; import Label from "../common/Label"; const ViewPaymentRequest = ({ requestId }) => { const { data, isLoading, isError, error, isFetching } = usePaymentRequestDetail(requestId); const [IsPaymentProcess, setIsPaymentProcess] = useState(false); const [clickedStatusId, setClickedStatusId] = useState(null); const IsReview = useHasUserPermission(REVIEW_EXPENSE); const [imageLoaded, setImageLoaded] = useState({}); const { setDocumentView } = usePaymentRequestContext(); const ActionSchema = ExpenseActionScheam(IsPaymentProcess, data?.createdAt) ?? z.object({}); const navigate = useNavigate(); const { register, handleSubmit, setValue, reset, control, formState: { errors }, } = useForm({ resolver: zodResolver(ActionSchema), defaultValues: defaultActionValues, }); 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.reimburseDate), paymentRequestId: data.id, comment: formData.comment, }; MakeAction(Payload); }; if (isLoading) return ; if (isError) return ; const handleImageLoad = (id) => { setImageLoaded((prev) => ({ ...prev, [id]: true })); }; return (
Payment Request Details

{data?.paymentRequestUID}
{data?.project?.name || "—"}
{formatUTCToLocalTime(data?.dueDate)}
{data?.expenseCategory?.name}
{/* Row 2 */}
{data?.payee}
{formatCurrency(data?.amount, data?.currency?.currencyCode)}
{/* Row 3 */} {/*
{data?.paymentMode?.name}
*/} {data?.gstNumber && (
{data?.gstNumber}
)} {/* Row 4 */}
{data?.expenseStatus?.name}
{data?.preApproved ? "Yes" : "No"}
{data?.project?.name}
{formatUTCToLocalTime(data?.createdAt, true)}
{/* Row 6 */} {data?.createdBy && (
{`${data?.createdBy?.firstName ?? ""} ${ data?.createdBy?.lastName ?? "" }`.trim() || "N/A"}
)} {data?.paidBy && (
{`${data?.paidBy?.firstName ?? ""} ${ data?.paidBy?.lastName ?? "" }`.trim() || "N/A"}
)}
{data?.description}
{data?.documents?.length > 0 ? ( data?.documents?.map((doc) => { const isImage = doc?.contentType?.includes("image"); return (
{ if (isImage) { setDocumentView({ IsOpen: true, Image: doc.preSignedUrl, }); } }} > {doc.fileName}
); }) ) : (

No Attachment

)}
{data?.paidTransactionId && (
{data?.paidTransactionId}
{formatUTCToLocalTime(data?.paidAt)}
{data?.paidBy && ( <>
{`${data?.paidBy?.firstName} ${data?.paidBy?.lastName}`.trim()}
)}
)} {Array.isArray(data?.nextStatus) && data?.nextStatus.length > 0 && ( <> {IsPaymentProcess && nextStatusWithPermission?.length > 0 && (
{errors.paidTransactionId && ( {errors.paidTransactionId.message} )}
{errors.paidAt && ( {errors.paidAt.message} )}
)}
{((nextStatusWithPermission.length > 0 && !isRejectedRequest) || (isRejectedRequest && isCreatedBy)) && ( <>