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 값)