| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | <?php
namespace App\Traits;
use App\Models\User;
use Filament\Support\Exceptions\Halt;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use Throwable;
trait HandlesResourceRecordCreation
{
    /**
     * @throws Halt
     */
    protected function handleRecordCreationWithUniqueField(array $data, Model $model, User $user, string|null $uniqueField = null, ?string $uniqueFieldValue = null): Model
    {
        try {
            return DB::transaction(function () use ($data, $user, $model, $uniqueField, $uniqueFieldValue) {
                $enabled = (bool)($data['enabled'] ?? false);
                if ($enabled === true) {
                    $this->disableExistingRecord($user->currentCompany->id, $model, $uniqueField, $uniqueFieldValue);
                } else {
                    $this->ensureAtLeastOneEnabled($user->currentCompany->id, $model, $enabled, $uniqueField, $uniqueFieldValue);
                }
                $data['enabled'] = $enabled;
                return tap($model)->create($data);
            });
        } catch (ValidationException) {
            throw new Halt('Invalid data provided. Please check the form and try again.');
        } catch (AuthorizationException) {
            throw new Halt('You are not authorized to perform this action.');
        } catch (Throwable) {
            throw new Halt('An unexpected error occurred. Please try again.');
        }
    }
    protected function disableExistingRecord(int $companyId, Model $model, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
    {
        $query = $model::query()->where('company_id', $companyId)
            ->where('enabled', true);
        if($uniqueField && $uniqueFieldValue){
            $query->where($uniqueField, $uniqueFieldValue);
        }
        $existingEnabledRecord = $query->first();
        if ($existingEnabledRecord !== null) {
            $existingEnabledRecord->enabled = false;
            $existingEnabledRecord->save();
        }
    }
    protected function ensureAtLeastOneEnabled(int $companyId, Model $model, bool &$enabled, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
    {
        $query = $model::query()->where('company_id', $companyId)
            ->where('enabled', true);
        if($uniqueField && $uniqueFieldValue){
            $query->where($uniqueField, $uniqueFieldValue);
        }
        $otherEnabledRecord = $query->first();
        if ($otherEnabledRecord === null) {
            $enabled = true;
        }
    }
}
 |