add Sber payment order module

This commit is contained in:
2024-09-08 21:45:50 +05:00
parent 305e9e4a0a
commit fab7bfa193
17 changed files with 718 additions and 571 deletions

View File

@@ -11,7 +11,7 @@ return new class extends Migration
*/
public function up(): void
{
Schema::create('swift_payments', function (Blueprint $table) {
Schema::create('sber_payment_orders', function (Blueprint $table) {
$table->id();
$table->string('unique_id')->nullable()->unique();
@@ -43,6 +43,6 @@ return new class extends Migration
*/
public function down(): void
{
Schema::dropIfExists('swift_payments');
Schema::dropIfExists('sber_payment_orders');
}
};

View File

@@ -0,0 +1,141 @@
<?php
namespace App\Modules\SberPaymentOrder\Models;
use App\Models\Branch\Branch;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class SberPaymentOrder extends Model implements HasMedia
{
use InteractsWithMedia;
/**
* Table
*
* @var string
*/
protected $table = 'sber_payment_orders';
/**
* Guarded attributes
*/
protected $guarded = [];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'sender_datas' => 'array',
'payment_reciever' => 'array',
];
/**
* Media collections
*/
public function registerMediaCollections(): void
{
foreach (static::reciverFiles() as $reciverFile) {
$this->addMediaCollection($reciverFile['code'])->singleFile();
}
foreach (static::senderFiles() as $senderFile) {
$this->addMediaCollection($senderFile['code'])->singleFile();
}
}
/**
* Branch
*/
public function branch(): BelongsTo
{
return $this->belongsTo(Branch::class);
}
/**
* Required files
*/
public static function reciverFiles(): array
{
return [
[
'required' => true,
'code' => 'requisite',
'name' => 'Talyba degişli walýuta “SBERBANK” kartyň rekwizitleri',
],
[
'required' => false,
'code' => 'document_stating_he_is_studying',
'name' => 'Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy',
],
[
'required' => false,
'code' => 'passport_local',
'name' => 'Talyba degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'passport_international',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin (zagran) pasportynyň göçürmesi',
],
[
'required' => false,
'code' => 'visa',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary ýurtda galyp okap bilýändigi baradaky berlen möhleti hereket edýän rugsatnamasynyň (wizasynyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => false,
'code' => 'travel_stamp_on_passport',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky Türkmenistandan çykandygy we daşary ýurt döwletine girendigi baradaky ştamplaryň (seneli ştampyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => false,
'code' => 'document_stating_he_is_studying_2',
'name' => 'Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasyndaky maglumatyň doly takyk däl ýagdaýynda takyk däl maglumatyň sebäpleri baradaky daşary ýurt döwletiniň ýokary okuw mekdebinden haty',
],
];
}
/**
* Sender files
*/
public static function senderFiles(): array
{
return [
[
'required' => true,
'code' => 'passport_local',
'name' => 'Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'passport_international',
'name' => 'Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'travel_stamp_on_passport',
'name' => 'Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary döwletine gidendigi we daşary döwlete barandygy baradaky (ştampyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => true,
'code' => 'proof_of_kinship',
'name' => 'Ugradyjynyň we kabul edijiniň (talybyň) özara garyndaşlyk derejesini tassyklaýjy resminamalarynyň göçürmesi',
],
[
'required' => false,
'code' => 'passport_local_old',
'name' => 'Ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alan bolsa, onda birinji gezek alan pasportynyň seriýasy baradaky maglumat',
],
[
'required' => false,
'code' => 'passport_local_old_replacement',
'name' => 'Ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alandan soňra birinji gezek alan pasportynyň seriýasy baradaky maglumaty bilmeýän ,bolsa onda polisiýanyň degişli edaralaryndan birinji alan pasportynyň seriýasy baradaky güwänamasy',
],
];
}
}

View File

@@ -0,0 +1,144 @@
<?php
namespace App\Modules\SberPaymentOrder\Nova\Resources\Concerns;
use App\Modules\VisaMasterPaymentOrder\Nova\Resources\VisaMasterPaymentOrderFileFields;
use App\Nova\Resources\Branch\Branch;
use App\Repos\Order\OrderRepo;
use App\Repos\System\Settings\Legal\PassportRepo;
use App\Repos\System\Settings\Location\RegionRepo;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Panel;
use Nurmuhammet\NovaInputmask\NovaInputmask;
use Outl1ne\NovaSimpleRepeatable\SimpleRepeatable;
class SberPaymentOrderFieldsForDetail
{
/**
* Get fields for detail view
*
* @return array
*/
public static function make($resource): array
{
return [
new Panel(__('Status'), [
ID::make()
->hideFromDetail(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderRepo::statusValues())
->default(OrderRepo::defaultStatus())
->fullWidth()
->hideFromDetail()
->rules('required')
->canSeeWhen('systemUser', $resource),
Badge::make(__('Status'), 'status')
->map(OrderRepo::statusClasses())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->labels(OrderRepo::statusValues())
->withIcons()
->icons(OrderRepo::statusIcons()),
Text::make(__('Note'), 'notes')
->fullWidth()
->canSeeWhen('systemUser', $resource),
]),
new Panel(__('Location'), [
Select::make(__('Region'), 'region')
->fullWidth()
->displayUsingLabels()
->searchable()
->options(RegionRepo::values())
->default(RegionRepo::default())
->rules('required')
->sortable(),
BelongsTo::make(__('Branch'), 'branch', Branch::class),
]),
new Panel(__('Personal data'), [
Text::make(__('Passport name'), 'passport_name')
->fullWidth()
->rules('required', 'string', 'max:255'),
Text::make(__('Passport surname'), 'passport_surname')
->fullWidth()
->rules('required', 'string', 'max:255'),
NovaInputmask::make(__('Phone'), 'phone')
->fullWidth()
->phonenumber('TM')
->rules('required', 'max:255')
->hideFromIndex(),
Text::make(__('Email'), 'email')
->fullWidth()
->rules('nullable', 'max:255', 'email')
->hideFromIndex(),
Text::make(__('Current Residence'), 'address')
->fullWidth()
->rules('required', 'string', 'max:255')
->hideFromIndex(),
]),
new Panel(__('Payment'), [
SimpleRepeatable::make(__('Payment sender data'), 'sender_datas', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)
->rules('required', 'max:255'),
])->minRows(1)->rules('required'),
SimpleRepeatable::make(__('Payee information'), 'payment_reciever', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)->rules('required', 'max:255'),
])->maxRows(1)->minRows(1)->rules('required'),
]),
new Panel(__('Reciver files'), VisaMasterPaymentOrderFileFields::reciverFiles()),
new Panel(__('Sender files'), VisaMasterPaymentOrderFileFields::senderFiles()),
];
}
}

View File

@@ -1,8 +1,7 @@
<?php
namespace App\Modules\Swiftpayment\Nova\Resources\Concerns;
namespace App\Modules\SberPaymentOrder\Nova\Resources\Concerns;
use App\Modules\Swiftpayment\Models\ApplicationTypes;
use App\Nova\Resources\Branch\Branch;
use App\Repos\Order\OrderRepo;
use App\Repos\System\Settings\Location\RegionRepo;
@@ -13,7 +12,7 @@ use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
class SwiftpaymentFieldsForIndex
class SberPaymentOrderFieldsForIndex
{
/**
* Loan Order fields for "create"
@@ -25,13 +24,6 @@ class SwiftpaymentFieldsForIndex
Text::make(__('ID'), 'unique_id')->sortable(),
Select::make(__('Ýüztutmanyň görnüşi'), 'type')
->fullWidth()
->searchable()
->rules('required')
->displayUsingLabels()
->options(ApplicationTypes::applicationTypes()),
DateTime::make(__('Created at'), 'created_at')
->turkmenDateTime(),

View File

@@ -0,0 +1,247 @@
<?php
namespace App\Modules\SberPaymentOrder\Nova\Resources;
use App\Models\Branch\Branch;
use App\Modules\SberPaymentOrder\Nova\Resources\Concerns\SberPaymentOrderFieldsForDetail;
use App\Modules\SberPaymentOrder\Nova\Resources\Concerns\SberPaymentOrderFieldsForIndex;
use App\Nova\Resource;
use App\Repos\Order\Card\CardOrderRepo;
use App\Repos\Order\OrderRepo;
use App\Repos\System\Nova\NovaRepo;
use App\Repos\System\Settings\Legal\PassportRepo;
use App\Repos\System\Settings\Location\RegionRepo;
use Eminiarts\Tabs\Tab;
use Eminiarts\Tabs\Tabs;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Nurmuhammet\NovaInputmask\NovaInputmask;
use Outl1ne\NovaSimpleRepeatable\SimpleRepeatable;
/**
* @template TModel of \App\Modules\SberPaymentOrder\Models\SberPaymentOrder
*/
class NovaSberPaymentOrder extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Modules\SberPaymentOrder\Models\SberPaymentOrder>
*/
public static $model = \App\Modules\SberPaymentOrder\Models\SberPaymentOrder::class;
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'unique_id';
/**
* The columns that should be searched.
*
* @var array<int, string>
*/
public static $search = [
'unique_id', 'passport_name', 'passport_surname', 'phone',
];
/**
* The relationships that should be eager loaded on index queries.
*
* @var array
*/
public static $with = ['branch'];
/**
* Get the displayable label of the resource.
*/
public static function label(): string
{
return sprintf(
'%s (%s)',
__('Sber payments'),
Str::lower(__('For students'))
);
}
/**
* Get the displayable singular label of the resource.
*/
public static function singularLabel(): string
{
return sprintf(
'%s (%s)',
__('Sber payment'),
Str::lower(__('For students'))
);
}
/**
* After resource created
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
*/
public static function afterCreate(NovaRequest $request, Model $model): void
{
$model->update(['unique_id' => CardOrderRepo::fillUniqueId($model)]);
}
/**
* Get the fields for index.
*/
public function fieldsForIndex(): array
{
return SberPaymentOrderFieldsForIndex::make($this);
}
/**
* Get the fields for detail
*/
public function fieldsForDetail(): array
{
return SberPaymentOrderFieldsForDetail::make($this);
}
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array<int, \Laravel\Nova\Fields\FieldElement|\Laravel\Nova\Panel>
*/
public function fields(NovaRequest $request): array
{
return [
Tabs::make('Wizard', [
new Tab(__('Status'), [
ID::make()
->hideFromDetail(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderRepo::statusValues())
->default(OrderRepo::defaultStatus())
->fullWidth()
->hideFromDetail()
->rules('required')
->canSeeWhen('systemUser', $this),
Badge::make(__('Status'), 'status')
->map(OrderRepo::statusClasses())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->labels(OrderRepo::statusValues())
->withIcons()
->icons(OrderRepo::statusIcons()),
Text::make(__('Note'), 'notes')
->fullWidth()
->canSeeWhen('systemUser', $this),
]),
new Tab(__('Location'), [
Select::make(__('Region'), 'region')
->fullWidth()
->displayUsingLabels()
->searchable()
->options(RegionRepo::values())
->default(RegionRepo::default())
->rules('required')
->sortable(),
Select::make(__('Branch'), 'branch_id')
->fullWidth()
->displayUsingLabels()
->searchable()
->dependsOn('region', NovaRepo::dependsOnRegion('region', Branch::class))
->rules('required')
->sortable(),
]),
new Tab(__('Personal data'), [
Text::make(__('Passport name'), 'passport_name')
->fullWidth()
->rules('required', 'string', 'max:255'),
Text::make(__('Passport surname'), 'passport_surname')
->fullWidth()
->rules('required', 'string', 'max:255'),
NovaInputmask::make(__('Phone'), 'phone')
->fullWidth()
->phonenumber('TM')
->rules('required', 'max:255')
->hideFromIndex(),
Text::make(__('Email'), 'email')
->fullWidth()
->rules('nullable', 'max:255', 'email')
->hideFromIndex(),
Text::make(__('Current Residence'), 'address')
->fullWidth()
->rules('required', 'string', 'max:255')
->hideFromIndex(),
]),
new Tab(__('Payment'), [
SimpleRepeatable::make(__('Payment sender data'), 'sender_datas', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)
->rules('required', 'max:255'),
])->minRows(1)->rules('required'),
SimpleRepeatable::make(__('Payee information'), 'payment_reciever', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)->rules('required', 'max:255'),
])->maxRows(1)->minRows(1)->rules('required'),
]),
new Tab(__('Reciver files'), SberPaymentOrderFileFields::reciverFiles()),
new Tab(__('Sender files'), SberPaymentOrderFileFields::senderFiles()),
], $request)->asWizard(),
];
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Modules\SberPaymentOrder\Nova\Resources;
use App\Modules\SberPaymentOrder\Models\SberPaymentOrder;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Laravel\Nova\Fields\File;
use Laravel\Nova\Http\Requests\NovaRequest;
class SberPaymentOrderFileFields
{
/**
* Reciver files
*/
public static function reciverFiles(): array
{
return collect(SberPaymentOrder::reciverFiles())
->map(function (array $file) {
return File::make(__($file['name']), $file['code'])
->fullWidth()
->deletable(false)
->creationRules($file['required'] ? 'required' : 'nullable')
->updateRules('nullable')
->required($file['required'])
->store(function (NovaRequest $request, $model) use ($file) {
return function () use ($model, $file) {
$model->addMediaFromRequest($file['code'])
->preservingOriginal()
->toMediaCollection($file['code']);
};
})
->preview(function ($value, $disk, $resource) use ($file) {
return $resource->getFirstMediaUrl($file['code']);
});
})
->toArray();
}
/**
* Sender files
*/
public static function senderFiles(): array
{
return collect(SberPaymentOrder::senderFiles())
->map(function (array $file) {
return File::make(__($file['name']), $file['code'])
->fullWidth()
->deletable(false)
->creationRules($file['required'] ? 'required' : 'nullable')
->updateRules('nullable')
->required($file['required'])
->store(function (NovaRequest $request, $model) use ($file) {
return function () use ($model, $file) {
$model->addMediaFromRequest($file['code'])
->preservingOriginal()
->toMediaCollection($file['code']);
};
})
->preview(function ($value, $disk, $resource) use ($file) {
return $resource->getFirstMediaUrl($file['code']);
});
})
->toArray();
}
}

