From 7951754722d9e66195de90ec4ff0dc91823daac1 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Fri, 9 Jan 2026 12:46:19 +0700 Subject: [PATCH] refactor(FE): Generate HPP table from static rows with defaults --- .../pages/closing/ClosingFinanceTable.tsx | 136 +++++++++++++++--- 1 file changed, 118 insertions(+), 18 deletions(-) diff --git a/src/components/pages/closing/ClosingFinanceTable.tsx b/src/components/pages/closing/ClosingFinanceTable.tsx index b0b22a08..8c39b3fb 100644 --- a/src/components/pages/closing/ClosingFinanceTable.tsx +++ b/src/components/pages/closing/ClosingFinanceTable.tsx @@ -23,6 +23,14 @@ type HppTableRow = type?: never; budgeting?: never; realization?: never; + } + | { + type: string; + group_name: string; + group_index: number; + isGroupHeader: false; + budgeting?: { rp_per_bird: number; rp_per_kg: number; amount: number }; + realization?: { rp_per_bird: number; rp_per_kg: number; amount: number }; }; type ProfitLossTableRow = @@ -52,25 +60,117 @@ const ClosingFinanceTable = ({ () => ClosingApi.getFinance(projectFlockId) ); - const hppTableData: HppTableRow[] = isResponseSuccess(finance) - ? finance.data.hpp_purchases.hpp.flatMap((hpp, groupIndex) => [ - // Group header row - { - group_name: hpp.group_name, - group_index: groupIndex, - isGroupHeader: true as const, - }, - // Data rows - ...hpp.data.map((item) => ({ - group_name: hpp.group_name, - group_index: groupIndex, - type: item.type, - budgeting: item.budgeting, - realization: item.realization, + const staticHppRows: Array<{ + group_name: string; + type: string; + group_index: number; + }> = [ + { + group_name: 'HPP dan Pengeluaran', + type: 'Pembelian PAKAN', + group_index: 0, + }, + { + group_name: 'HPP dan Pengeluaran', + type: 'Pembelian STARTER', + group_index: 0, + }, + { + group_name: 'HPP dan Pengeluaran', + type: 'Pembelian DOC', + group_index: 0, + }, + { + group_name: 'HPP dan Pengeluaran', + type: 'Pembelian PULLET', + group_index: 0, + }, + { + group_name: 'HPP dan Pengeluaran', + type: 'Pembelian LAYER', + group_index: 0, + }, + { + group_name: 'HPP dan Bahan Baku', + type: 'Pengeluaran Overhead', + group_index: 1, + }, + { + group_name: 'HPP dan Bahan Baku', + type: 'Beban Ekspedisi', + group_index: 1, + }, + ]; + + const hppTableData: HppTableRow[] = [ + { + group_name: 'HPP dan Pengeluaran', + group_index: 0, + isGroupHeader: true as const, + }, + ...staticHppRows + .filter((row) => row.group_index === 0) + .map((staticRow) => { + const apiData = isResponseSuccess(finance) + ? finance.data.hpp_purchases.hpp + .find((g) => g.group_name === staticRow.group_name) + ?.data.find((d) => d.type === staticRow.type) + : null; + + return { + group_name: staticRow.group_name, + group_index: staticRow.group_index, + type: staticRow.type, + budgeting: apiData?.budgeting || { + rp_per_bird: 0, + rp_per_kg: 0, + amount: 0, + }, + realization: apiData?.realization || { + rp_per_bird: 0, + rp_per_kg: 0, + amount: 0, + }, isGroupHeader: false as const, - })), - ]) - : []; + }; + }), + { + group_name: 'HPP dan Bahan Baku', + group_index: 1, + isGroupHeader: true as const, + }, + ...staticHppRows + .filter((row) => row.group_index === 1) + .map((staticRow) => { + const apiData = isResponseSuccess(finance) + ? finance.data.hpp_purchases.hpp + .find((g) => g.group_name === staticRow.group_name) + ?.data.find((d) => d.type === staticRow.type) + : null; + + return { + group_name: staticRow.group_name, + group_index: staticRow.group_index, + type: staticRow.type, + budgeting: apiData?.budgeting || { + rp_per_bird: 0, + rp_per_kg: 0, + amount: 0, + }, + realization: apiData?.realization || { + rp_per_bird: 0, + rp_per_kg: 0, + amount: 0, + }, + isGroupHeader: false as const, + }; + }), + { + group_name: 'HPP', + group_index: 2, + isGroupHeader: true as const, + }, + ]; const profitLossTableData: ProfitLossTableRow[] = isResponseSuccess(finance) ? [