docs: 알리미팜 세트상품 DB 구조 문서화

- CD_ITEM_UNIT_MEMBER 테이블 (세트 바코드)
- CD_item_set 테이블 (세트 구성품)
- 바코드 조회 쿼리 예시
- 마진 계산 시 구성품 분해 필요 안내
This commit is contained in:
thug0bin 2026-02-27 12:36:17 +09:00
parent 1b78704ca6
commit f3fa4707ac

View File

@ -0,0 +1,186 @@
# 알리미팜 세트 상품 구조 (PIT3000)
> 작성일: 2026-02-27
> 약국: 양구청춘약국
## 개요
PIT3000(팜잇3000) DB는 세트 상품을 기본적으로 잘 처리하지 못하게 설계되어 있다.
하지만 알리미팜에서는 세트 상품을 등록하고 **자체 바코드**를 생성하여 사용한다.
이 문서는 세트 상품의 DB 구조와 바코드 조회 방법을 정리한 참고 문서이다.
---
## 테이블 구조
### 1. CD_GOODS (기본 상품 테이블)
```
Database: PM_DRUG
Table: CD_GOODS
```
| 컬럼 | 설명 |
|------|------|
| DrugCode | 상품 코드 (PK) |
| GoodsName | 상품명 |
| BARCODE | **바코드** (세트상품은 대부분 비어있음!) |
| SplName | 공급업체 |
| Saleprice | 판매가 |
| Price | 매입가 |
⚠️ **주의**: 세트 상품의 경우 `BARCODE` 컬럼이 비어있는 경우가 많음!
---
### 2. CD_ITEM_UNIT_MEMBER (단위/바코드 확장 테이블) ⭐
```
Database: PM_DRUG
Table: CD_ITEM_UNIT_MEMBER
```
| 컬럼 | 설명 |
|------|------|
| DRUGCODE | 상품 코드 (FK → CD_GOODS.DrugCode) |
| CD_CD_UNIT | 단위 코드 |
| CD_NM_UNIT | 단위 수량 |
| CD_MY_UNIT | 판매가 |
| CD_IN_UNIT | 매입가 |
| **CD_CD_BARCODE** | **세트상품 바코드** ⭐ |
| CD_CD_POS | POS 코드 |
| CHANGE_DATE | 변경일 |
**핵심**: 세트 상품/자체 등록 상품의 바코드는 이 테이블의 `CD_CD_BARCODE`에 저장됨!
---
### 3. CD_item_set (세트 구성품 테이블)
```
Database: PM_DRUG
Table: CD_item_set
```
| 컬럼 | 설명 |
|------|------|
| SetCode | 세트 상품 코드 (FK → CD_GOODS.DrugCode) |
| DrugCode | 구성품 코드 ('SET0000' = 헤더, 그 외 = 구성품) |
| CD_NM_UNIT | 구성품 수량 |
**구조 예시 (투엑스벤포파워 LB000003181):**
```
SetCode | DrugCode | CD_NM_UNIT
--------------|---------------|------------
LB000003181 | SET0000 | NULL ← 세트 헤더
LB000003181 | LB000003324 | 1.0 ← 구성품 1
LB000003181 | LB000001423 | 1.0 ← 구성품 2 (벤포파워Z)
LB000003181 | LB000001412 | 1.0 ← 구성품 3
```
---
### 4. CD_item_pack / CD_ITEM_PACK_UNIT
```
Database: PM_DRUG
```
포장 단위 관련 테이블. 굿팜/알리미팜 처리 방식이 다를 수 있음.
---
## 바코드 조회 쿼리
### 세트 상품 바코드까지 포함한 조회
```sql
SELECT
S.DrugCode,
G.GoodsName,
-- CD_GOODS.BARCODE가 없으면 CD_ITEM_UNIT_MEMBER.CD_CD_BARCODE 사용
COALESCE(NULLIF(G.BARCODE, ''), U.CD_CD_BARCODE, '') as barcode
FROM SALE_SUB S
LEFT JOIN PM_DRUG.dbo.CD_GOODS G ON S.DrugCode = G.DrugCode
OUTER APPLY (
SELECT TOP 1 CD_CD_BARCODE
FROM PM_DRUG.dbo.CD_ITEM_UNIT_MEMBER
WHERE DRUGCODE = S.DrugCode
AND CD_CD_BARCODE IS NOT NULL
AND CD_CD_BARCODE != ''
) U
```
---
## 세트 상품 바코드 패턴
| 패턴 | 설명 |
|------|------|
| `999XXXXXXXXX` | 알리미팜 자체 생성 바코드 (세트/자체등록) |
| `880XXXXXXXXX` | 일반 제조사 바코드 |
예시:
- `9990000001101` - 투엑스벤포파워 (세트상품)
- `8806418067510` - 벤포파워Z (일반상품)
---
## ⚠️ 마진 계산 시 주의사항
### 세트 상품 마진 계산의 복잡성
세트 상품의 **실제 마진**을 계산하려면 **구성품을 물고 들어가서** 각 구성품의 매입가를 합산해야 한다!
```
세트 판매가: 9,000원
세트 매입가(CD_GOODS.Price): 3,300원 ← 이건 정확하지 않을 수 있음!
실제 계산 필요:
├── 구성품1 매입가: 1,500원
├── 구성품2 매입가: 1,200원
└── 구성품3 매입가: 800원
────────────────────
실제 매입가 합계: 3,500원
실제 마진: 9,000 - 3,500 = 5,500원
```
### 마진 계산 쿼리 예시 (향후 개발용)
```sql
-- 세트 상품의 실제 매입가 계산
SELECT
S.SetCode,
G1.GoodsName as set_name,
G1.Saleprice as set_sale_price,
SUM(G2.Price * S.CD_NM_UNIT) as actual_cost
FROM CD_item_set S
JOIN CD_GOODS G1 ON S.SetCode = G1.DrugCode
JOIN CD_GOODS G2 ON S.DrugCode = G2.DrugCode
WHERE S.DrugCode != 'SET0000' -- 헤더 제외
GROUP BY S.SetCode, G1.GoodsName, G1.Saleprice
```
---
## 관련 테이블 요약
| 테이블 | 데이터베이스 | 용도 |
|--------|-------------|------|
| CD_GOODS | PM_DRUG | 기본 상품 정보 |
| CD_ITEM_UNIT_MEMBER | PM_DRUG | 단위별 바코드 (세트 바코드 저장) |
| CD_item_set | PM_DRUG | 세트 구성품 매핑 |
| CD_item_pack | PM_DRUG | 포장 단위 |
| CD_BARCODE | PM_DRUG | 표준코드 매핑 |
| SALE_SUB | PM_PRES | 판매 상세 |
| SALE_MAIN | PM_PRES | 판매 헤더 |
---
## 히스토리
| 날짜 | 내용 |
|------|------|
| 2026-02-27 | 세트상품 바코드 조회 문제 해결 (`CD_ITEM_UNIT_MEMBER` 연동) |
| 2026-02-27 | 바코드 매핑률 89.8% → 99.8% 개선 |
---
## 참고
- PIT3000 DB 서버: `192.168.0.4\PM2014`
- 굿팜 vs 알리미팜: 세트 처리 방식이 다를 수 있음 (확인 필요)