View File

@@ -1,69 +0,0 @@
<?php
namespace App\Modules\Swiftpayment\Models;
class ApplicationTypes
{
const STUDENT = 'student';
const STUDENT_VISA_MASTER_OTHER = 'student_visa_master_other';
const PATIENT = 'patient';
const PATIENT_VISA_MASTER_OTHER = 'patient_visa_master_other';
const VESTERN_UNION = 'vestern_union';
public static function applicationTypes()
{
return [
self::STUDENT => __('Talyp töleg'),
self::STUDENT_VISA_MASTER_OTHER => __('Talyp VISA/MASTER we beýleki'),
self::PATIENT => __('Hassa töleg'),
self::PATIENT_VISA_MASTER_OTHER => __('Hassa VISA/MASTER we beýleki'),
self::VESTERN_UNION => __('Halkara WesternUnion pul geçirim ulgamy'),
];
}
public static function applicationTypeFiles()
{
return [
self::STUDENT => [
'Daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy',
'Daşary ýurt döwletiniň ýokary okuw mekdebi bilen talybyň arasynda baglaşylan şertnama',
'Daşary ýurt döwletiniň ýokary okuw mekdebi tarapyndan töleg üçin ýazylan hasap-nyrhnama',
'Talybyň Türkmenistandan gitmek we Türkmenistana gelmek üçin pasportyndaky ýurdumyzdan çykandygy we daşary ýurda gidendigi baradaky degişli edaralaryň bellikleri bolan sahypalarynyň göçürmesi',
'Talybyň garyndaşlarynyň garyndaşlyk derejesini tassyklaýjy resminamalary we pasportlar',
],
self::STUDENT_VISA_MASTER_OTHER => [
'Daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy',
'Talybyň Türkmenistandan gitmek we Türkmenistana gelmek üçin pasportyndaky ýurdumyzdan çykandygy we daşary ýurda gidendigi baradaky degişli edaralaryň bellikleri bolan sahypalarynyň göçürmesi',
'Talybyň garyndaşlary ýüzlenen ýagdaýynda garyndaşlyk derejesini tassyklaýjy resminama',
],
self::PATIENT => [
'Türkmenistanyň Saglygy goraýyş we derman senagaty ministrliginiň Türkmenistanyň çäginden daşarda saglygynyň barlanmagynyň we bejerilmeginiň zerurlygy baradaky netijenamasy',
'Daşary ýurt saglygy goraýyş edarasy bilen hassanyň arasynda baglaşylan şertnama',
'Daşary ýurt saglygy goraýyş edarasy tarapyndan töleg üçin ýazylan hasap-nyrhnama',
'Talybyň Türkmenistandan gitmek we Türkmenistana gelmek üçin pasportyndaky ýurdumyzdan çykandygy we daşary ýurda gidendigi baradaky degişli edaralaryň bellikleri bolan sahypalarynyň göçürmesi',
'Hassanyň garyndaşlarynyň garyndaşlyk derejesini tassyklaýjy resminamalar we pasportlar',
],
self::PATIENT_VISA_MASTER_OTHER => [
'Türkmenistanyň Saglygy goraýyş we derman senagaty ministrliginiň Türkmenistanyň çäginden daşarda saglygynyň barlanmagynyň we bejerilmeginiň zerurlygy baradaky netijenamasy',
'Talybyň Türkmenistandan gitmek we Türkmenistana gelmek üçin pasportyndaky ýurdumyzdan çykandygy we daşary ýurda gidendigi baradaky degişli edaralaryň bellikleri bolan sahypalarynyň göçürmesi',
'Hassanyň garyndaşlarynyň garyndaşlyk derejesini tassyklaýjy resminamalar we pasportlar',
],
self::VESTERN_UNION => [
'Daşary ýurt döwletiniň bilim edarasynda okaýandygy baradaky güwänamasy',
'Maşgala agzalygy tassyklaýjy resminama',
'Talybyň Türkmenistandan gitmek we Türkmenistana gelmek üçin pasportyndaky ýurdumyzdan çykandygy we daşary ýurda gidendigi baradaky degişli edaralaryň bellikleri bolan sahypalarynyň göçürmesi',
],
];
}
public static function filesFor($type)
{
return view('nova.swiftpayments.required-files', [
'files' => static::applicationTypeFiles()[$type] ?? [],
])->render();
}
}

