+
-
-
+
+
Attachment :
@@ -512,7 +537,7 @@ const ViewPaymentRequest = ({ requestId }) => {
{" "}
TimeLine
-
+
diff --git a/src/components/RecurringExpense/ManageRecurringExpense.jsx b/src/components/RecurringExpense/ManageRecurringExpense.jsx
index a9f3c913..a5e3bdaf 100644
--- a/src/components/RecurringExpense/ManageRecurringExpense.jsx
+++ b/src/components/RecurringExpense/ManageRecurringExpense.jsx
@@ -1,430 +1,490 @@
-import React, { useEffect, useState } from 'react'
-import Label from '../common/Label';
-import { useForm } from 'react-hook-form';
-import { useExpenseCategory } from '../../hooks/masterHook/useMaster';
-import DatePicker from '../common/DatePicker';
-import { zodResolver } from '@hookform/resolvers/zod';
-import { defaultRecurringExpense, PaymentRecurringExpense } from './RecurringExpenseSchema';
-import { INR_CURRENCY_CODE } from '../../utils/constants';
-import { useCurrencies, useProjectName } from '../../hooks/useProjects';
-import { useCreateRecurringExpense } from '../../hooks/useExpense';
+import React, { useEffect, useState } from "react";
+import Label from "../common/Label";
+import { Controller, useForm } from "react-hook-form";
+import {
+ useExpenseCategory,
+ useRecurringStatus,
+} from "../../hooks/masterHook/useMaster";
+import DatePicker from "../common/DatePicker";
+import { zodResolver } from "@hookform/resolvers/zod";
+import {
+ defaultRecurringExpense,
+ PaymentRecurringExpense,
+} from "./RecurringExpenseSchema";
+import {
+ FREQUENCY_FOR_RECURRING,
+ INR_CURRENCY_CODE,
+} from "../../utils/constants";
+import { useCurrencies, useProjectName } from "../../hooks/useProjects";
+import {
+ useCreateRecurringExpense,
+ usePayee,
+ useRecurringExpenseDetail,
+ useUpdateRecurringExpense,
+} from "../../hooks/useExpense";
+import InputSuggestions from "../common/InputSuggestion";
+import MultiEmployeeSearchInput from "../common/MultiEmployeeSearchInput";
function ManageRecurringExpense({ closeModal, requestToEdit = null }) {
+ const {
+ data,
+ isLoading,
+ isError,
+ error: requestError,
+ } = useRecurringExpenseDetail(requestToEdit);
- const data = {}
- const { projectNames, loading: projectLoading, error, isError: isProjectError,
- } = useProjectName();
+ //APIs
+ const {
+ projectNames,
+ loading: projectLoading,
+ error,
+ isError: isProjectError,
+ } = useProjectName();
+ const {
+ data: currencyData,
+ isLoading: currencyLoading,
+ isError: currencyError,
+ } = useCurrencies();
+ const {
+ data: statusData,
+ isLoading: statusLoading,
+ isError: statusError,
+ } = useRecurringStatus();
+ const {
+ data: Payees,
+ isLoading: isPayeeLoaing,
+ isError: isPayeeError,
+ error: payeeError,
+ } = usePayee();
+ const {
+ ExpenseCategories,
+ loading: ExpenseLoading,
+ error: ExpenseError,
+ } = useExpenseCategory();
- const { data: currencyData, isLoading: currencyLoading, isError: currencyError } = useCurrencies();
+ const schema = PaymentRecurringExpense();
+ const {
+ register,
+ control,
+ watch,
+ handleSubmit,
+ setValue,
+ reset,
+ formState: { errors },
+ } = useForm({
+ resolver: zodResolver(schema),
+ defaultValues: defaultRecurringExpense,
+ });
+ const handleClose = () => {
+ reset();
+ closeModal();
+ };
-
- const {
- ExpenseCategories,
- loading: ExpenseLoading,
- error: ExpenseError,
- } = useExpenseCategory();
-
- const schema = PaymentRecurringExpense();
-
- const { register, control, watch, handleSubmit, setValue, reset, formState: { errors }, } = useForm({
- resolver: zodResolver(schema),
- defaultValues: defaultRecurringExpense,
+ const { mutate: CreateRecurringExpense, isPending: createPending } =
+ useCreateRecurringExpense(() => {
+ handleClose();
});
- const handleClose = () => {
- reset();
- closeModal();
+ // const { mutate: PaymentRequestUpdate, isPending } = useUpdatePaymentRequest(() =>
+ // handleClose()
+ // );
+
+ useEffect(() => {
+ if (requestToEdit && data) {
+ reset({
+ title: data.title || "",
+ description: data.description || "",
+ payee: data.payee || "",
+ notifyTo: data.notifyTo || "",
+ currencyId: data.currency.id || "",
+ amount: data.amount || "",
+ strikeDate: data.strikeDate?.slice(0, 10) || "",
+ projectId: data.project.id || "",
+ paymentBufferDays: data.paymentBufferDays || "",
+ numberOfIteration: data.numberOfIteration || "",
+ expenseCategoryId: data.expenseCategory.id || "",
+ statusId: data.statusId || "",
+ frequency: data.frequency || "",
+ isVariable: data.isVariable || false,
+ });
+ }
+ }, [data, reset]);
+
+ // console.log("Veer",data)
+
+ const onSubmit = (fromdata) => {
+ let payload = {
+ ...fromdata,
+ // strikeDate: localToUtc(fromdata.strikeDate),
+ strikeDate: fromdata.strikeDate
+ ? new Date(fromdata.strikeDate).toISOString()
+ : null,
};
+ if (requestToEdit) {
+ const editPayload = { ...payload, id: data.id };
+ PaymentRequestUpdate({ id: data.id, payload: editPayload });
+ } else {
+ CreateRecurringExpense(payload);
+ }
+ console.log("Kartik", payload);
+ };
- const { mutate: CreateRecurringExpense, isPending: createPending } = useCreateRecurringExpense(
- () => {
- handleClose();
- }
- );
- // const { mutate: PaymentRequestUpdate, isPending } = useUpdatePaymentRequest(() =>
- // handleClose()
- // );
+ return (
+
+
+ {requestToEdit
+ ? "Update Expense Recurring "
+ : "Create Expense Recurring"}
+
+
+
+
{
{viewExpense.view && (
setViewExpense({ expenseId: null, view: false })}
>
diff --git a/src/pages/PaymentRequest/PaymentRequestPage.jsx b/src/pages/PaymentRequest/PaymentRequestPage.jsx
index e2f3cdf1..f4c8bb55 100644
--- a/src/pages/PaymentRequest/PaymentRequestPage.jsx
+++ b/src/pages/PaymentRequest/PaymentRequestPage.jsx
@@ -15,7 +15,7 @@ export const PaymentRequestContext = createContext();
export const usePaymentRequestContext = () => {
const context = useContext(PaymentRequestContext);
if (!context) {
- throw new Error("usePaymentRequestContext must be used within an RequestPaymentProvider");
+ throw new Error("usePaymentRequestContext must be used within an ExpenseProvider");
}
return context;
};
diff --git a/src/pages/RecurringExpense/RecurringExpensePage.jsx b/src/pages/RecurringExpense/RecurringExpensePage.jsx
index 60da6be8..0fd5ceb2 100644
--- a/src/pages/RecurringExpense/RecurringExpensePage.jsx
+++ b/src/pages/RecurringExpense/RecurringExpensePage.jsx
@@ -4,7 +4,9 @@ import GlobalModel from "../../components/common/GlobalModel";
import { useFab } from "../../Context/FabContext";
// import { defaultPaymentRequestFilter,SearchPaymentRequestSchema } from "../../components/PaymentRequest/PaymentRequestSchema";
import ManageRecurringExpense from "../../components/RecurringExpense/ManageRecurringExpense";
-import RecurringExpenseList from "../../components/RecurringExpense/RecurringRexpenseList";
+import RecurringExpenseList from "../../components/RecurringExpense/RecurringExpenseList";
+import { PAYEE_RECURRING_EXPENSE } from "../../utils/constants";
+import { SearchRecurringExpenseSchema } from "../../components/RecurringExpense/RecurringExpenseSchema";
export const RecurringExpenseContext = createContext();
export const useRecurringExpenseContext = () => {
@@ -20,8 +22,10 @@ const RecurringExpensePage = () => {
RequestId: null,
});
const [ViewRequest, setVieRequest] = useState({ view: false, requestId: null })
- const { setOffcanvasContent, setShowTrigger } = useFab();
- // const [filters, setFilters] = useState(defaultPaymentRequestFilter);
+
+ const [selectedStatuses, setSelectedStatuses] = useState(
+ PAYEE_RECURRING_EXPENSE.map((s) => s.id)
+ );
const [search, setSearch] = useState("");
@@ -30,19 +34,13 @@ const RecurringExpensePage = () => {
setVieRequest
};
- useEffect(() => {
-
- setShowTrigger(true);
- setOffcanvasContent(
- "Payment Request Filters",
- //
+ const handleStatusChange = (id) => {
+ setSelectedStatuses((prev) =>
+ prev.includes(id)
+ ? prev.filter((s) => s !== id)
+ : [...prev, id]
);
-
- return () => {
- setShowTrigger(false);
- setOffcanvasContent("", null);
- };
- }, []);
+ };
return (
@@ -57,19 +55,47 @@ const RecurringExpensePage = () => {
{/* Top Bar */}
-
-
-
+
+
+ {/* Left side: Search + Filter */}
+
-
+ {/* Right side: Add Button */}
+
- {/*
*/}
-
+
+
{/* Add/Edit Modal */}
{ManageRequest.IsOpen && (
diff --git a/src/repositories/ExpsenseRepository.jsx b/src/repositories/ExpsenseRepository.jsx
index 4a5cedc9..3770f6cc 100644
--- a/src/repositories/ExpsenseRepository.jsx
+++ b/src/repositories/ExpsenseRepository.jsx
@@ -1,7 +1,6 @@
import { api } from "../utils/axiosClient";
const ExpenseRepository = {
- GetPayee: () => api.get("/api/Expense/payment-request/payee"),
//#region Expense
GetExpenseList: (pageSize, pageNumber, filter, searchString) => {
const payloadJsonString = JSON.stringify(filter);
@@ -40,20 +39,33 @@ const ExpenseRepository = {
GetPaymentRequestFilter: () => api.get("/api/Expense/payment-request/filter"),
ActionOnPaymentRequest: (data) =>
api.post("/api/Expense/payment-request/action", data),
- DeletePaymentRequest:()=>api.get("delete here come"),
- CreatePaymentRequestExpense:(data)=>api.post('/api/Expense/payment-request/expense/create',data),
+ DeletePaymentRequest: () => api.get("delete here come"),
+ CreatePaymentRequestExpense: (data) =>
+ api.post("/api/Expense/payment-request/expense/create", data),
+ GetPayee:()=>api.get('/api/Expense/payment-request/payee'),
//#endregion
//#region Recurring Expense
-
- CreateRecurringExpense: (data) => api.post("/api/Expense/recurring-payment/create", data),
-
- //#endregion
-
- //#region Advance Payment
- GetTranctionList: (employeeId)=>api.get(`/api/Expense/get/transactions/${employeeId}`),
+ GetRecurringExpenseList:(pageSize, pageNumber, filter, searchString) => {
+ const payloadJsonString = JSON.stringify(filter);
+ return api.get(
+ `/api/expense/get/recurring-payment/list?pageSize=${pageSize}&pageNumber=${pageNumber}&filter=${payloadJsonString}&searchString=${searchString}`
+ );
+ },
+ CreateRecurringExpense: (data) =>
+ api.post("/api/Expense/recurring-payment/create", data),
+ UpdateRecurringExpense: (id, data) =>
+ api.put(`/api/Expense/recurring-payment/edit/${id}`, data),
+ GetRecurringExpense: (id) =>
+ api.get(`/api/Expense/get/recurring-payment/details/${id}`),
//#endregion
+ //#region Advance Payment
+ GetTranctionList: (employeeId) =>
+ api.get(`/api/Expense/get/transactions/${employeeId}`),
+ //#endregion
+
+
};
export default ExpenseRepository;
diff --git a/src/repositories/MastersRepository.jsx b/src/repositories/MastersRepository.jsx
index 792cb376..24324030 100644
--- a/src/repositories/MastersRepository.jsx
+++ b/src/repositories/MastersRepository.jsx
@@ -141,4 +141,7 @@ export const MasterRespository = {
api.post(`/api/Master/payment-adjustment-head`, data),
updatePaymentAjustmentHead: (id, data) =>
api.put(`/api/Master/payment-adjustment-head/edit/${id}`, data),
+
+
+ getRecurringStatus:()=>api.get(`/api/Master/recurring-status/list`)
};
diff --git a/src/utils/appUtils.js b/src/utils/appUtils.js
index 62ac15d4..b3a884fd 100644
--- a/src/utils/appUtils.js
+++ b/src/utils/appUtils.js
@@ -108,7 +108,7 @@ export function localToUtc(dateString) {
export const formatCurrency = (amount, currency = "INR", locale = "en-US") => {
return new Intl.NumberFormat(locale, {
style: "currency",
- notation: "compact", // standard or compact
+ notation: "compact",
compactDisplay: "short",
currency: currency,
minimumFractionDigits: 0,
diff --git a/src/utils/constants.jsx b/src/utils/constants.jsx
index fe8f4e5b..433c906a 100644
--- a/src/utils/constants.jsx
+++ b/src/utils/constants.jsx
@@ -160,10 +160,10 @@ export const PROJECT_STATUS = [
export const DEFAULT_CURRENCY = "78e96e4a-7ce0-4164-ae3a-c833ad45ec2c";
export const EXPENSE_STATUS = {
- daft:"297e0d8f-f668-41b5-bfea-e03b354251c8",
- review_pending:"6537018f-f4e9-4cb3-a210-6c3b2da999d7",
- payment_pending:"f18c5cfd-7815-4341-8da2-2c2d65778e27",
- approve_pending:"4068007f-c92f-4f37-a907-bc15fe57d4d8",
+ daft: "297e0d8f-f668-41b5-bfea-e03b354251c8",
+ review_pending: "6537018f-f4e9-4cb3-a210-6c3b2da999d7",
+ payment_pending: "f18c5cfd-7815-4341-8da2-2c2d65778e27",
+ approve_pending: "4068007f-c92f-4f37-a907-bc15fe57d4d8",
}
@@ -178,4 +178,32 @@ export const ALLOW_PROJECTSTATUS_ID = [
export const DEFAULT_EMPTY_STATUS_ID = "00000000-0000-0000-0000-000000000000";
+export const FREQUENCY_FOR_RECURRING = {
+ 0: "Monthly",
+ 1: "Quarterly",
+ 2: "Half-Yearly",
+ 3: "Yearly",
+ 4: "Daily",
+ 5: "Weekly"
+};
+
+export const PAYEE_RECURRING_EXPENSE = [
+ {
+ id: "da462422-13b2-45cc-a175-910a225f6fc8",
+ label: "Active",
+ },
+ {
+ id: "306856fb-5655-42eb-bf8b-808bb5e84725",
+ label: "Completed",
+ },
+ {
+ id: "3ec864d2-8bf5-42fb-ba70-5090301dd816",
+ label: "De-Activited",
+ },
+ {
+ id: "8bfc9346-e092-4a80-acbf-515ae1ef6868",
+ label: "Paused",
+ },
+];
+