diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-calls-report/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-calls-report/page.js new file mode 100644 index 0000000..619de50 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-calls-report/page.js @@ -0,0 +1,16 @@ +import ProvinceCumulativeCallsReportPage from "@/components/dashboard/provinceReports/ProvinceCumulativeCallsReport"; +import WithPermission from "@/core/middlewares/withPermission"; + +export const metadata = { + title: "گزارشات", +}; + +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-detailed-report/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-detailed-report/page.js new file mode 100644 index 0000000..16930e9 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-detailed-report/page.js @@ -0,0 +1,16 @@ +import ProvinceDetailedLogsReportPage from "@/components/dashboard/provinceReports/ProvinceDetailedLogsReport"; +import WithPermission from "@/core/middlewares/withPermission"; + +export const metadata = { + title: "ریز گزارشات", +}; + +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-messages-report/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-messages-report/page.js new file mode 100644 index 0000000..e1741f9 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-messages-report/page.js @@ -0,0 +1,16 @@ +import ProvincePeopleMessagesReportPage from "@/components/dashboard/provinceReports/ProvincePeopleMessagesReport"; +import WithPermission from "@/core/middlewares/withPermission"; + +export const metadata = { + title: "گزارش پیام‌ها", +}; + +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-operators-performance-report/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-operators-performance-report/page.js new file mode 100644 index 0000000..0655af7 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/province-reports/province-operators-performance-report/page.js @@ -0,0 +1,16 @@ +import ProvinceOperatorPerformanceReportPage from "@/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport"; +import WithPermission from "@/core/middlewares/withPermission"; + +export const metadata = { + title: "عملکرد کارشناسان", +}; + +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/DataTable.jsx b/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/DataTable.jsx new file mode 100644 index 0000000..a69b843 --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/DataTable.jsx @@ -0,0 +1,200 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PROVINCE_CUMULATIVE_CALLS_DAILY_REPORT } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; + +export default function DataTable() { + const columns = useMemo(() => [ + { + header: "تاریخ", + id: "date", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => (row.original.d ? moment(row.original.d).locale("fa").format("yyyy/MM/DD") : <>-), + }, + { + accessorKey: "total", + header: "تمامی تماس ها", + id: "total", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + header: "تماس با تهران", + id: "call_to_tehran", + enableColumnFilter: false, + enableSorting: false, + grow: false, + size: 50, + columns: [ + { + accessorKey: "teh4", + header: "کلید 4", + id: "teh4", + enableColumnFilter: true, + datatype: "integer", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "teh5", + header: "کلید 5", + id: "teh5", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + ], + }, + { + header: "تماس با اپراتور استانی", + id: "call_to_ostan", + enableColumnFilter: false, + enableSorting: false, + grow: false, + size: 50, + columns: [ + { + accessorKey: "ok", + header: "موفق", + id: "ok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "fail", + header: "جواب داده نشده", + id: "fail", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "nok", + header: "نا موفق", + id: "nok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "os4", + header: "کلید 4", + id: "os4", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "os5", + header: "کلید 5", + id: "os5", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "dnd", + header: "dnd", + id: "dnd", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "trans", + header: "انتقال تماس", + id: "trans", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + ], + }, + { + accessorKey: "b10", + header: "تماس بالای 10 ثانیه", + id: "b10", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "avg", + header: "میانگین تماس ها", + id: "avg", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.avg ? row.original.avg : <>-}, + }, + ]); + return ( + <> + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/index.js b/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/index.js new file mode 100644 index 0000000..fcad677 --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceCumulativeCallsReport/index.js @@ -0,0 +1,14 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import DataTable from "./DataTable"; + +export default function ProvinceCumulativeCallsReportPage() { + return ( + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/DataTable.jsx b/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/DataTable.jsx new file mode 100644 index 0000000..57a19e8 --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/DataTable.jsx @@ -0,0 +1,103 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PROVINCE_DETAILED_LOGS_REPORT } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; + +export default function DataTable() { + const columns = useMemo(() => [ + { + header: "تاریخ", + id: "date", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => { + const dateTime = row.original.calldate; + if (!dateTime) return <>-; + const date = dateTime.split(" ")[0]; + const persianDate = moment(date).locale("fa").format("YYYY-MM-DD") || ""; + return <>{persianDate}; + }, + }, + { + header: "ساعت", + id: "time", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => { + const dateTime = row.original.calldate; + if (!dateTime) return <>-; + const time = dateTime.split(" ")[1] || ""; + return <>{time}; + }, + }, + { + accessorKey: "src", + header: "شماره تماس گیرنده", + id: "src", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "dst", + header: "مقصد تماس", + id: "dst", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "disposition", + header: "وضعیت پاسخگویی", + id: "disposition", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "duration", + header: "مدت زمان تماس", + id: "duration", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + ]); + return ( + <> + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/index.js b/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/index.js new file mode 100644 index 0000000..1be362c --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceDetailedLogsReport/index.js @@ -0,0 +1,14 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import DataTable from "./DataTable"; + +export default function ProvinceDetailedLogsReportPage() { + return ( + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableCumulative.jsx b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableCumulative.jsx new file mode 100644 index 0000000..0051c3c --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableCumulative.jsx @@ -0,0 +1,101 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PROVINCE_OPERATORS_PERFORMANCE_TOTAL_REPORT } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import { useMemo } from "react"; + +export default function DataTableCumulative() { + const columns = useMemo(() => [ + { + accessorKey: "dst", + header: "کد یکتای کارشناس", + id: "dst", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "total", + header: "تعداد کل تماس ها", + id: "total", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "ok", + header: "تماس های موفق", + id: "ok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "fail", + header: "تماس های جواب داده نشده", + id: "fail", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "nok", + header: "تماس های ناموفق", + id: "nok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "b10", + header: "تماس های بالای 10 ثانیه", + id: "b10", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "dnd", + header: "dnd", + id: "dnd", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + ]); + + return ( + <> + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableDaily.jsx b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableDaily.jsx new file mode 100644 index 0000000..9e3016d --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/DataTableDaily.jsx @@ -0,0 +1,113 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PROVINCE_OPERATORS_PERFORMANCE_DAILY_REPORT } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; + +export default function DataTableDaily() { + const columns = useMemo(() => [ + { + header: "تاریخ", + id: "date", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => (row.original.d ? moment(row.original.d).locale("fa").format("yyyy/MM/DD") : <>-), + }, + { + accessorKey: "dst", + header: "کد یکتای کارشناس", + id: "dst", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "total", + header: "تعداد کل تماس ها", + id: "total", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "ok", + header: "تماس های موفق", + id: "ok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "fail", + header: "تماس های جواب داده نشده", + id: "fail", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "nok", + header: "تماس های ناموفق", + id: "nok", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "b10", + header: "تماس های بالای 10 ثانیه", + id: "b10", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + { + accessorKey: "dnd", + header: "dnd", + id: "dnd", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + }, + ]); + return ( + <> + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/index.js b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/index.js new file mode 100644 index 0000000..fc7033d --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvinceOperatorPerformanceReport/index.js @@ -0,0 +1,17 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import DataTableCumulative from "./DataTableCumulative"; +import DataTableDaily from "./DataTableDaily"; + +export default function ProvinceOperatorPerformanceReportPage() { + return ( + + + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/DataTable.jsx b/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/DataTable.jsx new file mode 100644 index 0000000..87565d7 --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/DataTable.jsx @@ -0,0 +1,59 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PROVINCE_PEOPLE_MESSAGES_REPORT } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import { useMemo } from "react"; + +export default function DataTable() { + const columns = useMemo(() => [ + { + header: "تعداد", + id: "count", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.nl + row.original.l}, + }, + { + accessorKey: "l", + header: "تماس های شنیده شده", + id: "l", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "nl", + header: "تماس های شنیده نشده", + id: "nl", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + ]); + return ( + <> + + + + + ); +} diff --git a/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/index.js b/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/index.js new file mode 100644 index 0000000..1b2da26 --- /dev/null +++ b/src/components/dashboard/provinceReports/ProvincePeopleMessagesReport/index.js @@ -0,0 +1,14 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import DataTable from "./DataTable"; + +export default function ProvincePeopleMessagesReportPage() { + return ( + + + + + ); +} diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 3428724..95f99ea 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -1,15 +1,17 @@ import { Settings } from "@mui/icons-material"; import AssessmentIcon from "@mui/icons-material/Assessment"; -import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; -import VerifiedUserIcon from "@mui/icons-material/VerifiedUser"; -import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; +import ContentPasteSearchIcon from "@mui/icons-material/ContentPasteSearch"; +import MarkEmailReadIcon from "@mui/icons-material/MarkEmailRead"; import PointOfSaleIcon from "@mui/icons-material/PointOfSale"; +import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; +import StarIcon from "@mui/icons-material/Star"; +import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; +import SupervisorAccountIcon from "@mui/icons-material/SupervisorAccount"; import ThreePIcon from "@mui/icons-material/ThreeP"; +import TtyIcon from "@mui/icons-material/Tty"; +import VerifiedUserIcon from "@mui/icons-material/VerifiedUser"; import VoiceChatIcon from "@mui/icons-material/VoiceChat"; import ZoomInMapIcon from "@mui/icons-material/ZoomInMap"; -import StarIcon from "@mui/icons-material/Star"; -import MarkEmailReadIcon from "@mui/icons-material/MarkEmailRead"; -import TtyIcon from "@mui/icons-material/Tty"; export const pageMenu = [ { @@ -61,6 +63,48 @@ export const pageMenu = [ }, ], }, + { + id: "province-reports", + label: "گزارش ها", + type: "menu", + icon: , + hasSubitems: true, + permissions: ["all"], + Subitems: [ + { + id: "province-calls-report", + label: "تجمعی", + type: "page", + icon: , + route: "/dashboard/province-reports/province-calls-report", + permissions: ["all"], + }, + { + id: "province-messages-reports", + label: "تجمعی پیام‌های مردمی", + type: "page", + icon: , + route: "/dashboard/province-reports/province-messages-report", + permissions: ["all"], + }, + { + id: "province-detailed-reports", + label: "ریز گزارش ها", + type: "page", + icon: , + route: "/dashboard/province-reports/province-detailed-report", + permissions: ["all"], + }, + { + id: "province-operators-performance-reports", + label: "عملکرد کارشناسان", + type: "page", + icon: , + route: "/dashboard/province-reports/province-operators-performance-report", + permissions: ["all"], + }, + ], + }, { id: "systemManagment", label: "مدیریت سامانه", diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index a01817f..bafc9aa 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -25,3 +25,10 @@ export const GET_COUNTRY_KEYPRESS_REPORT = api + "/cumulative_keypress_stats"; export const GET_SYSTEM_MESSAGES_SUPERVISOR = api + "/system_messages/supervisor"; export const GET_SYSTEM_MESSAGES_OPERATOR = api + "/system_messages/operator"; + +// export const GET_PROVINCE_CUMULATIVE_CALLS_TOTAL_REPORT = api + "/report/cumulative_total"; +export const GET_PROVINCE_CUMULATIVE_CALLS_DAILY_REPORT = api + "/report/cumulative"; +export const GET_PROVINCE_PEOPLE_MESSAGES_REPORT = api + "/report/people_messages"; +export const GET_PROVINCE_DETAILED_LOGS_REPORT = api + "/report/detailed_logs"; +export const GET_PROVINCE_OPERATORS_PERFORMANCE_DAILY_REPORT = api + "/report/operator_performance_daily"; +export const GET_PROVINCE_OPERATORS_PERFORMANCE_TOTAL_REPORT = api + "/report/operator_performance_total"; diff --git a/src/lib/contexts/DataTable.js b/src/lib/contexts/DataTable.js index 60ef071..1ca0674 100644 --- a/src/lib/contexts/DataTable.js +++ b/src/lib/contexts/DataTable.js @@ -91,7 +91,7 @@ const DataTableProvider = ({ children, user_id, page_name, table_name, columns, }; } return acc; - }, {}); + }, []); const getHideValues = (columns) => { return columns.reduce((acc, column) => {