-- V22: GA 정산 솔루션의 비즈니스 도메인 확장 (6 카테고리 29개 + 사전 매핑 보강)

INSERT INTO ga.data_domain
(domain_code, domain_name, domain_category, data_type, length, precision, scale,
 format_pattern, validation_regex, example_value, masking_type, encrypted, description, is_active)
VALUES

-- ============================================================
-- AUDIT (감사) — 모든 테이블의 공통 감사 컬럼 표준화
-- ============================================================
('DOM_CREATED_BY',   '등록자 ID',       'AUDIT', 'BIGINT',    NULL, NULL, NULL,
 NULL, NULL, '1001', 'NONE', 'N',
 'users.user_id 참조 (생성한 사용자)', 'Y'),
('DOM_UPDATED_BY',   '수정자 ID',       'AUDIT', 'BIGINT',    NULL, NULL, NULL,
 NULL, NULL, '1001', 'NONE', 'N',
 'users.user_id 참조 (마지막 수정자)', 'Y'),
('DOM_IP_ADDRESS',   'IP 주소',         'AUDIT', 'VARCHAR',   45,   NULL, NULL,
 NULL, '^([0-9]{1,3}\.){3}[0-9]{1,3}$|^([0-9a-fA-F:]+)$', '192.168.0.60', 'NONE', 'N',
 'IPv4(15) 또는 IPv6(45)', 'Y'),
('DOM_USER_AGENT',   '클라이언트 정보', 'AUDIT', 'VARCHAR',   500,  NULL, NULL,
 NULL, NULL, 'Mozilla/5.0 ...', 'NONE', 'N',
 'HTTP User-Agent 헤더', 'Y'),
('DOM_VERSION',      '낙관적 잠금 버전','AUDIT', 'INTEGER',   NULL, NULL, NULL,
 NULL, NULL, '3', 'NONE', 'N',
 '동시 수정 충돌 감지용 (UPDATE 시 +1)', 'Y'),

-- ============================================================
-- WORKFLOW (결재 / 승인)
-- ============================================================
('DOM_APPROVE_STATUS',  '승인 상태',     'WORKFLOW', 'VARCHAR', 20, NULL, NULL,
 NULL, NULL, 'PENDING', 'NONE', 'N',
 'PENDING / APPROVED / REJECTED / CANCELLED', 'Y'),
('DOM_APPROVER_ID',     '승인자 ID',     'WORKFLOW', 'BIGINT',  NULL, NULL, NULL,
 NULL, NULL, '1001', 'NONE', 'N',
 'users.user_id 참조', 'Y'),
('DOM_APPROVE_COMMENT', '승인/반려 사유','WORKFLOW', 'TEXT',    NULL, NULL, NULL,
 NULL, NULL, '예외 사유 검토 후 승인', 'NONE', 'N',
 '결재 메모 (반려 시 필수)', 'Y'),
('DOM_WORKFLOW_STAGE',  '워크플로 단계', 'WORKFLOW', 'VARCHAR', 30, NULL, NULL,
 NULL, NULL, 'REVIEW', 'NONE', 'N',
 'DRAFT / REVIEW / APPROVED / PUBLISHED / ARCHIVED', 'Y'),
('DOM_PRIORITY',        '우선순위',      'WORKFLOW', 'VARCHAR', 10, NULL, NULL,
 NULL, '^(HIGH|MEDIUM|LOW)$', 'HIGH', 'NONE', 'N',
 'HIGH / MEDIUM / LOW', 'Y'),

-- ============================================================
-- SETTLEMENT_BIZ (정산 비즈니스 — GA 솔루션 핵심)
-- ============================================================
('DOM_RECONCILE_STATUS', '대사 상태',         'SETTLEMENT_BIZ', 'VARCHAR', 20, NULL, NULL,
 NULL, NULL, 'MATCH', 'NONE', 'N',
 'PENDING / MATCH / MISMATCH / DIFF', 'Y'),
('DOM_RECONCILE_DIFF',   '대사 차액',         'SETTLEMENT_BIZ', 'DECIMAL', NULL, 15, 2,
 '#,##0', NULL, '12500.00', 'NONE', 'N',
 '보험사 통보액 - 시스템 계산액 (음수 가능)', 'Y'),
