fix: [payroll] 전표 생성 음수 공제(환급) 처리 및 역산 제거
- 음수 공제항목을 차변 207 예수금으로 처리 (환급 = 예수금 감소) - 역산 방식 제거, DB의 실제 net_salary 사용 - 공제항목 루프 처리로 코드 간결화
This commit is contained in:
@@ -808,11 +808,32 @@ public function generateJournalEntry(Request $request): JsonResponse
|
||||
$monthLabel = "{$month}월분";
|
||||
|
||||
// 분개 행 구성
|
||||
// 양수 공제 → 대변 207 예수금 (원천징수)
|
||||
// 음수 공제 → 차변 207 예수금 (환급, 예수금 감소)
|
||||
// net_salary → DB 실제 값 사용 (역산 아님)
|
||||
$lines = [];
|
||||
$lineNo = 1;
|
||||
|
||||
// 1. 차변: 801 급여 / 임직원
|
||||
$grossAmount = (int) $sums->total_gross;
|
||||
$netSalary = (int) $sums->total_net;
|
||||
|
||||
// 공제항목 정의: [합산값, 거래처, 적요]
|
||||
$deductionItems = [
|
||||
[(int) $sums->total_pension, '건강보험연금', '국민연금'],
|
||||
[(int) $sums->total_health, '건강보험건강', '건강보험'],
|
||||
[(int) $sums->total_ltc, '건강보험건강', '장기요양보험'],
|
||||
[(int) $sums->total_emp, '건강보험고용', '고용보험'],
|
||||
[(int) $sums->total_income_tax, '강서세무서', "{$monthLabel} 근로소득세"],
|
||||
[(int) $sums->total_resident_tax, '강서구청', "{$monthLabel} 지방소득세"],
|
||||
];
|
||||
|
||||
// 기타공제
|
||||
$extraDeductions = (int) $sums->total_extra_deductions;
|
||||
if ($extraDeductions != 0) {
|
||||
$deductionItems[] = [$extraDeductions, '임직원', '기타공제'];
|
||||
}
|
||||
|
||||
// 1. 차변: 801 급여 / 임직원 — 총지급액
|
||||
if ($grossAmount > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'debit',
|
||||
@@ -827,122 +848,42 @@ public function generateJournalEntry(Request $request): JsonResponse
|
||||
];
|
||||
}
|
||||
|
||||
// 2. 대변: 207 예수금 / 건강보험연금 — 국민연금
|
||||
$pension = (int) $sums->total_pension;
|
||||
if ($pension > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['건강보험연금'],
|
||||
'trading_partner_name' => '건강보험연금',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $pension,
|
||||
'description' => '국민연금',
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
// 2~N. 공제항목: 양수→대변, 음수→차변 (환급으로 예수금 감소)
|
||||
foreach ($deductionItems as [$amount, $partnerName, $desc]) {
|
||||
if ($amount == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($amount > 0) {
|
||||
// 양수: 대변 207 예수금 (원천징수)
|
||||
$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' => $desc,
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
} else {
|
||||
// 음수: 차변 207 예수금 (환급)
|
||||
$lines[] = [
|
||||
'dc_type' => 'debit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners[$partnerName],
|
||||
'trading_partner_name' => $partnerName,
|
||||
'debit_amount' => abs($amount),
|
||||
'credit_amount' => 0,
|
||||
'description' => "{$desc} (환급)",
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 대변: 207 예수금 / 건강보험건강 — 건강보험
|
||||
$health = (int) $sums->total_health;
|
||||
if ($health > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['건강보험건강'],
|
||||
'trading_partner_name' => '건강보험건강',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $health,
|
||||
'description' => '건강보험',
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 4. 대변: 207 예수금 / 건강보험건강 — 장기요양보험
|
||||
$ltc = (int) $sums->total_ltc;
|
||||
if ($ltc > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['건강보험건강'],
|
||||
'trading_partner_name' => '건강보험건강',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $ltc,
|
||||
'description' => '장기요양보험',
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 5. 대변: 207 예수금 / 건강보험고용 — 고용보험
|
||||
$emp = (int) $sums->total_emp;
|
||||
if ($emp > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['건강보험고용'],
|
||||
'trading_partner_name' => '건강보험고용',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $emp,
|
||||
'description' => '고용보험',
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 6. 대변: 207 예수금 / 강서세무서 — 근로소득세
|
||||
$incomeTax = (int) $sums->total_income_tax;
|
||||
if ($incomeTax > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['강서세무서'],
|
||||
'trading_partner_name' => '강서세무서',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $incomeTax,
|
||||
'description' => "{$monthLabel} 근로소득세",
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 7. 대변: 207 예수금 / 강서구청 — 지방소득세
|
||||
$residentTax = (int) $sums->total_resident_tax;
|
||||
if ($residentTax > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['강서구청'],
|
||||
'trading_partner_name' => '강서구청',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $residentTax,
|
||||
'description' => "{$monthLabel} 지방소득세",
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 8. 대변: 207 예수금 / 임직원 — 기타공제
|
||||
$extraDeductions = (int) $sums->total_extra_deductions;
|
||||
if ($extraDeductions > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
'account_code' => '207',
|
||||
'account_name' => $accountCodes['207'],
|
||||
'trading_partner_id' => $partners['임직원'],
|
||||
'trading_partner_name' => '임직원',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $extraDeductions,
|
||||
'description' => '기타공제',
|
||||
'line_no' => $lineNo++,
|
||||
];
|
||||
}
|
||||
|
||||
// 9. 대변: 205 미지급비용 / 임직원 — 급여
|
||||
// DB의 net_salary 대신 역산 (차변 - 기타 대변 합계)으로 차대 균형 보장
|
||||
$creditSoFar = collect($lines)->sum('credit_amount');
|
||||
$netSalary = $grossAmount - $creditSoFar;
|
||||
// 최종: 대변 205 미지급비용 / 임직원 — 실수령액 (DB 값)
|
||||
if ($netSalary > 0) {
|
||||
$lines[] = [
|
||||
'dc_type' => 'credit',
|
||||
|
||||
Reference in New Issue
Block a user