| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | <?php
namespace App\Observers;
use App\Enums\AccountStatus;
use App\Models\Banking\Account;
class AccountObserver
{
    protected array $actions = [
        'exchange_rate_changed' => 'balance',
        'currency_changed' => 'currency_code',
        'status_changed' => 'status',
        'default_account_changed' => 'enabled',
        'type_changed' => 'type',
        'name_changed' => 'name',
        'number_changed' => 'number',
    ];
    public function creating(Account $account): void
    {
        $account->balance = $account->opening_balance;
    }
    /**
     * Handle the Account "created" event.
     */
    public function created(Account $account): void
    {
        $account->histories()->create([
            'company_id' => $account->company_id,
            'account_id' => $account->id,
            'type' => $account->type,
            'name' => $account->name,
            'number' => $account->number,
            'currency_code' => $account->currency_code,
            'opening_balance' => $account->opening_balance,
            'balance' => $account->balance,
            'exchange_rate' => $account->currency->rate,
            'status' => AccountStatus::Open,
            'actions' => ['account_created'],
            'enabled' => $account->enabled,
            'changed_by' => $account->created_by,
        ]);
    }
    /**
     * Handle the Account "updated" event.
     */
    public function updated(Account $account): void
    {
        $actionsTaken = [];
        foreach ($this->actions as $action => $attribute) {
            if ($account->isDirty($attribute)) {
                $actionsTaken[] = $action;
            }
        }
        if (count($actionsTaken) > 0) {
            $account->histories()->create([
                'company_id' => $account->company_id,
                'account_id' => $account->id,
                'type' => $account->getOriginal('type'),
                'name' => $account->getOriginal('name'),
                'number' => $account->getOriginal('number'),
                'currency_code' => $account->getOriginal('currency_code'),
                'opening_balance' => $account->getRawOriginal('opening_balance'),
                'balance' => $account->getRawOriginal('balance'),
                'exchange_rate' => $account->currency->getRawOriginal('rate'),
                'status' => $account->getOriginal('status'),
                'actions' => $actionsTaken,
                'enabled' => $account->getOriginal('enabled'),
                'changed_by' => $account->updated_by,
            ]);
        }
    }
    /**
     * Handle the Account "deleted" event.
     */
    public function deleted(Account $account): void
    {
        //
    }
    /**
     * Handle the Account "restored" event.
     */
    public function restored(Account $account): void
    {
        //
    }
    /**
     * Handle the Account "force deleted" event.
     */
    public function forceDeleted(Account $account): void
    {
        //
    }
}
 |