('DOM_LAPSE_MONTH',      '실효 경과월',       'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL,
 NULL, '^[0-9]{1,3}$', '13', 'NONE', 'N',
 '계약 효력일~실효일 사이 개월 수 (환수 규정 매칭)', 'Y'),
('DOM_INSTALLMENT_SEQ',  '분할 회차',         'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL,
 NULL, NULL, '2', 'NONE', 'N',
 '환수 분할 시 N차 (1~installment_total)', 'Y'),
('DOM_INSTALLMENT_TOTAL','분할 총 회차',      'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL,
 NULL, NULL, '6', 'NONE', 'N',
 '환수 분할 총 회차 (보통 1/3/6/12)', 'Y'),
('DOM_PERFORMANCE_GRADE','실적 등급',         'SETTLEMENT_BIZ', 'VARCHAR', 10, NULL, NULL,
 NULL, '^[A-F]$|^GOLD$|^SILVER$|^BRONZE$', 'A', 'NONE', 'N',
 'A/B/C/D/F 또는 GOLD/SILVER/BRONZE — 지급율 차등', 'Y'),

-- ============================================================
-- FILE (파일 / 첨부)
-- ============================================================
('DOM_FILE_ID',     '파일 ID',     'FILE', 'BIGINT',  NULL, NULL, NULL,
 NULL, NULL, '12345', 'NONE', 'N',
 'file_storage.file_id 참조', 'Y'),
('DOM_FILE_PATH',   '파일 경로',   'FILE', 'VARCHAR', 500, NULL, NULL,
 NULL, NULL, '/upload/2026/05/abc.pdf', 'NONE', 'N',
 '서버 저장 경로 (또는 S3 키)', 'Y'),
('DOM_FILE_SIZE',   '파일 크기',   'FILE', 'BIGINT',  NULL, NULL, NULL,
 NULL, NULL, '1048576', 'NONE', 'N',
 '바이트 단위 (1MB = 1048576)', 'Y'),
('DOM_MIME_TYPE',   'MIME 타입',   'FILE', 'VARCHAR', 100, NULL, NULL,
 NULL, NULL, 'application/pdf', 'NONE', 'N',
 'application/pdf, image/png 등', 'Y'),

-- ============================================================
-- TAX (세무)
-- ============================================================
('DOM_TAX_INVOICE_NO', '세금계산서 번호', 'TAX', 'VARCHAR',  50,  NULL, NULL,
 NULL, NULL, '202605-00123', 'NONE', 'N',
 '국세청 발행 번호 또는 내부 일련번호', 'Y'),
('DOM_VAT',           '부가세',          'TAX', 'DECIMAL',  NULL, 15,   2,
 '#,##0', NULL, '300000.00', 'NONE', 'N',
 '부가가치세 (10%)', 'Y'),
('DOM_INCOME_TAX',    '소득세',          'TAX', 'DECIMAL',  NULL, 15,   2,
 '#,##0', NULL, '99000.00', 'NONE', 'N',
 '원천징수 소득세 (3%)', 'Y'),
('DOM_LOCAL_TAX',     '지방세',          'TAX', 'DECIMAL',  NULL, 15,   2,
 '#,##0', NULL, '9900.00', 'NONE', 'N',
 '지방소득세 (소득세의 10%)', 'Y'),

-- ============================================================
-- BANKING (은행 / 결제)
-- ============================================================
('DOM_TRANSFER_REF', '이체 참조번호',   'BANKING', 'VARCHAR', 50,  NULL, NULL,
 NULL, NULL, 'TRX-20260510-0001', 'NONE', 'N',
 '은행/PG 측 이체 추적 번호', 'Y'),
('DOM_TRANSFER_FEE', '이체 수수료',     'BANKING', 'DECIMAL', NULL, 15, 2,
 '#,##0', NULL, '500.00', 'NONE', 'N',
 '건당 이체 수수료 (지급액에서 차감 가능)', 'Y'),
('DOM_CURRENCY',     '통화 코드',       'BANKING', 'CHAR',    3,   NULL, NULL,
 NULL, '^[A-Z]{3}$', 'KRW', 'NONE', 'N',
 'ISO 4217 (KRW / USD / EUR / JPY)', 'Y'),
('DOM_FX_RATE',      '환율',            'BANKING', 'DECIMAL', NULL, 15, 6,
 '#,##0.000000', NULL, '1350.123456', 'NONE', 'N',
 '기준 통화 → 거래 통화 (소수점 6자리)', 'Y'),
