Compare commits

...

20 Commits

Author SHA1 Message Date
c1b3a58c3a wip 2025-11-16 00:52:35 +05:00
c94ac5d12d some stan 2025-11-15 21:32:03 +05:00
c24f7cbac6 Refactor payment processing: update method names for clarity, enhance VisaMasterPaymentOrderRepository with payment validation logic, and improve Turkish translations for payment notifications. 2025-11-15 18:51:40 +05:00
8637c22ed7 Refactor CurrencyRateForm and PayVisaMasterPaymentAction: streamline component definitions, enhance layout with fieldsets, and update Turkish translations for payment-related terms. 2025-11-14 18:29:14 +05:00
2659aae278 Refactor CurrencyRateResource and VisaMasterSettings: remove unnecessary whitespace, add property annotations, and define possible setting types. Update Turkish translations for warning text and content. 2025-11-13 22:46:19 +05:00
038b5ea2fb Add navigation sorting to SettingsCluster, enhance CurrencyRate model with table association and name attribute, and update Turkish translations for currency terms 2025-11-13 22:12:35 +05:00
54e11dcbb4 work on pay visa master action 2025-11-13 22:00:23 +05:00
3ea35f6bca currency rates 2025-11-13 21:51:43 +05:00
b67fd61bf8 wip 2025-11-13 21:48:38 +05:00
816a6c2f60 Refactor VisaMasterPaymentOrder resource: removed infolist method, updated header actions in edit and view pages, and improved infolist styling. 2025-11-13 21:17:20 +05:00
294ec0144d locale fix 2025-11-13 11:49:41 +05:00
c2e9198dbc wip 2025-11-13 01:14:53 +05:00
074fe44ab3 wip 2025-11-13 00:35:29 +05:00
31ab39b21c wip 2025-11-13 00:13:29 +05:00
7bdd5243bd wip 2025-11-10 19:53:22 +05:00
0da1efe5c3 wip 2025-11-10 19:18:53 +05:00
8c24f00382 wip 2025-11-10 17:58:06 +05:00
60f7efd6ba wip 2025-11-10 17:55:13 +05:00
c16bb98ed3 wip 2025-11-10 17:51:23 +05:00
0779e4b9f6 visa master basic form 2025-11-07 01:43:27 +05:00
51 changed files with 2211 additions and 355 deletions

View File

@@ -3,8 +3,10 @@
namespace App\Filament\Clusters\Cards\CardOrders\Pages;
use App\Filament\Clusters\Cards\CardOrders\CardOrderResource;
use App\Modules\OrderStatus\Repositories\OrderStatusRepository;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
use Filament\Schemas\Components\Tabs\Tab;
class ListCardOrders extends ListRecords
{
@@ -16,4 +18,18 @@ class ListCardOrders extends ListRecords
CreateAction::make(),
];
}
public function getTabs(): array
{
$data = [];
foreach (array_keys(OrderStatusRepository::statusClasses()) as $status) {
if ($status === '') {
$data[null] = Tab::make(__('All'));
} else {
$data[$status] = Tab::make(OrderStatusRepository::statusFormatted($status))->query(fn ($query) => $query->where('status', $status));
}
}
return $data;
}
}

View File

@@ -31,6 +31,14 @@ class CardOrdersTable
->label(__('ID'))
->searchable(),
TextColumn::make('status')
->label(__('Status'))
->color(OrderStatusRepository::statusColorMatching())
->formatStateUsing(fn (string $state) => OrderStatusRepository::statusFormatted($state))
->badge()
->sortable()
->searchable(),
TextColumn::make('cardState.name')
->label(__('Reason'))
->searchable(),
@@ -69,14 +77,6 @@ class CardOrdersTable
->label(__('Phone'))
->searchable(),
TextColumn::make('status')
->label(__('Status'))
->color(OrderStatusRepository::statusColorMatching())
->formatStateUsing(fn (string $state) => OrderStatusRepository::statusFormatted($state))
->badge()
->sortable()
->searchable(),
TextColumn::make('updated_at')
->label(__('Updated At'))
->dateTime()

View File

