임동욱 임동욱 09-18
fix: 가맹몰 등록 요청을 DB 저장으로 바뀐 백엔드(1703ce8)에 맞춘다
업종 선택지는 FRCS_TPBIZ_CD(2자리)만 — 4자리 FRCS_CD는 업종+업태를 이어 붙인 표시용이라 저장값이
아니다. 연락처는 BizPlay 행처럼 숫자만 보낸다. 백엔드가 BizPlay 위임을 끊고 TB_COM_VOUCHER에
직접 넣게 된 것과 수정 VO에 frcsNo가 빠진 결함을 문서에 적는다.

Co-Authored-By: Claude Fable 5.1 
@cda1115d8aa7f3d84968242ec5e0e327a83ad36e
app/(protected)/(basic)/system/merchants/_components/merchant-form-modal.tsx
--- app/(protected)/(basic)/system/merchants/_components/merchant-form-modal.tsx
+++ app/(protected)/(basic)/system/merchants/_components/merchant-form-modal.tsx
@@ -187,7 +187,7 @@
               size="md"
               label="업종"
               requirement="required"
-              options={codeTables.business.map((code) => ({ value: code.code, label: code.label }))}
+              options={codeTables.businessOptions.map((code) => ({ value: code.code, label: code.label }))}
               value={categoryCode}
               onValueChange={setCategoryCode}
               placeholder="선택"
app/(protected)/(basic)/system/merchants/page.tsx
--- app/(protected)/(basic)/system/merchants/page.tsx
+++ app/(protected)/(basic)/system/merchants/page.tsx
@@ -33,6 +33,7 @@
   const codeTables: MerchantCodeTables = {
     // 앞쪽 표가 먼저 맞는다 — 2자리 값은 FRCS_TPBIZ_CD에서, 4자리 값은 FRCS_CD에서 이름을 찾는다.
     business: [...business, ...businessDetail],
+    businessOptions: business,
     businessStatus,
     division,
     bank,
lib/data/repositories/merchant-repository.ts
--- lib/data/repositories/merchant-repository.ts
+++ lib/data/repositories/merchant-repository.ts
@@ -14,14 +14,17 @@
  *
  * ```
  * GET  /api/v1/mngr/voc/pagination   searchCondition 1=가맹점명 2=사업자번호 3=상세주소
- * POST /api/v1/mngr/voc              @RequestBody MngrVocInsertReqVo
- * PUT  /api/v1/mngr/voc              @RequestBody MngrVocUpdateReqVo (BaseVo + chgDvCd)
+ * POST /api/v1/mngr/voc              @RequestBody MngrVocInsertReqVo → TB_COM_VOUCHER INSERT (1703ce8)
+ * PUT  /api/v1/mngr/voc              @RequestBody MngrVocUpdateReqVo → UPDATE … WHERE FRCS_NO
  * ```
  *
+ * 등록은 1703ce8부터 우리 DB에 바로 들어간다 — 코드는 서버가 `TEST` + 8자리로 채번하고 좌표는 카카오
+ * 지오코딩으로 채운다. 응답에 코드가 없어(`data: null`) 호출부는 목록에서 이름·연락처로 찾는다.
+ * 예금주·은행·계좌는 `MngrVocVo`에 없어 버려진다(테이블에 컬럼 없음).
+ *
  * ⚠️ 백엔드 현황(보고함)
- * 1. 등록·수정은 아직 BizPlay(웹캐시) 가맹점 API로 위임된다(1c7b0e0). 우리 DB에 저장하도록
- *    바뀔 예정(사용자 공지)이라 요청은 그 VO 그대로 보내고, 응답에서 `frcsNo`가 오면 읽고 없으면
- *    가맹점 목록에서 찾는다. 위임 상태에선 새 가맹점이 다음 날 동기화 뒤에야 목록에 나타난다.
+ * 1. 수정 요청 VO(`MngrVocUpdateReqVo`)에 `frcsNo`가 없어 UPDATE가 `WHERE FRCS_NO = NULL`로 아무 행도
+ *    바꾸지 않고 성공으로 답한다 — VO에 `frcsNo` 한 줄이 필요하다. 프론트는 이미 싣고 있다.
  * 2. **삭제·단건 조회 API가 없다.**
  * 3. 검색 필터가 어긋난다 — 업종 검색 파라미터는 `searchFrcsTpbizCd`인데 SQL은 `FRCS_DV_CD`를
  *    비교하고, 저장은 `frcsTpbizCd`로 받는다. 저장한 업종으로 검색이 걸리지 않는다.
@@ -179,7 +182,8 @@
   return {
     frcsNm: values.name,
     rprsvNm: values.ownerName,
-    rprsvTelno: values.phoneNumber,
+    // BizPlay가 채운 행과 같은 모양(숫자만)으로 — 화면은 formatPhoneNumber가 다시 붙인다.
+    rprsvTelno: values.phoneNumber.replace(/-/g, ''),
     brno: values.businessNumber.replace(/-/g, ''),
     bankDpstrNm: values.bankHolderName,
     dpstBankCd: values.bankCode,
lib/domain/merchant.ts
--- lib/domain/merchant.ts
+++ lib/domain/merchant.ts
@@ -36,8 +36,10 @@
 
 /** 가맹몰 등록·수정 폼이 쓰는 코드표 넷 — 화면이 한 번에 받아 모달까지 내려보낸다. */
 export type MerchantCodeTables = {
-  /** 업종(`FRCS_TPBIZ_CD` 다음 `FRCS_CD`). */
+  /** 업종 이름 찾기용(`FRCS_TPBIZ_CD` 다음 `FRCS_CD`) — 옛 행의 4자리 값까지 이름을 낸다. */
   business: CommonCode[];
+  /** 업종 선택지 — `FRCS_TPBIZ_CD`(2자리)만. 4자리 `FRCS_CD`는 업종+업태를 이어 붙인 것이라 저장값이 아니다. */
+  businessOptions: CommonCode[];
   businessStatus: CommonCode[];
   division: CommonCode[];
   bank: CommonCode[];
Add a comment
List