feat(cupang): 발주 업로드 시 미등록 입고센터 자동 등록

발주서에 있는 센터가 cupang_centers 에 없으면 자동 배분에서 제외됐다.
이제 발주서에 적힌 이름 그대로 센터를 등록(sort_order 는 기존 최대값 다음)
하고 계산에 포함한다. 경고문도 "등록되지 않은 센터" 대신
"새 입고센터 자동 등록" 으로 바꿨다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 18:21:39 +09:00
parent 0b79629207
commit 4fce96b438
+14 -5
View File
@@ -943,7 +943,7 @@ async def box_calc_upload(
- 출고일 = F13(입고예정일)의 하루 전
- 쿠팡상품코드(B) → cupang_products.coupang_item_code 로 제품 매칭
- 센터명(F) → cupang_centers.name 으로 매칭(못 찾으면 경고만)
- 센터명(F) → cupang_centers.name 으로 매칭(없으면 그 이름으로 자동 등록)
"""
from io import BytesIO # noqa: WPS433
from datetime import timedelta as _timedelta # noqa: WPS433
@@ -964,6 +964,7 @@ async def box_calc_upload(
}
centers = store.list_centers(include_inactive=True)
by_center_name = {(c.get("name") or "").strip(): c for c in centers}
next_center_order = max((int(c.get("sort_order") or 0) for c in centers), default=0) + 1
rules = {r["product_code"]: r for r in store.list_box_rules()}
warnings: list[str] = []
@@ -972,7 +973,7 @@ async def box_calc_upload(
# (출고일, 센터명, 제품코드) → 수량
agg: dict[tuple[str, str, str], dict[str, Any]] = {}
unknown_codes: set[str] = set()
unknown_centers: set[str] = set()
added_centers: set[str] = set()
no_rule: set[str] = set()
for up in files:
@@ -1002,7 +1003,15 @@ async def box_calc_upload(
continue
cname = row["center_name"]
if cname not in by_center_name:
unknown_centers.add(cname)
# 미등록 센터는 발주서에 적힌 이름 그대로 자동 등록해 계산에 포함한다.
try:
created = store.create_center(name=cname, sort_order=next_center_order)
next_center_order += 1
except Exception: # noqa: BLE001 - 등록 실패해도 나머지는 계산
warnings.append(f"센터 자동 등록 실패: {cname}")
continue
by_center_name[cname] = created
added_centers.add(cname)
code = prod["product_code"]
if code not in rules:
no_rule.add(f'{prod["product_name"]}({code})')
@@ -1037,8 +1046,8 @@ async def box_calc_upload(
+ ", ".join(sorted(unknown_codes)[:10])
+ ("" if len(unknown_codes) > 10 else "")
)
if unknown_centers:
warnings.append("등록되지 않은 센터: " + ", ".join(sorted(unknown_centers)))
if added_centers:
warnings.append("새 입고센터 자동 등록: " + ", ".join(sorted(added_centers)))
if no_rule:
warnings.append("상자 입수량 미설정: " + ", ".join(sorted(no_rule)))