fix: [finance] 손익계산서 sub_category를 실제 DB 값에 맞게 수정

- sales → sales_revenue, cost_of_sales → cogs, sga → selling_admin
- construction_cost를 매출원가(II)에 포함
- 법인세(99800)/소득세(99900)를 영업외비용에서 분리하여 IX로 이동
- 복수 sub_category 배열 지원 (sub_categories)
This commit is contained in:
김보곤
2026-03-19 11:38:00 +09:00
parent 8eb6f0cd70
commit 3901a6f172

View File

@@ -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;