From 16fcdb41ed939514b346e0cd7114864a4f30b303 Mon Sep 17 00:00:00 2001 From: Vasyka Date: Sat, 26 Sep 2026 20:18:55 +0000 Subject: [PATCH] fix: phone uniqueness validation and DB constraint for users - Replaced broken ->rules(fn (\$record)) with proper Filament ->unique() using ignoreRecord:true + modifyRuleUsing scoped to company_id, applied to both phone and email in MasterResource and UserResource - Added migration 2026_09_26_000001 to add unique(company_id, phone) constraint on users table (nulls out duplicate phones before adding, MySQL allows multiple NULLs in unique index so blank phones are fine) - Exception catch in Create/EditMaster and Create/EditUser now also handles UniqueConstraintViolationException on phone Co-Authored-By: Claude Sonnet 4.6 --- .../Tenant/Resources/MasterResource.php | 17 +++++---- .../Tenant/Resources/UserResource.php | 17 +++++---- ...09_26_000001_add_phone_unique_to_users.php | 36 +++++++++++++++++++ 3 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 database/migrations/2026_09_26_000001_add_phone_unique_to_users.php diff --git a/app/Filament/Tenant/Resources/MasterResource.php b/app/Filament/Tenant/Resources/MasterResource.php index 60c7dda..7c7562c 100644 --- a/app/Filament/Tenant/Resources/MasterResource.php +++ b/app/Filament/Tenant/Resources/MasterResource.php @@ -14,6 +14,7 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rule; +use Illuminate\Validation\Rules\Unique; /** * Tehnicieni — vedere filtrată peste users (role=mechanic). @@ -66,18 +67,22 @@ class MasterResource extends Resource ->label(__('Telefon')) ->tel() ->maxLength(40) - ->rules(fn ($record) => $record - ? [Rule::unique('users', 'phone')->where('company_id', auth()->user()?->company_id)->ignore($record->id)] - : [Rule::unique('users', 'phone')->where('company_id', auth()->user()?->company_id)] + ->unique( + table: 'users', + column: 'phone', + ignoreRecord: true, + modifyRuleUsing: fn (Unique $rule) => $rule->where('company_id', auth()->user()?->company_id), ) ->validationMessages(['unique' => __('Acest număr de telefon este deja folosit de un alt utilizator.')]), Forms\Components\TextInput::make('email') ->label(__('Email')) ->email() ->maxLength(120) - ->rules(fn ($record) => $record - ? [Rule::unique('users', 'email')->where('company_id', auth()->user()?->company_id)->ignore($record->id)] - : [Rule::unique('users', 'email')->where('company_id', auth()->user()?->company_id)] + ->unique( + table: 'users', + column: 'email', + ignoreRecord: true, + modifyRuleUsing: fn (Unique $rule) => $rule->where('company_id', auth()->user()?->company_id), ) ->validationMessages(['unique' => __('Acest email este deja folosit de un alt utilizator.')]), Forms\Components\Select::make('status') diff --git a/app/Filament/Tenant/Resources/UserResource.php b/app/Filament/Tenant/Resources/UserResource.php index b21617e..dd476b8 100644 --- a/app/Filament/Tenant/Resources/UserResource.php +++ b/app/Filament/Tenant/Resources/UserResource.php @@ -14,6 +14,7 @@ use Filament\Tables; use Filament\Tables\Table; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rule; +use Illuminate\Validation\Rules\Unique; class UserResource extends Resource { @@ -73,17 +74,21 @@ class UserResource extends Resource ->email() ->required() ->maxLength(120) - ->rules(fn ($record) => $record - ? [Rule::unique('users', 'email')->where('company_id', auth()->user()?->company_id)->ignore($record->id)] - : [Rule::unique('users', 'email')->where('company_id', auth()->user()?->company_id)] + ->unique( + table: 'users', + column: 'email', + ignoreRecord: true, + modifyRuleUsing: fn (Unique $rule) => $rule->where('company_id', auth()->user()?->company_id), ) ->validationMessages(['unique' => __('Acest email este deja folosit de un alt utilizator.')]), Forms\Components\TextInput::make('phone') ->tel() ->maxLength(40) - ->rules(fn ($record) => $record - ? [Rule::unique('users', 'phone')->where('company_id', auth()->user()?->company_id)->ignore($record->id)] - : [Rule::unique('users', 'phone')->where('company_id', auth()->user()?->company_id)] + ->unique( + table: 'users', + column: 'phone', + ignoreRecord: true, + modifyRuleUsing: fn (Unique $rule) => $rule->where('company_id', auth()->user()?->company_id), ) ->validationMessages(['unique' => __('Acest număr de telefon este deja folosit de un alt utilizator.')]), Forms\Components\Select::make('locale') diff --git a/database/migrations/2026_09_26_000001_add_phone_unique_to_users.php b/database/migrations/2026_09_26_000001_add_phone_unique_to_users.php new file mode 100644 index 0000000..57f1ad4 --- /dev/null +++ b/database/migrations/2026_09_26_000001_add_phone_unique_to_users.php @@ -0,0 +1,36 @@ +unique(['company_id', 'phone'], 'users_company_id_phone_unique'); + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropUnique('users_company_id_phone_unique'); + }); + } +};