- negotiation.chats 에 meta(JSONB) 추가 — 말풍선 표현 데이터(script/step/input_mode 등)
- 견적생성 실패 토스트를 result.code/desc + msg 규약대로 표시(HTTP 200·success=false 포함)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 견적 목록에 대표 상품(세션 item) 조인 노출 → '대상 상품 확인 불가' 해소
(backend protocol/crud/service + orval 재생성 + front mapQuotation 매핑)
- 견적·협상카드 목록 클라이언트 페이지네이션 추가 (useClientPagination)
- 견적중단을 서버 stop_quotation 호출로 영속 처리(상태=견적마감)
- 신규 협상견적 라벨 발의→등록 통일
- 발의 위저드 카드선택에 협상/와일드 구분 뱃지 추가
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
QuotationCardData 에 number/edit_script/condition/memo 추가, card 카탈로그(nego/wild)
라이브 조인으로 채움. DB 컬럼 변경 없음(기존 카드 테이블 조인만 확장).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
POST /v1/item/image — SAS 토큰을 URL에 붙여 httpx PUT 으로 Azure Blob 업로드.
이미지 타입/용량 검증 + IMAGE_* 에러코드. config 에 azure_blob_base_url/sas/root 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- frontend/Dockerfile: 프로덕션 빌드(npm run build) 후 vite preview 정적 서빙, 포트 3300.
API URL(VITE_API_BASE_URL=http://localhost:9300)은 빌드 타임에 .env.prod.local 로 주입.
- docker-compose.yml: negosium-front 서비스 추가(빌드 이미지, live volume 없음) + 헤더에 프론트 URL.
- backend CORS(config.local.toml.example)에 http://localhost:3300 / 127.0.0.1:3300 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
- 세션 목록을 useSessionListQuery 로 서버 조회(필터·정렬·페이지 위임),
mock 제거. 정수 코드↔한국어 라벨 변환 어댑터(list/lib/adapter)
- 협상 참여: useParticipateMutation, 성공 시 채팅 진입·실패 토스트
- 거부: 사유 입력 팝업(RejectPopup) + useRejectMutation, 상태별 차단 안내
- 선택/상태 검증을 토스트로 일원화(ActionSection 은 버튼만 담당)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 로그인 실연동: 성공 시 access/refresh 토큰 저장, me 캐시 무효화
- SidebarFooter: useMeQuery 로 공급사명 표시, useLogoutMutation 로 로그아웃
- RequireAuth 가드로 /list·/chat 보호, 토큰 없으면 로그인으로
- 인증 만료/폐기 시 로그인 페이지로 이동(setUnauthorizedHandler)
- LoginPage: 이미 로그인 상태면 목록으로 리다이렉트
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- sonner 기반 토스트 래퍼(lib/toast): error/info/success/warning,
프로젝트 디자인 토큰으로 스타일 통일. Toaster 를 provider 에 마운트
- 공통 Modal 컴포넌트: 반투명 배경 + 배경 클릭/ESC 닫기
- core/Provider import 케이싱 정리(provider)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- auth/negotiation 도메인별 api/keys/queries/mutations/type 5파일 구조
- axios 인스턴스: access token 주입, 434 만료 시 refresh 자동 재발급(단일 비행)
후 원요청 재시도, 433/435/1203(TOKEN_REVOKED) 시 세션 종료 처리
- HTTP 200 + result.success=false 비즈니스 에러를 ApiError 로 변환,
에러코드별 한국어 메시지 맵(getApiErrorMessage) 제공
- 토큰 localStorage 저장소(tokenStorage)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
item/supplier 의 POST upload-excel 스텁 라우트와 Res_ExcelUpload 프로토콜 제거.
프론트 엑셀 모달은 클라이언트 CSV 파싱+check-codes/create 로 도는 독립 기능이라 영향 없음.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- WebServerConfig.cors_origins(list) 추가, config 의 오리진이 있을 때만 CORSMiddleware 적용
- 명시적 오리진이라 allow_credentials=true (Authorization 헤더 허용)
- 로컬 기본값: http://localhost:5173, http://127.0.0.1:5173 (Vite)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- tbl_account 예시 인증 제거, supplier_users 기반으로 일원화(generic 네이밍 재사용)
- DBType USER/PARTNER 분리, AccountStatus/UserRole/TokenType enum 추가
- 보호 요청 시 su_id DB 존재/활성 검증(stateless JWT 빈틈 보완), 공급사명(partner.suppliers) 응답 포함
- 로그인 시 단일 세션 access/refresh 토큰을 supplier_user_tokens 에 저장(재로그인 시 교체)
- greenlet 의존성 추가, 인증 e2e 테스트(test_auth.py) 재작성
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- orval 실제 타입(ItemData/SupplierData/QuotationData/QuotationSettingData) 사용,
응답 봉투 과중첩(.data.data) 제거 → 목록 정상 렌더
- 배송형태(delivery_type) 자유텍스트 → 서버 /v1/enums 코드 select 로 전환
- orval 클라이언트 재생성 (enums 훅, companyData 등)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- item/supplier/quotation/quotation_setting CRUD·service·router 추가
- item protocol delivery_type str→int (ERD/스키마 SMALLINT 일치)
- DeliveryType enum + 한글 라벨, 공용 GET /v1/enums (도메인 코드 메타데이터)
- CompanyBrief → CompanyData 로 *Data 네이밍 통일
- CORS: WebServerConfig.client_url(단일) 도입 (config_models/router)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 타이포그래피 스케일 추가 (headline/title/body/reject 등) — 채팅에서 사용
- 채팅 영역 스크롤바 스타일(.chat-scroll) 추가
- 브랜드 스케일 채도 추가 인하, surface(콘텐츠 면) 톤 조정
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>