From d068a8e55c5fc0eff49f66f5fa00aa1e7802aec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Tue, 10 Mar 2026 16:34:19 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[payroll]=20=EC=A0=84=ED=91=9C=20?= =?UTF-8?q?=EA=B3=B5=EC=A0=9C=ED=95=AD=EB=AA=A9=20=EB=8F=99=EC=9D=BC=20?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=20=EB=B3=91=ED=95=A9=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기타공제 이름 정규화 (trim, 공백 통일) - 동일 description + trading_partner 공제항목 합산 병합 - 중복 라인 제거하여 깔끔한 전표 생성 --- .../Api/Admin/HR/PayrollController.php | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/Api/Admin/HR/PayrollController.php b/app/Http/Controllers/Api/Admin/HR/PayrollController.php index 2ad457f6..8494eb3b 100644 --- a/app/Http/Controllers/Api/Admin/HR/PayrollController.php +++ b/app/Http/Controllers/Api/Admin/HR/PayrollController.php @@ -749,11 +749,11 @@ public function generateJournalEntry(Request $request): JsonResponse ], 422); } - // 기타공제(deductions JSON) 항목별 합산 + // 기타공제(deductions JSON) 항목별 합산 (이름 정규화) $extraDeductionsByName = []; foreach ($payrolls as $p) { foreach ($p->deductions ?? [] as $d) { - $name = $d['name'] ?? '기타공제'; + $name = trim(preg_replace('/\s+/', ' ', $d['name'] ?? '기타공제')); $amount = (int) ($d['amount'] ?? 0); if ($amount != 0) { $extraDeductionsByName[$name] = ($extraDeductionsByName[$name] ?? 0) + $amount; @@ -855,22 +855,38 @@ public function generateJournalEntry(Request $request): JsonResponse } // 2~N. 공제항목: 모두 대변 처리 (음수 공제는 마이너스 대변) + // 동일 description + partner 병합을 위해 key 기반 합산 + $creditLines = []; foreach ($deductionItems as [$amount, $partnerName, $desc]) { if ($amount == 0) { continue; } - $lines[] = [ - 'dc_type' => 'credit', - 'account_code' => '207', - 'account_name' => $accountCodes['207'], - 'trading_partner_id' => $partners[$partnerName], - 'trading_partner_name' => $partnerName, - 'debit_amount' => 0, - 'credit_amount' => $amount, - 'description' => $amount < 0 ? "{$desc} (환급)" : $desc, - 'line_no' => $lineNo++, - ]; + $description = $amount < 0 ? "{$desc} (환급)" : $desc; + $mergeKey = "{$partnerName}|{$description}"; + + if (isset($creditLines[$mergeKey])) { + $creditLines[$mergeKey]['credit_amount'] += $amount; + } else { + $creditLines[$mergeKey] = [ + 'dc_type' => 'credit', + 'account_code' => '207', + 'account_name' => $accountCodes['207'], + 'trading_partner_id' => $partners[$partnerName], + 'trading_partner_name' => $partnerName, + 'debit_amount' => 0, + 'credit_amount' => $amount, + 'description' => $description, + ]; + } + } + + foreach ($creditLines as $creditLine) { + if ($creditLine['credit_amount'] == 0) { + continue; + } + $creditLine['line_no'] = $lineNo++; + $lines[] = $creditLine; } // 최종: 대변 205 미지급비용 / 임직원 — 실수령액 (DB 값)