사방넷 코드가 없는 항목은 결과 엑셀에서 제외

itemcode_db 의 single_items.sabangnet_code 가 비어 있거나
마스터에 등록되지 않은 상품(미등록 코드 / 세트 구성 단품 미등록)은
결과 엑셀의 상품코드[필수] 컬럼에 들어갈 값이 없으므로 제외한다.

- 폴백 시 sabangnet_code 자리에 내부 코드 채우던 동작 제거
- 엑셀 빌드 단계에서 사방넷 코드가 빈 행을 스킵하고 warning 로그
- success 로그에 excel_row_count / skipped_no_sabang_count 노출

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 23:57:20 +09:00
parent 995adb5cd8
commit 19a552452f
+25 -7
View File
@@ -766,14 +766,16 @@ def upload_file(
s_code = comp["single_code"]
comp_qty = safe_int_quantity(comp["quantity"], default=1)
single_qty_sums[s_code] = single_qty_sums.get(s_code, 0) + (qty * comp_qty)
# 세트 구성 단품 정보가 single_items 에 없을 수도 있으므로 보강
# 세트 구성 단품 정보가 single_items 에 없을 수도 있으므로 placeholder 만 보강.
# 사방넷 코드는 비워서, 결과 엑셀 빌드 단계에서 제외 대상으로 인식되게 둔다.
if s_code not in single_items:
single_items[s_code] = {"sabangnet_code": s_code, "name": ""}
single_items[s_code] = {"sabangnet_code": "", "name": ""}
else:
# 마스터 미등록 코드: 단품으로 간주, 이름은 주문서의 상품명으로 채움
# 마스터 미등록 코드: 사방넷 코드를 알 수 없으므로 placeholder 로만 추적.
# 결과 엑셀에서는 제외된다.
unknown_codes.add(prod_code)
single_items[prod_code] = {
"sabangnet_code": prod_code,
"sabangnet_code": "",
"name": order.product_name or ""
}
single_qty_sums[prod_code] = single_qty_sums.get(prod_code, 0) + qty
@@ -788,15 +790,29 @@ def upload_file(
# 5. 결과 엑셀 데이터 빌드
# A열=사방넷코드, B열=합계수량, C열=이름. 헤더는 요청 사양(상품코드[필수]/가용수량/불용수량).
# 사방넷 코드가 없는(마스터 미등록·구성품 미등록) 단품은 결과에서 제외한다.
excel_rows = []
skipped_no_sabang: list[str] = []
for s_code, total_qty in single_qty_sums.items():
s_info = single_items.get(s_code, {"sabangnet_code": s_code, "name": ""})
s_info = single_items.get(s_code, {"sabangnet_code": "", "name": ""})
sabang_code = (s_info.get("sabangnet_code") or "").strip()
if not sabang_code:
skipped_no_sabang.append(s_code)
continue
excel_rows.append({
"상품코드[필수]": s_info["sabangnet_code"] or s_code,
"상품코드[필수]": sabang_code,
"가용수량": total_qty,
"불용수량": s_info["name"] or ""
"불용수량": s_info.get("name") or ""
})
if skipped_no_sabang:
log_event(
current_user,
"낱개 출고 분석 — 사방넷 코드 없는 항목 제외",
"warning",
{"skipped_count": len(skipped_no_sabang), "sample": skipped_no_sabang[:20]},
)
df_out = pd.DataFrame(excel_rows, columns=["상품코드[필수]", "가용수량", "불용수량"])
# 엑셀 파일 쓰기 (1행 헤더, 2행부터 데이터 — pandas to_excel 기본 동작)
@@ -824,7 +840,9 @@ def upload_file(
"filenames": filenames_str,
"uploaded_count": len(db_records),
"single_code_count": len(single_qty_sums),
"excel_row_count": len(excel_rows),
"unknown_code_count": len(unknown_codes),
"skipped_no_sabang_count": len(skipped_no_sabang),
},
)