import React, { useState, useMemo } from "react"; import { useActionOnExpense, useExpense, useHasAnyPermission, } from "../../hooks/useExpense"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { defaultActionValues, ExpenseActionScheam } from "./ExpenseSchema"; import { useExpenseContext } from "../../pages/Expense/ExpensePage"; import { getColorNameFromHex, getIconByFileType } from "../../utils/appUtils"; import { ExpenseDetailsSkeleton } from "./ExpenseSkeleton"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { EXPENSE_REJECTEDBY, PROCESS_EXPENSE, REVIEW_EXPENSE, } from "../../utils/constants"; import { useProfile } from "../../hooks/useProfile"; import { useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import Avatar from "../common/Avatar"; import Error from "../common/Error"; import DatePicker from "../common/DatePicker"; import { useEmployeeRoles, useEmployeesName } from "../../hooks/useEmployees"; import EmployeeSearchInput from "../common/EmployeeSearchInput"; import { z } from "zod"; import moment from "moment"; import ExpenseStatusLogs from "./ExpenseStatusLogs"; const ViewExpense = ({ ExpenseId }) => { const { data, isLoading, isError, error } = useExpense(ExpenseId); const [IsPaymentProcess, setIsPaymentProcess] = useState(false); const [clickedStatusId, setClickedStatusId] = useState(null); const IsReview = useHasUserPermission(REVIEW_EXPENSE); const [imageLoaded, setImageLoaded] = useState({}); const { setDocumentView } = useExpenseContext(); const ActionSchema = ExpenseActionScheam(IsPaymentProcess) ?? 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 IsRejectedExpense = useMemo(() => { return EXPENSE_REJECTEDBY.includes(data?.status?.id); }, [data]); const isCreatedBy = useMemo(() => { return data?.createdBy.id === CurrentUser?.id; }, [data, CurrentUser]); const { mutate: MakeAction, isPending } = useActionOnExpense(() => { setClickedStatusId(null); reset(); }); const onSubmit = (formData) => { const Payload = { ...formData, reimburseDate: moment .utc(formData.reimburseDate, "DD-MM-YYYY") .toISOString(), expenseId: ExpenseId, comment: formData.comment, }; MakeAction(Payload); }; if (isLoading) return ; if (isError) return ; const handleImageLoad = (id) => { setImageLoaded((prev) => ({ ...prev, [id]: true })); }; return (
Expense Details

{data?.description}
{/* Row 1 */}
{formatUTCToLocalTime(data?.transactionDate)}
{data?.expensesType?.name}
{/* Row 2 */}
{data?.supplerName}
₹ {data.amount}
{/* Row 3 */}
{data?.paymentMode?.name}
{data?.gstNumber}
{/* Row 4 */}
{data?.status?.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?.firstName} {data?.paidBy?.lastName}
{data?.documents?.map((doc) => { const isImage = doc.contentType?.includes("image"); return (
{ if (isImage) { setDocumentView({ IsOpen: true, Image: doc.preSignedUrl, }); } }} > {doc.fileName}
); })}
{data.expensesReimburse && (
{data.expensesReimburse.reimburseTransactionId || "N/A"}
{formatUTCToLocalTime(data.expensesReimburse.reimburseDate)}
{data.expensesReimburse && ( <>
{`${data?.expensesReimburse?.reimburseBy?.firstName} ${data?.expensesReimburse?.reimburseBy?.lastName}`.trim()}
)}
)}
{Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && ( <> {IsPaymentProcess && nextStatusWithPermission?.length > 0 && (
{errors.reimburseTransactionId && ( {errors.reimburseTransactionId.message} )}
{errors.reimburseDate && ( {errors.reimburseDate.message} )}
)}
{((nextStatusWithPermission.length > 0 && !IsRejectedExpense) || (IsRejectedExpense && isCreatedBy)) && ( <>