handle action when expense rejected

This commit is contained in:
pramod mahajan 2025-08-01 16:30:08 +05:30
parent 5d8a56401d
commit 82a5df36a0
2 changed files with 57 additions and 38 deletions

View File

@ -12,7 +12,7 @@ import { useExpenseContext } from "../../pages/Expense/ExpensePage";
import { getColorNameFromHex } from "../../utils/appUtils"; import { getColorNameFromHex } from "../../utils/appUtils";
import { ExpenseDetailsSkeleton } from "./ExpenseSkeleton"; import { ExpenseDetailsSkeleton } from "./ExpenseSkeleton";
import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { useHasUserPermission } from "../../hooks/useHasUserPermission";
import { PROCESS_EXPENSE, REVIEW_EXPENSE } from "../../utils/constants"; import { EXPENSE_REJECTEDBY, PROCESS_EXPENSE, REVIEW_EXPENSE } from "../../utils/constants";
import { useProfile } from "../../hooks/useProfile"; import { useProfile } from "../../hooks/useProfile";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
@ -49,6 +49,9 @@ const ViewExpense = ({ ExpenseId }) => {
const userPermissions = useSelector( const userPermissions = useSelector(
(state) => state?.globalVariables?.loginUser?.featurePermissions || [] (state) => state?.globalVariables?.loginUser?.featurePermissions || []
); );
const CurrentUser = useSelector(
(state) => state?.globalVariables?.loginUser?.employeeInfo
);
const nextStatusWithPermission = useMemo(() => { const nextStatusWithPermission = useMemo(() => {
if (!Array.isArray(data?.nextStatus)) return []; if (!Array.isArray(data?.nextStatus)) return [];
@ -66,6 +69,14 @@ const ViewExpense = ({ ExpenseId }) => {
}); });
}, [data, userPermissions]); }, [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(() => { const { mutate: MakeAction,isPending } = useActionOnExpense(() => {
setClickedStatusId(null); setClickedStatusId(null);
reset()}); reset()});
@ -184,7 +195,7 @@ const ViewExpense = ({ ExpenseId }) => {
getColorNameFromHex(data?.status?.color) || "secondary" getColorNameFromHex(data?.status?.color) || "secondary"
}`} }`}
> >
{data?.status?.displayName} {data?.status?.name}
</span> </span>
</div> </div>
</div> </div>
@ -467,9 +478,12 @@ const ViewExpense = ({ ExpenseId }) => {
</div> </div>
)} )}
<div className="col-12 mb-3 text-start"> <div className="col-12 mb-3 text-start">
{nextStatusWithPermission.length > 0 && ( {(
(nextStatusWithPermission.length > 0 && !IsRejectedExpense) ||
(IsRejectedExpense && isCreatedBy)
) && (
<> <>
<label className="form-label me-2 mb-0 ">Comment:</label> <label className="form-label me-2 mb-0">Comment:</label>
<textarea <textarea
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("comment")} {...register("comment")}
@ -483,9 +497,9 @@ const ViewExpense = ({ ExpenseId }) => {
</> </>
)} )}
{nextStatusWithPermission?.length > 0 && ( {(nextStatusWithPermission?.length > 0 && (!IsRejectedExpense || isCreatedBy)) && (
<div className="text-center flex-wrap gap-2 my-2"> <div className="text-center flex-wrap gap-2 my-2">
{nextStatusWithPermission?.map((status, index) => ( {nextStatusWithPermission.map((status, index) => (
<button <button
key={status.id || index} key={status.id || index}
type="button" type="button"
@ -497,12 +511,15 @@ const ViewExpense = ({ ExpenseId }) => {
disabled={isPending} disabled={isPending}
className="btn btn-primary btn-sm cursor-pointer mx-2 border-0" className="btn btn-primary btn-sm cursor-pointer mx-2 border-0"
> >
{(isPending && clickedStatusId === status.id) ? "Please Wait..." : (status.displayName || status.name)} {isPending && clickedStatusId === status.id
? "Please Wait..."
: status.displayName || status.name}
</button> </button>
))} ))}
</div> </div>
)} )}
</div> </div>
</> </>
)} )}
</form> </form>

View File

@ -56,7 +56,9 @@ export const PROCESS_EXPENSE = "ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"
export const EXPENSE_MANAGE = "ea5a1529-4ee8-4828-80ea-0e23c9d4dd11" export const EXPENSE_MANAGE = "ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"
export const EXPENSE_REJECTEDBY = ["d1ee5eec-24b6-4364-8673-a8f859c60729","965eda62-7907-4963-b4a1-657fb0b2724b"]
export const EXPENSE_DRAFT = "297e0d8f-f668-41b5-bfea-e03b354251c"
// -------------------Application Role------------------------------ // -------------------Application Role------------------------------
// 1 - Expense Manage // 1 - Expense Manage