2de019a203
① 박스 계산: 제품명·수량만 입력(결과 열 제거). 수량 칸에서 Tab 은 다음 행 수량으로 이동하고 마지막 행이면 새 행을 추가한다. Enter 는 계산. ② 박스 요약: 제품별 박스/자투리 혼합 박스 카드가 드래그 소스. 표시되는 수치는 센터에 배분하고 남은 "잔여" 기준으로 실시간 갱신되며, KPI 는 총 박스 / 센터 배분 / 미배분 잔여 3개로 바꿨다. ③ 센터 분배: 활성 입고센터(cupang_centers)만 표시. 카드를 끌어다 놓으면 해당 센터에 1박스가 담기고, 박스 수량을 직접 입력할 수 있다(잔여를 넘으면 자동으로 잘림). ✕ 로 빼면 잔여로 되돌아간다. 혼합 박스는 내용이 서로 달라 1장 = 1박스로 취급한다. 분배 내역은 화면 안에서만 유지(DB 저장 없음)하며, 재계산하면 근거가 바뀌므로 초기화한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
77 lines
3.4 KiB
HTML
77 lines
3.4 KiB
HTML
{% extends "erp_base.html" %}
|
|
|
|
{% block head_extra %}<link rel="stylesheet" href="/static/cupang.css?v=20260829b" />{% endblock %}
|
|
|
|
{% block content %}
|
|
<section class="cpg">
|
|
|
|
<div class="erp-page-actions cpg-actions">
|
|
<a class="erp-btn erp-btn-primary" href="/cupang/?date={{ shipment.ship_date }}">◀◀ 달력</a>
|
|
|
|
<form method="post" action="/cupang/{{ shipment.id }}/delete" class="cpg-inline-form"
|
|
onsubmit="return confirm('이 출고 묶음을 취소 처리합니다(상태=취소). 계속할까요?');">
|
|
<button type="submit" class="erp-btn erp-btn-outline">취소 처리</button>
|
|
</form>
|
|
|
|
<form method="post" action="/cupang/{{ shipment.id }}/hard-delete" class="cpg-inline-form"
|
|
onsubmit="return confirm('이 출고를 완전 삭제합니다(복구 불가, 품목 포함). 계속할까요?');">
|
|
<button type="submit" class="erp-btn erp-btn-danger">삭제</button>
|
|
</form>
|
|
|
|
<a class="erp-btn erp-btn-primary cpg-push-right" href="/cupang/{{ shipment.id }}/edit">수정</a>
|
|
</div>
|
|
|
|
<!-- 헤더 -->
|
|
<div class="erp-card cpg-form-card">
|
|
<div class="cpg-card-head">
|
|
<h2>출고 #{{ shipment.id }}
|
|
{% set badge = 'erp-badge-neutral' %}
|
|
{% if shipment.status == '출고완료' %}{% set badge = 'erp-badge-inverse' %}
|
|
{% elif shipment.status == '센터입고완료' %}{% set badge = 'erp-badge-success' %}
|
|
{% elif shipment.status == '취소' %}{% set badge = 'erp-badge-danger' %}{% endif %}
|
|
<span class="erp-badge {{ badge }}">{{ shipment.status }}</span>
|
|
</h2>
|
|
</div>
|
|
<dl class="cpg-detail-grid">
|
|
<div><dt>작성일</dt><dd>{{ shipment.document_date }}</dd></div>
|
|
<div><dt>출고일</dt><dd>{{ shipment.ship_date }}</dd></div>
|
|
<div><dt>센터입고일</dt><dd>{{ shipment.center_arrival_date }}</dd></div>
|
|
<div><dt>입고센터</dt><dd>{{ shipment.center_name_snapshot or '—' }}</dd></div>
|
|
<div><dt>출고방식</dt><dd>{{ shipment.ship_method }}</dd></div>
|
|
<div><dt>작업자</dt><dd>{{ shipment.worker or '—' }}</dd></div>
|
|
<div class="cpg-full"><dt>출고/박스 요약</dt><dd>{{ shipment.outbound_summary or '—' }}</dd></div>
|
|
<div class="cpg-full"><dt>메모</dt><dd>{{ shipment.memo or '—' }}</dd></div>
|
|
</dl>
|
|
</div>
|
|
|
|
<!-- 라인 -->
|
|
<div class="erp-card cpg-form-card">
|
|
<div class="cpg-card-head"><h2>품목 ({{ shipment.lines|length }})</h2></div>
|
|
<div class="erp-table-wrap">
|
|
<table class="erp-table">
|
|
<thead>
|
|
<tr><th>#</th><th>제품코드</th><th>제품명</th><th>수량</th>
|
|
<th>입수량</th><th>필요박스</th><th>잔량</th><th>수동보정</th><th>메모</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for ln in shipment.lines %}
|
|
<tr>
|
|
<td>{{ ln.line_no }}</td>
|
|
<td>{{ ln.product_code }}</td>
|
|
<td>{{ ln.product_name_snapshot }}</td>
|
|
<td>{{ ln.quantity }}</td>
|
|
<td>{{ ln.units_per_box if ln.units_per_box else '미설정' }}</td>
|
|
<td>{{ ln.calculated_boxes if ln.calculated_boxes is not none else '—' }}</td>
|
|
<td>{{ ln.remainder_units if ln.remainder_units is not none else '—' }}</td>
|
|
<td>{{ ln.manual_box_text or '—' }}</td>
|
|
<td>{{ ln.memo or '—' }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
</section>
|
|
{% endblock %}
|