SOFTMOA TECHNOLOGY

거래처 일일 파일 수신 누락 알림 시스템 구축 방법

소프트모아가 정리한 기술 기록입니다.

Contents
작성일 2026. 10. 24.

매일 받기로 한 거래처 파일이 오지 않았는데도 수신함에 오류가 없다는 이유로 정상 처리하면 보고서가 어제 자료로 남을 수 있습니다. 수신된 파일만 검사하지 말고, 오늘 받아야 할 목록을 먼저 만든 뒤 실제 수신 이력과 대조해야 합니다. 아래는 거래처별 하루 1개 자료를 받는 가상 시스템의 설계 예시이며, 실제 고객 구축 사례나 실적은 아닙니다.

수신 시각보다 자료의 업무일자를 먼저 맞춥니다

관리자는 거래처 코드, 자료 종류, 제출 대상일, 마감 시각, 담당자를 등록합니다. 예시에서는 토요일인 2026년 10월 24일도 제출일로 정하고, A~D는 한국시간 09:00, E는 10:00까지 받는다고 가정합니다. 주말 제외가 필요하면 운영 달력으로 해당 일자의 예정 건을 빼야 하며, 코드가 모든 회사의 영업일을 판단해 주지는 않습니다.

오늘 도착한 파일이라도 내용이 전날 자료라면 오늘 제출을 충족하지 않습니다. 파일명이나 수정 시각만 믿지 말고, 합의된 헤더·본문의 업무일자를 읽어 예정 건과 연결합니다. 날짜가 없거나 서로 다르면 담당자 확인으로 보내고 임의로 오늘 날짜를 채우지 않습니다. 일일 제출이 필요 없었던 날은 누락이 아니라 예정 제외 사유를 남깁니다.

담당자가 보는 목록과 승인 순서

  • 수신기는 전송이 끝난 원본에 접수번호를 부여하고 거래처, 업무일자, 바이트 수, 수신 시각을 기록합니다. 전송 중인 임시 파일은 완료본으로 세지 않습니다.
  • 검수 단계는 빈 파일, 읽기 실패, 필수 열과 업무일자 불일치를 나눠 표시합니다. 0바이트와 데이터 0행은 다릅니다. 헤더가 있고 ‘거래 없음’이 허용된 자료는 별도 검수 기준으로 통과시킬 수 있습니다.
  • 담당자 화면에는 예정 건마다 마감 전 미도착(WAIT), 마감 후 미도착(MISSING), 도착했으나 검수 미통과(REVIEW), 검수 통과본 있음(VALIDATED)을 표시합니다. REVIEW에는 검수 대기도 포함하므로 오류 원인을 상세 화면에서 구분합니다.
  • 재전송은 같은 예정 건 아래 새 접수번호로 보관합니다. 후속 반영 담당자가 통과본을 승인하면 그 접수번호를 반영 작업에 연결하고, 실제 저장 결과는 별도 상태로 조회하게 합니다.

수신 담당자는 재전송을 요청할 수 있지만 통과 판정을 직접 고치거나 운영 데이터를 덮어쓰지 못하게 설계합니다. 관리자는 예정 변경 권한을 갖되, 이미 지난 마감을 바꿔 누락 기록을 지우지 않도록 변경 전후 값과 사유를 남깁니다.

5개 예정 건을 대조하는 실행 예제

다음 코드를 receipt_check.py로 저장해 python3 receipt_check.py로 실행합니다. Python 3.14.8에서 확인했으며 외부 접속이나 파일 변경은 하지 않습니다. receipts는 09:10까지 수집된 이력의 합성 스냅샷으로, 각 행은 거래처·업무일자·바이트 수·검수 결과입니다. PASS는 앞선 검수기가 내렸다고 가정한 입력이지 이 코드의 파일 검사 결과가 아닙니다.

