- 문제: 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 필드 추가
- 같은 주성분을 가진 모든 제품의 재고 정보를 반환하도록 수정
이제 처방에서 특정 제품이 아닌 주성분을 지정하여
재고가 있는 대체 제품을 자동으로 선택 가능
- 환자 처방 내역 모달에서 처방 행 클릭 시 상세 정보 펼침
- 중첩 모달 문제 해결을 위해 인라인 표시 방식으로 변경
- 구성 약재 정보 테이블 표시 (약재명, 보험코드, 첩당용량, 총용량)
- 재고 소비 내역 테이블 표시 (약재명, 원산지, 도매상, 사용량, 단가, 원가)
- 총 원가 자동 계산 및 표시
- chevron 아이콘으로 펼침/접힘 상태 표시
- 다른 행 클릭 시 자동으로 이전 행 닫기
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- API 응답에서 'data' 대신 'compounds' 사용하도록 수정
- 에러 방지를 위해 기본값 빈 배열 설정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 환자 목록에 처방 횟수 표시 (배지)
- 환자별 처방 내역 조회 버튼 추가
- 환자 처방 내역 모달 추가 (통계 + 상세 내역)
- 총 처방 횟수, 최근 방문일, 총 제수, 총 처방비
- 전체 처방 내역 테이블 (조제일, 처방명, 상태 등)
- 각 처방의 상세 보기 기능 연동
- 환자 개별 조회 API 엔드포인트 추가 (GET /api/patients/<id>)
- 환자 편집 버튼 UI 추가 (기능 준비)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 재고 보정 모달 UI 추가 (약재, 로트, 수량 관리)
- 재고 보정 내역 조회 모달 추가
- 재고 보정 상세 조회 모달 추가
- 자동 델타 계산 기능 (보정 전/후 비교)
- 로트별 재고 선택 및 원산지별 그룹화
- 보정 유형: 감모/손실, 발견, 재고조사, 파손, 유통기한 경과
- API 데이터 형식 수정 (items → details)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 개선사항
- 대시보드에 최근 조제 내역 5건 표시
- 조제일, 환자명, 처방명, 제수, 파우치, 상태 표시
- 상태별 배지 색상 구분
- 조제완료: 녹색
- 출고완료: 파란색
- 취소: 빨간색
이제 대시보드에서 오늘 조제 수와 최근 조제 내역을 한눈에 확인 가능!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 재고 보정 기능
- 재고 보정 테이블 추가 (stock_adjustments, stock_adjustment_details)
- 보정 타입: LOSS(감모), FOUND(발견), RECOUNT(재고조사), DAMAGE(파손), EXPIRE(유통기한)
- 보정 번호 자동 생성: ADJ-YYYYMMDD-XXXX
## API 엔드포인트
- GET /api/stock-adjustments - 보정 내역 조회
- GET /api/stock-adjustments/<id> - 보정 상세 조회
- POST /api/stock-adjustments - 보정 생성
## 재고 원장 연동
- 보정 내역이 stock_ledger에 자동 기록 (ADJUST 타입)
- 입출고 원장에서 보정 내역 필터링 가능
- 참고번호: ADJ-20260215-0001
## 사용자 추적
- created_by 필드로 보정 담당자 기록
- 향후 계정 시스템 연동 준비
한약재 loss 관리 및 재고조사 기능 완비!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 버그 수정
- 약재 필터: 선택한 약재의 입출고 내역만 표시 (API 재호출)
- 타입 필터: 입고/출고/전체 필터링 (클라이언트 사이드)
- 필터 조합 가능 (약재 선택 후 입고만/출고만 보기)
## 구현 방식
- 원본 데이터를 currentLedgerData에 저장
- 타입 필터 변경시 저장된 데이터에서 필터링
- 약재 필터 변경시 새로운 데이터 로드
이제 필터가 정상 작동합니다!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 개선사항
- 출고시 참고번호에 처방명 표시
- 기존: 조제#1
- 변경: 조제#1 (직접조제)
- 처방이 있는 경우: 조제#2 (쌍화탕)
## 표시 형식
- 입고: PR-20260211-0001 (입고장번호)
- 출고(처방전O): RX-2024-001 (쌍화탕)
- 출고(처방전X): 조제#1 (직접조제)
이제 입출고 내역에서 어떤 처방으로 소비되었는지 바로 확인 가능
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 개선사항
- 입고장 번호 형식: PR-YYYYMMDD-XXXX
- 기존 데이터에 입고장 번호 부여 (update_receipt_numbers.py)
- Excel 업로드시 자동으로 입고장 번호 생성
- 재고 원장 참고번호 개선
- 입고: 입고장 번호 (PR-20260211-0001)
- 출고: 처방전 번호 또는 조제#ID
## 확인된 결과
- 오미자 입고: PR-20260211-0001
- 박주호 환자 출고: 조제#1 (처방전 번호 없음)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 처방 관리 (조제) 기능
- compounds API 추가 (목록/상세/환자별 조회)
- 조제 시 자동 재고 차감 (FIFO)
- 조제 내역 UI (EMR 스타일)
- 조제 상세보기 모달 (처방구성, 재고소비내역)
- 오늘/이번달 조제 통계 표시
## 재고 원장 시스템
- stock-ledger API 구현
- 입출고 내역 실시간 추적
- 재고 현황 페이지 개선 (통계 카드 추가)
- 입출고 원장 모달 UI
- 약재별/전체 입출고 내역 조회
## 확인된 동작
- 박주호 환자 오미자 200g 조제
- 재고 2000g → 1800g 정확히 차감
- 모든 입출고 stock_ledger에 기록
🤖 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>
DB 구조 개선:
- 454개 주성분코드 기반 herb_masters 테이블 생성
- 53,769개 제품 데이터를 herb_products 테이블에 임포트
- 128개 업체 정보를 product_companies 테이블에 추가
- 기존 herb_items에 ingredient_code 매핑 (100% 완료)
UI/API 개선:
- 급여 약재 보유 현황 표시 (28/454 = 6.2%)
- 재고 현황에 프로그레스 바 추가
- 주성분코드 기준 통계 API 추가
문서화:
- 데이터베이스 리팩토링 제안서 작성
- 리팩토링 결과 보고서 작성
- 백업 정보 문서화
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Flask 서버 관리 스크립트 (run_server.sh) 추가
- 원산지별 재고 관리 설계 문서 추가
- Flask 프로세스 관리 문서 작성
- 다중 Flask 프로세스 문제 해결 방안 문서화
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
API 개선:
- /api/herbs, /api/inventory/summary에 효능 태그 추가
- 조제 시 원산지 선택 처리 로직 추가
- 원산지별 FIFO 또는 자동 선택 (저렴한 것부터)
UI 개선:
- 재고 목록에 효능 태그 표시 (녹색 배지)
- 처방 선택에 "직접조제" 옵션 추가
- 조제 시 원산지 선택 드롭다운 추가
- JavaScript 주석 블록 오류 수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 누락된 4종 약재 추가 (당귀, 백작약, 인삼, 생강)
- 각 약재별 효능 태그 연결
- 쌍화탕 처방 구성 완료: 총 12종, 1첩 53g
- 스키마 확인 후 올바른 컬럼명 사용 (base_cheop, base_pouches)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- herb_efficacy_tags 테이블 생성 (효능 마스터)
- herb_item_tags 테이블 생성 (약재-효능 다대다 관계)
- 18개 기본 효능 태그 등록 (보혈, 활혈, 보기 등)
- Git 사용 가이드라인 문서 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
✨ 새로운 기능
- 입고장 목록 조회 (날짜/공급업체 필터링)
- 입고장 상세 보기 (모달 팝업)
- 입고장 삭제 (재고 미사용시만 가능)
- 입고장 라인별 수정 API
📊 화면 구성
1. 입고장 목록 테이블
- 입고일, 공급업체, 품목수, 총수량, 총금액
- 상세보기, 삭제 버튼
2. 입고장 필터링
- 시작일/종료일 선택
- 공급업체별 조회
🔧 백엔드 API
- GET /api/purchase-receipts - 입고장 목록
- GET /api/purchase-receipts/<id> - 입고장 상세
- PUT /api/purchase-receipts/<id>/lines/<line_id> - 라인 수정
- DELETE /api/purchase-receipts/<id> - 입고장 삭제
🛡️ 안전장치
- 이미 조제에 사용된 재고는 수정/삭제 불가
- 재고 원장에 모든 변동사항 기록
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
✨ 새로운 기능
- 한의사랑, 한의정보 Excel 형식 자동 감지
- ExcelProcessor 클래스로 형식별 처리 로직 분리
- 각 형식에 맞는 컬럼 매핑 자동 적용
📊 지원하는 Excel 형식
1. 한의사랑 형식
- 품목명, 제품코드, 일그램당단가, 원산지 등
- 단가가 이미 계산된 형식
2. 한의정보 형식
- 제품코드, 업체명, 약재명, 구입일자 등
- 업체명이 포함된 형식
🔧 기술적 변경사항
- excel_processor.py 모듈 추가
- 형식 감지 및 검증 로직 구현
- 표준 형식으로 자동 변환 기능
- 업로드 응답에 상세 요약 정보 추가
✅ 테스트 완료
- 한의사랑 형식 업로드 성공
- 한의정보 형식 업로드 성공
- 각 형식당 28종 약재, 88,000g 처리 확인
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
✨ 주요 기능
- 환자 관리: 환자 등록 및 조회 (이름, 전화번호, 주민번호, 성별)
- 입고 관리: Excel 파일 업로드로 대량 입고 처리
- 처방 관리: 약속 처방 템플릿 등록 및 관리
- 조제 관리: 처방 기반 조제 및 약재 가감 기능
- 재고 관리: 실시간 재고 현황 및 로트별 관리
🛠️ 기술 스택
- Backend: Flask (Python 웹 프레임워크)
- Database: SQLite (경량 관계형 데이터베이스)
- Frontend: Bootstrap + jQuery
- Excel 처리: pandas + openpyxl
🔧 핵심 개념
- 1제 = 20첩 = 30파우치 (기본값)
- FIFO 방식 재고 차감
- 로트별 원산지/단가 관리
- 정확한 조제 원가 계산
📁 프로젝트 구조
- app.py: Flask 백엔드 서버
- database/: 데이터베이스 스키마 및 파일
- templates/: HTML 템플릿
- static/: JavaScript 및 CSS
- sample/: 샘플 Excel 파일
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>