('DOM_SWIFT_CODE',   'SWIFT BIC',       'BANKING', 'VARCHAR', 11,  NULL, NULL,
 NULL, '^[A-Z]{6}[A-Z0-9]{2,5}$', 'KOEXKRSE', 'NONE', 'N',
 '국제 송금용 은행 식별 코드', 'Y')

ON CONFLICT (domain_code) DO NOTHING;


-- ============================================================
-- 데이터 사전 매핑 보강 (V20 / V21 누락분 + 신규 매핑)
-- ============================================================
INSERT INTO ga.data_dictionary
(table_name, column_name, domain_code, column_label, is_pk, is_fk, fk_reference, is_required, description)
VALUES
-- exception_ledger 핵심
('exception_ledger', 'ledger_id',       'DOM_ID_BIGINT',      '원장ID',    'Y', 'N', NULL, 'Y', NULL),
('exception_ledger', 'agent_id',        'DOM_ID_BIGINT',      '설계사ID',  'N', 'Y', 'agent.agent_id', 'Y', NULL),
('exception_ledger', 'exception_code',  'DOM_STATUS',         '예외코드',  'N', 'Y', 'exception_type_code.exception_code', 'Y', NULL),
('exception_ledger', 'amount',          'DOM_AMOUNT',         '금액',      'N', 'N', NULL, 'Y', NULL),
('exception_ledger', 'settle_month',    'DOM_SETTLE_MONTH',   '정산월',    'N', 'N', NULL, 'Y', NULL),
('exception_ledger', 'approve_status',  'DOM_APPROVE_STATUS', '승인상태',  'N', 'N', NULL, 'Y', 'PENDING/APPROVED/REJECTED'),
('exception_ledger', 'approver_id',     'DOM_APPROVER_ID',    '승인자',    'N', 'Y', 'users.user_id', 'N', NULL),
('exception_ledger', 'approve_date',    'DOM_DATETIME',       '승인일시',  'N', 'N', NULL, 'N', NULL),

-- chargeback 핵심
('chargeback', 'cb_id',             'DOM_ID_BIGINT',      '환수ID',     'Y', 'N', NULL, 'Y', NULL),
('chargeback', 'agent_id',          'DOM_ID_BIGINT',      '설계사ID',   'N', 'Y', 'agent.agent_id', 'Y', NULL),
('chargeback', 'lapse_month',       'DOM_LAPSE_MONTH',    '실효경과월', 'N', 'N', NULL, 'Y', NULL),
('chargeback', 'cb_rate',           'DOM_RATE_PCT',       '환수율',     'N', 'N', NULL, 'Y', NULL),
('chargeback', 'cb_amount',         'DOM_COMMISSION',     '환수금액',   'N', 'N', NULL, 'Y', NULL),
('chargeback', 'current_installment','DOM_INSTALLMENT_SEQ','분할회차',  'N', 'N', NULL, 'N', NULL),
('chargeback', 'settle_month',      'DOM_SETTLE_MONTH',   '정산월',     'N', 'N', NULL, 'Y', NULL),

-- reconciliation
('reconciliation', 'recon_id',       'DOM_ID_BIGINT',         '대사ID',     'Y', 'N', NULL, 'Y', NULL),
('reconciliation', 'company_code',   'DOM_COMPANY_CODE',      '보험사',     'N', 'N', NULL, 'Y', NULL),
('reconciliation', 'settle_month',   'DOM_SETTLE_MONTH',      '정산월',     'N', 'N', NULL, 'Y', NULL),
('reconciliation', 'company_amount', 'DOM_AMOUNT',            '보험사통보액','N','N', NULL, 'Y', NULL),
('reconciliation', 'system_amount',  'DOM_AMOUNT',            '시스템계산액','N','N', NULL, 'Y', NULL),
('reconciliation', 'diff_amount',    'DOM_RECONCILE_DIFF',    '차액',       'N', 'N', NULL, 'Y', NULL),
('reconciliation', 'status',         'DOM_RECONCILE_STATUS',  '대사상태',   'N', 'N', NULL, 'Y', NULL),

