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:
122
docs/조제_용도구분_usage_type.md
Normal file
122
docs/조제_용도구분_usage_type.md
Normal 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*
|
||||
Reference in New Issue
Block a user