@@ -11,7 +11,7 @@ class CardsCluster extends Cluster
{
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedCreditCard;
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::Top;
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::Start;
public static function getNavigationLabel(): string
{

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages\CreateCurrencyRate;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages\EditCurrencyRate;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages\ListCurrencyRates;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\Schemas\CurrencyRateForm;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\Tables\CurrencyRatesTable;
use App\Filament\Clusters\Settings\SettingsCluster;
use App\Modules\CurrencyRate\Models\CurrencyRate;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
class CurrencyRateResource extends Resource
{
protected static ?string $model = CurrencyRate::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedCurrencyDollar;
protected static ?string $cluster = SettingsCluster::class;
protected static ?string $recordTitleAttribute = 'name';
public static function getNavigationGroup(): ?string
{
return __('Currencies');
}
public static function getModelLabel(): string
{
return __('Currency rate');
}
public static function getPluralModelLabel(): string
{
return __('Currency rates');
}
public static function form(Schema $schema): Schema
{
return CurrencyRateForm::configure($schema);
}
public static function table(Table $table): Table
{
return CurrencyRatesTable::configure($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListCurrencyRates::route('/'),
'create' => CreateCurrencyRate::route('/create'),
'edit' => EditCurrencyRate::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\CurrencyRateResource;
use Filament\Resources\Pages\CreateRecord;
class CreateCurrencyRate extends CreateRecord
{
protected static string $resource = CurrencyRateResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\CurrencyRateResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditCurrencyRate extends EditRecord
{
protected static string $resource = CurrencyRateResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates\Pages;
use App\Filament\Clusters\Settings\Resources\CurrencyRates\CurrencyRateResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListCurrencyRates extends ListRecords
{
protected static string $resource = CurrencyRateResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates\Schemas;
use App\Modules\CurrencyRate\Models\CurrencyRate;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class CurrencyRateForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('currency_from')
->label(__('Currency from'))
->native(false)
->searchable()
->options(CurrencyRate::currencies())
->rules('required')
->belowLabel('1 möçberi'),
Select::make('currency_to')
->label(__('Currency to'))
->native(false)
->searchable()
->options(CurrencyRate::currencies())
->rules('required')
->belowLabel('1 möçberi'),
TextInput::make('value')
->label(__('Currency value'))
->required()
->numeric()
->belowLabel('Bitin däl sanlary "." bilen ýazmaly'),
]);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\CurrencyRates\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class CurrencyRatesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('currency_from')
->label(__('Currency from'))
->searchable(),
TextColumn::make('currency_to')
->label(__('Currency to'))
->searchable(),
TextColumn::make('value')
->label(__('Currency value'))
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\VisaMasterSettingsResource;
use Filament\Resources\Pages\CreateRecord;
class CreateVisaMasterSettings extends CreateRecord
{
protected static string $resource = VisaMasterSettingsResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\VisaMasterSettingsResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditVisaMasterSettings extends EditRecord
{
protected static string $resource = VisaMasterSettingsResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\VisaMasterSettingsResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListVisaMasterSettings extends ListRecords
{
protected static string $resource = VisaMasterSettingsResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Schemas;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterSettings;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class VisaMasterSettingsForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('name')
->label(__('Type'))
->options(VisaMasterSettings::types())
->native(false)
->required(),
TextInput::make('display_name')
->label(__('Name'))
->required()
->string()
->maxLength(255)
->readonly(! user()->isMe()),
RichEditor::make('value')
->label(__('Content'))
->required()
->columnSpanFull(),
]);
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class VisaMasterSettingsTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('display_name')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Filament\Clusters\Settings\Resources\VisaMasterSettings;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages\CreateVisaMasterSettings;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages\EditVisaMasterSettings;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Pages\ListVisaMasterSettings;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Schemas\VisaMasterSettingsForm;
use App\Filament\Clusters\Settings\Resources\VisaMasterSettings\Tables\VisaMasterSettingsTable;
use App\Filament\Clusters\Settings\SettingsCluster;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterSettings;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
class VisaMasterSettingsResource extends Resource
{
protected static ?string $model = VisaMasterSettings::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedDocumentText;
protected static ?string $cluster = SettingsCluster::class;
protected static ?string $recordTitleAttribute = 'display_name';
public static function getNavigationGroup(): ?string
{
return __('Currencies');
}
public static function getModelLabel(): string
{
return __('Warning text');
}
public static function getPluralModelLabel(): string
{
return __('Warning text');
}
public static function form(Schema $schema): Schema
{
return VisaMasterSettingsForm::configure($schema);
}
public static function table(Table $table): Table
{
return VisaMasterSettingsTable::configure($table);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListVisaMasterSettings::route('/'),
'create' => CreateVisaMasterSettings::route('/create'),
'edit' => EditVisaMasterSettings::route('/{record}/edit'),
];
}
}

View File

@@ -9,6 +9,8 @@ use Filament\Support\Icons\Heroicon;
class SettingsCluster extends Cluster
{
protected static ?int $navigationSort = 100;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedCog8Tooth;
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::End;

View File

@@ -3,11 +3,12 @@
namespace App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Pages;
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\VisaMasterPaymentOrderResource;
use App\Modules\VisaMasterPaymentOrder\Filament\Actions\PayVisaMasterPaymentAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\ViewAction;
use Filament\Resources\Pages\EditRecord;
use Illuminate\Contracts\Support\Htmlable;
class EditVisaMasterPaymentOrder extends EditRecord
{
@@ -16,10 +17,15 @@ class EditVisaMasterPaymentOrder extends EditRecord
protected function getHeaderActions(): array
{
return [
ViewAction::make(),
PayVisaMasterPaymentAction::make(),
DeleteAction::make(),
ForceDeleteAction::make(),
RestoreAction::make(),
];
}
public function getTitle(): string|Htmlable
{
return __('Order details');
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOr
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\VisaMasterPaymentOrderResource;
use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Icons\Heroicon;
class ViewVisaMasterPaymentOrder extends ViewRecord
{
@@ -13,7 +14,8 @@ class ViewVisaMasterPaymentOrder extends ViewRecord
protected function getHeaderActions(): array
{
return [
EditAction::make(),
EditAction::make()
->icon(Heroicon::OutlinedPencil),
];
}
}

View File

@@ -2,7 +2,26 @@
namespace App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Schemas;
use App\Modules\FilamentPermission\Repositories\FilamentPermissionRepository;
use App\Modules\OrderStatus\Repositories\OrderStatusRepository;
use App\Modules\PhoneNumberVerification\Rules\PhoneNumberVerificationRule;
use App\Modules\Region\Repositories\RegionRepository;
use App\Modules\TurkmenPassport\Repositories\TurkmenPassportRepository;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\SpatieMediaLibraryFileUpload;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\FusedGroup;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Wizard;
use Filament\Schemas\Components\Wizard\Step;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Illuminate\Support\Facades\Auth;
class VisaMasterPaymentOrderForm
{
@@ -10,7 +29,235 @@ class VisaMasterPaymentOrderForm
{
return $schema
->components([
//
Hidden::make('user_id')->default(Auth::id()),
Section::make()
->columnSpan(4)
->columns(4)
->disabled(fn (string $context): bool => FilamentPermissionRepository::forClients())
->components([
Select::make('status')
->label(__('Status'))
->options(OrderStatusRepository::statusValues())
->default(OrderStatusRepository::defaultStatus())
->native(false)
->columnSpan(2),
Toggle::make('paid')
->label(sprintf('%s (%s)', __('Paid'), __('This month')))
->inline(false)
->disabled(true)
->onIcon(Heroicon::CheckCircle)
->offIcon(Heroicon::XCircle)
->onColor('success')
->offColor('danger'),
RichEditor::make('notes')
->label(__('Bellik'))
->columnSpanFull(),
]),
Wizard::make([
Step::make(__('Order type and bank'))
->schema([
Fieldset::make(__('Order type'))
->schema([
Select::make('type')
->label(__('Type'))
->options(VisaMasterPaymentOrder::applicationTypes())
->native(false)
->required(),
]),
Fieldset::make(__('Location'))
->schema([
Select::make('region')
->label(__('Region'))
->options(RegionRepository::values())
->live()
->afterStateUpdated(fn (callable $set) => $set('branch_id', null))
->required(),
Select::make('branch_id')
->label(__('Branch'))
->relationship('branch', 'name', function ($query, callable $get) {
$query->orderByTranslation('name');
$region = $get('region');
if ($region) {
$query->where('region', $region);
}
})
->required(),
]),
]),
Step::make(__('Payment sender data'))
->columns(8)
->schema([
TextInput::make('sender_full_name')
->label(__('Name, Surname, Patronic name'))
->columnSpan(4)
->default(user()->fullName())
->required(),
FusedGroup::make([
Select::make('sender_passport_serie')
->label(__('Passport serie'))
->options(TurkmenPassportRepository::values())
->native(false)
->required()
->columnSpan(1)
->default(user()->getOption('passport_serie')),
TextInput::make('sender_passport_number')
->label(__('Passport number'))
->required()
->columnSpan(1)
->mask('999999')
->default(user()->getOption('passport_id')),
])
->columnSpan(2)
->label(__('Passport serie and number'))
->columns(2),
TextInput::make('phone')
->label(__('Phone'))
->required()
->mask('99 99 99 99')
->prefix('+993')
->rules([
new PhoneNumberVerificationRule,
])
->columnSpan(2)
->default(user()->phone),
TextInput::make('sender_deposit_account')
->label(__('Deposit account'))
->columnSpan(4)
->required(),
TextInput::make('address')
->label(__('Address'))
->columnSpan(4)
->required(),
Section::make(__('Files'))
->description('PNG, JPEG, PDF')
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryFileUpload::make('sender_passport_local')
->collection('sender_passport_local')
->label(__('Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
->required(),
SpatieMediaLibraryFileUpload::make('sender_passport_international')
->collection('sender_passport_international')
->label(__('Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportynyň asyl görnüşi we göçürmesi')),
SpatieMediaLibraryFileUpload::make('sender_travel_stamp_on_passport')
->collection('sender_travel_stamp_on_passport')
->label(__('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(),
SpatieMediaLibraryFileUpload::make('sender_proof_of_kinship')
->collection('sender_proof_of_kinship')
->label(__('Ugradyjynyň we kabul edijiniň (talybyň) özara garyndaşlyk derejesini tassyklaýjy resminamalarynyň göçürmesi')),
SpatieMediaLibraryFileUpload::make('sender_passport_local_old')
->collection('sender_passport_local_old')
->label(__('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')),
SpatieMediaLibraryFileUpload::make('sender_passport_local_old_replacement')
->collection('sender_passport_local_old_replacement')
->label(__('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')),
]),
]),
Step::make(__('Payee information'))
->columns(8)
->schema([
TextInput::make('reciever_full_name')
->label(__('Name, Surname, Patronic name'))
->columnSpan(5)
->required(),
FusedGroup::make([
Select::make('reciever_passport_serie')
->label(__('Passport serie'))
->options(TurkmenPassportRepository::values())
->native(false)
->required()
->columnSpan(1),
TextInput::make('reciever_passport_number')
->label(__('Passport number'))
->required()
->columnSpan(1)
->mask('999999'),
])
->columnSpan(3)
->label(__('Passport serie and number'))
->columns(2),
Section::make(__('Files'))
->description('PNG, JPEG, PDF')
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryFileUpload::make('receiver_requisite')
->collection('receiver_requisite')
->label(__('Talyba degişli walýuta "VISA" kartyň rekwizitleri'))
->maxSize(4096)
->columnSpan(1)
->required(),
SpatieMediaLibraryFileUpload::make('receiver_document_stating_he_is_studying')
->collection('receiver_document_stating_he_is_studying')
->label(__('Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy'))
->maxSize(4096)
->openable()
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_ticket')
->collection('receiver_ticket')
->label(__('Talybyň bilediniň göçürmesi'))
->maxSize(4096)
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_passport_local')
->collection('receiver_passport_local')
->label(__('Talyba degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
->maxSize(4096)
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_passport_international')
->collection('receiver_passport_international')
->label(__('Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin (zagran) pasportynyň göçürmesi'))
->maxSize(4096)
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_visa')
->collection('receiver_visa')
->label(__('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'))
->maxSize(4096)
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_travel_stamp_on_passport')
->collection('receiver_travel_stamp_on_passport')
->label(__('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'))
->maxSize(4096)
->columnSpan(1),
SpatieMediaLibraryFileUpload::make('receiver_document_stating_he_is_studying_2')
->collection('receiver_document_stating_he_is_studying_2')
->label(__('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'))
->maxSize(4096)
->columnSpan(1),
]),
]),
])->columnSpanFull()->skippable(fn (string $context) => $context === 'edit'),
]);
}
}

View File

@@ -2,7 +2,18 @@
namespace App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Schemas;
use App\Modules\OrderStatus\Repositories\OrderStatusRepository;
use App\Modules\Region\Repositories\RegionRepository;
use App\Modules\TurkmenPassport\Repositories\TurkmenPassportRepository;
use Filament\Infolists\Components\IconEntry;
use Filament\Infolists\Components\SpatieMediaLibraryImageEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
class VisaMasterPaymentOrderInfolist
{
@@ -10,7 +21,182 @@ class VisaMasterPaymentOrderInfolist
{
return $schema
->components([
//
Section::make()
->columnSpanFull()
->columns(3)
->components([
TextEntry::make('type')
->label(__('Payment type'))
->extraAttributes(['style' => 'text-transform:uppercase;font-size:1.5em;font-weight:bold;']),
TextEntry::make('status')
->label(__('Status'))
->formatStateUsing(fn (string $state) => OrderStatusRepository::statusFormatted($state))
->extraAttributes(['style' => 'text-transform:uppercase;font-size:1.2em;font-weight:bold;'])
->color(OrderStatusRepository::statusColorMatching()),
IconEntry::make('paid')
->label(sprintf('%s (%s)', __('Paid'), __('This month')))
->boolean()
->trueIcon(Heroicon::CheckCircle)
->falseIcon(Heroicon::XCircle)
->trueColor('success')
->falseColor('danger'),
TextEntry::make('notes')
->label(__('Bellik'))
->html()
->columnSpanFull()
->placeholder('-'),
]),
Tabs::make('Order Information')
->tabs([
Tab::make(__('Order type and bank'))
->schema([
Fieldset::make(__('Location'))
->schema([
TextEntry::make('region')
->label(__('Region'))
->formatStateUsing(fn ($state) => RegionRepository::values()[$state] ?? $state),
TextEntry::make('branch.name')
->label(__('Branch'))
->placeholder('-'),
]),
]),
Tab::make(__('Payment sender data'))
->columns(8)
->schema([
TextEntry::make('sender_full_name')
->label(__('Name, Surname, Patronic name'))
->columnSpan(4)
->placeholder('-'),
TextEntry::make('sender_passport')
->label(__('Passport serie and number'))
->formatStateUsing(function ($record) {
$serie = TurkmenPassportRepository::values()[$record->sender_passport_serie] ?? $record->sender_passport_serie;
return $serie.' '.$record->sender_passport_number;
})
->columnSpan(2)
->placeholder('-'),
TextEntry::make('phone')
->label(__('Phone'))
->formatStateUsing(fn ($state) => '+993 '.$state)
->columnSpan(2)
->placeholder('-'),
TextEntry::make('sender_deposit_account')
->label(__('Deposit account'))
->columnSpan(4)
->placeholder('-'),
TextEntry::make('address')
->label(__('Address'))
->columnSpan(4)
->placeholder('-'),
Section::make(__('Files'))
->description('PNG, JPEG, PDF')
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryImageEntry::make('sender_passport_local')
->collection('sender_passport_local')
->label(__('Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_passport_international')
->collection('sender_passport_international')
->label(__('Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportynyň asyl görnüşi we göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_travel_stamp_on_passport')
->collection('sender_travel_stamp_on_passport')
->label(__('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')),
SpatieMediaLibraryImageEntry::make('sender_proof_of_kinship')
->collection('sender_proof_of_kinship')
->label(__('Ugradyjynyň we kabul edijiniň (talybyň) özara garyndaşlyk derejesini tassyklaýjy resminamalarynyň göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_passport_local_old')
->collection('sender_passport_local_old')
->label(__('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')),
SpatieMediaLibraryImageEntry::make('sender_passport_local_old_replacement')
->collection('sender_passport_local_old_replacement')
->label(__('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')),
]),
]),
Tab::make(__('Payee information'))
->columns(8)
->schema([
TextEntry::make('reciever_full_name')
->label(__('Name, Surname, Patronic name'))
->columnSpan(5)
->placeholder('-'),
TextEntry::make('reciever_passport')
->label(__('Passport serie and number'))
->formatStateUsing(function ($record) {
$serie = TurkmenPassportRepository::values()[$record->reciever_passport_serie] ?? $record->reciever_passport_serie;
return $serie.' '.$record->reciever_passport_number;
})
->columnSpan(3)
->placeholder('-'),
Section::make(__('Files'))
->description('PNG, JPEG, PDF')
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryImageEntry::make('receiver_requisite')
->collection('receiver_requisite')
->label(__('Talyba degişli walýuta "VISA" kartyň rekwizitleri'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_document_stating_he_is_studying')
->collection('receiver_document_stating_he_is_studying')
->label(__('Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_ticket')
->collection('receiver_ticket')
->label(__('Talybyň bilediniň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_passport_local')
->collection('receiver_passport_local')
->label(__('Talyba degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_passport_international')
->collection('receiver_passport_international')
->label(__('Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin (zagran) pasportynyň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_visa')
->collection('receiver_visa')
->label(__('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'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_travel_stamp_on_passport')
->collection('receiver_travel_stamp_on_passport')
->label(__('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'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_document_stating_he_is_studying_2')
->collection('receiver_document_stating_he_is_studying_2')
->label(__('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'))
->columnSpan(1),
]),
]),
])->columnSpanFull(),
]);
}
}

View File

@@ -2,14 +2,19 @@
namespace App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Tables;
use App\Modules\OrderStatus\Repositories\OrderStatusRepository;
use App\Modules\Region\Repositories\RegionRepository;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
use Illuminate\Support\Str;
class VisaMasterPaymentOrdersTable
{
@@ -17,13 +22,52 @@ class VisaMasterPaymentOrdersTable
{
return $table
->columns([
//
TextColumn::make('id')
->label(__('ID'))
->sortable(),
TextColumn::make('type')
->label(__('Type'))
->formatStateUsing(fn (string $state) => Str::upper($state)),
TextColumn::make('status')
->label(__('Status'))
->color(OrderStatusRepository::statusColorMatching())
->formatStateUsing(fn (string $state) => OrderStatusRepository::statusFormatted($state))
->badge(),
TextColumn::make('created_at')
->label(__('Created At'))
->dateTime()
->sortable(),
TextColumn::make('region')
->label(__('Region'))
->formatStateUsing(fn (string $state): string => RegionRepository::label($state))
->searchable(),
TextColumn::make('branch.name')
->label(__('Branch'))
->searchable(),
TextColumn::make('sender_full_name')
->label(__('Full Name'))
->searchable(),
TextColumn::make('phone')
->label(__('Phone'))
->searchable(),
IconColumn::make('paid')
->label(sprintf('%s (%s)', __('Paid'), __('This month')))
->boolean(),
])
->filters([
TrashedFilter::make(),
])
->recordActions([
ViewAction::make(),
// ViewAction::make(),
EditAction::make(),
])
->toolbarActions([

View File

@@ -7,38 +7,48 @@ use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\P
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Pages\ListVisaMasterPaymentOrders;
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Pages\ViewVisaMasterPaymentOrder;
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Schemas\VisaMasterPaymentOrderForm;
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Schemas\VisaMasterPaymentOrderInfolist;
use App\Filament\Clusters\VisaMasterPayments\Resources\VisaMasterPaymentOrders\Tables\VisaMasterPaymentOrdersTable;
use App\Filament\Clusters\VisaMasterPayments\VisaMasterPaymentsCluster;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class VisaMasterPaymentOrderResource extends Resource
{
protected static ?string $model = VisaMasterPaymentOrder::class;
protected static ?int $navigationSort = 1;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedRectangleStack;
protected static ?string $model = VisaMasterPaymentOrder::class;
protected static ?string $cluster = VisaMasterPaymentsCluster::class;
protected static ?string $recordTitleAttribute = 'id';
protected static string|BackedEnum|null $navigationIcon = 'icon-visa-plain';
public static function getNavigationGroup(): ?string
{
return __('Visa/Master payments');
}
public static function getModelLabel(): string
{
return __('Visa/Master payment');
}
public static function getPluralModelLabel(): string
{
return __('Visa/Master payments');
}
public static function form(Schema $schema): Schema
{
return VisaMasterPaymentOrderForm::configure($schema);
}
public static function infolist(Schema $schema): Schema
{
return VisaMasterPaymentOrderInfolist::configure($schema);
}
public static function table(Table $table): Table
{
return VisaMasterPaymentOrdersTable::configure($table);
@@ -61,6 +71,11 @@ class VisaMasterPaymentOrderResource extends Resource
];
}
/**
* Get the query for the record route binding
*
* @return \Illuminate\Database\Eloquent\Builder<\App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder>
*/
public static function getRecordRouteBindingEloquentQuery(): Builder
{
return parent::getRecordRouteBindingEloquentQuery()

View File

@@ -5,18 +5,15 @@ namespace App\Filament\Clusters\VisaMasterPayments;
use BackedEnum;
use Filament\Clusters\Cluster;
use Filament\Pages\Enums\SubNavigationPosition;
use Filament\Support\Icons\Heroicon;
class VisaMasterPaymentsCluster extends Cluster
{
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedUsers;
protected static string|BackedEnum|null $activeNavigationIcon = Heroicon::Users;
protected static string|BackedEnum|null $navigationIcon = 'icon-visa-plain';
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::Top;
public static function getNavigationLabel(): string
{
return __('Visa/Master payments');
return __('International payments');
}
}

View File

@@ -20,7 +20,7 @@ class CardOrderRepository
$branch = $record->branch;
return OnlinePaymentRepository::make(relatedModel: $record)
->paymentProvider(
->setPaymentProvider(
HalkbankOnlinePaymentRepository::make()
->setUsername($branch->billingUsername())
->setPassword($branch->billingPassword())

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Modules\CurrencyRate\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CurrencyRateController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): void
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): void
{
//
}
/**
* Display the specified resource.
*/
public function show(Request $request): void
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request): void
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Request $request): void
{
//
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace App\Modules\CurrencyRate;
use App\Modules\Makeable;
use App\Modules\ModuleContract;
class CurrencyRateModule implements ModuleContract
{
use Makeable;
/**
* Module is enabled
*/
protected bool $enabled = true;
/**
* Check if is module enabled
*/
public function isEnabled(): bool
{
return $this->enabled;
}
/**
* Disable module
*/
public function disable(): void
{
$this->enabled = false;
}
/**
* Enable module
*/
public function enable(): void
{
$this->enabled = true;
}
/**
* Check if module has a filament resource
*/
public function hasFilamentResource(): bool
{
return false;
}
/**
* Get module composer requirements
*/
public function getComposerRequirements(): array
{
return [];
}
/**
* Get module composer suggestions
*/
public function getComposerSuggestions(): array
{
return [];
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('currency_rates', function (Blueprint $table) {
$table->id();
$table->string('currency_from');
$table->string('currency_to');
$table->string('value');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('currency_rates');
}
};

View File

@@ -0,0 +1,217 @@
<?php
namespace App\Modules\CurrencyRate\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @property string $currency_from
* @property string $currency_to
* @property string $value
* @property \Illuminate\Support\Carbon $created_at
* @property \Illuminate\Support\Carbon $updated_at
*/
class CurrencyRate extends Model
{
/**
* The table associated with the model.
*/
protected $table = 'currency_rates';
/**
* Get the user's first name.
*
* @return Attribute<string, void>
*/
protected function name(): Attribute
{
return Attribute::make(
get: fn (): string => $this->currency_from.'-'.$this->currency_to,
);
}
/**
* Currencies
*
* @return array<string, string>
*/
public static function currencies(): array
{
return [
'AED' => 'AED',
'AFN' => 'AFN',
'ALL' => 'ALL',
'AMD' => 'AMD',
'ANG' => 'ANG',
'AOA' => 'AOA',
'ARS' => 'ARS',
'AUD' => 'AUD',
'AWG' => 'AWG',
'AZN' => 'AZN',
'BAM' => 'BAM',
'BBD' => 'BBD',
'BDT' => 'BDT',
'BGN' => 'BGN',
'BHD' => 'BHD',
'BIF' => 'BIF',
'BMD' => 'BMD',
'BND' => 'BND',
'BOB' => 'BOB',
'BRL' => 'BRL',
'BSD' => 'BSD',
'BTN' => 'BTN',
'BWP' => 'BWP',
'BYN' => 'BYN',
'BZD' => 'BZD',
'CAD' => 'CAD',
'CDF' => 'CDF',
'CHF' => 'CHF',
'CKD' => 'CKD',
'CLP' => 'CLP',
'CNY' => 'CNY',
'COP' => 'COP',
'CRC' => 'CRC',
'CUC' => 'CUC',
'CUP' => 'CUP',
'CVE' => 'CVE',
'CZK' => 'CZK',
'DJF' => 'DJF',
'DKK' => 'DKK',
'DOP' => 'DOP',
'DZD' => 'DZD',
'EGP' => 'EGP',
'EHP' => 'EHP',
'ERN' => 'ERN',
'ETB' => 'ETB',
'EUR' => 'EUR',
'FJD' => 'FJD',
'FKP' => 'FKP',
'FOK' => 'FOK',
'GBP' => 'GBP',
'GEL' => 'GEL',
'GGP' => 'GGP',
'GHS' => 'GHS',
'GIP' => 'GIP',
'GMD' => 'GMD',
'GNF' => 'GNF',
'GTQ' => 'GTQ',
'GYD' => 'GYD',
'HKD' => 'HKD',
'HNL' => 'HNL',
'HRK' => 'HRK',
'HTG' => 'HTG',
'HUF' => 'HUF',
'IDR' => 'IDR',
'ILS' => 'ILS',
'IMP' => 'IMP',
'INR' => 'INR',
'IQD' => 'IQD',
'IRR' => 'IRR',
'ISK' => 'ISK',
'JEP' => 'JEP',
'JMD' => 'JMD',
'JOD' => 'JOD',
'JPY' => 'JPY',
'KES' => 'KES',
'KGS' => 'KGS',
'KHR' => 'KHR',
'KID' => 'KID',
'KMF' => 'KMF',
'KPW' => 'KPW',
'KRW' => 'KRW',
'KWD' => 'KWD',
'KYD' => 'KYD',
'KZT' => 'KZT',
'LAK' => 'LAK',
'LBP' => 'LBP',
'LKR' => 'LKR',
'LRD' => 'LRD',
'LSL' => 'LSL',
'LYD' => 'LYD',
'MAD' => 'MAD',
'MDL' => 'MDL',
'MGA' => 'MGA',
'MKD' => 'MKD',
'MMK' => 'MMK',
'MNT' => 'MNT',
'MOP' => 'MOP',
'MRU' => 'MRU',
'MUR' => 'MUR',
'MVR' => 'MVR',
'MWK' => 'MWK',
'MXN' => 'MXN',
'MYR' => 'MYR',
'MZN' => 'MZN',
'NAD' => 'NAD',
'NGN' => 'NGN',
'NIO' => 'NIO',
'NOK' => 'NOK',
'NPR' => 'NPR',
'NZD' => 'NZD',
'OMR' => 'OMR',
'PAB' => 'PAB',
'PEN' => 'PEN',
'PGK' => 'PGK',
'PHP' => 'PHP',
'PKR' => 'PKR',
'PLN' => 'PLN',
'PND' => 'PND',
'PRB' => 'PRB',
'PYG' => 'PYG',
'QAR' => 'QAR',
'RON' => 'RON',
'RSD' => 'RSD',
'RUB' => 'RUB',
'RWF' => 'RWF',
'SAR' => 'SAR',
'SBD' => 'SBD',
'SCR' => 'SCR',
'SDG' => 'SDG',
'SEK' => 'SEK',
'SGD' => 'SGD',
'SHP' => 'SHP',
'SLL' => 'SLL',
'SLS' => 'SLS',
'SOS' => 'SOS',
'SRD' => 'SRD',
'SSP' => 'SSP',
'STN' => 'STN',
'SVC' => 'SVC',
'SYP' => 'SYP',
'SZL' => 'SZL',
'THB' => 'THB',
'TJS' => 'TJS',
'TMT' => 'TMT',
'TND' => 'TND',
'TOP' => 'TOP',
'TRY' => 'TRY',
'TTD' => 'TTD',
'TVD' => 'TVD',
'TWD' => 'TWD',
'TZS' => 'TZS',
'UAH' => 'UAH',
'UGX' => 'UGX',
'USD' => 'USD',
'UYU' => 'UYU',
'UZS' => 'UZS',
'VED' => 'VED',
'VES' => 'VES',
'VND' => 'VND',
'VUV' => 'VUV',
'WST' => 'WST',
'XAF' => 'XAF',
'XCD' => 'XCD',
'XOF' => 'XOF',
'XPF' => 'XPF',
'YER' => 'YER',
'ZAR' => 'ZAR',
'ZMW' => 'ZMW',
'ZWB' => 'ZWB',
'ZWL' => 'ZWL',
'Abkhazia' => 'Abkhazia',
'Artsakh' => 'Artsakh',
];
}
}

View File

@@ -0,0 +1,5 @@
<?php
namespace App\Modules\CurrencyRate\Repositories;
class CurrencyRateRepository {}

View File

@@ -17,7 +17,7 @@ class HalkbankOnlinePaymentController extends Controller
]);
$onlinePaymentRepository = OnlinePaymentRepository::make()
->paymentProvider(new HalkbankOnlinePaymentRepository);
->setPaymentProvider(new HalkbankOnlinePaymentRepository);
$paymentStatus = $onlinePaymentRepository->checkPayment($request->string('orderId'));

View File

@@ -43,6 +43,11 @@ class OnlinePaymentRepository
*/
protected Response $response;
/**
* Online payment
*/
protected OnlinePayment $onlinePayment;
/**
* If payment is successful
*/
@@ -94,13 +99,29 @@ class OnlinePaymentRepository
/**
* Payment provder
*/
public function paymentProvider(PaymentProviderContract $provider): self
public function setPaymentProvider(PaymentProviderContract $provider): self
{
$this->provider = $provider;
return $this;
}
/**
* Payment provider
*/
public function paymentProvider(): PaymentProviderContract
{
return $this->provider;
}
/**
* Online payment
*/
public function onlinePayment(): OnlinePayment
{
return $this->onlinePayment;
}
/**
* If payment has been successfull
*/
@@ -180,7 +201,7 @@ class OnlinePaymentRepository
$data['online_paymantable_type'] = $this->relatedModel::class;
}
OnlinePayment::create($data);
$this->onlinePayment = OnlinePayment::create($data);
}
/**

View File

@@ -83,4 +83,12 @@ trait UserAdjustments
{
return $this->hasMany(UserBranch::class);
}
/**
* Full name
*/
public function fullName(): string
{
return sprintf('%s %s', $this->first_name, $this->last_name);
}
}

View File

@@ -16,6 +16,7 @@ return new class extends Migration
$table->string('unique_id')->nullable()->unique();
$table->string('type')->nullable();
$table->string('passport_name')->nullable();
$table->string('passport_surname')->nullable();
$table->string('phone')->nullable();
@@ -40,7 +41,12 @@ return new class extends Migration
$table->string('sender_passport_number')->nullable();
$table->string('sender_deposit_account')->nullable();
$table->boolean('paid')->default(true);
$table->string('reciever_full_name')->nullable();
$table->string('reciever_passport_serie')->nullable();
$table->string('reciever_passport_number')->nullable();
$table->string('reciever_deposit_account')->nullable();
$table->boolean('paid')->default(false);
$table->softDeletes();
$table->timestamps();
@@ -52,6 +58,6 @@ return new class extends Migration
*/
public function down(): void
{
//
Schema::dropIfExists('visa_master_payment_orders');
}
};

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('visa_master_settings', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('display_name');
$table->text('value');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('visa_master_settings');
}
};

View File

@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('visa_master_payment_order_items', function (Blueprint $table) {
$table->id();
$table->foreignId('visa_master_payment_order_id')->constrained('visa_master_payment_orders')->nullOnDelete();
$table->foreignId('online_payment_id')->nullable()->constrained('online_payments')->nullOnDelete();
$table->string('payer_name')->nullable();
$table->string('payer_card')->nullable();
$table->string('payment_order_number')->nullable();
$table->string('tmt_payment_amount');
$table->string('usd_payment_amount');
$table->boolean('paid')->default(false);
$table->boolean('synced_with_system')->nullable()->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('visa_master_payment_order_items');
}
};

View File

@@ -0,0 +1,166 @@
<?php
namespace App\Modules\VisaMasterPaymentOrder\Filament\Actions;
use App\Modules\CurrencyRate\Models\CurrencyRate;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterSettings;
use App\Modules\VisaMasterPaymentOrder\Repositories\VisaMasterPaymentOrderRepository;
use Filament\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification;
use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\Utilities\Set;
use Livewire\Component;
class PayVisaMasterPaymentAction
{
public static function make(): Action
{
return Action::make('pay_visa_master_payment')
->label(sprintf('%s %s', __('Make payment for:'), today()->translatedFormat('F')))
->icon('heroicon-o-credit-card')
->modal()
->schema(function () {
$usd_to_tmt = floatval(CurrencyRate::where('currency_from', 'USD')->where('currency_to', 'TMT')->first('value')?->value);
$payment_warning_text = VisaMasterSettings::where('name', 'payment_warning_text')->first();
if (! $usd_to_tmt || ! $payment_warning_text) {
return [];
}
$visaMasterPaymentOrderRepository = VisaMasterPaymentOrderRepository::make();
$bankFee = $visaMasterPaymentOrderRepository->bankFee();
$gbusFee = $visaMasterPaymentOrderRepository->gbusFee();
$max_value = number_format($usd_to_tmt * 250, 2);
return [
Fieldset::make(__('Tax'))
->columns([
'default' => 1,
'md' => 2,
'xl' => 3,
])
->schema([
TextEntry::make('usd_to_tmt')
->extraAttributes(['class' => 'uppercase tracking-wide font-bold text-xs'])
->label(sprintf('1 USD = %s TMT', $usd_to_tmt)),
TextEntry::make('bank_fee')
->extraAttributes(['class' => 'uppercase tracking-wide font-bold text-xs'])
->label(sprintf('Bankyň tutumy: %s TMT', $bankFee)),
TextEntry::make('gbus_fee')
->extraAttributes(['class' => 'uppercase tracking-wide font-bold text-xs'])
->label(sprintf('GBÜS tutumy: %s TMT', $gbusFee)),
]),
Fieldset::make()
->columns([
'default' => 1,
'md' => 2,
'xl' => 3,
])
->schema([
TextInput::make('payment_amount')
->label(sprintf('%s (%s)', __('Payment amount'), __('TMT')))
->required()
->numeric()
->maxValue($max_value)
->helperText(sprintf('Iň ýokary möçberi: %s TMT', $max_value))
->live()
->afterStateUpdated(function (Set $set, ?string $state) use ($usd_to_tmt, $bankFee, $gbusFee) {
if (is_null($state) || $state == 0 || $state == '') {
$set('usd_rate', '');
return;
}
$state = floatval($state);
$usd_rate = $state / $usd_to_tmt;
$total_amount = $state + $bankFee + $gbusFee;
$set('usd_rate', number_format($usd_rate, 2, '.', ''));
$set('total_amount', number_format($total_amount, 2, '.', ''));
}),
TextInput::make('usd_rate')
->label(__('USD ekwalendi'))
->suffix('USD')
->readOnly(),
TextInput::make('total_amount')
->label(__('Total amount'))
->suffix('TMT')
->readOnly(),
]),
];
})
->action(function (array $data, VisaMasterPaymentOrder $record, Component $livewire): void {
/** @var array{payment_amount: float, usd_rate: float, total_amount: float} */
$formData = $data;
$visaMasterPaymentOrderRepository = VisaMasterPaymentOrderRepository::make();
$today = today();
// Needs to be tested...
if ($visaMasterPaymentOrderRepository->hasBeenPaidThisMonth($record, $today)) {
Notification::make()
->title(__('This month has already been paid').'!')
->body(__('This month has already been paid'))
->danger()
->send();
return;
}
// Needs to be tested...
if ($visaMasterPaymentOrderRepository->isEndOfMonth($today)) {
Notification::make()
->title(__('Payment cannot be accepted on the last day of the month').'!')
->body(__('Payment cannot be accepted on the last day of the month'))
->danger()
->send();
return;
}
// Needs to be tested...
if (! $record->branch || ! $record->branch->billing_visa_master_username) {
Notification::make()
->title(__('Contact with the operator').'!')
->body(__('Billing information is not available in the branch! The branch cannot accept Visa/Master payments.'))
->danger()
->send();
return;
}
$total_amount = $formData['payment_amount'] + $visaMasterPaymentOrderRepository->bankFee() + $visaMasterPaymentOrderRepository->gbusFee();
$onlinePaymentRepository = $visaMasterPaymentOrderRepository->createOnlinePaymentOrder($record, $total_amount);
if ($onlinePaymentRepository->failed()) {
Notification::make()
->title(__('Payment error').'!')
->body(sprintf('%s. %s. %s.', __('Problem connecting on HALKBANK SYSTEM'), __('Error has been captured'), __('Please try again later')))
->danger()
->send();
return;
}
$visaMasterPaymentOrderRepository->createPaymentRecord($record, $onlinePaymentRepository, $formData['usd_rate']);
// Tell Livewire to open it in a new tab
$livewire->js("window.open('{$onlinePaymentRepository->paymentLink()}', '_blank')");
})
->modalSubmitActionLabel(__('Pay'));
}
}

View File

@@ -6,6 +6,7 @@ use App\Models\User;
use App\Modules\Branch\Models\Branch;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
@@ -20,9 +21,9 @@ use Spatie\MediaLibrary\InteractsWithMedia;
* @property string $email
* @property string $region
* @property string $address
* @property array $sender_datas
* @property array $payment_reciever
* @property array $documents
* @property array<string, string> $sender_datas
* @property array<string, string> $payment_reciever
* @property array<string, string> $documents
* @property string $status
* @property string $notes
* @property string $sender_full_name
@@ -76,7 +77,7 @@ class VisaMasterPaymentOrder extends Model implements HasMedia
/**
* User
*
* @return BelongsTo<User, VisaMasterPaymentOrder>
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
@@ -86,13 +87,23 @@ class VisaMasterPaymentOrder extends Model implements HasMedia
/**
* Branch
*
* @return BelongsTo<Branch, VisaMasterPaymentOrder>
* @return BelongsTo<Branch, $this>
*/
public function branch(): BelongsTo
{
return $this->belongsTo(Branch::class);
}
/**
* Payment itmes
*
* @return HasMany<VisaMasterPaymentOrderItem, $this>
*/
public function paymentItems(): HasMany
{
return $this->hasMany(VisaMasterPaymentOrderItem::class, 'visa_master_payment_order_id');
}
/**
* Get applications types
*

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Modules\VisaMasterPaymentOrder\Models;
use App\Modules\OnlinePayment\Models\OnlinePayment;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Carbon;
/**
* @property int $id
* @property int $visa_master_payment_order_id
* @property int $online_payment_id
* @property string $payer_name
* @property string $payer_card
* @property string $payment_order_number
* @property string $tmt_payment_amount
* @property string $usd_payment_amount
* @property bool $paid
* @property bool $synced_with_system
* @property Carbon $created_at
* @property Carbon $updated_at
*/
class VisaMasterPaymentOrderItem extends Model
{
/**
* Table
*
* @var string
*/
protected $table = 'visa_master_payment_order_items';
/**
* Guarded attributes
*/
protected $guarded = [];
/**
* Parent order
*
* @return BelongsTo<VisaMasterPaymentOrder, $this>
*/
public function parent(): BelongsTo
{
return $this->belongsTo(VisaMasterPaymentOrder::class, 'visa_master_payment_order_id');
}
/**
* Online payment
*
* @return BelongsTo<OnlinePayment, $this>
*/
public function onlinePayment(): BelongsTo
{
return $this->belongsTo(OnlinePayment::class, 'online_payment_id');
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Modules\VisaMasterPaymentOrder\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @property string $name
* @property string $display_name
* @property string $value
*/
class VisaMasterSettings extends Model
{
protected $table = 'visa_master_settings';
/**
* The possible types of settings.
*
* @return array<string, string>
*/
public static function types(): array
{
return [
'payment_warning_text' => __('Warning text'),
];
}
}

View File

@@ -2,4 +2,115 @@
namespace App\Modules\VisaMasterPaymentOrder\Repositories;
class VisaMasterPaymentOrderRepository {}
use App\Modules\HalkbankOnlinePayment\Repositories\HalkbankOnlinePaymentRepository;
use App\Modules\Makeable;
use App\Modules\OnlinePayment\Repositories\OnlinePaymentRepository;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrderItem;
use Illuminate\Support\Carbon;
class VisaMasterPaymentOrderRepository
{
use Makeable;
/**
* Bank fee
*/
public int|float $bankFee = 20;
/**
* Gbus fee
*/
public int|float $gbusFee = 3;
/**
* Bank fee
*/
public function bankFee(): int|float
{
return $this->bankFee;
}
/**
* Gbus fee
*/
public function gbusFee(): int|float
{
return $this->gbusFee;
}
/**
* Has been paid this month
*/
public function hasBeenPaidThisMonth(VisaMasterPaymentOrder $record, Carbon $today): bool
{
return $record->paymentItems->contains(
fn (VisaMasterPaymentOrderItem $item): bool => $item->paid && $item->created_at->format('m Y') === $today->format('m Y')
);
}
/**
* Is end of month
*/
public function isEndOfMonth(Carbon $today): bool
{
$lastDay = $today->copy()->endOfMonth();
$lastDayOfWeek = $lastDay->format('l');
$oneDayBefore = $lastDay->copy()->subDay(); // Saturday...
$twoDaysBefore = $lastDay->copy()->subDays(2); // Friday...
// Condition 1: Today is the last day
if ($today->isSameDay($lastDay)) {
return true;
}
// Condition 2: Last day is Sunday → forbid Friday & Saturday
if ($lastDayOfWeek === 'Sunday' && ($today->isSameDay($oneDayBefore) || $today->isSameDay($twoDaysBefore))) {
return true;
}
// Condition 3: Last day is Saturday → forbid Friday
if ($lastDayOfWeek === 'Saturday' && $today->isSameDay($oneDayBefore)) {
return true;
}
// Default: allow payment
return false;
}
/**
* Create online payment order
*/
public function createOnlinePaymentOrder(VisaMasterPaymentOrder $record, int|float|string $amount): OnlinePaymentRepository
{
/** @var \App\Modules\Branch\Models\Branch */
$branch = $record->branch;
return OnlinePaymentRepository::make(relatedModel: $record)
->setPaymentProvider(
HalkbankOnlinePaymentRepository::make(
username: $branch->billingUsername(),
password: $branch->billingPassword(),
amount: $amount,
returnUrl: route('halkbank-online-payment.store'),
description: 'Visa/Master tölegi'
)
)
->sendRequest();
}
/**
* Create payment record
*/
public function createPaymentRecord(VisaMasterPaymentOrder $record, OnlinePaymentRepository $onlinePaymentRepository, int|string|float $usdRate): void
{
VisaMasterPaymentOrderItem::create([
'visa_master_payment_order_id' => $record->id,
'online_payment_id' => $onlinePaymentRepository->onlinePayment()->id,
'payment_order_number' => $onlinePaymentRepository->onlinePayment()->orderNumber,
'tmt_payment_amount' => $onlinePaymentRepository->paymentProvider()->amount(),
'usd_payment_amount' => $usdRate,
]);
}
}

View File

@@ -3,9 +3,12 @@
namespace App\Providers;
use AbdulmajeedJamaan\FilamentTranslatableTabs\TranslatableTabs;
use BezhanSalleh\LanguageSwitch\Events\LocaleChanged;
use BezhanSalleh\LanguageSwitch\LanguageSwitch;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use Spatie\Translatable\HasTranslations;
@@ -33,6 +36,17 @@ class AppServiceProvider extends ServiceProvider
->locales(array_keys(baseLocales()));
});
LanguageSwitch::configureUsing(function (LanguageSwitch $switch) {
$switch
->locales(['tk', 'en', 'ru']);
});
Event::listen(function (LocaleChanged $event) {
if (array_key_exists($event->locale, baseLocales())) {
user()->update(['locale' => $event->locale]);
}
});
/**
* Order by translation for spatie/laravel-translatable
*

View File

@@ -6,7 +6,6 @@ use App\Http\Middleware\EnsureProfileIsFilled;
use App\Livewire\UserProfileFields;
use App\Modules\BaseAuth\Middleware\RedirectIfUserPhoneIsUnVerfied;
use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
use CraftForge\FilamentLanguageSwitcher\FilamentLanguageSwitcherPlugin;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession;
use Filament\Http\Middleware\DisableBladeIconComponents;
@@ -63,13 +62,6 @@ class WorkPanelProvider extends PanelProvider
FilamentShieldPlugin::make()
->navigationGroup('Roles and permissions'),
FilamentLanguageSwitcherPlugin::make()
->locales([
['code' => 'tk', 'name' => 'Turkmen', 'flag' => 'tm'],
['code' => 'en', 'name' => 'English', 'flag' => 'us'],
['code' => 'ru', 'name' => 'Russian', 'flag' => 'ru'],
]),
FilamentEditProfilePlugin::make()
->setTitle(__('My profile'))
->setNavigationLabel(__('My profile'))

View File

@@ -8,9 +8,10 @@
"require": {
"php": "^8.2",
"abdulmajeed-jamaan/filament-translatable-tabs": "^4.0",
"bezhansalleh/filament-language-switch": "^4.0",
"bezhansalleh/filament-shield": "^4.0",
"craft-forge/filament-language-switcher": "^1.0",
"filament/filament": "^4.0",
"filament/spatie-laravel-media-library-plugin": "^4.0",
"joaopaulolndev/filament-edit-profile": "^2.0",
"laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1",

563
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -685,5 +685,5 @@
"Legal Marriage": "Raýat nika",
"School": "Orta bilim",
"School drop out": "Gutarylmadyk orta bilim",
"Unfinished high education": "Gutarylmadyk ýokary bilim",
"Unfinished high education": "Gutarylmadyk ýokary bilim"
}

View File

@@ -399,6 +399,7 @@
"Load :perPage More": "Ýene :perPage ýükle",
":amount Total": ":amount jemi",
"Show All Fields": "Ähli sütünleri görkez",
"All": "Ählisi",
"There was a problem submitting the form.": "Formy ýatda saklamakda bir näsazlyk ýüze çykdy.",
"There was a problem executing the action.": "Bu herekedi amala aşyrmakda bir näsazlyk ýüze çykdy.",
"Do you really want to leave? You have unsaved changes.": "Siz hakykatdanam gitmek isleýärsiňizmi? Ýatda saklanmadyk üýtgeşmeleriňiz bar.",
@@ -572,9 +573,8 @@
"Please, now verify your phone number to continue": "Dowam etmek üçin telefon belgiňizi tassyklaň",
"Swift payments": "Swift tölegler",
"Swift payment": "Swift töleg",
"International payments": "Halkara tölegler",
"Visa, Master, Sber, WU": "Visa, Master, Sber, WU",
"Visa/Master payment": "Visa/Master tölegler",
"Visa/Master payment": "Visa/Master töleg",
"Visa/Master payments": "Visa/Master tölegleri",
"For students": "Talyplar üçin",
"Application type": "Ýüztutmanyň görnüşi",
@@ -695,5 +695,32 @@
"Married": "Öýlenen/Durmuşa çykan",
"Divorced": "Aýrylşan",
"Single": "Öýlenmedik/Durmuşa çykmadyk",
"By operator": "Operatordan"
"By operator": "Operatordan",
"Rejected": "Ýatyrylan",
"Order type and bank": "Ýüztutmanyň görnüşi we bank",
"Order type": "Ýüztutmanyň görnüşi",
"Type": "Görnüş",
"International payments": "Halkara tölegler",
"Order details": "Sargyt barada",
"Name, Surname, Patronic name": "Ady, Familiýasy, Atasynyň ady",
"Deposit account": "Goýum hasaby",
"Files": "Faýllar",
"Payment type": "Töleg görnüşi",
"Currency from": "Walýuta girişi",
"Currency to": "Walýuta çykýan",
"Currency value": "Kursy",
"Currency rates": "Walýuta kurslary",
"Warning text": "Duýduruş teksti",
"Content": "Mazmuny",
"Payment month": "Töleg aýy",
"Make payment for:": "Töleg üçin:",
"Payment amount": "Töleg möçberi",
"This month has already been paid": "Şul aý töleg edildi",
"Contact with the operator": "Operator bilen habarlaşyň!",
"Billing information is not available in the branch! The branch cannot accept Visa/Master payments.": "Billing maglumatlary şahamçada ýok! Şahamça visa/master tölegi kabul edip bilmeýär.",
"Payment cannot be accepted on the last day of the month": "Töleg aýyň son döredilen güni töleýär",
"Payment error": "Töleg näsazlygy",
"Problem connecting on HALKBANK SYSTEM": "Halkbank ulgamyna birikmekde näsazlyk",
"Error has been captured": "Näsazlyk ulgam tarapyndan ýazga alyndy",
"Please try again later": "Täzeden geçirmek üçin synanyşyňyz"
}

View File

@@ -0,0 +1,56 @@
.filepond--pdf-preview-wrapper {
background: #00000003;
border-radius: 0.45em;
height: 100%;
left: 0;
margin: 0;
overflow: hidden;
position: absolute;
right: 0;
top: 0;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.filepond--pdf-preview {
align-items: center;
background: #222;
display: flex;
height: 100%;
left: 0;
/* pointer-events: none; */
position: absolute;
top: 0;
width: 100%;
will-change: transform, opacity;
z-index: 1;
}
.filepond--pdf-preview-iframe {
position: absolute;
left: 0;
right: 0;
margin: auto;
width: 100%;
padding-top: unset;
transform: scale(1.05);
}
.filepond--overlay-shadow {
background: linear-gradient(to bottom, #282828d9 0%, transparent 100%);
mix-blend-mode: multiply;
width: 100%;
height: 4rem;
position: absolute;
left: 0;
z-index: 2;
}
.filepond--overlay-shadow.overlay-shadow--success {
background: linear-gradient(to bottom, #369763 0%, transparent 100%);
}
.filepond--overlay-shadow.overlay-shadow--failure {
background: linear-gradient(to bottom, #c44e47 0%, transparent 100%);
}

View File

@@ -0,0 +1 @@
var u=r=>r.type==="application/pdf",y=r=>new URLSearchParams({toolbar:r.query("GET_PDF_TOOLBAR")?1:0,navpanes:r.query("GET_PDF_NAVPANE")?1:0,statusbar:r.query("GET_PDF_STATUS_BAR")?1:0,zoom:r.query("GET_PDF_ZOOM")?1:0,view:r.query("GET_PDF_VIEW"),scrollbar:r.query("GET_PDF_SCROLLBAR")?1:0,page:r.query("GET_PDF_DISPLAY_PAGE")}),I=r=>{let a=({root:e,props:n})=>{let{id:c}=n,t=e.query("GET_ITEM",c),p=y(e),d=()=>{if(typeof t.source!="string"){let i=window.URL||window.webkitURL,l=new Blob([t.file],{type:t.file.type});return i.createObjectURL(l)}return t.source};e.ref.pdf.src=`${d()}#${p.toString()}`,e.ref.pdf.addEventListener("load",()=>{e.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:c,height:e.ref.pdf.scrollHeight})},!1)},s=({root:e,props:n})=>{e.query("GET_ITEM",n.id).file&&(e.ref.pdf=document.createElement("iframe"),e.ref.pdf.setAttribute("height",e.query("GET_PDF_PREVIEW_HEIGHT")||320),e.ref.pdf.classList.add("filepond--pdf-preview-iframe"),e.element.appendChild(e.ref.pdf))};return r.createView({name:"pdf-preview",tag:"div",create:s,write:r.createRoute({DID_PDF_PREVIEW_LOAD:a})})},T=r=>r.createView({name:"overlay-shadow",tag:"div",ignoreRect:!0,create:({root:a,props:s})=>{a.element.classList.add(`overlay-shadow--${s.status}`)},mixins:{styles:["opacity"],animations:{opacity:{type:"spring",mass:25}}}}),D=r=>{let a=r.utils,s=I(a),e=T(a),n=({root:i,props:l})=>{let{id:f}=l;i.dispatch("DID_PDF_PREVIEW_LOAD",{id:f})},c=({root:i,props:l})=>{i.ref.overlayShadow=i.appendChildView(i.createChildView(e,{opacity:1,status:"idle"})),i.ref.overlaySuccess=i.appendChildView(i.createChildView(e,{opacity:0,status:"success"})),i.ref.overlayError=i.appendChildView(i.createChildView(e,{opacity:0,status:"failure"})),i.ref.pdf=i.appendChildView(i.createChildView(s,{id:l.id}))},t=({root:i})=>{i.ref.overlayShadow.opacity=1,i.ref.overlayError.opacity=0,i.ref.overlaySuccess.opacity=0},p=({root:i,props:l})=>{i.ref.overlayShadow.opacity=.1,i.ref.overlayError.opacity=1},d=({root:i,props:l})=>{i.ref.overlayShadow.opacity=.1,i.ref.overlaySuccess.opacity=1};return a.createView({name:"pdf-preview-wrapper",tag:"div",create:c,write:a.createRoute({DID_CREATE_PDF_PREVIEW_CONTAINER_VIEW:n,DID_THROW_ITEM_LOAD_ERROR:p,DID_THROW_ITEM_PROCESSING_ERROR:p,DID_THROW_ITEM_INVALID:p,DID_COMPLETE_ITEM_PROCESSING:d,DID_START_ITEM_PROCESSING:t,DID_REVERT_ITEM_PROCESSING:t})})},v=r=>{let{addFilter:a,utils:s}=r,{Type:e,createRoute:n}=s,c=D(r);return a("CREATE_VIEW",t=>{let{is:p,view:d,query:i}=t;if(!p("file"))return;let l=({root:f,props:w})=>{let{id:E}=w,_=i("GET_ITEM",E),o=i("GET_ALLOW_PDF_PREVIEW");!_||!u(_?.file)||_?.archived||!o||(f.ref.pdfPreview=d.appendChildView(d.createChildView(c,{id:E})),f.dispatch("DID_CREATE_PDF_PREVIEW_CONTAINER_VIEW",{id:E}))};d.registerWriter(n({DID_LOAD_ITEM:l}),(f,w)=>{f.ref.pdfPreview&&f.rect.element.hidden})}),{options:{allowPdfPreview:[!0,e.BOOLEAN],pdfPreviewHeight:[400,e.INT],pdfToolbar:[!1,e.BOOLEAN],pdfNavPanes:[!1,e.BOOLEAN],pdfStatusBar:[!1,e.BOOLEAN],pdfZoom:[!1,e.BOOLEAN],pdfView:["fitW",e.STRING],pdfDisplayPage:[1,e.INT]}}},P=v;function R({pdfPreviewHeight:r,pdfScrollbar:a,pdfDisplayPage:s,pdfToolbar:e,pdfNavPanes:n,pdfZoom:c,pdfView:t,allowPdfPreview:p}){document.addEventListener("FilePond:loaded",function(){let d=window.FilePond;d.registerPlugin(P),d.setOptions({pdfPreviewHeight:r,pdfScrollbar:a,pdfDisplayPage:s,pdfToolbar:e,pdfNavPanes:n,pdfZoom:c,pdfView:t,allowPdfPreview:p})})}export{R as default};

View File

@@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<title>money-bill</title>
<g fill="none">
<path d="M13.5996 2C15.8398 2 16.9608 1.99957 17.8164 2.43555C18.5689 2.81902 19.181 3.43109 19.5645 4.18359C20.0004 5.03924 20 6.16018 20 8.40039V10.5996C20 11.4695 19.9982 12.1707 19.9727 12.7529C20.5853 13.0947 21 13.7486 21 14.5C21 15.6046 20.1046 16.5 19 16.5C18.7169 16.5 18.4481 16.44 18.2041 16.334C18.079 16.4167 17.951 16.4959 17.8164 16.5645C16.9608 17.0004 15.8398 17 13.5996 17H7.40039C5.16018 17 4.03924 17.0004 3.18359 16.5645C2.43109 16.181 1.81902 15.5689 1.43555 14.8164C0.999573 13.9608 1 12.8398 1 10.5996V8.40039C1 6.16018 0.999573 5.03924 1.43555 4.18359C1.81902 3.43109 2.43109 2.81902 3.18359 2.43555C4.03924 1.99957 5.16018 2 7.40039 2H13.5996Z" fill="url(#1752500502796-9021023_money-bill_existing_0_r3y6h6ipg)" data-glass="origin" mask="url(#1752500502796-9021023_money-bill_mask_eixc8vhgm)"></path>
<path d="M13.5996 2C15.8398 2 16.9608 1.99957 17.8164 2.43555C18.5689 2.81902 19.181 3.43109 19.5645 4.18359C20.0004 5.03924 20 6.16018 20 8.40039V10.5996C20 11.4695 19.9982 12.1707 19.9727 12.7529C20.5853 13.0947 21 13.7486 21 14.5C21 15.6046 20.1046 16.5 19 16.5C18.7169 16.5 18.4481 16.44 18.2041 16.334C18.079 16.4167 17.951 16.4959 17.8164 16.5645C16.9608 17.0004 15.8398 17 13.5996 17H7.40039C5.16018 17 4.03924 17.0004 3.18359 16.5645C2.43109 16.181 1.81902 15.5689 1.43555 14.8164C0.999573 13.9608 1 12.8398 1 10.5996V8.40039C1 6.16018 0.999573 5.03924 1.43555 4.18359C1.81902 3.43109 2.43109 2.81902 3.18359 2.43555C4.03924 1.99957 5.16018 2 7.40039 2H13.5996Z" fill="url(#1752500502796-9021023_money-bill_existing_0_r3y6h6ipg)" data-glass="clone" filter="url(#1752500502796-9021023_money-bill_filter_ujbe1nhgm)" clip-path="url(#1752500502796-9021023_money-bill_clipPath_w3hwgwzi0)"></path>
<path d="M16.5996 7C18.8398 7 19.9608 6.99957 20.8164 7.43555C21.5689 7.81902 22.181 8.43109 22.5645 9.18359C23.0004 10.0392 23 11.1602 23 13.4004V15.5996C23 17.8398 23.0004 18.9608 22.5645 19.8164C22.181 20.5689 21.5689 21.181 20.8164 21.5645C19.9608 22.0004 18.8398 22 16.5996 22H10.4004C8.16018 22 7.03924 22.0004 6.18359 21.5645C5.43109 21.181 4.81902 20.5689 4.43555 19.8164C3.99957 18.9608 4 17.8398 4 15.5996V13.4004C4 11.1602 3.99957 10.0392 4.43555 9.18359C4.81902 8.43109 5.43109 7.81902 6.18359 7.43555C7.03924 6.99957 8.16018 7 10.4004 7H16.5996ZM13.5 12C12.1193 12 11 13.1193 11 14.5C11 15.8807 12.1193 17 13.5 17C14.8807 17 16 15.8807 16 14.5C16 13.1193 14.8807 12 13.5 12ZM8.25 13.25C7.55964 13.25 7 13.8096 7 14.5C7 15.1904 7.55964 15.75 8.25 15.75C8.94036 15.75 9.5 15.1904 9.5 14.5C9.5 13.8096 8.94036 13.25 8.25 13.25ZM18.75 13.25C18.0596 13.25 17.5 13.8096 17.5 14.5C17.5 15.1904 18.0596 15.75 18.75 15.75C19.4404 15.75 20 15.1904 20 14.5C20 13.8096 19.4404 13.25 18.75 13.25Z" fill="url(#1752500502796-9021023_money-bill_existing_1_ele0nzcpm)" data-glass="blur"></path>
<path d="M16.5996 21.25V22H10.4004V21.25H16.5996ZM22.25 15.5996V13.4004C22.25 12.268 22.2497 11.4634 22.1982 10.834C22.1475 10.2134 22.0506 9.82889 21.8955 9.52441C21.5839 8.91305 21.087 8.41605 20.4756 8.10449C20.1711 7.94936 19.7866 7.85247 19.166 7.80176C18.5367 7.75035 17.732 7.75 16.5996 7.75H10.4004C9.26798 7.75 8.46335 7.75035 7.83398 7.80176C7.21336 7.85247 6.82889 7.94936 6.52441 8.10449C5.91304 8.41605 5.41605 8.91305 5.10449 9.52441C4.94936 9.82889 4.85247 10.2134 4.80176 10.834C4.75035 11.4633 4.75 12.268 4.75 13.4004V15.5996C4.75 16.732 4.75035 17.5367 4.80176 18.166C4.85247 18.7866 4.94936 19.1711 5.10449 19.4756C5.41605 20.087 5.91304 20.5839 6.52441 20.8955C6.82889 21.0506 7.21336 21.1475 7.83398 21.1982C8.46335 21.2497 9.26798 21.25 10.4004 21.25V22L8.91602 21.9932C7.72431 21.9744 6.96088 21.9041 6.34766 21.6406L6.18359 21.5645C5.52512 21.2289 4.97413 20.7183 4.58984 20.0918L4.43555 19.8164C3.99957 18.9608 4 17.8398 4 15.5996V13.4004C4 11.1602 3.99957 10.0392 4.43555 9.18359C4.81902 8.43109 5.43109 7.81902 6.18359 7.43555C6.82525 7.10861 7.61607 7.02728 8.91602 7.00684L10.4004 7H16.5996C18.8398 7 19.9608 6.99957 20.8164 7.43555C21.5689 7.81902 22.181 8.43109 22.5645 9.18359C23.0004 10.0392 23 11.1602 23 13.4004V15.5996C23 17.8398 23.0004 18.9608 22.5645 19.8164L22.4102 20.0918C22.0259 20.7183 21.4749 21.2289 20.8164 21.5645L20.6523 21.6406C19.816 21.9999 18.6999 22 16.5996 22V21.25C17.732 21.25 18.5367 21.2497 19.166 21.1982C19.7866 21.1475 20.1711 21.0506 20.4756 20.8955C21.087 20.5839 21.5839 20.087 21.8955 19.4756C22.0506 19.1711 22.1475 18.7866 22.1982 18.166C22.2497 17.5367 22.25 16.732 22.25 15.5996Z" fill="url(#1752500502796-9021023_money-bill_existing_2_0yl733a2m)"></path>
<defs>
<linearGradient id="1752500502796-9021023_money-bill_existing_0_r3y6h6ipg" x1="11" y1="2" x2="11" y2="17" gradientUnits="userSpaceOnUse">
<stop stop-color="#575757"></stop>
<stop offset="1" stop-color="#151515"></stop>
</linearGradient>
<linearGradient id="1752500502796-9021023_money-bill_existing_1_ele0nzcpm" x1="13.5" y1="7" x2="13.5" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3E3E5" stop-opacity=".6"></stop>
<stop offset="1" stop-color="#BBBBC0" stop-opacity=".6"></stop>
</linearGradient>
<linearGradient id="1752500502796-9021023_money-bill_existing_2_0yl733a2m" x1="13.5" y1="7" x2="13.5" y2="15.687" gradientUnits="userSpaceOnUse">
<stop stop-color="#fff"></stop>
<stop offset="1" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
<filter id="1752500502796-9021023_money-bill_filter_ujbe1nhgm" x="-100%" y="-100%" width="400%" height="400%" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse">
<feGaussianBlur stdDeviation="2" x="0%" y="0%" width="100%" height="100%" in="SourceGraphic" edgeMode="none" result="blur"></feGaussianBlur>
</filter>
<clipPath id="1752500502796-9021023_money-bill_clipPath_w3hwgwzi0">
<path d="M16.5996 7C18.8398 7 19.9608 6.99957 20.8164 7.43555C21.5689 7.81902 22.181 8.43109 22.5645 9.18359C23.0004 10.0392 23 11.1602 23 13.4004V15.5996C23 17.8398 23.0004 18.9608 22.5645 19.8164C22.181 20.5689 21.5689 21.181 20.8164 21.5645C19.9608 22.0004 18.8398 22 16.5996 22H10.4004C8.16018 22 7.03924 22.0004 6.18359 21.5645C5.43109 21.181 4.81902 20.5689 4.43555 19.8164C3.99957 18.9608 4 17.8398 4 15.5996V13.4004C4 11.1602 3.99957 10.0392 4.43555 9.18359C4.81902 8.43109 5.43109 7.81902 6.18359 7.43555C7.03924 6.99957 8.16018 7 10.4004 7H16.5996ZM13.5 12C12.1193 12 11 13.1193 11 14.5C11 15.8807 12.1193 17 13.5 17C14.8807 17 16 15.8807 16 14.5C16 13.1193 14.8807 12 13.5 12ZM8.25 13.25C7.55964 13.25 7 13.8096 7 14.5C7 15.1904 7.55964 15.75 8.25 15.75C8.94036 15.75 9.5 15.1904 9.5 14.5C9.5 13.8096 8.94036 13.25 8.25 13.25ZM18.75 13.25C18.0596 13.25 17.5 13.8096 17.5 14.5C17.5 15.1904 18.0596 15.75 18.75 15.75C19.4404 15.75 20 15.1904 20 14.5C20 13.8096 19.4404 13.25 18.75 13.25Z" fill="url(#1752500502796-9021023_money-bill_existing_1_ele0nzcpm)"></path>
</clipPath>
<mask id="1752500502796-9021023_money-bill_mask_eixc8vhgm">
<rect width="100%" height="100%" fill="#FFF"></rect>
<path d="M16.5996 7C18.8398 7 19.9608 6.99957 20.8164 7.43555C21.5689 7.81902 22.181 8.43109 22.5645 9.18359C23.0004 10.0392 23 11.1602 23 13.4004V15.5996C23 17.8398 23.0004 18.9608 22.5645 19.8164C22.181 20.5689 21.5689 21.181 20.8164 21.5645C19.9608 22.0004 18.8398 22 16.5996 22H10.4004C8.16018 22 7.03924 22.0004 6.18359 21.5645C5.43109 21.181 4.81902 20.5689 4.43555 19.8164C3.99957 18.9608 4 17.8398 4 15.5996V13.4004C4 11.1602 3.99957 10.0392 4.43555 9.18359C4.81902 8.43109 5.43109 7.81902 6.18359 7.43555C7.03924 6.99957 8.16018 7 10.4004 7H16.5996ZM13.5 12C12.1193 12 11 13.1193 11 14.5C11 15.8807 12.1193 17 13.5 17C14.8807 17 16 15.8807 16 14.5C16 13.1193 14.8807 12 13.5 12ZM8.25 13.25C7.55964 13.25 7 13.8096 7 14.5C7 15.1904 7.55964 15.75 8.25 15.75C8.94036 15.75 9.5 15.1904 9.5 14.5C9.5 13.8096 8.94036 13.25 8.25 13.25ZM18.75 13.25C18.0596 13.25 17.5 13.8096 17.5 14.5C17.5 15.1904 18.0596 15.75 18.75 15.75C19.4404 15.75 20 15.1904 20 14.5C20 13.8096 19.4404 13.25 18.75 13.25Z" fill="#000"></path>
</mask>
</defs>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<g class="nc-icon-wrapper">
<rect x="2" y="7" width="28" height="18" rx="3" ry="3" fill="#1434cb" stroke-width="0"></rect>
<path d="m27,7H5c-1.657,0-3,1.343-3,3v12c0,1.657,1.343,3,3,3h22c1.657,0,3-1.343,3-3v-12c0-1.657-1.343-3-3-3Zm2,15c0,1.103-.897,2-2,2H5c-1.103,0-2-.897-2-2v-12c0-1.103.897-2,2-2h22c1.103,0,2,.897,2,2v12Z" stroke-width="0" opacity=".15"></path>
<path d="m27,8H5c-1.105,0-2,.895-2,2v1c0-1.105.895-2,2-2h22c1.105,0,2,.895,2,2v-1c0-1.105-.895-2-2-2Z" fill="#fff" opacity=".2" stroke-width="0"></path>
<path d="m13.392,12.624l-2.838,6.77h-1.851l-1.397-5.403c-.085-.332-.158-.454-.416-.595-.421-.229-1.117-.443-1.728-.576l.041-.196h2.98c.38,0,.721.253.808.69l.738,3.918,1.822-4.608h1.84Z" fill="#fff" stroke-width="0"></path>
<path d="m20.646,17.183c.008-1.787-2.47-1.886-2.453-2.684.005-.243.237-.501.743-.567.251-.032.943-.058,1.727.303l.307-1.436c-.421-.152-.964-.299-1.638-.299-1.732,0-2.95.92-2.959,2.238-.011.975.87,1.518,1.533,1.843.683.332.912.545.909.841-.005.454-.545.655-1.047.663-.881.014-1.392-.238-1.799-.428l-.318,1.484c.41.188,1.165.351,1.947.359,1.841,0,3.044-.909,3.05-2.317" fill="#fff" stroke-width="0"></path>
<path d="m25.423,12.624h-1.494c-.337,0-.62.195-.746.496l-2.628,6.274h1.839l.365-1.011h2.247l.212,1.011h1.62l-1.415-6.77Zm-2.16,4.372l.922-2.542.53,2.542h-1.452Z" fill="#fff" stroke-width="0"></path>
<path fill="#fff" stroke-width="0" d="M15.894 12.624L14.446 19.394 12.695 19.394 14.143 12.624 15.894 12.624z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M22.2215 15.7683L21.9974 14.6431L19.4831 14.6431L19.0837 15.7599L17.0677 15.7643C18.3633 12.6514 19.3247 10.3455 19.952 8.84657C20.1159 8.45511 20.4072 8.25543 20.8364 8.25848C21.1638 8.26094 21.6991 8.26124 22.4421 8.25942L24 15.7648L22.2215 15.7683ZM20.0485 13.1018H21.6692L21.0642 10.2819L20.0485 13.1018ZM7.06069 8.2567L9.08703 8.25933L5.95498 15.7683L3.90367 15.7675C3.21013 13.0896 2.70084 11.1042 2.37581 9.81122C2.27616 9.4148 2.07796 9.13797 1.69702 9.00705C1.35736 8.89031 0.791683 8.7098 0 8.46553V8.25942C1.48023 8.25924 2.55921 8.25924 3.23694 8.25942C3.7974 8.25959 4.12411 8.53015 4.22922 9.08566C4.33473 9.6435 4.60127 11.0616 5.02884 13.3398L7.06069 8.2567ZM11.8702 8.25934L10.2695 15.7676L8.34108 15.7648C8.37914 15.5824 8.91202 13.0797 9.93972 8.2567L11.8702 8.25934ZM15.7815 8.12012C16.3578 8.12012 17.0846 8.2992 17.5035 8.46553L17.1652 10.0221C16.7871 9.87023 16.1657 9.66491 15.6424 9.67294C14.8813 9.68462 14.4117 10.004 14.4117 10.3105C14.4117 10.808 15.2277 11.0586 16.0681 11.603C17.0265 12.2237 17.1531 12.78 17.1412 13.3856C17.1277 14.6413 16.0681 15.8801 13.8322 15.8801C12.8111 15.8648 12.4444 15.7791 11.6122 15.4839L11.9637 13.8595C12.8106 14.2142 13.1698 14.327 13.8935 14.327C14.5569 14.327 15.1263 14.0589 15.1312 13.5919C15.1347 13.2598 14.9316 13.0955 14.1871 12.6847C13.4427 12.2739 12.3994 11.706 12.4128 10.5631C12.43 9.10074 13.815 8.12012 15.7815 8.12012Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB