내부용 기획 문서입니다. 접근 비밀번호를 입력하세요.
무역서류 519건 전수분석 기반 설계안
작성일 2026-09-01
291개 수입 회차를 단계별로 훑은 결과, 데이터 충족률은 다음과 같다.
한편 드라이브에는 근거 서류가 이미 존재한다. 즉 자료가 없는 게 아니라 연결·집계되지 않은 상태다. 시스템의 목표는 이 서류들을 자동으로 읽어 회차와 제품에 붙이는 것이다.
사업자등록번호 850-86-03027로 651회 등장 — 현 무역서류 100%. 패러미트는 발주 2건이 계획 단계로만 존재하고 수입 실적은 없다.
기존 접두어 JG- 24건은 발주(PO)가 아니라 충전금(선급금)이었다 → 별도 거래 유형으로 분리한다.
모든 회차는 아래 5단계로 원가가 쌓인다. 화면은 이 순서 그대로 폭포수(waterfall)로 보여준다. 각 단계는 금액과 비중(%)을 동시에 표기한다.
환차 처리: 발주 시점 추정환율과 송금 시점 실제환율의 차이를 fx_diff로 분리 보관한다. 원가에 포함(제품별 실원가 관점)과 영업외손익 분리(회계 관점) 두 가지 뷰를 토글로 제공한다.
환율이 기록된 분할송금 8건(단일통화)을 검증한 결과:
| PO | 통화 | 선금 환율 | 잔금 환율 | 변동 | 원화 송금액 | 환차 |
|---|---|---|---|---|---|---|
| OFC-202309-01 | USD | 1,324.85 | 1,359.75 | +2.63% | ₩97,897,077 | +₩1,791,795 |
| OFF-202307-2 | USD | 1,270.40 | 1,324.45 | +4.25% | ₩16,023,176 | +₩418,662 |
| OFF-202312-01 | CNY | 183.63 | 187.31 | +2.00% | ₩9,211,073 | +₩128,733 |
| OFC-202309-02 | USD | 1,336.10 | 1,355.03 | +1.42% | ₩10,227,404 | +₩76,518 |
| (외 4건) | — | — | — | −0.34%~+0.44% | — | −₩3,332~+₩9,951 |
| 합계 | — | — | — | — | ₩159,954,238 | +₩2,939,473 (+1.84%) |
즉 선금 시점 환율로 계산한 예상 원가보다 실제로 ₩294만(1.84%)을 더 지불했다. 이 금액이 지금은 어디에도 집계되지 않는다. 단일 회차 최대 사례(OFC-202309-01)만으로도 ₩179만 차이다.
아래는 각 단계가 총원가에서 차지하는 비중을 보여주는 예시이며, 특정 회차의 실제 데이터가 아니다.
핵심은 제품(product)을 먼저 만들고, 서류의 품목명은 별칭(alias)으로 매칭하는 구조다. 서류마다 품목명 표기가 제각각이기 때문이다 — CI 품목 1,020라인 → 유니크 표기 624개 → 실제 제품 추정 150~300개.
서류에서 추출한 값은 그대로 보존하고, 사람이 고친 값은 별도 필드에 저장한다. 재파싱해도 수동 수정이 덮이지 않는다 (is_manual 잠금).
화면의 어떤 금액이든 클릭하면 근거 서류 원본 PDF가 열린다.
편집은 덮어쓰기가 아니라 change_log 누적. 누가 언제 무엇을 바꿨는지 되돌릴 수 있다.
확정 2026-09-01. 신규 발주부터 적용하며, 기존 291회차의 코드는 재발번하지 않고 legacy_code로 그대로 보존한다.
ON-AW-2609-01(주)온오퍼 · 얼루어웨이브 · 2026년 9월 · 1번ON-CV-2609-02(주)온오퍼 · 코지바이브 · 2026년 9월 · 2번PM-PT-2609-01(주)패러미트 · 패러미트 · 2026년 9월 · 1번| 자리 | 값 | 규칙 |
|---|---|---|
| 법인 | ON (주)온오퍼 / PM (주)패러미트 | 2자, 법인 추가 시 확장 |
| 브랜드 | AW 얼루어웨이브 / CV 코지바이브 / MI 미마코 / CA 씨에이 / PT 패러미트 / XX 공통·기타 | 2자 |
| YYMM | 2609 | 발주 연월 |
| 일련 | 01~99 | 법인+연월 단위로 채번 (브랜드가 달라도 연속) |
발주(PO)가 뿌리이고, 나머지는 그 아래 붙는다.
| 문서 | 형식 | 예시 |
|---|---|---|
| 발주 | {법인}-{브랜드}-{YYMM}-{일련} | ON-AW-2609-01 |
| 송금 | 발주코드 + /R + 회차 | ON-AW-2609-01/R1 (계약금), /R2 (잔금) |
| 선적 | 발주코드 + /S + 회차 | ON-AW-2609-01/S1 (분할선적 시 S2…) |
| 통관 | 선적코드 + /C | ON-AW-2609-01/S1/C |
| 충전금 | {법인}-DP-{YYMM}-{일련} | ON-DP-2609-01 (발주와 무관한 선급금) |
기존 291회차는 신규 코드를 재발번하지 않는다. legacy_code를 그대로 쓰고 법인·브랜드만 채운다.
| 기존 접두어 | 건수 | 법인 | 브랜드 | 비고 |
|---|---|---|---|---|
| OFF- | 86 | ON | AW(기본) | 초기 범용 코드, 건별 확인 필요 |
| OFC- | 62 | ON | CV | 코지바이브 |
| OFA- | 31 | ON | AW | — |
| JG- | 24 | ON | — | 발주 아님 → 충전금(prepayment) |
| OFP- | 23 | ON | AW | 포장·부자재 |
| OFCA- | 8 | ON | CA | 차량용품 |
| OFM- | 8 | ON | MI | 미마코 |
| OFB- | 4 | ON | AW | — |
| OCS- | 3 | ON | CV | — |
| OEM- | 3 | ON | XX | OEM 특수건 |
| PMT- | 2 | PM | PT | 패러미트 (계획 단계) |
| 기타 1건씩 | 4 | ON | 개별 | OFFP, OFFX, OFMI, OFS |
| 비표준 | 11 | ON | 개별 | IN230608-057, PO20230807-01, OFC-202309-07A, OFC-202511-08+05 등 |
| (PO미상) | 27 | ON | 개별 | 2023년 코드 도입 전 통관건 |
수입신고필증·정산서의 납세의무자 사업자등록번호로 법인을 자동 판별한다.
| 법인 | 사업자등록번호 | 서류 등장 |
|---|---|---|
| (주)온오퍼 | 850-86-03027 | 651회 (현 무역서류 100%) |
| (주)패러미트 | (설정에서 입력 필요) | 0회 (수입 실적 없음) |
서류에서 사업자번호를 찾으면 그 법인으로 자동 배정하고, 못 찾으면 발주 코드의 법인을 따른다. 둘이 어긋나면 검수 큐로 보낸다.
회차 단위로 발생한 비용(운임·관세·수수료)을 제품 라인으로 내려보내는 규칙. 비용 유형별 기본 배분기준을 두고, 회차마다 덮어쓸 수 있게 한다.
| 비용 유형 | 기본 배분기준 | 근거 |
|---|---|---|
| 물품원가 | 직접 귀속 | 송금은 PO에 직결 |
| 해상운임 · THC | 부피(CBM) → 없으면 중량 → 없으면 금액 | 실제 과금 기준 |
| 항공운임 | 중량(KG) | 실제 과금 기준 |
| 관세 | 품목별 HS세율 개별계산 → 없으면 과세가격 비례 | 세율이 품목마다 다름 |
| 통관수수료 · 서류비 | 금액 비례 | 관행 |
| 창고료 · 내륙운송 | 부피 → 금액 | 실제 과금 기준 |
| 기타 | 금액 비례 (수동 지정 가능) | — |
무역서류 폴더의 신규/변경 파일 감지(폴링). 이번 분석에서 쓴 크롤링 방식 재사용.
파일명 + 첫 페이지 내용으로 8종 판별: PO / CI / PL / B/L / 정산서 / 면장 / 납부영수증 / 송금전문.
텍스트 PDF는 파서, 이미지 스캔은 Claude 비전 판독. 실측 결과 정산서·면장의 13%(36/270)와 송금전문 대부분이 이미지라 비전 경로가 필수다. 추출 결과에 신뢰도 점수를 함께 저장.
우선순위: ① PO 코드 → ② 수입신고번호 → ③ B/L 번호 → ④ 거래처+금액+날짜 근접도. 이번 분석에서 이 순서로 519건 중 492건(95%)이 자동 연결됐다.
신뢰도가 낮거나 매칭 실패한 건만 사람에게 올린다. 화면 좌측에 원본 PDF, 우측에 추출값 폼. 클릭 몇 번으로 확정하고, 그 확정 결과를 별칭 사전에 학습시켜 다음부터 자동 처리한다.
승인된 건만 원장에 반영. 미승인 건은 "추정" 배지로 구분 표시.
89% 누락된 확정 원가를 채우는 방법은 세 가지이며, 병행을 권한다.
드라이브의 송금전문 128건 비전 판독 → 과거분 소급 (일회성)
우리은행 외화송금 내역을 월 1회 엑셀로 내려받아 업로드 → 자동 대사 (운영 루틴)
신규 송금 시 앱에서 직접 입력(외화액·환율만 넣으면 나머지 자동 계산) → 앞으로의 누락 방지
| 규칙 | 조건 | 조치 |
|---|---|---|
| 환율 검산 | 외화금액 × 적용환율 ≠ 원화금액 (오차 1% 초과) | 셀 경고 표시 |
| 환율 이상치 | 적용환율이 해당일 시장 환율과 3% 이상 괴리 | 확인 요청 |
| 통화 일관성 | 한 PO 안에서 통화가 섞임 | 정보 배지(오류 아님, 실제 존재) |
| 송금 합계 | Σ송금 외화액 ≠ 발주 총액 | 미송금 잔액 자동 표시 |
| 수량 정합 | 발주수량 ≠ 선적수량 합계 | 차이 표시(분할선적 여부 확인) |
| 과세가격 검산 | 면장 과세가격이 CI 금액 × 환율 + 운임과 크게 상이 | 확인 요청 |
| 중복 서류 | 같은 신고번호·B/L의 정산서가 2건 이상 | 중복 후보로 묶어 표시 |
제품은 사람이 먼저 등록한다(SKU·브랜드·제품명·HS코드). 서류가 제품을 만들지 않는다 — 그래야 제품 축이 흔들리지 않는다.
초기 이관 시 이번 분석의 카테고리 20종과 CI 품목 321그룹을 후보로 제공해 등록 시간을 줄인다.
매칭은 3단계를 거쳐 사람이 최종 선택하며, 선택 결과는 즉시 별칭으로 학습된다.
셀 인라인 편집, 키보드 이동(Tab/Enter/화살표), 범위 복사·붙여넣기, 실행취소(Ctrl+Z), 열 정렬·필터·표시선택.
사람이 고친 셀은 색으로 구분되고 자물쇠가 걸린다. 자동 파이프라인이 같은 값을 다시 채워도 덮어쓰지 않고 "차이 있음" 배지만 띄운다.
수량이나 환율을 고치면 총원가·개당원가·비중이 즉시 다시 계산된다(엑셀 수식 대신 엔진이 계산).
같은 값 여러 행에 채우기, 회차 복제(반복 발주가 많은 구조에 맞춤).
어떤 셀이든 우클릭 → 근거 서류 PDF를 옆 패널에 띄움.
기존 시트 사용자를 위해 양방향 지원. 다만 원장은 앱이 진실의 원천(single source of truth)이 된다.
원장 그리드 개념도 — 수동으로 고친 셀은 잠금 표시로 구분된다.
| 회차 | 제품 | 수량 | 적용환율 | 확정 물품원가 | 배분기준 | 개당원가 |
|---|---|---|---|---|---|---|
| OFA-202601-02 | AW-CBL-SPR | 1,200 | 1,381.20 | ₩14,820,300 | 부피(CBM) | ₩12,350 |
| OFA-202601-02 | AW-CBL-STD | 800 | 1,375.40 (추정) | ₩9,120,000 | 부피(CBM) | ₩11,400 |
| OFF-202309-09 | AW-CHG-65W | 2,000 | 1,392.00 | ₩27,840,000 | 중량(KG) | ₩13,920 |
현재 배포본(onoffer-import.pages.dev) 확장: 연도·브랜드·카테고리별 원가, 단계별 비중 추이.
원가 폭포수 차트(5단계 적층 + 각 단계 %), 송금 타임라인(계약금/잔금 각각의 환율), 연결된 서류 목록, 제품별 배분 결과.
제품별 수입 이력, 개당 원가 추이 그래프, 원가 변동 요인 분해(물품가 변동 / 환율 / 운임 / 관세), 최근 확정 원가.
편집 UX가 적용된 전체 표(회차 × 비용항목).
자동 판독 대기·실패 건 처리.
미매칭 품목명 ↔ 제품 마스터 연결.
송금 예정/실행 목록, 잔금 미납 현황, 환율 입력.
기존 사내 앱들과 동일한 패턴(Node/Express + SQLite, LAN 공유)을 권한다.
시스템을 사내 드라이브로 옮길 계획이 있으므로, 무엇을 드라이브에 두고 무엇을 두면 안 되는지를 처음부터 나눈다.
| 대상 | 위치 | 이유 |
|---|---|---|
| 금지SQLite 원장 파일 (ledger.db) | 로컬 전용 (~/import-cost-system/data/) — 드라이브 동기화 폴더 금지 | 드라이브 동기화 클라이언트가 쓰기 중인 DB를 복사하면 파일이 손상된다. WAL 모드는 .db·-wal·-shm 세 파일이 항상 일관돼야 하는데 동기화는 이를 보장하지 못한다. 여러 PC가 같은 DB를 동기화하면 충돌본이 생기고 데이터가 갈린다. |
| 일 1회 스냅샷 (.db 복사 + .sql 덤프) | 드라이브 백업 폴더 | 앱이 DB를 잠그고 안전하게 뜬 사본이므로 안전. 사고 시 복구 지점. |
| 원본 서류 PDF·엑셀 | 드라이브 (지금 그대로) | 이미 드라이브가 원본 보관소. 앱은 drive_file_id로 참조만 한다. |
| 내보내기 산출물 (엑셀·CSV·리포트) | 드라이브 | 공유·열람용. |
| 요약 대시보드 | Cloudflare Pages | 링크 공유용. |
총 소요 기간 약 8.5주 (1 + 2 + 2 + 1.5 + 2주)
이전 초안의 미결정 사항 5가지에 모두 답이 나왔고, 착수 순서가 추가로 확정됐다. 아래 내용은 이미 위 설계 전반에 반영되어 있다.
원가에 포함. 다만 분해 표시(물품원가와 환차를 구분해 보여주는 뷰)는 유지한다.
원가 제외 (환급 대상) — 기존 초안과 동일하게 유지.
참고만 하고 새로 구축한다. 동기화하지 않는다 — 앱이 원장(single source of truth)이 된다.
포함. 법인 2개 체계(ON / PM)로 설계한다.
로컬 + 사내 LAN (포트 4848). 요약만 지금처럼 Cloudflare로 공유.
Phase 0 → 1 먼저 (원장 앱을 자동화보다 앞세운다).