From f4c0df3579a04fa5fc464e6aa9c1267f062e8899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 21 Feb 2026 00:47:05 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[card]=20=EC=B9=B4=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=8B=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=9C=A0?= =?UTF-8?q?=EC=8B=A4=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - || undefined → || null 변환으로 nullable 필드 정상 전송 - 숫자 필드(total_limit, used_amount, remaining_limit) 0 값 전송 보장 - assigned_user_id 항상 전송 (사용자 할당 해제 가능) - paymentDay 타입 변환 수정 (number → string, Select 매칭) --- src/components/hr/CardManagement/actions.ts | 38 ++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/components/hr/CardManagement/actions.ts b/src/components/hr/CardManagement/actions.ts index e1b49f9d..5e799784 100644 --- a/src/components/hr/CardManagement/actions.ts +++ b/src/components/hr/CardManagement/actions.ts @@ -70,7 +70,7 @@ function transformApiToFrontend(apiData: CardApiData): Card { alias: (raw.alias as string) || '', expiryDate: apiData.expiry_date ? apiData.expiry_date.replace('/', '') : '', csv: (raw.csv as string) || '', - paymentDay: (raw.payment_day as string) || '', + paymentDay: raw.payment_day != null ? String(raw.payment_day) : '', pinPrefix: '**', totalLimit: Number(raw.total_limit) || 0, usedAmount: Number(raw.used_amount) || 0, @@ -94,36 +94,42 @@ function transformApiToFrontend(apiData: CardApiData): Card { // Frontend → API 변환 function transformFrontendToApi(data: CardFormData): Record { + // 유효기간: 4자리면 MM/YY 포맷으로 변환, 비어있으면 전송하지 않음 + const formattedExpiry = data.expiryDate.length === 4 + ? `${data.expiryDate.slice(0, 2)}/${data.expiryDate.slice(2)}` + : data.expiryDate; + const apiData: Record = { card_company: data.cardCompany, - card_type: data.cardType || undefined, + card_type: data.cardType || null, card_name: data.cardName, - alias: data.alias || undefined, - expiry_date: data.expiryDate.length === 4 - ? `${data.expiryDate.slice(0, 2)}/${data.expiryDate.slice(2)}` - : data.expiryDate, - csv: data.csv || undefined, - payment_day: data.paymentDay || undefined, - total_limit: data.totalLimit || undefined, - used_amount: data.usedAmount || undefined, - remaining_limit: data.remainingLimit || undefined, + alias: data.alias || null, + csv: data.csv || null, + payment_day: data.paymentDay ? parseInt(data.paymentDay, 10) : null, + total_limit: data.totalLimit, + used_amount: data.usedAmount, + remaining_limit: data.remainingLimit, status: mapFrontendStatusToApi(data.status), - memo: data.memo || undefined, + memo: data.memo || null, + assigned_user_id: data.userId ? parseInt(data.userId, 10) : null, }; + // 유효기간: 값이 있을 때만 전송 (비어있으면 기존 값 유지) + if (formattedExpiry) { + apiData.expiry_date = formattedExpiry; + } + + // 카드번호: 마스킹(*)이 포함되면 전송하지 않음 (기존 값 유지) const cardNumberDigits = data.cardNumber.replace(/-/g, ''); if (cardNumberDigits && !cardNumberDigits.includes('*')) { apiData.card_number = cardNumberDigits; } + // 비밀번호: 변경된 경우만 전송 if (data.pinPrefix && data.pinPrefix !== '**') { apiData.card_password = data.pinPrefix; } - if (data.userId) { - apiData.assigned_user_id = parseInt(data.userId, 10); - } - return apiData; }