diff --git a/system1-factory/api/db/migrations/20260331_fix_deduct_days_precision.sql b/system1-factory/api/db/migrations/20260331_fix_deduct_days_precision.sql index 37bf5b9..052bef2 100644 --- a/system1-factory/api/db/migrations/20260331_fix_deduct_days_precision.sql +++ b/system1-factory/api/db/migrations/20260331_fix_deduct_days_precision.sql @@ -2,3 +2,8 @@ -- 0.25(반반차)가 0.3으로 반올림되는 문제 해결 ALTER TABLE vacation_types MODIFY deduct_days DECIMAL(4,2) DEFAULT 1.00; UPDATE vacation_types SET deduct_days = 0.25 WHERE type_code = 'ANNUAL_QUARTER'; +-- type_code가 표준 유형인데 balance_type이 COMPANY_GRANT인 잘못된 레코드 삭제 +DELETE svb FROM sp_vacation_balances svb +JOIN vacation_types vt ON svb.vacation_type_id = vt.id +WHERE svb.balance_type = 'COMPANY_GRANT' + AND vt.type_code IN ('CARRYOVER', 'LONG_SERVICE', 'ANNUAL_FULL', 'ANNUAL_HALF', 'ANNUAL_QUARTER'); diff --git a/system1-factory/web/pages/attendance/annual-overview.html b/system1-factory/web/pages/attendance/annual-overview.html index 8b621c5..0094fc3 100644 --- a/system1-factory/web/pages/attendance/annual-overview.html +++ b/system1-factory/web/pages/attendance/annual-overview.html @@ -504,31 +504,29 @@ }; }); - // 잔액 데이터 매핑 — balance_type 우선, type_code/type_name 폴백 + // 잔액 데이터 매핑 — type_code 우선 분류 (balance_type 무관) balances.forEach(b => { if (!vacationData[b.user_id]) return; const btype = (b.balance_type || '').toUpperCase(); const code = b.type_code || ''; const data = vacationData[b.user_id]; - if (btype === 'CARRY_OVER' || code === 'CARRYOVER' || b.type_name === '이월') { + if (code === 'CARRYOVER' || b.type_name === '이월') { data.carryover += parseFloat(b.total_days) || 0; data.carryoverUsed += parseFloat(b.used_days) || 0; data.carryoverExpiresAt = b.expires_at || data.carryoverExpiresAt; data.totalUsed += parseFloat(b.used_days) || 0; - } else if (btype === 'LONG_SERVICE') { + } else if (code === 'LONG_SERVICE' || b.type_name === '장기근속') { data.longService += parseFloat(b.total_days) || 0; data.totalUsed += parseFloat(b.used_days) || 0; - } else if (btype === 'AUTO' || btype === 'MANUAL' || code === 'ANNUAL' || code === 'ANNUAL_FULL' || b.type_name === '정기연차' || b.type_name === '연차') { + } else if (code === 'ANNUAL' || code === 'ANNUAL_FULL' || btype === 'AUTO' || btype === 'MANUAL' || b.type_name === '정기연차' || b.type_name === '연차') { data.annual += parseFloat(b.total_days) || 0; data.totalUsed += parseFloat(b.used_days) || 0; } else if (btype === 'COMPANY_GRANT' || code.startsWith('SPECIAL_') || specialTypes.some(st => st.code === code)) { - data.specials.push({ - type: code, - typeName: b.type_name, - days: b.total_days || 0, - id: b.id - }); + var days = parseFloat(b.total_days) || 0; + if (days > 0) { + data.specials.push({ type: code, typeName: b.type_name, days: days, id: b.id }); + } data.totalUsed += parseFloat(b.used_days) || 0; } else { // 미분류 → 정기연차에 합산