diff --git a/src/components/AdvancePayment/AdvancePaymentList.jsx b/src/components/AdvancePayment/AdvancePaymentList.jsx index e14f9c06..c3aa10f6 100644 --- a/src/components/AdvancePayment/AdvancePaymentList.jsx +++ b/src/components/AdvancePayment/AdvancePaymentList.jsx @@ -1,14 +1,24 @@ -import React from "react"; -import { useExpenseTransactions } from "../../hooks/useExpense"; +import React, { useEffect, useMemo } from "react"; +import { + + useExpenseTransactions, +} from "../../hooks/useExpense"; import Error from "../common/Error"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import Loader, { SpinnerLoader } from "../common/Loader"; +import { useForm, useFormContext } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; +import { employee } from "../../data/masters"; +import { useAdvancePaymentContext } from "../../pages/AdvancePayment/AdvancePaymentPage"; +import { formatFigure } from "../../utils/appUtils"; + + const AdvancePaymentList = ({ employeeId }) => { + const { setBalance} = useAdvancePaymentContext() const { data, isError, isLoading, error, isFetching } = useExpenseTransactions(employeeId, { enabled: !!employeeId }); - console.log(data) - // Handle no employee selected if (!employeeId) { return (
{ ); } + const records = Array.isArray(data) ? data : []; let currentBalance = 0; @@ -53,7 +64,7 @@ const AdvancePaymentList = ({ employeeId }) => { const credit = isCredit ? r.amount : 0; const debit = !isCredit ? Math.abs(r.amount) : 0; currentBalance += credit - debit; - + setBalance(currentBalance); return { id: r.id, description: r.title || "-", @@ -61,12 +72,23 @@ const AdvancePaymentList = ({ employeeId }) => { createdAt: r.createdAt, credit, debit, + financeUId:r.financeUId, balance: currentBalance, }; }); const columns = [ + { + key: "date", + label: ( + <> + Date + + ), + align: "text-start", + }, { key: "description", label: "Description", align: "text-start" }, + { key: "credit", label: ( @@ -85,6 +107,7 @@ const AdvancePaymentList = ({ employeeId }) => { ), align: "text-end", }, + { key: "balance", label: ( @@ -104,7 +127,18 @@ const AdvancePaymentList = ({ employeeId }) => {
); } - console.log("Kartik", rowsWithBalance) + const DecideCreditOrDebit = ({ financeUId }) => { + if (!financeUId) return null; + + const prefix = financeUId?.substring(0, 2).toUpperCase(); + + if (prefix === "PR") return +; + if (prefix === "EX") return -; + + return null; +}; + + return (
@@ -131,17 +165,22 @@ const AdvancePaymentList = ({ employeeId }) => { ) ) : col.key === "debit" ? ( row.amount < 0 ? ( - {Math.abs(row.amount).toLocaleString("en-IN")} + + {Math.abs(row.amount).toLocaleString("en-IN")} + ) : ( "-" ) ) : col.key === "balance" ? ( - {row.currentBalance?.toLocaleString("en-IN")} +
+ {formatFigure(row.currentBalance)} +
+ ) : col.key === "date" ? ( + + {formatUTCToLocalTime(row.paidAt)} + ) : ( -
- - {formatUTCToLocalTime(row.paidAt)} - +
{row.project?.name || "-"} @@ -154,21 +193,31 @@ const AdvancePaymentList = ({ employeeId }) => { )) ) : (
- )} - - - - + + + diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index d7a0a1b4..50b7632e 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -267,7 +267,7 @@ const ExpenseList = ({ filters, groupBy = "transactionDate", searchText }) => { Object.values(grouped).map(({ key, displayField, items }) => ( -
+ No advance payment records found.
Final Balance - {currentBalance.toLocaleString("en-IN", { - style: "currency", - currency: "INR", - })} +
+ {" "} +
+ Final Balance +
+
+
+ {currentBalance.toLocaleString("en-IN", { + style: "currency", + currency: "INR", + })} +
+
{" "} diff --git a/src/components/RecurringExpense/ManageRecurringExpense.jsx b/src/components/RecurringExpense/ManageRecurringExpense.jsx index 01fa07eb..8788f0e9 100644 --- a/src/components/RecurringExpense/ManageRecurringExpense.jsx +++ b/src/components/RecurringExpense/ManageRecurringExpense.jsx @@ -403,26 +403,6 @@ function ManageRecurringExpense({ closeModal, requestToEdit = null }) {
- {/* Notify */} - {/*
-
- - - {errors.notifyTo && ( - - {errors.notifyTo.message} - - )} -
-
*/}
diff --git a/src/components/common/EmployeeSearchInput.jsx b/src/components/common/EmployeeSearchInput.jsx index c4c68db2..f4369bf7 100644 --- a/src/components/common/EmployeeSearchInput.jsx +++ b/src/components/common/EmployeeSearchInput.jsx @@ -32,6 +32,7 @@ const EmployeeSearchInput = ({ const found = employees.data.find((emp) => emp.id === value); if (found && forAll) { setSearch(`${found.firstName} ${found.lastName}`); + sessionStorage.setItem("transaction-empId",found?.id) } } }, [value, employees?.data, forAll]); diff --git a/src/components/common/MultiEmployeeSearchInput.jsx b/src/components/common/MultiEmployeeSearchInput.jsx index 23a3a5a0..c5501890 100644 --- a/src/components/common/MultiEmployeeSearchInput.jsx +++ b/src/components/common/MultiEmployeeSearchInput.jsx @@ -53,7 +53,7 @@ const MultiEmployeeSearchInput = ({ }, [value, employees?.data, forAll]); const handleSelect = (employee) => { - if (!selectedEmployees.find((emp) => emp.email === employee.email)) { + if (!selectedEmployees.find((emp) => emp.id === employee.id)) { const newSelected = [...selectedEmployees, employee]; setSelectedEmployees(newSelected); // Store emails instead of IDs @@ -150,11 +150,11 @@ const MultiEmployeeSearchInput = ({ ) : ( employees?.data ?.filter( - (emp) => !selectedEmployees.find((e) => e.email === emp.email) + (emp) => !selectedEmployees.find((e) => e.id === emp.id) ) .map((emp) => (
  • handleSelect(emp)} diff --git a/src/hooks/useExpense.js b/src/hooks/useExpense.js index 34b9c7ac..464247b2 100644 --- a/src/hooks/useExpense.js +++ b/src/hooks/useExpense.js @@ -434,7 +434,8 @@ export const useExpenseTransactions = (employeeId)=>{ const resp = await ExpenseRepository.GetTranctionList(employeeId); return resp.data }, - enabled:!!employeeId + enabled:!!employeeId, + keepPreviousData:true, }) } //#endregion diff --git a/src/pages/AdvancePayment/AdvancePaymentPage.jsx b/src/pages/AdvancePayment/AdvancePaymentPage.jsx index d03ac49a..9c080ab8 100644 --- a/src/pages/AdvancePayment/AdvancePaymentPage.jsx +++ b/src/pages/AdvancePayment/AdvancePaymentPage.jsx @@ -1,45 +1,91 @@ -import React from "react"; +import React, { + createContext, + useContext, + useEffect, + useMemo, + useState, +} from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import { useEmployee } from "../../hooks/useEmployees"; import EmployeeSearchInput from "../../components/common/EmployeeSearchInput"; import { useForm } from "react-hook-form"; import Label from "../../components/common/Label"; import AdvancePaymentList from "../../components/AdvancePayment/AdvancePaymentList"; +import { employee } from "../../data/masters"; +import { formatFigure } from "../../utils/appUtils"; +export const AdvancePaymentContext = createContext(); +export const useAdvancePaymentContext = () => { + const context = useContext(AdvancePaymentContext); + if (!context) { + throw new Error( + "useAdvancePaymentContext must be used within an AdvancePaymentProvider" + ); + } + return context; +}; const AdvancePaymentPage = () => { - const { control, watch } = useForm({ + const [balance, setBalance] = useState(null); + const { control, reset, watch } = useForm({ defaultValues: { employeeId: "", }, }); const selectedEmployeeId = watch("employeeId"); + useEffect(() => { + const selectedEmpoyee = sessionStorage.getItem("transaction-empId"); + reset({ + employeeId: selectedEmpoyee || "", + }); + }, [reset]); return ( -
    - -
    -
    -
    -
    - -
    + +
    + +
    +
    +
    +
    + +
    +
    +
    + {balance ? ( + <> + + 0 ? "text-success" : "text-danger" + } fs-5 fw-bold ms-1`} + > + {formatFigure(balance, { + type: "currency", + currency: "INR", + })} + + + ) : ( + <> + )} +
    +
    -
    -
    + ); };