kdrug-inventory-system/docs/직접조제_고도화_기획문서.md
시골약사 f3f1efd8c2 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>
2026-02-18 05:42:29 +00:00

9.9 KiB

직접조제(Custom Compound) 고도화 기획 문서

1. 현황 분석

1.1 현재 직접조제 데이터 구조

실제 데이터 사례

Compound ID 10: 휴먼건강 3.0g (단품)
Compound ID 8: 휴먼건강 2.0g (단품)
Compound ID 7: 휴먼일당귀 100.0g (단품)
Compound ID 6: 휴먼일당귀 100.0g (단품)

현재 저장 방식

  • formula_id: NULL
  • is_custom: 0 (잘못된 설정)
  • custom_type: 'standard' (잘못된 설정)
  • custom_summary: NULL
  • 약재 정보: compound_ingredients에 단일 약재로 저장

1.2 문제점

  1. 분류 체계 미비

    • 직접조제임에도 is_custom=0으로 저장
    • custom_type이 'standard'로 잘못 설정
    • 표준처방과 직접조제 구분 불명확
  2. 데이터 무결성

    • formula_id NULL이지만 custom 플래그 미설정
    • 직접조제 사유/목적 미기록
    • 처방명 없음 (custom_summary 미사용)
  3. 관리 기능 부족

    • 직접조제 이력 추적 어려움
    • 가격 책정 기준 불명확
    • 재조제시 참조 데이터 부재

2. 직접조제 유형 분류

2.1 단품 판매 (Single Item)

  • 특징: 단일 약재 판매
  • 사례: 녹용 100g, 홍삼 50g
  • 용도: 환자 요청에 의한 약재 구매

2.2 맞춤 조제 (Custom Formula)

  • 특징: 여러 약재 조합하여 맞춤 처방
  • 사례: 기존 처방 가감방, 한약사 임의 조제
  • 용도: 환자 체질/증상에 맞춘 개별화 처방

2.3 OTC 조제 (Over The Counter)

  • 특징: 처방전 없이 판매 가능한 제품
  • 사례: 쌍화탕 파우치, 공진단
  • 용도: 일반 판매용 제품

2.4 테스트/샘플 (Test/Sample)

  • 특징: 시음용, 테스트용 소량 조제
  • 사례: 처방 샘플 1일분
  • 용도: 환자 시음, 품질 테스트

3. 개선 방안

3.1 데이터 구조 개선

3.1.1 compounds 테이블 수정

-- 직접조제 분류 강화
ALTER TABLE compounds ADD COLUMN custom_category TEXT;
-- 'SINGLE_ITEM', 'CUSTOM_FORMULA', 'OTC', 'SAMPLE'

ALTER TABLE compounds ADD COLUMN custom_name TEXT;
-- 직접조제명 (예: '감기 맞춤처방', '홍삼 단품')

ALTER TABLE compounds ADD COLUMN custom_purpose TEXT;
-- 조제 목적/사유

ALTER TABLE compounds ADD COLUMN reference_compound_id INTEGER;
-- 재조제시 참조할 이전 조제 ID

3.1.2 custom_formulas 테이블 신규

CREATE TABLE custom_formulas (
    custom_formula_id INTEGER PRIMARY KEY AUTOINCREMENT,
    compound_id INTEGER REFERENCES compounds(compound_id),
    formula_name TEXT NOT NULL,
    formula_description TEXT,
    base_formula_id INTEGER REFERENCES formulas(formula_id),
    -- 기본이 된 표준처방 (가감방인 경우)

    modification_summary TEXT,
    -- 가감 내용 요약

    symptoms TEXT,
    -- 대상 증상

    contraindications TEXT,
    -- 금기사항

    created_by TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    is_reusable BOOLEAN DEFAULT 0,
    -- 재사용 가능 여부 (다른 환자에게도 적용 가능)

    reuse_count INTEGER DEFAULT 0
    -- 재사용 횟수
);

3.2 비즈니스 로직 개선

3.2.1 직접조제 생성 프로세스

1. 조제 유형 선택
   └─ 단품/맞춤/OTC/샘플

2. 유형별 정보 입력
   ├─ 단품: 약재, 용량, 판매사유
   ├─ 맞춤: 처방명, 약재구성, 증상, 기반처방
   ├─ OTC: 제품명, 수량
   └─ 샘플: 목적, 대상처방, 용량

3. 가격 책정
   ├─ 자동계산: 약재원가 + 조제료
   └─ 수동입력: 특별가 적용

4. 데이터 저장
   ├─ compounds: is_custom=1, custom_category 설정
   ├─ compound_ingredients: 약재 구성
   └─ custom_formulas: 맞춤처방 상세정보

3.2.2 직접조제 관리 기능

  1. 템플릿 관리

    • 자주 사용하는 직접조제 템플릿 저장
    • 템플릿에서 빠른 조제 생성
  2. 이력 관리

    • 환자별 직접조제 이력 조회
    • 동일 처방 재조제 기능
  3. 가격 정책

    • 직접조제 유형별 조제료 설정
    • 단품 판매 마진율 관리

3.3 UI/UX 개선

3.3.1 직접조제 입력 화면

