diff --git a/src/Components/Layout/Navbar/NavBarRightSide.tsx b/src/Components/Layout/Navbar/NavBarRightSide.tsx index 3d54e86..61319b9 100644 --- a/src/Components/Layout/Navbar/NavBarRightSide.tsx +++ b/src/Components/Layout/Navbar/NavBarRightSide.tsx @@ -38,7 +38,7 @@ const NavBarRightSide = () => { icon={} /> (Navigate('/notifications'))} + // onClick={()=>(Navigate('/notifications'))} className="NotificationsIcon" note="notification" color="#E0E0E0" @@ -55,7 +55,9 @@ const NavBarRightSide = () => { {userData?.username} {userData?.type} */} - (Navigate('/profile'))} src="/Image/faker_user.png" alt="Profile" /> + (Navigate('/profile'))} + src="/Image/faker_user.png" alt="Profile" /> ); diff --git a/src/Components/Utils/Filter/useFilter.tsx b/src/Components/Utils/Filter/useFilter.tsx index b79cf37..36895e1 100644 --- a/src/Components/Utils/Filter/useFilter.tsx +++ b/src/Components/Utils/Filter/useFilter.tsx @@ -155,14 +155,14 @@ const useFilter = () => { return ( {t("practical.reset")} {(formik) => { useEffect(() => { @@ -101,13 +100,13 @@ const LayoutModel = ({ - + {t("practical.cancel")} - - + { initialButtonName ? t(`practical.${isAddModal ? "add" : "edit"}`) @@ -118,7 +117,7 @@ const LayoutModel = ({ )} - + diff --git a/src/Layout/Ui/SideBar.tsx b/src/Layout/Ui/SideBar.tsx index 2ff4ddf..73d63d3 100644 --- a/src/Layout/Ui/SideBar.tsx +++ b/src/Layout/Ui/SideBar.tsx @@ -66,7 +66,9 @@ const SideBar = ({ {t("sidebar.setting")} - {navigate("/setting")}}> + {navigate("/setting")}} + > {t("sidebar.setting")} diff --git a/src/Pages/Admin/FinancialCollection/Model/AddModel.tsx b/src/Pages/Admin/FinancialCollection/Model/AddModel.tsx new file mode 100644 index 0000000..40df4b3 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Model/AddModel.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import { getInitialValues, getValidationSchema } from "./formUtil"; +import { ModalEnum } from "../../../../enums/Model"; +import LayoutModel from "../../../../Layout/Dashboard/LayoutModel"; +import { QueryStatusEnum } from "../../../../enums/QueryStatus"; +import { useAddTag } from "../../../../api/tags"; +import ModelForm from "./ModelForm"; +import { useAddFinancialCollection } from "../../../../api/financial_collection"; +import { formatDate } from "../../../../utils/formatDate"; +import dayjs from "dayjs"; + +const AddModel: React.FC = () => { + const { mutate, status } = useAddFinancialCollection(); + + const handleSubmit = (values: any) => { + console.log(values); + + mutate({ + ...values, + date: dayjs(values?.date).format('YYYY-MM-DD'), + }); + }; + return ( + <> + + + + > + ); +}; + +export default AddModel; diff --git a/src/Pages/Admin/FinancialCollection/Model/EditModel.tsx b/src/Pages/Admin/FinancialCollection/Model/EditModel.tsx new file mode 100644 index 0000000..0623645 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Model/EditModel.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { getInitialValues, getValidationSchema, getValidationSchemaEdit } from "./formUtil"; +import { ModalEnum } from "../../../../enums/Model"; +import LayoutModel from "../../../../Layout/Dashboard/LayoutModel"; +import ModelForm from "./ModelForm"; +import { QueryStatusEnum } from "../../../../enums/QueryStatus"; +import { useObjectToEdit } from "../../../../zustand/ObjectToEditState"; +import { useUpdateTag } from "../../../../api/tags"; +import { useUpdateFinancialCollection } from "../../../../api/financial_collection"; +import dayjs from "dayjs"; + +const EditModel: React.FC = () => { + const { mutate, status } = useUpdateFinancialCollection(); + const { objectToEdit } = useObjectToEdit((state) => state); + console.log(objectToEdit); + + const handleSubmit = (values: any) => { + mutate({ + ...values, + date: dayjs(values?.date).format('YYYY-MM-DD'), + }); + }; + return ( + <> + + + + > + ); +}; + +export default EditModel; diff --git a/src/Pages/Admin/FinancialCollection/Model/FilterForm.tsx b/src/Pages/Admin/FinancialCollection/Model/FilterForm.tsx new file mode 100644 index 0000000..74efbf4 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Model/FilterForm.tsx @@ -0,0 +1,35 @@ +import React from "react"; +import ValidationField from "../../../../Components/ValidationField/ValidationField"; +import { Col, Row } from "reactstrap"; +import { useGetAllReseller } from "../../../../api/reseller"; + +const FilterForm = () => { + const {data} = useGetAllReseller() + + return ( + + + + + + ({ + ...e, + fullName: `${e.first_name} ${e.last_name}` + }))} + fieldNames={{ + label: "fullName", + value: "id" + }} + /> + + + + ); +}; + +export default FilterForm; diff --git a/src/Pages/Admin/FinancialCollection/Model/ModelForm.tsx b/src/Pages/Admin/FinancialCollection/Model/ModelForm.tsx new file mode 100644 index 0000000..c390198 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Model/ModelForm.tsx @@ -0,0 +1,38 @@ +import { Col, Row } from "reactstrap"; +import ValidationField from "../../../../Components/ValidationField/ValidationField"; +import { useGetAllReseller } from "../../../../api/reseller"; + +const Form = ({isEdit= false}:{isEdit?:boolean}) => { + const {data} = useGetAllReseller() + + return ( + + + + + + + + {isEdit ? " " : + ({ + ...e, + fullName: `${e.first_name} ${e.last_name}` + }))} + fieldNames={{ + label: "fullName", + value: "id" + }} + /> + } + + + + ); +}; + +export default Form; diff --git a/src/Pages/Admin/FinancialCollection/Model/formUtil.ts b/src/Pages/Admin/FinancialCollection/Model/formUtil.ts new file mode 100644 index 0000000..153bc12 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Model/formUtil.ts @@ -0,0 +1,30 @@ +import * as Yup from "yup"; +import dayjs from "dayjs"; +export const getInitialValues = (objectToEdit: any): any => { + console.log(objectToEdit); + + return { + id: objectToEdit?.id ?? null, + description: objectToEdit?.description ?? null, + amount: objectToEdit?.amount ?? null, + date: objectToEdit?.date ? dayjs(objectToEdit?.date) : null, + reseller_id: objectToEdit?.reseller_id ?? null, + }; +}; + +export const getValidationSchema = () => { + return Yup.object().shape({ + description: Yup.string().required("validation.required"), + amount: Yup.mixed().required("validation.required"), + date: Yup.mixed().required("validation.required"), + reseller_id: Yup.mixed().required("validation.required"), + }); +}; + +export const getValidationSchemaEdit = () => { + return Yup.object().shape({ + description: Yup.string().required("validation.required"), + amount: Yup.mixed().required("validation.required"), + date: Yup.mixed().required("validation.required"), + }); +}; diff --git a/src/Pages/Admin/FinancialCollection/Page.tsx b/src/Pages/Admin/FinancialCollection/Page.tsx new file mode 100644 index 0000000..c2e219c --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Page.tsx @@ -0,0 +1,54 @@ +import { FaPlus } from "react-icons/fa"; +import useModalHandler from "../../../utils/useModalHandler"; +import { ModalEnum } from "../../../enums/Model"; +import { useTranslation } from "react-i18next"; +import { lazy, Suspense } from "react"; +import { Spin } from "antd"; +import { canAddFinancial_Collection, canAddTags } from "../../../utils/hasAbilityFn"; +import useSetPageTitle from "../../../Hooks/useSetPageTitle"; +import { useDeleteTag } from "../../../api/tags"; +import PageHeader from "../../../Layout/Dashboard/PageHeader"; +import FilterLayout from "../../../Layout/Dashboard/FilterLayout"; +import FilterForm from "./Model/FilterForm"; +import { useDeleteFinancialCollection } from "../../../api/financial_collection"; +const Table = lazy(() => import("./Table")); +const AddModalForm = lazy(() => import("./Model/AddModel")); +const EditModalForm = lazy(() => import("./Model/EditModel")); +const DeleteModalForm = lazy( + () => import("../../../Layout/Dashboard/DeleteModels"), +); + +const TableHeader = () => { + const [t] = useTranslation(); + + useSetPageTitle([ + {name:`${t(`page_header.home`)}`, path:"/"}, + {name:`${t(`page_header.financial_collection`)}`, path:"financial_collection"} + ]); + + const deleteMutation = useDeleteFinancialCollection(); + return ( + + }> + + } + filterTitle="sidebar.financial_collection" + /> + + + + + + + ); +}; + +export default TableHeader; diff --git a/src/Pages/Admin/FinancialCollection/Table.tsx b/src/Pages/Admin/FinancialCollection/Table.tsx new file mode 100644 index 0000000..912d680 --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/Table.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import DataTable from "../../../Layout/Dashboard/Table/DataTable"; +import { useColumns } from "./useTableColumns"; +import { useFilterState } from "../../../Components/Utils/Filter/FilterState"; +import { useFilterStateState } from "../../../zustand/Filter"; +import { useGetAllFinancialCollection } from "../../../api/financial_collection"; +const App: React.FC = () => { + + const { filterState } = useFilterState(); + const { Filter } = useFilterStateState(); + const name = Filter?.name ; + const sort_by = Filter?.sort_by ; + + const response = useGetAllFinancialCollection({ + pagination: true, + name, + sort_by, + ...filterState, + }); + + return ; +}; + +export default App; diff --git a/src/Pages/Admin/FinancialCollection/index.tsx b/src/Pages/Admin/FinancialCollection/index.tsx new file mode 100644 index 0000000..447f22d --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/index.tsx @@ -0,0 +1,17 @@ +import { useColumns } from "./useTableColumns"; +import Table from "./Table"; + +import { FaPlus } from "react-icons/fa"; + +import AddModalForm from "./Model/AddModel"; +import EditModalForm from "./Model/EditModel"; +// import DeleteModalForm from "../../"; + +export { + Table, + useColumns, + AddModalForm, + EditModalForm, + // DeleteModalForm, + FaPlus, +}; diff --git a/src/Pages/Admin/FinancialCollection/useTableColumns.tsx b/src/Pages/Admin/FinancialCollection/useTableColumns.tsx new file mode 100644 index 0000000..fb5873b --- /dev/null +++ b/src/Pages/Admin/FinancialCollection/useTableColumns.tsx @@ -0,0 +1,73 @@ +import { TableColumnsType } from "antd"; +import { tags } from "../../../types/Item"; +import { ModalEnum } from "../../../enums/Model"; +import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; +import { useModalState } from "../../../zustand/Modal"; +import { useTranslation } from "react-i18next"; +import { canDeleteFinancial_Collection, canDeleteTags, canEditFinancial_Collection, canEditTags } from "../../../utils/hasAbilityFn"; +import ActionButtons from "../../../Components/Table/ActionButtons"; + +export const useColumns = () => { + const [t] = useTranslation(); + + const { setIsOpen } = useModalState((state) => state); + + const { setObjectToEdit } = useObjectToEdit((state) => state); + const handelDelete = (record: any) => { + setObjectToEdit(record); + setIsOpen(ModalEnum?.Financial_Collection_DELETE); + }; + const handleEdit = (record: any) => { + setObjectToEdit(record); + setIsOpen(ModalEnum?.Financial_Collection_EDIT); + }; + + const columns: TableColumnsType = [ + { + title: t("columns.id"), + dataIndex: "id", + key: "id", + align: "center", + }, + { + title: t("columns.amount"), + dataIndex: "amount", + key: "amount", + align: "center", + ellipsis:true + }, + { + title: t("columns.date"), + dataIndex: "date", + key: "date", + align: "center", + ellipsis:true + }, + { + title: t("columns.description"), + dataIndex: "description", + key: "description", + align: "center", + ellipsis:true + }, + { + title: t("columns.procedure"), + key: "actions", + align: "center", + width: "25vw", + render: (_text, record, index) => { + return ( + handelDelete(record)} + onEdit={() => handleEdit(record)} + /> + ); + }, + }, + ]; + + return columns; +}; diff --git a/src/Pages/Admin/Grade/Table.tsx b/src/Pages/Admin/Grade/Table.tsx index 71c8528..107e721 100644 --- a/src/Pages/Admin/Grade/Table.tsx +++ b/src/Pages/Admin/Grade/Table.tsx @@ -16,6 +16,7 @@ const App: React.FC = () => { name, sort_by }); +// console.log(response); return ; }; diff --git a/src/Pages/ReSeller/Collections/Model/CollectionInfoCard.tsx b/src/Pages/ReSeller/Collections/Model/CollectionInfoCard.tsx index 1a7d7cf..4962836 100644 --- a/src/Pages/ReSeller/Collections/Model/CollectionInfoCard.tsx +++ b/src/Pages/ReSeller/Collections/Model/CollectionInfoCard.tsx @@ -1,12 +1,13 @@ +import { Spin } from "antd"; import { useTranslation } from "react-i18next" -const CollectionInfoCard = ({label,value}:{label:string,value:string}) => { +const CollectionInfoCard = ({label,value,isLoading}:{label:string,value:string,isLoading?:boolean}) => { const {t} = useTranslation(); return ( {t(`card.${label}`)} - {t(value)} + {isLoading ?: t(value)} ) } diff --git a/src/Pages/ReSeller/Collections/Model/CollectionsCards.tsx b/src/Pages/ReSeller/Collections/Model/CollectionsCards.tsx index 8019084..9d4426f 100644 --- a/src/Pages/ReSeller/Collections/Model/CollectionsCards.tsx +++ b/src/Pages/ReSeller/Collections/Model/CollectionsCards.tsx @@ -1,30 +1,39 @@ import React from 'react' import CollectionInfoCard from './CollectionInfoCard' import { useTranslation } from 'react-i18next' +import { useGetSummery } from '../../../../api/sales'; +import { Spin } from 'antd'; -const CollectionsCards = ({data}:{data?:any}) => { +const CollectionsCards = () => { const {t} = useTranslation(); + const { data ,isLoading} = useGetSummery(); + return ( <> > ) diff --git a/src/Pages/ReSeller/Collections/Model/FilterForm.tsx b/src/Pages/ReSeller/Collections/Model/FilterForm.tsx index d601efb..b687b6a 100644 --- a/src/Pages/ReSeller/Collections/Model/FilterForm.tsx +++ b/src/Pages/ReSeller/Collections/Model/FilterForm.tsx @@ -1,18 +1,17 @@ -import React from "react"; import ValidationField from "../../../../Components/ValidationField/ValidationField"; import { Col, Row } from "reactstrap"; +import { useGetAllReseller } from "../../../../api/reseller"; const FilterForm = () => { + const {data} = useGetAllReseller() + console.log(data); + return ( - - {/* */} + + diff --git a/src/Pages/ReSeller/Collections/Page.tsx b/src/Pages/ReSeller/Collections/Page.tsx index 37f9b22..e62a422 100644 --- a/src/Pages/ReSeller/Collections/Page.tsx +++ b/src/Pages/ReSeller/Collections/Page.tsx @@ -14,7 +14,7 @@ const TableHeader = () => { {name:`${t(`page_header.home`)}`, path:"/"}, {name:`${t(`page_header.collections`)}`, path:"collections"} ]); - + return ( }> @@ -22,7 +22,7 @@ const TableHeader = () => { pageTitle="collections" /> - + } diff --git a/src/Pages/ReSeller/Collections/Show/Model/FilterForm.tsx b/src/Pages/ReSeller/Collections/Show/Model/FilterForm.tsx new file mode 100644 index 0000000..1c2464c --- /dev/null +++ b/src/Pages/ReSeller/Collections/Show/Model/FilterForm.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import ValidationField from "../../../../../Components/ValidationField/ValidationField"; +import { Col, Row } from "reactstrap"; + +const FilterForm = () => { + return ( + + + + + {/* */} + + + + ); +}; + +export default FilterForm; diff --git a/src/Pages/ReSeller/Collections/Show/Page.tsx b/src/Pages/ReSeller/Collections/Show/Page.tsx new file mode 100644 index 0000000..8b672fd --- /dev/null +++ b/src/Pages/ReSeller/Collections/Show/Page.tsx @@ -0,0 +1,35 @@ +import { useTranslation } from "react-i18next"; +import { lazy, Suspense } from "react"; +import { Spin } from "antd"; +import useSetPageTitle from "../../../../Hooks/useSetPageTitle"; +import PageHeader from "../../../../Layout/Dashboard/PageHeader"; +import FilterLayout from "../../../../Layout/Dashboard/FilterLayout"; +import FilterForm from "./Model/FilterForm"; +const Table = lazy(() => import("./Table")); + +const TableHeader = () => { + const [t] = useTranslation(); + useSetPageTitle([ + {name:`${t(`page_header.home`)}`, path:"/"}, + {name:`${t(`page_header.collections`)}`, path:"collections"}, + {name:`${t(`page_header.show_collection`)}`, path:"show_collection"}, + + ]); + + return ( + + }> + + } + filterTitle="table.show_collection" + /> + + + + ); +}; + +export default TableHeader; diff --git a/src/Pages/ReSeller/Collections/Show/Table.tsx b/src/Pages/ReSeller/Collections/Show/Table.tsx new file mode 100644 index 0000000..d4478d7 --- /dev/null +++ b/src/Pages/ReSeller/Collections/Show/Table.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import DataTable from "../../../../Layout/Dashboard/Table/DataTable"; +import { useColumns } from "./useTableColumns"; +import useSearchQuery from "../../../../api/utils/useSearchQuery"; +import { useFilterState } from "../../../../Components/Utils/Filter/FilterState"; +import { useGetCollection } from "../../../../api/collections"; +import { useParams } from "react-router-dom"; + +const App: React.FC = () => { + const [searchQuery] = useSearchQuery("name"); + const { filterState } = useFilterState(); + const {collection_id}= useParams() + console.log(collection_id); + + const response = useGetCollection({ + name: searchQuery, + pagination: true, + ...filterState, + show:collection_id + }); + + return ; +}; + +export default App; diff --git a/src/Pages/ReSeller/Collections/Show/useTableColumns.tsx b/src/Pages/ReSeller/Collections/Show/useTableColumns.tsx new file mode 100644 index 0000000..9eb9da5 --- /dev/null +++ b/src/Pages/ReSeller/Collections/Show/useTableColumns.tsx @@ -0,0 +1,35 @@ +import { TableColumnsType } from "antd"; +import { Collection } from "../../../../types/Item"; +import { useTranslation } from "react-i18next"; +export const useColumns = () => { + const [t] = useTranslation(); + + const columns: TableColumnsType = [ + { + title: t("columns.ID"), + dataIndex: "id", + key: "id", + align: "center", + }, + { + title: t("columns.amount"), + dataIndex: "amount", + key: "amount", + align: "center", + }, + { + title: t("columns.date"), + dataIndex: "date", + key: "date", + align: "center", + }, + { + title: t("columns.description"), + dataIndex: "description", + key: "description", + align: "center", + }, + ]; + + return columns; +}; diff --git a/src/Pages/ReSeller/Collections/useTableColumns.tsx b/src/Pages/ReSeller/Collections/useTableColumns.tsx index b5057b1..5c581a1 100644 --- a/src/Pages/ReSeller/Collections/useTableColumns.tsx +++ b/src/Pages/ReSeller/Collections/useTableColumns.tsx @@ -20,9 +20,9 @@ export const useColumns = () => { align: "center", }, { - title: t("columns.date_of_receipt"), - dataIndex: "date_of_receipt", - key: "date_of_receipt", + title: t("columns.date"), + dataIndex: "date", + key: "date", align: "center", }, { @@ -31,12 +31,6 @@ export const useColumns = () => { key: "description", align: "center", }, - { - title: t("columns.residual"), - dataIndex: "residual", - key: "residual", - align: "center", - }, ]; return columns; diff --git a/src/Pages/ReSeller/Sales/Model/AddModel.tsx b/src/Pages/ReSeller/Sales/Model/AddModel.tsx index 10eeea0..c8cf0e1 100644 --- a/src/Pages/ReSeller/Sales/Model/AddModel.tsx +++ b/src/Pages/ReSeller/Sales/Model/AddModel.tsx @@ -5,54 +5,33 @@ import { QueryStatusEnum } from "../../../../enums/QueryStatus"; import ValidationModelForm from "./ValidationModelForm"; import SalesModelForm from "./SalesModelForm"; import SubmitModelForm from "./SubmitModelForm"; - -import { useAddSales } from "../../../../api/sales"; import LayoutModel from "./LayoutModel"; import { useObjectToEdit } from "../../../../zustand/ObjectToEditState"; +import { salesModelEnum } from "../../../../enums/salesForms"; const AddModel: React.FC = () => { - const { mutate, status } = useAddSales(); - - const handleSubmit = (values: any) => { - // mutate({ - // ...values, - // }); - }; - enum modal { - Number= 0, - Package= 1, - Sure= 2 - } + const { objectToEdit } = useObjectToEdit(); + const handleSubmit = () => {}; const Forms = { - [modal.Number]: , - [modal.Package] : , - [modal.Sure]: + [salesModelEnum.Number]: , + [salesModelEnum.Package] : , + [salesModelEnum.Submit]: } - // const modelTitle = Forms.[modal.Number] ? "sale" : Forms.Package ? "adcs" : "Ascas"; - const { objectToEdit,setObjectToEdit } = useObjectToEdit(); -console.log(objectToEdit); + console.log(objectToEdit); - return ( <> - {/* {Forms["Number"]} */} - <> - - - - > - + {Forms[salesModelEnum.Number]} + {Forms[salesModelEnum.Package]} + {Forms[salesModelEnum.Submit]} > ); diff --git a/src/Pages/ReSeller/Sales/Model/FilterForm.tsx b/src/Pages/ReSeller/Sales/Model/FilterForm.tsx index d601efb..92b41b0 100644 --- a/src/Pages/ReSeller/Sales/Model/FilterForm.tsx +++ b/src/Pages/ReSeller/Sales/Model/FilterForm.tsx @@ -1,4 +1,3 @@ -import React from "react"; import ValidationField from "../../../../Components/ValidationField/ValidationField"; import { Col, Row } from "reactstrap"; @@ -11,8 +10,14 @@ const FilterForm = () => { placeholder="activation_date" label="activation_date" name="activation_date" + type="Date" + /> + - {/* */} diff --git a/src/Pages/ReSeller/Sales/Model/LayoutModel.tsx b/src/Pages/ReSeller/Sales/Model/LayoutModel.tsx index cf8f36e..8511ac7 100644 --- a/src/Pages/ReSeller/Sales/Model/LayoutModel.tsx +++ b/src/Pages/ReSeller/Sales/Model/LayoutModel.tsx @@ -6,56 +6,55 @@ import { useTranslation } from "react-i18next"; import { QueryStatusEnum } from "../../../../enums/QueryStatus"; import SpinContainer from "../../../../Components/Layout/SpinContainer"; import { MdCancel } from "react-icons/md"; -import { Form, Formik } from "formik"; +import { Form, Formik, useFormikContext } from "formik"; interface LayoutModalProps { isAddModal?: boolean; - modelTitle: string; handleSubmit: (values: any) => void; + handleReset?: (values: any) => void; getInitialValues: any; getValidationSchema: any; children: React.ReactNode; - status: QueryStatusEnum; + status?: QueryStatusEnum; ModelEnum: any; ModelClassName?: string; width?: string; isLoading?: boolean; - buttonTitle?:string; - initialButtonName?:boolean } const LayoutModel = ({ isAddModal = true, children, handleSubmit = () => {}, + handleReset = () => {}, getInitialValues, getValidationSchema, status, - modelTitle, ModelEnum, ModelClassName, width = "800px", isLoading = false, - buttonTitle, - initialButtonName = true, }: LayoutModalProps) => { const { isOpen, setIsOpen } = useModalState((state) => state); const { setObjectToEdit } = useObjectToEdit(); + const formik = useFormikContext(); useEffect(() => { if (isAddModal && status === QueryStatusEnum.SUCCESS) { setIsOpen("isSuccess"); setObjectToEdit({}); + formik.resetForm(); return; } if (status === QueryStatusEnum.SUCCESS) { setIsOpen(""); - setObjectToEdit({}); } + }, [setIsOpen, status]); const handleCancel = () => { setIsOpen(""); setObjectToEdit({}); + formik.resetForm(); }; const [t] = useTranslation(); @@ -75,7 +74,7 @@ const LayoutModel = ({ initialValues={getInitialValues} validationSchema={getValidationSchema} onSubmit={handleSubmit} - + onReset={handleReset} > {(formik) => { useEffect(() => { diff --git a/src/Pages/ReSeller/Sales/Model/SalesModelForm.tsx b/src/Pages/ReSeller/Sales/Model/SalesModelForm.tsx index cd60205..5f94aa8 100644 --- a/src/Pages/ReSeller/Sales/Model/SalesModelForm.tsx +++ b/src/Pages/ReSeller/Sales/Model/SalesModelForm.tsx @@ -1,56 +1,54 @@ -import { Col, Row } from "reactstrap"; import ValidationField from "../../../../Components/ValidationField/ValidationField"; -import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect"; import { useFormikContext } from "formik"; import { useModalState } from "../../../../zustand/Modal"; import { useObjectToEdit } from "../../../../zustand/ObjectToEditState"; import { useTranslation } from "react-i18next"; import { QueryStatusEnum } from "../../../../enums/QueryStatus"; -import { Divider, Spin } from "antd"; +import { Button, Divider, Spin } from "antd"; import { MdCancel } from "react-icons/md"; -const Form = ({status}:{status?:any}) => { +const Form = () => { - const {values,setFieldValue} = useFormikContext() - console.log(values?.currentModalIndex); - const { isOpen, setIsOpen } = useModalState((state) => state); const { objectToEdit,setObjectToEdit } = useObjectToEdit(); + const { setIsOpen } = useModalState((state) => state); const {t} = useTranslation(); + const formik = useFormikContext(); + const { values, setFieldValue } = useFormikContext() + const handleNext = ()=>{ setFieldValue( "currentModalIndex" , values?.currentModalIndex + 1 ) } + const handleCancel = () => { setIsOpen(""); - setObjectToEdit({}); + formik.resetForm(); }; -console.log(objectToEdit); const student_info = objectToEdit?.data?.data const PackagesInfo = student_info?.packages.map((info:any) => ({ id: info?.id, name: info.name + " " + `( ${info?.original_price} )` })); - -console.log(PackagesInfo); + return ( values?.currentModalIndex == 1 && - - - - {t(`models.add_sales`)}{" "} - - - - + + + + {t(`models.add_sales`)}{" "} + + + + {student_info?.first_name +" " + student_info?.last_name} - الصف: {student_info?.grade_name} + {t("models.course")}: {student_info?.grade_name} - {/* {values?.currentModalIndex} */} - + {t("practical.cancel")} - - + )} - + ); diff --git a/src/Pages/ReSeller/Sales/Model/SubmitModelForm.tsx b/src/Pages/ReSeller/Sales/Model/SubmitModelForm.tsx index 129acdd..d098dbc 100644 --- a/src/Pages/ReSeller/Sales/Model/SubmitModelForm.tsx +++ b/src/Pages/ReSeller/Sales/Model/SubmitModelForm.tsx @@ -1,57 +1,77 @@ -import { Col, Row } from "reactstrap"; import ValidationField from "../../../../Components/ValidationField/ValidationField"; -import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect"; import { useFormikContext } from "formik"; import { useModalState } from "../../../../zustand/Modal"; import { useObjectToEdit } from "../../../../zustand/ObjectToEditState"; import { useTranslation } from "react-i18next"; import { QueryStatusEnum } from "../../../../enums/QueryStatus"; -import { Divider, Spin } from "antd"; +import { Button, Divider, Spin } from "antd"; import { MdCancel } from "react-icons/md"; +import { useAddSales } from "../../../../api/sales"; +import { useEffect } from "react"; +import { toast } from "react-toastify"; -const Form = ({status}:{status?:any}) => { +const Form = () => { - const {values,setFieldValue} = useFormikContext() - console.log(values?.currentModalIndex); - const { isOpen, setIsOpen } = useModalState((state) => state); const { setObjectToEdit,objectToEdit } = useObjectToEdit(); + const { resetForm, values, setFieldValue } = useFormikContext(); + const { setIsOpen } = useModalState((state) => state); const {t} = useTranslation(); - const formik = useFormikContext(); - const handleNext = ()=>{ - setFieldValue( "currentModalIndex" , values?.currentModalIndex - 2 ) - setIsOpen(""); - - } - const handleCancel = () => { - setIsOpen(""); - setObjectToEdit({}); - }; - + const {mutate,status,error}:any = useAddSales(); + const coupon_id_object = objectToEdit?.data?.data?.packages.find((e:any)=>(e.id === values?.package_id)) const student_info = objectToEdit?.data?.data const PackagesInfo = student_info?.packages.map((info:any) => ({ id: info?.id, name: info.name + " " + `( ${info?.original_price} )` })); + + const handleNext = ()=>{ + mutate({ + package_id:values?.package_id, + student_id:objectToEdit?.data?.data?.student_id, + coupon_id:coupon_id_object?.coupon_id + }); + } + const handleCancel = () => { + resetForm(); + setIsOpen(""); + setFieldValue( "currentModalIndex" , 0 ) + }; + + useEffect(() => { + if(status === QueryStatusEnum.SUCCESS){ + setIsOpen(""); + setObjectToEdit({}); + setFieldValue( "currentModalIndex" , values?.currentModalIndex - 2 ) + }else if(status === QueryStatusEnum.ERROR){ + toast.error(t(`toast.${error?.response?.data?.message}` || `toast.error_while_trying_please_try_again`)) + } + if(values?.currentModalIndex >= 3){ + setIsOpen("") + setObjectToEdit({}) + setFieldValue( "currentModalIndex" , 0 ) + } + }, [values?.currentModalIndex,status]) + return ( values?.currentModalIndex == 2 && - - - {t(`models.are_you_sure_about_sale`)}{" "} - - - - + + + {t(`models.are_you_sure_about_sale`)}{" "} + + + + - أنس محمد ياسر القلعجي - الصف: بكالوريا / علمي + {student_info?.first_name +" " + student_info?.last_name} + {t("models.course")}: {student_info?.grade_name} { type="Select" option={PackagesInfo} disabled - allowClear={false} + allowClear={false} /> - {/* {values?.currentModalIndex} */} - + {t("practical.cancel")} - - + { )} - + ); diff --git a/src/Pages/ReSeller/Sales/Model/ValidationModelForm.tsx b/src/Pages/ReSeller/Sales/Model/ValidationModelForm.tsx index 60fcf74..0059aef 100644 --- a/src/Pages/ReSeller/Sales/Model/ValidationModelForm.tsx +++ b/src/Pages/ReSeller/Sales/Model/ValidationModelForm.tsx @@ -1,27 +1,29 @@ import { Col, Row } from "reactstrap"; import ValidationField from "../../../../Components/ValidationField/ValidationField"; -import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect"; import { useFormikContext } from "formik"; import { useModalState } from "../../../../zustand/Modal"; import { useObjectToEdit } from "../../../../zustand/ObjectToEditState"; import { useTranslation } from "react-i18next"; import { QueryStatusEnum } from "../../../../enums/QueryStatus"; -import { Divider, Spin } from "antd"; +import { Button, Divider, Spin } from "antd"; import { MdCancel } from "react-icons/md"; import { useEffect, useState } from "react"; import { useGetStudentByPhone } from "../../../../api/sales"; +import { toast } from "react-toastify"; const Form = () => { - const {values,setFieldValue} = useFormikContext() - const [triggerApi, setTriggerApi] = useState(false) - const phoneNumber : number = values?.phone_number - const { isOpen, setIsOpen } = useModalState((state) => state); - const { objectToEdit,setObjectToEdit } = useObjectToEdit(); - const {t} = useTranslation(); - const formik = useFormikContext(); - const {data,isError,isSuccess,status} = useGetStudentByPhone({ - phone_number:phoneNumber + const [triggerApi, setTriggerApi] = useState(false) + const { setIsOpen } = useModalState((state) => state); + const { setObjectToEdit } = useObjectToEdit(); + const {t} = useTranslation(); + + const formik = useFormikContext(); + const {values,setFieldValue} = useFormikContext() + const phoneNumber : number = values?.phone_number + + const { data,isError,status } = useGetStudentByPhone({ + phone_number:phoneNumber, },{ enabled: triggerApi }); @@ -31,70 +33,67 @@ const Form = () => { setTriggerApi(true) } } - console.log(status); - console.log(isSuccess); - - const handleCancel = () => { - setIsOpen(""); - setObjectToEdit({}); - }; - console.log(data?.data); - - useEffect(() => { + const handleCancel = () => { + setIsOpen(""); + formik.resetForm(); + }; + + useEffect(() => { if(!!data?.data?.phone_number){ setFieldValue( "currentModalIndex" , values?.currentModalIndex + 1 ) setObjectToEdit({data}) setTriggerApi(false) - } - else { + else if(!data?.data){ setTriggerApi(false) - } - - }, [data?.data]) + if(isError){ + toast.error(t('toast.phone_number_not_found')) + } + }, [data?.data,triggerApi,isError]) return ( values?.currentModalIndex == 0 && - - - - {t(`models.add_sales`)}{" "} - - - - - - - - - - - - {t("practical.cancel")} - - + + {t(`models.add_sales`)}{" "} + + + + + + + + + + + + + {t("practical.cancel")} + + - {t(`practical.search`)} - {status === QueryStatusEnum.LOADING && ( - - - - )} - - + {t(`practical.sale`)} + {status === QueryStatusEnum.LOADING && ( + + + + )} + + + ); }; diff --git a/src/Pages/ReSeller/Sales/Model/formUtil.ts b/src/Pages/ReSeller/Sales/Model/formUtil.ts index 23cec28..188fba5 100644 --- a/src/Pages/ReSeller/Sales/Model/formUtil.ts +++ b/src/Pages/ReSeller/Sales/Model/formUtil.ts @@ -1,26 +1,26 @@ import * as Yup from "yup"; +// Function to get the initial values export const getInitialValues = (objectToEdit: any): any => { + console.log(objectToEdit); + return { id: objectToEdit?.id ?? null, phone_number: objectToEdit?.phone_number ?? null, currentModalIndex: 0, - package_id:objectToEdit?.package_id ?? null + package_id: objectToEdit?.package_id ?? null, + student_id: objectToEdit?.student_id ?? null, + coupon_id: objectToEdit?.coupon_id ?? null, }; }; +// Validation schema with Yup export const getValidationSchema = () => { return Yup.object().shape({ phone_number: Yup.string() .required("Phone number is required") - .length(10, "Phone number must be exactly 10 numbers") - .matches(/^\d{10}$/, "Phone number must be a valid 10-number number"), - currentModalIndex: Yup.number().max(2) - }); -}; - -export const getValidationSchemaForSale = () => { - return Yup.object().shape({ - package_id: Yup.string().required("package_id is required") + .length(10, "Phone number must be exactly 10 digits") + .matches(/^\d{10}$/, "Phone number must be a valid 10-digit number"), + currentModalIndex: Yup.number().max(2), }); }; diff --git a/src/Pages/ReSeller/Sales/Page.tsx b/src/Pages/ReSeller/Sales/Page.tsx index cec13a9..6fe6b09 100644 --- a/src/Pages/ReSeller/Sales/Page.tsx +++ b/src/Pages/ReSeller/Sales/Page.tsx @@ -11,11 +11,14 @@ const Table = lazy(() => import("./Table")); const AddModalForm = lazy(() => import("./Model/AddModel")); const TableHeader = () => { + const [t] = useTranslation(); useSetPageTitle([ {name:`${t(`page_header.home`)}`, path:"/"}, {name:`${t(`page_header.sales`)}`, path:"sales"} - ]); return ( + ]); + + return ( }> { - const [searchQuery] = useSearchQuery("name"); - const { filterState } = useFilterState(); +import { formatDate } from "../../../utils/formatDate"; +const App: React.FC = () => { + + const [searchQuery] = useSearchQuery("name"); + const { filterState }:any = useFilterState(); + const response = useGetAllSales({ name: searchQuery, pagination: true, ...filterState, + activation_date:formatDate(filterState?.activation_date), + expiration_date:formatDate(filterState?.expiration_date), }); return ; diff --git a/src/Pages/ReSeller/Sales/index.tsx b/src/Pages/ReSeller/Sales/index.tsx index 447f22d..f9646fc 100644 --- a/src/Pages/ReSeller/Sales/index.tsx +++ b/src/Pages/ReSeller/Sales/index.tsx @@ -4,14 +4,10 @@ import Table from "./Table"; import { FaPlus } from "react-icons/fa"; import AddModalForm from "./Model/AddModel"; -import EditModalForm from "./Model/EditModel"; -// import DeleteModalForm from "../../"; export { Table, useColumns, AddModalForm, - EditModalForm, - // DeleteModalForm, FaPlus, }; diff --git a/src/Pages/ReSeller/Sales/useTableColumns.tsx b/src/Pages/ReSeller/Sales/useTableColumns.tsx index ea81cfc..62930d4 100644 --- a/src/Pages/ReSeller/Sales/useTableColumns.tsx +++ b/src/Pages/ReSeller/Sales/useTableColumns.tsx @@ -5,7 +5,6 @@ import { useTranslation } from "react-i18next"; export const useColumns = () => { const [t] = useTranslation(); - const columns: TableColumnsType = [ { title: t("columns.id"), @@ -15,32 +14,38 @@ export const useColumns = () => { }, { title: t("columns.student_full_name"), + key: "student_full_name", + align: "center", + render: (row) => { + return row?.student?.first_name +" "+ row?.student?.last_name; + }, + }, + { + title: t("columns.grade"), + render: (row) => { + return row?.package?.name; + }, + key: "package", + align: "center", + }, + { + title: t("columns.paid_price"), + render: (row) => { + return row?.package?.price; + }, + key: "price", + align: "center", + }, + { + title: t("columns.activation_date"), dataIndex: "activation_date", key: "activation_date", align: "center", }, { - title: t("columns.grade"), - dataIndex: "grade", - key: "grade", - align: "center", - }, - { - title: t("columns.package"), - dataIndex: "package", - key: "package", - align: "center", - }, - { - title: t("columns.amount_paid"), - dataIndex: "amount_paid", - key: "amount_paid", - align: "center", - }, - { - title: t("columns.sale_date"), - dataIndex: "sale_date", - key: "sale_date", + title: t("columns.expiration_date"), + dataIndex: "expiration_date", + key: "expiration_date", align: "center", }, ]; diff --git a/src/Pages/ReSeller/StudentPackage/useTableColumns.tsx b/src/Pages/ReSeller/StudentPackage/useTableColumns.tsx index 589bb54..c22cfd6 100644 --- a/src/Pages/ReSeller/StudentPackage/useTableColumns.tsx +++ b/src/Pages/ReSeller/StudentPackage/useTableColumns.tsx @@ -65,24 +65,6 @@ export const useColumns = () => { return row?.student?.sex; }, }, - // { - // title: t("columns.procedure"), - // key: "actions", - // align: "center", - // width: "25vw", - // render: (_text, record, index) => { - // return ( - // handelDelete(record)} - // onEdit={() => handleEdit(record)} - - // /> - // ); - // }, - // }, ]; return columns; diff --git a/src/Routes.tsx b/src/Routes.tsx index 96ffbbf..334298f 100644 --- a/src/Routes.tsx +++ b/src/Routes.tsx @@ -31,6 +31,8 @@ const Manager = React.lazy(() => import("./Pages/Admin/Manager/Page")); const AddManager = React.lazy(() => import("./Pages/Admin/Manager/Add/Page")); const EditManager = React.lazy(() => import("./Pages/Admin/Manager/Edit/Page")); +const FinancialCollection = React.lazy(() => import("./Pages/Admin/FinancialCollection/Page")); + const ReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Page")); const ShowReSeller = React.lazy(() => import("./Pages/Admin/Reseller/show/Page")); @@ -54,6 +56,7 @@ const Param = React.lazy(() => import("./Pages/Admin/Param/Page")); /// RESELLER /// const Sales = React.lazy(() => import("./Pages/ReSeller/Sales/Page")); const Collections = React.lazy(() => import("./Pages/ReSeller/Collections/Page")); +const ShowCollection = React.lazy(() => import("./Pages/ReSeller/Collections/Show/Page")); const NotificationReSeller = React.lazy(() => import("./Pages/ReSeller/Notifications/Page")); const ProfileReSeller = React.lazy(() => import("./Pages/ReSeller/Profile/Page")); @@ -205,7 +208,17 @@ export const menuItems: TMenuItem[] = [ abilities_value: ABILITIES_VALUES_ENUM.INDEX, prevPath: 0, }, + { + header: "page_header.financial_collection", + element: , + icon: , + text: "sidebar.financial_collection", + path: `/${ABILITIES_ENUM?.Financial_Collection}`, + abilities: ABILITIES_ENUM?.Financial_Collection, + abilities_value: ABILITIES_VALUES_ENUM.INDEX, + prevPath: 0, + }, /// RESELLER ///// { @@ -230,17 +243,17 @@ export const menuItems: TMenuItem[] = [ prevPath: 0, type: UserTypeEnum.RE_SELLER, }, - { - header: "page_header.profile", - element: , - icon: , - text: "sidebar.profile", - path: `/${ABILITIES_ENUM?.PROFILE}`, - abilities: ABILITIES_ENUM?.Profile_RE_SELLER, - abilities_value: ABILITIES_VALUES_ENUM.INDEX, - prevPath: 0, - type: UserTypeEnum.RE_SELLER, - }, + // { + // header: "page_header.profile", + // element: , + // icon: , + // text: "sidebar.profile", + // path: `/${ABILITIES_ENUM?.PROFILE}`, + // abilities: ABILITIES_ENUM?.Profile_RE_SELLER, + // abilities_value: ABILITIES_VALUES_ENUM.INDEX, + // prevPath: 0, + // type: UserTypeEnum.RE_SELLER, + // }, ]; @@ -393,7 +406,16 @@ export const CrudRoute: TCrudRoute[] = [ abilities_value: ABILITIES_VALUES_ENUM.INDEX, prevPath: 1, }, - + { + header: "page_header.collection", + element: , + path: `/${ABILITIES_ENUM?.Collections}/:${ParamsEnum?.Collection_ID}`, + abilities: ABILITIES_ENUM?.Collections, + abilities_value: ABILITIES_VALUES_ENUM.INDEX, + prevPath: 0, + type:UserTypeEnum.RE_SELLER + + }, ]; export const AppRoutes: Record = Object.fromEntries( diff --git a/src/Styles/DataTable/FillterNav.scss b/src/Styles/DataTable/FillterNav.scss index 785d4eb..101c5ff 100644 --- a/src/Styles/DataTable/FillterNav.scss +++ b/src/Styles/DataTable/FillterNav.scss @@ -43,7 +43,9 @@ font-size: 20px; } } - +.main_modal{ + +} .add_button { outline: none; border: none; @@ -64,8 +66,12 @@ } transition: .4s ease-in-out; - + &:focus{ + // display: none !important; + } &:hover{ - scale: 1.1; + scale: 1.04; + background: var(--primary) !important; + color: var(--white) !important; } } diff --git a/src/Styles/Layout/FilterLayout.scss b/src/Styles/Layout/FilterLayout.scss index f155cf9..3b6a7c5 100644 --- a/src/Styles/Layout/FilterLayout.scss +++ b/src/Styles/Layout/FilterLayout.scss @@ -95,6 +95,10 @@ padding: 20px 10px !important; } +.filter_modal_add_button{ + padding: 20.8px 10px !important; +} + @media screen and (max-width: 800px) { .filter_modal_add_button, diff --git a/src/Styles/Layout/SideBar.scss b/src/Styles/Layout/SideBar.scss index afa62cb..208bc22 100644 --- a/src/Styles/Layout/SideBar.scss +++ b/src/Styles/Layout/SideBar.scss @@ -94,7 +94,6 @@ color: var(--borderColor); } svg { - // width: 20px; border-radius: 5px; padding: 4px; color: var(--borderColor); @@ -121,7 +120,6 @@ justify-content: start; background: inherit; font-size: 20px; - // height: 2.5vw; width: 80%; font-weight: bold; margin-inline: auto; @@ -152,7 +150,6 @@ } } .active { - // transform: translateX(-1vw); color: var(--text) !important; background-color: var(--bg); font-weight: bold; @@ -162,8 +159,6 @@ } i { - // width: 1.5vw; - // height: 1.5vw; border-radius: 5px; display: flex; justify-content: center; @@ -209,6 +204,11 @@ .side_bar_links { display: flex; align-items: center; + .DropDownLink{ + .DropDownIcon{ + transform: translate(-1.4vw,10px); + } + } .active { background: inherit !important; } @@ -240,7 +240,7 @@ div { @include Flex; width: 100%; - margin-block: 12px; + margin-block: 0px; svg { height: 36px; padding: 7px; diff --git a/src/Styles/Pages/collections.scss b/src/Styles/Pages/collections.scss index ba14340..df5e7d2 100644 --- a/src/Styles/Pages/collections.scss +++ b/src/Styles/Pages/collections.scss @@ -4,7 +4,6 @@ gap: 5px; .collection_info_card { display: flex; - justify-content: center; flex-direction: column; width: 15vw; padding: 1.2vw 1.2vw; diff --git a/src/api/collections.ts b/src/api/collections.ts index 520c905..682b2f9 100644 --- a/src/api/collections.ts +++ b/src/api/collections.ts @@ -1,7 +1,7 @@ import useGetQuery from "./helper/useGetQuery"; const API = { - GET: "/collections", + GET: "/resellers/financialCollection", }; const KEY = "collections"; diff --git a/src/api/financial_collection.ts b/src/api/financial_collection.ts new file mode 100644 index 0000000..cafbe21 --- /dev/null +++ b/src/api/financial_collection.ts @@ -0,0 +1,20 @@ +import useAddMutation from "./helper/useAddMutation"; +import useDeleteMutation from "./helper/useDeleteMutation"; +import useGetQuery from "./helper/useGetQuery"; +import useUpdateMutation from "./helper/useUpdateMutation"; + +const API = { + GET: "/financialCollection", + ADD: "/financialCollection", + DELETE: "/financialCollection", + UPDATE: "/financialCollection", +}; + +const KEY = "financialCollection"; + +export const useGetAllFinancialCollection = (params?: any, options?: any) => + useGetQuery(KEY, API.GET, params, options); +export const useAddFinancialCollection = () => useAddMutation(KEY, API.ADD); +export const useUpdateFinancialCollection = (params?: any) => useUpdateMutation(KEY, API.GET); +export const useDeleteFinancialCollection = (params?: any) => + useDeleteMutation(KEY, API.DELETE); diff --git a/src/api/helper/useAxios.ts b/src/api/helper/useAxios.ts index a269a92..e3b4e5d 100644 --- a/src/api/helper/useAxios.ts +++ b/src/api/helper/useAxios.ts @@ -34,10 +34,10 @@ function useAxios() { function (response: any) { const responseMsg = response?.data?.message; const method = response.config.method; - + const key = response.config.headers[HEADER_KEY]; const isToasted = response.config.headers["X-Custom-Message"]; - + const ResponseMessage = responseMsg || t("validation.the_possess_done_successful"); if (method !== AxiosQueryEnum?.GET) { @@ -50,13 +50,16 @@ function useAxios() { return response; }, function (error) { - console.log(error?.response); - - const status = error?.request?.status; + // Reject errors with non-2xx status codes + const status = error?.response?.status; + if (status >= 400) { + return Promise.reject(error); + } + const errorMsg = error?.response?.data?.error; const errorField = error?.response?.data; const method = error.config.method; - + if (status === AxiosStatusEnum.VALIDATION) { setValidation(errorMsg ?? errorField); const ErrorKey = Object?.keys(errorMsg)?.[0]; @@ -65,8 +68,6 @@ function useAxios() { ? errorMsg : errorMsg?.[ErrorKey]?.[0] ?? t("validation.some_thing_went_wrong"); - console.log(isString); - toast.error(t(`${isString}`)); return; } @@ -74,14 +75,17 @@ function useAxios() { logout(); navigate("/auth"); } - + if (method !== AxiosQueryEnum?.GET) { const errorMessage = errorMsg || t("validation.some_thing_went_wrong"); toast.error(errorMessage); return Promise.reject(error); } - }, + + return Promise.reject(error); // Important to reject the promise + } ); + return build_Axios; // return buildAxios.build(); diff --git a/src/api/sales.ts b/src/api/sales.ts index d1559c5..f03c1c9 100644 --- a/src/api/sales.ts +++ b/src/api/sales.ts @@ -3,15 +3,18 @@ import useGetQuery from "./helper/useGetQuery"; const API = { GET: "/resellers/studentPackage", - ADD: "/resellers/studentPackage", + ADD: "/resellers/studentPackage/purchase", GET_BY_PHONE: "/resellers/studentPackage/student", GET_SUMMERY: "/resellers/studentPackage/summery", }; const KEY = "sales"; +const KEY2 = "Sale_Student_Data"; +const KEY3 = "collection_summery"; + export const useGetAllSales = (params?: any, options?: any) =>useGetQuery(KEY, API.GET, params, options); export const useAddSales = () => useAddMutation(KEY, API.ADD); -export const useGetStudentByPhone = (params?: any, options?: any) => useGetQuery(KEY, API.GET_BY_PHONE, params, options); -export const useGetSummery = () => useGetQuery(KEY, API.GET_SUMMERY); \ No newline at end of file +export const useGetStudentByPhone = (params?: any, options?: any) => useGetQuery(KEY2, API.GET_BY_PHONE, params, options); +export const useGetSummery = () => useGetQuery(KEY3, API.GET_SUMMERY); \ No newline at end of file diff --git a/src/enums/Model.ts b/src/enums/Model.ts index c049240..ac7f393 100644 --- a/src/enums/Model.ts +++ b/src/enums/Model.ts @@ -243,4 +243,10 @@ export enum ModalEnum { /// email Email_EDIT = "Email.edit", + + ///financial_collection + + Financial_Collection_EDIT = "Financial_Collection.edit", + Financial_Collection_ADD = "Financial_Collection.add", + Financial_Collection_DELETE = "Financial_Collection.delete", } diff --git a/src/enums/abilities.ts b/src/enums/abilities.ts index 5182b4d..134be94 100644 --- a/src/enums/abilities.ts +++ b/src/enums/abilities.ts @@ -59,9 +59,10 @@ export enum ABILITIES_ENUM { SETTING = "setting", Email = "email", Phone = "phone", - CITY = "city", COUPON = "coupon", - AREA = "area" + CITY = "city", + AREA = "area", + Financial_Collection = "financial_collection" //// } diff --git a/src/enums/params.ts b/src/enums/params.ts index 00d927d..9fc54ac 100644 --- a/src/enums/params.ts +++ b/src/enums/params.ts @@ -14,4 +14,5 @@ export enum ParamsEnum { RE_SELLER_ID = "re_seller_id", ROLE_ID = "role_id", CITY_ID = "city_id", + Collection_ID = "collection_id" } diff --git a/src/enums/salesForms.ts b/src/enums/salesForms.ts new file mode 100644 index 0000000..e52b861 --- /dev/null +++ b/src/enums/salesForms.ts @@ -0,0 +1,5 @@ +export enum salesModelEnum { + Number= 0, + Package= 1, + Submit= 2 + } \ No newline at end of file diff --git a/src/translate/ar.json b/src/translate/ar.json index 92b1cb7..1f1c1b4 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -151,7 +151,8 @@ "past_your_MMl_text":"ضع نص MMl الخاص بك", "add_MML":"إضافة MML", "show_preview":"عرض المعاينة", - "show_MMl":" MML عرض" + "show_MMl":" MML عرض", + "financial_collection":"التحصيلات" }, "columns": { "id": "الرقم التعريفي", @@ -235,7 +236,8 @@ "delete":"حذف", "read":"قراءة", "managers":"مدراء", - "show":"عرض" + "show":"عرض", + "paid_price":"المبلغ المدفوع" }, "practical": { "to_confirm_deletion_please_re_enter": "لتأكيد الحذف، يرجى إعادة الإدخال", @@ -315,7 +317,9 @@ "Map":"الخريطة", "Show":"عرض", "Hide":"اخفاء", - "sale":"بيع" + "sale":"بيع", + "financial_collection":"التحصيلات", + "show_collection":"حصيلة" }, "Table": { "header": "", @@ -407,7 +411,9 @@ "City":"مدينة", "add_sales":"إضافة عملية بيع", "are_you_sure_about_sale":"هل أنت متأكد من عملية البيع ؟", - "Coupon":"قسيمة" + "Coupon":"قسيمة", + "financial_collection":"التحصيلات", + "show_collection":"حصيلة" }, "education_class_actions": { "Student_Records": "سجلات الطلاب", @@ -545,7 +551,10 @@ "tag":"كلمات مفتاحية", "code":"رمز", "amount":"كمية", - "due_to":"صالح الى" + "due_to":"صالح الى", + "reseller":"البائعين", + "activation_date":"تاريخ التنشيط", + "expiration_date":"تاريخ الالغاء" }, "select": { "enums": { @@ -883,7 +892,8 @@ "collections": "التحصيلات", "Area":"المنطقة", "city":"مدينة", - "coupon":"قسيمة" + "coupon":"قسيمة", + "financial_collection":"التحصيلات" }, "message": { "some_thing_went_wrong": "حدث خطأ ما", @@ -933,7 +943,9 @@ "Area":"المنطقة", "setting":"الإعدادات", "edit_reseller":"تعديل البائع", - "Coupon":"قسيمة" + "Coupon":"قسيمة", + "financial_collection":"التحصيلات", + "show_collection":"حصيلة" }, "page_header": { "home": "لوحة القيادة", @@ -983,7 +995,9 @@ "setting":"الإعدادات", "City":"مدينة", "Area":"المنطقة", - "Coupon":"قسيمة" + "Coupon":"قسيمة", + "financial_collection":"التحصيلات", + "show_collection":"حصيلة" }, "table": { "student": "قائمة الطلاب", @@ -1003,7 +1017,9 @@ "Coupon":"قسيمة", "notification":"الاشعارات", "upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا", - "get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت" + "get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت", + "financial_collection":"التحصيلات", + "show_collection":"حصيلة" }, "card" : { "residual":"المتبقي", @@ -1012,6 +1028,12 @@ "reseller_profit":"نسبة الأرباح (10%)", "total_sells":"إجمالي المبيعات" }, + "toast" : { + "phone_number_not_found":"رقم الهاتف غير موجود", + "error_while_trying_please_try_again":"حدث خطأ أثناء المحاولة، يرجى المحاولة مرة أخرى", + "Student Already Have this Package":"الطالب لديه هذه الحزمة بالفعل", + "The combination of student_id and package_id already exists.":"مجموعة الطالب والحزمة موجودة بالفعل." + }, "alphabet": { "A": "A", "B": "B", diff --git a/src/types/Item.ts b/src/types/Item.ts index dbd4a49..e26e5d2 100644 --- a/src/types/Item.ts +++ b/src/types/Item.ts @@ -367,7 +367,7 @@ export type Sales = { export type Collection = { id: number; - student: student; - expiration_date: string; - activation_date: string; + amount: student; + date: string; + description: string; }; diff --git a/src/utils/formatDate.ts b/src/utils/formatDate.ts index 3116eef..332e72a 100644 --- a/src/utils/formatDate.ts +++ b/src/utils/formatDate.ts @@ -1,10 +1,10 @@ -export const formatDate = (dateString: any) => { +export const formatDate = (dateString: any) => { if (!dateString) return null; // Handle empty date string const date = new Date(dateString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); // Months are zero-based const day = String(date.getDate()).padStart(2, "0"); - + return `${year}-${month}-${day}`; // Return formatted date }; diff --git a/src/utils/hasAbilityFn.ts b/src/utils/hasAbilityFn.ts index a55bc86..903e1d5 100644 --- a/src/utils/hasAbilityFn.ts +++ b/src/utils/hasAbilityFn.ts @@ -792,7 +792,7 @@ export const canShowQuestionBank = hasAbility( ); -/// User +/// sales export const canAddSales = hasAbility( ABILITIES_ENUM.Sales, @@ -821,4 +821,27 @@ export const canEditPhone = hasAbility( export const canEditEmail = hasAbility( ABILITIES_ENUM.Email, ABILITIES_VALUES_ENUM.UPDATE, +); + +/// financial_collection + +export const canAddFinancial_Collection = hasAbility( + ABILITIES_ENUM.Financial_Collection, + ABILITIES_VALUES_ENUM.STORE, +); + +export const canEditFinancial_Collection = hasAbility( + ABILITIES_ENUM.Financial_Collection, + ABILITIES_VALUES_ENUM.UPDATE, +); +export const canDeleteFinancial_Collection = hasAbility( + ABILITIES_ENUM.Financial_Collection, + ABILITIES_VALUES_ENUM.DELETE, +); + + +// collection reseller +export const canShowCollection = hasAbility( + ABILITIES_ENUM.Collections, + ABILITIES_VALUES_ENUM.SHOW, ); \ No newline at end of file
{userData?.type}
{t("sidebar.setting")}
{t(value)}
{isLoading ?: t(value)}
{student_info?.grade_name}
بكالوريا / علمي