-- batch_job_log
('batch_job_log', 'job_id',         'DOM_ID_BIGINT',  '배치ID',    'Y', 'N', NULL, 'Y', NULL),
('batch_job_log', 'batch_id',       'DOM_BATCH_ID',   '배치코드',  'N', 'N', NULL, 'Y', 'monthlySettlementJob 등'),
('batch_job_log', 'settle_month',   'DOM_SETTLE_MONTH','정산월',   'N', 'N', NULL, 'N', NULL),
('batch_job_log', 'status',         'DOM_STATUS',     '상태',      'N', 'N', NULL, 'Y', 'REQUESTED/RUNNING/COMPLETED/FAILED'),
('batch_job_log', 'started_at',     'DOM_DATETIME',   '시작일시',  'N', 'N', NULL, 'N', NULL),
('batch_job_log', 'finished_at',    'DOM_DATETIME',   '종료일시',  'N', 'N', NULL, 'N', NULL),

-- file_storage
('file_storage', 'file_id',        'DOM_FILE_ID',      '파일ID',     'Y', 'N', NULL, 'Y', NULL),
('file_storage', 'original_name',  'DOM_TEXT_SHORT',   '원본파일명', 'N', 'N', NULL, 'Y', NULL),
('file_storage', 'stored_name',    'DOM_TEXT_SHORT',   '저장파일명', 'N', 'N', NULL, 'Y', NULL),
('file_storage', 'file_path',      'DOM_FILE_PATH',    '파일경로',   'N', 'N', NULL, 'Y', NULL),
('file_storage', 'file_size',      'DOM_FILE_SIZE',    '파일크기',   'N', 'N', NULL, 'N', NULL),
('file_storage', 'mime_type',      'DOM_MIME_TYPE',    'MIME타입',   'N', 'N', NULL, 'N', NULL),

-- api_access_log
('api_access_log', 'log_id',          'DOM_ID_BIGINT',     '로그ID',    'Y', 'N', NULL, 'Y', NULL),
('api_access_log', 'user_id',         'DOM_ID_BIGINT',     '사용자ID',  'N', 'Y', 'users.user_id', 'N', NULL),
('api_access_log', 'request_url',     'DOM_TEXT_SHORT',    '요청URL',   'N', 'N', NULL, 'Y', NULL),
('api_access_log', 'response_status', 'DOM_ID_BIGINT',     'HTTP상태',  'N', 'N', NULL, 'N', NULL),
('api_access_log', 'response_time',   'DOM_ID_BIGINT',     '응답시간',  'N', 'N', NULL, 'N', '단위: ms'),
('api_access_log', 'ip_address',      'DOM_IP_ADDRESS',    'IP',        'N', 'N', NULL, 'N', NULL),

-- data_change_log
('data_change_log', 'log_id',       'DOM_ID_BIGINT',  '로그ID',     'Y', 'N', NULL, 'Y', NULL),
('data_change_log', 'table_name',   'DOM_TEXT_SHORT', '테이블명',   'N', 'N', NULL, 'Y', NULL),
('data_change_log', 'record_id',    'DOM_TEXT_SHORT', 'PK',         'N', 'N', NULL, 'N', NULL),
('data_change_log', 'action_type',  'DOM_STATUS',     '액션',       'N', 'N', NULL, 'Y', 'CREATE/UPDATE/DELETE'),
('data_change_log', 'change_data',  'DOM_JSONB',      '변경 데이터','N', 'N', NULL, 'N', 'before/after JSON'),
('data_change_log', 'user_id',      'DOM_ID_BIGINT',  '사용자ID',   'N', 'Y', 'users.user_id', 'N', NULL),

-- 모든 정산/원장 테이블의 created_by/updated_by 매핑 (감사 표준화)
('recruit_ledger',  'created_at', 'DOM_DATETIME',   '등록일시',  'N', 'N', NULL, 'Y', NULL),
('recruit_ledger',  'updated_at', 'DOM_DATETIME',   '수정일시',  'N', 'N', NULL, 'N', NULL),
('maintain_ledger', 'created_at', 'DOM_DATETIME',   '등록일시',  'N', 'N', NULL, 'Y', NULL),
('maintain_ledger', 'updated_at', 'DOM_DATETIME',   '수정일시',  'N', 'N', NULL, 'N', NULL),
('settle_master',   'confirmed_by','DOM_APPROVER_ID','확정자',   'N', 'Y', 'users.user_id', 'N', NULL),
('settle_master',   'confirmed_at','DOM_DATETIME',  '확정일시',  'N', 'N', NULL, 'N', NULL)

ON CONFLICT (table_name, column_name) DO NOTHING;
