fix: [card] 카드 수정 시 데이터 유실 문제 해결

- || undefined → || null 변환으로 nullable 필드 정상 전송
- 숫자 필드(total_limit, used_amount, remaining_limit) 0 값 전송 보장
- assigned_user_id 항상 전송 (사용자 할당 해제 가능)
- paymentDay 타입 변환 수정 (number → string, Select 매칭)
This commit is contained in:
김보곤
2026-02-21 00:47:05 +09:00
parent aa9404a146
commit f4c0df3579

View File

@@ -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<string, unknown> {
// 유효기간: 4자리면 MM/YY 포맷으로 변환, 비어있으면 전송하지 않음
const formattedExpiry = data.expiryDate.length === 4
? `${data.expiryDate.slice(0, 2)}/${data.expiryDate.slice(2)}`
: data.expiryDate;
const apiData: Record<string, unknown> = {
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;
}