View File

@@ -1,49 +0,0 @@
<?php
namespace App\Modules\Swiftpayment\Models;
class SwiftPaymentStatus
{
const PENDING = 'pending';
const REGISTER = 'register';
const PROGRESS = 'progress';
const COMPLETED = 'completed';
const CANCELLED = 'cancelled';
public static function values(): array
{
return [
self::PENDING => __('Pending'),
self::REGISTER => __('Registered'),
self::PROGRESS => __('On Progress'),
self::COMPLETED => __('Completed'),
self::CANCELLED => __('Cancelled'),
];
}
public static function classes(): array
{
return [
self::PENDING => 'warning',
self::REGISTER => 'info',
self::PROGRESS => 'primary',
self::COMPLETED => 'success',
self::CANCELLED => 'danger',
];
}
public static function colors(): array
{
return [
self::PENDING => '#F5573B',
self::REGISTER => '#F2CB22',
self::PROGRESS => '#098F56',
self::COMPLETED => '#8FC15D',
self::CANCELLED => '#d70206',
];
}
}

View File

@@ -1,65 +0,0 @@
<?php
namespace App\Modules\Swiftpayment\Models;
use App\Models\Branch\Branch;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
class Swiftpayment extends Model implements HasMedia
{
use InteractsWithMedia;
/**
* Table
*
* @var string
*/
protected $table = 'swift_payments';
/**
* Guarded attributes
*/
protected $guarded = [];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'sender_datas' => 'array',
'payment_reciever' => 'array',
];
/**
* Media conversions
*
* @param Media|null $media
*/
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->width(200)
->height(200);
}
/**
* Media collections
*/
public function registerMediaCollections(): void
{
$this->addMediaCollection('main');
}
/**
* Branch
*/
public function branch(): BelongsTo
{
return $this->belongsTo(Branch::class);
}
}

