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;