File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/**
* 공통코드 도메인 — 순수 데이터 표현, 외부 의존 없음.
*
* 백엔드 `TB_SYS_COM_CD`(그룹)와 `TB_SYS_COM_CD_DTL`(상세)의 두 층이며, 둘 다
* `/api/v1/mngr/code/**`(ROLE_ADMIN)로 읽고 쓴다.
*
* 이 파일은 두 종류의 소비자를 함께 섬긴다.
* - 코드관리 화면(SYS_COD_001): 그룹·상세를 편집한다 → `CommonCodeGroup`·`CommonCodeDetail`
* - 다른 화면의 선택지: 상세코드를 `{code,label}`로만 쓴다 → `CommonCode`
*/
/** 선택지로 쓸 때의 최소 표현. 화면이 코드 편집에 관심이 없을 때 쓴다. */
export type CommonCode = {
/** 백엔드 `comDtlCd` — 저장·전송에 쓰는 코드값. */
code: string;
/** 백엔드 `cdNm` — 화면에 보이는 이름. */
label: string;
};
/** 코드 그룹 ID — 화면이 문자열을 직접 적지 않도록 여기 모은다. */
export const CODE_GROUP = {
/** 꾸미기 아이템 카테고리. */
decorationItemCategory: 'ITEM_CATE_CD',
/** 1:1문의 진행상태. */
inquiryAnswerStatus: 'BBS_ANS_CD',
/** FAQ 유형. */
faqType: 'BBS_FAQ_CD',
/** 포인트 지급기준의 「이벤트」 — 기획 "등록된 코드중에서 선택"(사용자 확정). */
pointEvent: 'COM_EVENT_CD',
/** 학교(학교급). */
school: 'COM_SCHUL_CD',
/** 학년. 학교마다 다르므로 `atrbNm`에 학교 코드를 넣어 조회한다. */
grade: 'GRD_CD',
} as const;
/** 값이 없는 항목의 화면 표기. */
export const EMPTY_FIELD_PLACEHOLDER = '-';
/**
* 공통코드(그룹) — 시안의 "공통코드 목록" 한 줄.
*
* `TB_SYS_COM_CD`의 컬럼은 이 셋이 전부다(+감사 컬럼).
*/
export type CommonCodeGroup = {
/** 백엔드 `comCd` — PK이자 화면의 "코드ID". 상세코드를 묶는 키다. */
comCd: string;
/** 백엔드 `cdNm` — 화면의 "코드명". */
name: string;
/** 백엔드 `cdExpln` — 화면의 "코드설명". */
description: string | null;
/** 백엔드 `frstRegDtStr` — `YYYY-MM-DD`. */
createdAt: string | null;
};
/**
* 상세코드 — 시안의 "상세코드 목록" 한 줄.
*
* ⚠️ `description`은 지금 **항상 null이다** — 목록 조회 SQL이 `DTL_CD_EXPLN`을 select하지
* 않는다. 등록 INSERT에서도 빠져 있어 수정으로만 저장된다(Repository 주석 참조).
*/
export type CommonCodeDetail = {
/** 백엔드 `comCd` — 이 상세코드가 속한 그룹. */
comCd: string;
/** 백엔드 `comDtlCd` — 그룹 안에서의 코드값. 화면의 "상세코드ID". */
comDtlCd: string;
/** 백엔드 `cdNm` — 화면의 "상세코드명"이자 등록 팝업의 "코드값의미". */
name: string;
/** 백엔드 `dtlCdExpln`. */
description: string | null;
/** 백엔드 `sortSeq` — 등록 팝업의 "정렬번호"이자 목록의 "번호". */
sortSeq: number;
/** 백엔드 `frstRegDtStr` — `YYYY-MM-DD`. */
createdAt: string | null;
};
export function formatOptionalText(value: string | null | undefined): string {
return value === null || value === undefined || value === ''
? EMPTY_FIELD_PLACEHOLDER
: value;
}
/** 코드값 → 이름. 목록에 없는 코드는 코드값 자체를 보여준다(이름을 지어내지 않는다). */
export function formatCommonCode(
codes: readonly CommonCode[],
code: string
): string {
return codes.find((item) => item.code === code)?.label ?? code;
}
export function isKnownCommonCode(
codes: readonly CommonCode[],
code: string
): boolean {
return codes.some((item) => item.code === code);
}