SOFTMOA TECHNOLOGY

협력사 평가 점수와 등급 산정 시스템 구축 방법

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

Contents
작성일 2026. 10. 16.

협력사 평가를 엑셀로 취합할 때는 빈 항목이 0점으로 바뀌거나, 총점이 높다는 이유로 필수요건 미충족이 가려지지 않게 해야 합니다. 항목별 입력 여부를 먼저 확인하고 가중 총점·등급·요건 상태를 나눠 보여주는 방식이 좋습니다. 아래는 실제 고객 사례가 아닌 분기 평가 시스템의 설계 예시입니다. 소프트모아의 맞춤 업무 시스템에서 구현할 수 있는 흐름입니다.

평가를 시작할 때 기준을 고정합니다

구매 담당자는 평가 회차 생성 화면에서 기간을 2026년 7월 1일~9월 30일, 채점표를 v3로 지정하고 대상 협력사를 등록합니다. 업체·회차마다 평가 한 건을 만들고, 품질 담당자와 구매 담당자에게 입력 항목을 배정합니다. 업체명이 같아도 서로 다른 법인을 합치지 않도록 업체 코드를 기준으로 연결합니다.

이 예시의 품질·납기·대응 점수는 각각 0~100점의 정수이며 가중치는 50%·30%·20%입니다. 총점 80점 이상은 A, 60점 이상 80점 미만은 B, 나머지는 C로 정합니다. 업계 공통 기준이 아니라 설명을 위해 정한 내부 규칙입니다. 채점표에는 각 점수를 주는 조건과 근거 자료도 적어야 담당자마다 다른 기준으로 채점하는 일을 줄일 수 있습니다. 점수는 불량률이나 납기 준수율을 그대로 넣는 값이 아니라 채점표에 맞춰 환산한 값입니다.

  • 입력 화면은 미입력을 빈칸으로, 실제 평가 결과인 0점은 숫자 0으로 저장합니다. 미입력 항목을 빼고 가중치를 다시 나누지 않습니다.
  • 별도 요건인 필수서류 확인은 충족 1, 미충족 0, 확인 전 NULL로 둡니다. 어떤 서류를 확인할지는 회차의 기준에 명시합니다.
  • 서버는 점수의 정수 여부와 범위, 요건 값, 담당 권한을 검사합니다. 화면에서만 입력을 제한해서는 안 됩니다.

같은 83점이어도 검토 상태는 다릅니다

다음 SQL은 다섯 가상 업체의 계산을 확인하는 읽기 전용 예제입니다. SQLite의 WITH로 임시 입력을 만들고 CASE와 IS NULL로 상태를 나눕니다.[1][2] quality·delivery·response는 품질·납기·대응 점수, docs_ok는 서류 확인 값입니다. 점수와 요건 값의 형식·범위 검사를 이미 마쳤으며 업체별 행이 하나씩이라는 조건입니다. Python에 연결된 SQLite 3.54.0의 메모리 DB에서 query_only를 켜고 실행했으며 운영 DB에는 접속하지 않았습니다.

WITH input(vendor, quality, delivery, response, docs_ok) AS (
  VALUES
    ('A', 90, 80, 70,   1),
    ('B', 90, 80, NULL, 1),
    ('C', 90, 80, 70,   0),
    ('D', 50, 50, 50,   1),
    ('E',  0,100,100,   1)
), scored AS (
  SELECT *,
    (quality*5 + delivery*3 + response*2)/10.0 AS total
  FROM input
)
SELECT vendor, total,
  CASE
    WHEN total IS NULL THEN '미산정'
    WHEN total >= 80 THEN 'A'
    WHEN total >= 60 THEN 'B'
    ELSE 'C'
  END AS grade,
  CASE
    WHEN docs_ok = 0 THEN '요건미충족'
    WHEN total IS NULL OR docs_ok IS NULL THEN '확인대기'
    ELSE '검토대상'
  END AS review_state
FROM scored
ORDER BY vendor;
vendor | total | grade | review_state
A | 83.0 | A | 검토대상
B | NULL | 미산정 | 확인대기
C | 83.0 | A | 요건미충족
D | 50.0 | C | 검토대상
E | 50.0 | C | 검토대상

A는 품질 90점·납기 80점·대응 70점으로 총점 83.0점과 A등급을 받습니다. C도 같은 점수지만 서류 확인 값이 0이어서 요건미충족입니다. 점수 칸을 지우거나 임의로 감점하는 대신 두 결과를 함께 남겨야 제외 사유를 설명할 수 있습니다. 요건미충족은 점수 입력이 덜 끝났더라도 먼저 표시합니다.

B의 대응 점수는 NULL이므로 총점도 NULL, 등급은 미산정입니다. 이를 0으로 바꾸면 낮은 실적과 아직 받지 못한 평가를 구분할 수 없습니다. 반대로 E의 품질 0점은 유효한 입력이어서 총점 50.0점과 C등급이 나옵니다. D와 총점은 같아도 항목별 점수는 다르므로 목록에서 상세 근거로 들어갈 수 있어야 합니다.

분모 10.0은 정수 나눗셈으로 소수 부분이 사라지지 않게 하기 위한 값입니다.[1] 품질 81점·납기 80점·대응 70점은 78.5점, B등급으로 반환됩니다. 80점과 60점의 경계값도 각각 A와 B로 확인했습니다. 이 규칙에서는 등급을 매기기 전에 정수로 반올림하지 않습니다.

계산 이후의 반려와 확정도 남겨야 합니다

담당자가 근거 파일과 점수를 제출하면 구매 검토자는 요약 화면에서 미입력 항목, 요건 상태, 등급을 확인합니다. 점수는 모두 있어도 서류 확인 전이면 확인대기입니다. 검토대상은 구매 승인이나 거래 가능 판정이 아니라 사람이 결과를 살펴볼 수 있다는 상태입니다. C등급의 후속 조치도 별도 운영 규칙으로 정합니다.

보완이 필요하면 항목과 반려 사유를 지정해 작성자에게 돌려보냅니다. B의 대응 점수를 70점으로 보완하면 총점 83.0점, A등급, 검토대상으로 바뀌지만 C의 요건미충족은 그대로입니다. 제출 때마다 평가 개정번호를 올리고 바뀐 값·작성자·시간·사유를 보존합니다. 확정권자는 자신에게 배정된 회차만 확정하며, 이전 개정번호를 보고 승인하려 하면 서버가 거부하도록 설계합니다.

확정 뒤 채점표를 수정해도 과거 점수가 조용히 바뀌면 안 됩니다. 조회 화면은 당시 채점표 버전과 확정 개정번호의 점수를 보여주고, 정정은 재개방 사유와 재확정 이력으로 남깁니다. 위 SQL은 한 회차의 계산만 확인합니다. 평가 대상인데 입력 행 자체가 없는 업체를 찾는 조회, 근거의 진위 확인, 권한 검사와 동시 수정 방지는 별도로 구현해야 합니다. 발주나 계약 승인은 이 평가 확정과 분리합니다.

SQL 문법 확인: [1] SQLite 표현식: CASE·NULL·산술 연산 · [2] SQLite WITH 절.

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

Share this

Information

Have a questions?

견적 및 기술문의

mobile : 010-7931-4813

Contact Form