o2o-negosium-original/SHARED_ENUMS.md
민헌 82f091c419 docs: 공유 ENUM 코드값 계약 문서 추가 (SHARED_ENUMS.md)
backend·negodata·agent 가 공유하는 negosium_db 의 SMALLINT 코드값 단일 출처(SSOT).
backend/common/enums.py 를 기준으로 정리하고, negodata 와의 불일치(SessionStatus 등) 정렬 계획 명시.

- SessionStatus(1~5)·QuotationStatus·QtType·ChatSender/card_type·AccountStatus 등 정식 코드표
- DeliveryType/CardStatus(negodata 정의 채택), TBD 코드, 변경 절차
- 불일치: SessionStatus(🔴 정렬 필수)·ON_HOLD(🟡 합의)·ChatSender 명칭(🟢) / agent 는 learning.* 격리로 충돌 없음

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 14:54:18 +09:00

5.8 KiB

공유 ENUM(코드값) 계약

하나의 negosium_db 를 여러 서비스(backend·negodata·agent·바이어측)가 공유한다. 공유 테이블의 SMALLINT 코드값은 모든 서비스가 동일하게 매핑해야 한다(스키마 주석: "세션/견적을 생성·갱신하는 쪽과 코드값이 일치해야 한다"). 코드값에 DB CHECK 가 없으므로(애플리케이션 enum 매핑), 이 문서가 단일 출처(SSOT) 다.

기준(canonical): backend/common/enums.py + postgres-init/01-schema.sql. 코드를 추가·변경하려면: 이 문서 갱신 → 관련 서비스 enum 동기화 → 타 서비스 담당자 공지(아래 "변경 절차").

컨벤션

  • 코드값은 1 부터의 정수(SMALLINT). 의미 매핑은 각 서비스 common/enums.py.
  • 시각은 TIMESTAMPTZ(UTC), 금액 BIGINT, 비율 NUMERIC.
  • 라벨(한글) 표시는 프론트 책임. 와이어/DB 에는 코드(정수)만.

1. 계정 / 회사 / 권한

Enum 컬럼 코드 의미
AccountStatus company.users.status, supplier.supplier_users.status 1 / 2 active / inactive
CompanyStatus company.companies.status 1 / 2 active / inactive
UserRole company.users.role, supplier.supplier_users.role 1 / 2 user / manager
TokenType *.user_tokens.type 1 / 2 access / refresh

negodata 일치(이름만 AccountStatus↔UserStatus). agent 미사용.

2. 견적 / 협상 유형

Enum 컬럼 코드 의미
QtType quotation.quotations.type, negotiation.sessions.qt_type 1 / 2 재협상(renego, 1:1) / 재견적(requote, 1:N)

negodata 일치(QuotationType). agent 는 HTTP 로 문자열 "재협상"/"재견적" 사용(DB 미기록) → 충돌 없음.

3. 견적 상태 — QuotationStatus

quotation.quotations.status

코드 의미
1 견적생성 (CREATED)
2 견적진행중 (IN_PROGRESS)
3 견적마감 (CLOSED)

⚠️ 미합의 항목: negodata 는 4 = 협상보류(ON_HOLD) 를 추가로 정의함. 채택 여부 합의 필요(아래 §8).

4. 협상 세션 상태 — SessionStatus ★기준

negotiation.sessions.status

코드 의미
1 협상생성 (CREATED)
2 협상중 (IN_PROGRESS)
3 협상완료 (DONE)
4 미참여 (NOT_PARTICIPATED)
5 협상거부 (REJECTED)

전이: CREATED→(participate)→IN_PROGRESS→(chat 종료)→DONE | REJECTED, 마감 초과 시 CREATED→NOT_PARTICIPATED.

🔴 불일치(반드시 정렬): negodata 는 1=협상중, 2=협상종료, 3=협상거부 로 숫자→의미가 완전히 다름. 같은 컬럼이라 한쪽 기준으로 통일하지 않으면 데이터 오염. 이 5-state 정의를 기준으로 통일한다(participate/미참여/거부/chat 종료 흐름 + 스키마 주석에 부합). 상세 §8.

5. 채팅 — ChatSender / card_type

negotiation.chats.sender

코드 의미
1 BOT — 갑(바이어/구매대행 봇/agent)
2 USER — 을(공급사/협력사)

negotiation.chats.card_type

코드 의미
1 nego_card
2 wild_card

negodata 는 코드 동일, 이름만 2 = PARTNER(=공급사). 데이터 호환(같은 코드·같은 주체). 명칭은 USER 로 통일 권장. negotiation.chats 쓰기 주체는 backend 단독. agent 는 learning.* 만 사용하며 chats 미기록.

6. 상품 / 배송 / 카드

Enum 컬럼 코드 의미 비고
DeliveryType partner.items.delivery_type, negotiation.sessions.reject_delivery_type 1 / 2 / 3 협력사배송 / 지정택배배송 / 픽업배송 negodata 정의 채택(우리도 동일 매핑 사용)
CardStatus card.nego_cards·card.wild_cards (사용여부) 1 / 2 active / inactive negodata 정의

7. 미확정(TBD) 코드

아래는 아직 매핑이 확정되지 않음 — 사용 전 이 문서에 먼저 코드 픽스.

컬럼 메모
partner.items.quantity_unit EA/BOX/SET 등 단위 코드
partner.items.category_type 자동 증가 정수(코드 아님)
partner.item_internet_lowest_prices.website / ai_model 크롤링 대상·AI 모델 코드
company.companies.industry 업종 코드

8. 현재 불일치 & 정렬 계획 (negodata)

항목 우리(기준) negodata 위험 조치
SessionStatus 1~5 (생성/중/완료/미참여/거부) 1~3 (중/종료/거부) 🔴 같은 컬럼 의미 충돌 → 오염 negodata 가 우리 5-state 로 정렬. 세션 생성/갱신 와이어업 전 필수
QuotationStatus ON_HOLD 없음 4=협상보류 추가 🟡 우리 chat 이 4 미처리(마감으로 안 봄) 채택 여부 합의 → 채택 시 우리 enum/마감 분기에 반영
ChatSender 명칭 USER(2) PARTNER(2) 🟢 코드 동일, 명칭만 USER 로 통일
DeliveryType (미정의) 1/2/3 🟢 negodata 정의를 우리도 채택(본 문서 §6)

현재 상태: negodata 는 위 enum 을 정의만 했고 sessions/chats 에 실제 기록하는 코드는 없음(지뢰 상태). 협상 세션 생성/갱신을 와이어업하기 전에 SessionStatus 를 정렬해야 한다.

agent: learning.* 스키마 격리. 공유 테이블 미기록, backend 와 HTTP(문자열 outcome/step)로만 통신 → 코드 충돌 없음.


변경 절차

  1. 본 문서(SHARED_ENUMS.md)에서 코드값 추가/변경을 먼저 합의·반영.
  2. 각 서비스 common/enums.py 동기화(backend → 기준).
  3. 스키마 주석(postgres-init/01-schema.sql)과 일치 확인.
  4. 타 서비스(negodata/agent/바이어측) 담당자에게 공지 — 특히 이미 적재된 데이터가 있으면 마이그레이션 동반.