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>
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)로만 통신 → 코드 충돌 없음.
변경 절차
- 본 문서(
SHARED_ENUMS.md)에서 코드값 추가/변경을 먼저 합의·반영. - 각 서비스
common/enums.py동기화(backend → 기준). - 스키마 주석(
postgres-init/01-schema.sql)과 일치 확인. - 타 서비스(negodata/agent/바이어측) 담당자에게 공지 — 특히 이미 적재된 데이터가 있으면 마이그레이션 동반.