고객별 자산 리포트 자동화 실습

가상 데이터만 사용합니다. 이메일을 전송하는 코드가 없습니다.
Python 3.11.5 / macOS / reportlab 5.0.1 / pypdf 6.18.0 검증.
sample 폴더에서 실행하세요.

Mac/Linux:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python build_reports.py --output result-normal
.venv/bin/python build_reports.py --holdings data/holdings-missing-price.csv --output result-missing
.venv/bin/python test_reports.py

Windows 명령 표기(실행 미검증):
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe build_reports.py --output result-normal

정상: 고객별 PDF3/메일초안3, 총액300만원/150만원/30만원.
가격누락: PDF3/메일초안2/보류1. C003 소계10만원, 전체총액null.
이미 있는 출력폴더를 덮어쓰지 않습니다. 다시 실행할 때 새 이름을 지정하세요.
.eml은 첨부파일이 들어있는 메시지 파일입니다. 발송·수신 완료가 아닙니다.
examples 폴더는 실제 생성한 결과 샘플입니다.

입력 규칙:
- clients.csv: client_id,client_name,email
- holdings.csv: client_id,asset_id,asset_name,asset_type,quantity,price_krw,price_date,currency
- 같은 고객 ID로 연결. 고객+자산ID 중복 불가, 통화 KRW만 지원.
- 기본 기준일2026-09-08. 변경 시 모든 가격 날짜와 --as-of YYYY-MM-DD를 맞추세요.
- 가격 빈칸은 해당 고객 보류. 숫자0은 명시적인 값으로 계산.
- 잘못된 날짜·미등록/중복고객·음수·NaN·다른통화는 전체입력검증에서 중단.
- 고객별 자산1~8행·각파일1,000행까지 지원하는 실습 코드입니다.
- 수익률·세금·환율·실시간시세 없음. 항목별 원단위 반올림 후 합산.
- 실습 메일 주소는 @example.invalid만 허용. 실제 주소로 운영하지 마세요.

생성 중 저장공간·권한 등의 오류가 발생하면 일부 파일만 있을 수 있습니다.
review-manifest.json 완성 여부와 생성 파일을 확인하세요. 부분 결과는 발송 자료가 아닙니다.
실제 고객 시스템에 적용하려면 데이터 접근권한·수신자/첨부검토·승인·중복방지·발송실패 처리를 별도 설계해야 합니다.

한글 글꼴: Nanum Gothic, fonts/OFL.txt 재배포 라이선스 포함.
출처: https://github.com/google/fonts/tree/main/ofl/nanumgothic

기술 근거:
https://docs.python.org/3/library/email.examples.html
https://docs.python.org/3/library/decimal.html
https://docs.reportlab.com/reportlab/userguide/ch5_platypus/