View File

@@ -1,223 +0,0 @@
<?php
namespace App\Modules\Swiftpayment\Nova\Resources;
use App\Models\Branch\Branch;
use App\Modules\Swiftpayment\Models\ApplicationTypes;
use App\Modules\Swiftpayment\Nova\Resources\Concerns\SwiftpaymentFieldsForIndex;
use App\Nova\Resource;
use App\Repos\Order\Card\CardOrderRepo;
use App\Repos\Order\OrderRepo;
use App\Repos\System\Nova\NovaRepo;
use App\Repos\System\Settings\Legal\PassportRepo;
use App\Repos\System\Settings\Location\RegionRepo;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Illuminate\Database\Eloquent\Model;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Panel;
use Nurmuhammet\NovaInputmask\NovaInputmask;
use Outl1ne\NovaSimpleRepeatable\SimpleRepeatable;
/**
* @template TModel of \App\Modules\Swiftpayment\Models\Swiftpayment
*/
class NovaSwiftpayment extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Modules\Swiftpayment\Models\Swiftpayment>
*/
public static $model = \App\Modules\Swiftpayment\Models\Swiftpayment::class;
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'unique_id';
/**
* The columns that should be searched.
*
* @var array<int, string>
*/
public static $search = [
'unique_id', 'passport_name', 'passport_surname', 'phone',
];
/**
* Get the displayable label of the resource.
*/
public static function label(): string
{
return __('Swift payments');
}
/**
* Get the displayable singular label of the resource.
*/
public static function singularLabel(): string
{
return __('Swift payment');
}
/**
* After resource created
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
*/
public static function afterCreate(NovaRequest $request, Model $model): void
{
$model->update(['unique_id' => CardOrderRepo::fillUniqueId($model)]);
}
/**
* Get the fields for index.
*/
public function fieldsForIndex(): array
{
return SwiftpaymentFieldsForIndex::make($this);
}
/**
* Get the fields displayed by the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array<int, \Laravel\Nova\Fields\FieldElement|\Laravel\Nova\Panel>
*/
public function fields(NovaRequest $request): array
{
return [
ID::make()->sortable(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
new Panel(__('New :resource', ['resource' => $this->singularLabel()]), [
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderRepo::statusValues())
->default(OrderRepo::defaultStatus())
->fullWidth()
->hideFromDetail()
->rules('required')
->canSeeWhen('systemUser', $this),
Badge::make(__('Status'), 'status')
->map(OrderRepo::statusClasses())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->labels(OrderRepo::statusValues())
->withIcons()
->icons(OrderRepo::statusIcons()),
Text::make(__('Note'), 'notes')
->fullWidth()
->canSeeWhen('systemUser', $this),
]),
new Panel(__('Location'), [
Select::make(__('Ýüztutmanyň görnüşi'), 'type')
->fullWidth()
->searchable()
->rules('required')
->displayUsingLabels()
->options(ApplicationTypes::applicationTypes()),
Select::make(__('Region'), 'region')
->fullWidth()
->displayUsingLabels()
->searchable()
->options(RegionRepo::values())
->default(RegionRepo::default())
->rules('required')
->sortable(),
Select::make(__('Branch'), 'branch_id')
->fullWidth()
->displayUsingLabels()
->searchable()
->dependsOn('region', NovaRepo::dependsOnRegion('region', Branch::class))
->rules('required')
->sortable(),
]),
new Panel(__('Personal data'), [
Text::make('Pasportdaky ady', 'passport_name')
->fullWidth()
->rules('required', 'string', 'max:255'),
Text::make('Pasportdaky familiýa', 'passport_surname')
->fullWidth()
->rules('required', 'string', 'max:255'),
NovaInputmask::make('Telefon belgi', 'phone')
->fullWidth()
->phonenumber('TM')
->rules('required', 'max:255')
->hideFromIndex(),
Text::make('Email', 'email')
->fullWidth()
->rules('required', 'max:255', 'email')
->hideFromIndex(),
Text::make('Ýaşaýan ýeriň salgysy', 'address')
->fullWidth()
->rules('required', 'string', 'max:255')
->hideFromIndex(),
]),
new Panel(__('Töleg'), [
SimpleRepeatable::make('Tölegi ugradyjynyň maglumatlar', 'sender_datas', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make('Passport nomeri')
->mask('999999')
->rules('required', 'max:255'),
Text::make('A.F.AA'),
])->minRows(1)->rules('required'),
SimpleRepeatable::make('Tölegi kabul edijiniň maglumatlary', 'payment_reciever', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make('Passport nomeri')
->mask('999999')
->rules('required', 'max:255'),
Text::make('A.F.AA'),
])->maxRows(1)->minRows(1)->rules('required'),
Files::make('Talap edilýän resminamalar', 'main')
->conversionOnIndexView('thumb')
->rules('required')
->required()
->hideFromIndex(),
]),
];
}
}

