한 고객의 주문이 여러 공급처로 나뉘면 같은 내용을 여러 요청서에 반복해서 쓰게 된다. 배송지가 바뀌거나 일부만 도착했을 때는 어떤 문서를 고쳐야 할지도 헷갈린다. 이 작업에서는 공급처가 현장으로 직접 배송하고 한 현장에 여러 매입처가 참여한다는 조건이 확인됐다. 나는 고객과 공급처를 고정된 한 쌍으로 연결하는 대신, 현장의 주문 품목에 배정 수량과 이행 기록을 붙이는 구조를 중심으로 이야기를 정리했다.

현장, 주문, 품목, 배정은 서로 다르다

현장은 물건이 필요한 업무의 맥락이다. 그 안에 고객 주문이 있고 주문 안에 품목과 수량이 있다. 품목의 일부 또는 전부를 공급처에 배정할 수 있다. 예를 들어 설명용 주문 열 개를 공급처 두 곳에 여섯 개와 네 개로 나누면 배정 두 개가 생기지만 고객 주문은 여전히 열 개다. 이 관계를 분리해야 문서가 늘어도 주문 총량이 중복되지 않는다.

배정에는 공급처와 수량뿐 아니라 매입 단가, 배송 요청일과 목적지도 이어질 수 있다. 다만 고객에게 보여 줄 판매 단가와 공급처의 매입 단가는 다른 값이다. 같은 품목이니까 가격도 하나로 저장하면 안 된다. 어느 문서에 어느 가격을 표시할지까지 정해야 고객용 문서에서 내부 원가가 노출되는 실수를 줄일 수 있다. 이 구분은 화면 배치보다 데이터 관계에서 먼저 지켜야 한다.

요청 문서를 묶는 기준도 업무에서 나온다

공급처가 같다고 모든 품목을 한 문서로 묶을 수는 없다. 현장과 발행 사업자, 배송 요청 조건이 다르면 문서를 나눠야 한다. 보관된 작업 문서는 같은 업무 범위에서 공급처와 배송 요청일이 맞는 항목을 묶고, 조건이 달라지면 나누는 기준을 설명한다. 문서 그룹은 보기 좋은 탭의 수가 아니라 실제로 한 번에 요청할 수 있는 단위를 따라야 한다.

고객 문서를 고쳐 다시 저장할 때마다 발주 초안을 새로 만들면 중복 요청이 생긴다. 반대로 이미 확정하고 전달한 발주를 새 입력으로 덮어쓰면 실제로 무엇을 보냈는지 잃는다. 작성 중인 초안을 갱신할 수 있는 조건과, 후속 이력이 생겨 자동 갱신을 멈춰야 하는 조건을 나눠야 한다. 같은 버튼을 두 번 눌렀을 때도 새 요청이 두 개 생기는지 확인할 필요가 있다.

출고와 수령은 별도 사건으로 기록한다

발주 수량을 배송 완료 수량으로 바로 복사하면 부분 배송을 설명할 수 없다. 보냈다는 확인과 현장에서 받았다는 확인도 다르다. 배정 항목에 출고·수령·반품 기록을 연결하면 실제 이행 수량을 계산할 수 있다. 이때 서로 다른 기록을 한 총량으로 더하기보다 요청 수량과 각 단계의 누계를 나란히 보여 주는 편이 업무를 이해하기 쉽다.

남은 수량에도 종류가 있다. 주문했지만 공급처에 배정하지 않은 수량, 발주했지만 아직 출고하지 않은 수량, 출고했지만 도착을 확인하지 않은 수량은 다음 행동이 다르다. 직원에게 남은 것이라고만 보여 주면 무엇을 해야 할지 판단하기 어렵다. 어느 단계가 비었는지와 그 기록으로 이동할 수 있는 동작을 함께 제공해야 현황이 실제 업무 화면으로 이어진다.

연결은 많이 만드는 것보다 정확하게 만든다

과거 자료에 같은 업체와 품목, 비슷한 날짜가 있다고 자동으로 같은 현장에 붙이지 않는다. 공급처를 하나로 고정하지 않았듯 과거 기록의 관계도 추정으로 고정해서는 안 된다. 근거가 없는 연결은 미지정으로 남겨야 한다. 한 번 입력한 정보를 재사용하는 편리함은 이미 확인한 관계 안에서 작동해야 한다. 그래야 잘못된 연결이 여러 문서로 빠르게 퍼지는 일을 막을 수 있다.

이 구조를 검토할 때는 복수 공급처, 한 품목의 분할 배정, 부분 수령, 반품 뒤의 남은 수량, 전달 후 변경을 합성 사례로 만든다. 각 단계에서 고객 수량이 부풀지 않는지와 이미 보낸 문서가 유지되는지 확인한다. 이번 글은 당시 설계·선택한 코드·검사 기록을 대조한 설명이다. 실제 현장의 현재 배송을 재확인한 결과는 아니다. 현장을 중심에 놓는 이유는 화면을 하나로 모으기 위해서가 아니라 서로 다른 문서가 같은 일을 가리키게 하기 위해서다.