feat: 재고 보정 및 보정 내역 조회 기능 추가

- 재고 보정 모달 UI 추가 (약재, 로트, 수량 관리)
- 재고 보정 내역 조회 모달 추가
- 재고 보정 상세 조회 모달 추가
- 자동 델타 계산 기능 (보정 전/후 비교)
- 로트별 재고 선택 및 원산지별 그룹화
- 보정 유형: 감모/손실, 발견, 재고조사, 파손, 유통기한 경과
- API 데이터 형식 수정 (items → details)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-02-15 12:39:03 +00:00
parent b58e46f8fd
commit 724af5000a
2 changed files with 557 additions and 0 deletions

View File

@@ -589,6 +589,9 @@
<button class="btn btn-warning me-2" id="showStockAdjustmentBtn">
<i class="bi bi-sliders"></i> 재고 보정
</button>
<button class="btn btn-outline-warning me-2" id="showAdjustmentHistoryBtn">
<i class="bi bi-clock-history"></i> 보정 내역
</button>
<button class="btn btn-outline-info" id="showStockLedgerBtn">
<i class="bi bi-journal-text"></i> 입출고 원장
</button>
@@ -698,6 +701,200 @@
</div>
</div>
</div>
<!-- 재고 보정 모달 -->
<div class="modal fade" id="stockAdjustmentModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header bg-warning text-dark">
<h5 class="modal-title"><i class="bi bi-sliders"></i> 재고 보정</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="stockAdjustmentForm">
<div class="row mb-3">
<div class="col-md-4">
<label class="form-label">보정일자 *</label>
<input type="date" class="form-control" id="adjustmentDate" required>
</div>
<div class="col-md-4">
<label class="form-label">보정 유형 *</label>
<select class="form-control" id="adjustmentType" required>
<option value="">선택하세요</option>
<option value="LOSS">감모/손실</option>
<option value="FOUND">발견</option>
<option value="RECOUNT">재고조사</option>
<option value="DAMAGE">파손</option>
<option value="EXPIRE">유통기한 경과</option>
</select>
</div>
<div class="col-md-4">
<label class="form-label">담당자</label>
<input type="text" class="form-control" id="adjustmentCreatedBy" placeholder="담당자 이름">
</div>
</div>
<div class="row mb-3">
<div class="col-md-12">
<label class="form-label">비고</label>
<textarea class="form-control" id="adjustmentNotes" rows="2" placeholder="보정 사유를 입력하세요"></textarea>
</div>
</div>
<hr>
<div class="d-flex justify-content-between align-items-center mb-3">
<h6><i class="bi bi-list-check"></i> 보정 대상 약재</h6>
<button type="button" class="btn btn-sm btn-primary" id="addAdjustmentItemBtn">
<i class="bi bi-plus-circle"></i> 약재 추가
</button>
</div>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<thead class="table-light">
<tr>
<th width="200">약재명</th>
<th width="250">로트/원산지</th>
<th width="100">보정 전 재고</th>
<th width="100">보정 후 재고</th>
<th width="80">증감량</th>
<th>보정 사유</th>
<th width="60">작업</th>
</tr>
</thead>
<tbody id="adjustmentItemsList">
<!-- Dynamic content -->
</tbody>
</table>
</div>
<div class="alert alert-info mt-3">
<i class="bi bi-info-circle"></i>
<strong>안내:</strong> 보정 전 재고는 현재 시스템 재고가 자동으로 표시됩니다.
실사 재고를 "보정 후 재고"에 입력하면 증감량이 자동 계산됩니다.
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
<button type="button" class="btn btn-warning" id="saveAdjustmentBtn">
<i class="bi bi-check-circle"></i> 보정 실행
</button>
</div>
</div>
</div>
</div>
<!-- 재고 보정 내역 모달 -->
<div class="modal fade" id="adjustmentHistoryModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header bg-warning text-dark">
<h5 class="modal-title"><i class="bi bi-clock-history"></i> 재고 보정 내역</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="table-responsive">
<table class="table table-hover">
<thead class="table-dark">
<tr>
<th width="120">보정일자</th>
<th width="150">보정번호</th>
<th width="100">보정 유형</th>
<th width="80">항목 수</th>
<th width="100">담당자</th>
<th>비고</th>
<th width="120">작업</th>
</tr>
</thead>
<tbody id="adjustmentHistoryList">
<!-- Dynamic content -->
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
<!-- 재고 보정 상세 모달 -->
<div class="modal fade" id="adjustmentDetailModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header bg-info text-white">
<h5 class="modal-title"><i class="bi bi-file-text"></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-4">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h6 class="card-title">보정 정보</h6>
<table class="table table-sm table-borderless">
<tr>
<th width="100">보정번호:</th>
<td id="detailAdjustmentNo"></td>
</tr>
<tr>
<th>보정일자:</th>
<td id="detailAdjustmentDate"></td>
</tr>
<tr>
<th>보정 유형:</th>
<td id="detailAdjustmentType"></td>
</tr>
<tr>
<th>담당자:</th>
<td id="detailAdjustmentCreatedBy"></td>
</tr>
</table>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h6 class="card-title">비고</h6>
<p id="detailAdjustmentNotes" class="mb-0"></p>
</div>
</div>
</div>
</div>
<!-- 보정 상세 항목 -->
<h6><i class="bi bi-list-check"></i> 보정 상세 내역</h6>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<thead class="table-light">
<tr>
<th>약재명</th>
<th>보험코드</th>
<th>원산지</th>
<th>로트ID</th>
<th>보정 전</th>
<th>보정 후</th>
<th>증감량</th>
<th>사유</th>
</tr>
</thead>
<tbody id="detailAdjustmentItems">
<!-- Dynamic content -->
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
</div>
<!-- Herbs Page -->