import { formatCommonCode, type CommonCode } from '@/lib/domain/common-code'; /** * 백엔드 `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; /** 백엔드 `frcsBzstatCd` — 업태 코드(`FRCS_BZSTAT_CD`). */ businessStatusCode: string; /** 백엔드 `frcsDvCd` — 가맹점 구분(`FRCS_DV_CD`). */ divisionCode: string; /** 백엔드 `useYn`. develop 목록엔 없어 `null`(모름)이고 feature/voc부터 온다. */ isVisible: boolean | null; } /** 가맹몰 등록·수정 폼이 쓰는 코드표 넷 — 화면이 한 번에 받아 모달까지 내려보낸다. */ export type MerchantCodeTables = { /** 업종 이름 찾기용(`FRCS_TPBIZ_CD` 다음 `FRCS_CD`) — 옛 행의 4자리 값까지 이름을 낸다. */ business: CommonCode[]; /** 업종 선택지 — `FRCS_TPBIZ_CD`(2자리)만. 4자리 `FRCS_CD`는 업종+업태를 이어 붙인 것이라 저장값이 아니다. */ businessOptions: CommonCode[]; businessStatus: CommonCode[]; division: CommonCode[]; bank: CommonCode[]; }; /** 가맹점 구분 기본값 — 관리자가 만드는 가맹점은 일반가맹점이다. */ export const DEFAULT_MERCHANT_DIVISION_CODE = '62'; 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); } /** 업종 이름 — 공통코드 `FRCS_TPBIZ_CD`에서 먼저, 없으면 `FRCS_CD`(4자리)에서 찾고, 그래도 없으면 코드를 그대로 보인다. */ export function formatCategoryLabel(codes: readonly CommonCode[], code: string): string { if (!code) { return EMPTY_FIELD_PLACEHOLDER; } return formatCommonCode(codes, 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`(BizPlay 업종코드)다. * `FRCS_DV_CD`는 가맹점 구분(온라인/일반)이라 업종이 아니다. * * 이슈: 목록 검색만 `searchFrcsTpbizCd`를 `FRCS_DV_CD`와 비교한다(보고함). */ export const MERCHANT_CATEGORY_READ_FIELD = 'frcsTpbizCd'; export const MERCHANT_CATEGORY_WRITE_FIELD = 'frcsTpbizCd';