o2o-negosium-original/frontend/src/pages/LoginPage.tsx
Mina Choi 71ef28110b [feat] negodata·agent·negosium: 협상 기준가 회사별 선택(공급가/매입가) + 공급사 포털 안내 회사설정화
어느 가격이 "공급사에 지불하는 단가"인지는 회사마다 달라, 컬럼을 합치는 대신 회사가 고르게 했다.
판정은 settings.features.nego_baseline_field 1순위, 미설정 회사는 price 만 숨겼으면 purchase_price 폴백.
판정식 정본은 negodata/backend/common/nego_baseline.py (agent·negosium backend 가 같은 규칙 미러).

- negodata front: 회사 설정에 협상 기준가 라디오(선택지마다 실제 나갈 문장 미리보기 + 학습 경고),
  '공급사 포털 안내' 탭 신설(협상 유의사항·헬프데스크 연락처), 용어 카탈로그에 target_price·supplier 추가.
  인터넷 최저가는 숨김 대상에서 제외(신규 견적의 유일한 목표가 후보).
  상품 등록 기본값에서 개발용 더미 제거(price 1,000,000·PROD-BAT-###·800,000·대한민국·10 EA·14).
- agent: get_item_price → get_item_baseline (기준가·호칭·회사 용어사전을 한 쿼리로),
  "기존 공급가 대비" 하드코딩을 회사 용어로 치환 + 받침 기준 조사 자동 보정,
  협상 스크립트 4종의 협력사·목표가·배송형태 용어를 {label_*} 토큰화, input_options 도 변수 치환 적용.
- negosium: 협상 화면 기준 단가·배송형태 라벨을 회사 설정 기준으로, 유의사항 본문과 헬프데스크 연락처를
  하드코딩에서 회사 설정으로(미등록 시 영역 숨김). 유의사항의 VAT·배송비 문구 삭제(IMK 0803 ⑥).
- negodata backend: LPS 검색 가격 힌트를 items.price 고정에서 기준가 규칙으로.

검증: 기준가 설정 3 × 숨김 4 = 12조합에서 협상 멘트·포털 표시·LPS 힌트가 전부 일치.
agent 테스트 176건 통과. 보고서 negodata/docs/nego-baseline-verification.md
2026-08-05 11:47:06 +09:00

51 lines
1.9 KiB
TypeScript

import { Navigate } from 'react-router'
import { tokenStorage } from '@/apis'
import { Logo } from '@/components'
import { LoginForm, usePreLoginBranding } from '@/features/auth'
export function LoginPage() {
// 초청 링크의 session_id(없으면 직전 로그인 캐시)로 회사 브랜딩을 먼저 그린다.
const branding = usePreLoginBranding()
// 이미 로그인된 상태면 목록으로
if (tokenStorage.hasToken()) {
return <Navigate to="/list" replace />
}
return (
<main className="flex min-h-svh w-full items-center justify-center bg-surface px-6">
<div className="flex w-full max-w-sm flex-col items-center gap-6">
{/* 브랜드 락업 */}
<div className="flex flex-col items-center gap-2">
<Logo size="lg" serviceName={branding?.service_name} logoUrl={branding?.logo_url} />
<p className="text-[13px] font-medium tracking-[-0.26px] text-neutral-60">
negotium B2B 구매협상 솔루션 · 공급사 포털
</p>
</div>
{/* 로그인 카드 */}
<div className="w-full rounded-2xl border border-border bg-white p-8 shadow-sm">
<h1 className="mb-6 text-center text-xl font-bold tracking-[-0.4px] text-neutral-90">
로그인
</h1>
<LoginForm />
</div>
{/* 푸터 — 문의처(회사 설정 branding.helpdesk, 미등록이면 생략) + 솔루션/제작사 표기(고정) */}
<div className="flex flex-col items-center gap-1">
{(branding?.helpdesk ?? []).map((line) => (
<p key={line} className="text-xs font-medium text-neutral-60">
문의: {line}
</p>
))}
<p className="text-[11px] font-medium text-neutral-50">
© {new Date().getFullYear()} negotium · Made by AI O2O
</p>
</div>
</div>
</main>
)
}
export default LoginPage