자본시장과 결제 · 청산·결제와 카드 승인 · 실습
T+2 대사와 카드 승인·매입 점검
목표
휴장일 표를 읽어 영업일 기준 T+2 결제일을 다시 계산해 틀린 체결을 찾고, 체결 장부와 결제 장부를 네 방향으로 대사하고, 미결제를 사유별로 갈라 금액까지 내고, 카드 승인과 매입의 차이를 남김없이 설명하고 이중 청구를 찾아낼 수 있게 됩니다.
왜 중요한가
증권의 T+2 와 카드의 승인·매입은 다른 도메인이지만 구조가 같습니다. 사건이 둘로 나뉘어 있고, 그 사이에 상태가 살아 있고, 그 상태를 감시하지 않으면 돈이 샙니다. 이 실습은 그 두 구조를 한 바퀴씩 돌아 봅니다.
이 실습이 강제하는 네 가지는 전부 현장의 규칙입니다. 휴장일은 데이터로 둔다 — 코드에 박아 두면 임시공휴일이 지정될 때마다 배포가 필요하고, 배포가 늦으면 그 주에 사고가 납니다. 대사는 건 단위 양방향으로 한다 — 합계만 비교하면 두 방향의 차이가 서로를 지웁니다. 미결제는 사유로 가른다 — 합쳐 세면 담당 부서가 정해지지 않아 아무도 처리하지 않습니다. 이중 청구는 멱등키로 찾는다 — 승인 번호로는 영원히 나오지 않습니다.
이번 사건은 이렇습니다. 정산팀이 9월 둘째 주 미결제 잔고가 평소의 세 배라고 알려 왔고, 같은 주에 특정 가맹점의 이중 청구 민원이 몰렸습니다. 기준일은 2026-09-16 입니다.
영업일 계산 규칙은 이렇습니다. 체결일 다음 날부터 하루씩 나아가면서 토요일·일요일이 아니고 holidays 표에 없는 날을 영업일로 세고, 두 번째 영업일이 결제일입니다. 휴장일은 반드시 holidays 표에서 읽으세요 — 코드에 박으면 이 실습의 요점을 그대로 놓칩니다.
단계
1. /root/cap/settle 을 만들고 정답지의 생성기를 그대로 돌려 /root/cap/settle/settle.db, /root/cap/settle/auth.jsonl, /root/cap/settle/capture.jsonl 을 만드세요.
2. holidays 표를 읽어 영업일 기준 T+2 를 다시 계산하세요. /root/cap/settle/calendar.txt 에 trades=, holidays=, bad_settle_date=, settle_on_nonbusiness= 를, /root/cap/settle/baddate.csv 에 trade_id,trade_date,recorded_settle_date,correct_settle_date 를 적습니다.
3. trades 와 settlements 를 대사하세요. /root/cap/settle/recon.txt 에 trades=, settlements=, amount_matched=, amount_mismatch=, amount_mismatch_total=, missing_settlement=, orphan_settlement=, orphan_amount= 여덟 줄을, /root/cap/settle/amountdiff.csv 에 trade_id,trade_amount,settled_amount,diff 를 적습니다.
4. 결제일이 2026-09-16 전인데 결제가 끝나지 않은 체결을 찾아 /root/cap/settle/fails.csv 에 trade_id,settle_date,amount,settlement_status 로, /root/cap/settle/fails.txt 에 fail_count=, fail_amount=, no_record=, pending=, failed= 로 적으세요. 결제 기록이 아예 없으면 상태를 none 으로 적습니다.
5. /root/cap/settle/auth.txt 에 여덟 줄을 적으세요. auths=, captures=, approved=, voided=, declined=, full_capture=, partial_capture=, no_capture= 입니다.
6. /root/cap/settle/orphan.csv 에 매입이 없는 approved 승인을 auth_id,merchant,amount,ts 로 적고, /root/cap/settle/orphan.txt 에 no_capture_count=, no_capture_amount=, partial_count=, partial_remaining_amount= 를 적으세요.
7. idempotency_key 로 묶어 승인이 두 건 이상인 키를 찾아 /root/cap/settle/dupcharge.csv 에 idempotency_key,auth_ids,charged_amount 로 적고, /root/cap/settle/dupcharge.txt 에 dup_keys=, double_charged_amount= 를 적으세요. auth_ids 는 파이프(|)로 잇습니다.
8. /root/cap/settle/report.md 에 보고서를 쓰세요. ## 무슨 일이 있었나, ## 결제일 계산, ## 대사 결과, ## 미결제, ## 카드 승인과 매입, ## 무엇을 고쳐야 하나 여섯 절이 필요합니다.
참고
- DB 는
sqlite3 -readonly file로 읽으세요. 파이썬에서는sqlite3.connect('file:...?mode=ro', uri=True)입니다. - 금액은 전부 정수 원 단위입니다. 실수로 다루면 합계가 미세하게 어긋나 채점에서 떨어집니다.
- 날짜 비교는
YYYY-MM-DD문자열끼리 그대로 비교해도 정확합니다. - 흔한 실수 1: 2단계에서 휴장일을 코드에 박는 것. 표에 든 날이 몇 개인지도 세야 합니다.
- 흔한 실수 2: 4단계에서 날짜 조건을 빼먹는 것. 아직 결제일이 오지 않은 건까지 세면 잔고가 부풉니다.
- 흔한 실수 3: 7단계에서 두 승인의 금액을 다 더하는 것. 첫 번째는 정상 청구이므로 두 번째 이후만 이중 청구입니다.
단계 8개
- 체결·결제 원장과 카드 로그 만들기
- 영업일 기준 T+2 로 결제일 검증하기
- 체결 장부와 결제 장부 양방향 대사하기
- 미결제를 사유별로 가르기
- 승인과 매입의 차이를 사유별로 설명하기
- 매입 없는 승인과 부분 매입 잔액 내기
- 멱등키로 이중 청구 찾기
- 결제 대사 보고서 쓰기