| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | <?php
namespace App\Listeners;
use App\Events\CompanyDefaultUpdated;
use App\Models\Setting\CompanyDefault;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\DB;
class SyncAssociatedModels
{
    /**
     * Create the event listener.
     */
    public function __construct()
    {
        //
    }
    /**
     * Handle the event.
     */
    public function handle(CompanyDefaultUpdated $event): void
    {
        DB::transaction(function () use ($event) {
            $this->syncAssociatedModels($event);
        }, 5);
    }
    private function syncAssociatedModels(CompanyDefaultUpdated $event): void
    {
        /** @var CompanyDefault $record */
        $record = $event->record;
        $data = $event->data;
        $record_array = array_map('strval', $record->toArray());
        $data = array_map('strval', $data);
        $diff = array_diff_assoc($data, $record_array);
        $keyToMethodMap = [
            'bank_account_id' => 'bankAccount',
        ];
        foreach ($diff as $key => $value) {
            if (array_key_exists($key, $keyToMethodMap)) {
                $method = $keyToMethodMap[$key];
                $this->updateEnabledStatus($record->$method(), $value);
            }
        }
    }
    private function updateEnabledStatus(BelongsTo $relation, $newValue): void
    {
        if ($relation->exists()) {
            $previousDefault = $relation->getResults();
            $previousDefault->update(['enabled' => false]);
        }
        if ($newValue !== null) {
            $newDefault = $relation->getRelated()->newQuery()->where($relation->getOwnerKeyName(), $newValue)->first();
            $newDefault?->update(['enabled' => true]);
        }
    }
}
 |