LabHub
배우기 러닝패스 코스

Capital Markets and Settlement

T+2 Reconciliation and Card Authorisation/Capture Checks

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

휴장일 표를 읽어 영업일 기준 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.txttrades=, holidays=, bad_settle_date=, settle_on_nonbusiness= 를, /root/cap/settle/baddate.csvtrade_id,trade_date,recorded_settle_date,correct_settle_date 를 적습니다.
  3. tradessettlements 를 대사하세요. /root/cap/settle/recon.txttrades=, settlements=, amount_matched=, amount_mismatch=, amount_mismatch_total=, missing_settlement=, orphan_settlement=, orphan_amount= 여덟 줄을, /root/cap/settle/amountdiff.csvtrade_id,trade_amount,settled_amount,diff 를 적습니다.
  4. 결제일이 2026-09-16 전인데 결제가 끝나지 않은 체결을 찾아 /root/cap/settle/fails.csvtrade_id,settle_date,amount,settlement_status 로, /root/cap/settle/fails.txtfail_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.txtno_capture_count=, no_capture_amount=, partial_count=, partial_remaining_amount= 를 적으세요.
  7. idempotency_key 로 묶어 승인이 두 건 이상인 키를 찾아 /root/cap/settle/dupcharge.csvidempotency_key,auth_ids,charged_amount 로 적고, /root/cap/settle/dupcharge.txtdup_keys=, double_charged_amount= 를 적으세요. auth_ids 는 파이프(|)로 잇습니다.
  8. /root/cap/settle/report.md 에 보고서를 쓰세요. ## 무슨 일이 있었나, ## 결제일 계산, ## 대사 결과, ## 미결제, ## 카드 승인과 매입, ## 무엇을 고쳐야 하나 여섯 절이 필요합니다.

참고

체결·결제 원장과 카드 로그 만들기

/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.txttrades=, holidays=, bad_settle_date=, settle_on_nonbusiness= 를, /root/cap/settle/baddate.csvtrade_id,trade_date,recorded_settle_date,correct_settle_date 를 적습니다.

휴장일은 코드에 박지 말고 holidays 표에서 읽으세요. 주말과 휴장일을 건너뛰며 영업일을 두 번 세면 됩니다.

체결 장부와 결제 장부 양방향 대사하기

tradessettlements 를 대사하세요. /root/cap/settle/recon.txttrades=, settlements=, amount_matched=, amount_mismatch=, amount_mismatch_total=, missing_settlement=, orphan_settlement=, orphan_amount= 여덟 줄을, /root/cap/settle/amountdiff.csvtrade_id,trade_amount,settled_amount,diff 를 적습니다.

네 방향을 따로 세세요. 건수 합계만 비교하면 두 방향의 차이가 서로를 지웁니다.

미결제를 사유별로 가르기

결제일이 2026-09-16 전인데 결제가 끝나지 않은 체결을 찾아 /root/cap/settle/fails.csvtrade_id,settle_date,amount,settlement_status 로, /root/cap/settle/fails.txtfail_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.txtno_capture_count=, no_capture_amount=, partial_count=, partial_remaining_amount= 를 적으세요.

승인 취소나 거절 건은 여기 들어가지 않습니다. status 가 approved 인데 매입이 없는 것만입니다.

멱등키로 이중 청구 찾기

idempotency_key 로 묶어 승인이 두 건 이상인 키를 찾아 /root/cap/settle/dupcharge.csvidempotency_key,auth_ids,charged_amount 로 적고, /root/cap/settle/dupcharge.txtdup_keys=, double_charged_amount= 를 적으세요. auth_ids 는 파이프(|)로 잇습니다.

auth_id 로 묶으면 아무것도 안 나옵니다. idempotency_key 로 묶어 두 건 이상인 것을 보세요. 이중 청구액은 두 번째 이후 승인이 매입한 금액입니다.

결제 대사 보고서 쓰기

/root/cap/settle/report.md 에 보고서를 쓰세요. ## 무슨 일이 있었나, ## 결제일 계산, ## 대사 결과, ## 미결제, ## 카드 승인과 매입, ## 무엇을 고쳐야 하나 여섯 절이 필요합니다.

여섯 절이 필요합니다. 대사 절에는 두 방향 숫자가 모두, 조치 절에는 영업일 계산과 멱등키 이야기가 들어가야 합니다.