무역 업무의 구조 · 결제와 신용장 · 실습
신용장 서류 심사 자동화
목표
신용장 조건을 읽어 내고, 제시된 서류 여섯 장을 날짜·금액·물품 명세·운송·보험·환어음 순으로 심사해 불일치를 전부 찾은 뒤, 은행이 보내는 불일치 통지문을 씁니다.
왜 중요한가
무역 결제에서 신용장(L/C)은 은행이 "서류가 조건에 맞으면 지급하겠다" 고 약속하는 방식입니다. 매도인은 물건을 보낸 뒤 서류를 은행에 제시하고, 은행은 물건이 아니라 서류만 봅니다. 서류가 조건과 맞지 않으면 물건이 멀쩡히 도착해도 은행은 지급을 거절할 수 있습니다. 이 서류 심사 원칙은 ICC 의 신용장통일규칙(UCP 600)이 정하고, 전 세계 은행이 같은 기준으로 봅니다.
심사에서 보는 것은 정해져 있습니다. 최종 선적일을 넘겼는가, 선적 뒤 정해진 기간(보통 21일) 안에 제시했는가, 유효기일 안인가, 금액이 신용장을 초과하는가, 상업송장의 물품 명세가 신용장과 어긋나는가, B/L 이 본선 적재를 표시하고 지시된 수하인·통지처로 되어 있는가, 보험이 정해진 비율(보통 송장 금액의 110%) 이상인가. 하나라도 어긋나면 불일치이고, 은행은 정해진 은행영업일(5일) 안에 한 번에 모든 불일치를 적어 통지해야 합니다. 빠뜨린 불일치는 나중에 주장할 수 없습니다.
이 심사는 규칙 기반이라 자동화 대상이고, 실제로 은행과 무역 회사가 서류 심사 시스템을 씁니다. 규칙을 코드로 옮기면서 배우는 것은 "무엇을 어디와 비교하는가" 입니다.
이 실습의 규칙
- 제시 마감일 = 본선 적재일 +
presentation_period_days. 제시일이 그보다 늦으면 불일치. 제시일은 유효기일 이하여야 합니다. - 송장 금액과 환어음 금액은 신용장 금액을 초과하면 안 됩니다. 수량은 신용장의 수량과 같아야 합니다(분할선적 불허).
- 송장의 물품 명세는 신용장의 명세와 글자까지 같아야 합니다(이 실습의 단순화). 송장의 매도인은 수익자, 매수인은 개설의뢰인과 같아야 합니다.
- B/L 은 본선 적재 표시가 있고, 무사고(clean)이며, 선적항·양륙항·수하인·통지처가 신용장과 같고, 원본 전통(
bl_originals)이 제시되어야 합니다. - 보험 금액은 신용장 금액 ×
insurance_pct÷ 100 이상, 통화는 신용장과 같고, 담보 개시일은 본선 적재일 이하여야 합니다. 원산지증명서의 원산지는REPUBLIC OF KOREA, 환어음의 지급 조건과 지급인은 신용장과 같아야 합니다. - 결과 파일의
result는PASS또는FAIL입니다.
단계
1. 오른쪽 예시의 생성기를 /root/trade/make_lc.py 로 저장하고 python3 make_lc.py 로 실행하세요. lc.json 과 presentation/ 아래 서류 요약 7개(meta 포함)가 만들어집니다.
2. /root/trade/lc_terms.txt 에 amount=, currency=, expiry=, latest_shipment=, presentation_days=, partial_shipment=, port_of_loading=, port_of_discharge= 여덟 줄을 적으세요.
3. 날짜 심사를 /root/trade/date_check.csv 에 check,expected,actual,result 머리글로 latest_shipment, presentation_deadline, expiry 세 줄 적으세요. expected 는 신용장이 허용하는 마지막 날짜, actual 은 서류의 날짜입니다.
4. 금액·수량 심사를 /root/trade/amount_check.csv 에 같은 머리글로 invoice_amount, draft_amount, quantity, currency 네 줄 적으세요.
5. 송장 심사를 /root/trade/invoice_check.csv 에 check,result 머리글로 goods_description, seller_is_beneficiary, buyer_is_applicant 세 줄 적으세요.
6. 운송서류 심사를 /root/trade/bl_check.csv 에 check,result 머리글로 on_board_notation, clean, port_of_loading, port_of_discharge, consignee, notify, full_set 일곱 줄 적으세요.
7. 보험·원산지·환어음 심사를 /root/trade/other_check.csv 에 check,result 머리글로 insurance_amount, insurance_currency, insurance_date, coo_origin, draft_tenor, draft_drawee 여섯 줄 적고, 네 파일의 FAIL 을 모아 /root/trade/discrepancies.txt 에 첫 줄 count=, 그 아래 불일치 이름을 한 줄에 하나씩 알파벳순으로 적으세요.
8. /root/trade/refusal_notice.md 에 ## 통지 요지, ## 불일치 목록, ## 서류의 처리, ## 통지 기한 네 절로 불일치 통지문을 쓰세요.
참고
json.load로 읽고datetime.date.fromisoformat과timedelta로 날짜를 더하세요.- 심사는 "신용장의 값" 과 "서류의 값" 을 나란히 놓는 일입니다. 함수 하나(
check(name, expected, actual))로 전부 처리됩니다. - 흔한 실수 1: 제시 기간을 제시일 기준으로 거꾸로 세는 것. 본선 적재일에서 앞으로 셉니다.
- 흔한 실수 2: 보험 금액을 송장 금액의 110% 로 보는 것. 이 실습은 신용장 금액 기준입니다.
- 흔한 실수 3: 통지문에 불일치를 일부만 적는 것. 한 번에 전부 적지 않으면 나머지는 주장할 수 없습니다.
단계 8개
- 신용장과 제시 서류 만들기
- 신용장 조건 읽어 내기
- 날짜 심사하기
- 금액과 수량 심사하기
- 상업송장 심사하기
- 선하증권 심사하기
- 보험·원산지·환어음 심사하고 불일치 모으기
- 불일치 통지문 쓰기