- herb_items 테이블에 product_type, standard_code 컬럼 추가
- POST /api/purchase-receipts/from-cart API 구현 (표준코드 기반 입고)
- 5개 API에 product_type/standard_code 필드 추가
- 프론트엔드 전역 구분 표시: 한약재/OTC 배지, 보험코드/표준코드 구분
- 경방신약 주문 매핑 문서 작성 (38건, 총액 1,561,800원)
- DB 스키마 백업 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- medicine_master.db (305,522행) CSV→SQLite 변환 완료
- get_db()에서 ATTACH DATABASE로 자동 연결
- GET /api/medicine-master/search: 상품명/업체명/표준코드 검색
- GET /api/medicine-master/categories: 전문일반구분별 통계
- config.py에 MEDICINE_MASTER_PATH 추가
- 취소된 제품 자동 필터링, 카테고리 필터 지원
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
원가 미리보기:
- 조제 실행 전 약재별 예상 원가(용량×단가) 및 합계 표시
- 용량/원산지/로트 변경 시 실시간 갱신
- 추가 약재의 이름 표시 오류 수정 (select 내 전체 옵션 텍스트 → 선택값만)
원산지 자동 선택:
- 처방 로드 시 재고 충분한 최저가 원산지를 자동 선택
- "자동 선택" 상태가 아닌 실제 원산지가 선택되어 원가 즉시 계산
재고 상태 표시:
- checkStockForCompound() TODO 제거, 실제 API 호출로 재고 확인
- 기존 원산지 선택을 덮어쓰지 않고 재고 상태만 갱신
- 선택 가능한 원산지가 2개 이상이면 "N종" 뱃지 표시
조제 폼 초기화:
- 새 조제 시 제수 기본값(1)으로 총 첩수(20)/파우치(30) 자동 설정
- 처방 선택 시 총 첩수가 비어있으면 자동 계산
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
한퓨어 엑셀:
- 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>
- 제품 3단계분류.md: 성분→제품→로트 분류 체계, AI display_name 채우기 절차
- reset_operational_data.py: 마스터 보존 + 운영 데이터 초기화
- restore_backup.py: 백업 선택 복원 스크립트
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- official_formulas API에 ingredient_count 추가 (LEFT JOIN COUNT)
- 등록 여부를 백엔드에서 판정 (official_formula_id FK 1차 + 이름 포함 매칭 fallback)
- 내 처방 100처방 뱃지 매칭: startsWith → includes 변경
- 100처방 목록에 구성약재 수 뱃지 컬럼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 처방 관리 페이지에 100처방 원방 마스터 섹션 추가 (검색 포함)
- 100처방 상세 모달 (구성약재, 참고자료 편집, 내 처방으로 등록)
- 내 처방 목록에 100처방 뱃지 및 가감 정보 표시
- 변경: 파란 뱃지, 추가: 초록 뱃지, 제거: 빨간 뱃지
- 원방 그대로: 회색 뱃지
- "어울림" 접두어 초록색 볼드 스타일링
- stock_ledger에 RETURN(반환)/DISCARD(폐기) 한글 라벨 추가
- 수동입고 원산지 드롭다운 변경, 재고 상세 유통기한 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 100처방 마스터 CRUD API (목록조회/수정/구성약재조회)
- 100처방 시드 데이터 100개 처방 로드 (init_db)
- formulas API에 official_formula_id 및 가감(추가/제거/변경) 정보 포함
- create_formula: herb_item_id → ingredient_code 기반으로 수정
- create_formula: official_formula_id 저장 지원
- 조제 취소(CANCELLED) 시 inventory_lots 재고 복원 + stock_ledger RETURN 기록
- 입고장 삭제 시 취소된 조제의 compound_consumptions 정리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- official_formulas, official_formula_ingredients 테이블 스키마 추가
- 100처방 마스터데이터 등록 가이드 (Agent용 절차/규칙/코드 템플릿)
- 한약국 첩제 vs OTC 상담 가이드
- 한약국 AI데이터 기본이해 문서
- 가미패독산 업셀링 칼럼, 입고장 수정기능 구현 문서
- CLAUDE.md에 참고 문서 경로 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수동입고 API (POST /api/purchase-receipts/manual) 추가
- 수동입고 모달 UI 구현 (도매상 선택, 품목 동적 추가, 금액 자동계산)
- 도매상 등록 모달 z-index 처리 (수동입고 모달 위에 표시)
- Excel 입고 시 receipt_date 튜플/대시 없는 날짜 포맷 정규화
- inventory_lots에 lot_number, expiry_date 저장 누락 수정
- CLAUDE.md 추가 (lot_id vs lot_number 구분 가이드)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 전화번호 포맷팅 (010-1234-5678 형식) 전역 적용
- 주민번호 마스킹 포맷팅 (980520-1****** 형식)
- 대시보드에 총 마일리지, 이번달 매출, 마진, 마진율 통계 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- patient_id를 통한 직접 조회로 변경
- /api/patients/search 엔드포인트 추가
- 판매 버튼에 patient_id 데이터 속성 추가
- loadPatientMileage 함수 개선 (patient_id 기반 조회)
이제 박주호 회원의 50,000 마일리지가 판매 모달에서 정상 표시됨
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 환자 편집 버튼 클릭 이벤트 핸들러 추가
- 편집 모드에서 환자 정보 불러오기 구현
- 마일리지 정보 표시 (현재 잔액, 총 적립, 총 사용)
- 환자 정보 수정 API 연동 (PUT 메소드)
- API에 마일리지 정보 포함하도록 수정
- 모달 닫힐 때 폼 초기화 처리
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 환자 목록에 마일리지 잔액 컬럼 추가
- 마일리지가 있는 회원은 돼지저금통 아이콘 표시
- 환자 편집 모달에 마일리지 관리 섹션 추가
- 현재 잔액, 총 적립, 총 사용 표시
- 마일리지 적립/차감 버튼 (추후 구현 예정)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 판매 관리 기능 추가
- 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>
- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동
- 스크린샷을 screenshots/ 폴더로 이동
- 백업 파일 보존 (.backup)
- 처방 관련 추가 스크립트 포함
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- DB: formulas 테이블에 efficacy 칼럼 추가
- API: 처방 생성/수정/조회 시 efficacy 필드 처리
- UI: 처방 등록/수정 모달에 주요 효능 입력 필드 추가
- UI: 처방 상세 화면에 주요 효능 표시
- 기존 처방들의 주요 효능 데이터 입력 완료
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 쌍화탕: 당귀 → 일당귀로 수정
- 월비탕: 진피초 → 진피(陳皮)로 수정
- 십전대보탕: 각 약재별 효능 설명 추가
- 보음보혈, 보혈지통, 대보원기 등 11개 약재 효능 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 월비탕 1차~4차 단계별 처방 추가 (WBT001-1 ~ WBT001-4)
- 삼소음 처방 추가 (SSE001)
- 처방 추가 가이드 문서 작성
- 약재 성분 코드 확인 및 검증 스크립트 추가
월비탕: 단계별 비만치료 처방 (1차~4차)
삼소음: 리기화담, 해표산한 효능의 기침/가래 치료 처방
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 입고장 → 입고 라인 → LOT 생성 프로세스 명시
- inventory_lots 직접 INSERT 금지 규칙
- 재고 계산 모드별 설명
- 데이터베이스 구조 및 흐름도 추가
- 개발 시 주의사항 정리
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 전체 시스템 데이터 흐름 문서 추가
- 테이블 관계 및 JOIN 경로 명확화
- ingredient_code 중심 설계 반영
- claude.md 메인 문서 추가
- 한약재 정보 관리 시스템 설계 문서 개선
주요 내용:
- 코드 체계 (성분코드 vs 보험코드) 설명
- 개선된 JOIN 구조 (5단계 → 3단계)
- 효능 태그 시스템 리팩토링 반영
- 개발 가이드 및 주의사항 포함
- herb_id 대신 ingredient_code 사용 (더 직관적)
- 복잡한 JOIN 체인 제거
Before: items → products → masters → extended → tags (5단계)
After: items → products → tags (3단계)
- 성능 개선 및 코드 가독성 향상
- 모든 API 정상 작동 확인
- herb_item_id ≠ herb_id 문제 해결
- herb_products를 통한 올바른 JOIN 경로 구현
(herb_items → herb_products → herb_masters → herb_master_extended → tags)
- /api/herbs, /api/herbs/masters, /api/inventory/summary 모두 정상 작동
- 감초에 효능 태그 추가 (보기, 청열, 해독, 거담, 항염)
이제 조제 페이지 약재 추가 드롭다운 정상 작동
재고 현황 페이지 정상 표시
- herb_efficacy_tags 테이블 생성 (효능 마스터)
- herb_item_tags 테이블 생성 (약재-효능 다대다 관계)
- 18개 기본 효능 태그 등록 (보혈, 활혈, 보기 등)
- Git 사용 가이드라인 문서 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
문제:
- 원산지 선택에서 "수동 배분" 선택 시 필요량이 0으로 표시
- loadOriginOptions 함수 호출 시점의 requiredQty를 그대로 사용
해결:
- 모달 열기 시점에 현재 행의 실제 필요량 재계산
- gramsPerCheop × cheopTotal로 실시간 계산
- 디버깅 로그 추가로 값 확인 가능
이제 첩수나 용량이 변경된 후에도 정확한 필요량이 모달에 표시됩니다.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
문제:
- 수동 로트 배분 후 remaining_qty를 감소시키지 않아 재고 부족 오류 발생
- 재고 부족 체크를 수동 배분에서 제외했던 임시 처리
해결:
- 수동 로트 배분 시에도 remaining_qty 감소 처리 추가
- 재고 부족 체크를 수동/자동 모두에 적용하도록 복원
- 이제 수동 배분도 정확한 재고 검증 수행
검증 테스트 추가:
- 배분 합계 불일치 시 오류
- 로트 재고 부족 시 오류
- 존재하지 않는 로트 사용 시 오류
이제 수동 로트 배분도 자동 선택과 동일한 수준의 재고 검증을 수행합니다.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 구현 내용
### 1. 백엔드 (app.py)
- 수동 로트 배분 지원 (lot_assignments 배열 처리)
- 각 로트별 지정 수량만큼 재고 차감
- 검증: 배분 합계 확인, 재고 충분 확인
- compound_consumptions 테이블에 각 로트별 소비 기록
### 2. 프론트엔드 (app.js, index.html)
- 로트 배분 모달 UI 구현
- 로트별 재고, 단가 표시
- 수동 입력 및 자동 배분 기능
- 실시간 합계 계산 및 검증
- 원산지 선택에 "수동 배분" 옵션 추가 (로트 2개 이상 시)
- 조제 저장 시 lot_assignments 포함
### 3. 테스트
- 테스트용 당귀 로트 추가 (한국산)
- E2E 테스트 성공
- 당귀 100g을 2개 로트(중국산 60g + 한국산 40g)로 배분
- 각 로트별 재고 정확히 차감
- 소비 내역 올바르게 기록
## 장점
- DB 스키마 변경 없음
- 기존 자동 선택과 호환
- 재고 부족 시 여러 로트 조합 가능
- 원가 최적화 가능
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 문제: ingredient_code 기준 비교 누락으로 인삼 제거가 감지되지 않음
- 인삼(3400H1AHM)은 herb_items에 없어서 herb_item_id 매핑 실패
- 원 처방에만 있고 실제 재고가 없는 약재 처리 불가
- 해결: ingredient_code 기준 비교 로직 추가
- original_by_code 딕셔너리로 원 처방 구성 저장
- actual_by_code 딕셔너리로 실제 조제 구성 저장
- 제거된 약재를 ingredient_code 기준으로 감지
- 조제 상세 모달에 가감방 표시 추가
- 처방명 옆에 "가감" 뱃지 표시
- 변경 내용 요약 표시
- 기존 데이터 업데이트 스크립트 추가
- 십전대보탕에서 인삼 제거 감지 성공
- compound #4를 가감방으로 정상 업데이트
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 프론트엔드: 조제 시 실시간 커스텀 처방 감지
- 처방 선택 시 원래 구성 약재 저장
- 약재 추가/삭제/변경 시 즉시 감지
- 가감방 뱃지 및 변경 내용 표시
- 백엔드: 커스텀 처방 자동 감지 및 저장
- compounds 테이블에 커스텀 관련 필드 추가
- 조제 시 원 처방과 비교하여 변경사항 자동 감지
- 커스텀 처방 정보 저장 (추가/제거/변경된 약재)
- 환자 조제 내역에 커스텀 처방 표시
- 가감방 뱃지 표시
- 변경 내용 상세 표시
- DB 마이그레이션 스크립트 추가
- is_custom, custom_summary, custom_type 필드 추가
- compound_ingredients에 modification_type, original_grams 필드 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- inventory_lots 현황 확인
- supplier_product_catalog 샘플 데이터 추가
- 가격 기반 매칭 테스트
- variant 속성 파싱 로직 검증
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 휴먼허브 약재와 한의사랑 display_name 1:1 매핑
- 29개 품목 완전 매핑 성공
- lot_variants 테이블 자동 업데이트
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 마이페이지 데이터 파싱 및 DB 저장
- supplier_product_catalog 테이블 관리
- 가격 기반 매칭 시도 기능 포함
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 입고 상세 모달에 display_name과 variant 뱃지 표시
- 재고 상세 모달에 품명 컬럼 추가
- 조제 시 원산지 선택에 display_name 표시
- 형태, 가공, 등급 정보를 색상별 뱃지로 구분
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 동일 보험코드 내 세부 제품 구분 방안
- 형태, 가공법, 선별상태, 등급 등 variant 속성 정의
- display_name 활용 방안 및 가격 기반 매칭 전략
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
추가된 파일:
1. reset_purchase_data.py
- 입고 및 관련 데이터 초기화 스크립트
- 조제, 재고, 입고장 데이터 완전 초기화
- 잘못된 herb_items 정리 기능
2. test_improved_import.py
- Excel 보험코드 9자리 패딩 테스트
- 한의사랑/한의정보 형식 처리 확인
3. test_upload_api.py
- API를 통한 Excel 업로드 테스트
- 도매상 생성 및 입고 처리 검증
- 재고 현황 확인
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
추가된 문서:
1. 프로젝트_전체_분석.md
- 시스템 아키텍처 분석
- 디렉토리 구조 정리
- 데이터베이스 설계 상세
- 주요 기능 및 비즈니스 로직
2. 보험코드_매핑_문제_분석.md
- Excel 입고 시 보험코드 처리 문제 분석
- 앞자리 0 누락 문제 원인과 해결방안
- 영향 범위 및 수정 방법
3. 입고_프로세스_개선방안.md
- 성분코드-보험코드 매핑 구조 설명
- 개선된 입고 프로세스 설계
- 성분코드 기준 재고 관리 방법
- 구현 우선순위 및 기대 효과
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
주요 개선사항:
1. 보험코드로 herb_products 테이블에서 자동 정보 조회
- 성분코드(ingredient_code) 자동 매핑
- 회사명(specification) 자동 입력
- 표준 제품명 자동 적용
2. 입고 날짜 처리 버그 수정
- pandas groupby 튜플 문제 해결
- receipt_date 문자열 변환 처리
- 입고번호 정상 생성 (PR-YYYYMMDD-XXXX)
3. 데이터 타입 문제 수정
- total_amount numpy 타입을 float로 변환
- JSON 직렬화 오류 방지
이제 Excel 입고 시 보험코드만으로 모든 정보 자동 입력
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Excel 읽기 시 제품코드를 문자열로 처리하여 앞자리 0 보존
- 한의사랑/한의정보 형식 모두 보험코드 9자리 패딩 적용
- 예: 60600420 → 060600420 자동 변환
이제 Excel 파일의 보험코드가 숫자로 읽혀도 정상 처리됨
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- database_schema.md: 전체 테이블 구조 상세 설명
- 27개 테이블의 컬럼 정의 및 설명
- 테이블 간 관계 설명
- 주요 비즈니스 규칙 문서화
- database_erd.md: ER 다이어그램 및 데이터 플로우
- Mermaid 다이어그램으로 시각화
- 재고 흐름도, 처방-조제 흐름 설명
- 인덱스 전략 및 데이터 무결성 규칙
- api_documentation.md: REST API 상세 명세
- 약재, 처방, 조제, 재고, 환자 관리 API
- 요청/응답 형식 예시
- 에러 처리 방식
- README 업데이트: 문서 링크 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- /api/herbs/by-ingredient API에서 마스터 약재명(herb_masters) 조회 추가
- 제품별 개별명(신흥인삼) 대신 통일된 성분명(인삼) 표시
- product_name 필드에 원래 제품명 보존, herb_name에 마스터명 제공
- 프론트엔드에서 약재명 [회사명] (재고) 형식으로 표시
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- /api/herbs/by-ingredient 엔드포인트에서 specification이 '기타'로 표시되는 문제 수정
- specification 값이 없을 때 '일반'으로 표시
- '세화' 제조사 추가 인식
- 실제 specification 값을 그대로 표시하도록 개선
- 칼럼 헤더 '원산지 선택' → '제품/로트 선택'으로 변경
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 약재 추가 드롭다운에서 제품명 대신 마스터 약재명 표시
- /api/herbs/masters 엔드포인트 사용하여 ingredient_code 기반 약재 목록 로드
- /api/herbs/by-ingredient/<code> 엔드포인트 추가 (제품 목록 조회)
- 2단계 선택 구조: 약재(마스터) → 제품 → 원산지/롯트
- 기존 처방 약재와 새로 추가하는 약재의 테이블 구조 통일 (6칼럼)
- 원산지 선택 칼럼에 제품/원산지 드롭다운 함께 표시
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Playwright를 사용한 E2E 테스트 구현
- 쌍화탕 조제 시 인삼 선택 가능 여부 확인
- 제품 드롭다운과 원산지 드롭다운 동작 테스트
테스트 시나리오:
1. 조제관리 화면 진입
2. 처방 선택 (쌍화탕)
3. 인삼 제품 선택 가능 확인
4. 원산지/로트 선택 가능 확인
- 1단계: 제품 선택 (같은 주성분의 여러 제품 중 선택)
- 2단계: 원산지/로트 선택 (선택한 제품의 원산지별 로트 중 선택)
- formula_ingredients API 응답 구조 변경에 따른 프론트엔드 수정
- available_products 배열 기반 렌더링
- 제품 선택 드롭다운과 원산지 선택 드롭다운 분리
- 제품 변경 시 원산지/로트 옵션 동적 로드
예시:
- 인삼 → 신흥인삼 선택 → [한국산|중국산] 선택 가능
- 인삼 → 세화인삼 선택 → [한국산|미국산] 선택 가능
- formula_ingredients 테이블이 herb_item_id 대신 ingredient_code 사용하도록 변경
- GET /api/formulas/<id>/ingredients API 개선
- ingredient_code 기반 조회로 변경
- available_products 배열 추가 (재고 있는 모든 제품 포함)
- total_available_stock, product_count 필드 추가
- 같은 주성분을 가진 모든 제품의 재고 정보를 반환하도록 수정
이제 처방에서 특정 제품이 아닌 주성분을 지정하여
재고가 있는 대체 제품을 자동으로 선택 가능