feat(db): V25 수수료 명세서 스키마 + 코드그룹 (도메인 P0-3-a)

도메인 P0 마지막 항목 — 수수료 명세서. DB 스키마/데이터만.

신규 테이블 commission_statement:
- agent_id + settle_month + statement_type 유니크
- 발급 시점 집계 스냅샷 (gross/incomeTax/localTax/vat/deduction/net)
- 파일 경로/포맷/발급 상태
- 재발급은 PUT으로 row 갱신 (이력 분리보다 최신본 단순 관리)

코드그룹:
- STATEMENT_TYPE: MONTHLY(월별), ANNUAL(연간 누계), PROOF(소득증빙)
- STATEMENT_STATUS: GENERATED, SENT, DOWNLOADED, CANCELLED

인덱스:
- (agent_id, settle_month, statement_type DESC) 설계사 조회용
- (issued_at DESC) 최근 발급 조회용
This commit is contained in:
GA Pro
2026-05-13 00:20:50 +09:00
parent b8f33f13d1
commit 930335ce3f
@@ -0,0 +1,61 @@
-- V25: 수수료 명세서 (commission_statement, 공통코드)
-- ============================================================
-- 1. commission_statement — 명세서 발급 마스터
--
-- 재발급 정책: UNIQUE(agent_id, settle_month, statement_type) 유지.
-- 재발급은 기존 row를 PUT으로 갱신(issued_at, file_path 등 업데이트)
-- — 재발급 빈도가 낮고 명세서 이력 추적보다 최신본이 중요하기 때문.
-- ============================================================
CREATE TABLE commission_statement (
statement_id BIGSERIAL PRIMARY KEY,
agent_id BIGINT NOT NULL REFERENCES agent(agent_id),
settle_month CHAR(6) NOT NULL,
statement_type VARCHAR(20) NOT NULL,
-- 발급 시점 집계 스냅샷 (동결값)
gross_amount NUMERIC(15,2) NOT NULL,
income_tax_amount NUMERIC(15,2) NOT NULL,
local_tax_amount NUMERIC(15,2) NOT NULL,
vat_amount NUMERIC(15,2) NOT NULL DEFAULT 0,
deduction_amount NUMERIC(15,2) NOT NULL DEFAULT 0,
net_amount NUMERIC(15,2) NOT NULL,
-- 발급 정보
issued_at TIMESTAMP NOT NULL,
issued_by VARCHAR(50),
file_path VARCHAR(500),
file_format VARCHAR(10),
issue_status VARCHAR(20) NOT NULL DEFAULT 'GENERATED',
-- 감사 4종
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by BIGINT,
updated_at TIMESTAMP,
updated_by BIGINT,
UNIQUE (agent_id, settle_month, statement_type)
);
CREATE INDEX idx_cs_agent_month ON commission_statement(agent_id, settle_month, statement_type DESC);
CREATE INDEX idx_cs_issued_at ON commission_statement(issued_at DESC);
-- ============================================================
-- 2. 공통코드 그룹 STATEMENT_TYPE / STATEMENT_STATUS 추가
-- ============================================================
INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES
('STATEMENT_TYPE', '명세서유형', 'MONTHLY/ANNUAL/PROOF', 'Y', 230),
('STATEMENT_STATUS', '명세서상태', 'GENERATED/SENT/DOWNLOADED/CANCELLED', 'Y', 240)
ON CONFLICT (group_code) DO NOTHING;
INSERT INTO common_code (group_code, code, code_name, code_desc, sort_order) VALUES
('STATEMENT_TYPE', 'MONTHLY', '월별', '월별 수수료 명세서', 10),
('STATEMENT_TYPE', 'ANNUAL', '연간누계', '연간 수수료 누계 명세서', 20),
('STATEMENT_TYPE', 'PROOF', '소득증빙', '소득증빙용 발급 명세서', 30),
('STATEMENT_STATUS', 'GENERATED', '생성됨', '명세서 파일 생성 완료', 10),
('STATEMENT_STATUS', 'SENT', '발송', '이메일 등으로 발송 완료', 20),
('STATEMENT_STATUS', 'DOWNLOADED', '다운로드됨', '설계사 다운로드 확인', 30),
('STATEMENT_STATUS', 'CANCELLED', '취소', '명세서 취소 처리', 40)
ON CONFLICT (group_code, code) DO NOTHING;