- common/anchoring 이식 패키지 신설: 원본(schedules/anchoring)에서 읽기 경로 발췌 (constants·base_table·service) + reader 이식판(Redis 미사용 — current_rates 뷰 단일 쿼리, 실패·무이력 시 정적 테이블 폴백으로 견적 생성 무중단) - _build_quotation: 목표가 산정과 앵커 산출 분리 — 칸(items.company_id × quotations.supplier_type × 가격구간) rate 로 tp*(1000-rate)//1000 정수 박제, anchor_rate_permille 동시 기록. quotation_settings.anchoring_value 계산 사용 중단 - 재생성(regenerate_next_round): target_price 만 상속, 앵커는 생성 시점 rate 재계산 (인수인계 규칙 1 — 상속 폐지) - sessions 모델 anchor_rate_permille 매핑, crud get_item_companies 신설 - 테스트 6종 신설(스키마 부재 폴백·칸별 조정 반영·유형 미지정·재생성 재계산· bracket 경계 골든 벡터) — 전체 스위트 50 통과 - negodata 담당자 승인 하 직접 적용. 6개월 압축 시뮬레이션(격주 배치 13회, 세션 522건)으로 박제→소비→재박제 루프·클램프·이월·이중소비 방지 검증 완료 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
34 lines
2.0 KiB
Python
34 lines
2.0 KiB
Python
"""앵커링 도메인 상수 — 읽기 경로에 필요한 부분만 원본에서 발췌 이식.
|
|
|
|
원본: schedules/anchoring/src/anchoring/constants.py (규범: 같은 폴더 docs/개발용.md §3).
|
|
조정폭(δ)·배치 주기 등 배치 전용 상수는 이식하지 않았다.
|
|
상수 변경은 정책 재확정 사안 — 코드에서 임의 조정 금지, 변경 시 원본과 동시 반영.
|
|
"""
|
|
|
|
# ── 앵커링 값(정수 천분율 ‰) ──────────────────────────────
|
|
ANCHOR_RATE_MIN = 10 # 하한 1%
|
|
ANCHOR_RATE_MAX = 200 # 상한 20%
|
|
# 시작값은 상수가 아니라 정적 테이블(base_table)에서 로드 — 0.01/10 하드코딩 금지
|
|
|
|
# ── 가격구간 (자릿수 계단식 사다리 — 폭 = 구간 상한의 10% = 선행 자릿수 밴드) ──
|
|
# 예: 1,000~1만 은 1,000원 폭(1천 원대·2천 원대…), 1만~10만 은 1만 폭(1만 원대·2만 원대…).
|
|
# 최하단(0~1,000원)은 한 칸으로 통일. 1억 초과는 마지막 칸으로 클램프.
|
|
PRICE_MAX = 100_000_000 # 정적 테이블 상한(1억)
|
|
_DECADE_STARTS = (1_000, 10_000, 100_000, 1_000_000, 10_000_000)
|
|
|
|
|
|
def _build_upper_bounds() -> tuple:
|
|
bounds = [1_000] # idx 0: [0, 1,000) 통일 칸
|
|
for start in _DECADE_STARTS: # 각 자릿수: 폭 = start (상한의 10%)
|
|
bounds.extend(start + start * i for i in range(1, 10))
|
|
return tuple(bounds) # 마지막 = 100,000,000
|
|
|
|
|
|
UPPER_BOUNDS = _build_upper_bounds() # 46개 — 구간 = [이전 upper_bound, upper_bound) 좌폐우개
|
|
BRACKET_COUNT = len(UPPER_BOUNDS) # 46
|
|
BRACKET_INDEX_MAX = BRACKET_COUNT - 1 # 45
|
|
|
|
# 칸을 구성할 수 있는 협력사 유형 코드 — common.enums.SupplierType 의 유통(1)/제조(2)/총판(3).
|
|
# 이 외(NONE=0/NULL)는 칸 해석 불가 → 정적 테이블 시작값 사용(배치 집계에서도 자동 제외).
|
|
SAMPLEABLE_SUPPLIER_TYPES = (1, 2, 3)
|