# 처방 데이터 추가 가이드

## 개요
이 문서는 K-Drug 시스템에 새로운 한방 처방을 추가하는 방법을 설명합니다.

## 데이터베이스 구조

### 1. formulas 테이블
처방의 기본 정보를 저장하는 테이블입니다.

| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| formula_id | INTEGER | 처방 고유 ID (자동생성) |
| formula_code | TEXT | 처방 코드 (예: SCR001) |
| formula_name | TEXT | 처방 이름 (예: 소청룡탕) |
| formula_type | TEXT | 처방 타입 (STANDARD/CUSTOM) |
| base_cheop | INTEGER | 기본 첩수 |
| base_pouches | INTEGER | 기본 포수 |
| description | TEXT | 처방 설명 |
| is_active | INTEGER | 활성 상태 (1: 활성, 0: 비활성) |

### 2. formula_ingredients 테이블
처방을 구성하는 약재 정보를 저장하는 테이블입니다.

| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| ingredient_id | INTEGER | 구성 약재 ID (자동생성) |
| formula_id | INTEGER | 처방 ID (formulas 테이블 참조) |
| ingredient_code | TEXT | 약재 성분 코드 (herb_masters 테이블 참조) |
| grams_per_cheop | REAL | 1첩당 용량(g) |
| notes | TEXT | 약재 역할/효능 설명 |
| sort_order | INTEGER | 정렬 순서 |

### 3. herb_masters 테이블
약재 마스터 정보를 저장하는 테이블입니다.

| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| ingredient_code | VARCHAR(10) | 약재 성분 코드 (PK) |
| herb_name | VARCHAR(100) | 약재 이름 |
| herb_name_hanja | VARCHAR(100) | 약재 한자명 |
| herb_name_latin | VARCHAR(200) | 약재 학명 |

## 처방 추가 절차

### 1단계: 약재 성분 코드 확인
처방에 사용할 약재들의 성분 코드를 먼저 확인해야 합니다.

```python
import sqlite3

conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()

# 약재 이름으로 성분 코드 검색
herb_name = "마황"
cursor.execute("""
    SELECT ingredient_code, herb_name
    FROM herb_masters
    WHERE herb_name LIKE ?
""", (f'%{herb_name}%',))

results = cursor.fetchall()
for code, name in results:
    print(f"{name}: {code}")

conn.close()
```

### 2단계: 처방 데이터 준비
처방 정보와 구성 약재 정보를 준비합니다.

```python
prescription_data = {
    'formula_code': 'SCR001',  # 고유한 처방 코드
    'formula_name': '소청룡탕',
    'formula_type': 'STANDARD',  # STANDARD 또는 CUSTOM
    'base_cheop': 1,  # 기본 첩수
    'base_pouches': 1,  # 기본 포수
    'description': '처방 설명',
    'ingredients': [
        {
            'code': '3147H1AHM',  # 약재 성분 코드
            'amount': 6.0,  # 1첩당 용량(g)
            'notes': '발한해표'  # 약재 역할
        },
        # ... 추가 약재들
    ]
}
```

### 3단계: 데이터베이스에 추가
준비한 데이터를 데이터베이스에 저장합니다.

```python
import sqlite3

def add_prescription(prescription_data):
    conn = sqlite3.connect('database/kdrug.db')
    cursor = conn.cursor()

    try:
        # 1. formulas 테이블에 처방 추가
        cursor.execute("""
            INSERT INTO formulas (
                formula_code, formula_name, formula_type,
                base_cheop, base_pouches, description,
                is_active, created_at, updated_at
            ) VALUES (?, ?, ?, ?, ?, ?, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
        """, (
            prescription_data['formula_code'],
            prescription_data['formula_name'],
            prescription_data['formula_type'],
            prescription_data['base_cheop'],
            prescription_data['base_pouches'],
            prescription_data['description']
        ))

        formula_id = cursor.lastrowid

        # 2. formula_ingredients 테이블에 약재 추가
        for ingredient in prescription_data['ingredients']:
            cursor.execute("""
                INSERT INTO formula_ingredients (
                    formula_id, ingredient_code,
                    grams_per_cheop, notes,
                    sort_order, created_at
                ) VALUES (?, ?, ?, ?, 0, CURRENT_TIMESTAMP)
            """, (
                formula_id,
                ingredient['code'],
                ingredient['amount'],
                ingredient['notes']
            ))

        conn.commit()
        print(f"처방 '{prescription_data['formula_name']}' 추가 완료!")

    except Exception as e:
        conn.rollback()
        print(f"오류 발생: {e}")
    finally:
        conn.close()
```

## 자동화 스크립트 사용법

### add_prescription_data.py 스크립트
프로젝트에 포함된 `add_prescription_data.py` 스크립트를 사용하여 처방을 쉽게 추가할 수 있습니다.

