changed employee api for manage expense

This commit is contained in:
pramod mahajan 2025-08-04 15:11:12 +05:30
parent 68bd0d6bb5
commit 96e4760345
6 changed files with 105 additions and 85 deletions

View File

@ -33,7 +33,7 @@ const ExpenseStatusLogs = ({ data }) => {
<small className="text-secondary text-tiny ms-2"> <small className="text-secondary text-tiny ms-2">
<em>{log.action}</em> <em>{log.action}</em>
</small> </small>
<span className="text-tiny text-secondary d-block small">{log?.updateAt ?? "14-Aug-2025"}</span> <span className="text-tiny text-secondary d-block small">{log?.updateAt}</span>
</div> </div>
</div> </div>
<div className="d-flex align-items-center text-muted small mt-1"> <div className="d-flex align-items-center text-muted small mt-1">

View File

@ -14,6 +14,8 @@ import useMaster, {
import { import {
useEmployeesAllOrByProjectId, useEmployeesAllOrByProjectId,
useEmployeesByProject, useEmployeesByProject,
useEmployeesName,
useEmployeesNameByProject,
} from "../../hooks/useEmployees"; } from "../../hooks/useEmployees";
import Avatar from "../common/Avatar"; import Avatar from "../common/Avatar";
import { import {
@ -24,6 +26,7 @@ import {
import ExpenseSkeleton from "./ExpenseSkeleton"; import ExpenseSkeleton from "./ExpenseSkeleton";
import moment from "moment"; import moment from "moment";
import DatePicker from "../common/DatePicker"; import DatePicker from "../common/DatePicker";
import ErrorPage from "../../pages/ErrorPage";
const ManageExpense = ({ closeModal, expenseToEdit = null }) => { const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
const { const {
@ -31,6 +34,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
isLoading, isLoading,
error: ExpenseErrorLoad, error: ExpenseErrorLoad,
} = useExpense(expenseToEdit); } = useExpense(expenseToEdit);
console.log(data)
const [ExpenseType, setExpenseType] = useState(); const [ExpenseType, setExpenseType] = useState();
const dispatch = useDispatch(); const dispatch = useDispatch();
const { const {
@ -53,11 +57,14 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
}); });
const selectedproject = watch("projectId"); const selectedproject = watch("projectId");
const selectedProject = useSelector(
(store) => store.localVariables.projectId const {
); projectNames,
const { projectNames, loading: projectLoading, error } = useProjectName(); loading: projectLoading,
debugger error,
isError: isProjectError,
} = useProjectName();
const { const {
PaymentModes, PaymentModes,
loading: PaymentModeLoading, loading: PaymentModeLoading,
@ -69,11 +76,10 @@ debugger
error: stausError, error: stausError,
} = useExpenseStatus(); } = useExpenseStatus();
const { const {
employees, data: employees,
loading: EmpLoading, isLoading: EmpLoading,
error: EmpError, isError: isEmployeeError,
} = useEmployeesByProject(selectedproject); } = useEmployeesNameByProject(selectedproject);
const files = watch("billAttachments"); const files = watch("billAttachments");
const onFileChange = async (e) => { const onFileChange = async (e) => {
const newFiles = Array.from(e.target.files); const newFiles = Array.from(e.target.files);
@ -90,7 +96,7 @@ debugger
contentType: file.type, contentType: file.type,
fileSize: file.size, fileSize: file.size,
description: "", description: "",
isActive:true isActive: true,
}; };
}) })
); );
@ -136,7 +142,8 @@ debugger
}; };
useEffect(() => { useEffect(() => {
if (expenseToEdit && data && employees) { if (expenseToEdit && data ) {
reset({ reset({
projectId: data.project.id || "", projectId: data.project.id || "",
expensesTypeId: data.expensesType.id || "", expensesTypeId: data.expensesType.id || "",
@ -173,7 +180,12 @@ debugger
} }
); );
const onSubmit = (fromdata) => { const onSubmit = (fromdata) => {
let payload = {...fromdata,transactionDate: moment.utc(fromdata.transactionDate, 'DD-MM-YYYY').toISOString()} let payload = {
...fromdata,
transactionDate: moment
.utc(fromdata.transactionDate, "DD-MM-YYYY")
.toISOString(),
};
if (expenseToEdit) { if (expenseToEdit) {
const editPayload = { ...payload, id: data.id }; const editPayload = { ...payload, id: data.id };
ExpenseUpdate({ id: data.id, payload: editPayload }); ExpenseUpdate({ id: data.id, payload: editPayload });
@ -191,13 +203,10 @@ debugger
reset(); reset();
closeModal(); closeModal();
}; };
if ( if (StatusLoadding || projectLoading || ExpenseLoading || isLoading)
StatusLoadding ||
projectLoading ||
ExpenseLoading ||
isLoading
)
return <ExpenseSkeleton />; return <ExpenseSkeleton />;
return ( return (
<div className="container p-3"> <div className="container p-3">
<h5 className="m-0"> <h5 className="m-0">
@ -206,9 +215,7 @@ debugger
<form id="expenseForm" onSubmit={handleSubmit(onSubmit)}> <form id="expenseForm" onSubmit={handleSubmit(onSubmit)}>
<div className="row my-2"> <div className="row my-2">
<div className="col-md-6"> <div className="col-md-6">
<label className="form-label"> <label className="form-label">Select Project</label>
Select Project
</label>
<select <select
className="form-select form-select-sm" className="form-select form-select-sm"
{...register("projectId")} {...register("projectId")}
@ -323,17 +330,7 @@ debugger
<label htmlFor="transactionDate" className="form-label "> <label htmlFor="transactionDate" className="form-label ">
Transaction Date Transaction Date
</label> </label>
{/* <input <DatePicker name="transactionDate" control={control} />
type="date"
className="form-control form-control-sm"
placeholder="YYYY-MM-DD"
id="flatpickr-date"
{...register("transactionDate")}
/> */}
<DatePicker
name="transactionDate"
control={control}
/>
{errors.transactionDate && ( {errors.transactionDate && (
<small className="danger-text"> <small className="danger-text">
@ -415,9 +412,7 @@ debugger
{ExpenseType?.noOfPersonsRequired && ( {ExpenseType?.noOfPersonsRequired && (
<div className="col-md-6"> <div className="col-md-6">
<label > <label>No. of Persons</label>
No. of Persons
</label>
<input <input
type="number" type="number"
id="noOfPersons" id="noOfPersons"
@ -435,7 +430,7 @@ debugger
</div> </div>
<div className="row my-2"> <div className="row my-2">
<div className="col-md-12" > <div className="col-md-12">
<label htmlFor="description">Description</label> <label htmlFor="description">Description</label>
<textarea <textarea
id="description" id="description"
@ -489,7 +484,7 @@ debugger
{files {files
.filter((file) => { .filter((file) => {
if (expenseToEdit) { if (expenseToEdit) {
return file.isActive; return file.isActive;
} }
return true; return true;
}) })
@ -542,7 +537,11 @@ debugger
className="btn btn-primary btn-sm mt-3" className="btn btn-primary btn-sm mt-3"
disabled={isPending || createPending} disabled={isPending || createPending}
> >
{isPending || createPending ? "Please Wait..." : expenseToEdit ? "Update" : "Submit"} {isPending || createPending
? "Please Wait..."
: expenseToEdit
? "Update"
: "Submit"}
</button> </button>
<button <button
type="reset" type="reset"

View File

@ -251,7 +251,7 @@ const ViewExpense = ({ ExpenseId }) => {
{/* Row 6 */} {/* Row 6 */}
{data.createdBy && ( {data.createdBy && (
<div className="col-md-6 mb-3 text-start"> <div className="col-md-6 text-start">
<div className="d-flex align-items-center"> <div className="d-flex align-items-center">
<label <label
className="form-label me-2 mb-0 fw-semibold" className="form-label me-2 mb-0 fw-semibold"
@ -353,41 +353,7 @@ const ViewExpense = ({ ExpenseId }) => {
</div> </div>
)} */} )} */}
</div> </div>
{data.expensesReimburse && (
<div className="row text-start">
<div className="col-md-6 ">
<label className="form-label me-2 mb-0 fw-semibold">
Transaction ID :
</label>
{data.expensesReimburse.reimburseTransactionId || "N/A"}
</div>
<div className="col-md-6 ">
<label className="form-label me-2 mb-0 fw-semibold">
Reimburse Date :
</label>
{formatUTCToLocalTime(data.expensesReimburse.reimburseDate)}
</div>
{data.expensesReimburse && (
<>
<div className="col-md-6 d-flex align-items-center">
<label className="form-label me-2 mb-0 fw-semibold">
Reimburse By :
</label>
<Avatar
size="xs"
classAvatar="m-0 me-1"
firstName={data?.expensesReimburse?.reimburseBy?.firstName}
lastName={data?.expensesReimburse?.reimburseBy?.lastName}
/>
<span className="text-muted">
{`${data?.expensesReimburse?.reimburseBy?.firstName} ${data?.expensesReimburse?.reimburseBy?.lastName}`.trim()}
</span>
</div>
</>
)}
</div>
)}
{/* <div className="text-start"> {/* <div className="text-start">
<label className="form-label me-2 mb-0 fw-semibold"> <label className="form-label me-2 mb-0 fw-semibold">
@ -395,7 +361,7 @@ const ViewExpense = ({ ExpenseId }) => {
</label> </label>
<div className="text-muted">{data?.description}</div> <div className="text-muted">{data?.description}</div>
</div> */} </div> */}
<div className="col-12 my-2 text-start"> <div className="col-12 text-start">
<label className="form-label me-2 mb-0 fw-semibold">Attachment :</label> <label className="form-label me-2 mb-0 fw-semibold">Attachment :</label>
{data?.documents?.map((doc) => { {data?.documents?.map((doc) => {
@ -456,7 +422,43 @@ const ViewExpense = ({ ExpenseId }) => {
})} })}
</div> </div>
<hr className="divider my-1" />
{data.expensesReimburse && (
<div className="row text-start">
<div className="col-md-6 mb-sm-0 mb-2">
<label className="form-label me-2 mb-0 fw-semibold">
Transaction ID :
</label>
{data.expensesReimburse.reimburseTransactionId || "N/A"}
</div>
<div className="col-md-6 ">
<label className="form-label me-2 mb-0 fw-semibold">
Reimburse Date :
</label>
{formatUTCToLocalTime(data.expensesReimburse.reimburseDate)}
</div>
{data.expensesReimburse && (
<>
<div className="col-md-6 d-flex align-items-center">
<label className="form-label me-2 mb-0 fw-semibold">
Reimburse By :
</label>
<Avatar
size="xs"
classAvatar="m-0 me-1"
firstName={data?.expensesReimburse?.reimburseBy?.firstName}
lastName={data?.expensesReimburse?.reimburseBy?.lastName}
/>
<span className="text-muted">
{`${data?.expensesReimburse?.reimburseBy?.firstName} ${data?.expensesReimburse?.reimburseBy?.lastName}`.trim()}
</span>
</div>
</>
)}
</div>
)}
<hr className="divider my-1" />
{Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && ( {Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && (
<> <>

View File

@ -174,6 +174,7 @@ export const useEmployeeProfile = (employeeId) => {
}; };
export const useEmployeesName = (projectId, search) => { export const useEmployeesName = (projectId, search) => {
debugger
return useQuery({ return useQuery({
queryKey: ["employees", projectId, search], queryKey: ["employees", projectId, search],
queryFn: async() => await EmployeeRepository.getEmployeeName(projectId, search), queryFn: async() => await EmployeeRepository.getEmployeeName(projectId, search),
@ -182,6 +183,19 @@ export const useEmployeesName = (projectId, search) => {
}); });
}; };
export const useEmployeesNameByProject = (projectId) => {
return useQuery({
queryKey: ["Projectemployees", projectId],
queryFn: async () => {
const response = await EmployeeRepository.getEmployeeName(projectId);
return response?.data || []; // handle undefined/null response
},
enabled: !!projectId, // only fetch if projectId is truthy
staleTime: 5 * 60 * 1000, // cache for 5 minutes
});
};
// Mutation------------------------------------------------------------------ // Mutation------------------------------------------------------------------
export const useUpdateEmployee = () => { export const useUpdateEmployee = () => {

View File

@ -313,6 +313,7 @@ export const useProjectName = () => {
isLoading, isLoading,
error, error,
refetch, refetch,
isError
} = useQuery({ } = useQuery({
queryKey: ["basicProjectNameList"], queryKey: ["basicProjectNameList"],
queryFn: async () => { queryFn: async () => {
@ -323,7 +324,7 @@ export const useProjectName = () => {
showToast(error.message || "Error while Fetching project Name", "error"); showToast(error.message || "Error while Fetching project Name", "error");
}, },
}); });
return { projectNames: data, loading: isLoading, Error: error, refetch }; return { projectNames: data, loading: isLoading, Error: error, refetch,isError };
}; };
export const useProjectInfra = (projectId) => { export const useProjectInfra = (projectId) => {

View File

@ -11,12 +11,16 @@ const EmployeeRepository = {
// deleteEmployee: ( id ) => api.delete( `/users/${ id }` ), // deleteEmployee: ( id ) => api.delete( `/users/${ id }` ),
getEmployeeProfile: (id) => api.get(`/api/employee/profile/get/${id}`), getEmployeeProfile: (id) => api.get(`/api/employee/profile/get/${id}`),
deleteEmployee: (id) => api.delete(`/api/employee/${id}`), deleteEmployee: (id) => api.delete(`/api/employee/${id}`),
getEmployeeName: (projectId, search) => getEmployeeName: (projectId, search) => {
api.get( const params = new URLSearchParams();
`/api/Employee/basic${projectId ? `?projectId=${projectId}` : ""}${
search ? `${projectId ? "&" : "?"}searchString=${search}` : "" if (projectId) params.append("projectId", projectId);
}` if (search) params.append("searchString", search);
),
const query = params.toString();
return api.get(`/api/Employee/basic${query ? `?${query}` : ""}`);
}
}; };
export default EmployeeRepository; export default EmployeeRepository;