View File

@@ -1,32 +0,0 @@
<?php
namespace App\Modules\Swiftpayment\Repositories;
use App\Modules\Swiftpayment\Models\Swiftpayment;
use Illuminate\Database\Eloquent\Builder;
class SwiftpaymentRepository
{
/**
* $queryBuilder
*
* @var \Illuminate\Database\Eloquent\Builder<\App\Modules\Swiftpayment\Models\Swiftpayment>
*/
protected Builder $queryBuilder;
/**
* Model
*/
public static function model(): string
{
return Swiftpayment::class;
}
/**
* Product repository
*/
public function __construct()
{
$this->queryBuilder = self::model()::query();
}
}

View File

@@ -6,7 +6,6 @@ use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use App\Modules\VisaMasterPaymentOrder\Nova\Resources\VisaMasterPaymentOrderFileFields;
use App\Nova\Resources\Branch\Branch;
use App\Repos\Order\OrderRepo;
use App\Repos\System\Nova\NovaRepo;
use App\Repos\System\Settings\Legal\PassportRepo;
use App\Repos\System\Settings\Location\RegionRepo;
use Laravel\Nova\Fields\Badge;
@@ -29,126 +28,126 @@ class VisaMasterPaymentOrderFieldsForDetail
public static function make($resource): array
{
return [
new Panel(__('Status'), [
ID::make()
->hideFromDetail(),
new Panel(__('Status'), [
ID::make()
->hideFromDetail(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
Select::make(__('Status'), 'status')
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderRepo::statusValues())
->default(OrderRepo::defaultStatus())
->fullWidth()
->hideFromDetail()
->rules('required')
->canSeeWhen('systemUser', $resource),
Badge::make(__('Status'), 'status')
->map(OrderRepo::statusClasses())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->labels(OrderRepo::statusValues())
->withIcons()
->icons(OrderRepo::statusIcons()),
Text::make(__('Note'), 'notes')
->fullWidth()
->canSeeWhen('systemUser', $resource),
]),
new Panel(__('Application type'), [
Select::make(__('Application type'), 'type')
->fullWidth()
->searchable()
->rules('required')
->displayUsingLabels()
->options(VisaMasterPaymentOrder::applicationTypes()),
]),
new Panel(__('Location'), [
Select::make(__('Region'), 'region')
->fullWidth()
->displayUsingLabels()
->searchable()
->options(RegionRepo::values())
->default(RegionRepo::default())
->rules('required')
->sortable(),
BelongsTo::make(__('Branch'), 'branch', Branch::class),
]),
new Panel(__('Personal data'), [
Text::make(__('Passport name'), 'passport_name')
->fullWidth()
->rules('required', 'string', 'max:255'),
Text::make(__('Passport surname'), 'passport_surname')
->fullWidth()
->rules('required', 'string', 'max:255'),
NovaInputmask::make(__('Phone'), 'phone')
->fullWidth()
->phonenumber('TM')
->rules('required', 'max:255')
->hideFromIndex(),
Text::make(__('Email'), 'email')
->fullWidth()
->rules('nullable', 'max:255', 'email')
->hideFromIndex(),
Text::make(__('Current Residence'), 'address')
->fullWidth()
->rules('required', 'string', 'max:255')
->hideFromIndex(),
]),
new Panel(__('Payment'), [
SimpleRepeatable::make(__('Payment sender data'), 'sender_datas', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(OrderRepo::statusValues())
->default(OrderRepo::defaultStatus())
->fullWidth()
->hideFromDetail()
->rules('required')
->canSeeWhen('systemUser', $resource),
Badge::make(__('Status'), 'status')
->map(OrderRepo::statusClasses())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->labels(OrderRepo::statusValues())
->withIcons()
->icons(OrderRepo::statusIcons()),
Text::make(__('Note'), 'notes')
->fullWidth()
->canSeeWhen('systemUser', $resource),
]),
new Panel(__('Application type'), [
Select::make(__('Application type'), 'type')
->fullWidth()
->searchable()
->rules('required')
->displayUsingLabels()
->options(VisaMasterPaymentOrder::applicationTypes()),
]),
new Panel(__('Location'), [
Select::make(__('Region'), 'region')
->fullWidth()
->displayUsingLabels()
->searchable()
->options(RegionRepo::values())
->default(RegionRepo::default())
->options(PassportRepo::values())
->rules('required')
->sortable(),
BelongsTo::make(__('Branch'), 'branch', Branch::class),
]),
new Panel(__('Personal data'), [
Text::make(__('Passport name'), 'passport_name')
->fullWidth()
->rules('required', 'string', 'max:255'),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(__('Passport surname'), 'passport_surname')
->fullWidth()
->rules('required', 'string', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)
->rules('required', 'max:255'),
])->minRows(1)->rules('required'),
NovaInputmask::make(__('Phone'), 'phone')
->fullWidth()
->phonenumber('TM')
->rules('required', 'max:255')
->hideFromIndex(),
SimpleRepeatable::make(__('Payee information'), 'payment_reciever', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
Text::make(__('Email'), 'email')
->fullWidth()
->rules('nullable', 'max:255', 'email')
->hideFromIndex(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(__('Current Residence'), 'address')
->fullWidth()
->rules('required', 'string', 'max:255')
->hideFromIndex(),
]),
new Panel(__('Payment'), [
SimpleRepeatable::make(__('Payment sender data'), 'sender_datas', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)->rules('required', 'max:255'),
])->maxRows(1)->minRows(1)->rules('required'),
]),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)
->rules('required', 'max:255'),
])->minRows(1)->rules('required'),
SimpleRepeatable::make(__('Payee information'), 'payment_reciever', [
Select::make(__('Passport serie'), 'passport_serie')
->displayUsingLabels()
->searchable()
->options(PassportRepo::values())
->rules('required')
->sortable(),
NovaInputmask::make(__('Passport number'), 'passport_number')
->mask('999999')
->rules('required', 'max:255'),
Text::make(
name: sprintf('%s %s %s', __('Name'), __('Surname'), __('Patronic name')),
attribute: 'full_name'
)->rules('required', 'max:255'),
])->maxRows(1)->minRows(1)->rules('required'),
]),
new Panel(__('Reciver files'), VisaMasterPaymentOrderFileFields::reciverFiles()),
new Panel(__('Sender files'), VisaMasterPaymentOrderFileFields::senderFiles()),
new Panel(__('Reciver files'), VisaMasterPaymentOrderFileFields::reciverFiles()),
new Panel(__('Sender files'), VisaMasterPaymentOrderFileFields::senderFiles()),
];
}
}

