현금흐름표 · git:20261029.3448610 · 2026-10-29 · sha256 163be7a45dbf5090

현금흐름표 git:20261029.3448610A

Immutable. This exact content never changes and is served at /api/v1/blob/163be7a45dbf5090.

---
name: 현금흐름표
description: 전기 재무상태표와 당기 분개장으로 현금흐름표를 직접법·간접법 둘 다 만들어야 할 때 쓴다. 현금 계정이 든 전표를 전부 보고 상대계정으로 활동을 정하고, 미지급금·가지급금·가수금처럼 상대계정만으로 모르는 것은 원천 전표·상세 내역·적요로 발라낸 뒤, 간접법과 맞춰 본다. "현금흐름표", "현금흐름표 만들어", "직접법", "간접법", "현금흐름표 작성", "영업활동 현금흐름", "투자활동", "재무활동", "CF 작성", "현금흐름 검토", "비현금거래", "가수금 발라내", "환율변동효과"가 언급되면 트리거.
---

# 현금흐름표: 직접법을 먼저 완결하고, 간접법으로 맞춰 본다

계산은 엔진이 하고 워크북은 전부 살아있는 수식이다. 활동 판정의 최종 확정은 회계사가 한다. 계정별 활동 구분과 근거는 [references/계정별_활동구분.md](references/계정별_활동구분.md).

결과는 회계사 검토 전 초안이다. 활동 판정, 특히 확인사항과 신뢰도 낮음 표시가 붙은 금액은 사람이 확정한다.

## 빠른 시작

들어 있는 합성 자료로 한 번 돌려 본다. 스킬 폴더에서:

```bash
pip install -r requirements.txt
python scripts/run.py --분개장 tests/fixtures/합성_분개장.xlsx --재무상태표 tests/fixtures/합성_재무상태표.xlsx --계정 tests/fixtures/합성_계정.xlsx --회사 합성 --출력 out
```

`out/현금흐름표_2026-06-01_2026-06-30.xlsx` 가 나오고 마지막 줄이 `엔진 검증 PASS  엑셀 대조 PASS  독립 검산 PASS` 이면 된다. 엑셀 대조는 Windows 엑셀이나 LibreOffice 로 수식을 한 번 계산시킨 뒤 한다. 둘 다 없으면 「재계산 못 함」으로 남고, 파일을 엑셀에서 열어 저장한 뒤 `scripts/재계산.py` 로 다시 본다. 테스트는 `python -m pytest tests`.

## 입력

| 자료 | 필수 | 받는 모양 |
|---|---|---|
| 계정별원장 | 분개장 대신 | 더존 계정별원장(계정마다 날짜·적요·거래처·차변·대변·잔액, 전월이월·월계·누계 줄). 전표번호가 없어 전표를 다시 묶는다(아래) |
| 당기 분개장 | 필수 | (가) 한 줄 한 계정: 전표번호·일자·계정코드·계정과목·차변·대변 (나) 차변·대변 계정이 다른 열: 승인일·승인번호·차변금액·차변계정과목·대변계정과목·대변금액. `[2530003]미지급금 법인카드` 처럼 코드를 품은 계정명, 위쪽 제목 줄, 합계 줄, 분기별 여러 파일을 받는다 |
| 전기 재무상태표 | 둘 중 하나 | (가) 표: 계정코드·계정과목·구분·잔액, 기준일 열이 있으면 날짜별 (나) 공시 양식: 과목·당기·전기 금액 두 칸씩. 전기 열이 기초, 당기 열이 기말 대조가 된다 |
| 분개장의 전기이월 줄 | 둘 중 하나 | 전기 재무상태표가 없으면 이 줄로 기초를 만든다 |
| 기말 합계잔액시산표 | 셋 중 하나(가장 정확) | `[코드]계정` 행과 차변·대변 잔액. 기초 = 시산표 기말 - 분개장 증감으로 원장 계정 단위 기초를 만든다. 공시 재무상태표가 표시과목(현금및현금성자산 등)으로만 나올 때 쓴다. 손익계정은 시산표와 분개장이 같은지 대조한다 |
| 손익계산서 | 선택 | 공시 양식. 당기순이익을 분개장과 대조한다 |
| 상세 내역 | 가계정이 있으면 | 은행거래내역·미분류목록. 가수금·가지급금 뭉칫돈을 건별로 발라낸다 |
| 계정명세서 | 선택 | 전기말 미지급금·가지급금 등의 거래처별 잔액. 활동·항목 열, `원천계정` 열(그 잔액이 생긴 계정. `833 광고선전비`·`[833]광고선전비`·`광고선전비`), 적요 열 순으로 기초잔액 결제분의 성격을 정한다 |
| 판정 | 선택 | `--판정 판정.csv` 회계사가 전에 내린 판정(계정코드·거래처·활동·항목·근거·판정자·판정일). 매번 `판정후보_<기간>.csv` 가 나오니 빈 칸을 채워 그대로 준다. 여러 달 것을 한 파일에 이어 쓴다. 거래처를 비우면 그 계정 전체 |
| 계정 마스터 | 선택 | 구분만 가져온다. 이름은 분개장을 믿는다 |
| 기준 | 선택 | `일반기업`(기본, 중소기업 포함), `K-IFRS`, `K-IFRS1118`. 이자·배당 분류가 달라진다. `K-IFRS1118` 은 2027-01-01 이후 시작 회계연도: 이자·배당 수취는 투자, 지급은 재무로 고정하고 간접법을 영업이익에서 시작한다(주된 사업활동이 금융·투자인 회사는 다르니 확인사항에 오른다) |
| 현금계정 | 선택 | `--현금계정 10500` 처럼 현금성자산으로 볼 계정. 한 계정 안을 현금성·단기금융상품으로 나눌 수는 없다 |
| 투자계정 | 선택 | `--투자계정 105` 처럼 현금성이 아니라 투자(금융상품)로 볼 계정. 만기 3개월 넘는 정기예금 |

**기말 재무상태표와 손익계산서를 같이 받으면 더 정확하다. 기초 재무상태표와 분개장만 받았으면 그대로 돌리되 사용자에게 이것을 안내한다.** 기말 재무상태표가 있으면 계정마다 기말 잔액을 분개장과 대조해 빠진 결산정리분개(감가상각 · 미지급비용 · 재고 조정)를 찾는다. 손익계산서가 있으면 간접법이 출발하는 당기순이익을 분개장과 대조한다. 둘이 없으면 기말 잔액을 기초 + 분개장으로 만들어 그 대조가 늘 맞으므로, 결산정리가 빠져도 현금 합계는 맞고 간접법의 당기순이익과 운전자본 변동만 틀린다. 실행 결과 끝의 `안내:` 줄(요약 시트 머리 메모, 검증 json `안내`)이 이 경우에 나온다. 기말은 재무상태표 파일에 기준일을 두 개(기초 · 기말) 넣거나 공시 양식의 당기 열로 주고, 시산표(`--시산표`)를 주면 둘 다 대신한다.

**정기예금·적금은 일단 현금성자산으로 두고 반드시 한 번 더 묻는다.** 확인사항 맨 위에 「정책·질문」으로 오른다. 보고할 때 사용자에게 취득일부터 만기 3개월 이내인지 묻고, 아니라는 답이면 `--투자계정 코드` 로 다시 돌린다. 움직임이 없어도 원장 전월이월·재무상태표에 있으면 묻는다.

**기초 잔액 자료(전기 재무상태표·시산표·전기이월)가 없으면 잔액을 열어 둔다.** 현금흐름은 당기 변동만이고 기초·기말 현금은 0 에서 시작한 값이다. 잔액이 필요한 독립 검산 B 는 「잔액 열어둠」으로 판정하지 않는다. 원장의 전월이월 잔액도 이 모드에서는 쓰지 않는다.

**계정 구분(자산·부채·자본·수익·비용)이 입력에 없으면(원장) 이름으로 먼저 정하고 이름으로 모를 때만 더존 코드대역을 쓴다.** 코드대역은 회사마다 다르다(어떤 회사는 962 임차보증금·964 기타보증금이 9xx 자산, 930 잡이익이 수익이다). 이름 규칙은 구분이 알려진 실제 계정 227개에서 틀림 0 이다.

- 7자리 세부계정(2530001~3)은 상위계정(2530000)으로 합친다. 재무상태표가 상위계정으로만 나오고, 세부 이름(자사몰정산)에는 성격이 안 드러나서다. 원래 계정은 분개장 시트 `세부계정` 열에 남는다. `--세부유지` 로 끈다.
- ERP 가 내보낸 xlsx 중 스타일 정보가 규격에 안 맞아 openpyxl 이 못 여는 파일은 스타일만 걷어내고 읽는다.
- 머리글이 두 줄(윗줄 차변·대변, 아랫줄 금액·계정과목)이면 합쳐 읽는다. 날짜는 2024-01-01·2024/01/01·2024.01.01 을 받는다.
- 공시 양식 재무상태표·손익계산서는 과목 열이 첫 열이 아니어도, `I.`·`II.` 같은 영문 로마숫자와 `(주석3)` 이 붙어도 읽는다. 감사인 WTB 의 BS·IS 시트는 `--재무상태표시트 BS --손익계산서시트 IS`.
- 적요가 없는 분개장이면 가계정·기초잔액 판정이 기본값(기타 영업활동)으로 남는다. 상세 내역을 같이 달라고 한다.

