From 016ffd761400067769bcf0ca85ecda97d5b3062d Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Mon, 21 Apr 2025 10:39:02 +0500 Subject: [PATCH] test drive --- app/Helpers/helpers.php | 18 ++++++ app/Models/Order/Card/CardOrder.php | 35 ++++++++++ .../Actions/RetryNovaCardOrderPayment.php | 64 +++++++++++++++++++ app/Nova/Guard/NovaGuard.php | 17 +++++ app/Nova/Resources/Order/Card/CardOrder.php | 41 +++--------- app/Nova/User.php | 2 +- app/Repos/Order/Card/CardStateRepo.php | 6 +- app/Repos/Order/Card/CardTypeRepo.php | 6 +- lang/tk.json | 3 +- phpstan.neon | 2 +- 10 files changed, 158 insertions(+), 36 deletions(-) create mode 100644 app/Modules/CardOrder/Nova/Actions/RetryNovaCardOrderPayment.php create mode 100644 app/Nova/Guard/NovaGuard.php diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php index 122ee75..0f62d94 100644 --- a/app/Helpers/helpers.php +++ b/app/Helpers/helpers.php @@ -268,3 +268,21 @@ function dbTypeToPhp(string $type): string default => 'string', }; } + +/** + * Cached value + * + * @param string $name + * @param mixed $value + * @param int $seconds + */ +function cached(string $name, mixed $value, int $seconds = 60): mixed +{ + return cache()->has($name) + ? cache($name) + : cache()->remember( + key: $name, + ttl: $seconds, + callback: fn () => is_callable($value) ? call_user_func($value) : $value + ); +} diff --git a/app/Models/Order/Card/CardOrder.php b/app/Models/Order/Card/CardOrder.php index 05e0f4d..84d6317 100644 --- a/app/Models/Order/Card/CardOrder.php +++ b/app/Models/Order/Card/CardOrder.php @@ -10,6 +10,41 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; +/** + * @property int $id + * @property null|string $unique_id + * @property int $card_state_id + * @property int $card_type_id + * @property string $region + * @property int $branch_id + * @property string $customer_name + * @property string $customer_surname + * @property null|string $customer_patronic_name + * @property null|string $born_at + * @property null|string $old_surname + * @property string $citizenship + * @property string $passport_serie + * @property string $passport_id + * @property string $passport_given_at + * @property string $passport_given_by + * @property string $born_place + * @property null|string $job_location + * @property null|string $passport_address + * @property null|string $real_address + * @property null|string $phone + * @property null|string $phone_additional + * @property null|string $status + * @property string $passport_one + * @property string $passport_two + * @property string $passport_three + * @property string $passport_four + * @property null|string $notes + * @property int $user_id + * @property null|\Illuminate\Support\Carbon $created_at + * @property null|\Illuminate\Support\Carbon $updated_at + * @property null|\Illuminate\Support\Carbon $deleted_at + * @property bool $paid + */ class CardOrder extends Model { use HasFactory; diff --git a/app/Modules/CardOrder/Nova/Actions/RetryNovaCardOrderPayment.php b/app/Modules/CardOrder/Nova/Actions/RetryNovaCardOrderPayment.php new file mode 100644 index 0000000..1e3df44 --- /dev/null +++ b/app/Modules/CardOrder/Nova/Actions/RetryNovaCardOrderPayment.php @@ -0,0 +1,64 @@ + ! $resource->paid && $resource->status === OrderRepo::PENDING; + } + + /** + * Perform the action on the given models. + * + * @param ActionFields $fields + * @param Collection $models + * @return mixed + */ + public function handle(ActionFields $fields, Collection $models): mixed + { + $resource = $models->first(); + + $payment = (new OnlinePaymentRepo)->payCardOrder($resource); + + return $payment['status'] === 'success' + ? ActionResponse::openInNewTab($payment['url']) + : ActionResponse::danger('Тöleg sistemada registrasiýa bolmady!'); + } + + /** + * Get the fields available on the action. + * + * @return array + */ + public function fields(NovaRequest $request): array + { + return []; + } +} diff --git a/app/Nova/Guard/NovaGuard.php b/app/Nova/Guard/NovaGuard.php new file mode 100644 index 0000000..df6b0b0 --- /dev/null +++ b/app/Nova/Guard/NovaGuard.php @@ -0,0 +1,17 @@ + $request->user()->isAdmin(); + } +} diff --git a/app/Nova/Resources/Order/Card/CardOrder.php b/app/Nova/Resources/Order/Card/CardOrder.php index c8569e4..66b9c5e 100644 --- a/app/Nova/Resources/Order/Card/CardOrder.php +++ b/app/Nova/Resources/Order/Card/CardOrder.php @@ -4,6 +4,7 @@ namespace App\Nova\Resources\Order\Card; use App\Models\Branch\Branch; use App\Models\Order\Card\CardOrder as CardOrderModel; +use App\Modules\CardOrder\Nova\Actions\RetryNovaCardOrderPayment; use App\Nova\Filters\RegionFilter; use App\Nova\Filters\StatusFilter; use App\Nova\Forms\NovaForm; @@ -23,10 +24,7 @@ use App\Rules\DowranAgaAllowed; use App\Rules\OnlyLetters; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Collection; use Illuminate\Support\Facades\Gate; -use Laravel\Nova\Actions\Action; -use Laravel\Nova\Fields\ActionFields; use Laravel\Nova\Fields\Date; use Laravel\Nova\Fields\Hidden; use Laravel\Nova\Fields\ID; @@ -40,6 +38,9 @@ use Laravel\Nova\URL; use Nurmuhammet\NovaCustomHtml\NovaCustomHtml; use Nurmuhammet\NovaInputmask\NovaInputmask; +/** + * @mixin CardOrderModel + */ class CardOrder extends Resource { /** @@ -117,17 +118,18 @@ class CardOrder extends Resource */ public static function indexQuery(NovaRequest $request, mixed $query): Builder { + /** @var \App\Models\User */ $user = $request->user(); if ($user->isAdmin()) { return $query; } - if ($user->isOperator()) { + if ($user->isOperator() && count($user->branches()->pluck('branches.id')) < 1) { return $query->whereIn('branch_id', $user->branches()->pluck('branches.id')); } - return $query->where('user_id', $request->user()->id); + return $query->where('user_id', $user->id); } /** @@ -155,20 +157,6 @@ class CardOrder extends Resource : sprintf('resources/%s/%s', static::uriKey(), $resource->getKey()); } - /** - * Return the location to redirect the user after update. - * - * @param \Laravel\Nova\Resource $resource - */ - // public static function redirectAfterUpdate(NovaRequest $request, $resource): URL|string - // { - // $payment = (new OnlinePaymentRepo())->payCardOrder($resource); - - // return $payment['status'] === 'success' - // ? URL::remote($payment['url']) - // : sprintf('resources/%s/%s', static::uriKey(), $resource->getKey()); - // } - /** * Get the fields for index. * @@ -389,19 +377,10 @@ class CardOrder extends Resource public function actions(NovaRequest $request): array { return [ - Action::using('Tölegi täzeden geçir', function (ActionFields $fields, Collection $models) { - $resource = $models->first(); - - $payment = (new OnlinePaymentRepo)->payCardOrder($resource); - - return $payment['status'] === 'success' - ? URL::remote($payment['url']) - : sprintf('resources/%s/%s', static::uriKey(), $resource->getKey()); - })->icon('credit-card') + RetryNovaCardOrderPayment::make() + ->icon('credit-card') ->sole() - ->canSee(function ($request) { - return $request->user()->isAdmin(); - }), + ->canSee(RetryNovaCardOrderPayment::permissions($this)), ]; } } diff --git a/app/Nova/User.php b/app/Nova/User.php index 6debde5..8d55478 100644 --- a/app/Nova/User.php +++ b/app/Nova/User.php @@ -54,7 +54,7 @@ class User extends Resource * @var array */ public static $search = [ - 'id', 'name', 'email', 'phone', + 'id', 'name', 'email', 'phone', 'username', ]; /** diff --git a/app/Repos/Order/Card/CardStateRepo.php b/app/Repos/Order/Card/CardStateRepo.php index 9692ced..382158b 100644 --- a/app/Repos/Order/Card/CardStateRepo.php +++ b/app/Repos/Order/Card/CardStateRepo.php @@ -14,6 +14,10 @@ class CardStateRepo */ public static function values(): Collection|array { - return CardState::where('active', true)->pluck('name', 'id'); + return cached( + 'card-states', + fn () => CardState::where('active', true)->pluck('name', 'id'), + 60 * 60 + ); } } diff --git a/app/Repos/Order/Card/CardTypeRepo.php b/app/Repos/Order/Card/CardTypeRepo.php index b08e501..e5bbb92 100644 --- a/app/Repos/Order/Card/CardTypeRepo.php +++ b/app/Repos/Order/Card/CardTypeRepo.php @@ -14,6 +14,10 @@ class CardTypeRepo */ public static function values(): Collection|array { - return CardType::where('active', true)->pluck('name', 'id'); + return cached( + 'card-types', + fn () => CardType::where('active', true)->pluck('name', 'id'), + 60 * 60 + ); } } diff --git a/lang/tk.json b/lang/tk.json index 9ba033d..1f1dd66 100644 --- a/lang/tk.json +++ b/lang/tk.json @@ -333,5 +333,6 @@ "Loan order required docs": "Karz gerekli resminamalary", "Required docs": "Gerekli resminamalar", "Payment items": "Тöleg taryhy", - "This month": "Şul aý" + "This month": "Şul aý", + "Retry payment": "Tölegi täzeden geçir" } diff --git a/phpstan.neon b/phpstan.neon index 365fb7e..c14d4b4 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -7,7 +7,7 @@ parameters: - app/ # Level 9 is the highest level - level: 7 + level: 6 # ignoreErrors: # - '#PHPDoc tag @var#'