fix(tkfb): 연차 소수점 표시 개선 — 정수면 17, 소수면 0.75
- DB: vacation_balance_details DECIMAL(4,1) → DECIMAL(5,2)로 변경 (0.25 단위 지원) - 표시: fmtNum() — 정수면 소수점 없이 (17), 소수면 2자리 (0.75) - onblur 포맷팅도 동일 규칙 적용 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -354,6 +354,12 @@
|
|||||||
}, 50);
|
}, 50);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
// 숫자 포맷: 정수면 소수점 없이, 소수면 2자리
|
||||||
|
function fmtNum(v) {
|
||||||
|
const n = parseFloat(v) || 0;
|
||||||
|
return n % 1 === 0 ? n.toString() : n.toFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
// 전역 변수
|
// 전역 변수
|
||||||
let workers = [];
|
let workers = [];
|
||||||
let currentYear = new Date().getFullYear();
|
let currentYear = new Date().getFullYear();
|
||||||
@@ -488,24 +494,24 @@
|
|||||||
<td class="worker-name">${w.worker_name}</td>
|
<td class="worker-name">${w.worker_name}</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="number" class="num-input ${carryover < 0 ? 'negative' : ''}"
|
<input type="number" class="num-input ${carryover < 0 ? 'negative' : ''}"
|
||||||
value="${carryover.toFixed(2)}" step="0.25"
|
value="${fmtNum(carryover)}" step="0.25"
|
||||||
data-field="carryover"
|
data-field="carryover"
|
||||||
onchange="updateField(${w.user_id}, 'carryover', this.value)"
|
onchange="updateField(${w.user_id}, 'carryover', this.value)"
|
||||||
onblur="this.value=parseFloat(this.value||0).toFixed(2)">
|
onblur="var n=parseFloat(this.value||0);this.value=n%1===0?n.toString():n.toFixed(2)">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="number" class="num-input"
|
<input type="number" class="num-input"
|
||||||
value="${annual.toFixed(2)}" step="0.25"
|
value="${fmtNum(annual)}" step="0.25"
|
||||||
data-field="annual"
|
data-field="annual"
|
||||||
onchange="updateField(${w.user_id}, 'annual', this.value)"
|
onchange="updateField(${w.user_id}, 'annual', this.value)"
|
||||||
onblur="this.value=parseFloat(this.value||0).toFixed(2)">
|
onblur="var n=parseFloat(this.value||0);this.value=n%1===0?n.toString():n.toFixed(2)">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="number" class="num-input"
|
<input type="number" class="num-input"
|
||||||
value="${longService.toFixed(2)}" step="0.25"
|
value="${fmtNum(longService)}" step="0.25"
|
||||||
data-field="longService"
|
data-field="longService"
|
||||||
onchange="updateField(${w.user_id}, 'longService', this.value)"
|
onchange="updateField(${w.user_id}, 'longService', this.value)"
|
||||||
onblur="this.value=parseFloat(this.value||0).toFixed(2)">
|
onblur="var n=parseFloat(this.value||0);this.value=n%1===0?n.toString():n.toFixed(2)">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="special-btn" onclick="openSpecialModal(${w.user_id}, '${w.worker_name}')">
|
<button class="special-btn" onclick="openSpecialModal(${w.user_id}, '${w.worker_name}')">
|
||||||
@@ -513,9 +519,9 @@
|
|||||||
${(d.specials || []).length > 0 ? `<span class="special-count">${d.specials.length}</span>` : ''}
|
${(d.specials || []).length > 0 ? `<span class="special-count">${d.specials.length}</span>` : ''}
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
<td style="font-weight:600;color:#059669;">${totalGenerated.toFixed(2)}</td>
|
<td style="font-weight:600;color:#059669;">${fmtNum(totalGenerated)}</td>
|
||||||
<td style="color:#6b7280;">${totalUsed.toFixed(2)}</td>
|
<td style="color:#6b7280;">${fmtNum(totalUsed)}</td>
|
||||||
<td class="remaining ${remainingClass}">${remaining.toFixed(2)}</td>
|
<td class="remaining ${remainingClass}">${fmtNum(remaining)}</td>
|
||||||
</tr>
|
</tr>
|
||||||
`;
|
`;
|
||||||
}).join('');
|
}).join('');
|
||||||
@@ -555,9 +561,9 @@
|
|||||||
const remaining = totalGenerated - totalUsed;
|
const remaining = totalGenerated - totalUsed;
|
||||||
|
|
||||||
const cells = row.querySelectorAll('td');
|
const cells = row.querySelectorAll('td');
|
||||||
cells[6].textContent = totalGenerated.toFixed(2);
|
cells[6].textContent = fmtNum(totalGenerated);
|
||||||
cells[7].textContent = totalUsed.toFixed(2);
|
cells[7].textContent = fmtNum(totalUsed);
|
||||||
cells[8].textContent = remaining.toFixed(2);
|
cells[8].textContent = fmtNum(remaining);
|
||||||
cells[8].className = `remaining ${remaining > 0 ? 'positive' : remaining < 0 ? 'negative' : 'zero'}`;
|
cells[8].className = `remaining ${remaining > 0 ? 'positive' : remaining < 0 ? 'negative' : 'zero'}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -595,9 +601,9 @@
|
|||||||
<option value="${st.code}" ${s.type === st.code ? 'selected' : ''}>${st.name}</option>
|
<option value="${st.code}" ${s.type === st.code ? 'selected' : ''}>${st.name}</option>
|
||||||
`).join('')}
|
`).join('')}
|
||||||
</select>
|
</select>
|
||||||
<input type="number" value="${parseFloat(s.days).toFixed(2)}" step="0.25" min="0"
|
<input type="number" value="${fmtNum(s.days)}" step="0.25" min="0"
|
||||||
onchange="updateSpecialDays(${idx}, this.value)"
|
onchange="updateSpecialDays(${idx}, this.value)"
|
||||||
onblur="this.value=parseFloat(this.value||0).toFixed(2)">
|
onblur="var n=parseFloat(this.value||0);this.value=n%1===0?n.toString():n.toFixed(2)">
|
||||||
<span>일</span>
|
<span>일</span>
|
||||||
<button class="delete-btn" onclick="deleteSpecialItem(${idx})">삭제</button>
|
<button class="delete-btn" onclick="deleteSpecialItem(${idx})">삭제</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user