자금일보 · git:20261019.b4e6045 · 2026-10-19 · sha256 fd127ebb9c226aa1
자금일보 git:20261019.b4e6045A
Immutable. This exact content never changes and is served at /api/v1/blob/fd127ebb9c226aa1.
--- name: 자금일보 description: 여러 은행 계좌의 거래내역으로 하루 자금 현황(자금일보)과 날짜를 골라 보는 대시보드 HTML 을 만든다. 계좌 간 이체는 입출금에서 빼고, 전일 잔액 + 입금 - 출금 = 계좌 잔액 합계를 날마다 1원까지 검산해 안 맞으면 멈춘다. 자금코드는 분류규칙.md 표로만 붙이고, 표에 안 걸린 거래는 확인 필요로 따로 모은다. 입출금 예정표가 있으면 앞으로 2주 입출금 예측과 큰 출금을 붙인다. "자금일보", "자금일보 대시보드", "일일 자금현황", "일일 자금보고", "계좌 잔액 현황", "입출금 현황", "자금 시재", "시재 보고", "통장 잔액 정리", "오늘 자금 얼마", "자금 예측 2주"가 언급되면 트리거. 현금흐름표(영업·투자·재무 활동 구분)는 현금흐름표 스킬 몫이다. --- # 자금일보: 계좌 잔액 등식이 1원까지 맞을 때만 낸다 계산과 검산은 스크립트가 한다. 자금코드는 [분류규칙.md](assets/분류규칙_예시.md) 표에 있는 것만 쓰고, AI 가 새 분류를 지어내지 않는다. 분류가 이 회사 거래 성격에 맞는지는 사람이 본다. ## 입력 CSV 세 개를 한 폴더에 둔다. 은행 엑셀이든 데이터 플랫폼의 표든 ERP 내보내기든 아래 열 이름으로 맞추면 된다. 다른 열은 무시한다. 인코딩은 UTF-8(BOM 포함)·CP949 를 읽는다. 금액은 원 단위 정수이고 쉼표가 있어도 된다. ### bank_accounts.csv (필수, 계좌 하나에 한 줄) | 열 | 필수 | 내용 | |---|---|---| | `account_id` | 필수 | 거래·예정표가 가리키는 계좌 키(`A1`) | | `bank` | 필수 | 은행 이름 | | `account_alias` | 필수 | 용도 이름(주거래·수출대금·급여·세금). 화면과 자금일보에 이 이름이 나온다 | | `account_no` | 필수 | 마스킹한 계좌번호(`110-***-482913`). 받은 값을 그대로 쓴다 | | `opening_balance…` | 필수 | 첫 거래일 전날 마감 잔액. `opening_balance` 로 시작하는 첫 열을 쓴다(`opening_balance_0731` 도 된다) | | `closing_balance…` | 선택 | 있으면 마지막 거래 잔액과 1원까지 대조한다 | | `purpose` | 선택 | 메모 | ### bank_transactions.csv (필수, 거래 한 건에 한 줄) | 열 | 필수 | 내용 | |---|---|---| | `account_id` | 필수 | 계좌 키 | | `tx_date` | 필수 | 거래일. `2026-09-30`·`2026/09/30`·`2026.09.30` | | `tx_time` | 선택 | 거래 시각. 같은 날 안의 순서를 정한다. 없으면 파일 순서 | | `description` | 필수 | 적요 | | `counterparty` | 필수 | 거래처(의뢰인·수취인). 모르면 빈 칸 | | `deposit` · `withdrawal` | 필수 | 입금액 · 출금액. 한 줄에 둘 중 하나만 | | `balance` | 필수 | 그 거래 직후 계좌 잔액 | 최신 거래가 위에 오는 은행 내보내기는 뒤집어서 읽는다. 원화 계좌만 다룬다. 외화 계좌는 원화로 환산한 별도 열을 만들어 넣거나 빼고 돌린다. ### cash_schedule.csv (선택, 앞으로의 입출금 예정) | 열 | 필수 | 내용 | |---|---|---| | `due_date` | 필수 | 예정일 | | `direction` | 필수 | `입금` 또는 `출금` | | `item` · `counterparty` | 필수 | 항목 이름 · 거래처. 분류규칙으로 계좌 간 이체를 걸러낸다 | | `amount` | 필수 | 금액 | | `account_id` | 필수 | 계좌 키 | | `plan_id` | 선택 | 근거 칸에 적힌다 | 없으면 예측 카드에는 분류규칙 「예측」 표의 추정 항목만 나온다. ### 은행 엑셀에서 옮길 때 | 은행 엑셀 열(흔한 이름) | CSV 열 | |---|---| | 거래일시 · 거래일자 | `tx_date` (+ 시각이 붙어 있으면 `tx_time`) | | 적요 · 내용 · 기재내용 | `description` | | 의뢰인 · 수취인 · 받는분 · 보낸분 | `counterparty` | | 입금액 · 맡기신 금액 | `deposit` | | 출금액 · 찾으신 금액 | `withdrawal` | | 거래후잔액 · 잔액 | `balance` | 계좌마다 파일이 따로 오면 `account_id` 열을 붙여 한 파일로 잇는다. 위쪽 제목 줄과 합계 줄은 지운다. 기초 잔액은 첫 거래 줄의 `잔액 - 입금 + 출금` 으로 구할 수 있다. ### 데이터 플랫폼·DB 에서 읽을 때 은행 연동 데이터를 쌓아 두는 서비스(Gridie 같은 데이터 워크스페이스, 사내 DB, 오픈뱅킹·스크래핑 서비스)가 있으면 SELECT 결과를 같은 열 이름의 CSV 로 저장한다. 스크립트는 `fc_` 가 붙은 파일 이름(`fc_bank_transactions.csv`)도 읽는다. 조회만 하고 원천 표를 고치거나 지우지 않는다. 스크립트는 CSV 만 읽으므로 어떤 서비스도 필수가 아니다. ## 분류규칙.md 회사마다 [assets/분류규칙_예시.md](assets/분류규칙_예시.md) 를 복사해 고친다. 스크립트는 두 표를 읽는다. **「규칙」 표.** 첫 칸이 순서 숫자인 표 줄이 규칙이다. | 순서 | 구분 | 찾는 말 | 자금코드 | 비고 | |--:|---|---|---|---| | 1 | 양쪽 | 내부이체 · 계좌이체 | 계좌 간 이체 | | | 2 | 입금 | 대출 실행 | 차입금 | | - 위에서부터 보고 처음 맞은 줄 하나만 적용한다. - `구분`은 `입금`·`출금`·`양쪽`. 입금 거래는 `입금`·`양쪽` 줄만 본다. - `찾는 말`은 적요나 거래처에 들어 있으면 맞은 것이다. `·` 로 여러 개, 영문 대소문자 무시. - 어느 줄에도 안 맞으면 `기타 입금(확인 필요)` · `기타 출금(확인 필요)`. **「예측」 표(선택).** `## 예측` 제목 아래 표. 예정표에 없는 반복 흐름(판매 정산·매입·일상 지출)을 최근 영업일 평균으로 채운다. 자금코드와 생략 조건은 쉼표로 나눈다(자금코드 이름에 `·` 가 들어 있어서다). | 예측 항목 | 구분 | 자금코드 | 예정표에 이 말이 있으면 그날은 생략 | |---|---|---|---| | 원료·제품 매입 | 출금 | 원료·제품 매입 | 원료대금, 제품매입 | 규칙은 대화로 바꾸지 않는다. 대화로 정한 것은 다음 날 사라진다. 바꿀 것이 있으면 이 표에 줄을 더하고 다시 돌린다. ## 계좌 간 이체 규칙 표의 자금코드 `계좌 간 이체`(바꾸려면 `--내부이체코드`)가 붙은 거래는 입금·출금 합계와 자금코드별 표에서 뺀다. 한쪽 계좌에서 나가고 다른 계좌로 들어오므로 둘 다 빼도 계좌 합계 잔액은 그대로다. 계좌별 잔액 표의 입금·출금 칸에는 이체도 들어간다(그 계좌 통장 그대로). 규칙이 이체의 한쪽만 잡으면(보내는 쪽 적요는 「계좌이체」, 받는 쪽은 「자금 이동」) 그날 등식이 깨져 멈춘다. 그때는 받는 쪽 적요를 규칙 1번 찾는 말에 더한다. ## 검산 (안 맞으면 멈춘다) 1. **줄 잔액.** 계좌마다 거래 한 줄씩 `직전 잔액 + 입금 - 출금 = 그 줄 잔액`. 거래가 빠졌거나 순서가 틀리면 여기서 걸린다. 2. **날짜 합계.** 날마다 `전일 계좌 잔액 합계 + 입금 - 출금 = 당일 계좌 잔액 합계`. 입금·출금은 계좌 간 이체를 뺀 금액이다. 3. **기말 잔액.** 계좌 표에 `closing_balance…` 열이 있으면 마지막 거래 잔액과 대조. 하나라도 1원이 어긋나면 파일을 쓰지 않고 종료코드 2 로 멈추며 날짜·계좌·차이를 출력한다. 그 날짜와 차이를 그대로 보고하고, 숫자를 맞추려고 거래를 고치거나 빼지 않는다. 계좌별 마감 잔액은 그날 그 계좌 마지막 거래의 `balance` 이고, 거래가 없는 날은 전일 잔액을 쓴다. ## 실행 ```bash python scripts/build.py --입력 <CSV 폴더> --규칙 <분류규칙.md> --출력 <대시보드.html> \ [--기준일 2026-09-30] [--회사 "글로우빔(주)"] [--출처 "은행 거래내역"] \ [--휴일 2026-10-05,2026-10-09] [--큰출금 30000000] [--평균일수 20] [--예측일수 14] \ [--md <자금일보.md> | --md없음] [--메모 "한계 칸에 붙일 문장"] ``` - 윈도우 콘솔에서는 `PYTHONIOENCODING=utf-8` 을 붙인다. 필요한 패키지는 `requirements.txt`(pandas). - `--기준일`: 대시보드를 처음 열 때 보이는 날짜와 자금일보 md 의 날짜. 기본은 마지막 거래일. 주소 끝 `#2026-09-22` 로도 고른다. - `--휴일`: 예측 기간 안의 평일 공휴일. 쉼표로 적거나 한 줄에 하나씩 적은 파일 경로. 휴일에 잡힌 예정은 다음 영업일로 옮긴다. 공휴일 달력은 스크립트에 넣지 않았다. 대체공휴일이 해마다 달라서다. - `--입력` 대신 `--계좌 --거래 --예정` 으로 파일을 하나씩 줄 수 있다. - 종료코드 0 PASS · 1 입력 오류(열 없음, 계좌 키 불일치, 없는 기준일) · 2 검산 실패. 예시 자료로 돌리기: ```bash python scripts/build.py --입력 examples --규칙 assets/분류규칙_예시.md --출력 out/자금일보_대시보드.html --회사 "글로우빔(주)" --휴일 2026-10-05,2026-10-09 ``` 9/30: 전일 6,906,881,783 + 입금 243,131,400 - 출금 70,078,700 = 7,079,934,483. 확인 필요는 9/29 입금 김*수 3,300,000 과 9/30 (주)한빛상사 반환 1,870,000 두 건이다. 규칙 표에 `| 15 | 출금 | 반환 | 거래처 반환 | |` 을 더하고 다시 돌리면 한 건으로 준다. ## 산출물 **대시보드 HTML 한 파일**(외부 파일 없음, 글꼴만 Google Fonts). | 화면 | 내용 | |---|---| | 기준일 | 달력(점 색은 그날 순유입·순유출), 이전·다음 영업일, PDF 다운로드(인쇄 창) | | KPI 4개 | 전일 마감 잔액(월초 대비) · 당일 입금 · 당일 출금(최근 5영업일 평균 대비) · 당일 마감 잔액(전일 대비) | | 마감 잔액 추이 | 기준일이 든 달의 계좌 합계 잔액. 점을 누르면 그날 시작·입금·출금·마감 | | 자금코드별 유입·유출 | 계좌 간 이체 제외. 행을 누르면 그 코드의 거래 목록 | | 앞으로 일자별 입출금 예측 | 마지막 거래일 다음 날부터 `--예측일수` 일의 영업일. 예정표 항목은 「예정」, 평균으로 채운 것은 「추정」과 근거(기간·실적·건수·거래처 비중) | | 최근 10영업일 입금·출금 | 막대를 누르면 그날 거래 전부 | | 계좌별 마감 잔액 | 은행·용도·계좌번호·입금·출금·마감 잔액·전일 대비, 합계 | | 오늘 큰 거래 · 확인 필요 거래 | 금액 상위 6건과 규칙 밖 거래 | **자금일보 md**(`자금일보_<기준일>.md`, 출력 폴더). 순서는 고정이다. 1. 한 줄 요약: 마감 잔액과 전일 대비 증감 2. 잔액표: 전일 잔액 · 입금 · 출금 · 당일 잔액과 검산식 3. 계좌별 잔액 4. 자금코드별 입금·출금(계좌 간 이체 제외)과 합계 5. 앞으로 큰 출금(`--큰출금` 이상). 마지막 거래일이면 예정표에서 휴일을 옮겨 적고, 그 전 날짜면 이후 실제 거래와 예정표에서 6. 확인 필요 거래 금액은 원 단위 정수에 천 단위 쉼표, 억 단위는 소수 첫째 자리까지. 「대략」「약」으로 숫자를 흐리지 않는다. ## 확인 필요 거래 규칙에 안 맞은 거래는 지우거나 비슷한 코드에 넣지 않고 끝에 표로 모은다. 새 규칙이 필요해 보이면 분류규칙.md 에 넣을 한 줄을 **제안만** 한다(순서·구분·찾는 말·자금코드). 표는 사람이 고친다. 찾는 말이 너무 넓으면(「대금」) 다른 거래까지 끌려오므로 제안할 때 그 말이 걸리는 다른 거래 건수를 같이 적는다. ## 보고할 때 - 기준일의 등식 한 줄(전일 + 입금 - 출금 = 마감)과 검산 PASS 범위(계좌 수·거래 건수·영업일 수). - 확인 필요 거래 목록과 제안한 규칙 줄. - 앞으로 2주 큰 출금과 예측 기간 끝 예상 잔액. 추정 항목은 평균이라는 것. - **검산이 보지 않는 것.** 검산은 거래내역 안에서 금액이 서로 맞는지만 본다. 은행 잔액 자체가 맞는지는 잔액증명이나 인터넷뱅킹 화면과 대조해야 안다. 자금코드가 이 회사 거래 성격에 맞는지, 예정표 금액이 맞는지, 추정이 실제 정산 주기와 맞는지도 보지 않는다. ## 파일 | 경로 | 내용 | |---|---| | `scripts/build.py` | 읽기 · 분류 · 검산 · 예측 · HTML/md 쓰기 | | `assets/template.html` | 대시보드 틀(카드 4개·KPI·차트 함수) | | `assets/분류규칙_예시.md` | 규칙 14줄과 예측 표 3줄 예시 | | `examples/` | 모의 회사 글로우빔(주) 계좌 4개 · 2026-08-03~09-30 거래 688건 · 10월 예정 20건과 그 결과 `자금일보_대시보드_예시.html` · `자금일보_2026-09-30.md` | | `tests/test_build.py` | 예시 PASS 와 9/30 숫자, 거래 한 줄 누락·이체 한쪽 누락·기말 잔액 불일치에서 멈춤, 규칙 추가 반영, 최신순·CP949 입력 | 예시 자료는 지어낸 회사의 모의 거래다. 계좌 간 이체 7건, 규칙 밖 거래 2건, 추석 연휴로 9월 급여가 9/23 에 나간 것, 9/15 운전자금 5억 차입이 들어 있다.