From a30482ec349e5d54b51c5570926b4f57dc770304 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Tue, 31 Mar 2026 08:25:53 +0900 Subject: [PATCH] =?UTF-8?q?fix(tkfb):=20=EC=97=B0=EC=B0=A8=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20balance=5Ftype=20=EA=B8=B0=EB=B0=98=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=20=E2=80=94=20LONG=5FSERVICE=20=EC=A0=95=EA=B8=B0?= =?UTF-8?q?=EC=97=B0=EC=B0=A8=20=ED=98=BC=EB=8F=99=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 같은 type_code(ANNUAL_FULL)에 balance_type이 AUTO와 LONG_SERVICE로 2행 존재 시, type_name='연차'로 매칭되어 LONG_SERVICE가 정기연차를 덮어쓰는 문제. balance_type 우선 분류로 변경: - LONG_SERVICE → 장기근속 컬럼 - AUTO/MANUAL → 정기연차 컬럼 - CARRY_OVER → 이월 컬럼 - 값 누적(+=)으로 같은 type의 여러 행 합산 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../web/pages/attendance/annual-overview.html | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/system1-factory/web/pages/attendance/annual-overview.html b/system1-factory/web/pages/attendance/annual-overview.html index 540985d..10cca91 100644 --- a/system1-factory/web/pages/attendance/annual-overview.html +++ b/system1-factory/web/pages/attendance/annual-overview.html @@ -437,29 +437,34 @@ }; }); - // 잔액 데이터 매핑 + // 잔액 데이터 매핑 — balance_type 우선, type_code/type_name 폴백 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 (code === 'CARRYOVER' || b.type_name === '이월') { - data.carryover = b.total_days || 0; - data.totalUsed += b.used_days || 0; - } else if (code === 'ANNUAL' || b.type_name === '정기연차' || b.type_name === '연차') { - data.annual = b.total_days || 0; - data.totalUsed += b.used_days || 0; - } else if (code === 'LONG_SERVICE' || b.type_name === '장기근속') { - data.longService = b.total_days || 0; - data.totalUsed += b.used_days || 0; - } else if (code.startsWith('SPECIAL_') || specialTypes.some(st => st.code === code)) { + if (btype === 'CARRY_OVER' || code === 'CARRYOVER' || b.type_name === '이월') { + data.carryover += parseFloat(b.total_days) || 0; + data.totalUsed += parseFloat(b.used_days) || 0; + } else if (btype === 'LONG_SERVICE') { + 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 === '연차') { + 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 }); - data.totalUsed += b.used_days || 0; + data.totalUsed += parseFloat(b.used_days) || 0; + } else { + // 미분류 → 정기연차에 합산 + data.annual += parseFloat(b.total_days) || 0; + data.totalUsed += parseFloat(b.used_days) || 0; } });