## 실행

```bash
python scripts/run.py --분개장 Q1.xlsx Q2.xlsx Q3.xlsx Q4.xlsx (--재무상태표 BS.xlsx | --시산표 TB.xlsx) [--손익계산서 PL.xlsx] [--계정 accounts.xlsx] [--상세 은행거래.xlsx --상세필터 미분류] [--명세서 명세.xlsx] [--현금계정 10500] [--기준 K-IFRS --정책 이자지급=재무] --회사 "회사명" --출력 폴더
```

윈도우 콘솔에서는 `PYTHONIOENCODING=utf-8` 을 붙인다. 기간 시작일은 기초 기준일 다음 날이다. `현금흐름표_<시작>_<끝>.xlsx` 와 `검증_<시작>_<끝>.json` 이 나오고, 엑셀로 한 번 계산시킨 값을 엔진 숫자와 다시 대조한다. 종료코드 0 이 PASS 다. 마지막 줄 `시간:` 이 단계별 초를 보여 준다.

### 시간

| 분개장 | 읽기 | 계산 | 워크북 | 엑셀 재계산 | 합계 |
|---|--:|--:|--:|--:|--:|
| 1만 2천 줄(월 결산) | 2초 | 0초 | 7초 | 14초 | 24초 |
| 17만 8천 줄(1년, 분기 파일 4개) | 18초 | 4초 | 111초 | 36초 | 171초 |

`pip install -r requirements.txt` 로 `python-calamine` 을 깔아야 이 속도가 나온다(없으면 openpyxl 로 읽어 1만 2천 줄 읽기에만 15초 넘게 걸린다). 1만 줄에 몇십 분이 걸리면 스크립트가 아니라 둘레 작업이다.

- 한 번 돌리고 결과는 터미널 끝 줄과 `검증_<기간>.json` 으로 본다. 워크북을 openpyxl 로 통째로 다시 열지 않는다. 분개장 시트가 줄 수 × 40열이라 그것만으로 몇십 초가 간다. 시트 하나만 볼 때는 `read_only=True` 로 그 시트만 읽는다.
- 같은 입력으로 다시 돌리지 않는다. 판정을 바꿀 때만 `--판정` 을 붙여 다시 돌린다.
- 엑셀 재계산은 따로 띄운 프로세스에서 하고 파일 크기에 맞춘 제한 시간(1MB 에 1분, 적어도 3분)을 넘기면 엑셀을 끄고 「재계산 못 함」으로 넘어간다. 엑셀에 로그인 · 복구 · 라이선스 창이 떠 있으면 COM 이 아무 말 없이 기다리기 때문이다. 이렇게 넘어가면 엑셀에서 파일을 한 번 열어 저장한 뒤 `python scripts/재계산.py <파일>` 로 다시 계산시킨다.

## 흐름

0. **(계정별원장이면) 전표를 다시 묶는다.** 같은 전표의 줄은 날짜와 적요가 같다(더존은 전표 적요를 줄마다 복사한다).
   1. 적요 묶음: 같은 날짜·적요의 줄이 대차 일치면 한 전표(거래처별로도 맞으면 거래처별로)
   2. 금액 짝: 대차가 안 맞는 묶음끼리 같은 날짜에 남은 금액이 서로 반대인 것
   3. 일자 잔여: 그래도 남은 줄은 날짜별 한 전표(신뢰도 낮음)
   원장의 월계 줄과 읽은 줄 합계를 계정마다 대조한다(한 줄이라도 빠지면 걸린다). 모의 원장 8만 3,761줄에서 적요 묶음 99.86%, 현금 줄 2,267개 중 2개만 일자 잔여였다.
1. **현금분과 비현금분을 나눈다.** 현금 계정이 든 전표에서 현금과 반대편 줄들에 현금액을 금액 비율로 붙인다(현금분). 나머지는 현금이 없는 전표처럼 다룬다(비현금분).
   - 비품 1,000 을 현금 300 과 미지급금 700 으로 산 전표: 현금분은 비품 300, 비현금분은 비품 700·미지급금 700 이다. 700 은 잔금을 치를 때 비품 취득으로 추적되고, 기말까지 안 갚으면 비현금 투자 거래다.
   - 급여 100 에서 예수금 10 을 떼고 90 을 준 전표: 현금분은 급여 90 이다.