┌─────────────── 직접조제 등록 ──────────────┐
│                                            │
│ 조제 유형: [단품 판매 ▼]                    │
│                                            │
│ ─────── 기본 정보 ─────────                │
│ 조제명: [________________]                 │
│ 환자: [환자선택 ▼] 또는 [비회원]            │
│                                            │
│ ─────── 약재 구성 ─────────                │
│ [+ 약재 추가]                              │
│ ┌────────┬──────┬──────┬────┐            │
│ │약재명   │용량   │단가   │삭제 │            │
│ ├────────┼──────┼──────┼────┤            │
│ │홍삼     │100g  │500원/g│ X  │            │
│ └────────┴──────┴──────┴────┘            │
│                                            │
│ ─────── 가격 정보 ─────────                │
│ 약재비: 50,000원                           │
│ 조제료: [10,000원]                         │
│ 판매가: [60,000원]                         │
│                                            │
│ 조제 목적: [________________]               │
│ 비고: [____________________]               │
│                                            │
│ [템플릿 저장] [취소]          [조제 등록]    │
└────────────────────────────────────────────┘

3.3.2 직접조제 목록 화면

[직접조제 관리]

필터: [전체 ▼] [2024-02-01] ~ [2024-02-29] [검색]

┌────┬──────┬────────┬──────┬──────┬────────┬──────┐
│번호│유형   │조제명    │환자   │약재수 │판매가   │작업   │
├────┼──────┼────────┼──────┼──────┼────────┼──────┤
│ 1  │단품   │홍삼100g │홍길동 │  1   │ 60,000 │[상세] │
│ 2  │맞춤   │감기처방  │김철수 │  8   │120,000 │[재조제]│
│ 3  │OTC   │공진단3환 │비회원 │  3   │ 90,000 │[상세] │
│ 4  │샘플   │시음1일분 │이영희 │  5   │      0 │[상세] │
└────┴──────┴────────┴──────┴──────┴────────┴──────┘

3.4 데이터 마이그레이션

3.4.1 기존 데이터 정리

-- formula_id가 NULL인 조제 데이터 업데이트
UPDATE compounds
SET is_custom = 1,
    custom_type = 'custom',
    custom_category = 'SINGLE_ITEM',
    custom_name = (
        SELECT h.herb_name || ' ' || ci.total_grams || 'g'
        FROM compound_ingredients ci
        JOIN herb_items h ON ci.herb_item_id = h.herb_item_id
        WHERE ci.compound_id = compounds.compound_id
        LIMIT 1
    )
WHERE formula_id IS NULL;

3.4.2 데이터 검증

  • 모든 직접조제 데이터의 무결성 확인
  • is_custom 플래그와 formula_id NULL 일치 여부 검증
  • custom_category 분류 정확성 확인

4. API 설계

4.1 직접조제 API

# 직접조제 생성
POST /api/compounds/custom
{
    "patient_id": 1,  # nullable for OTC
    "custom_category": "SINGLE_ITEM",
    "custom_name": "홍삼 100g",
    "custom_purpose": "면역력 증진",
    "ingredients": [
        {
            "herb_item_id": 123,
            "grams": 100,
            "unit_price": 500
        }
    ],
    "dispensing_fee": 10000,
    "sell_price": 60000
}

# 직접조제 템플릿 저장
POST /api/custom-templates
{
    "template_name": "감기 기본방",
    "category": "CUSTOM_FORMULA",
    "ingredients": [...],
    "default_price": 80000
}

# 직접조제 이력 조회
GET /api/compounds/custom?patient_id=1&category=SINGLE_ITEM

# 재조제
POST /api/compounds/{compound_id}/reorder
{
    "patient_id": 1,
    "quantity_multiplier": 1.5  # 1.5배 용량
}

5. 구현 로드맵

Phase 1: 기반 구축 (1주)

  • DB 스키마 수정 (custom_category, custom_name 등 추가)
  • 기존 데이터 마이그레이션
  • 직접조제 분류 체계 구현

Phase 2: 핵심 기능 (2주)

  • 직접조제 생성 UI/API
  • 유형별 입력 폼 구현
  • 가격 자동계산 로직

Phase 3: 관리 기능 (1주)

  • 직접조제 목록/검색
  • 템플릿 관리
  • 재조제 기능

Phase 4: 고도화 (2주)

  • 통계 및 리포트
  • 환자별 구매 패턴 분석
  • 인기 직접조제 랭킹

6. 주의사항

6.1 규제 준수

  • 의약품 판매 관련 법규 확인
  • 처방전 필요 여부 명확히 구분
  • OTC 판매 가능 품목 관리

6.2 데이터 정합성

  • formula_id NULL과 is_custom=1 일치 유지
  • 직접조제는 반드시 custom_category 설정
  • 가격 정보 필수 입력

6.3 사용자 교육

  • 직접조제 유형별 사용 가이드
  • 가격 책정 기준 안내
  • 템플릿 활용 방법

7. 기대 효과

  1. 체계적 관리

    • 직접조제 데이터 일관성 확보
    • 판매 이력 추적 가능
  2. 업무 효율성

    • 템플릿으로 빠른 조제
    • 재조제 간소화
  3. 매출 증대

    • 단품 판매 활성화
    • 맞춤 처방 서비스 확대
  4. 고객 만족

    • 개인 맞춤 서비스
    • 투명한 가격 정책