From abe84899c9919b44545c0705f53aa648c2cdc49a Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 25 Jun 2026 20:39:36 +0700 Subject: [PATCH] refactor: implement error handling in EmployeeAdvanceService methods to ensure transaction safety and improve code robustness --- .../Finance/EmployeeAdvanceService.php | 160 ++++++++++-------- 1 file changed, 90 insertions(+), 70 deletions(-) diff --git a/app/Services/Finance/EmployeeAdvanceService.php b/app/Services/Finance/EmployeeAdvanceService.php index e281dcc..3e5f54b 100644 --- a/app/Services/Finance/EmployeeAdvanceService.php +++ b/app/Services/Finance/EmployeeAdvanceService.php @@ -76,21 +76,25 @@ public function create(array $validated, User $user): void { $employee = $this->resolveAuthenticatedEmployee($user); - $employeeAdvance = DB::transaction(function () use ($validated, $employee) { - return EmployeeAdvance::create([ - 'employee_id' => $employee->id, - 'amount' => (int) $validated['amount'], - 'description' => $validated['description'], - 'due_date' => $validated['due_date'], - 'status' => EmployeeAdvanceStatus::PENDING, - ]); - }); + try { + $employeeAdvance = DB::transaction(function () use ($validated, $employee) { + return EmployeeAdvance::create([ + 'employee_id' => $employee->id, + 'amount' => (int) $validated['amount'], + 'description' => $validated['description'], + 'due_date' => $validated['due_date'], + 'status' => EmployeeAdvanceStatus::PENDING, + ]); + }); + } catch (\Throwable $e) { + throw $e; + } $this->pushNotificationService->sendToRoles( '💰 Pengajuan Kasbon Baru', "Karyawan {$user->profil?->full_name} mengajukan kasbon sebesar {$employeeAdvance->amount_formatted} dengan keterangan: {$employeeAdvance->description}.", ['owner', 'developer'], - route('admin.finance.employee-advances.index'), + route('admin.finance.employee_advances.index'), ); } @@ -99,19 +103,23 @@ public function create(array $validated, User $user): void */ public function update(EmployeeAdvance $employeeAdvance, array $validated, User $user): void { - DB::transaction(function () use ($employeeAdvance, $validated): void { - $employeeAdvance->update([ - 'amount' => (int) $validated['amount'], - 'description' => $validated['description'], - 'due_date' => $validated['due_date'], - ]); - }); + try { + DB::transaction(function () use ($employeeAdvance, $validated): void { + $employeeAdvance->update([ + 'amount' => (int) $validated['amount'], + 'description' => $validated['description'], + 'due_date' => $validated['due_date'], + ]); + }); + } catch (\Throwable $e) { + throw $e; + } $this->pushNotificationService->sendToRoles( '✏️ Kasbon Diperbarui', "Kasbon sebesar {$employeeAdvance->amount_formatted} telah diperbarui oleh {$user->profile?->full_name}.", ['owner', 'developer'], - route('admin.finance.employee-advances.index'), + route('admin.finance.employee_advances.index'), ); } @@ -126,34 +134,38 @@ public function delete(EmployeeAdvance $employeeAdvance, User $user): void '🗑️ Kasbon Dihapus', "Kasbon sebesar {$amount} dengan keterangan {$description} telah dihapus.", ['owner', 'developer'], - route('admin.finance.employee-advances.index'), + route('admin.finance.employee_advances.index'), ); } public function approve(EmployeeAdvance $employeeAdvance, User $user): void { - DB::transaction(function () use ($employeeAdvance, $user): void { - $employeeAdvance->loadMissing('employee.user.profile'); + try { + DB::transaction(function () use ($employeeAdvance, $user): void { + $employeeAdvance->loadMissing('employee.user.profile'); - $description = sprintf( - 'Pencairan kasbon: %s', - $employeeAdvance->employeeName, - ); + $description = sprintf( + 'Pencairan kasbon: %s', + $employeeAdvance->employeeName, + ); - $cashTransaction = $this->cashService->recordOutgoing( - $employeeAdvance, - $employeeAdvance->amount, - $description, - $user, - ); + $cashTransaction = $this->cashService->recordOutgoing( + $employeeAdvance, + $employeeAdvance->amount, + $description, + $user, + ); - $employeeAdvance->update([ - 'cash_transaction_id' => $cashTransaction->id, - 'status' => EmployeeAdvanceStatus::APPROVED, - 'verified_at' => now(), - 'verified_by_id' => $user->id, - ]); - }); + $employeeAdvance->update([ + 'cash_transaction_id' => $cashTransaction->id, + 'status' => EmployeeAdvanceStatus::APPROVED, + 'verified_at' => now(), + 'verified_by_id' => $user->id, + ]); + }); + } catch (\Throwable $e) { + throw $e; + } $employeeAdvance->loadMissing('employee.user'); if ($employeeAdvance->employee?->user_id) { @@ -161,25 +173,29 @@ public function approve(EmployeeAdvance $employeeAdvance, User $user): void '💰 Kasbon Disetujui', "Pengajuan kasbon Anda sebesar {$employeeAdvance->amount_formatted} telah disetujui.", $employeeAdvance->employee->user_id, - route('admin.finance.employee-advances.index'), + route('admin.finance.employee_advances.index'), ); } } public function reject(EmployeeAdvance $employeeAdvance, string $reason, User $user): void { - DB::transaction(function () use ($employeeAdvance, $user, $reason): void { - $employeeAdvance->update([ - 'status' => EmployeeAdvanceStatus::REJECTED, - 'verified_at' => now(), - 'verified_by_id' => $user->id, - ]); + try { + DB::transaction(function () use ($employeeAdvance, $user, $reason): void { + $employeeAdvance->update([ + 'status' => EmployeeAdvanceStatus::REJECTED, + 'verified_at' => now(), + 'verified_by_id' => $user->id, + ]); - $employeeAdvance->rejection()->create([ - 'reason' => $reason, - 'rejected_by_id' => $user->id, - ]); - }); + $employeeAdvance->rejection()->create([ + 'reason' => $reason, + 'rejected_by_id' => $user->id, + ]); + }); + } catch (\Throwable $e) { + throw $e; + } $employeeAdvance->loadMissing('employee.user'); if ($employeeAdvance->employee?->user_id) { @@ -187,35 +203,39 @@ public function reject(EmployeeAdvance $employeeAdvance, string $reason, User $u '💰 Kasbon Ditolak', "Pengajuan kasbon Anda sebesar {$employeeAdvance->amount_formatted} ditolak dengan alasan: {$reason}.", $employeeAdvance->employee->user_id, - route('admin.finance.employee-advances.index'), + route('admin.finance.employee_advances.index'), ); } } public function pay(EmployeeAdvance $employeeAdvance, User $user): void { - DB::transaction(function () use ($employeeAdvance, $user): void { - $employeeAdvance->loadMissing('employee.user.profile'); + try { + DB::transaction(function () use ($employeeAdvance, $user): void { + $employeeAdvance->loadMissing('employee.user.profile'); - $description = sprintf( - 'Pelunasan kasbon: %s', - $employeeAdvance->employeeName, - ); + $description = sprintf( + 'Pelunasan kasbon: %s', + $employeeAdvance->employeeName, + ); - $cashTransaction = $this->cashService->recordIncoming( - $employeeAdvance, - $employeeAdvance->amount, - $description, - $user, - ); + $cashTransaction = $this->cashService->recordIncoming( + $employeeAdvance, + $employeeAdvance->amount, + $description, + $user, + ); - $employeeAdvance->update([ - 'repayment_cash_transaction_id' => $cashTransaction->id, - 'paid_at' => now(), - 'paid_by_id' => $user->id, - 'status' => EmployeeAdvanceStatus::PAID, - ]); - }); + $employeeAdvance->update([ + 'repayment_cash_transaction_id' => $cashTransaction->id, + 'paid_at' => now(), + 'paid_by_id' => $user->id, + 'status' => EmployeeAdvanceStatus::PAID, + ]); + }); + } catch (\Throwable $e) { + throw $e; + } } private function applySorting(Builder $query, string $sort, string $direction): void