From 3901a6f1726b125bf66461fb6747f0831ff6d096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 19 Mar 2026 11:38:00 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[finance]=20=EC=86=90=EC=9D=B5=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EC=84=9C=20sub=5Fcategory=EB=A5=BC=20=EC=8B=A4?= =?UTF-8?q?=EC=A0=9C=20DB=20=EA=B0=92=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sales → sales_revenue, cost_of_sales → cogs, sga → selling_admin - construction_cost를 매출원가(II)에 포함 - 법인세(99800)/소득세(99900)를 영업외비용에서 분리하여 IX로 이동 - 복수 sub_category 배열 지원 (sub_categories) --- .../Finance/IncomeStatementController.php | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Finance/IncomeStatementController.php b/app/Http/Controllers/Finance/IncomeStatementController.php index 32d8b4f4..50f89316 100644 --- a/app/Http/Controllers/Finance/IncomeStatementController.php +++ b/app/Http/Controllers/Finance/IncomeStatementController.php @@ -11,16 +11,18 @@ class IncomeStatementController extends Controller { // 손익계산서 항목 구조 (한국 일반기업회계기준) + // sub_categories: DB account_codes.sub_category 값 매핑 (배열 = 복수 sub_category 합산) + // tax_codes: 특정 계정코드를 별도 항목으로 분리 (법인세/소득세) private const PL_STRUCTURE = [ - ['code' => 'I', 'name' => '매출액', 'type' => 'sum', 'category' => 'revenue', 'sub_category' => 'sales'], - ['code' => 'II', 'name' => '매출원가', 'type' => 'sum', 'category' => 'expense', 'sub_category' => 'cost_of_sales'], + ['code' => 'I', 'name' => '매출액', 'type' => 'sum', 'category' => 'revenue', 'sub_categories' => ['sales_revenue']], + ['code' => 'II', 'name' => '매출원가', 'type' => 'sum', 'category' => 'expense', 'sub_categories' => ['cogs', 'construction_cost']], ['code' => 'III', 'name' => '매출총이익', 'type' => 'calc', 'formula' => 'I - II'], - ['code' => 'IV', 'name' => '판매비와관리비', 'type' => 'sum', 'category' => 'expense', 'sub_category' => 'sga'], + ['code' => 'IV', 'name' => '판매비와관리비', 'type' => 'sum', 'category' => 'expense', 'sub_categories' => ['selling_admin']], ['code' => 'V', 'name' => '영업이익', 'type' => 'calc', 'formula' => 'III - IV'], - ['code' => 'VI', 'name' => '영업외수익', 'type' => 'sum', 'category' => 'revenue', 'sub_category' => 'non_operating'], - ['code' => 'VII', 'name' => '영업외비용', 'type' => 'sum', 'category' => 'expense', 'sub_category' => 'non_operating'], + ['code' => 'VI', 'name' => '영업외수익', 'type' => 'sum', 'category' => 'revenue', 'sub_categories' => ['other_revenue']], + ['code' => 'VII', 'name' => '영업외비용', 'type' => 'sum', 'category' => 'expense', 'sub_categories' => ['other_expense'], 'exclude_codes' => ['99800', '99900']], ['code' => 'VIII', 'name' => '법인세비용차감전순이익', 'type' => 'calc', 'formula' => 'V + VI - VII'], - ['code' => 'IX', 'name' => '법인세비용', 'type' => 'sum', 'category' => 'expense', 'sub_category' => 'tax'], + ['code' => 'IX', 'name' => '법인세비용', 'type' => 'sum', 'category' => 'expense', 'tax_codes' => ['99800', '99900']], ['code' => 'X', 'name' => '당기순이익', 'type' => 'calc', 'formula' => 'VIII - IX'], ]; @@ -78,8 +80,23 @@ public function data(Request $request): JsonResponse if ($item['type'] === 'sum') { $relatedAccounts = $accountCodes->filter(function ($ac) use ($item) { - return $ac->category === $item['category'] - && $ac->sub_category === ($item['sub_category'] ?? null); + // tax_codes: 특정 계정코드만 포함 (법인세/소득세) + if (! empty($item['tax_codes'])) { + return in_array($ac->code, $item['tax_codes']); + } + + // sub_categories 배열로 매칭 + $subCategories = $item['sub_categories'] ?? []; + if ($ac->category !== $item['category'] || ! in_array($ac->sub_category, $subCategories)) { + return false; + } + + // exclude_codes: 특정 계정코드 제외 (영업외비용에서 법인세 제외) + if (! empty($item['exclude_codes']) && in_array($ac->code, $item['exclude_codes'])) { + return false; + } + + return true; }); $currentTotal = 0;