diff --git a/src/components/pages/production/project-flock/detail/ProjectFlockDetail.tsx b/src/components/pages/production/project-flock/detail/ProjectFlockDetail.tsx index 50b258fb..47491dfa 100644 --- a/src/components/pages/production/project-flock/detail/ProjectFlockDetail.tsx +++ b/src/components/pages/production/project-flock/detail/ProjectFlockDetail.tsx @@ -4,12 +4,7 @@ import Card from '@/components/Card'; import { RadioGroup, RadioGroupItem } from '@/components/input/RadioInput'; import Tooltip from '@/components/Tooltip'; import DrawerHeader from '@/components/helper/drawer/DrawerHeader'; -import { - formatCurrency, - formatDate, - formatNumber, - formatTitleCase, -} from '@/lib/helper'; +import { cn, formatCurrency, formatDate, formatNumber } from '@/lib/helper'; import { ProjectFlock } from '@/types/api/production/project-flock'; import { Icon } from '@iconify/react'; import Link from 'next/link'; @@ -20,16 +15,15 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import { ProjectFlockApi } from '@/services/api/production/project-flock'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import toast from 'react-hot-toast'; -import ApprovalSteps, { - useApprovalSteps, -} from '@/components/pages/ApprovalSteps'; -import { - PROJECT_FLOCK_APPROVAL_LINE, - PROJECT_FLOCK_KANDANGS_APPROVAL_LINE, -} from '@/config/approval-line'; import useSWR from 'swr'; -import { ProjectFlockKandangApi } from '@/services/api/production'; import RequirePermission from '@/components/helper/RequirePermission'; +import ApprovalStepsV2 from '@/components/helper/ApprovalStepsV2'; +import { APPROVAL_WORKFLOWS } from '@/config/constant'; +import Table from '@/components/Table'; +import { ProjectFlockFormConfirmationTableType } from '../form/ProjectFlockForm'; +import { ColumnDef } from '@tanstack/react-table'; +import StatusBadge from '@/components/helper/StatusBadge'; +import { ProjectFlockKandangApi } from '@/services/api/production/project-flock-kandang'; const ProjectFlockDetail = ({ projectFlock, @@ -40,7 +34,7 @@ const ProjectFlockDetail = ({ const deleteModal = useModal(); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [openBudgets, setOpenBudget] = useState(false); - const [selectedKandangId, setSelectedKamdangId] = useState( + const [selectedKandangId, setSelectedKandangId] = useState( null ); @@ -61,30 +55,94 @@ const ProjectFlockDetail = ({ : null ); - const { - approvals, - isLoading: approvalsLoading, - refresh: refreshApprovals, - } = useApprovalSteps({ - latestApproval: projectFlock?.approval, - approvalLines: PROJECT_FLOCK_APPROVAL_LINE, - moduleName: 'PROJECT_FLOCKS', - moduleId: projectFlock?.id?.toString() ?? '', - }); + const { data: projectFlockApprovalResponse } = useSWR( + projectFlock.id ? ['approval-project-flock', projectFlock.id] : undefined, + ([, id]) => ProjectFlockApi.getApprovalLineHistory(Number(id)) + ); - const { approvals: kandangApprovals, isLoading: kandangApprovalsLoading } = - useApprovalSteps({ - latestApproval: - selectedKandangId && isResponseSuccess(projectFlockKandang) - ? projectFlockKandang?.data?.approval - : undefined, - approvalLines: PROJECT_FLOCK_KANDANGS_APPROVAL_LINE, - moduleName: 'PROJECT_FLOCK_KANDANGS', - moduleId: - selectedKandangId && isResponseSuccess(projectFlockKandang) - ? projectFlockKandang?.data?.id?.toString() - : '', - }); + const projectFlockApproval = isResponseSuccess(projectFlockApprovalResponse) + ? projectFlockApprovalResponse.data + : undefined; + + const { data: projectFlockKandangApprovalResponse } = useSWR( + selectedKandang?.project_flock_kandang_id + ? [ + 'approval-project-flock-kandang', + selectedKandang?.project_flock_kandang_id, + ] + : undefined, + ([, id]) => ProjectFlockKandangApi.getApprovalLineHistory(Number(id)) + ); + + const projectFlockKandangApproval = isResponseSuccess( + projectFlockKandangApprovalResponse + ) + ? projectFlockKandangApprovalResponse.data + : undefined; + + const confirmationTableColumns: ColumnDef[] = + [ + { + header: 'Label', + accessorKey: 'label', + enableSorting: false, + cell: ({ row }) => { + const isSubRow = row.depth > 0; + + return ( + <> + {!isSubRow && row.original.label} + + {isSubRow && ( +
+
+ {row.original.label} +
+ )} + + ); + }, + }, + { + header: 'Value', + accessorKey: 'value', + enableSorting: false, + cell: ({ row }) => row.original.value, + }, + ]; + + const confirmationTableData: ProjectFlockFormConfirmationTableType[] = [ + { + label: 'Tanggal', + value: formatDate(projectFlock.created_at, 'DD MMMM YYYY'), + }, + { + label: 'Area', + value: projectFlock.area.name ?? '-', + }, + { + label: 'Lokasi', + value: projectFlock.location.name ?? '-', + }, + { + label: 'Flock', + value: projectFlock.flock_name ?? '-', + }, + { + label: 'Kategori', + value: projectFlock.category ?? '-', + }, + { + label: 'Standar Produksi', + value: projectFlock.production_standard.name ?? '-', + }, + { + label: 'Periode', + value: projectFlock.period ?? '-', + }, + ]; const confirmationModalDeleteClickHandler = async () => { setIsDeleteLoading(true); @@ -104,12 +162,14 @@ const ProjectFlockDetail = ({ return ( <> -
+
{/* Header */} @@ -132,332 +192,224 @@ const ProjectFlockDetail = ({ }} > - + - {/* Informasi Umum */} -
-
-

Informasi Umum

- {/* Status Approval */} - {approvals && !approvalsLoading && ( -
- -
- )} - {/* Badge Row */} -
- - {' '} - {projectFlock.approval?.step_name} - -
- - - {` ${formatTitleCase(projectFlock.category ?? '')}`} - -
- {/* Information Grid */} -
-
- Submitted -
-
- - {' '} - {projectFlock.created_user?.name} - -
+ - {/* BARIS 1 */} -
- Area -
-
{projectFlock?.area?.name}
+
+

+ Informasi Umum +

- {/* BARIS 2 */} -
- Lokasi -
-
{projectFlock?.location?.name}
- -
- FCR -
-
{projectFlock?.fcr?.name}
- -
- {' '} - Standard -
-
- {projectFlock?.production_standard?.name ?? '-'} -
- - {/* BARIS 3 (Terakhir - TIDAK PERLU garis di bawahnya) */} -
- {' '} - Kategori -
-
- {formatTitleCase(projectFlock.category ?? '')} -
-
-
+ + columns={confirmationTableColumns} + data={confirmationTableData} + withPagination={false} + pageSize={10000} + expanded={true} + getSubRows={(row) => row.subRows} + className={{ + headerRowClassName: 'border-b border-base-content/10', + bodyRowClassName: 'border-none', + bodySubRowClassName: () => 'border-none', + bodySubRowColumnClassName: () => 'first:p-0', + }} + />
- {/* Kandang Aktif */} -
-
-

Kandang Aktif

- {kandangApprovals && !kandangApprovalsLoading && ( - - )} - {/* Badge Row */} -
- - {' '} - Kandang Aktif ({projectFlock.kandangs?.length}) - -
- { - setOpenBudget(!openBudgets); - }} - > - {` ${formatCurrency( - (projectFlock.project_budgets ?? []).reduce( - (acc, curr) => acc + curr.price * curr.qty, - 0 - ) - )}`} - - -
+
+

+ Kandang Aktif +

- {/* Card List Project Budgets */} - {openBudgets && - (projectFlock.project_budgets ?? []).map((budget) => ( - -
-
-
- {' '} - Jenis Produk -
-
- {budget?.nonstock?.name} -
-
-
-
- {' '} - Nama Satuan -
-
- {budget?.nonstock?.uom?.name} -
-
-
-
- {' '} - Jumlah Pembelian -
-
- {formatNumber(budget.qty)} -
-
-
-
- {' '} - Harga Satuan -
-
- {formatCurrency(budget.price)} -
-
-
-
- {' '} - Total Harga -
-
- {formatCurrency(budget.price * budget.qty)} -
-
-
-
- ))} +
+ - {/* Card Kandangs */} - { + setOpenBudget(!openBudgets); }} - > - + {` ${formatCurrency( + (projectFlock.project_budgets ?? []).reduce( + (acc, curr) => acc + curr.price * curr.qty, + 0 + ) + )}`} + + + } + className={{ badge: 'w-fit text-nowrap cursor-pointer' }} + /> +
+ + {/* Card List Project Budgets */} + {openBudgets && + (projectFlock.project_budgets ?? []).map((budget) => ( + setSelectedKamdangId(e.target.value)} - value={selectedKandangId?.toString()} - size='md' - color='neutral' - disabled={projectFlock?.approval?.step_number == 1} > - {projectFlock.kandangs?.map((kandang) => ( -
- projectFlock?.approval?.step_number > 1 && - setSelectedKamdangId(kandang?.id?.toString()) - } - > - -
- - Kapasitas {kandang?.capacity} Ekor - +
+
+
+ {' '} + Jenis Produk +
+
+ {budget?.nonstock?.name}
- ))} - - -
- - +
+ {' '} + Nama Satuan +
+
+ {budget?.nonstock?.uom?.name} +
+
+
+
+ {' '} + Jumlah Pembelian +
+
+ {formatNumber(budget.qty)} +
+
+
+
+ {' '} + Harga Satuan +
+
+ {formatCurrency(budget.price)} +
+
+
+
+ {' '} + Total Harga +
+
+ {formatCurrency(budget.price * budget.qty)} +
+
+
+ + ))} + + {/* Card Kandangs */} + + setSelectedKandangId(e.target.value)} + value={selectedKandangId?.toString()} + size='md' + color='neutral' + disabled={projectFlock?.approval?.step_number == 1} + > + {projectFlock.kandangs?.map((kandang) => ( +
+ projectFlock?.approval?.step_number > 1 && + setSelectedKandangId(kandang?.id?.toString()) + } > - - - - - +
+ + Kapasitas {kandang?.capacity} Ekor + +
+
+ ))} +
+
+ + + +
+ + + - - -
+ Chickin + + + + + + + +