/** * 백엔드 `TB_COM_VOUCHER`(`/api/v1/mngr/voc/**`) 한 행. 필드 이름이 화면 용어와 달라 * Repository가 옮긴다 — `frcsNo`=코드, `frcsNm`=가맹점명, `brno`=사업자번호, * `rprsvNm`=대표자명, `rprsvTelno`=전화번호, `frcsPostAddr`/`frcsDaddr`=주소/상세주소. */ export interface Merchant { id: string; /** `frcsNo` — 서버가 만든다. 수정 불가(기획 MCH_003_p ①). */ code: string; /** * 아래 넷은 백엔드 `TB_COM_VOUCHER`에 컬럼이 없어 **항상 빈 값**이다. 기획 시안에 있는 * 항목이라 화면에서는 지우지 않고 값이 없을 때 `-`로 보여준다(사용자 확정). */ brandName: string; memo: string; createdAt: string; updatedAt: string; name: string; categoryCode: string; businessNumber: string; ownerName: string; phoneNumber: string; address: string; addressDetail: string; postalCode: string; latitude: string; longitude: string; /** * 조회 응답에 `useYn`이 없다 — 목록 SQL의 SELECT 목록에도 `MngrVocVo`에도 없고 검색 조건 * (`searchUseYn`)에만 쓰인다. 그래서 **모르는 값이 정상**이라 `null`을 둔다(위 넷과 같은 이유). */ isVisible: boolean | null; } export const EMPTY_FIELD_PLACEHOLDER = '-'; export function formatOptionalValue( value: string | number | null | undefined ): string { return value === null || value === undefined || value === '' ? EMPTY_FIELD_PLACEHOLDER : String(value); } /** * 업종 — 기획 MCH_002_p ②. * * TODO(기획): "제공받을 수 없는 데이터라면 추후 삭제 필요"로 적혀 있다. 코드표가 정해지면 * 공통코드 조회로 바꾼다. */ export const MERCHANT_CATEGORY_OPTIONS: ReadonlyArray<{ value: string; label: string; }> = [ { value: 'CONVENIENCE', label: '편의점' }, { value: 'CAFE', label: '카페' }, { value: 'RESTAURANT', label: '음식점' }, { value: 'BOOKSTORE', label: '서점' }, { value: 'STATIONERY', label: '문구점' }, { value: 'ETC', label: '기타' }, ]; export function formatCategoryLabel(code: string): string { if (!code) { return EMPTY_FIELD_PLACEHOLDER; } return ( MERCHANT_CATEGORY_OPTIONS.find((option) => option.value === code)?.label ?? code ); } export function formatVisibilityLabel(isVisible: boolean | null): string { if (isVisible === null) { return EMPTY_FIELD_PLACEHOLDER; } return isVisible ? '노출' : '미노출'; } /** 목록의 주소 칸 — 상세주소까지 붙이면 한 줄을 넘겨 표가 밀린다. */ export function formatAddressSummary(merchant: Merchant): string { return formatOptionalValue(merchant.address); } /** * 업종 코드 ↔ 백엔드 필드. * * 이슈: 백엔드가 저장은 `FRCS_TPBIZ_CD`로 받고 조회·검색은 `FRCS_DV_CD`로 한다. 두 컬럼을 * 모두 select하므로 화면은 조회 쪽(`frcsDvCd`)을 읽고, 저장할 때는 요청 VO에 있는 이름을 쓴다. */ export const MERCHANT_CATEGORY_READ_FIELD = 'frcsDvCd'; export const MERCHANT_CATEGORY_WRITE_FIELD = 'frcsTpbizCd';