fix(vacation): 경조사 오분류 수정 — type_code 우선 분류 + DB 정리
- 분류 로직: balance_type 대신 type_code 우선 체크 (LONG_SERVICE 등이 경조사로 분류되는 버그) - 0일 경조사 레코드 필터링 추가 - 잘못된 COMPANY_GRANT 레코드 DELETE 마이그레이션 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,3 +2,8 @@
|
|||||||
-- 0.25(반반차)가 0.3으로 반올림되는 문제 해결
|
-- 0.25(반반차)가 0.3으로 반올림되는 문제 해결
|
||||||
ALTER TABLE vacation_types MODIFY deduct_days DECIMAL(4,2) DEFAULT 1.00;
|
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';
|
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');
|
||||||
|
|||||||
@@ -504,31 +504,29 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// 잔액 데이터 매핑 — balance_type 우선, type_code/type_name 폴백
|
// 잔액 데이터 매핑 — type_code 우선 분류 (balance_type 무관)
|
||||||
balances.forEach(b => {
|
balances.forEach(b => {
|
||||||
if (!vacationData[b.user_id]) return;
|
if (!vacationData[b.user_id]) return;
|
||||||
const btype = (b.balance_type || '').toUpperCase();
|
const btype = (b.balance_type || '').toUpperCase();
|
||||||
const code = b.type_code || '';
|
const code = b.type_code || '';
|
||||||
const data = vacationData[b.user_id];
|
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.carryover += parseFloat(b.total_days) || 0;
|
||||||
data.carryoverUsed += parseFloat(b.used_days) || 0;
|
data.carryoverUsed += parseFloat(b.used_days) || 0;
|
||||||
data.carryoverExpiresAt = b.expires_at || data.carryoverExpiresAt;
|
data.carryoverExpiresAt = b.expires_at || data.carryoverExpiresAt;
|
||||||
data.totalUsed += parseFloat(b.used_days) || 0;
|
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.longService += parseFloat(b.total_days) || 0;
|
||||||
data.totalUsed += parseFloat(b.used_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.annual += parseFloat(b.total_days) || 0;
|
||||||
data.totalUsed += parseFloat(b.used_days) || 0;
|
data.totalUsed += parseFloat(b.used_days) || 0;
|
||||||
} else if (btype === 'COMPANY_GRANT' || code.startsWith('SPECIAL_') || specialTypes.some(st => st.code === code)) {
|
} else if (btype === 'COMPANY_GRANT' || code.startsWith('SPECIAL_') || specialTypes.some(st => st.code === code)) {
|
||||||
data.specials.push({
|
var days = parseFloat(b.total_days) || 0;
|
||||||
type: code,
|
if (days > 0) {
|
||||||
typeName: b.type_name,
|
data.specials.push({ type: code, typeName: b.type_name, days: days, id: b.id });
|
||||||
days: b.total_days || 0,
|
}
|
||||||
id: b.id
|
|
||||||
});
|
|
||||||
data.totalUsed += parseFloat(b.used_days) || 0;
|
data.totalUsed += parseFloat(b.used_days) || 0;
|
||||||
} else {
|
} else {
|
||||||
// 미분류 → 정기연차에 합산
|
// 미분류 → 정기연차에 합산
|
||||||
|
|||||||
Reference in New Issue
Block a user