주문관리 그리드 V1 컬럼 보강(제품구분·국내해외·접수일) + wace 1:1 검증 문서·자동 검증 SQL

- getList SQL: 라인 집계에 product_summary 추가, PRODUCT_NAME을 COALESCE(line, header)로 변경 (운영 contract_mgmt.product NULL 패턴 대응)
- GRID_COLUMNS 3개 추가: 제품구분/국내해외/접수일 (wace 27/27 일치)
- OrderRow 타입: product_name / area_name 보강
- searchForm.search_partName 키 추가(초기화 포함, UI 이미 PartSelect mode=partName 존재)
- docs/migration/sales/02-order-verify.md: wace ↔ RPS 항목 매핑 / 운영 데이터 / 갭 처리 결과
- scripts/verify-order.sql: BEGIN/ROLLBACK 4개 시나리오 (그리드 V1 / G1 / 수주취소 / 채번) 자동 검증

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hjjeong
2026-05-11 09:35:11 +09:00
parent 12ea68616d
commit 13b4efd2fe
5 changed files with 255 additions and 4 deletions
+135
View File
@@ -0,0 +1,135 @@
-- ============================================================
-- 주문관리 자동 검증 SQL (BEGIN/ROLLBACK 시나리오)
-- 사용법:
-- PGPASSWORD='vexplor0909!!' psql -h 211.115.91.141 -p 11134 -U postgres \
-- -d vexplor_rps -f scripts/verify-order.sql
-- ============================================================
\echo ''
\echo '================== Order 검증 시작 =================='
-- ─────────────────────────────────────────────────────────
-- [0] 사전 카운트
-- ─────────────────────────────────────────────────────────
\echo ''
\echo '[0] 사전 카운트 ============================'
SELECT 'contract_mgmt 전체' AS tbl, COUNT(*) FROM contract_mgmt
UNION ALL SELECT 'contract_result 수주(0000964)', COUNT(*) FROM contract_mgmt WHERE contract_result='0000964'
UNION ALL SELECT 'contract_result 수주FCST(0000968)', COUNT(*) FROM contract_mgmt WHERE contract_result='0000968'
UNION ALL SELECT 'project_mgmt', COUNT(*) FROM project_mgmt;
-- ─────────────────────────────────────────────────────────
-- [1] 그리드 V1 컬럼 (제품구분/국내해외/접수일/수주상태) 검증
-- ─────────────────────────────────────────────────────────
\echo ''
\echo '[1] 그리드 V1 컬럼 정합성 검증 =========================='
SELECT
T.contract_no,
CC_RES.code_name AS contract_result_name,
COALESCE(CI_AGG.product_summary, CC_PRD.code_name) AS product_name,
CC_AREA.code_name AS area_name,
T.receipt_date,
T.order_date,
COALESCE(CI_AGG.order_quantity_sum, 0) AS order_qty,
COALESCE(CI_AGG.cancel_qty_sum, 0) AS cancel_qty
FROM contract_mgmt T
LEFT JOIN comm_code CC_PRD ON CC_PRD.code_id = T.product AND CC_PRD.status='active'
LEFT JOIN comm_code CC_AREA ON CC_AREA.code_id = T.area_cd AND CC_AREA.status='active'
LEFT JOIN comm_code CC_RES ON CC_RES.code_id = T.contract_result AND CC_RES.status='active'
LEFT JOIN (
SELECT CI.contract_objid,
STRING_AGG(DISTINCT CC_PRDI.code_name, ', ') FILTER (WHERE CC_PRDI.code_name IS NOT NULL) AS product_summary,
COALESCE(SUM(CAST(REPLACE(NULLIF(CI.order_quantity, ''), ',', '') AS NUMERIC)), 0) AS order_quantity_sum,
COALESCE(SUM(CASE WHEN CI.cancel_qty IS NOT NULL AND CI.cancel_qty != '' AND CI.cancel_qty != '0'
THEN CAST(CI.cancel_qty AS NUMERIC) END), 0) AS cancel_qty_sum
FROM contract_item CI
LEFT JOIN comm_code CC_PRDI ON CC_PRDI.code_id = CI.product AND CC_PRDI.status='active'
WHERE CI.status='ACTIVE'
GROUP BY CI.contract_objid
) CI_AGG ON CI_AGG.contract_objid = T.objid
WHERE T.contract_no IN ('26C-0801','26C-0797','26C-0796','26C-0795','26C-0788','26C-0791')
ORDER BY T.contract_no DESC;
-- ─────────────────────────────────────────────────────────
-- [2] 수주확정 G1 — updateStatus 트랜잭션
-- ─────────────────────────────────────────────────────────
\echo ''
\echo '[2] 수주확정 G1 시나리오 =========================='
BEGIN;
\echo ' → BEFORE project_mgmt:'
SELECT COUNT(*) AS before_cnt FROM project_mgmt;
-- 26C-0795(견적단계, contract_result NULL)를 수주(0000964)로 전환
UPDATE contract_mgmt SET contract_result='0000964', chg_user_id='admin'
WHERE contract_no='26C-0795';
-- project_mgmt INSERT 시뮬레이션 (createProjectsFromContract 흐름 일부)
WITH meta AS (
SELECT
CASE CC_CAT.code_name WHEN '수리' THEN 'R' WHEN '판매' THEN 'S' ELSE 'T' END AS cat_abbr,
CASE CC_PRDI.code_name WHEN 'C/T' THEN 'CT' WHEN 'A/S' THEN 'AS' WHEN '기타' THEN '기타' ELSE COALESCE(CC_PRDI.code_name,'X') END AS prd_abbr,
TO_CHAR(CURRENT_DATE, 'YYMMDD') AS ymd,
CI.objid AS item_objid, CI.part_objid, CI.part_no, CI.part_name, CI.quantity, CI.product
FROM contract_item CI
LEFT JOIN comm_code CC_PRDI ON CC_PRDI.code_id = CI.product AND CC_PRDI.status='active'
CROSS JOIN comm_code CC_CAT
WHERE CI.contract_objid IN (SELECT objid FROM contract_mgmt WHERE contract_no='26C-0795')
AND CI.status='ACTIVE'
AND CC_CAT.code_id IN (SELECT category_cd FROM contract_mgmt WHERE contract_no='26C-0795')
AND CC_CAT.status='active'
)
SELECT '예상 project_no (line별)' AS info,
m.cat_abbr || '-' || m.prd_abbr || '-' || m.ymd || '-' ||
LPAD(COALESCE((SELECT MAX(SUBSTRING(project_no FROM '\d{3}$')::int) + 1
FROM project_mgmt
WHERE project_no LIKE m.cat_abbr || '-' || m.prd_abbr || '-' || m.ymd || '-%'), 1)::text, 3, '0')
AS expected_project_no,
m.part_no, m.quantity
FROM meta m;
ROLLBACK;
\echo ' → ROLLBACK 완료'
-- ─────────────────────────────────────────────────────────
-- [3] 수주취소 시나리오 (cancel_qty 다중 UPDATE)
-- ─────────────────────────────────────────────────────────
\echo ''
\echo '[3] 수주취소 시나리오 =========================='
BEGIN;
\echo ' → BEFORE 26C-0797 contract_result:'
SELECT contract_no, contract_result FROM contract_mgmt WHERE contract_no='26C-0797';
UPDATE contract_item SET cancel_qty='1', chgdate=NOW(), chg_user_id='admin'
WHERE contract_objid=(SELECT objid FROM contract_mgmt WHERE contract_no='26C-0797')
AND status='ACTIVE';
\echo ' → AFTER 라인 cancel_qty (1 이상이면 성공):'
SELECT objid, quantity, cancel_qty FROM contract_item
WHERE contract_objid=(SELECT objid FROM contract_mgmt WHERE contract_no='26C-0797')
AND status='ACTIVE';
\echo ' → contract_result 미변경 확인:'
SELECT contract_no, contract_result FROM contract_mgmt WHERE contract_no='26C-0797';
ROLLBACK;
\echo ' → ROLLBACK 완료'
-- ─────────────────────────────────────────────────────────
-- [4] 채번 룰 — 다음 contract_no
-- ─────────────────────────────────────────────────────────
\echo ''
\echo '[4] 채번 룰 검증 =========================='
SELECT '다음 contract_no' AS info,
'26C-' || LPAD(
(COALESCE((SELECT MAX(SUBSTRING(contract_no FROM '\d{4}$')::int)
FROM contract_mgmt WHERE contract_no LIKE '26C-%'), 0) + 1)::text, 4, '0') AS next_no;
\echo ''
\echo '================== Order 검증 끝 (모두 ROLLBACK) =================='