From 434e7783a962789f670b39fbbac061c4eaf10039 Mon Sep 17 00:00:00 2001 From: GA Pro Date: Wed, 13 May 2026 00:41:23 +0900 Subject: [PATCH] =?UTF-8?q?feat(db):=20V27=20=EB=B6=84=EA=B8=89=20?= =?UTF-8?q?=EA=B3=84=ED=9A=8D=20+=20=EB=B6=84=EA=B8=89=20=EB=B9=84?= =?UTF-8?q?=EC=9C=A8=20=EB=A7=88=EC=8A=A4=ED=84=B0=20(=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20P1-2-a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 도메인 P1 두번째 항목 — 분급(installment_plan). DB 스키마/데이터만. 신규 테이블: - installment_ratio (분급 비율 마스터, effective_from/to 이력 추적) - installment_plan (계약별 분급 계획) 기본 비율 데이터 (2024-01-01, NULL=ALL): - 1차년 35%, 2차년 25%, 3차년 15%, 4차년 10%, 5차년 7%, 6차년 5%, 7차년 3% (합 100%) - 시기/상품별 정책 변경 시 새 effective_from 추가 installment_plan 핵심: - (contract_id, plan_year, plan_month) UNIQUE - payment_id로 실제 지급 시 역참조 - status: SCHEDULED/PAID/DEFERRED/CANCELLED 인덱스: - installment_plan (contract_id, plan_year, plan_month) 계약별 조회 - (settle_month, status) 월별 지급 예정 조회 - (payment_id) payment 역참조 - installment_ratio (product_category, plan_year, effective_from DESC) --- .../resources/db/migration/V27__분급계획.sql | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 ga-common/src/main/resources/db/migration/V27__분급계획.sql diff --git a/ga-common/src/main/resources/db/migration/V27__분급계획.sql b/ga-common/src/main/resources/db/migration/V27__분급계획.sql new file mode 100644 index 0000000..9e50c32 --- /dev/null +++ b/ga-common/src/main/resources/db/migration/V27__분급계획.sql @@ -0,0 +1,77 @@ +-- V27: 분급 계획 (installment_ratio, installment_plan, 공통코드) + +-- ============================================================ +-- 1. installment_ratio — 분급 비율 마스터 (개정 이력 추적) +-- ============================================================ + +CREATE TABLE installment_ratio ( + ratio_id BIGSERIAL PRIMARY KEY, + product_category VARCHAR(30), -- NULL = ALL 상품 + plan_year INT NOT NULL, -- 1~7 + ratio_percent NUMERIC(5,2) NOT NULL, + effective_from DATE NOT NULL, + effective_to DATE, -- NULL = 현재 유효 + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + created_by BIGINT, + updated_at TIMESTAMP, + updated_by BIGINT, + UNIQUE (product_category, plan_year, effective_from) +); + +CREATE INDEX idx_ir_category_year ON installment_ratio(product_category, plan_year, effective_from DESC); + +-- ============================================================ +-- 2. installment_plan — 계약별 분급 계획 +-- ============================================================ + +CREATE TABLE installment_plan ( + plan_id BIGSERIAL PRIMARY KEY, + contract_id BIGINT NOT NULL REFERENCES contract(contract_id), + plan_year INT NOT NULL, -- 1~7 + plan_month INT NOT NULL, -- 1~12 + settle_month CHAR(6), -- YYYYMM, 지급 예정월 + expected_amount NUMERIC(15,2) NOT NULL, + paid_amount NUMERIC(15,2) NOT NULL DEFAULT 0, + paid_at TIMESTAMP, + payment_id BIGINT REFERENCES payment(payment_id), + status VARCHAR(20) NOT NULL DEFAULT 'SCHEDULED', + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + created_by BIGINT, + updated_at TIMESTAMP, + updated_by BIGINT, + UNIQUE (contract_id, plan_year, plan_month) +); + +CREATE INDEX idx_ip_contract ON installment_plan(contract_id, plan_year, plan_month); +CREATE INDEX idx_ip_settle ON installment_plan(settle_month, status); +CREATE INDEX idx_ip_payment ON installment_plan(payment_id); + +-- ============================================================ +-- 3. 기본 분급 비율 데이터 (2024-01-01, NULL=ALL 상품) +-- ============================================================ + +INSERT INTO installment_ratio (product_category, plan_year, ratio_percent, effective_from) VALUES + (NULL, 1, 35, '2024-01-01'), + (NULL, 2, 25, '2024-01-01'), + (NULL, 3, 15, '2024-01-01'), + (NULL, 4, 10, '2024-01-01'), + (NULL, 5, 7, '2024-01-01'), + (NULL, 6, 5, '2024-01-01'), + (NULL, 7, 3, '2024-01-01') +ON CONFLICT (product_category, plan_year, effective_from) DO NOTHING; + +-- ============================================================ +-- 4. 공통코드 INSTALLMENT_STATUS +-- ============================================================ + +INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES + ('INSTALLMENT_STATUS', '분급상태', 'SCHEDULED/PAID/DEFERRED/CANCELLED', 'Y', 280) +ON CONFLICT (group_code) DO NOTHING; + +INSERT INTO common_code (group_code, code, code_name, code_desc, sort_order) VALUES + ('INSTALLMENT_STATUS', 'SCHEDULED', '지급예정', '분급 지급 예정 상태', 10), + ('INSTALLMENT_STATUS', 'PAID', '지급완료', '분급 지급 완료', 20), + ('INSTALLMENT_STATUS', 'DEFERRED', '이월', '당월 미지급 — 다음 월로 이월', 30), + ('INSTALLMENT_STATUS', 'CANCELLED', '취소', '분급 계획 취소', 40) +ON CONFLICT (group_code, code) DO NOTHING;