From d580ca0a15d9ff75e24a3bd4f84b77a030d851c2 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Tue, 5 Aug 2025 23:58:31 +0530 Subject: [PATCH] added expense releated master - Expense Type, status and paymentModa --- src/hooks/masterHook/useMaster.js | 417 +++++++++++++------------ src/repositories/MastersRepository.jsx | 91 +++--- 2 files changed, 266 insertions(+), 242 deletions(-) diff --git a/src/hooks/masterHook/useMaster.js b/src/hooks/masterHook/useMaster.js index 20caff62..15dc3305 100644 --- a/src/hooks/masterHook/useMaster.js +++ b/src/hooks/masterHook/useMaster.js @@ -12,213 +12,6 @@ import showToast from "../../services/toastService"; -// const useMaster = () => { - -// const selectedMaster = useSelector((store)=>store.localVariables.selectedMaster); -// const [data, setData] = useState([]); -// const [loading, setLoading] = useState(true); -// const [error, setError] = useState(""); -// useEffect(() => { -// const fetchData = async () => { -// if (!selectedMaster) return; -// setLoading(true); -// try { -// const cachedData = getCachedData(selectedMaster); -// if (cachedData) { - -// setData(cachedData); - -// } else { -// let response; -// switch (selectedMaster) { -// case "Application Role": -// response = await MasterRespository.getRoles(); -// response = response.data; -// break; -// case "Job Role": -// response = await MasterRespository.getJobRole(); -// response = response.data -// break; -// case "Activity": -// response = await MasterRespository.getActivites(); -// response = response.data -// break; -// case "Work Category": -// response = await MasterRespository.getWorkCategory(); -// response = response.data -// break; -// case "Contact Category": -// response = await MasterRespository.getContactCategory(); -// response = response.data -// break; -// case "Contact Tag": -// response = await MasterRespository.getContactTag(); -// response = response.data -// break; -// case "Status": -// response = [{description: null,featurePermission: null,id: "02dd4761-363c-49ed-8851-3d2489a3e98d",status:"status 1"},{description: null,featurePermission: null,id: "03dy9761-363c-49ed-8851-3d2489a3e98d",status:"status 2"},{description: null,featurePermission: null,id: "03dy7761-263c-49ed-8851-3d2489a3e98d",status:"Status 3"}]; -// break; -// default: -// response = []; -// } - -// if (response) { -// setData(response); -// cacheData(selectedMaster, response); -// } -// } -// } catch (err) { -// setError("Failed to fetch data."); -// } finally { -// setLoading(false); -// } -// }; - -// if ( selectedMaster ) -// { - -// fetchData(); -// } - -// }, [selectedMaster]); - - - -// return { data, loading, error } -// }; - - - - -// export const useActivitiesMaster = () => -// { -// const [ activities, setActivites ] = useState( [] ) -// const [ loading, setloading ] = useState( false ); -// const [ error, setError ] = useState() -// const fetchActivities =async () => { -// setloading(true); -// try { -// const response = await MasterRespository.getActivites(); -// setActivites(response.data); -// cacheData( "ActivityMaster", response.data ); -// setloading(false); -// } catch (err) { -// setError(err); -// setloading(false); -// } -// } -// useEffect( () => -// { -// const cacheddata = getCachedData( "ActivityMaster" ); -// if ( !cacheddata ) -// { -// fetchActivities() -// } else -// { -// setActivites(cacheddata); -// } -// }, [] ) - -// return {activities,loading,error} -// } - -// export const useWorkCategoriesMaster = () => -// { -// const [ categories, setCategories ] = useState( [] ) -// const [ categoryLoading, setloading ] = useState( false ); -// const [ categoryError, setError ] = useState( "" ) - -// const fetchCategories =async () => { -// const cacheddata = getCachedData("Work Category"); - -// if (!cacheddata) { -// setloading(true); -// try { -// const response = await MasterRespository.getWorkCategory(); -// setCategories(response.data); -// cacheData("Work Category", response.data); -// } catch (err) { -// setError(err); -// console.log(err); -// } finally { -// setloading(false); -// } -// } else { -// setCategories(cacheddata); -// } -// } -// useEffect( () => -// { -// fetchCategories() -// }, [] ) - -// return {categories,categoryLoading,categoryError} -// } - -// export const useContactCategory = () => -// { -// const [ contactCategory, setContactCategory ] = useState( [] ) -// const [ loading, setLoading ] = useState( false ) -// const [ Error, setError ] = useState() - -// const fetchConatctCategory = async() => -// { -// const cache_Category = getCachedData( "Contact Category" ); -// if ( !cache_Category ) -// { -// try -// { -// let resp = await MasterRespository.getContactCategory(); -// setContactCategory( resp.data ); -// cacheData("Contact Category",resp.data) -// } catch ( error ) -// { -// setError(error) -// } -// } else -// { -// setContactCategory(cache_Category) -// } -// } - -// useEffect( () => -// { -// fetchConatctCategory() -// }, [] ) -// return { contactCategory,loading,Error} -// } -// export const useContactTags = () => { -// const [contactTags, setContactTags] = useState([]); -// const [loading, setLoading] = useState(false); -// const [error, setError] = useState(null); - -// useEffect(() => { -// const fetchContactTag = async () => { -// const cache_Tags = getCachedData("Contact Tag"); - -// if (!cache_Tags) { -// setLoading(true); -// try { -// const resp = await MasterRespository.getContactTag(); -// setContactTags(resp.data); -// cacheData("Contact Tag", resp.data); -// } catch (err) { -// setError(err); -// } finally { -// setLoading(false); -// } -// } else { -// setContactTags(cache_Tags); -// } -// }; - -// fetchContactTag(); -// }, []); - -// return { contactTags, loading, error }; -// }; - -// Separate matser------------- export const useActivitiesMaster = () => { @@ -300,6 +93,76 @@ export const useContactTags = () => { return { contactTags, loading, error }; }; + +export const useExpenseType =()=>{ +const { + data: ExpenseTypes = [], + isLoading: loading, + error, + } = useQuery({ + queryKey: ["Expense Type"], + queryFn: async () => { + const res = await MasterRespository.getExpenseType() + return res.data; + }, + onError: (error) => { + showToast( + error?.response?.data?.message || + error.message || + "Failed to fetch Expense Type", + "error" + ); + }, + }); + + return { ExpenseTypes, loading, error }; +} +export const usePaymentMode =()=>{ +const { + data: PaymentModes = [], + isLoading: loading, + error, + } = useQuery({ + queryKey: ["Payment Mode"], + queryFn: async () => { + const res = await MasterRespository.getPaymentMode() + return res.data; + }, + onError: (error) => { + showToast( + error?.response?.data?.message || + error.message || + "Failed to fetch Payment Mode", + "error" + ); + }, + }); + + return { PaymentModes, loading, error }; +} +export const useExpenseStatus =()=>{ +const { + data: ExpenseStatus = [], + isLoading: loading, + error, + } = useQuery({ + queryKey: ["Expense Status"], + queryFn: async () => { + const res = await MasterRespository.getExpenseStatus() + return res.data; + }, + onError: (error) => { + showToast( + error?.response?.data?.message || + error.message || + "Failed to fetch Expense Status", + "error" + ); + }, + }); + + return { ExpenseStatus, loading, error }; +} // ===Application Masters Query================================================= const fetchMasterData = async (masterType) => { @@ -316,6 +179,12 @@ const fetchMasterData = async (masterType) => { return (await MasterRespository.getContactCategory()).data; case "Contact Tag": return (await MasterRespository.getContactTag()).data; + case "Expense Type": + return (await MasterRespository.getExpenseType()).data; + case "Payment Mode": + return (await MasterRespository.getPaymentMode()).data; + case "Expense Status": + return (await MasterRespository.getExpenseStatus()).data; case "Status": return [ { @@ -666,6 +535,140 @@ export const useUpdateContactTag = (onSuccessCallback) => }); } +// ----------------------Expense Type------------------ +export const useCreateExpenseType = (onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( payload ) => + { + const resp = await MasterRespository.createExpenseType(payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Expense Type" ]} ) + showToast( "Expense Type added successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} +export const useUpdateExpenseType = (onSuccessCallback) => +{ + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ( {id, payload} ) => + { + const response = await MasterRespository.updateExpenseType(id,payload); + return response.data; + }, + onSuccess: (data, variables) => { + + queryClient.invalidateQueries({ + queryKey: ["masterData", "Expense Type"], + }); + showToast("Expense Type updated successfully.", "success"); + + if (onSuccessCallback) onSuccessCallback(data); + }, + onError: (error) => { + showToast(error.message || "Something went wrong", "error"); + }, + }); +} + +// -----------------Payment Mode ------------- + +export const useCreatePaymentMode = (onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( payload ) => + { + const resp = await MasterRespository.createPaymentMode(payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Payment Mode" ]} ) + showToast( "Payment Mode added successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} +export const useUpdatePaymentMode = (onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( {id,payload} ) => + { + const resp = await MasterRespository.updatePaymentMode(id,payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Payment Mode" ]} ) + showToast( "Payment Mode Updated successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} +// -------------------Expense Status---------------------------------- +export const useCreateExpenseStatus =(onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( payload ) => + { + const resp = await MasterRespository.createExpenseStatus(payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Expense Status" ]} ) + showToast( "Expense Status added successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} +export const useUpdateExpenseStatus = (onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( {id,payload} ) => + { + const resp = await MasterRespository.updateExepnseStatus(id,payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Expense Status" ]} ) + showToast( "Expense Status Updated successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} // -Delete Master -------- export const useDeleteMasterItem = () => { const queryClient = useQueryClient(); diff --git a/src/repositories/MastersRepository.jsx b/src/repositories/MastersRepository.jsx index aebfc157..6f3fb89b 100644 --- a/src/repositories/MastersRepository.jsx +++ b/src/repositories/MastersRepository.jsx @@ -12,50 +12,71 @@ export const RolesRepository = { createRoles: (data) => api.post("/users", data), updateRoles: (id, data) => api.put(`/users/${id}`, data), deleteRoles: (id) => api.delete(`/users/${id}`), - - getEmployeeRoles:(id)=>api.get(`/api/employee/roles/${id}`), - createEmployeeRoles:(data)=>api.post("/api/roles/assign-roles",data) + getEmployeeRoles: (id) => api.get(`/api/employee/roles/${id}`), + createEmployeeRoles: (data) => api.post("/api/roles/assign-roles", data), }; - export const MasterRespository = { getRoles: () => api.get("/api/roles"), createRole: (data) => api.post("/api/roles", data), - updateRoles:(id,data) => api.put(`/api/roles/${id}`,data), - getFeatures: () => api.get( `/api/feature` ), + updateRoles: (id, data) => api.put(`/api/roles/${id}`, data), + getFeatures: () => api.get(`/api/feature`), + createJobRole: (data) => api.post("api/roles/jobrole", data), + getJobRole: () => api.get("/api/roles/jobrole"), + updateJobRole: (id, data) => api.put(`/api/roles/jobrole/${id}`, data), - createJobRole:(data)=>api.post('api/roles/jobrole',data), - getJobRole :()=>api.get("/api/roles/jobrole"), - updateJobRole: ( id, data ) => api.put( `/api/roles/jobrole/${ id }`, data ), + getActivites: () => api.get("api/master/activities"), + createActivity: (data) => api.post("api/master/activity", data), + updateActivity: (id, data) => + api.post(`api/master/activity/edit/${id}`, data), + getIndustries: () => api.get("api/master/industries"), - - getActivites: () => api.get( 'api/master/activities' ), - createActivity: (data) => api.post( 'api/master/activity',data ), - updateActivity:(id,data) =>api.post(`api/master/activity/edit/${id}`,data), - getIndustries: () => api.get( 'api/master/industries' ), - // delete - "Job Role": ( id ) => api.delete( `/api/roles/jobrole/${ id }` ), - "Activity": ( id ) => api.delete( `/api/master/activity/delete/${ id }` ), - "Application Role":(id)=>api.delete(`/api/roles/${id}`), - "Work Category": ( id ) => api.delete( `api/master/work-category/${ id }` ), - "Contact Category": ( id ) => api.delete( `/api/master/contact-category/${id}` ), - "Contact Tag" :(id)=>api.delete(`/api/master/contact-tag/${id}`), + "Job Role": (id) => api.delete(`/api/roles/jobrole/${id}`), + Activity: (id) => api.delete(`/api/master/activity/delete/${id}`), + "Application Role": (id) => api.delete(`/api/roles/${id}`), + "Work Category": (id) => api.delete(`api/master/work-category/${id}`), + "Contact Category": (id) => api.delete(`/api/master/contact-category/${id}`), + "Contact Tag": (id) => api.delete(`/api/master/contact-tag/${id}`), + "Expense Type": (id, isActive) => + api.delete(`/api/Master/expenses-type/delete/${id}`, (isActive = false)), + "Payment Mode": (id, isActive) => + api.delete(`/api/Master/payment-mode/delete/${id}`, (isActive = false)), + "Expense Status": (id, isActive) => + api.delete(`/api/Master/expenses-status/delete/${id}`, (isActive = false)), - getWorkCategory:() => api.get(`/api/master/work-categories`), - createWorkCategory: (data) => api.post(`/api/master/work-category`,data), - updateWorkCategory: ( id, data ) => api.post( `/api/master/work-category/edit/${ id }`, data ), - - getContactCategory: () => api.get( `/api/master/contact-categories` ), - createContactCategory: (data ) => api.post( `/api/master/contact-category`, data ), - updateContactCategory: ( id, data ) => api.post( `/api/master/contact-category/edit/${ id }`, data ), - - getContactTag: () => api.get( `/api/master/contact-tags` ), - createContactTag: (data ) => api.post( `/api/master/contact-tag`, data ), - updateContactTag: ( id, data ) => api.post( `/api/master/contact-tag/edit/${ id }`, data ), + getWorkCategory: () => api.get(`/api/master/work-categories`), + createWorkCategory: (data) => api.post(`/api/master/work-category`, data), + updateWorkCategory: (id, data) => + api.post(`/api/master/work-category/edit/${id}`, data), - getAuditStatus:()=>api.get('/api/Master/work-status') - -} \ No newline at end of file + getContactCategory: () => api.get(`/api/master/contact-categories`), + createContactCategory: (data) => + api.post(`/api/master/contact-category`, data), + updateContactCategory: (id, data) => + api.post(`/api/master/contact-category/edit/${id}`, data), + + getContactTag: () => api.get(`/api/master/contact-tags`), + createContactTag: (data) => api.post(`/api/master/contact-tag`, data), + updateContactTag: (id, data) => + api.post(`/api/master/contact-tag/edit/${id}`, data), + + getAuditStatus: () => api.get("/api/Master/work-status"), + + getExpenseType: () => api.get("/api/Master/expenses-types"), + createExpenseType: (data) => api.post("/api/Master/expenses-type", data), + updateExpenseType: (id, data) => + api.put(`/api/Master/expenses-type/edit/${id}`, data), + + getPaymentMode: () => api.get("/api/Master/payment-modes"), + createPaymentMode: (data) => api.post(`/api/Master/payment-mode`, data), + updatePaymentMode: (id, data) => + api.put(`/api/Master/payment-mode/edit/${id}`, data), + + getExpenseStatus: () => api.get("/api/Master/expenses-status"), + createExpenseStatus: (data) => api.post("/api/Master/expenses-status", data), + updateExepnseStatus: (id, data) => + api.put(`/api/Master/expenses-status/edit/${id}`, data), +};