13b4efd2fe
- 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>
136 lines
7.1 KiB
PL/PgSQL
136 lines
7.1 KiB
PL/PgSQL
-- ============================================================
|
|
-- 주문관리 자동 검증 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) =================='
|