fix(vacation): bulkUpsert 저장 테이블 통일 (sp_vacation_balances)

vacation_balance_details에 쓰고 sp_vacation_balances에서 읽는
테이블 불일치 수정. 경조사 등 특별휴가 저장 후 반영 안 되던 문제 해결.

- bulkUpsert: vacation_balance_details → sp_vacation_balances
- balance_type 전달: CARRY_OVER, AUTO, LONG_SERVICE, COMPANY_GRANT
- 기존 경조사 데이터 21건 sp_vacation_balances로 마이그레이션

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-31 08:41:55 +09:00
parent b67e8f2c9f
commit 53596ba540
2 changed files with 15 additions and 11 deletions

View File

@@ -213,7 +213,7 @@ const vacationBalanceController = {
let errorCount = 0; let errorCount = 0;
for (const balance of balances) { for (const balance of balances) {
const { user_id, vacation_type_id, year, total_days, notes } = balance; const { user_id, vacation_type_id, year, total_days, notes, balance_type } = balance;
if (!user_id || !vacation_type_id || !year || total_days === undefined) { if (!user_id || !vacation_type_id || !year || total_days === undefined) {
errorCount++; errorCount++;
@@ -221,17 +221,17 @@ const vacationBalanceController = {
} }
try { try {
const btype = balance_type || 'AUTO';
const query = ` const query = `
INSERT INTO vacation_balance_details INSERT INTO sp_vacation_balances
(user_id, vacation_type_id, year, total_days, used_days, notes, created_by) (user_id, vacation_type_id, year, total_days, used_days, notes, created_by, balance_type, expires_at)
VALUES (?, ?, ?, ?, 0, ?, ?) VALUES (?, ?, ?, ?, 0, ?, ?, ?, NULL)
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
total_days = VALUES(total_days), total_days = VALUES(total_days),
notes = VALUES(notes), notes = VALUES(notes)
updated_at = NOW()
`; `;
await db.query(query, [user_id, vacation_type_id, year, total_days, notes || null, created_by]); await db.query(query, [user_id, vacation_type_id, year, total_days, notes || null, created_by, btype]);
successCount++; successCount++;
} catch (err) { } catch (err) {
logger.error('휴가 잔액 저장 오류:', err); logger.error('휴가 잔액 저장 오류:', err);

View File

@@ -829,7 +829,8 @@
user_id: w.user_id, user_id: w.user_id,
vacation_type_id: typeIdMap['CARRYOVER'], vacation_type_id: typeIdMap['CARRYOVER'],
year: currentYear, year: currentYear,
total_days: d.carryover total_days: d.carryover,
balance_type: 'CARRY_OVER'
}); });
} }
if (typeIdMap['ANNUAL']) { if (typeIdMap['ANNUAL']) {
@@ -837,7 +838,8 @@
user_id: w.user_id, user_id: w.user_id,
vacation_type_id: typeIdMap['ANNUAL'], vacation_type_id: typeIdMap['ANNUAL'],
year: currentYear, year: currentYear,
total_days: d.annual total_days: d.annual,
balance_type: 'AUTO'
}); });
} }
if (typeIdMap['LONG_SERVICE']) { if (typeIdMap['LONG_SERVICE']) {
@@ -845,7 +847,8 @@
user_id: w.user_id, user_id: w.user_id,
vacation_type_id: typeIdMap['LONG_SERVICE'], vacation_type_id: typeIdMap['LONG_SERVICE'],
year: currentYear, year: currentYear,
total_days: d.longService total_days: d.longService,
balance_type: 'LONG_SERVICE'
}); });
} }
@@ -883,7 +886,8 @@
vacation_type_id: specialTypeId, vacation_type_id: specialTypeId,
year: currentYear, year: currentYear,
total_days: special.days, total_days: special.days,
notes: special.typeName || special.type notes: special.typeName || special.type,
balance_type: 'COMPANY_GRANT'
}); });
} }
} }