feat: 한퓨어 엑셀 형식 지원 및 조제 용도 구분(usage_type) 추가

한퓨어 엑셀:
- ExcelProcessor에 hanpure 형식 자동 감지 및 처리 추가
- 옵션항목에서 중량 파싱 (600g*5개 → 3000g 등)
- 주문번호에서 입고일 추출, ingredient_code 직접 활용

조제 용도 구분:
- compounds.usage_type 컬럼 추가 (SALE/SELF_USE/SAMPLE/DISPOSAL)
- 조제 실행 시 용도 선택 드롭다운
- 조제 목록에서 용도 뱃지 클릭으로 사후 변경 가능
- 비판매 용도 시 sell_price_total=0, 매출 통계 제외
- PUT /api/compounds/:id/usage-type API 추가
- 용도 구분 설계 문서 (docs/조제_용도구분_usage_type.md)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 14:34:10 +00:00
parent 69be63d00d
commit 974ce5f655
5 changed files with 368 additions and 22 deletions

View File

@@ -0,0 +1,122 @@
# 조제 용도 구분 (usage_type)
> 조제된 약은 반드시 판매 목적이 아닐 수 있다.
> 자가소비, 샘플 제공, 폐기 등 **재고는 차감되지만 매출이 아닌 경우**를 구분한다.
---
## 1. 기존 status와의 차이
| 구분 | `status` | `usage_type` |
|------|----------|-------------|
| 역할 | 판매 진행 **흐름 상태** | 조제의 **용도 분류** |
| 변화 | 시간에 따라 전이 (PREPARED → PAID → COMPLETED) | 조제 시점에 결정, 사후 변경 가능 |
| 예시 | "이 조제는 결제 완료 상태" | "이 조제는 자가소비 용도" |
**핵심**: `status``usage_type`은 서로 다른 차원. 자가소비도 `PREPARED → COMPLETED` 상태 흐름을 탈 수 있다.
---
## 2. usage_type 값 정의
| 값 | 한글명 | 설명 | 매출 포함 | 판매가 |
|----|--------|------|:---------:|--------|
| `SALE` | 판매 | 환자에게 판매 (기본값) | O | 설정 가격 |
| `SELF_USE` | 자가소비 | 약국 자체 사용 | X | 0원 |
| `SAMPLE` | 샘플 | 시음/샘플 제공 | X | 0원 |
| `DISPOSAL` | 폐기 | 유통기한 초과 등 폐기 처리 | X | 0원 |
---
## 3. DB 스키마
```sql
-- compounds 테이블에 추가된 컬럼
ALTER TABLE compounds ADD COLUMN usage_type TEXT DEFAULT 'SALE';
```
- 기본값 `'SALE'` — 기존 데이터 호환
- `COALESCE(usage_type, 'SALE')` 패턴으로 NULL 안전 처리
---
## 4. 동작 규칙
### 4-1. 조제 생성 시
- 조제 실행 폼에서 **용도** 드롭다운 선택 (기본: 판매)
- `SALE`이 아닌 용도 → `sell_price_total = 0` 자동 설정
- 재고 차감은 용도에 관계없이 **항상 발생**
### 4-2. 사후 변경
- 조제 목록의 **용도 뱃지 클릭** → 번호 입력으로 변경
- API: `PUT /api/compounds/:id/usage-type`
- 판매 → 자가소비 변경 시 `sell_price_total = 0`으로 자동 변경
- 변경 이력이 `sales_status_history`에 기록됨
### 4-3. 매출 통계 제외
- 대시보드 월매출: `usage_type = 'SALE'`만 집계
- 판매 통계 API: `COALESCE(usage_type, 'SALE') = 'SALE'` 조건
- 자가소비/샘플/폐기는 매출에서 완전 제외
### 4-4. UI 표시
| 용도 | 뱃지 색상 | 판매 버튼 | 판매가 표시 |
|------|----------|:---------:|:----------:|
| 판매 | 초록 | O | 금액 표시 |
| 자가소비 | 노랑 | X | `-` |
| 샘플 | 파랑 | X | `-` |
| 폐기 | 회색 | X | `-` |
---
## 5. API 명세
### 용도 변경
```
PUT /api/compounds/:compound_id/usage-type
Content-Type: application/json
{
"usage_type": "SELF_USE" // SALE, SELF_USE, SAMPLE, DISPOSAL
}
Response:
{
"success": true,
"message": "용도가 변경되었습니다: SELF_USE"
}
```
### 조제 생성 시 용도 지정
```
POST /api/compounds
{
"patient_id": 1,
"formula_id": 5,
"je_count": 1,
"cheop_total": 30,
"pouch_total": 30,
"usage_type": "SELF_USE", // 생략 시 기본 SALE
"ingredients": [...]
}
```
---
## 6. 활용 시나리오
### 자가소비 조제
1. 약사가 본인/가족용으로 쌍화탕 1제 조제
2. 조제 실행 시 용도 → "자가소비" 선택
3. 재고 차감됨, 판매가 = 0, 매출 통계 제외
4. 원가만 기록 → 비용 관리 목적
### 기존 조제를 자가소비로 변경
1. 실수로 판매로 조제했는데 실제로는 자가소비
2. 조제 내역 목록에서 "판매" 뱃지 클릭
3. "2" (자가소비) 입력
4. 즉시 변경 → 매출에서 제외
---
*최종 수정: 2026-02-19*