2026-01-19 13:08:58 +03:30
|
|
|
|
import { useEffect, useState } from "react";
|
2026-02-23 14:38:30 +03:30
|
|
|
|
import { useApiRequest } from "../../../utils/useApiRequest";
|
|
|
|
|
|
import { useModalStore } from "../../../context/zustand-store/appStore";
|
|
|
|
|
|
import Table from "../../../components/Table/Table";
|
|
|
|
|
|
import { Grid } from "../../../components/Grid/Grid";
|
|
|
|
|
|
import Button from "../../../components/Button/Button";
|
|
|
|
|
|
import { Popover } from "../../../components/PopOver/PopOver";
|
|
|
|
|
|
import { Tooltip } from "../../../components/Tooltip/Tooltip";
|
2026-01-19 13:08:58 +03:30
|
|
|
|
import { AddQuota } from "./AddQuota";
|
|
|
|
|
|
import { QuotaView } from "./QuotaView";
|
2026-02-23 14:38:30 +03:30
|
|
|
|
import { PopoverCustomModalOperation } from "../../../components/PopOverCustomModalOperation/PopoverCustomModalOperation";
|
2026-01-19 13:08:58 +03:30
|
|
|
|
import {
|
|
|
|
|
|
ArrowDownOnSquareIcon,
|
|
|
|
|
|
ArrowUpOnSquareIcon,
|
|
|
|
|
|
BarsArrowUpIcon,
|
|
|
|
|
|
XMarkIcon,
|
|
|
|
|
|
} from "@heroicons/react/24/outline";
|
|
|
|
|
|
import { useNavigate } from "@tanstack/react-router";
|
2026-02-23 14:38:30 +03:30
|
|
|
|
import { QUOTAS } from "../../../routes/paths";
|
2026-01-19 13:08:58 +03:30
|
|
|
|
import { getQuotaTableColumns, getQuotaTableRowData } from "./quotaTableUtils";
|
|
|
|
|
|
import { QuotaAllocateToStakeHolders } from "./QuotaAllocateToStakeHolders";
|
|
|
|
|
|
import { QuotaDistributionEntryInventory } from "./QuotaDistributionEntryInventory";
|
2026-02-23 14:38:30 +03:30
|
|
|
|
import { useUserProfileStore } from "../../../context/zustand-store/userStore";
|
|
|
|
|
|
import { TableButton } from "../../../components/TableButton/TableButton";
|
2026-01-19 13:08:58 +03:30
|
|
|
|
import { QuotaActivesDashboardDetails } from "./QuotaActivesDashboardDetails";
|
2026-02-23 14:38:30 +03:30
|
|
|
|
import { PaginationParameters } from "../../../components/PaginationParameters/PaginationParameters";
|
2026-01-19 13:08:58 +03:30
|
|
|
|
|
|
|
|
|
|
export const QuotaActives = () => {
|
|
|
|
|
|
const { openModal } = useModalStore();
|
|
|
|
|
|
const navigate = useNavigate();
|
|
|
|
|
|
const { profile } = useUserProfileStore();
|
|
|
|
|
|
const [pagesInfo, setPagesInfo] = useState({ page: 1, page_size: 10 });
|
|
|
|
|
|
const [pagesTableData, setPagesTableData] = useState([]);
|
|
|
|
|
|
|
|
|
|
|
|
const [publicParams, setPublicParams] = useState({
|
|
|
|
|
|
start: null,
|
|
|
|
|
|
end: null,
|
|
|
|
|
|
search: null,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const { data: pagesData, refetch } = useApiRequest({
|
|
|
|
|
|
api: "/product/web/api/v1/quota/active_quotas/",
|
|
|
|
|
|
method: "get",
|
|
|
|
|
|
params: { ...pagesInfo, ...publicParams },
|
|
|
|
|
|
queryKey: ["activeQuotas", pagesInfo],
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const { data: quotasDashboardData, refetch: quotasDashboardRefetch } =
|
|
|
|
|
|
useApiRequest({
|
|
|
|
|
|
api: "/product/web/api/v1/quota/quotas_dashboard/",
|
|
|
|
|
|
method: "get",
|
|
|
|
|
|
params: publicParams,
|
|
|
|
|
|
queryKey: ["quotasDashboard"],
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const handleUpdate = () => {
|
|
|
|
|
|
refetch();
|
|
|
|
|
|
quotasDashboardRefetch();
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (pagesData?.results) {
|
|
|
|
|
|
const tableData = pagesData.results.map((item: any, i: number) => {
|
|
|
|
|
|
return getQuotaTableRowData(item, i, {
|
|
|
|
|
|
pagesInfo,
|
|
|
|
|
|
renderOperations: (item, index) => (
|
|
|
|
|
|
<Popover key={index}>
|
|
|
|
|
|
<Tooltip title="نمای کلی" position="right">
|
|
|
|
|
|
<Button
|
|
|
|
|
|
variant="view"
|
|
|
|
|
|
page="quota"
|
|
|
|
|
|
access="Post-Quota"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "نمای کلی سهمیه",
|
|
|
|
|
|
content: <QuotaView item={item} />,
|
|
|
|
|
|
isFullSize: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
|
|
|
|
|
|
{(profile?.role?.type?.key === "ADM" || item?.assigned_to_me) && (
|
|
|
|
|
|
<Tooltip title="ویرایش سهمیه" position="right">
|
|
|
|
|
|
<Button
|
|
|
|
|
|
variant="edit"
|
|
|
|
|
|
page="quota"
|
|
|
|
|
|
access="Edit-Quota"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "ویرایش سهمیه",
|
|
|
|
|
|
content: (
|
|
|
|
|
|
<AddQuota item={item} getData={handleUpdate} />
|
|
|
|
|
|
),
|
|
|
|
|
|
isFullSize: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<Tooltip
|
|
|
|
|
|
title={
|
|
|
|
|
|
profile?.role?.type?.key === "ADM" || item?.assigned_to_me
|
|
|
|
|
|
? "توزیع سهمیه"
|
|
|
|
|
|
: "جزئیات"
|
|
|
|
|
|
}
|
|
|
|
|
|
position="right"
|
|
|
|
|
|
>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
page="quota"
|
|
|
|
|
|
access="DIstribute-Quota"
|
|
|
|
|
|
icon={
|
|
|
|
|
|
<ArrowUpOnSquareIcon className="w-5 h-5 text-purple-400 dark:text-purple-100" />
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
const path = QUOTAS + "/" + item.id;
|
|
|
|
|
|
navigate({ to: path });
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
|
|
|
|
|
|
{(profile?.role?.type?.key === "ADM" || item?.assigned_to_me) && (
|
|
|
|
|
|
<Tooltip title="ورود به انبار" position="right">
|
|
|
|
|
|
<Button
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
page="inventory"
|
|
|
|
|
|
access="Entry-Inventory"
|
|
|
|
|
|
icon={
|
|
|
|
|
|
<ArrowDownOnSquareIcon className="w-6 h-6 text-primary-600" />
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "ورود به انبار",
|
|
|
|
|
|
content: (
|
|
|
|
|
|
<QuotaDistributionEntryInventory
|
|
|
|
|
|
getData={handleUpdate}
|
|
|
|
|
|
code={item?.id}
|
|
|
|
|
|
remainWeight={item?.remaining_weight}
|
|
|
|
|
|
/>
|
|
|
|
|
|
),
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{profile?.role?.type?.key === "CO" && (
|
|
|
|
|
|
<Tooltip title="تخصیص به زیر مجموعه" position="right">
|
|
|
|
|
|
<Button
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
page="inventory"
|
|
|
|
|
|
access="Stakeholder-Allocation"
|
|
|
|
|
|
icon={
|
|
|
|
|
|
<BarsArrowUpIcon className="w-6 h-6 text-purple-400 dark:text-white" />
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "تخصیص به زیر مجموعه",
|
|
|
|
|
|
content: (
|
|
|
|
|
|
<QuotaAllocateToStakeHolders
|
|
|
|
|
|
getData={handleUpdate}
|
|
|
|
|
|
item={item}
|
|
|
|
|
|
isSubmit
|
|
|
|
|
|
/>
|
|
|
|
|
|
),
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<Tooltip title="خروجی اکسل" position="right">
|
|
|
|
|
|
<Button
|
|
|
|
|
|
excelInfo={{
|
|
|
|
|
|
link: `product/excel/detail_quota_excel/?active=true&id=${item?.id}`,
|
|
|
|
|
|
title: `اطلاعات سهمیه ${item?.quota_id}`,
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
{(profile?.role?.type?.key === "ADM" || item?.assigned_to_me) && (
|
|
|
|
|
|
<PopoverCustomModalOperation
|
|
|
|
|
|
method="patch"
|
|
|
|
|
|
tooltipText="بستن سهمیه"
|
|
|
|
|
|
icon={<XMarkIcon className="w-6 h-6 text-red-500" />}
|
|
|
|
|
|
title="از بستن سهمیه اطمینان دارید؟"
|
|
|
|
|
|
api={`product/web/api/v1/quota/${item?.id}/close/`}
|
|
|
|
|
|
getData={handleUpdate}
|
|
|
|
|
|
page="quota"
|
|
|
|
|
|
access="CLose-Quota"
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</Popover>
|
|
|
|
|
|
),
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
setPagesTableData(tableData);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [pagesData]);
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<Grid container column className="gap-4 mt-2">
|
|
|
|
|
|
<PaginationParameters
|
|
|
|
|
|
title="سهمیه های فعال"
|
|
|
|
|
|
excelInfo={{
|
|
|
|
|
|
link: `/product/excel/quota_excel/?active=true&start=${
|
|
|
|
|
|
publicParams.start || ""
|
|
|
|
|
|
}&end=${publicParams.end || ""}&search=${publicParams.search || ""}`,
|
|
|
|
|
|
title: "سهمیه های فعال",
|
|
|
|
|
|
}}
|
|
|
|
|
|
getData={handleUpdate}
|
|
|
|
|
|
onChange={(r) => {
|
|
|
|
|
|
setPublicParams((prev) => ({ ...prev, ...(r as any) }));
|
|
|
|
|
|
setPagesInfo((prev) => ({ ...prev, page: 1 }));
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
<Grid isDashboard>
|
|
|
|
|
|
<Table
|
|
|
|
|
|
isDashboard
|
|
|
|
|
|
title="خلاصه اطلاعات"
|
|
|
|
|
|
noPagination
|
|
|
|
|
|
noSearch
|
|
|
|
|
|
columns={[
|
|
|
|
|
|
"تعداد کل سهمیه ها",
|
|
|
|
|
|
"مجموع وزن سهمیه ها (کیلوگرم)",
|
|
|
|
|
|
"مجموع وزن توزیع شده (کیلوگرم)",
|
|
|
|
|
|
"مجموع وزن باقیمانده (کیلوگرم)",
|
|
|
|
|
|
"مجموع وزن فروش رفته (کیلوگرم)",
|
|
|
|
|
|
"مجموع وزن ورود به انبار (کیلوگرم)",
|
|
|
|
|
|
"جزئیات",
|
|
|
|
|
|
]}
|
|
|
|
|
|
rows={[
|
|
|
|
|
|
[
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.total_quotas?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.total_amount?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.total_distributed?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.remaining_amount?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.sold_amount?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
quotasDashboardData?.quotas_summary?.inventory_received?.toLocaleString() ||
|
|
|
|
|
|
0,
|
|
|
|
|
|
<TableButton
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
key="details"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "جزئیات",
|
|
|
|
|
|
content: (
|
|
|
|
|
|
<QuotaActivesDashboardDetails
|
|
|
|
|
|
publicParams={publicParams}
|
|
|
|
|
|
/>
|
|
|
|
|
|
),
|
|
|
|
|
|
isFullSize: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
جزئیات
|
|
|
|
|
|
</TableButton>,
|
|
|
|
|
|
],
|
|
|
|
|
|
]}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Grid>
|
|
|
|
|
|
<Grid>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
page="quota"
|
|
|
|
|
|
access="Post-Quota"
|
|
|
|
|
|
variant="submit"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
openModal({
|
|
|
|
|
|
title: "ایجاد سهمیه",
|
|
|
|
|
|
content: <AddQuota getData={refetch} />,
|
|
|
|
|
|
isFullSize: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
ایجاد سهمیه
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</Grid>
|
|
|
|
|
|
<Table
|
|
|
|
|
|
className="mt-2"
|
|
|
|
|
|
onChange={(e) => {
|
|
|
|
|
|
setPagesInfo(e);
|
|
|
|
|
|
}}
|
|
|
|
|
|
noSearch
|
|
|
|
|
|
count={pagesData?.count || 10}
|
|
|
|
|
|
isPaginated
|
|
|
|
|
|
title="سهمیه های فعال"
|
|
|
|
|
|
columns={getQuotaTableColumns({ includeOperations: true })}
|
|
|
|
|
|
rows={pagesTableData}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Grid>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|