diff --git a/app/Http/Controllers/Admin/CustomerController.php b/app/Http/Controllers/Admin/CustomerController.php index cf2616c..c293e62 100644 --- a/app/Http/Controllers/Admin/CustomerController.php +++ b/app/Http/Controllers/Admin/CustomerController.php @@ -46,6 +46,7 @@ class CustomerController extends SuperController { $data = $request->all(); if (isset($data['mobile']) && !is_null($data['mobile'])){ + $data['mobile'] = Customer::normalizeMobile($data['mobile']); Customer::assertMobileUnique($data['mobile'], (int) $id); } diff --git a/app/Http/Controllers/SuperController.php b/app/Http/Controllers/SuperController.php index e046f84..fbd31c2 100644 --- a/app/Http/Controllers/SuperController.php +++ b/app/Http/Controllers/SuperController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\DB\Te\TableEngine; use App\Models\Cnt; use App\Models\Customer; +use App\Models\User; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; @@ -101,8 +102,13 @@ class SuperController extends Controller public function update(Request $request, $id) { $data= $request->all(); - if (isset($data['mobile']) && !is_null($data['mobile'])){ - Customer::assertMobileUnique($data['mobile'], (int) $id); + if (isset($data['mobile']) && !is_null($data['mobile'])) { + $data['mobile'] = Customer::normalizeMobile($data['mobile']); + if ($this->name_model === 'customer') { + Customer::assertMobileUnique($data['mobile'], (int) $id); + } elseif ($this->name_model === 'user') { + User::assertMobileUnique($data['mobile'], (int) $id); + } } if (isset($data['fname']) && isset($data['lname'])){ $data['name'] = $data['fname'] . ' ' . $data['lname']; diff --git a/app/Http/Middleware/ValidationMiddleware.php b/app/Http/Middleware/ValidationMiddleware.php index 247a21a..78fb434 100644 --- a/app/Http/Middleware/ValidationMiddleware.php +++ b/app/Http/Middleware/ValidationMiddleware.php @@ -40,9 +40,13 @@ class ValidationMiddleware : $rule; }, $rules); } - $validator = Validator::make($request->all(), $rules); + $validator = Validator::make($request->all(), $rules, [ + 'mobile.unique' => 'این شماره موبایل قبلاً ثبت شده است', + ]); if ($validator->fails()) { - return response()->json($validator->errors(),422); + return response()->json([ + 'message' => $validator->errors()->first(), + ], 422); } } return $next($request); diff --git a/app/Models/Customer.php b/app/Models/Customer.php index f030e67..ec098f1 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -208,14 +208,26 @@ class Customer extends Authenticatable implements JWTSubject public static function isMobileTaken(?string $mobile, ?int $exceptId = null): bool { - $mobile = self::normalizeMobile($mobile); - if ($mobile === null) { + return self::isMobileTakenOnTable(self::class, $mobile, $exceptId); + } + + public static function isMobileTakenOnTable(string $modelClass, ?string $mobile, ?int $exceptId = null): bool + { + $normalized = self::normalizeMobile($mobile); + if ($normalized === null) { return false; } - $query = static::query() - ->where('mobile', $mobile) - ->whereNull('deleted_at'); + if ($exceptId !== null) { + $current = $modelClass::query()->whereNull('deleted_at')->find($exceptId); + if ($current !== null && self::normalizeMobile($current->mobile ?? '') === $normalized) { + return false; + } + } + + $query = $modelClass::query() + ->whereNull('deleted_at') + ->whereIn('mobile', self::mobileLookupVariants($normalized)); if ($exceptId !== null) { $query->where('id', '<>', $exceptId); @@ -224,6 +236,17 @@ class Customer extends Authenticatable implements JWTSubject return $query->exists(); } + private static function mobileLookupVariants(string $normalized): array + { + $digits = ltrim($normalized, '0'); + + return array_values(array_unique(array_filter([ + $normalized, + $digits, + '0' . $digits, + ]))); + } + public static function assertMobileUnique(?string $mobile, ?int $exceptId = null): void { if (self::isMobileTaken($mobile, $exceptId)) { diff --git a/app/Models/User.php b/app/Models/User.php index 9820d91..9a2c5dc 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -9,6 +9,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; use Illuminate\Support\Facades\Hash; +use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; use Tymon\JWTAuth\Contracts\JWTSubject; @@ -80,4 +81,16 @@ class User extends Authenticatable implements JWTSubject public function setPasswordAttribute($value){ $this->attributes['password'] = Hash::make($value); } + + public static function isMobileTaken(?string $mobile, ?int $exceptId = null): bool + { + return Customer::isMobileTakenOnTable(self::class, $mobile, $exceptId); + } + + public static function assertMobileUnique(?string $mobile, ?int $exceptId = null): void + { + if (self::isMobileTaken($mobile, $exceptId)) { + throw new UnprocessableEntityHttpException('این شماره موبایل قبلاً ثبت شده است'); + } + } } diff --git a/config/validation.php b/config/validation.php index fe1b859..7cc6804 100644 --- a/config/validation.php +++ b/config/validation.php @@ -21,7 +21,7 @@ return[ 'lname' => 'required', ], 'admin/customer/{id}@put'=>[ - 'mobile' => 'sometimes|digits:11|unique:customers,mobile,update_id,id,deleted_at,NULL', + 'mobile' => 'sometimes|digits:11', 'fname' => 'sometimes|required', 'lname' => 'sometimes|required', ], @@ -32,9 +32,9 @@ return[ 'lname'=>'required' ], 'admin/user/{id}@put'=>[ - 'mobile'=>'required|digits:11|unique:users,mobile,update_id,id,deleted_at,NULL', - 'fname'=>'required', - 'lname'=>'required' + 'mobile'=>'sometimes|digits:11', + 'fname'=>'sometimes|required', + 'lname'=>'sometimes|required' ], //--------------------Customer Fund--------------------- 'customer/wallet/withdraw@post'=>[