2. **직접법 추적.** 현금분 줄마다 활동·항목을 정한다.
   - 명확한 계정은 그대로 활동·항목이 된다.
   - 부가세·예수금·외환차손익은 같은 전표의 주 계정을 따른다. 비품 대금과 같이 낸 부가세는 투자활동이다.
   - 추적 계정(미지급금·미수금·가지급금·가수금·선급금·미지급비용·미지급세금, 규칙에 없는 계정)은 비현금분에서 원천을 찾는다. 순서는 아래 표와 같다. 원천이 또 추적 계정이면 최대 3단계까지 더 찾는다.
   - 음수로 적은 역분개는 원래 거래와 부호만 반대로 같은 항목에 둔다. 비현금 발생분과 그 역분개도 먼저 서로 지운다.
   - 외화환산손익·외환차손익만 있는 현금 전표는 환율변동효과로 따로 둔다.
3. **보정.** 원천으로 안 정해진 행(원천 없음·기초잔액·계정 순차)을 다음 순서로 판정한다.
   1. 같은 계정·같은 거래처(거래처가 있는 것만)의 현금 지급과 현금 반환을 짝지어 같은 항목에 둔다.
   2. 뭉칫돈 가계정(가수금·가지급금 …)부터, 금액이 큰 것부터 상세 내역에서 금액 한 건 → 같은 달 전부 → 전표일까지 전부 순으로 합계가 맞는 묶음을 찾아 건별로 나눈다.
   3. 판정 파일에 같은 계정·거래처(또는 거래처를 비운 같은 계정) 줄이 있으면 그 판정을 쓴다. 적요보다 앞선다.
   4. 적요로 판정한다. 강한 말은 적요 글자만, 약한 말은 거래처 이름까지 본다.
   5. 적요로도 모르면 같은 거래처의 다른 거래(80% 이상 한 항목)로 판정한다.
   6. 그래도 모르면 기본값으로 두고 확인사항과 `판정후보_<기간>.csv` 에 올린다. 회계사가 채운 판정은 다음 달에도 쓴다.
4. **적합성.** 계정으로 정해진 행도 적요가 다른 활동을 강하게 가리키면(외상매입금 결제인데 적요가 「설비 대금」) 확인 열에 적는다. 값은 바꾸지 않는다.
5. **분개장에 분류를 붙인다.** 원 분개 줄마다 현금영향·기본활동·자동활동·자동항목·판정 방법·추적 경로·원천 전표·확인·적요 판정을 적는다. 한 줄의 현금이 여러 항목으로 나뉘면(미지급금 결제가 비품과 복리후생비로) 바로 밑에 「분할」 행을 두고 현금영향은 분할 행에만 둔다. 직접법은 분개장의 최종활동·최종항목으로 SUMIFS 한다. 그래서 분개장을 거르면 현금흐름표 숫자를 줄 단위로 따라갈 수 있다.
6. **간접법은 정산표로 만든다(감사인 WTB 방식).** 재무상태표 계정 한 행의 증감을 칸으로 모두 설명하고 행마다 검산이 0 이어야 한다.
   - 칸: 비용가산 · 수익차감 · 영업자산부채 증감 · 투자 유입/유출 · 재무 유입/유출 · 비현금 차변/대변 · 환율.
   - 투자·재무·환율 칸(과 비영업 계정의 영업 칸)은 분개장 분류를 SUMIFS 로 가져온다. 비용가산·수익차감·비현금 칸은 엔진이 비현금 분개를 차대 짝으로 나눈 값이다(감가상각비 → 누계액 행 비용가산, 외상 취득 → 비품·미지급금 행 비현금 차대).
   - 영업 계정의 영업자산부채 증감은 나머지(잔차)다. 비영업 계정(유형자산·차입금·자본)은 잔차가 없으므로 검산이 진짜 검증이 된다. 비품 현금 취득을 영업으로 잘못 고치면 비품 행 검산이 0 이 아니게 된다.
   - 손익계산서 대사: 비용가산·수익차감 라벨별로 손익계산서 금액과 정산표 금액을 나란히 둔다.
   - 현금흐름표_간접법은 정산표에서 1. 당기순이익 → 2. 현금 유출입이 없는 손익의 조정(손익 계정과목마다 가산 · 차감 · 순액을 한 줄에) → 4. 영업활동으로 인한 자산·부채의 변동 순으로 가져온다. 가산 · 차감은 계정 성격이 아니라 비현금 분개의 방향이라 같은 계정이 양쪽에 걸린다(국고보조금 상계, 재공품 원가 대체, 평가충당금 환입, 리스료 상계). 계정별로 맞춰 보도록 한 줄에 모았다(2026-10-29).
7. **비교.** 활동별 직접법(분개장 분류)과 간접법(정산표)이 같아야 한다. 재분류 내역(계정 기본활동과 최종활동이 다른 현금영향)도 같이 둔다.
8. **확정.** 회계사가 분개장의 노란 칸(수정활동·수정항목, 목록에서 고른다)을 채우면 직접법·정산표·간접법·검증이 따라 바뀐다. 분할 합계 행이 아니라 분할 행에서 고친다. 수정 후 `scripts/재계산.py` 로 다시 계산시키고 `요약` 종합 PASS 를 본다.

