diff --git a/src/components/master/ManageExpenseStatus.jsx b/src/components/master/ManageExpenseStatus.jsx
new file mode 100644
index 00000000..eccc3bf8
--- /dev/null
+++ b/src/components/master/ManageExpenseStatus.jsx
@@ -0,0 +1,165 @@
+import React, { useEffect } from "react";
+import {
+ useForm,
+ FormProvider,
+} from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import SelectMultiple from "../common/SelectMultiple";
+import { useFeatures } from "../../hooks/useMasterRole";
+import { EXPENSE_MANAGEMENT } from "../../utils/constants";
+import { useCreateExpenseStatus, useUpdateExpenseStatus } from "../../hooks/masterHook/useMaster";
+import { displayName } from "react-quill";
+import { AppColorconfig } from "../../utils/appUtils";
+
+const ExpenseStatusSchema = z.object({
+ name: z.string().min(1, { message: "Name is required" }),
+ displayName: z.string().min(1, { message: "Display Name is required" }),
+ description: z.string().min(1, { message: "Description is required" }),
+ permissionIds: z.array(z.string()).min(1, {
+ message: "At least one permission is required",
+ }),
+ color: z
+ .string()
+ .regex(/^#([0-9A-F]{3}){1,2}$/i, { message: "Invalid hex color" }),
+});
+
+const ManageExpenseStatus = ({data, onClose }) => {
+ const methods = useForm({
+ resolver: zodResolver(ExpenseStatusSchema),
+ defaultValues: {
+ name: "",
+ displayName: "",
+ description: "",
+ permissionIds: [],
+ color: AppColorconfig.colors.primary,
+ },
+ });
+
+ const {
+ register,
+ handleSubmit,
+ reset,
+ formState: { errors },
+ } = methods;
+
+ const { masterFeatures, loading } = useFeatures();
+
+ const ExpenseFeature = masterFeatures?.find(
+ (appfeature) => appfeature.id === EXPENSE_MANAGEMENT
+ );
+ const {mutate:CreateExpenseStatus,isPending:isPending} = useCreateExpenseStatus(()=>onClose?.())
+ const {mutate:UpdateExpenseStatus,isPending:Updating} = useUpdateExpenseStatus(()=>onClose?.());
+
+
+
+ const onSubmit = (payload) => {
+ if(data){
+ UpdateExpenseStatus({id:data.id,payload:{...payload,id:data.id}})
+ }else{
+ CreateExpenseStatus(payload)
+ }
+ };
+
+
+ useEffect(()=>{
+ if(data){
+ reset({
+ name:data.name ?? "",
+ displayName:data.displayName ?? "",
+ description:data.description ?? "",
+ permissionIds:data.permissionIds ?? [],
+ color:data.color ?? AppColorconfig.colors.primary
+ })
+ }
+ },[data])
+ return (
+
+ {loading ? (
+ Loading...
+ ) : (
+
+ )}
+
+ );
+};
+
+export default ManageExpenseStatus;
diff --git a/src/components/master/ManageExpenseType.jsx b/src/components/master/ManageExpenseType.jsx
new file mode 100644
index 00000000..8f280af5
--- /dev/null
+++ b/src/components/master/ManageExpenseType.jsx
@@ -0,0 +1,113 @@
+import React, { useEffect } from "react";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import {
+ useCreateExpenseType,
+ useUpdateExpenseType,
+} from "../../hooks/masterHook/useMaster";
+
+const ExpnseSchema = z.object({
+ name: z.string().min(1, { message: "Name is required" }),
+ noOfPersonsRequired: z.boolean().default(false),
+ description: z.string().min(1, { message: "Description is required" }),
+});
+
+const ManageExpenseType = ({ data = null, onClose }) => {
+ const {
+ register,
+ handleSubmit,
+ reset,
+ formState: { errors },
+ } = useForm({
+ resolver: zodResolver(ExpnseSchema),
+ defaultValues: { name: "", noOfPersonsRequired: false, description: "" },
+ });
+ const { mutate: UpdateExpenseType, isPending:isPendingUpdate } = useUpdateExpenseType(
+ () => onClose?.()
+ );
+ const { mutate: CreateExpenseType, isPending } = useCreateExpenseType(() =>
+ onClose?.()
+ );
+
+ const onSubmit = (payload) => {
+ if (data) {
+ UpdateExpenseType({
+ id: data.id,
+ payload: { ...payload, id: data.id },
+ });
+ } else {
+ CreateExpenseType(payload);
+ }
+ };
+
+ useEffect(() => {
+ if (data) {
+ reset({
+ name: data.name ?? "",
+ noOfPersonsRequired: data.noOfPersonsRequired ?? false,
+ description: data.description ?? "",
+ });
+ }
+ }, [data]);
+ return (
+
+ );
+};
+
+export default ManageExpenseType;
diff --git a/src/components/master/ManagePaymentMode.jsx b/src/components/master/ManagePaymentMode.jsx
new file mode 100644
index 00000000..b05856db
--- /dev/null
+++ b/src/components/master/ManagePaymentMode.jsx
@@ -0,0 +1,95 @@
+import React, { useEffect } from "react";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useCreatePaymentMode, useUpdatePaymentMode } from "../../hooks/masterHook/useMaster";
+
+const ExpnseSchema = z.object({
+ name: z.string().min(1, { message: "Name is required" }),
+ description: z.string().min(1, { message: "Description is required" }),
+});
+
+const ManagePaymentMode = ({ data = null, onClose }) => {
+ const {
+ register,
+ handleSubmit,
+ reset,
+ formState: { errors },
+ } = useForm({
+ resolver: zodResolver(ExpnseSchema),
+ defaultValues: { name: "", description: "" },
+ });
+
+ const { mutate: CreatePaymentMode, isPending } = useCreatePaymentMode(() =>
+ onClose?.()
+ );
+ const {mutate:UpdatePaymentMode,isPending:Updating} = useUpdatePaymentMode(()=>onClose?.())
+
+ const onSubmit = (payload) => {
+ if(data){
+ UpdatePaymentMode({id:data.id,payload:{...payload,id:data.id}})
+ }else(
+ CreatePaymentMode(payload)
+ )
+
+ };
+
+ useEffect(()=>{
+ if(data){
+ reset({
+ name:data.name ?? "",
+ description:data.description ?? ""
+ })
+ }
+ },[data])
+
+
+ return (
+
+ );
+};
+
+export default ManagePaymentMode;