# 손익계산서 서비스 이관 기획서

> **작성일**: 2026-03-20
> **상태**: 기획 확정, API 완료
> **대상**: MNG → API + React (서비스 이관)
> **위치**: 서비스 > 회계관리 > 손익계산서

---

## 1. 개요

### 1.1 목적

MNG 백오피스의 손익계산서 조회 기능을 서비스(API + React)로 이관한다.
API에는 이미 동일 로직의 `IncomeStatementService`가 구현되어 있으므로, **API 코드 변경 없이** React 프론트엔드 구현만 필요하다.

### 1.2 배경

- MNG `회계/세무관리 > 손익계산서` 메뉴로 기존 구현 완료 (2026-03-19)
- API에 `IncomeStatementService` + `IncomeStatementController`가 MNG와 동일 로직으로 이미 구현됨
- 기간별 조회 (`GET /api/v1/income-statement`) + 월별 조회 (`GET /api/v1/income-statement/monthly`) 2개 엔드포인트 제공

### 1.3 이관 범위

| 구분 | MNG (현재) | API + React (이관 후) |
|------|-----------|---------------------|
| **백엔드** | Controller 직접 로직 | `IncomeStatementService` (이미 완료) |
| **프론트** | Blade + React (@verbatim) | React (Next.js) |
| **인증** | 세션 기반 | Bearer 토큰 + `BelongsToTenant` |
| **API 코드 변경** | — | **불필요** (이미 완료) |

---

## 2. 현재 MNG 기능 분석

### 2.1 MNG 기능 목록

| 기능 | MNG 메서드 | API 대응 |
|------|-----------|---------|
| 페이지 렌더링 | `index()` | React 라우트 |
| 기간별 조회 | `data()` | `GET /api/v1/income-statement` |
| 월별 조회 | `monthly()` | `GET /api/v1/income-statement/monthly` |

### 2.2 손익계산서 구조 (PL_STRUCTURE)

한국 일반기업회계기준에 따른 10개 항목:

```
I.   매출액                     = revenue(sales_revenue) 합계
II.  매출원가                   = expense(cogs + construction_cost) 합계
III. 매출총이익                 = I - II (계산)
IV.  판매비와관리비             = expense(selling_admin) 합계
V.   영업이익                   = III - IV (계산)
VI.  영업외수익                 = revenue(other_revenue) 합계
VII. 영업외비용                 = expense(other_expense) - [99800, 99900] 합계
VIII.법인세비용차감전순이익     = V + VI - VII (계산)
IX.  법인세비용                 = expense[99800, 99900] 특정 코드만
X.   당기순이익                 = VIII - IX (계산)
```

### 2.3 데이터 소스

일반전표(`journal_entry_lines`) + 홈택스 세금계산서(`hometax_invoice_journals`)를 합산하여 계정코드별 차변/대변 합계를 구한다.

### 2.4 MNG ↔ API 비교

| 항목 | MNG | API |
|------|-----|-----|
| PL_STRUCTURE | 동일 | 동일 |
| getAccountSums (journal + hometax) | 동일 | 동일 |
| buildSections | 동일 | 동일 |
| evaluateFormula | 동일 | 동일 |
| 단위 변환 (won/thousand/million) | 동일 | 동일 |
| 기수 계산 (getFiscalYear) | 동일 | 동일 |
| `_debug` 필드 | 포함 | 미포함 (정상) |

**결론**: API 코드 변경 불필요.

---

## 3. API 엔드포인트

### 3.1 기간별 손익계산서

| Method | Path | 설명 |
|--------|------|------|
| `GET` | `/api/v1/income-statement` | 기간별 손익계산서 (당기+전기) |

**요청 파라미터**:

| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|:----:|------|
| `start_date` | `string(date)` | Y | 당기 시작일 |
| `end_date` | `string(date)` | Y | 당기 종료일 |
| `unit` | `string` | N | `won`(기본) / `thousand` / `million` |

### 3.2 월별 손익계산서

| Method | Path | 설명 |
|--------|------|------|
| `GET` | `/api/v1/income-statement/monthly` | 월별 손익계산서 |

**요청 파라미터**:

| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|:----:|------|
| `year` | `integer` | Y | 조회 연도 (2020~2100) |
| `unit` | `string` | N | `won`(기본) / `thousand` / `million` |

---

## 4. React 구현 요구사항

### 4.1 보기 모드

| 모드 | API | 설명 |
|------|-----|------|
| **기간 보기** | `GET /income-statement` | 당기+전기 비교 (토글로 전기 숨김 가능) |
| **월별 보기** | `GET /income-statement/monthly` | 연도별 1~12월 비교 |

### 4.2 UI 컨트롤

- 보기 모드 전환 (`[기간 보기]` / `[월별 보기]`)
- 당기/전기 토글 (`[당기만]` / `[당기+전기]`) — 기간 보기에서만
- 월 선택 (`[전체]` `[1월]` `[2월]` ... `[12월]`) — 월별 보기에서만
- 기간 필터 (시작일~종료일) / 연도 선택
- 단위 선택 (원 / 천원 / 백만원)
- 인쇄 버튼

### 4.3 테이블 레이아웃

**기간 보기**: 과목 | 당기(세부+소계) | 전기(세부+소계, 토글)
**월별 단일 월**: 과목 | 금액(세부+소계)
**월별 전체**: 과목(sticky) | 1월 | 2월 | ... | 12월 (가로 스크롤)

---

## 5. MNG 참고 화면

> MNG 개발서버: `https://admin.codebridge-x.com` → 회계/세무관리 > 손익계산서

| 파일 | 설명 |
|------|------|
| `mng/app/Http/Controllers/Finance/IncomeStatementController.php` | 전체 로직 |
| `mng/resources/views/finance/income-statement.blade.php` | React 컴포넌트 (UI 참고) |

---

## 관련 문서

- [dev/dev_plans/account-ledger-income-statement-plan.md](account-ledger-income-statement-plan.md) — 원래 MNG 구현 기획서
- [frontend/api-specs/income-statement-service-api.md](../../frontend/api-specs/income-statement-service-api.md) — FE API 명세 (서비스 이관 버전)
- [frontend/api-specs/account-ledger-service-api.md](../../frontend/api-specs/account-ledger-service-api.md) — 계정별원장 FE API 명세

---

**최종 업데이트**: 2026-03-20