View File

@@ -4,7 +4,6 @@ namespace App\Modules\VisaMasterPaymentOrder\Nova\Resources;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Illuminate\Support\Facades\Storage;
use Laravel\Nova\Fields\File;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -24,7 +23,8 @@ class VisaMasterPaymentOrderFileFields
->updateRules('nullable')
->required($file['required'])
->store(function (NovaRequest $request, $model) use ($file) {
return function () use ($model, $request, $file) {
return function () use ($model, $file) {
// @phpstan-ignore-next-line
$model->addMediaFromRequest($file['code'])
->preservingOriginal()
->toMediaCollection($file['code']);
@@ -51,7 +51,8 @@ class VisaMasterPaymentOrderFileFields
->updateRules('nullable')
->required($file['required'])
->store(function (NovaRequest $request, $model) use ($file) {
return function () use ($model, $request, $file) {
return function () use ($model, $file) {
// @phpstan-ignore-next-line
$model->addMediaFromRequest($file['code'])
->preservingOriginal()
->toMediaCollection($file['code']);

View File

@@ -2,7 +2,7 @@
namespace App\Repos\System\Nova;
use App\Modules\Swiftpayment\Nova\Resources\NovaSwiftpayment;
use App\Modules\SberPaymentOrder\Nova\Resources\NovaSberPaymentOrder;
use App\Modules\VisaMasterPaymentOrder\Nova\Resources\NovaVisaMasterPaymentOrder;
use App\Nova\Dashboards\Main;
use App\Nova\Resources\Branch\Branch;
@@ -50,11 +50,9 @@ class NovaMenuRepo
MenuItem::resource(CardPin::class),
])->collapsedByDefault(),
MenuGroup::make(__('Swift payments'), [
MenuItem::resource(NovaSwiftpayment::class)
->name(sprintf('%s (%s)', __('International payments'), __('Visa, Master, Sber, WU'))),
MenuGroup::make(__('International payments'), [
MenuItem::resource(NovaVisaMasterPaymentOrder::class),
MenuItem::resource(NovaSberPaymentOrder::class),
])->collapsedByDefault(),
])->icon('ticket')->collapsedByDefault(),

View File

@@ -29,9 +29,6 @@ return [
'exclude' => [
base_path('vendor'),
base_path('node_modules'),
storage_path('app/Panel'),
storage_path('app/TBBANK'),
storage_path('app/backup-temp'),
],
/*

View File

@@ -299,5 +299,6 @@
"Payee information": "Tölegi kabul edijiniň maglumatlary",
"Reciver files": "Kabul ediji talyp boýunça resminamalary",
"Sender files": "Ugradyjy boýunça resminamalary",
"Next": "Indiki"
"Next": "Indiki",
"Loading": "Ýüklenilýär"
}

View File

@@ -34,7 +34,7 @@
<div id="loader-wrapper">
<div class="loader"></div>
<div class="loader-section">
<p>Loading<span class="dots">...</span></p>
<p>{{ __('Loading') }}<span class="dots">...</span></p>
</div>
</div>