feat: 판매관리 시스템 Phase 1 및 마일리지 시스템 구현
- 판매 관리 기능 추가 - compounds 테이블에 판매 관련 컬럼 추가 (payment_method, discount_rate, delivery_method 등) - 판매 상태 관리 (조제완료→결제대기→결제완료→배송대기→배송완료) - 판매 처리 모달 UI 구현 - 9가지 상태별 뱃지 표시 - 마일리지 시스템 구축 - patients 테이블에 마일리지 컬럼 추가 (balance, earned, used) - mileage_transactions 테이블 생성 (거래 이력 관리) - 마일리지 사용/적립 기능 구현 - 복합 결제 기능 - 할인율(%) / 할인액(원) 직접 입력 선택 가능 - 마일리지 + 현금 + 카드 + 계좌이체 복합 결제 - 결제 금액 자동 검증 - 결제 방법 자동 분류 (복합결제 지원) - API 엔드포인트 추가 - POST /api/compounds/<id>/status (상태 업데이트) - PUT /api/compounds/<id>/price (가격 조정) - GET /api/sales/statistics (판매 통계) - 데이터베이스 설정 통합 - config.py 생성하여 DB 경로 중앙화 TODO: 처방별 기본가격 정책 시스템 (price_policies 테이블 활용) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -478,6 +478,178 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 판매 처리 모달 -->
|
||||
<div class="modal fade" id="salesModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-success text-white">
|
||||
<h5 class="modal-title"><i class="bi bi-cash-coin"></i> 판매 처리</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="salesForm">
|
||||
<input type="hidden" id="salesCompoundId">
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">처방명</label>
|
||||
<input type="text" class="form-control" id="salesFormulaName" readonly>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">환자명</label>
|
||||
<input type="text" class="form-control" id="salesPatientName" readonly>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header bg-light">
|
||||
<h6 class="mb-0"><i class="bi bi-calculator"></i> 가격 정보</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">약재원가</label>
|
||||
<input type="number" class="form-control" id="salesCostTotal" readonly>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">조제료</label>
|
||||
<input type="number" class="form-control" id="salesDispensingFee" value="20000">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">판매가격 (원가+조제료)</label>
|
||||
<input type="number" class="form-control fw-bold" id="salesBasePrice" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-12">
|
||||
<label class="form-label">할인 방식 선택</label>
|
||||
<div class="btn-group w-100" role="group">
|
||||
<input type="radio" class="btn-check" name="discountType" id="discountTypeRate" value="rate" checked>
|
||||
<label class="btn btn-outline-primary" for="discountTypeRate">할인율 (%)</label>
|
||||
|
||||
<input type="radio" class="btn-check" name="discountType" id="discountTypeAmount" value="amount">
|
||||
<label class="btn btn-outline-primary" for="discountTypeAmount">할인액 (원)</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">할인 설정</label>
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" id="salesDiscountValue" min="0" value="0">
|
||||
<span class="input-group-text" id="discountUnit">%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">할인사유</label>
|
||||
<input type="text" class="form-control" id="salesDiscountReason" placeholder="예: 단골 할인">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">할인 후 가격</label>
|
||||
<input type="number" class="form-control fw-bold text-danger" id="salesPriceAfterDiscount" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-12">
|
||||
<div class="alert alert-info mb-0">
|
||||
<i class="bi bi-piggy-bank"></i> <strong>보유 마일리지:</strong>
|
||||
<span id="patientMileageBalance">0</span>원
|
||||
<button type="button" class="btn btn-sm btn-outline-info float-end" id="applyMaxMileage">전액 사용</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header bg-light">
|
||||
<h6 class="mb-0"><i class="bi bi-credit-card"></i> 복합 결제</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">마일리지 사용</label>
|
||||
<input type="number" class="form-control" id="salesMileageUse" min="0" value="0">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">현금 결제</label>
|
||||
<input type="number" class="form-control" id="salesPaymentCash" min="0" value="0">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">카드 결제</label>
|
||||
<input type="number" class="form-control" id="salesPaymentCard" min="0" value="0">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">계좌이체</label>
|
||||
<input type="number" class="form-control" id="salesPaymentTransfer" min="0" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-6">
|
||||
<div class="alert alert-warning mb-0">
|
||||
<strong>결제 필요 금액:</strong> <span id="salesNeedToPay" class="fs-5">0</span>원
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="alert alert-success mb-0">
|
||||
<strong>결제 합계:</strong> <span id="salesTotalPayment" class="fs-5">0</span>원
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">주 결제방법</label>
|
||||
<select class="form-control" id="salesPaymentMethod">
|
||||
<option value="">선택하세요</option>
|
||||
<option value="CASH">현금</option>
|
||||
<option value="CARD">카드</option>
|
||||
<option value="TRANSFER">계좌이체</option>
|
||||
<option value="KAKAO">카카오페이</option>
|
||||
<option value="COMPLEX">복합결제</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">결제일시</label>
|
||||
<input type="datetime-local" class="form-control" id="salesPaymentDate">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-light">
|
||||
<h6 class="mb-0"><i class="bi bi-truck"></i> 배송 정보</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">배송방법</label>
|
||||
<select class="form-control" id="salesDeliveryMethod">
|
||||
<option value="">선택하세요</option>
|
||||
<option value="DELIVERY">택배</option>
|
||||
<option value="PICKUP">직접수령</option>
|
||||
<option value="QUICK">퀵서비스</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">배송예정일</label>
|
||||
<input type="date" class="form-control" id="salesDeliveryDate">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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-success" id="saveSalesBtn">
|
||||
<i class="bi bi-check-circle"></i> 판매 확정
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 조제 상세보기 모달 -->
|
||||
<div class="modal fade" id="compoundDetailModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-xl">
|
||||
|
||||
Reference in New Issue
Block a user