feat: 수동입고 기능 구현 및 입고일 날짜 포맷 버그 수정

- 수동입고 API (POST /api/purchase-receipts/manual) 추가
- 수동입고 모달 UI 구현 (도매상 선택, 품목 동적 추가, 금액 자동계산)
- 도매상 등록 모달 z-index 처리 (수동입고 모달 위에 표시)
- Excel 입고 시 receipt_date 튜플/대시 없는 날짜 포맷 정규화
- inventory_lots에 lot_number, expiry_date 저장 누락 수정
- CLAUDE.md 추가 (lot_id vs lot_number 구분 가이드)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-18 07:34:56 +00:00
parent 3d13c0b1f3
commit 3a39951fdc
4 changed files with 471 additions and 1 deletions

View File

@@ -266,6 +266,9 @@
<div id="purchase" class="main-content">
<div class="d-flex justify-content-between align-items-center mb-4">
<h3>입고 관리</h3>
<button class="btn btn-success" data-bs-toggle="modal" data-bs-target="#manualReceiptModal">
<i class="bi bi-plus-circle"></i> 수동 입고
</button>
</div>
<!-- 입고장 목록 -->
@@ -1838,6 +1841,81 @@
</div>
</div>
<!-- 수동 입고 모달 -->
<div class="modal fade" id="manualReceiptModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header bg-success text-white">
<h5 class="modal-title"><i class="bi bi-plus-circle"></i> 수동 입고</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- 입고 헤더 정보 -->
<div class="row mb-3">
<div class="col-md-3">
<label class="form-label">입고일 <span class="text-danger">*</span></label>
<input type="date" class="form-control" id="manualReceiptDate">
</div>
<div class="col-md-4">
<label class="form-label">도매상 <span class="text-danger">*</span></label>
<div class="input-group">
<select class="form-control" id="manualReceiptSupplier">
<option value="">도매상을 선택하세요</option>
</select>
<button class="btn btn-outline-secondary" type="button" id="manualReceiptAddSupplierBtn" title="새 도매상 등록">
<i class="bi bi-plus"></i>
</button>
</div>
</div>
<div class="col-md-5">
<label class="form-label">비고</label>
<input type="text" class="form-control" id="manualReceiptNotes" placeholder="비고 입력">
</div>
</div>
<!-- 품목 테이블 -->
<div class="table-responsive">
<table class="table table-bordered table-sm">
<thead class="table-light">
<tr>
<th style="width:25%">약재명 <span class="text-danger">*</span></th>
<th style="width:10%">수량(g) <span class="text-danger">*</span></th>
<th style="width:12%">g당 단가 <span class="text-danger">*</span></th>
<th style="width:12%">금액</th>
<th style="width:10%">원산지</th>
<th style="width:12%">로트번호</th>
<th style="width:12%">유효기한</th>
<th style="width:5%"></th>
</tr>
</thead>
<tbody id="manualReceiptLines">
<!-- 동적 행 추가 -->
</tbody>
<tfoot>
<tr class="table-warning fw-bold">
<td>합계</td>
<td id="manualReceiptTotalQty" class="text-end">0</td>
<td></td>
<td id="manualReceiptTotalAmount" class="text-end">0</td>
<td colspan="4"></td>
</tr>
</tfoot>
</table>
</div>
<button type="button" class="btn btn-outline-primary btn-sm" id="addManualReceiptLineBtn">
<i class="bi bi-plus"></i> 품목 추가
</button>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
<button type="button" class="btn btn-success" id="saveManualReceiptBtn">
<i class="bi bi-check-circle"></i> 입고 저장
</button>
</div>
</div>
</div>
</div>
<!-- 로트 배분 모달 -->
<div class="modal fade" id="lotAllocationModal" tabindex="-1">
<div class="modal-dialog modal-lg">