Files
ga-commission-system/ga-common/src/main/resources/db/migration/V1__조직_인사.sql
T
GA Pro cef4e48e27 feat: project skeleton + DB migrations V1-V12 + ga-common framework
- Gradle multi-module: ga-common, ga-core, ga-api, ga-batch, ga-admin
- Flyway V1-V12: org/product/rule/receive/ledger/settle/batch/code/menu/system + seed
- ga-common (complete):
  - model: ApiResponse, PageResponse, SearchParam, TreeNode
  - exception: ErrorCode, BizException, GlobalExceptionHandler
  - annotation + aop: @RequirePermission, @DataChangeLog, ApiLog
  - auth + security: JWT, SecurityConfig
  - mybatis: BaseMapper, EncryptTypeHandler, JsonTypeHandler, AuditInterceptor
  - code (Redis cached) / menu (RBAC tree) / file / system / notification
  - excel: SXSSF+Cursor export, SAX+batch import (1M/700K rows)
  - util: Date/Money/Mask/Encrypt/Security
2026-05-09 21:29:18 +09:00

68 lines
2.6 KiB
SQL

-- V1: 조직 / 인사 (직급, 조직, 설계사, 이력)
CREATE TABLE grade (
grade_id SERIAL PRIMARY KEY,
grade_name VARCHAR(50) NOT NULL,
grade_level INT NOT NULL,
grade_group VARCHAR(20),
description VARCHAR(200),
is_active CHAR(1) NOT NULL DEFAULT 'Y',
sort_order INT NOT NULL DEFAULT 0
);
COMMENT ON TABLE grade IS '직급';
CREATE TABLE organization (
org_id SERIAL PRIMARY KEY,
parent_org_id BIGINT REFERENCES organization(org_id),
org_name VARCHAR(100) NOT NULL,
org_type VARCHAR(10) NOT NULL, -- HQ / BR / TM
org_level INT NOT NULL,
region VARCHAR(50),
effective_from DATE NOT NULL,
effective_to DATE,
is_active CHAR(1) NOT NULL DEFAULT 'Y',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP,
created_by BIGINT
);
COMMENT ON TABLE organization IS '조직';
CREATE INDEX idx_org_parent ON organization(parent_org_id);
CREATE INDEX idx_org_type ON organization(org_type, is_active);
CREATE TABLE agent (
agent_id SERIAL PRIMARY KEY,
org_id BIGINT NOT NULL REFERENCES organization(org_id),
grade_id BIGINT NOT NULL REFERENCES grade(grade_id),
agent_name VARCHAR(50) NOT NULL,
resident_no VARCHAR(200), -- AES 암호화
license_no VARCHAR(50),
phone VARCHAR(20),
email VARCHAR(100),
bank_code VARCHAR(10),
account_no VARCHAR(200), -- AES 암호화
status VARCHAR(10) NOT NULL DEFAULT 'ACTIVE', -- ACTIVE / LEAVE / SUSPEND
join_date DATE,
leave_date DATE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP
);
COMMENT ON TABLE agent IS '설계사';
CREATE INDEX idx_agent_org ON agent(org_id, status);
CREATE INDEX idx_agent_lic ON agent(license_no);
CREATE INDEX idx_agent_status ON agent(status);
CREATE TABLE agent_org_history (
history_id SERIAL PRIMARY KEY,
agent_id BIGINT NOT NULL REFERENCES agent(agent_id),
from_org_id BIGINT,
to_org_id BIGINT,
from_grade_id BIGINT,
to_grade_id BIGINT,
change_type VARCHAR(20) NOT NULL, -- TRANSFER / PROMOTE / DEMOTE / JOIN / LEAVE
change_date DATE NOT NULL,
change_reason VARCHAR(200),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by BIGINT
);
CREATE INDEX idx_aoh_agent ON agent_org_history(agent_id, change_date);