на основе миграции
<?php

declare(strict_types=1);

use App\Models\Enums\AuthorizationStepEnum;
use App\Models\Enums\EventOwnerEnum;
use App\Models\Enums\EventTypeEnum;
use App\Models\Enums\TicketAgentEnum;
use App\Models\Enums\YesNoEnum;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class () extends Migration {
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('events', function (Blueprint $table): void {
            $table->uuid('id')->primary();
            $table->timestamps();

            // Общие настройки
            $table->smallInteger('active')->unsigned()->default(YesNoEnum::YES->value)->comment('Активность');
            $table->smallInteger('owner')->unsigned()->default(EventOwnerEnum::VDNH->value)->comment('Владелец');
            $table->string('title')->comment('Заголовок');
            $table->smallInteger('type')->unsigned()->default(EventTypeEnum::WIDGET->value)->comment('Тип мероприятия');
            $table->smallInteger('authorization_step')->unsigned()->default(AuthorizationStepEnum::NOT_SELECT->value)->comment('Шаг авторизации');
            $table->smallInteger('allow_quick_booking')->unsigned()->default(YesNoEnum::NO->value)->comment('Разрешить быстрое бронирование');
            $table->smallInteger('registration_required')->unsigned()->default(YesNoEnum::NO->value)->comment('Регистрация обязательна');
            $table->smallInteger('show_tariff_information')->unsigned()->default(YesNoEnum::NO->value)->comment('Отображать информацию по тарифам');

            // Период активности
            $table->dateTime('start_activity_at')->nullable()->comment('Начало активности');
            $table->dateTime('end_activity_at')->nullable()->comment('Окончание активности');

            // Тарифы
            $table->smallInteger('ticket_agent')->unsigned()->default(TicketAgentEnum::ISD->value)->comment('Билетный агент');
            $table->uuid('tariff_id')->nullable()->comment('ID выбранного тарифа');
            $table->smallInteger('tariff')->unsigned()->default(YesNoEnum::YES->value)->comment('Тариф');
            $table->smallInteger('provide_spb_discount')->unsigned()->default(YesNoEnum::NO->value)->comment('Предоставить скидку по СПБ');

            // Настройки продаж
            $table->dateTime('start_sales_at')->nullable()->comment('Начало продаж');
            $table->dateTime('end_sales_at')->nullable()->comment('Окончание продаж');
            $table->integer('sales_duration')->default(60)->comment('Длительность продаж (дни)');
            $table->integer('days_until_available')->default(0)->comment('Доступно через X дней');

            // Контент
            $table->json('button_text')->nullable()->comment('Текст кнопки');
            $table->json('additional_info')->nullable()->comment('Дополнительная информация');
            $table->json('additional_file_path')->nullable()->comment('Путь к дополнительному файлу');

            // Индексы
            $table->index(['start_activity_at', 'end_activity_at']);
            $table->index(['start_sales_at', 'end_sales_at']);
            $table->index('tariff_id');
        });

        // Таблица с промокодами
        Schema::create('promo_codes', function (Blueprint $table): void {
            $table->uuid('id')->primary();
            $table->timestamps();

            $table->string('code')->comment('Промокод');
        });

        // Таблица для связи событий с промокодами
        Schema::create('events_promo_codes_links', function (Blueprint $table): void {
            $table->uuid('event_id');
            $table->uuid('promo_code_id');
            $table->primary(['event_id', 'promo_code_id']);
            $table->foreign('event_id')->references('id')->on('events')->onDelete('cascade');
            $table->foreign('promo_code_id')->references('id')->on('promo_codes')->onDelete('cascade');
        });

        // Таблица с программами лояльности
        Schema::create('loyalty_programs', function (Blueprint $table): void {
            $table->uuid('id')->primary();
            $table->timestamps();

            $table->string('title')->comment('Заголовок');
            $table->integer('discount')->unsigned()->default(0);
        });

        // Таблица для связи событий с программами лояльности
        Schema::create('events_loyalty_programs_links', function (Blueprint $table): void {
            $table->uuid('event_id');
            $table->uuid('loyalty_program_id');
            $table->primary(['event_id', 'loyalty_program_id']);
            $table->foreign('event_id')->references('id')->on('events')->onDelete('cascade');
            $table->foreign('loyalty_program_id')->references('id')->on('loyalty_programs')->onDelete('cascade');
        });

        // Таблица для исключенных конкретных дат
        Schema::create('event_excluded_dates', function (Blueprint $table): void {
            $table->uuid('event_id');
            $table->date('date');
            $table->primary(['event_id', 'date']);
            $table->foreign('event_id')->references('id')->on('events')->onDelete('cascade');
        });

        // Таблица для исключенных конкретных дней недели
        Schema::create('event_excluded_weekdays', function (Blueprint $table): void {
            $table->uuid('event_id');
            $table->tinyInteger('weekday')->unsigned();
            $table->primary(['event_id', 'weekday']);
            $table->foreign('event_id')->references('id')->on('events')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('event_excluded_weekdays');
        Schema::dropIfExists('event_excluded_dates');
        Schema::dropIfExists('events_loyalty_programs_links');
        Schema::dropIfExists('events_promo_codes_links');
        Schema::dropIfExists('promo_codes');
        Schema::dropIfExists('loyalty_programs');
        Schema::dropIfExists('events');
    }
};

доработай модель, добавь описание новых полей, реляции с таблицами
<?php

declare(strict_types=1);

namespace App\Models;

use App\Models\Casts\UTC;
use App\Models\Enums\AuthorizationStepEnum;
use App\Models\Enums\EventOwnerEnum;
use App\Models\Enums\EventTypeEnum;
use App\Models\Enums\YesNoEnum;
use App\Models\Traits\HasActiveTrait;
use App\Orchid\Filters\AuthorizationStepFilter;
use App\Orchid\Filters\EventOwnerFilter;
use App\Orchid\Filters\TypeFilter;
use App\Orchid\Filters\YesNoFilter;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Orchid\Filters\Filterable;
use Orchid\Filters\Types\Like;
use Orchid\Screen\AsSource;

/**
 * @property string $id UUID идентификатор
 * @property Carbon $created_at Дата создания
 * @property Carbon $updated_at Дата обновления
 * @property YesNoEnum $active Активность (по умолчанию: Yes)
 * @property EventOwnerEnum $owner Владелец мероприятия
 * @property string $title Заголовок мероприятия
 * @property EventTypeEnum $type Тип мероприятия
 * @property AuthorizationStepEnum $authorization_step Шаг авторизации
 * @property YesNoEnum $allow_quick_booking Разрешить быстрое бронирование
 * @property YesNoEnum $registration_required Обязательная регистрация
 * @property YesNoEnum $show_tariff_information Отображать информацию по тарифам
 * @property Carbon|null $start_activity_at Начало активности
 * @property Carbon|null $end_activity_at Окончание активности
 */
class Event extends Model
{
    use AsSource;
    use Filterable;
    use HasActiveTrait;
    use HasFactory;
    use HasUuids;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<string>
     */
    protected $fillable = [
        'id',
        'created_at',
        'updated_at',
        'owner',
        'type',
        'title',
        'start_activity_at',
        'end_activity_at',
        'authorization_step',
        'allow_quick_booking',
        'registration_required',
        'show_tariff_information',
    ];

    /**
     * The model's default values for attributes.
     *
     * @var array<string, mixed>
     */
    protected $attributes = [
        'active' => YesNoEnum::YES->value,
        'owner' => EventOwnerEnum::VDNH,
        'type' => EventTypeEnum::WIDGET,
        'authorization_step' => AuthorizationStepEnum::NOT_SELECT,
        'allow_quick_booking' => YesNoEnum::NO->value,
        'registration_required' => YesNoEnum::NO->value,
        'show_tariff_information' => YesNoEnum::NO->value,
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'type' => EventTypeEnum::class,
        'owner' => EventOwnerEnum::class,
        'authorization_step' => AuthorizationStepEnum::class,
        'start_activity_at' => UTC::class . ':d-m-Y H:i,Y-m-d H:i:s',
        'end_activity_at' => UTC::class . ':d-m-Y H:i,Y-m-d H:i:s',
    ];

    /**
     * The attributes that can be filtered.
     *
     * @var array<string, string>
     */
    protected array $allowedFilters = [
        'id' => Like::class,
        'title' => Like::class,
        'type' => TypeFilter::class,
        'owner' => EventOwnerFilter::class,
        'authorization_step' => AuthorizationStepFilter::class,
        'allow_quick_booking' => YesNoFilter::class,
        'registration_required' => YesNoFilter::class,
        'show_tariff_information' => YesNoFilter::class,
    ];

    /**
     * The attributes for which can use sort in url.
     *
     * @var array<string>
     */
    protected array $allowedSorts = [
        'id',
        'created_at',
        'updated_at',
        'owner',
        'type',
        'title',
        'start_activity_at',
        'end_activity_at',
        'authorization_step',
        'allow_quick_booking',
        'registration_required',
        'show_tariff_information',
    ];
}