diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php index 0f62d94..02ab046 100644 --- a/app/Helpers/helpers.php +++ b/app/Helpers/helpers.php @@ -1,10 +1,13 @@ is_callable($value) ? call_user_func($value) : $value ); } + +function view_loan_order_permission_id(): int +{ + return Cache::rememberForever('view_loan_order_permission_id', function () { + return Permission::query()->where('name', 'ViewLoanOrders')->first(['id', 'name'])->id; + }); +} diff --git a/app/Nova/Resources/Order/Loan/LoanOrder.php b/app/Nova/Resources/Order/Loan/LoanOrder.php index 41e4c71..c02e6b7 100644 --- a/app/Nova/Resources/Order/Loan/LoanOrder.php +++ b/app/Nova/Resources/Order/Loan/LoanOrder.php @@ -22,7 +22,6 @@ use App\Rules\DowranAgaAllowed; use App\Rules\OnlyLetters; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Gate; use Laravel\Nova\Fields\Date; use Laravel\Nova\Fields\Email; @@ -151,9 +150,14 @@ class LoanOrder extends Resource */ public static function afterUpdate(NovaRequest $request, Model $model): void { + /** @var LoanOrderModel */ + $loanOrder = $model; + if ($request->user()->doesntHaveRoles()) { - LoanOrderRepo::notifyUser($request, $model, __('Loan order updated'), 'info', 'pencil-alt'); + LoanOrderRepo::notifyUser($request, $loanOrder, __('Loan order updated'), 'info', 'pencil-alt'); } + + LoanOrderRepo::notifyOperators($loanOrder); } /** diff --git a/app/Policies/Order/Loan/LoanOrderPolicy.php b/app/Policies/Order/Loan/LoanOrderPolicy.php index fa86a8c..90d5f4c 100644 --- a/app/Policies/Order/Loan/LoanOrderPolicy.php +++ b/app/Policies/Order/Loan/LoanOrderPolicy.php @@ -13,8 +13,8 @@ class LoanOrderPolicy */ public function viewAny(User $user): bool { - if ($user->isOperator() && $user->cannot('viewLoanOrders')) { - return false; + if ($user->isOperator()) { + return $user->getPermissionNames()->contains('ViewLoanOrders'); } return true; @@ -29,8 +29,11 @@ class LoanOrderPolicy return true; } - if ($user->isOperator() && $user->can('viewLoanOrders')) { - return $user->branches()->where('branches.id', $loanOrder->branch_id)->exists(); + if ($user->isOperator() && $user->getPermissionNames()->contains('ViewLoanOrders')) { + return in_array( + $loanOrder->branch_id, + $user->branches->pluck('id')->toArray() + ); } if ($user->ownsLoanOrder($loanOrder)) { @@ -45,8 +48,8 @@ class LoanOrderPolicy */ public function create(User $user): bool { - if ($user->isOperator() && $user->cannot('viewLoanOrders')) { - return false; + if ($user->isOperator()) { + return $user->getPermissionNames()->contains('ViewLoanOrders'); } return true; @@ -61,8 +64,11 @@ class LoanOrderPolicy return true; } - if ($user->isOperator() && $user->can('viewLoanOrders')) { - return $user->branches()->where('branches.id', $loanOrder->branch_id)->exists(); + if ($user->isOperator() && $user->getPermissionNames()->contains('ViewLoanOrders')) { + return in_array( + $loanOrder->branch_id, + $user->branches->pluck('id')->toArray() + ); } if ($user->ownsLoanOrder($loanOrder) && in_array($loanOrder->status, [ @@ -83,8 +89,11 @@ class LoanOrderPolicy return true; } - if ($user->isOperator() && $user->can('viewLoanOrders')) { - return $user->branches()->where('branches.id', $loanOrder->branch_id)->exists(); + if ($user->isOperator() && $user->getPermissionNames()->contains('ViewLoanOrders')) { + return in_array( + $loanOrder->branch_id, + $user->branches->pluck('id')->toArray() + ); } if ($user->ownsLoanOrder($loanOrder)) { diff --git a/app/Repos/Order/Loan/LoanOrderRepo.php b/app/Repos/Order/Loan/LoanOrderRepo.php index 6f4edec..60d2835 100644 --- a/app/Repos/Order/Loan/LoanOrderRepo.php +++ b/app/Repos/Order/Loan/LoanOrderRepo.php @@ -3,10 +3,13 @@ namespace App\Repos\Order\Loan; use App\Models\Branch\Branch; +use App\Models\Order\Loan\LoanOrder; use App\Nova\Resources\Order\Loan\LoanOrder as NovaLoanOrder; use App\Repos\Order\OrderRepo; use Closure; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; use Laravel\Nova\Http\Requests\NovaRequest; use Laravel\Nova\Notifications\NovaNotification; use Laravel\Nova\URL; @@ -62,14 +65,11 @@ class LoanOrderRepo public static function notifyUser( NovaRequest $request, - Model $model, + LoanOrder $loanOrder, string $message, string $type = 'info', string $icon = 'eye', ): void { - /** @var \App\Models\Order\Loan\LoanOrder */ - $loanOrder = $model; - $id = $loanOrder->id; $nova_path = config('nova.path'); $loan_order_path = NovaLoanOrder::uriKey(); @@ -83,4 +83,49 @@ class LoanOrderRepo ->type($type) ); } + + public static function notifyOperators( + LoanOrder $loanOrder, + string $message, + string $type = 'info', + string $icon = 'eye', + ): void { + $id = $loanOrder->id; + $nova_path = config('nova.path'); + $loan_order_path = NovaLoanOrder::uriKey(); + $url = url($nova_path.'/resources/'.$loan_order_path.'/'.$id); + + // Get users related with branch... + $branch_users = DB::table('branch_user')->where('branch_id', $loanOrder->branch_id)->pluck('user_id'); + + // Check if they have permission for viewing loan order + $loanOrderOperators = DB::table('model_has_permissions') + ->where('permission_id', view_loan_order_permission_id()) + ->whereIntegerInRaw('model_id', $branch_users) + ->pluck('model_id'); + + $loanOrderOperators->each(function ($branch_user) use ($icon, $message, $url, $type) { + DB::table('nova_notifications')->insert([ + 'id' => Str::uuid(), + 'type' => 'Laravel\Nova\Notifications\NovaNotification', + 'notifiable_type' => 'App\Models\User', + 'notifiable_id' => $branch_user, + 'data' => json_encode([ + 'component' => 'message-notification', + 'icon' => $icon, + 'message' => $message, + 'actionText' => 'Görmek', + 'actionUrl' => [ + 'url' => URL::remote($url), + 'remote' => true, + ], + 'openInNewTab' => false, + 'type' => $type, + 'iconClass' => 'text-sky-500', + ]), + 'created_at' => now(), + 'updated_at' => now(), + ]); + }); + } }