# 알리미팜 세트 상품 구조 (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 알리미팜: 세트 처리 방식이 다를 수 있음 (확인 필요)
