diff --git a/README.md b/README.md index 3b90ccc..1b9cdf8 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,6 @@ create database nurmuhammetsdb; ALTER USER ahat WITH PASSWORD 'K}#zL9@}QkR>MAHMYTJ'; + +SELECT setval('card_orders_id_seq', (SELECT MAX(id) from card_orders)); +SELECT nextval('card_orders_id_seq'); diff --git a/app/Filament/Clusters/Cards/CardOrders/Schemas/CardOrderForm.php b/app/Filament/Clusters/Cards/CardOrders/Schemas/CardOrderForm.php index 0eecf46..76a5dab 100644 --- a/app/Filament/Clusters/Cards/CardOrders/Schemas/CardOrderForm.php +++ b/app/Filament/Clusters/Cards/CardOrders/Schemas/CardOrderForm.php @@ -36,13 +36,26 @@ class CardOrderForm Section::make(__('New card order')) ->columnSpan(4) ->columns(4) + ->disabled(function (string $context) { + if (user()->isSystemUser()) { + return false; + } + + return true; + }) + ->hidden(function (string $context): bool { + if (user()->isSystemUser()) { + return false; + } + + return $context === 'create'; + }) ->components([ Select::make('status') ->label(__('Status')) ->options(OrderStatusRepository::statusValues()) ->default(OrderStatusRepository::defaultStatus()) ->native(false) - ->required() ->columnSpan(2), Toggle::make('paid') diff --git a/app/Filament/Clusters/Cards/Resources/CardPinOrders/Schemas/CardPinOrderForm.php b/app/Filament/Clusters/Cards/Resources/CardPinOrders/Schemas/CardPinOrderForm.php index 9014b63..07ab626 100644 --- a/app/Filament/Clusters/Cards/Resources/CardPinOrders/Schemas/CardPinOrderForm.php +++ b/app/Filament/Clusters/Cards/Resources/CardPinOrders/Schemas/CardPinOrderForm.php @@ -29,6 +29,20 @@ class CardPinOrderForm Section::make(__('New card pin order')) ->columnSpanFull() + ->disabled(function (string $context) { + if (user()->isSystemUser()) { + return false; + } + + return true; + }) + ->hidden(function (string $context): bool { + if (user()->isSystemUser()) { + return false; + } + + return $context === 'create'; + }) ->components([ Select::make('status') ->label(__('Status')) diff --git a/app/Filament/Clusters/Loans/Loans/Schemas/LoanForm.php b/app/Filament/Clusters/Loans/Loans/Schemas/LoanForm.php index f76dfbe..e2e521f 100644 --- a/app/Filament/Clusters/Loans/Loans/Schemas/LoanForm.php +++ b/app/Filament/Clusters/Loans/Loans/Schemas/LoanForm.php @@ -22,6 +22,7 @@ class LoanForm ->default(user()->getOption('passport_id')), TextInput::make('account_number') + ->label(__('Account number')) ->required() ->string() ->maxLength(23), diff --git a/app/Filament/Clusters/Users/UsersCluster.php b/app/Filament/Clusters/Users/UsersCluster.php new file mode 100644 index 0000000..9c91396 --- /dev/null +++ b/app/Filament/Clusters/Users/UsersCluster.php @@ -0,0 +1,22 @@ +columns(2) + ->columns(6) ->components([ - TextInput::make('first_name') - ->label(__('First name')) - ->required(), - - TextInput::make('last_name') - ->label(__('Last name')) - ->required(), + TextInput::make('name') + ->label(__('Full Name')) + ->required() + ->columnSpan(3), TextInput::make('username') ->label(__('Username')) ->required() - ->unique(ignoreRecord: true), + ->unique(ignoreRecord: true) + ->columnSpan(3), TextInput::make('phone') - ->label(__('Phone number')) - ->unique(ignoreRecord: true), + ->label(__('Phone')) + ->unique(ignoreRecord: true) + ->mask('99 99 99 99') + ->prefix('+993') + ->rules([ + new PhoneNumberVerificationRule, + ]) + ->columnSpan(2), TextInput::make('email') ->label(__('Email')) ->email() - ->unique(ignoreRecord: true), + ->unique(ignoreRecord: true) + ->columnSpan(2), TextInput::make('password') ->label(__('Password')) ->password() ->dehydrateStateUsing(fn ($state) => Hash::make($state)) ->dehydrated(fn ($state) => filled($state)) - ->required(fn (string $context): bool => $context === 'create'), + ->required(fn (string $context): bool => $context === 'create') + ->columnSpan(2), Select::make('roles') ->label(__('Roles')) ->relationship('roles', 'name') ->multiple() ->preload() - ->native(false), + ->native(false) + ->columnSpan(3), Select::make('branches') ->label(__('Branches')) ->relationship('branches', 'name', fn (Builder $query) => $query->distinct('id')->orderBy('id')) ->multiple() ->preload() - ->native(false), + ->native(false) + ->columnSpan(3), ]); } } diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php index c1aa1bd..2e0c01a 100644 --- a/app/Filament/Resources/Users/UserResource.php +++ b/app/Filament/Resources/Users/UserResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\Users; +use App\Filament\Clusters\Users\UsersCluster; use App\Filament\Resources\Users\Pages\CreateUser; use App\Filament\Resources\Users\Pages\EditUser; use App\Filament\Resources\Users\Pages\ListUsers; @@ -16,15 +17,15 @@ use Filament\Tables\Table; class UserResource extends Resource { - protected static ?int $navigationSort = 2; - protected static ?string $model = User::class; + protected static ?string $cluster = UsersCluster::class; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedUsers; protected static string|BackedEnum|null $activeNavigationIcon = Heroicon::Users; - protected static ?string $recordTitleAttribute = 'first_name'; + protected static ?string $recordTitleAttribute = 'phone'; public static function getNavigationLabel(): string { diff --git a/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsVerfied.php b/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsVerfied.php index c8d9642..f4d7237 100644 --- a/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsVerfied.php +++ b/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsVerfied.php @@ -16,8 +16,13 @@ class RedirectIfUserPhoneIsVerfied */ public function handle(Request $request, Closure $next): Response { - if (Auth::check() && ! is_null($request->user()?->phone_verified_at)) { - return redirect(config()->string('module.base-auth.redirect_path')); + if (Auth::check()) { + /** @var \App\Models\User */ + $user = $request->user(); + + if (! is_null($user->phone_verified_at) || $user->isSystemUser()) { + return redirect(config()->string('module.base-auth.redirect_path')); + } } return $next($request); diff --git a/app/Modules/Branch/Models/UserBranch.php b/app/Modules/Branch/Models/UserBranch.php index 43b3253..e9bea52 100644 --- a/app/Modules/Branch/Models/UserBranch.php +++ b/app/Modules/Branch/Models/UserBranch.php @@ -12,11 +12,21 @@ class UserBranch extends Pivot protected $table = 'branch_user'; + /** + * Branch + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function branch(): BelongsTo { return $this->belongsTo(Branch::class); } + /** + * User + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/app/Modules/CardPinOrder/Models/CardPinOrder.php b/app/Modules/CardPinOrder/Models/CardPinOrder.php index e7383e1..d1e697b 100644 --- a/app/Modules/CardPinOrder/Models/CardPinOrder.php +++ b/app/Modules/CardPinOrder/Models/CardPinOrder.php @@ -3,8 +3,11 @@ namespace App\Modules\CardPinOrder\Models; use App\Models\User; +use App\Modules\Branch\Interfaces\BelongsToBranch; use App\Modules\Branch\Models\Branch; use App\Modules\CardOrder\Models\CardType; +use App\Modules\LoanOrder\Repositories\LoanOrderRepository; +use App\Modules\OrderStatus\Interfaces\HasStatus; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -33,7 +36,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at */ -class CardPinOrder extends Model +class CardPinOrder extends Model implements BelongsToBranch, HasStatus { /** * The attributes that should be cast. @@ -73,4 +76,15 @@ class CardPinOrder extends Model { return $this->belongsTo(Branch::class); } + + /** + * "boot" method for model + */ + protected static function boot(): void + { + parent::boot(); + + static::creating(LoanOrderRepository::creating()); + static::created(LoanOrderRepository::created()); + } } diff --git a/app/Modules/OrderStatus/Repositories/OrderStatusRepository.php b/app/Modules/OrderStatus/Repositories/OrderStatusRepository.php index ae496f6..3c3f872 100644 --- a/app/Modules/OrderStatus/Repositories/OrderStatusRepository.php +++ b/app/Modules/OrderStatus/Repositories/OrderStatusRepository.php @@ -106,6 +106,7 @@ class OrderStatusRepository self::PROCESSING => 'primary', self::COMPLETED => 'success', self::CANCELLED => 'danger', + default => 'primary', }; } diff --git a/app/Modules/UserAdjustments/Traits/RoleCheckers.php b/app/Modules/UserAdjustments/Traits/RoleCheckers.php index 73fedae..5d950c8 100644 --- a/app/Modules/UserAdjustments/Traits/RoleCheckers.php +++ b/app/Modules/UserAdjustments/Traits/RoleCheckers.php @@ -41,7 +41,7 @@ trait RoleCheckers */ public function isOperator(): bool { - return $this->hasRole('operator'); + return $this->hasRole(['operator', 'operator_card', 'operator_loan']); } /** @@ -57,6 +57,6 @@ trait RoleCheckers */ public function isSystemUser(): bool { - return $this->hasAnyRole(); + return $this->isAdmin() || $this->isOperator(); } } diff --git a/app/Modules/UserAdjustments/Traits/UserAdjustments.php b/app/Modules/UserAdjustments/Traits/UserAdjustments.php index 82f56af..6bad5e6 100644 --- a/app/Modules/UserAdjustments/Traits/UserAdjustments.php +++ b/app/Modules/UserAdjustments/Traits/UserAdjustments.php @@ -76,6 +76,8 @@ trait UserAdjustments /** * User branches + * + * @return HasMany */ public function userBranches(): HasMany {