LoanObserver.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Observers;
  3. use App\Models\Loan;
  4. use App\Models\Penalty;
  5. use Carbon\Carbon;
  6. class LoanObserver {
  7. /**
  8. * Handle events after all transactions are committed.
  9. *
  10. * @var bool
  11. */
  12. public $afterCommit = true;
  13. /**
  14. * Handle the Loan "updated" event.
  15. *
  16. * @param \App\Models\Loan $loan
  17. * @return void
  18. */
  19. public function updated(Loan $loan) {
  20. if ($loan->wasChanged('end') && $loan->end !== null) {
  21. $days = (Carbon::parse($loan->start))
  22. ->diffInDays(Carbon::parse($loan->end));
  23. if ($days > 15) {
  24. $lastUserPenalty = $this->getLastUserPenalty($loan->user_id, $loan);
  25. $extraDays = $days - 15;
  26. $finalDate = null;
  27. if ($lastUserPenalty) {
  28. $finalDate = Carbon::parse($lastUserPenalty->end)
  29. ->addDays($extraDays);
  30. } else {
  31. $finalDate = Carbon::parse($loan->end)
  32. ->addDays($extraDays);
  33. }
  34. Penalty::create([
  35. 'user_id' => $loan->user_id,
  36. 'end' => $finalDate->format('Y-m-d')
  37. ]);
  38. return redirect()->route('loans.index')
  39. ->with('danger', 'A new penalty has been added.');
  40. }
  41. }
  42. }
  43. /**
  44. * Get last pending penalty for the user.
  45. *
  46. * @param number $userId
  47. * @param \App\Models\Loan $loan
  48. * @return \App\Models\Penalty
  49. */
  50. private function getLastUserPenalty($userId, Loan $loan) {
  51. return Penalty::where('user_id', $userId)
  52. ->where('end', '>', Carbon::parse($loan->end)
  53. ->format('Y-m-d'))
  54. ->latest()
  55. ->first();
  56. }
  57. }