-- 공통코드. 진행단계·처리결과·공공누리유형 같은 선택지를 소스가 아니라 데이터로 관리한다.
--
-- 저장값(code)은 지금 각 업무 테이블에 들어 있는 한글 문자열을 그대로 쓴다. 영문 코드키로
-- 바꾸면 기존 데이터를 전부 변환해야 하고 엑셀 업로드/다운로드 양식까지 손봐야 해서,
-- 위험 대비 실익이 없다. 진행단계만 예외로 숫자 문자열이며 organization.stage는 smallint 유지.

create table code_group (
    group_id   varchar(50)  primary key,
    group_name varchar(100) not null,
    description text,
    -- 관리 화면에서 코드 추가·삭제를 허용할지. 로직과 강하게 묶인 그룹(STAGE 등)은 false로 두고
    -- 표시명·순서만 바꾸게 한다. 단계 추가는 마이그레이션으로 한다.
    editable   boolean      not null default true
);

create table code (
    group_id   varchar(50)  not null references code_group(group_id),
    -- 저장값. review_item.review_minor가 varchar(300)이라 그 길이에 맞춘다.
    code       varchar(300) not null,
    -- 화면 표시명. 저장값과 다를 수 있다 - 권리확인 세부항목은 저장값이
    -- '2. 후천적 권리 전부 보유(계약서 확인 필요)'인데 화면에는 짧은 형태로 나온다.
    label      varchar(200) not null,
    sort_order int          not null,
    active     boolean      not null default true,
    -- 코드별 부가 속성. 값만 담고 동작은 담지 않는다 - 동작까지 밀어넣으면
    -- DB 안에 규칙 언어를 새로 만드는 꼴이 되어 오히려 읽기 어려워진다.
    attrs      jsonb        not null default '{}'::jsonb,
    primary key (group_id, code)
);

create index idx_code_group_sort on code (group_id, sort_order);