### 추적 순서 (미지급금 등)

결제·회수처럼 잔액을 줄이는 줄은 그보다 앞선 발생분에서 찾고, 선지급·가수처럼 잔액을 늘리는 줄은 그 뒤의 정산분에서 찾는다.

| 순서 | 방법 | 기준 |
|---|---|---|
| 1 | 건별 일치 | 같은 거래처, 같은 금액, 날짜 순서가 맞는 원천이 하나뿐일 때. 전 기간에 먼저 돌린다 |
| 2 | 기초잔액 | 잔액을 줄이는 줄이고 전기말 잔액이 정상 방향으로 남아 있을 때. 명세서가 있으면 같은 거래처와 거래처 모름만 |
| 3 | 거래처 순차 | 같은 거래처 발생분을 오래된 것부터 |
| 4 | 다른 거래처 기초잔액 | 명세서의 다른 거래처 잔액. 확인 필요 표시 |
| 5 | 계정 순차 | 같은 계정의 남은 발생분을 오래된 것부터. 확인사항에 오른다 |
| 6 | 원천 없음 | 보정 단계로 넘긴다 |

한 결제가 원천 수천 건을 쓰면 행은 (활동·항목·경로)로 합치고 원천 전표는 다섯 개와 건수만 적는다.

## 워크북

