T+2の照合とカード承認・売上確定の点検
한국어 원문으로 표시합니다.
목표
휴장일 표를 읽어 영업일 기준 T+2 결제일을 다시 계산해 틀린 체결을 찾고, 체결 장부와 결제 장부를 네 방향으로 대사하고, 미결제를 사유별로 갈라 금액까지 내고, 카드 승인과 매입의 차이를 남김없이 설명하고 이중 청구를 찾아낼 수 있게 됩니다.
왜 중요한가
증권의 T+2 와 카드의 승인·매입은 다른 도메인이지만 구조가 같습니다. 사건이 둘로 나뉘어 있고, 그 사이에 상태가 살아 있고, 그 상태를 감시하지 않으면 돈이 샙니다. 이 실습은 그 두 구조를 한 바퀴씩 돌아 봅니다.
이 실습이 강제하는 네 가지는 전부 현장의 규칙입니다. 휴장일은 데이터로 둔다 — 코드에 박아 두면 임시공휴일이 지정될 때마다 배포가 필요하고, 배포가 늦으면 그 주에 사고가 납니다. 대사는 건 단위 양방향으로 한다 — 합계만 비교하면 두 방향의 차이가 서로를 지웁니다. 미결제는 사유로 가른다 — 합쳐 세면 담당 부서가 정해지지 않아 아무도 처리하지 않습니다. 이중 청구는 멱등키로 찾는다 — 승인 번호로는 영원히 나오지 않습니다.
이번 사건은 이렇습니다. 정산팀이 9월 둘째 주 미결제 잔고가 평소의 세 배라고 알려 왔고, 같은 주에 특정 가맹점의 이중 청구 민원이 몰렸습니다. 기준일은 2026-09-16 입니다.
영업일 계산 규칙은 이렇습니다. 체결일 다음 날부터 하루씩 나아가면서 토요일·일요일이 아니고 holidays 표에 없는 날을 영업일로 세고, 두 번째 영업일이 결제일입니다. 휴장일은 반드시 holidays 표에서 읽으세요 — 코드에 박으면 이 실습의 요점을 그대로 놓칩니다.
단계
/root/cap/settle을 만들고 정답지의 생성기를 그대로 돌려/root/cap/settle/settle.db,/root/cap/settle/auth.jsonl,/root/cap/settle/capture.jsonl을 만드세요.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를 적습니다.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를 적습니다.- 결제일이
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으로 적습니다. /root/cap/settle/auth.txt에 여덟 줄을 적으세요.auths=,captures=,approved=,voided=,declined=,full_capture=,partial_capture=,no_capture=입니다./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=를 적으세요.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는 파이프(|)로 잇습니다./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단계에서 두 승인의 금액을 다 더하는 것. 첫 번째는 정상 청구이므로 두 번째 이후만 이중 청구입니다.
체결·결제 원장과 카드 로그 만들기
/root/cap/settle 을 만들고 정답지의 생성기를 그대로 돌려 /root/cap/settle/settle.db, /root/cap/settle/auth.jsonl, /root/cap/settle/capture.jsonl 을 만드세요.
생성기를 그대로 돌리면 sqlite DB 하나와 JSONL 두 개가 만들어집니다. 씨앗을 바꾸면 채점 값과 어긋납니다.
영업일 기준 T+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 를 적습니다.
휴장일은 코드에 박지 말고 holidays 표에서 읽으세요. 주말과 휴장일을 건너뛰며 영업일을 두 번 세면 됩니다.
체결 장부와 결제 장부 양방향 대사하기
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 를 적습니다.
네 방향을 따로 세세요. 건수 합계만 비교하면 두 방향의 차이가 서로를 지웁니다.
미결제를 사유별로 가르기
결제일이 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 으로 적습니다.
기준일은 2026-09-16 입니다. 결제일이 그 전인 체결만 대상이고, 결제 기록이 아예 없는 것도 미결제입니다.
승인과 매입의 차이를 사유별로 설명하기
/root/cap/settle/auth.txt 에 여덟 줄을 적으세요. auths=, captures=, approved=, voided=, declined=, full_capture=, partial_capture=, no_capture= 입니다.
승인마다 매입 금액의 합을 구해 셋으로 가르세요 — 합이 0이면 매입 없음, 승인 금액보다 적으면 부분 매입, 같거나 크면 전량 매입입니다.
매입 없는 승인과 부분 매입 잔액 내기
/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= 를 적으세요.
승인 취소나 거절 건은 여기 들어가지 않습니다. status 가 approved 인데 매입이 없는 것만입니다.
멱등키로 이중 청구 찾기
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 는 파이프(|)로 잇습니다.
auth_id 로 묶으면 아무것도 안 나옵니다. idempotency_key 로 묶어 두 건 이상인 것을 보세요. 이중 청구액은 두 번째 이후 승인이 매입한 금액입니다.
결제 대사 보고서 쓰기
/root/cap/settle/report.md 에 보고서를 쓰세요. ## 무슨 일이 있었나, ## 결제일 계산, ## 대사 결과, ## 미결제, ## 카드 승인과 매입, ## 무엇을 고쳐야 하나 여섯 절이 필요합니다.
여섯 절이 필요합니다. 대사 절에는 두 방향 숫자가 모두, 조치 절에는 영업일 계산과 멱등키 이야기가 들어가야 합니다.