직원이 공급처 명세서를 받아 발주와 비교할 때 원하는 것은 긴 표 두 개를 번갈아 보는 일이 아니다. 무엇이 빠졌고 수량이나 단가가 어디에서 달라졌는지 먼저 알면 좋다. 이 프로젝트에서도 차이를 보여 주고 직원이 확인한 금액을 매입으로 이어 달라는 요청이 나왔다. 나는 이 기능의 중심을 자동으로 일치시키는 데 두지 않았다. 원래 요청과 실제 받은 내용을 따로 보존한 채 차이를 판단할 수 있게 만드는 것이 중요했다.

비교 결과는 원본을 고치는 명령이 아니다

발주 당시 수량과 단가는 기대한 내용이고 공급처가 보낸 명세서는 확인할 대상이다. 값이 다르다고 한쪽을 다른 쪽으로 덮으면 비교할 근거를 잃는다. 보관된 대조 코드는 예상 항목과 실제 확인 값을 구분해 차이를 만들고, 읽기용 미리보기와 저장을 나눈다. 화면에서 비교해 본 것만으로 원래 발주나 실제 매입 기록이 바뀌어서는 안 된다.

차이를 없애는 것이 늘 정답도 아니다. 나눠 받은 명세서라면 이번에 들어온 수량이 전체 주문보다 작을 수 있다. 단가 조정이나 별도 확인이 필요한 항목도 있을 수 있다. 부분 명세서인지 최종 명세서인지 범위를 명시하고 차이의 이유를 남기면, 일치하지 않는 결과도 설명 가능한 확인으로 다룰 수 있다. 단순히 초록색 일치 표시를 많이 만드는 것보다 중요한 기준이다.

직원이 확인한 내용이 무엇인지 남긴다

확인 완료를 누른 사실만 기록하면 당시 어떤 값을 봤는지 알기 어렵다. 보관된 구현은 원본과 연결 발주의 기준 상태, 대조 행과 확인 여부를 함께 다룬다. 자동 읽기 결과를 사용한 경우에는 그 행의 출처와 검토 상태도 이어진다. 글자를 읽었다는 결과와 직원이 업무 값으로 확인했다는 판단을 분리해야 나중에 잘못된 숫자를 정정할 수 있다.

확인 뒤 원본 연결이나 발주가 바뀌었다면 예전 확인을 그대로 사용할 수 없다. 이 코드에는 대조의 기준이 현재 상태와 다른지 판단하고 다시 확인하도록 하는 경계가 있다. 나는 이런 처리가 번거로운 재확인만 늘리는 기능이라고 보지 않는다. 확인한 대상이 달라졌는데도 완료 표시가 남는 문제를 막는 장치다. 바뀐 필드와 재확인이 필요한 이유를 보여 주면 사용자는 왜 멈췄는지도 이해할 수 있다.

매입 초안으로 이어도 확정과 지급은 남는다

확인한 대조에서 매입을 준비하는 동작은 최신 확인 상태를 요구한다. 원본이 여러 현장에 걸치면 해당 행을 현장별로 나눌 수 있어야 한다. 이때 만드는 자료는 검토를 위한 내부 초안이다. 공급처 원본이나 기존 발주 가격을 바꿔 맞추지 않는다. 준비된 초안을 다시 확인하고 확정하는 일, 실제 돈을 지급하고 배분하는 일은 별도로 남는다.

같은 준비 요청을 다시 실행했을 때 초안이 또 생기는지도 확인해야 한다. 보관된 구현은 요청 식별자와 요청 내용, 이미 준비한 매입을 확인하는 경로를 갖고 있다. 응답을 못 받았다고 처음부터 새 요청으로 보내면 같은 명세서가 두 번 매입으로 이어질 수 있다. 화면의 성공 메시지뿐 아니라 같은 요청을 다시 읽었을 때 어떤 결과가 돌아오는지도 업무 기능의 계약이다.

대표가 보는 차이는 미처리 업무로 이어져야 한다

대표에게 차이 건수만 크게 보여 주면 이상이 많다는 사실은 알 수 있지만 판단은 어렵다. 어떤 현장과 공급처의 어떤 원본인지, 부분 납품인지, 직원 확인을 기다리는지와 매입 초안이 준비됐는지까지 이어서 볼 수 있으면 도움이 된다. 확인된 차이를 계속 오류처럼 표시하거나 아직 보지 않은 값을 정상으로 표시하지 않는 것도 중요하다. 숫자와 업무 상태를 같은 의미로 읽을 수 있게 해야 한다.

검토할 때는 누락 품목, 부분 수량, 단가 차이, 원본 전체 합계 불일치와 확인 후 발주 변경을 합성 예제로 준비한다. 차이가 있어도 합당한 사유로 확인할 수 있는 경우와 진행을 막아야 하는 경우를 구분해 본다. 이번 글은 선택한 대조 코드와 시점별 검사 기록을 읽어 정리했다. 실제 공급처 원본이나 현재 운영 자료로 재시험하지 않았다. 자동화의 목표는 차이를 숨겨 한 번에 끝내는 것이 아니라 확인한 내용을 다시 입력하지 않고 다음 업무로 정확히 넘기는 데 있다.