diff --git a/PTC/management_dashboard_preview.html b/PTC/management_dashboard_preview.html
index 33472ec..28251ef 100644
--- a/PTC/management_dashboard_preview.html
+++ b/PTC/management_dashboard_preview.html
@@ -5478,18 +5478,39 @@
본사관리비 배부원천 x (프로젝트 기준값 / 전체 기준값)
기준값: {allocationMode === "income_ratio" ? "프로젝트 입금 / 전체입금" : "프로젝트 지출 / 전체지출"}
- {(sharedAllocationDetails.length ? sharedAllocationDetails : [{ year_month: "", source_amount: 0, display_project_basis_amount: 0, display_total_basis_amount: 0, allocated_amount: item.amount || 0 }])
- .map((row, idx) => {
+ {(() => {
+ const baseRows = sharedAllocationDetails.length
+ ? sharedAllocationDetails
+ : [{ year_month: "", source_amount: 0, display_project_basis_amount: 0, display_total_basis_amount: 0, allocated_amount: item.amount || 0 }];
+ const yearlyMap = {};
+ baseRows.forEach((row) => {
+ const year = ((row.year_month || "").slice(0, 4) || "-");
+ if (!yearlyMap[year]) {
+ yearlyMap[year] = {
+ year,
+ source_amount: 0,
+ display_project_basis_amount: 0,
+ display_total_basis_amount: 0,
+ allocated_amount: 0,
+ };
+ }
+ yearlyMap[year].source_amount += Number(row.source_amount || 0);
+ yearlyMap[year].display_project_basis_amount += Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
+ yearlyMap[year].display_total_basis_amount += Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
+ yearlyMap[year].allocated_amount += Number(row.allocated_amount || 0);
+ });
+ return Object.values(yearlyMap).sort((a, b) => String(a.year).localeCompare(String(b.year))).map((row, idx) => {
const sourceAmount = Number(row.source_amount || 0);
const allocatedAmount = Number(row.allocated_amount || 0);
const projectBasisAmount = Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
const totalBasisAmount = Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
return (
- {((row.year_month || "").slice(0, 4) || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
+ {(row.year || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
);
- })}
+ });
+ })()}
)}
@@ -5574,15 +5595,33 @@
기준값: {item.allocation_mode === "income_ratio" ? "프로젝트 입금 / 전체입금" : "프로젝트 지출 / 전체지출"}
- {(Array.isArray(item.allocation_details) && item.allocation_details.length
- ? item.allocation_details
- : [{
+ {(() => {
+ const baseRows = (Array.isArray(item.allocation_details) && item.allocation_details.length)
+ ? item.allocation_details
+ : [{
source_amount: item.allocation_source_amount || 0,
project_basis_amount: item.allocation_project_basis_amount || 0,
total_basis_amount: item.allocation_total_basis_amount || 0,
allocated_amount: item.expense_supply || 0,
- }]
- ).map((row, idx) => {
+ }];
+ const yearlyMap = {};
+ baseRows.forEach((row) => {
+ const year = ((row.year_month || "").slice(0, 4) || "-");
+ if (!yearlyMap[year]) {
+ yearlyMap[year] = {
+ year,
+ source_amount: 0,
+ display_project_basis_amount: 0,
+ display_total_basis_amount: 0,
+ allocated_amount: 0,
+ };
+ }
+ yearlyMap[year].source_amount += Number(row.source_amount || 0);
+ yearlyMap[year].display_project_basis_amount += Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
+ yearlyMap[year].display_total_basis_amount += Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
+ yearlyMap[year].allocated_amount += Number(row.allocated_amount || 0);
+ });
+ return Object.values(yearlyMap).sort((a, b) => String(a.year).localeCompare(String(b.year))).map((row, idx) => {
const sourceAmount = Number(row.source_amount || 0);
const allocatedAmount = Number(row.allocated_amount || 0);
const projectBasisAmount = Number(
@@ -5593,10 +5632,11 @@
);
return (
- {((row.year_month || "").slice(0, 4) || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
+ {(row.year || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
);
- })}
+ });
+ })()}
)}
@@ -6979,14 +7019,31 @@
if (!list.length || (list.length === 1 && Number(list[0].source_amount || 0) === 0 && Number(list[0].allocated_amount || 0) === 0)) {
return 해당 계정의 배부 원천 금액이 없어 계산식이 없습니다.
;
}
- return list.map((row, idx) => {
+ const yearlyMap = {};
+ list.forEach((row) => {
+ const year = ((row.year_month || "").slice(0, 4) || "-");
+ if (!yearlyMap[year]) {
+ yearlyMap[year] = {
+ year,
+ source_amount: 0,
+ display_project_basis_amount: 0,
+ display_total_basis_amount: 0,
+ allocated_amount: 0,
+ };
+ }
+ yearlyMap[year].source_amount += Number(row.source_amount || 0);
+ yearlyMap[year].display_project_basis_amount += Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
+ yearlyMap[year].display_total_basis_amount += Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
+ yearlyMap[year].allocated_amount += Number(row.allocated_amount || 0);
+ });
+ return Object.values(yearlyMap).sort((a, b) => String(a.year).localeCompare(String(b.year))).map((row, idx) => {
const sourceAmount = Number(row.source_amount || 0);
const allocatedAmount = Number(row.allocated_amount || 0);
const projectBasisAmount = Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
const totalBasisAmount = Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
return (
- {((row.year_month || "").slice(0, 4) || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
+ {(row.year || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
);
});
@@ -7109,20 +7166,39 @@
기준값: {(lifecycleProjectTotalModal.allocation_mode || "") === "income_ratio" ? "프로젝트 입금 / 전체입금" : "프로젝트 지출 / 전체지출"}
- {(Array.isArray(lifecycleProjectTotalModal.allocation_details) && lifecycleProjectTotalModal.allocation_details.length
- ? lifecycleProjectTotalModal.allocation_details
- : []
- ).map((row, idx) => {
- const sourceAmount = Number(row.source_amount || 0);
- const allocatedAmount = Number(row.allocated_amount || 0);
- const projectBasisAmount = Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
- const totalBasisAmount = Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
- return (
-
- {((row.year_month || "").slice(0, 4) || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
-
- );
- })}
+ {(() => {
+ const rows = (Array.isArray(lifecycleProjectTotalModal.allocation_details) && lifecycleProjectTotalModal.allocation_details.length)
+ ? lifecycleProjectTotalModal.allocation_details
+ : [];
+ const yearlyMap = {};
+ rows.forEach((row) => {
+ const year = ((row.year_month || "").slice(0, 4) || "-");
+ if (!yearlyMap[year]) {
+ yearlyMap[year] = {
+ year,
+ source_amount: 0,
+ display_project_basis_amount: 0,
+ display_total_basis_amount: 0,
+ allocated_amount: 0,
+ };
+ }
+ yearlyMap[year].source_amount += Number(row.source_amount || 0);
+ yearlyMap[year].display_project_basis_amount += Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
+ yearlyMap[year].display_total_basis_amount += Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
+ yearlyMap[year].allocated_amount += Number(row.allocated_amount || 0);
+ });
+ return Object.values(yearlyMap).sort((a, b) => String(a.year).localeCompare(String(b.year))).map((row, idx) => {
+ const sourceAmount = Number(row.source_amount || 0);
+ const allocatedAmount = Number(row.allocated_amount || 0);
+ const projectBasisAmount = Number(row.display_project_basis_amount ?? row.project_basis_amount ?? 0);
+ const totalBasisAmount = Number(row.display_total_basis_amount ?? row.total_basis_amount ?? 0);
+ return (
+
+ {(row.year || "-")}년 · {fmt(sourceAmount)}원 x ({fmt(projectBasisAmount)}원 / {fmt(totalBasisAmount)}원) = {fmt(allocatedAmount)}원
+
+ );
+ });
+ })()}
{!((lifecycleProjectTotalModal.allocation_details || []).length) && (
표시할 배부 계산식이 없습니다.
)}