This commit is contained in:
2025-05-29 15:39:57 +05:00
parent 1b96fb1a99
commit 505f6bb37b
9 changed files with 374 additions and 23 deletions

View File

@@ -0,0 +1,108 @@
<?php
namespace App\Nova\Resources\Order\Card\Requisite\Actions;
use App\Nova\Resources\Order\Card\CardTransaction\Actions\DownloadCardTransaction;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Actions\ActionResponse;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Http\Requests\NovaRequest;
use PhpOffice\PhpWord\TemplateProcessor;
class DownloadCardRequisite extends Action
{
use InteractsWithQueue, Queueable;
/**
* Perform the action on the given models.
*
* @param \Laravel\Nova\Fields\ActionFields $fields
* @param \Illuminate\Support\Collection $models
* @return mixed
*/
public function handle(ActionFields $fields, Collection $models)
{
/** @var \App\Models\Order\Card\Requisite\CardRequisite */
$model = $models->first();
/** @var \App\Nova\Resources\Order\Card\CardTransaction\Actions\ResponseTypes\AzatApiClientInfoAllResponse */
$data = $this->fetchApi($model);
if ($data->errCode != 0) {
return ActionResponse::danger($data->message);
}
$path = $this->generateFile($model, $data);
return ActionResponse::download(
name: 'card-requisite.docx',
url: url($path)
);
}
/**
* Get the fields available on the action.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request)
{
return [];
}
/**
* Fetch api
*
* @param \App\Models\Order\Card\Requisite\CardRequisite $model
*/
public function fetchApi($model)
{
$date = today()->format('d.m.Y');
$response = DownloadCardTransaction::make()->fetchApi(
passport_serie: $model->passport_serie,
passport_id: $model->passport_id,
card_number_masked: Str::mask($model->card_number, '*', 6, 6),
card_expire_date: $model->card_month.'/'.substr($model->card_year, 2),
start_date: $date,
end_date: $date,
);
return Str::isJson($response)
? json_decode($response)
: emptyClass(errCode: 1, message: 'Connection issue to VP');;
}
/**
* Generate file
*
* @param @param \App\Models\Order\Card\Requisite\CardRequisite $model
*/
public function generateFile($model)
{
$doc_path = app_path('Nova/Resources/Order/Card/Requisite/Docs/card-requisite.docx');
$templateProcessor = new TemplateProcessor($doc_path);
$templateProcessor->setValues([
'year' => date('Y'),
]);
$unique_folder_name = Str::snake(str_replace(':', '-', $model->created_at->toDateTimeString()));
$dir = public_path("files/card-requisite/{$unique_folder_name}");
File::makeDirectory($dir, 0777, true, true);
$filePath = $dir."/{$model->id}.docx";
$templateProcessor->saveAs($filePath);
return "files/card-requisite/{$unique_folder_name}/{$model->id}.docx";
}
}

View File

@@ -4,10 +4,12 @@ namespace App\Nova\Resources\Order\Card\Requisite;
use App\Models\Branch\Branch;
use App\Models\Order\Card\Requisite\CardRequisite as CardRequisiteModel;
use App\Modules\DateHelper\Repositories\DateHelperRepository;
use App\Nova\Filters\RegionFilter;
use App\Nova\Filters\StatusFilter;
use App\Nova\Nova;
use App\Nova\Resource;
use App\Nova\Resources\Order\Card\Requisite\Actions\DownloadCardRequisite;
use App\Nova\Resources\Order\Card\Requisite\Concerns\CardRequisiteFieldsForDetail;
use App\Nova\Resources\Order\Card\Requisite\Concerns\CardRequisiteFieldsForIndex;
use App\Repos\Order\Card\CardOrderRepo;
@@ -205,19 +207,23 @@ class CardRequisite extends Resource
->canSeeWhen('systemUser', $this),
new Panel(__('Card'), [
Select::make(__('Card type'), 'card_type_id')
->displayUsingLabels()
->fullWidth()
->searchable()
->options(CardTypeRepo::values())
->size('w-1/2')
->rules('required'),
NovaInputmask::make(__('Card number'), 'card_number')
->mask('9999 9999 9999 9999')
->storeRawValue()
->size('w-1/2')
->rules('required', 'int', 'digits:16'),
Select::make(__('Card').' '.__('Expiration month'), 'card_month')
->searchable()
->options(DateHelperRepository::staticNumberMonths())
->size('md:w-1/4')
->rules('required'),
Select::make(__('Card').' '.__('Expiration year'), 'card_year')
->searchable()
->options(DateHelperRepository::staticNumberYears())
->size('md:w-1/4')
->rules('required'),
]),
new Panel(__('Location'), [
@@ -301,13 +307,6 @@ class CardRequisite extends Resource
->creationRules('required')
->updateRules('nullable'),
]),
new Panel(__('Ready files'), [
File::make(__('Card requisite'), 'ready_files')
->rules('max:2048', 'mimes:doc,docx,rtf,pdf,jpg,png,jpeg')
->hideWhenCreating()
->canSeeWhen('systemUser', $this),
]),
];
}
@@ -325,4 +324,18 @@ class CardRequisite extends Resource
new StatusFilter,
];
}
/**
* Actions
*
* @return array<int, \Laravel\Nova\Actions\Action>
*/
public function actions(NovaRequest $request): array
{
return [
DownloadCardRequisite::make()
->icon('arrow-down-tray')
->sole(),
];
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Resources\Order\Card\Requisite\Concerns;
use App\Modules\DateHelper\Repositories\DateHelperRepository;
use App\Nova\Resources\Branch\Branch;
use App\Nova\Resources\Order\Card\CardType;
use App\Nova\User;
@@ -51,11 +52,15 @@ class CardRequisiteFieldsForDetail
BelongsTo::make(__('Created by').': ', 'user', User::class),
new Panel(__('Card'), [
BelongsTo::make(__('Card type'), 'cardType', CardType::class),
NovaInputmask::make(__('Card number'), 'card_number')
->mask('9999 9999 9999 9999')
->storeRawValue(),
Select::make(__('Card').' '.__('Expiration month'), 'card_month')
->options(DateHelperRepository::staticNumberMonths()),
Select::make(__('Card').' '.__('Expiration year'), 'card_year')
->options(DateHelperRepository::staticNumberYears())
]),
new Panel(__('Location'), [
@@ -97,10 +102,6 @@ class CardRequisiteFieldsForDetail
Image::make(__('Passport (page 8-9)'), 'passport_three'),
Image::make(__('Passport (page 32)'), 'passport_four'),
]),
new Panel(__('Ready files'), [
File::make(__('Card requisite'), 'ready_files'),
]),
];
}
}