You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AccountObserver.php 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. namespace App\Observers;
  3. use App\Enums\Accounting\AccountCategory;
  4. use App\Enums\Accounting\AccountType;
  5. use App\Models\Accounting\Account;
  6. use App\Utilities\Accounting\AccountCode;
  7. use App\Utilities\Currency\CurrencyAccessor;
  8. class AccountObserver
  9. {
  10. public function creating(Account $account): void
  11. {
  12. $this->setCategoryAndType($account);
  13. $this->ensureDefaultCurrency($account);
  14. }
  15. public function updating(Account $account): void
  16. {
  17. if ($account->isDirty('subtype_id')) {
  18. $this->setCategoryAndType($account);
  19. }
  20. $this->ensureDefaultCurrency($account);
  21. }
  22. private function setCategoryAndType(Account $account): void
  23. {
  24. if ($subtype = $account->subtype) {
  25. $account->category = $subtype->category;
  26. $account->type = $subtype->type;
  27. } else {
  28. $account->category = AccountCategory::Asset;
  29. $account->type = AccountType::CurrentAsset;
  30. }
  31. }
  32. private function ensureDefaultCurrency(Account $account): void
  33. {
  34. if (! $account->currency_code) {
  35. $account->currency_code = CurrencyAccessor::getDefaultCurrency();
  36. }
  37. }
  38. private function setAccountCode(Account $account): void
  39. {
  40. $generatedAccountCode = AccountCode::generate($account->subtype);
  41. $account->code = $generatedAccountCode;
  42. }
  43. /**
  44. * Handle the Account "created" event.
  45. */
  46. public function created(Account $account): void
  47. {
  48. if (! $account->code) {
  49. $this->setAccountCode($account);
  50. $account->saveQuietly();
  51. }
  52. }
  53. }