# 04. 매출관리 wace 1:1 검증

> 작성: 2026-05-11 / 사이클: 구조적 검증 4차 (매출관리 메뉴)
> 원본: `wace_plm/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp`
> 대상: `app/(main)/COMPANY_16/sales/revenue/page.tsx`
> 핵심 필터: `EXISTS (sales_registration WHERE shipping_date IS NOT NULL)` — 출하등록된 프로젝트만

## 1. 그리드 컬럼 — wace 활성 35개 vs RPS 35개 (보강 후 일치)

| # | wace title | RPS GRID_COLUMNS | 상태 |
|---|---|---|---|
| 1 | 프로젝트번호 (frozen) | `project_no` | ✅ |
| 2 | 주문유형 | `order_type_name` | ✅ |
| 3 | 매출마감 | `sales_deadline_date` | ✅ |
| 4 | 발주일 | `order_date` | ✅ |
| 5 | 발주번호 | `po_no` | ✅ |
| 6 | 고객사 | `customer` | ✅ |
| 7 | 제품구분 | `product_type_name` | ✅ |
| 8 | 품명 | `product_name` | ✅ |
| 9 | 수량 | `sales_quantity` | ✅ |
| 10 | 단가 | `sales_unit_price` | ✅ |
| 11 | 공급가액 | `sales_supply_price` | ✅ |
| 12 | 부가세 | `sales_vat` | ✅ |
| 13 | 총액 | `sales_total_amount` | ✅ |
| 14 | 원화총액 | `sales_total_amount_krw` | ✅ |
| 15 | 출하일 | `shipping_date` | ✅ |
| 16 | 국내/해외 | `nation_name` | ✅ |
| 17 | 환종 | `sales_currency_name` | ✅ |
| 18 | 환율 | `sales_exchange_rate` | ✅ |
| 19 | S/N | `serial_no` | ✅ |
| 20 | 분할S/N | `split_serial_no` | ✅ (placeholder) |
| 21 | 품번 | `product_no` | ✅ |
| 22 | 과세구분 | `tax_type` | ✅ |
| 23 | 세금계산서발행일 | `tax_invoice_date` | ✅ |
| 24 | 수출신고필증신고번호 | `export_decl_no` | ✅ |
| 25 | 선적일자 | `loading_date` | ✅ |
| 26 | 거래명세서 | `has_transaction_statement` | ✅ (placeholder) |
| 27 | **접수일** | `receipt_date` | ✅ (신규) |
| 28 | **유/무상** | `payment_type_name` | ✅ (신규) |
| 29 | **요청납기** | `request_date` | ✅ (신규) |
| 30 | **고객사요청사항** | `customer_request` | ✅ (신규) |
| 31 | **수주상태** | `order_status_name` | ✅ (신규) |
| 32 | **주문서첨부** | `cu01_cnt` (clip) | ✅ (신규, attach_file_info LATERAL JOIN) |
| 33 | **출하방법** | `shipping_method` | ✅ (신규) |
| 34 | **담당자** | `manager_name` | ✅ (신규) |
| 35 | **인도조건** | `incoterms` | ✅ (신규) |

## 2. SQL 보강

```
-- 추가된 JOIN
LEFT JOIN contract_item CI ON CI.objid = T.contract_item_objid AND CI.status='ACTIVE'  -- request_date COALESCE 위해
LEFT JOIN user_info U_MGR  ON U_MGR.user_id = SR.manager_user_id                       -- manager_name
LEFT JOIN comm_code CC_RES ON CC_RES.code_id = T.contract_result AND CC_RES.status='active'  -- order_status_name
LEFT JOIN (
  SELECT target_objid, COUNT(*) FILTER (WHERE doc_type IN ('FTC_ORDER','ORDER')) AS cu01_cnt
  FROM attach_file_info WHERE UPPER(status)='ACTIVE' GROUP BY target_objid
) AF ON AF.target_objid = T.contract_objid                                              -- cu01_cnt
```

## 3. 갭 처리

| # | 갭 | 처리 |
|---|---|---|
| **R1** | 그리드 9개 누락 | ✅ 본 커밋에서 추가 |
| **R2** | request_date / order_status_name / manager_name / cu01_cnt SELECT 누락 | ✅ JOIN 추가 |
| R3 | 분할S/N / 거래명세서 실데이터 | 🟡 백로그 |
| R4 | 매출관리 그리드 운영 0건 (sales_registration.shipping_date IS NOT NULL 0건) | 🟢 데이터 이슈 — 출하등록 흐름 신설 시 자연 해소 |

## 4. 자동 검증 결과 (`scripts/verify-revenue.sql`)

운영 sales_registration.shipping_date 0건이라 매출관리 본 필터로는 0 rows. SQL 컬럼 정합성은 필터 해제 샘플로 검증 — 9개 신규 컬럼 모두 정상 반환.

## 5. 결론

매출관리 메뉴 wace 운영 화면과 1:1 정합 (35/35 컬럼). 영업 4개 메뉴 (견적·주문·판매·매출) **모두 구조적 검증 1차 종결**.