시간은 +09:00 오프셋을 붙여 해석합니다. datetime.fromisoformat()의 오프셋 처리와 시간 비교는 공식 문서에서 확인할 수 있습니다.[1] 이 예제는 날짜와 코드 형식이 이미 검증됐다는 전제입니다.

from datetime import datetime

day = "2026-10-24"
now = datetime.fromisoformat(day + "T09:10:00+09:00")
plans = {"A": "09:00", "B": "09:00", "C": "09:00",
         "D": "09:00", "E": "10:00"}
receipts = [
    ("A", "2026-10-23", 120, "PASS"),
    ("B", day, 0, "FAIL"),
    ("C", day, 200, "FAIL"),
    ("D", day, 150, "FAIL"),
    ("D", day, 180, "PASS"),
]

def classify(name, cutoff, at, records):
    files = [r for r in records if r[0] == name and r[1] == day]
    due = datetime.fromisoformat(day + "T" + cutoff + ":00+09:00")
    if any(r[2] > 0 and r[3] == "PASS" for r in files):
        return "VALIDATED"
    if files:
        return "REVIEW"
    return "MISSING" if at >= due else "WAIT"

for name, cutoff in plans.items():
    print(name, classify(name, cutoff, now, receipts))

실행 결과는 다음과 같습니다.

A MISSING
B REVIEW
C REVIEW
D VALIDATED
E WAIT

A는 전날 통과본만 있어 오늘 자료가 누락됐습니다. B는 0바이트, C는 200바이트지만 검수 실패이므로 둘 다 REVIEW입니다. D는 실패본 뒤에 통과본이 있어 제출 조건을 충족했고, E는 아직 마감 전입니다. 접수 이력 5줄이 곧 오늘 완료 5건이라는 뜻은 아닙니다.

B의 크기만 100바이트로 고쳐도 FAIL이면 REVIEW가 남습니다. 오늘 PASS인 새 접수 행을 추가해야 VALIDATED가 됩니다. E는 정확히 10:00부터 MISSING으로 바뀝니다. 이처럼 도착 여부, 검수 결과, 마감 경계를 따로 시험해야 알림 기준을 확인할 수 있습니다.

통과 알림이 운영 반영 완료를 뜻하지는 않습니다

이 판정은 같은 업무일자에 통과본이 하나라도 있는지 확인합니다. D에 새 실패본이 추가돼도 기존 통과본은 남습니다. 다만 뒤늦은 정정본을 어떤 버전으로 채택할지는 별도 승인 대상이며, 화면에는 추가 접수의 검수 오류도 표시해야 합니다. 가장 늦게 온 파일을 무조건 정답으로 바꾸지 않습니다.

누락 알림은 거래처·자료 종류·업무일자·오류 유형을 묶어 관리하고, 같은 미해결 건을 점검할 때마다 새 알림으로 쌓지 않게 설계합니다. 담당자가 ‘확인’ 버튼을 눌러도 자료가 통과한 것은 아닙니다. 재전송 후 검수 통과 여부와 해결 시각을 따로 기록합니다. 점검기 자체가 멈추면 누락 알림도 없을 수 있으므로 마지막 점검 성공 시각도 보여줘야 합니다.

예제는 수신 목록 대조만 검증합니다. 실제 전송 완료 감지, 파일 파싱, 휴일 달력, 알림 중복 방지, 권한 검사와 운영 반영은 포함하지 않습니다. 구축 시험에서는 전날 자료의 지연 도착, 마감 정각, 빈 파일 재전송, 통과 후 정정본, 점검기 중단을 각각 확인하는 것이 좋습니다.

구현 시 확인할 문서

[1] Python datetime: 오프셋을 포함한 날짜·시간 해석과 비교

소프트모아의 개발 서비스는 softmoa.com에서 확인할 수 있습니다.

소프트모아는 해당 시스템을 구축합니다. 문의하기

Share this

Information

Have a questions?

견적 및 기술문의

mobile : 010-7931-4813

Contact Form