|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace App\Listeners\HR; |
| 4 | + |
| 5 | +use App\Events\HR\PayrollRunApproved; |
| 6 | +use App\Modules\Accounting\Models\JournalEntry; |
| 7 | +use App\Modules\Accounting\Models\JournalEntryLine; |
| 8 | + |
| 9 | +class CreatePayrollJournalEntry |
| 10 | +{ |
| 11 | + public function handle(PayrollRunApproved $event): void |
| 12 | + { |
| 13 | + $payrollRun = $event->payrollRun; |
| 14 | + |
| 15 | + $entry = JournalEntry::create([ |
| 16 | + 'tenant_id' => $payrollRun->tenant_id, |
| 17 | + 'reference' => 'PAYROLL-' . $payrollRun->period_label, |
| 18 | + 'description' => 'Payroll journal entry for ' . $payrollRun->period_label, |
| 19 | + 'entry_date' => now()->toDateString(), |
| 20 | + 'status' => 'draft', |
| 21 | + ]); |
| 22 | + |
| 23 | + $entry->entry_number = $entry->generateEntryNumber(); |
| 24 | + $entry->save(); |
| 25 | + |
| 26 | + // Find or create placeholder accounts for salary expense and payable |
| 27 | + $expenseAccount = $this->findOrCreateAccount($payrollRun->tenant_id, '6100', 'Salary Expense', 'expense', 'debit'); |
| 28 | + $payableAccount = $this->findOrCreateAccount($payrollRun->tenant_id, '2100', 'Salary Payable', 'liability', 'credit'); |
| 29 | + |
| 30 | + JournalEntryLine::create([ |
| 31 | + 'journal_entry_id' => $entry->id, |
| 32 | + 'account_id' => $expenseAccount->id, |
| 33 | + 'description' => 'Salary Expense', |
| 34 | + 'debit' => $payrollRun->total_gross, |
| 35 | + 'credit' => 0, |
| 36 | + ]); |
| 37 | + |
| 38 | + JournalEntryLine::create([ |
| 39 | + 'journal_entry_id' => $entry->id, |
| 40 | + 'account_id' => $payableAccount->id, |
| 41 | + 'description' => 'Salary Payable', |
| 42 | + 'debit' => 0, |
| 43 | + 'credit' => $payrollRun->total_net, |
| 44 | + ]); |
| 45 | + } |
| 46 | + |
| 47 | + private function findOrCreateAccount(int $tenantId, string $code, string $name, string $type, string $normalBalance): \App\Modules\Accounting\Models\Account |
| 48 | + { |
| 49 | + return \App\Modules\Accounting\Models\Account::firstOrCreate( |
| 50 | + ['tenant_id' => $tenantId, 'code' => $code], |
| 51 | + [ |
| 52 | + 'name' => $name, |
| 53 | + 'type' => $type, |
| 54 | + 'normal_balance' => $normalBalance, |
| 55 | + 'is_active' => true, |
| 56 | + ] |
| 57 | + ); |
| 58 | + } |
| 59 | +} |
0 commit comments