| 시트 | 내용 |
|---|---|
| 요약 | 두 묶음. 내부 일관성(산술·대사·구조, 10~12개)과 독립 검산(A·B·B'·C). 주어진 기말과 다른 계정 수, 확인사항 수, 활동별 합계 |
| 독립검산 | 분류와 무관한 사실로 분류를 확인한다(아래 「검증의 두 묶음」). 전부 분개장 SUMIFS 수식 |
| 현금흐름표_직접법 | 항목별 `SUMIFS(분개장 현금영향, 최종활동, 최종항목)`. Ⅰ영업 Ⅱ투자 Ⅲ재무 Ⅳ환율 Ⅴ증감 Ⅵ기초 Ⅶ기말 |
| 현금흐름표_간접법 | 정산표에서 당기순이익 · 손익 계정과목별 가산 · 차감 · 순액 · 자산부채 변동. 투자·재무·환율은 직접법 항목 |
| 간접법_정산표 | 감사인 정산표. 계정 행별 기말·기초·증감·검산과 설명 칸, 합계, 요약(활동별 = 직접법), 손익계산서 대사. 모든 칸이 분개장 수식(비용가산·수익차감·비현금 칸은 분개장 정산칸·정산라벨·정산금액 열에서) |
| 비교 | 활동별 직접법 · 정산표 · 차이, 재분류 내역 |
| 분개장 | 원 분개 + 현금흐름 열(현금영향·기본/자동/수정/최종 활동·항목·판정 방법·경로·원천·확인·적요 판정·분류 대상·이유) + 정산 열(비현금 몫이 정산표 어느 칸·라벨로 가는지, 금액) + 투자·재무 관련 비현금(독립검산 B 상한용), 분할·정산분할 행 |
| 기말재무상태표 | 주어진 기말 잔액. 정산표 기말 대조 칸이 참조한다 |
| 분류기준 | 활동 정의, 줄 상태별(분류함·현금 계정·분할 합계·현금 없는 전표·현금과 같은 편) 줄 수와 이유, 분류 순서, 판정 방법별 뜻·신뢰도·줄 수·금액, 정책과 적요 원칙 |
| 비현금거래 | 활동이 섞인 비현금분. `비현금 투자·재무 거래` 는 주석 공시 대상(문단 43) |
| 확인사항 | 분류·내용·금액·회계사 판단(노란 칸) |
| 계정규칙 · 전기재무상태표 | 판정 근거와 원자료 |

### 활동이 비어 있는 분개장 줄

분류 실패가 아니라 분류할 현금이 없는 줄이다. `분류 대상·이유` 열이 줄마다 어디로 갔는지 적는다.

| 줄 | 이유 | 어디서 설명되나 |
|---|---|---|
| 현금 계정 줄 | 현금흐름 그 자체 | 같은 전표의 상대 줄이 분류된다 |
| 분할 합계 줄 | 현금이 여러 항목으로 나뉨 | 바로 아래 분할 줄 |
| 현금이 없는 전표의 줄 | 현금이 오가지 않음(발생·대체·결산정리) | 간접법 정산표의 비용가산·수익차감·비현금거래·영업자산부채 증감, 또는 당기순이익 |
| 현금 전표지만 현금과 같은 편인 줄 | 현금과 함께 차변(또는 대변)이라 이 줄로 현금이 안 오감(이자 원천세 선납세금, 외상 취득분 미지급금) | 위와 같다 |

한 해 분개장 약 19만 줄로 돌려 보면 분류한 줄은 1만 1천 줄 남짓이고 나머지는 이 네 가지다.

## 검증의 두 묶음

**직접법과 간접법(정산표)의 일치는 분류가 맞다는 증거가 아니다.** 둘이 같은 분개장 분류를 공유하므로 분류가 틀려도 같이 틀려 늘 맞는다. 요약 시트는 두 묶음으로 나눈다.

| 층 | 무엇을 보나 | 항목 |
|---|---|---|
| 내부 일관성 | 산술·대사·구조. 빠지거나 두 번 센 돈이 없는지 | 분개장 차대, 현금영향 합 = 현금 증감, 미분류 0, 기말현금·당기순이익·기말잔액 대사, 정산표 행 검산, 비현금 차대, 정산 칸 = 분개장 정산 열, 직접 = 간접 |
| 독립 검산 | 분류가 맞는지. 분류와 무관한 사실로 | A. 비현금 성격 손익(감가상각·상각·대손·평가·손상·처분)의 현금분 0 · B. 추적 계정(미지급금·선급금 등)에서 투자·재무로 분류한 현금이 그 계정의 잔액과 비현금 대체액이 허락하는 범위 안 · B'. 분류가 맞다면 기말에 남아야 할 관련 잔액을 기말 계정명세서와 대조(명세서 값을 넣은 행만) · C. 비현금 성격 손익의 손익계산서 = 정산표 가감 + 현금분 · D. 참고(판정 없음): 이자·법인세 분석적 대사, 항목 부호 |

- B 는 분개장만으로는 범위가 넓을 수 있다. 기말 미지급금 중 자산 관련 몫을 모르기 때문이다(실제 사례에서 미지급금 범위의 상한이 분류액의 2.6배였다). 기말 계정명세서의 투자 관련 금액을 독립검산 시트 노란 칸에 넣으면 B' 가 한 점과 대조하는 강한 검산이 된다.
- 합성 데이터에서 비품 외상 대금 결제를 일부러 영업으로 바꾸면 내부 일관성 10개는 모두 PASS 로 남고 B 만 FAIL 한다(`tests/test_engine.py::test_독립검산은_잘못된_분류를_잡는다`).
- 이 밖의 독립 증거: 감사인 WTB 처럼 다른 방법으로 만든 결과와의 대조, 유형자산 대장, 전기 분개장.

## 보고할 때

활동별 금액, 재분류 내역, 확인사항 상위 항목을 적고 **검증이 보지 않는 것**을 같이 적는다.

- 판정 방법이 `원천 없음`·`기초잔액`·`계정 순차`·`상세(적요로 모름)` 이거나 확인 열에 「확인 필요」가 붙은 금액의 합이 그 활동 합계 절댓값의 10% 를 넘으면, 보고 첫머리에 「이 금액이 정리되기 전에는 확정할 수 없다」고 적는다.
- 가계정을 적요·상세로 판정해 활동이 바뀐 금액(예: 가수금 중 대출 실행)은 따로 짚는다. 적요는 입력한 사람이 쓴 말이라 틀릴 수 있다.
- 기초를 전기 재무상태표가 아니라 분개장 전기이월 줄로 만들었으면 그 사실을 적는다. 공시 양식 재무상태표에서 누계액 코드를 번호 순서로 짝지었으면(메모에 나온다) 그것도 적는다.
- 내부 일관성 PASS 는 산술과 대사가 맞는다는 뜻이다. 분류는 독립 검산 결과로 따로 보고하고, B 의 범위 폭이 넓으면 그 사실과 명세서 대조가 필요하다는 것을 적는다. 비교 시트의 「설명되지 않는 차이 0」은 구조상 항등식이다.
- 기말 재무상태표나 손익계산서를 주지 않으면 결산정리분개가 빠졌는지 알 수 없다. 빠지면 현금 합계는 맞아도 간접법의 당기순이익과 운전자본 변동이 틀린다. 실행 결과에 `안내:` 줄이 나오면 보고에 그대로 옮기고, 무엇을 더 주면 되는지(기말 기준일이 든 재무상태표 · 손익계산서 · 기말 시산표 중 하나) 적는다.
- 정기예금의 현금성자산 여부(만기 3개월), FVPL 의 단기매매 목적 여부, K-IFRS 의 이자·배당 정책은 확인사항으로만 올린다.
- 유형·무형자산 대금을 미지급금으로 두었다가 전기에 또는 취득 90일 뒤에 낸 금액은 투자로 두고 확인사항에 올린다. 취득 직후 지급이면 투자, 자산 취득에 따른 부채의 지급이면 재무다(일반기업 2.68·2.71). 「직후」의 기간 기준은 기준서에 없다. 90일은 이 스킬의 참고값이다.
- 판정후보 파일이 비어 있지 않으면 그 줄 수와 금액을 적는다. 회계사가 채워 `--판정` 으로 다시 돌리면 줄어든다.

## 예외 기록

| 증상 | 원인 | 처리 |
|---|---|---|
| 계정 마스터와 분개장의 같은 코드가 다른 이름(820 수선비 / 감가상각비) | 마스터가 다른 회사 표준 계정표 | 이름은 분개장을 믿고 차이는 확인사항으로 |
| 미지급금 결제 합계가 전기말 잔액과 원 단위까지 같다 | 전월 카드 사용분을 이번 달에 결제 | 기초잔액을 거래처 순차보다 먼저 쓴다 |
| 가수금 뭉칫돈 한 줄 | 미분류 입금 69건을 가계정 하나로 모음 | 미분류목록으로 발라내니 대부분이 운전자금대출(재무)이었다 |
| openpyxl 이 `CellStyle count` 오류로 못 연다 | ERP 내보내기 스타일이 규격 밖 | 스타일만 걷어내고 읽는다 |
| 차변·대변 계정이 다른 열, `[코드]이름` 계정, 승인번호가 날마다 1 부터 | 이카운트류 분개장 | 두 열을 한 줄 한 계정으로 풀고 번호에 일자를 붙인다 |
| 7자리 세부계정(2590001 자사몰정산)이 규칙에 안 걸린다 | 세부 이름에 성격이 없다 | 상위계정(2590000 선수금)으로 합친다 |
| 7자리 코드가 코드대역 추정에 안 걸려 당기순이익이 0 이 됐다 | 3자리 대역만 봤다 | 앞 세 자리로 본다 |
| 적요가 「전기이월이익잉여금 대체」인 마감분개 줄이 전기이월로 빠져 대차가 깨졌다 | 적요 앞글자만 봤다 | 빼도 전표 대차가 맞을 때만 이월로 본다 |
| 공시 양식 재무상태표에 감가상각누계액이 세 번, 대손충당금 행의 합계 칸이 순액 | 양식 구조 | 반대계정은 세부 칸만 읽고, 코드는 모계정 코드 다음 번호 → 남은 같은 이름 코드 순 |
| 현금 300 + 미지급금 700 으로 산 비품에서 700 이 현금 유입으로 잡혔다 | 현금 전표의 비현금 다리를 현금으로 셌다 | 현금분·비현금분을 나눈다(흐름 1) |
| 계정 안분으로 행이 74만 줄, 엔진 139초 | 결제 × 발생 건수만큼 행을 만들었다 | 계정 순차(오래된 것부터)로 바꾸고 행을 합친다. 1만 7천 행, 3초 |
| 분개장 시트를 만드는 데 18만 줄에서 끝나지 않았다 | openpyxl `max_row` 가 호출마다 셀 전체를 훑는다 | 행 번호를 직접 세고 끝에 실제 행 수와 맞는지 확인한다 |
| 머리글 틀 고정이 2행을 만들어 수식이 한 줄씩 밀렸다 | `freeze_panes` 에 셀 객체를 넣었다 | 좌표 문자열로 준다 |
| 공시 재무상태표가 표시과목(현금및현금성자산·매출채권)이라 원장 계정 기초를 못 정한다 | 표시과목 하나에 원장 계정 여럿 | 기말 합계잔액시산표 - 분개장 증감으로 기초를 만든다(`--시산표`) |
| 정기예적금 한 계정을 감사인은 현금성과 단기금융상품으로 나눴다 | 만기 판단이 계정 단위가 아니다 | `--현금계정` 으로 계정 전체를 현금으로 두고 나머지는 대조표에서 옮겨 비교한다 |
| 적요 「포상지원금」이 차입금 상환으로 잡혔다 | 「지원금」 안의 「원금」 | 대출·차입·리스·할부 원금, 원금 상환만 |
| 산업재산권·건설중인무형자산 취득이 영업으로 남았다 | 현금은 선급비용으로 나가고 나중에 무형자산으로 대체 | 선급비용도 추적한다(대체처가 무형자산이면 투자) |
| 비품 중고판매 대금이 잡이익으로 들어와 영업이 됐다 | 잡계정은 성격이 없다 | 잡이익·잡손실은 강한 적요(중고판매 등)가 가리키는 활동을 따른다 |
| 외화환산 가산이 손익계산서의 2.7배로 나왔다 | 매월 환산하고 다음 달 외환차손익으로 되돌린다 | 비현금 외화 손익은 「외화환산손익」 한 라벨로 순액. 현금 전표의 환산·외환차손익 순액이 환율변동효과 |
| 대손충당금 제각이 한쪽 행에만 적혀 비현금 차변 ≠ 대변 | 드러낼지를 행마다 따로 정했다 | 재무상태표 두 계정 사이 짝은 한쪽이라도 대상이면 양쪽에 적는다. 엔진이 차대 합계를 확인한다 |
| 신주청약증거금 반환이 「유상감자」로 나왔다 | 자본금 규칙의 유출 항목 | 신주청약증거금은 유입·유출 모두 유상증자(순액) |
| 가지급금 정산 222건을 음수로 역분개 | 월말 정산을 가지급금에 올렸다가 되돌림 | 역분개 짝을 찾아 원거래와 함께 「역분개 상계」로 둔다 |
| 「상품」이 단기금융상품을 먼저 잡았다 | 부분 문자열 | 금융상품 규칙을 재고자산보다 앞에 |
| 「판매대행예수금」이 원천징수 예수금(종업원)으로 잡혔다 | 「예수금」 부분 일치 | 예수금은 이름이 정확히 예수금이거나 원천세·4대보험 예수금일 때만 부속 |
| 기초 미지급금 두 건이 같은 금액·같은 모양인데 하나는 광고비, 하나는 가구 잔금(부트캠프 연습 회사) | 계정 이름만으로는 원천을 모른다 | 명세서 `원천계정` 열로 정하고, 모르면 회계사 판정을 판정 파일에 남겨 다음 달에 다시 묻지 않는다 |
| 적요 오탐: Corp 의 RP, LCD 의 CD, 출장비의 장비, 식자재 감자, 노트북(VAT포함) | 부분 문자열·순서 | 영문은 단어 경계, 비용 단어를 먼저 거르고, 부가세·이자는 투자·재무 말 뒤로 |
| 계정별원장에 전표번호·상대계정이 없다 | 원장 양식 | 날짜·적요로 전표를 다시 묶는다(흐름 0) |
| 기타보증금·임차보증금(9xx)이 비용, 잡이익(930)이 비용으로 잡혀 당기순이익이 틀렸다 | 원장에 구분이 없어 코드대역으로 추정 | 이름으로 먼저 정한다. 이름에 자산 말이 든 손익계정(제품매출·원재료비·재고자산감모손실)은 꼬리말로 가린다 |
| 선수광고비가 규칙 없음 | 「선수금」만 봤다 | 이름이 선수로 시작하는 부채는 고객 선수금 |
| 플랫폼이 판매대금 정산 대행사에 선급금으로 선충전하고 정산 전표에서 선수금과 상계 | 판매자 대신 돈을 받고 주는 구조 | 선수금 성격(고객)으로 순액. 고객을 대리한 수취·지급은 순액 표시 가능(K-IFRS 1007 문단 22). 월말 미정산 선충전은 거래처 이력으로 판정되어 신뢰도 낮음 |
| 통장 거래내역을 `--상세` 로 주자 StopIteration 으로 멈췄다 | 입출금 열 이름이 「입금액 · 출금액」 이었다(입금 · 출금 · 금액만 찾았다) | 입금 · 입금액 · 입금금액 · 맡기신금액 / 출금 · 출금액 · 출금금액 · 찾으신금액을 찾고, 없으면 있는 열 이름을 담아 오류를 낸다 |
| 1만 2천 줄 분개장 읽기에 27초 | 원장인지 볼 때와 분개장을 읽을 때 같은 파일을 두 번 열고, openpyxl 로 읽었다 | 한 번 읽은 표를 다시 쓰고, calamine 이 있으면 그것으로 읽는다. 2초 |
| 엑셀 대조에 21초 | 숫자 몇십 칸을 보려고 분개장 시트까지 통째로 열었다 | 요약 · 직접법 · 간접법 · 정산표 네 시트만 읽기 전용으로 읽는다. 0초 |
| 1만 줄 분개장에 30분 넘게 걸렸다는 보고(2026-10-29) | 스크립트는 1분 안쪽이다. 엑셀 COM 이 대화상자에서 멈추거나 결과를 여러 번 다시 열어 본 것으로 본다 | 엑셀 재계산에 제한 시간을 걸고, 단계별 시간을 끝 줄에 찍는다 |

## 파일

- `scripts/run.py` 실행, `engine.py` 계산, `계정규칙.py` 계정 판정, `적요.py` 적요 판정, `입력.py` 모양별 읽기, `build_workbook.py` 워크북, `재계산.py` 엑셀 재계산
- `tests/test_engine.py` 추적·보정·정산표 분해, `tests/test_입력.py` 입력 모양·회귀, `tests/make_fixture.py` 합성 분개장, `tests/fixtures/` 빠른 시작용 합성 자료