1. 스크립트 실행:
```bash
python3 add_prescription_data.py
```

2. 스크립트 수정하여 새 처방 추가:
```python
prescriptions = [
    {
        'formula_code': '새처방코드',
        'formula_name': '새처방이름',
        'formula_type': 'STANDARD',
        'base_cheop': 1,
        'base_pouches': 1,
        'description': '처방 설명',
        'ingredients': [
            # 구성 약재 목록
        ]
    }
]
```

## 주의사항

### 1. 성분 코드 확인
- 반드시 herb_masters 테이블에 존재하는 ingredient_code를 사용해야 합니다
- 보험 코드(insurance_code)가 아닌 성분 코드(ingredient_code)를 사용합니다

### 2. 중복 확인
- formula_code는 고유해야 합니다
- 동일한 처방 코드로 중복 추가하지 않도록 주의합니다

### 3. 약재 용량
- grams_per_cheop은 1첩 기준 용량입니다
- 소수점 사용 가능 (예: 1.5, 0.5)

### 4. 처방 타입
- STANDARD: 표준 처방
- CUSTOM: 사용자 정의 처방

## 데이터 검증

### 추가된 처방 확인
```python
import sqlite3

conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()

# 처방 목록 조회
cursor.execute("""
    SELECT formula_code, formula_name, formula_type
    FROM formulas
    WHERE is_active = 1
""")

for row in cursor.fetchall():
    print(f"{row[0]}: {row[1]} ({row[2]})")

conn.close()
```

### 처방 상세 정보 조회
```python
# 특정 처방의 구성 약재 확인
formula_code = 'SCR001'

cursor.execute("""
    SELECT hm.herb_name, fi.grams_per_cheop, fi.notes
    FROM formulas f
    JOIN formula_ingredients fi ON f.formula_id = fi.formula_id
    JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
    WHERE f.formula_code = ?
    ORDER BY fi.grams_per_cheop DESC
""", (formula_code,))

for herb_name, amount, notes in cursor.fetchall():
    print(f"- {herb_name}: {amount}g ({notes})")
```

## 문제 해결

### 1. 약재를 찾을 수 없는 경우
- herb_masters 테이블에서 정확한 약재명 확인
- 대체 이름 검색 (예: 대조 → 대추, 백작약 → 작약)

### 2. 외래 키 제약 오류
- ingredient_code가 herb_masters 테이블에 존재하는지 확인
- formula_id가 올바른지 확인

### 3. 중복 키 오류
- formula_code가 이미 존재하는지 확인
- 필요시 기존 처방 삭제 또는 코드 변경

## 예제: 실제 처방 추가

### 소청룡탕 추가 예제
```python
{
    'formula_code': 'SCR001',
    'formula_name': '소청룡탕',
    'formula_type': 'STANDARD',
    'base_cheop': 1,
    'base_pouches': 1,
    'description': '외감풍한, 내정수음으로 인한 기침, 천식을 치료하는 처방',
    'ingredients': [
        {'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'},  # 마황
        {'code': '3419H1AHM', 'amount': 6.0, 'notes': '화영지통'},  # 백작약
        {'code': '3342H1AHM', 'amount': 6.0, 'notes': '렴폐지해'},  # 오미자
        {'code': '3182H1AHM', 'amount': 6.0, 'notes': '화담지구'},  # 반하
        {'code': '3285H1AHM', 'amount': 4.0, 'notes': '온폐산한'},  # 세신
        {'code': '3017H1AHM', 'amount': 4.0, 'notes': '온중산한'},  # 건강
        {'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'},  # 계지
        {'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'},  # 감초
    ]
}
```

### 갈근탕 추가 예제
```python
{
    'formula_code': 'GGT001',
    'formula_name': '갈근탕',
    'formula_type': 'STANDARD',
    'base_cheop': 1,
    'base_pouches': 1,
    'description': '외감풍한으로 인한 두통, 발열, 오한, 항강을 치료하는 처방',
    'ingredients': [
        {'code': '3002H1AHM', 'amount': 8.0, 'notes': '승진해기'},  # 갈근
        {'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'},  # 마황
        {'code': '3115H1AHM', 'amount': 6.0, 'notes': '보중익기'},  # 대조
        {'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'},  # 계지
        {'code': '3419H1AHM', 'amount': 4.0, 'notes': '화영지통'},  # 작약
        {'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'},  # 감초
        {'code': '3017H1AHM', 'amount': 2.0, 'notes': '온중산한'},  # 건강
    ]
}
```

## 참고 자료
- 데이터베이스 스키마: `database/kdrug.db`
- 자동화 스크립트: `add_prescription_data.py`
- 약재 마스터 데이터: `herb_masters` 테이블