포트로직스
경력근거: 정산·회계 정합성을 코드로 보장해, 마감 후 수동 개입이 필요한 건을 0으로 만드는 일
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 오퍼레이션 셀이 푸는 문제로 '정산·회계 정합성을 코드로 보장해, 마감 후 수동 개입이 필요한 건을 0으로 만드는 일' 을 적었고, 셀의 범위를 '화물 한 건이 들어와서 매출이 되어 나갈 때까지 거치는 모든 자리' 로 정했습니다. 사용자도 '운영팀/재무팀/수출입운송팀/사업지원팀' 으로 못박아, 결과를 받는 사람이 사내 두 팀입니다. 포워더는 견적 단계에서 매출과 매입을 같이 잡아 두고 선사·터미널·해외 파트너가 나중에 청구서를 보내는 구조라, 견적에 없던 체선료나 터미널 비용이 마감 직전에 들어오는 일이 이 회사 매출 구조에서 생깁니다. 세 파일을 B/L 번호와 요금 코드로 짝짓고, 정정 인보이스와 다시 온 청구서를 반영해 금액을 맞추는 데까지가 이 작업의 몫입니다. 포워딩 운임 협상이나 회계 기준 해석 전문성은 주장하지 않습니다.
공고가 오퍼레이션 셀이 푸는 문제로 '정산·회계 정합성을 코드로 보장해, 마감 후 수동 개입이 필요한 건을 0으로 만드는 일' 을 적었습니다. 견적과 매출 인보이스, 협력사 청구서를 B/L과 요금 코드로 맞춰 마감 전에 어긋난 요금을 내놓는 화면이 그 문장을 옮긴 물건입니다.
'오퍼레이션 셀의 사용자는 옆자리에 있습니다. 운영팀/재무팀/수출입운송팀/사업지원팀' 이라고 밝혀, 고객은 외부 고객사가 아니라 사내 현업입니다. 화주 재청구는 운영팀이, 협력사 청구서 반려는 재무팀이 맡으므로 두 팀이 같은 판정을 보고 일을 나눌 화면이 필요합니다.
자격 항목에 '정합성 검증 도구를 직접 만듭니다' 가 있고 우대 항목에 '회계·정산·세무처럼 돈이 걸린 도메인을 다뤄 본 경험' 이 있습니다. 정정 인보이스의 음수 금액을 합산하고 같은 번호로 두 번 들어온 청구서를 한 번만 세는 계산이 이 두 문장이 요구하는 손끝입니다.
포트로직스의 자사 포워딩 솔루션 TOMS 에서 내려받은 그달의 견적 요금표, 화주에게 낸 매출 인보이스, 협력사가 보낸 매입 청구서 세 파일을 받아 B/L(선하증권) 번호와 요금 코드마다 다섯 판정 중 하나를 정합니다. 요금 코드는 문서마다 O/F·DOC.FEE·T.H.C 처럼 점과 빗금을 달리 찍어 들어오므로, 점과 빗금, 띄어쓰기를 지운 비교용 코드로 세 파일을 맞춥니다. 매출은 정정 인보이스의 음수 금액까지 더한 순액으로, 매입은 같은 청구서 번호로 다시 들어온 건을 한 번만 세어 견적과 견줍니다. 재무팀 담당자와 운영팀 담당자가 같은 화면에서 판정별 목록을 열고, 화주에게 다시 청구할 요금과 협력사에 돌려보낼 청구서를 나눠 가져갑니다.
월 마감 때 B/L별 매출·매입을 맞추는 포트로직스 재무팀 담당자와 운영팀 담당자 — 같은 화면을 보고 화주 재청구와 협력사 청구서 반려를 나눠 맡는다
마감 뒤 전표를 고치는 일이 매달 나오는 까닭은 담당자가 덜 꼼꼼해서가 아니라, 견적은 운영팀이, 인보이스와 청구서는 재무팀이 따로 들고 있어 B/L 한 건의 세 금액을 한자리에서 본 적이 없기 때문입니다. 세 파일을 B/L과 요금 코드로 맞추고 순액을 계산해 두면, 마감 전에 다시 청구할 요금과 돌려보낼 청구서가 목록으로 나옵니다.
재무팀 담당자가 견적 요금표, 매출 인보이스, 매입 청구서 세 파일을 올리면 B/L과 요금 코드마다 다섯 판정 중 하나와 매출 차액, 매입 초과액이 나오는 관리자 페이지입니다. 정정 인보이스의 음수 금액을 더한 순액과, 같은 청구서 번호로 두 번 들어온 매입을 한 번만 센 합계를 이 주에 계산합니다. 파일은 TOMS 에서 내려받은 엑셀로 받고, TOMS 데이터베이스 직접 조회는 3주차로 미룹니다.
요금 줄 120건에 손으로 단 정답과 판정을 견주는 평가 러너를 만들고, 석 달 치 마감을 합쳐 견적에 없는 매입과 매입 초과가 어느 협력사·어느 요금 코드에서 되풀이되는지 셉니다. 이 주부터 AWS 에 올려 재무팀과 운영팀이 같은 주소로 엽니다.
운영팀 담당자가 걸린 요금을 고르면 화주 재청구 요청 초안이, 재무팀 담당자가 고르면 협력사 반려 사유 초안이 나옵니다. 담당자가 판정을 뒤집은 기록은 요금 코드 비교 규칙의 손질 후보로 쌓이고, TOMS 조회는 사내 MCP 서버로 엽니다.
재무팀 담당자가 9월 세 파일을 올리면 B/L PLHB2609-0503 의 체선료 줄이 매입 초과로 뜨고, 펼치면 견적 900달러와 협력사 청구 2,300달러가 나란히 보입니다. 같은 화면에서 운영팀 담당자가 PLHB2609-0471 서류 발급비의 청구 누락을 찾아 가져가는 흐름을 시연합니다.
요금 줄 120건에 제가 손으로 정답 판정을 달고, 다섯 판정별로 규칙이 낸 판정과 몇 건이 같은지 셉니다. 견적·인보이스·청구서와 정답을 모두 제가 지은 합성 데이터라, 이 숫자는 성능이 아니라 데모 조건에서 판정이 의도한 갈래로 나뉘는지를 보여줍니다.
정정 인보이스로 음수가 섞인 B/L, 같은 번호로 두 번 온 청구서, 견적 매출이 0원인 면제 요금만 골라 넣은 회귀 세트를 규칙을 고칠 때마다 다시 돌려, 순액과 합계가 한 번도 바뀌지 않는지 봅니다.
마감 뒤 손으로 고친 전표가 실제로 줄었는지는 이 숫자로 말하지 못합니다. 포트로직스의 실제 견적·인보이스·청구서로 월 마감을 몇 번 돌려 고친 전표 수를 전후로 세어야 알 수 있고, 이 포트폴리오는 그 첫 달을 바로 돌릴 판정 화면과 평가 러너까지 만듭니다.
판정 일치 건수는 제가 지은 견적·인보이스·청구서 세 파일에 제가 단 정답으로 센 값이라, 실제 마감에서 판정이 맞는다는 증거가 되지 못합니다. 면접에서는 요금 줄 하나가 다섯 판정 중 어디로 떨어지는지 규칙 순서대로 짚어 보이고, 실제 마감 파일을 받으면 요금 코드가 몇 줄이나 짝을 찾는지부터 재겠다고 말합니다.
마감 파일이 깨끗하면 다섯 판정이 한 번씩 나와도 규칙의 빈틈이 드러나지 않습니다. 샘플에는 50달러를 되돌린 정정 인보이스, 같은 번호 BPT-0917 로 두 번 접수된 청구서, 매입 금액이 빈 서류 발급비, 매출 0원으로 면제한 THC 를 넣어 순액과 합계가 이 자리에서 어긋나지 않는지 봅니다.
B/L 요금 줄을 세 파일에서 짝지어 순액과 합계를 내고 판정하는 데까지가 범위입니다. 운임을 얼마로 잡아야 맞는지, 체선료를 어느 회계 계정에 넣는지는 판단하지 않습니다.
「매입이 견적보다 큼」으로 뜬 요금 가운데 협력사 잘못이 아닌 것이 섞입니다. 컨테이너 반납이 늦어 체선료가 날마다 붙었다면 청구서는 맞고 견적이 짧았던 것이라, 화주에게 다시 청구할지 협력사에 되물을지는 운영팀 담당자가 반출 기록을 보고 정합니다.
더미의 매입 청구서는 금액이 견적과 같은 통화로 적혀 있다고 가정합니다. 해외 파트너가 현지 통화로 보내는 실제 청구서가 들어오면 환율 기준일을 재무팀과 먼저 맞추고 통화 환산을 규칙 앞에 둬야 합니다.
견적과 청구서에는 화주별 단가가 실려 사외로 나가면 안 되는 값입니다. 초안 작성에 넘기는 값은 B/L 번호와 요금 코드, 판정, 차액으로 줄이고, 판정 작업은 사내 AWS 계정 안에서 돌립니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
TOMS 에서 내려받은 그달의 견적 요금표입니다. B/L 하나에 요금 코드별로 한 줄씩, 화주에게 받을 매출 금액과 협력사에 낼 매입 금액을 같은 통화로 둡니다. 서류 발급비처럼 포트로직스가 직접 받는 요금은 매입 금액이 비어 있고, 주요 화주에게 면제한 요금은 매출 금액이 0원입니다.
| quote_line_no | hbl_no | charge_code | sell_amount | buy_amount | currency |
|---|---|---|---|---|---|
| QL-0412-1 | PLHB2609-0412 | O/F | 1,200 | 950 | USD |
| QL-0412-2 | PLHB2609-0412 | DOC FEE | 50,000 | — | KRW |
| QL-0455-1 | PLHB2609-0455 | O/F | 1,620 | 1,300 | USD |
| QL-0455-2 | PLHB2609-0455 | THC | 190,000 | 165,000 | KRW |
| QL-0471-1 | PLHB2609-0471 | O/F | 880 | 700 | USD |
아래 JSON Schema 를 그대로 만족하는 견적 요금표 줄을 200개 더 만들어 주세요. B/L 번호는 'PLHB2609-' 뒤에 네 자리 숫자로 쓰고, B/L 하나에 요금 코드 두세 줄을 둡니다. 요금 코드는 O/F·THC·DOC FEE·DEM/DET·CFS·WFG 중에서 고르고, O/F 와 DEM/DET 는 USD, THC·DOC FEE·CFS·WFG 는 KRW 로 둡니다. 매출 금액은 매입 금액보다 10~30퍼센트 크게 잡습니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: DOC FEE 줄은 매입 금액을 null 로 두고, 스무 줄에 한 번꼴로 매출 금액을 0으로 둔 면제 요금을 넣습니다. 판정 결과는 넣지 마세요. 형식 깨뜨리기 시도로 금액 칸에 '1,200' 같은 문자열을 넣은 줄을 따로 5건 만들어 파서가 거르는지 보게 합니다.
{"type":"object","properties":{"quote_line_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"sell_amount":{"type":["number","null"],"minimum":0},"buy_amount":{"type":["number","null"],"minimum":0},"currency":{"type":"string","enum":["USD","KRW"]}},"required":["quote_line_no","hbl_no","charge_code","sell_amount","buy_amount","currency"]}{"type":"object","properties":{"quote_line_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"sell_amount":{"type":["number","null"],"minimum":0},"buy_amount":{"type":["number","null"],"minimum":0},"currency":{"type":"string","enum":["USD","KRW"]}},"required":["quote_line_no","hbl_no","charge_code","sell_amount","buy_amount","currency"]}화주에게 발행한 매출 인보이스 줄입니다. 인보이스 번호와 B/L 번호, 요금 코드, 금액, 통화, 발행일을 한 줄에 둡니다. 금액을 잘못 청구해 되돌린 경우에는 음수 금액의 정정 인보이스가 따로 한 줄 들어오고, 요금 코드는 발행한 사람에 따라 DOC.FEE 처럼 점을 찍어 적기도 합니다.
| invoice_no | hbl_no | charge_code | amount | currency | issued_at |
|---|---|---|---|---|---|
| AR-2609-0101 | PLHB2609-0412 | O/F | 1,200 | USD | 2026-09-05 |
| AR-2609-0102 | PLHB2609-0412 | DOC FEE | 50,000 | KRW | 2026-09-05 |
| AR-2609-0140 | PLHB2609-0455 | O/F | 1,450 | USD | 2026-09-08 |
| AR-2609-0141 | PLHB2609-0455 | THC | 190,000 | KRW | 2026-09-08 |
| AR-2609-0163 | PLHB2609-0471 | O/F | 880 | USD | 2026-09-10 |
아래 JSON Schema 를 그대로 만족하는 매출 인보이스 줄을 200개 더 만들어 주세요. 인보이스 번호는 'AR-2609-' 뒤에 네 자리 숫자로 쓰고, B/L 번호와 요금 코드는 견적 요금표와 같은 체계로 씁니다. 대부분은 견적 매출 금액과 같게 청구하되, 스무 줄에 한 번꼴로 견적과 다른 금액을 청구하고, 그중 일부는 음수 금액의 정정 인보이스로 차이를 되돌립니다. 열 줄에 한 번쯤 요금 코드를 'DOC.FEE'·'O.F'·'THC ' 처럼 점이나 띄어쓰기를 바꿔 적고, 견적에는 있는데 인보이스가 없는 요금도 스무 건에 한 번꼴로 남겨 둡니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"invoice_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","enum":["USD","KRW"]},"issued_at":{"type":"string","format":"date"}},"required":["invoice_no","hbl_no","charge_code","amount","currency","issued_at"]}{"type":"object","properties":{"invoice_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","enum":["USD","KRW"]},"issued_at":{"type":"string","format":"date"}},"required":["invoice_no","hbl_no","charge_code","amount","currency","issued_at"]}선사·터미널·해외 파트너가 보낸 매입 청구서 줄입니다. 청구서 번호와 B/L 번호, 요금 코드, 협력사 코드, 금액, 접수일을 한 줄에 두고, 금액은 견적과 같은 통화로 적혀 있다고 둡니다. 협력사가 같은 청구서를 메일로 다시 보내 같은 청구서 번호가 두 번 접수되기도 하고, 견적에 없던 요금이 청구되기도 합니다.
| bill_no | hbl_no | charge_code | vendor_code | amount | received_at |
|---|---|---|---|---|---|
| HMM-58820 | PLHB2609-0412 | O/F | V-HMM | 950 | 2026-09-06 |
| PNIT-3301 | PLHB2609-0412 | THC | V-PNIT | 185,000 | 2026-09-07 |
| HMM-58861 | PLHB2609-0455 | O/F | V-HMM | 1,300 | 2026-09-09 |
| PNIT-3325 | PLHB2609-0455 | THC | V-PNIT | 165,000 | 2026-09-09 |
| MSC-10477 | PLHB2609-0471 | O/F | V-MSC | 700 | 2026-09-11 |
아래 JSON Schema 를 그대로 만족하는 매입 청구서 줄을 200개 더 만들어 주세요. 청구서 번호는 협력사 앞머리(HMM·ONE·MSC·PNIT·BPT)에 하이픈과 숫자를 붙여 쓰고, 협력사 코드는 'V-' 뒤에 같은 앞머리를 씁니다. 대부분은 견적 매입 금액과 같게 청구하되 다음을 섞으세요: 스무 줄에 한 번꼴로 같은 청구서 번호를 접수일만 바꿔 한 번 더 넣고, DEM/DET 는 견적보다 크게 청구하는 줄을 열 건에 한 번 넣고, 견적 요금표에 없는 요금 코드(THC·CFS)를 청구한 줄을 스무 건에 한 번 넣고, 요금 코드를 'T.H.C'·'O / F' 처럼 점이나 띄어쓰기를 바꿔 적은 줄을 열 건에 한 번 넣습니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"bill_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"vendor_code":{"type":"string"},"amount":{"type":"number","minimum":0},"received_at":{"type":"string","format":"date"}},"required":["bill_no","hbl_no","charge_code","vendor_code","amount","received_at"]}{"type":"object","properties":{"bill_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string"},"vendor_code":{"type":"string"},"amount":{"type":"number","minimum":0},"received_at":{"type":"string","format":"date"}},"required":["bill_no","hbl_no","charge_code","vendor_code","amount","received_at"]}| Python | 요금 코드 비교용 변환, 정정 인보이스 순액 계산, 청구서 번호 기준 중복 제거와 다섯 판정 규칙을 맡습니다. |
| TypeScript | 판정별 목록과 B/L 상세를 그리는 관리자 페이지를 만듭니다. |
| PostgreSQL | 달마다의 판정 결과와 담당자가 뒤집은 정정 기록을 쌓아 석 달 치 협력사별 집계를 냅니다. |
| Claude | 걸린 요금의 판정 근거를 화주 재청구 요청문과 협력사 반려 사유문 초안으로 씁니다. |
| LangChain | 초안 작성 호출 뒤에 금액 검사 단계를 두어, 판정에 없는 금액이 초안에 들어가면 버리고 기본 문안으로 돌립니다. |
| MCP | 3주차에 TOMS 의 견적·인보이스 조회를 사내 MCP 서버로 열어, 파일을 내려받지 않고 그달 B/L을 읽습니다. |
| AWS | 2주차부터 관리자 페이지와 월 마감 판정 작업을 AWS 에 배포해 운영합니다. |
| Claude Code | 판정 규칙마다 회귀 사례를 만들고 규칙을 고칠 때 전 사례를 다시 돌리는 작업에 씁니다. |
✗ fail → 견적에 없는 매입이 판정의 절반을 넘으면 규칙이 아니라 요금 코드 체계가 문제입니다. 협력사 청구서의 요금 이름을 견적 코드에 잇는 대응표부터 만들고 다시 돌립니다.
✓ pass → 2주차 평가 러너와 협력사별 집계로 넘어갑니다.
✗ fail → 한 달에만 몰렸으면 그달의 운항 사정으로 두고, 초안 작성보다 판정 정확도를 먼저 손봅니다.
✓ pass → 3주차 재청구·반려 초안과 정정 기록으로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · hbl_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
견적대로 정산됨정산 완료매출 청구 누락청구 누락청구액이 견적과 다름청구액 차이견적에 없는 매입견적 외 매입매입이 견적보다 큼매입 초과B/L 번호와 요금 코드 한 쌍마다 견적과 매출·매입을 견준 판정을 적습니다. 판정과 함께 견적 매출과 매출 순액, 그 차액, 견적 매입과 매입 합계, 그 초과액을 한 줄에 실어 관리자 페이지의 판정별 목록과 B/L 상세가 그대로 읽습니다.
{"type":"object","properties":{"verdict_no":{"type":"string"},"hbl_no":{"type":"string"},"charge_code":{"type":"string","description":"견적 요금표에 적힌 요금 코드입니다. 견적에 없는 매입이면 ap_bills 에 적힌 요금 코드를 그대로 씁니다"},"quote_line_no":{"type":["string","null"]},"verdict":{"type":"string","enum":["견적대로 정산됨","매출 청구 누락","청구액이 견적과 다름","견적에 없는 매입","매입이 견적보다 큼"]},"quoted_sell":{"type":["number","null"]},"billed_net":{"type":["number","null"],"description":"같은 hbl_no 와 비교용 요금 코드의 ar_invoices.amount 를 음수 정정분까지 모두 더한 순액입니다. 비교용 요금 코드는 charge_code 에서 점·빗금·띄어쓰기를 지우고 대문자로 바꾼 값입니다. 인보이스가 없으면 null 입니다"},"sell_gap":{"type":["number","null"],"description":"billed_net 에서 quoted_sell 을 뺀 값입니다. 어느 한쪽이 null 이면 null 입니다"},"quoted_buy":{"type":["number","null"]},"bills_total":{"type":["number","null"],"description":"같은 hbl_no 와 비교용 요금 코드의 ap_bills.amount 를 bill_no 가 같은 줄은 한 번만 세어 더한 합계입니다. 청구서가 없으면 null 입니다"},"buy_over":{"type":["number","null"],"description":"bills_total 에서 quoted_buy 를 뺀 값입니다. 어느 한쪽이 null 이면 null 입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["quotes","ar_invoices","ap_bills"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["table","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["verdict_no","hbl_no","charge_code","verdict","evidence","summary"]}[
{
"verdict_no": "BV-001",
"hbl_no": "PLHB2609-0412",
"charge_code": "THC",
"quote_line_no": null,
"verdict": "견적에 없는 매입",
"quoted_sell": null,
"billed_net": null,
"sell_gap": null,
"quoted_buy": null,
"bills_total": 185000,
"buy_over": null,
"evidence": [
{
"table": "ap_bills",
"field": "bill_no",
"agg": null,
"value": "PNIT-3301"
},
{
"table": "ap_bills",
"field": "amount",
"agg": null,
"value": 185000
},
{
"table": "quotes",
"field": "charge_code",
"agg": "count",
"value": 2
}
],
"summary": "터미널이 THC 185,000원을 청구했는데 이 B/L의 견적 두 줄에는 THC 가 없습니다.",
"hedge": "견적에서 THC 를 화주 직접 부담으로 뺐는지 운영팀 담당자가 견적 조건을 보고 정합니다."
},
{
"verdict_no": "BV-002",
"hbl_no": "PLHB2609-0455",
"charge_code": "O/F",
"quote_line_no": "QL-0455-1",
"verdict": "청구액이 견적과 다름",
"quoted_sell": 1620,
"billed_net": 1450,
"sell_gap": -170,
"quoted_buy": 1300,
"bills_total": 1300,
"buy_over": 0,
"evidence": [
{
"table": "ar_invoices",
"field": "invoice_no",
"agg": null,
"value": "AR-2609-0140"
},
{
"table": "ar_invoices",
"field": "amount",
"agg": null,
"value": 1450
},
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 1620
},
{
"table": "ap_bills",
"field": "amount",
"agg": null,
"value": 1300
},
{
"table": "quotes",
"field": "buy_amount",
"agg": null,
"value": 1300
}
],
"summary": "해상운임을 견적 1,620달러보다 170달러 적은 1,450달러로 청구했습니다.",
"hedge": null
},
{
"verdict_no": "BV-003",
"hbl_no": "PLHB2609-0471",
"charge_code": "DOC FEE",
"quote_line_no": "QL-0471-2",
"verdict": "매출 청구 누락",
"quoted_sell": 50000,
"billed_net": null,
"sell_gap": null,
"quoted_buy": null,
"bills_total": null,
"buy_over": null,
"evidence": [
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 50000
},
{
"table": "quotes",
"field": "buy_amount",
"agg": null,
"value": null
},
{
"table": "ar_invoices",
"field": "invoice_no",
"agg": "count",
"value": 1
}
],
"summary": "견적에 서류 발급비 50,000원이 있는데 이 B/L의 인보이스는 해상운임 한 장뿐입니다.",
"hedge": null
},
{
"verdict_no": "BV-004",
"hbl_no": "PLHB2609-0503",
"charge_code": "DEM/DET",
"quote_line_no": "QL-0503-2",
"verdict": "매입이 견적보다 큼",
"quoted_sell": 1100,
"billed_net": 1100,
"sell_gap": 0,
"quoted_buy": 900,
"bills_total": 2300,
"buy_over": 1400,
"evidence": [
{
"table": "ap_bills",
"field": "bill_no",
"agg": null,
"value": "ONE-44188"
},
{
"table": "ap_bills",
"field": "amount",
"agg": null,
"value": 2300
},
{
"table": "quotes",
"field": "buy_amount",
"agg": null,
"value": 900
},
{
"table": "ar_invoices",
"field": "amount",
"agg": null,
"value": 1100
},
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 1100
}
],
"summary": "선사가 체선료를 견적 900달러보다 1,400달러 많은 2,300달러로 청구했고, 화주에게는 견적대로 1,100달러만 청구했습니다.",
"hedge": "컨테이너 반납이 늦어 체선료가 정당하게 늘었을 수 있어, 화주에게 차액을 다시 청구할지는 운영팀 담당자가 반출 기록을 보고 정합니다."
},
{
"verdict_no": "BV-005",
"hbl_no": "PLHB2609-0518",
"charge_code": "O/F",
"quote_line_no": "QL-0518-1",
"verdict": "견적대로 정산됨",
"quoted_sell": 1450,
"billed_net": 1450,
"sell_gap": 0,
"quoted_buy": 1180,
"bills_total": 1180,
"buy_over": 0,
"evidence": [
{
"table": "ar_invoices",
"field": "amount",
"agg": "sum",
"value": 1450
},
{
"table": "ar_invoices",
"field": "amount",
"agg": null,
"value": -50
},
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 1450
},
{
"table": "ap_bills",
"field": "amount",
"agg": null,
"value": 1180
},
{
"table": "quotes",
"field": "buy_amount",
"agg": null,
"value": 1180
}
],
"summary": "1,500달러 인보이스를 50달러 정정 인보이스로 되돌려 순액이 견적 1,450달러와 같습니다.",
"hedge": null
},
{
"verdict_no": "BV-006",
"hbl_no": "PLHB2609-0518",
"charge_code": "THC",
"quote_line_no": "QL-0518-2",
"verdict": "견적대로 정산됨",
"quoted_sell": 0,
"billed_net": null,
"sell_gap": null,
"quoted_buy": 150000,
"bills_total": 150000,
"buy_over": 0,
"evidence": [
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 0
},
{
"table": "ap_bills",
"field": "charge_code",
"agg": null,
"value": "T.H.C"
},
{
"table": "ap_bills",
"field": "bill_no",
"agg": "count",
"value": 2
},
{
"table": "ap_bills",
"field": "amount",
"agg": null,
"value": 150000
},
{
"table": "quotes",
"field": "buy_amount",
"agg": null,
"value": 150000
}
],
"summary": "THC 는 화주에게 면제한 요금이라 인보이스가 없어도 되고, 같은 청구서 BPT-0917 이 두 번 접수됐지만 한 번만 세면 견적 매입 150,000원과 같습니다.",
"hedge": null
},
{
"verdict_no": "BV-007",
"hbl_no": "PLHB2609-0526",
"charge_code": "DOC FEE",
"quote_line_no": "QL-0526-2",
"verdict": "견적대로 정산됨",
"quoted_sell": 50000,
"billed_net": 50000,
"sell_gap": 0,
"quoted_buy": null,
"bills_total": null,
"buy_over": null,
"evidence": [
{
"table": "ar_invoices",
"field": "charge_code",
"agg": null,
"value": "DOC.FEE"
},
{
"table": "ar_invoices",
"field": "amount",
"agg": null,
"value": 50000
},
{
"table": "quotes",
"field": "sell_amount",
"agg": null,
"value": 50000
}
],
"summary": "인보이스에는 DOC.FEE 로 적혀 있지만 견적의 DOC FEE 와 같은 요금이고 금액도 50,000원으로 같습니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 2. verdict_no·hbl_no·charge_code·verdict·evidence·summary 가 모두 채워졌는지 확인합니다. 3. billed_net 이 같은 hbl_no·비교용 요금 코드의 ar_invoices.amount 합계와 같은지 다시 계산합니다. 비교용 요금 코드는 점·빗금·띄어쓰기를 지우고 대문자로 바꾼 값입니다. AR-2609-0231 의 DOC.FEE 는 DOCFEE 가 되어 견적의 DOC FEE 와 같은 요금입니다. 4. bills_total 이 같은 키의 ap_bills.amount 를 bill_no 가 같은 줄은 한 번만 세어 더한 값과 같은지 다시 계산합니다. BPT-0917 은 두 번 접수됐으므로 150000 입니다. 5. sell_gap 이 billed_net 에서 quoted_sell 을 뺀 값과 같은지, buy_over 가 bills_total 에서 quoted_buy 를 뺀 값과 같은지 다시 계산합니다. 어느 한쪽이 null 이면 그 차이도 null 인지 봅니다. 6. quoted_sell·quoted_buy·bills_total 이 0 이상인지 범위를 봅니다. billed_net 은 정정 인보이스 때문에 줄 단위로는 음수가 섞일 수 있지만 합계는 0 이상인지 봅니다. 7. quote_line_no 가 null 이면 verdict 는 견적에 없는 매입입니다. 8. quoted_sell 이 0 보다 크고 billed_net 이 null 이면 verdict 는 매출 청구 누락입니다. quoted_sell 이 0 이면 청구를 면제한 요금이라 인보이스가 없어도 이 판정에 걸리지 않습니다. QL-0518-2 가 그런 줄입니다. 9. sell_gap 이 0 이 아니면 verdict 는 청구액이 견적과 다름입니다. 10. buy_over 가 0 보다 크면 verdict 는 매입이 견적보다 큼입니다. 11. 판정 우선순위는 견적에 없는 매입, 매출 청구 누락, 청구액이 견적과 다름, 매입이 견적보다 큼 순이고, 넷에 모두 걸리지 않으면 verdict 는 견적대로 정산됨입니다. 12. quoted_buy 가 null 인 견적 줄은 포트로직스가 직접 받는 요금이라 매입 비교를 하지 않고 buy_over 도 null 입니다. QL-0471-2 와 QL-0526-2 가 그런 줄입니다. 13. evidence 의 field 가 세 데이터셋에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 줄의 값과 같은지 확인합니다. 15. summary 와 hedge 가 존댓말로 끝나는지 확인합니다. 16. 매출 인보이스의 currency 가 같은 hbl_no·비교용 요금 코드의 quotes.currency 와 다르면 그 요금 줄은 판정에서 빼고, 어느 인보이스인지 이슈 목록에 띄웁니다. 통화를 환산하지 않은 채 금액을 더하면 청구액이 견적과 다름이 거짓으로 서기 때문입니다. 17. 같은 bill_no 가 금액을 달리해 다시 접수되면 received_at 이 늦은 줄의 금액 하나만 bills_total 에 넣습니다. 금액이 같으면 규칙 4 대로 한 번만 셉니다. 18. 판정 대상 줄은 견적 줄과, 견적에 없는 매입 청구서 키입니다. 견적에도 매입 청구서에도 없는 요금 코드로 발행된 매출 인보이스는 판정 줄을 만들지 않고 이슈 목록에 띄웁니다. 견적에 없는 매입과 같은 키로 매출 인보이스가 있으면 그 순액을 billed_net 에 싣고, 화주에게 이미 다시 청구했다고 hedge 에 적습니다. [평가 러너 · 2주차] 1. 요금 줄 120건에 손으로 정답 판정을 달아 판정별 일치 건수를 셉니다. 2. 석 달 치 판정을 협력사 코드·요금 코드별로 세어 두 달 이상 되풀이되는 매입 초과를 추립니다. [수동 검증 · 사람이 봅니다] 1. 견적에 없는 매입을 화주에게 다시 청구할지 운영팀 담당자가 견적 조건을 보고 정합니다. 2. 매입 초과 청구서를 협력사에 돌려보낼지 재무팀 담당자가 정합니다.