feat: [payroll] 추가 공제 항목 마이너스 금액 입력 허용

- formatMoneyInput: 음수 부호(-) 유지하도록 수정
- doRecalculate/submitPayroll: amount > 0 → amount !== 0 조건 변경
- Controller validation: deductions.*.amount에서 min:0 제약 제거
- 연말정산 환급 등 음수 공제 항목 지원
This commit is contained in:
김보곤
2026-02-27 15:40:48 +09:00
parent 5f0b2ae798
commit 01f6ea469b
2 changed files with 8 additions and 6 deletions

View File

@@ -79,7 +79,7 @@ public function store(Request $request): JsonResponse
'allowances.*.amount' => 'required_with:allowances|numeric|min:0',
'deductions' => 'nullable|array',
'deductions.*.name' => 'required_with:deductions|string',
'deductions.*.amount' => 'required_with:deductions|numeric|min:0',
'deductions.*.amount' => 'required_with:deductions|numeric',
'deduction_overrides' => 'nullable|array',
'deduction_overrides.pension' => 'nullable|numeric|min:0',
'deduction_overrides.health_insurance' => 'nullable|numeric|min:0',
@@ -128,7 +128,7 @@ public function update(Request $request, int $id): JsonResponse
'allowances.*.amount' => 'required_with:allowances|numeric|min:0',
'deductions' => 'nullable|array',
'deductions.*.name' => 'required_with:deductions|string',
'deductions.*.amount' => 'required_with:deductions|numeric|min:0',
'deductions.*.amount' => 'required_with:deductions|numeric',
'deduction_overrides' => 'nullable|array',
'deduction_overrides.pension' => 'nullable|numeric|min:0',
'deduction_overrides.health_insurance' => 'nullable|numeric|min:0',

View File

@@ -561,7 +561,7 @@ function doRecalculate() {
document.querySelectorAll('#deductionsContainer > div').forEach(row => {
const name = row.querySelector('.deduction-name').value;
const amount = parseMoneyValue(row.querySelector('.deduction-amount'));
if (name && amount > 0) deductions.push({name, amount});
if (name && amount !== 0) deductions.push({name, amount});
});
const data = {
@@ -671,9 +671,11 @@ function parseMoneyValue(el) {
function formatMoneyInput(el) {
const pos = el.selectionStart;
const oldLen = el.value.length;
const isNeg = el.value.indexOf('-') === 0;
const raw = el.value.replace(/[^0-9]/g, '');
const num = parseInt(raw, 10);
el.value = isNaN(num) ? '' : num.toLocaleString('ko-KR');
if (isNaN(num)) { el.value = isNeg ? '-' : ''; return; }
el.value = (isNeg ? '-' : '') + num.toLocaleString('ko-KR');
const newLen = el.value.length;
const newPos = Math.max(0, pos + (newLen - oldLen));
el.setSelectionRange(newPos, newPos);
@@ -689,7 +691,7 @@ function moneyBlur(el) {
function setMoneyValue(el, val) {
const num = parseInt(val, 10) || 0;
el.value = num === 0 ? '0' : num.toLocaleString('ko-KR');
el.value = num === 0 ? '0' : Number(num).toLocaleString('ko-KR');
}
// ===== 급여 저장 =====
@@ -705,7 +707,7 @@ function submitPayroll() {
document.querySelectorAll('#deductionsContainer > div').forEach(row => {
const name = row.querySelector('.deduction-name').value;
const amount = parseMoneyValue(row.querySelector('.deduction-amount'));
if (name && amount > 0) deductions.push({name, amount});
if (name && amount !== 0) deductions.push({name, amount});
});
// 수동 수정된 공제 항목 override