feat: historique paiement

This commit is contained in:
2026-05-27 11:37:29 +02:00
parent 51b50aa1d0
commit a01387bb09
18 changed files with 920 additions and 13 deletions
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\PaymentTransactions\Pages;
use App\Filament\Resources\PaymentTransactions\PaymentTransactionResource;
use Filament\Resources\Pages\ListRecords;
class ListPaymentTransactions extends ListRecords
{
protected static string $resource = PaymentTransactionResource::class;
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\PaymentTransactions\Pages;
use App\Filament\Resources\PaymentTransactions\PaymentTransactionResource;
use Filament\Resources\Pages\ViewRecord;
class ViewPaymentTransaction extends ViewRecord
{
protected static string $resource = PaymentTransactionResource::class;
}
@@ -0,0 +1,61 @@
<?php
namespace App\Filament\Resources\PaymentTransactions;
use App\Filament\Resources\PaymentTransactions\Pages\ListPaymentTransactions;
use App\Filament\Resources\PaymentTransactions\Pages\ViewPaymentTransaction;
use App\Filament\Resources\PaymentTransactions\Schemas\PaymentTransactionInfolist;
use App\Filament\Resources\PaymentTransactions\Tables\PaymentTransactionsTable;
use App\Models\PaymentTransaction;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
class PaymentTransactionResource extends Resource
{
protected static ?string $model = PaymentTransaction::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedReceiptPercent;
protected static ?string $recordTitleAttribute = 'id';
public static function getNavigationLabel(): string
{
return __('admin.payment_transactions.navigation.label');
}
public static function getModelLabel(): string
{
return __('admin.payment_transactions.navigation.singular');
}
public static function getPluralModelLabel(): string
{
return __('admin.payment_transactions.navigation.plural');
}
public static function canCreate(): bool
{
return false;
}
public static function infolist(Schema $schema): Schema
{
return PaymentTransactionInfolist::configure($schema);
}
public static function table(Table $table): Table
{
return PaymentTransactionsTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListPaymentTransactions::route('/'),
'view' => ViewPaymentTransaction::route('/{record}'),
];
}
}
@@ -0,0 +1,100 @@
<?php
namespace App\Filament\Resources\PaymentTransactions\Schemas;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
class PaymentTransactionInfolist
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Section::make(__('admin.payment_transactions.sections.summary'))
->columns(3)
->schema([
TextEntry::make('id')
->label(__('admin.payment_transactions.fields.id'))
->copyable(),
TextEntry::make('status')
->label(__('admin.payment_transactions.fields.status'))
->badge(),
TextEntry::make('type')
->label(__('admin.payment_transactions.fields.type'))
->badge(),
TextEntry::make('user.email')
->label(__('admin.payment_transactions.fields.user'))
->placeholder(__('admin.payment_transactions.placeholders.empty'))
->copyable(),
TextEntry::make('creditProduct.name')
->label(__('admin.payment_transactions.fields.credit_product'))
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('amount')
->label(__('admin.payment_transactions.fields.amount'))
->money(fn ($record): string => $record->currency ?: 'eur', divideBy: 100)
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('credits_expected')
->label(__('admin.payment_transactions.fields.credits_expected'))
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('credits_granted')
->label(__('admin.payment_transactions.fields.credits_granted')),
TextEntry::make('processed_at')
->label(__('admin.payment_transactions.fields.processed_at'))
->dateTime()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
]),
Section::make(__('admin.payment_transactions.sections.stripe'))
->columns(2)
->schema([
TextEntry::make('stripe_event_type')
->label(__('admin.payment_transactions.fields.stripe_event_type'))
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_event_id')
->label(__('admin.payment_transactions.fields.stripe_event_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_customer_id')
->label(__('admin.payment_transactions.fields.stripe_customer_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_checkout_session_id')
->label(__('admin.payment_transactions.fields.stripe_checkout_session_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_invoice_id')
->label(__('admin.payment_transactions.fields.stripe_invoice_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_payment_intent_id')
->label(__('admin.payment_transactions.fields.stripe_payment_intent_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_subscription_id')
->label(__('admin.payment_transactions.fields.stripe_subscription_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextEntry::make('stripe_price_id')
->label(__('admin.payment_transactions.fields.stripe_price_id'))
->copyable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
]),
Section::make(__('admin.payment_transactions.sections.error'))
->schema([
TextEntry::make('error_message')
->label(__('admin.payment_transactions.fields.error_message'))
->placeholder(__('admin.payment_transactions.placeholders.empty'))
->columnSpanFull(),
]),
Section::make(__('admin.payment_transactions.sections.payload'))
->schema([
TextEntry::make('payload')
->label(__('admin.payment_transactions.fields.payload'))
->formatStateUsing(fn (mixed $state): string => json_encode($state ?: [], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?: '{}')
->fontFamily('mono')
->columnSpanFull(),
]),
]);
}
}
@@ -0,0 +1,88 @@
<?php
namespace App\Filament\Resources\PaymentTransactions\Tables;
use App\Enums\PaymentTransactionStatus;
use App\Enums\PaymentTransactionType;
use Filament\Actions\ViewAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class PaymentTransactionsTable
{
public static function configure(Table $table): Table
{
return $table
->defaultSort('created_at', 'desc')
->columns([
TextColumn::make('created_at')
->label(__('admin.payment_transactions.fields.created_at'))
->dateTime()
->sortable(),
TextColumn::make('status')
->label(__('admin.payment_transactions.fields.status'))
->badge()
->sortable(),
TextColumn::make('type')
->label(__('admin.payment_transactions.fields.type'))
->badge()
->sortable(),
TextColumn::make('user.email')
->label(__('admin.payment_transactions.fields.user'))
->searchable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextColumn::make('creditProduct.name')
->label(__('admin.payment_transactions.fields.credit_product'))
->searchable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextColumn::make('amount')
->label(__('admin.payment_transactions.fields.amount'))
->money(fn ($record): string => $record->currency ?: 'eur', divideBy: 100)
->sortable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextColumn::make('credits_expected')
->label(__('admin.payment_transactions.fields.credits_expected'))
->numeric(decimalPlaces: 0)
->sortable()
->placeholder(__('admin.payment_transactions.placeholders.empty')),
TextColumn::make('credits_granted')
->label(__('admin.payment_transactions.fields.credits_granted'))
->numeric(decimalPlaces: 0)
->sortable(),
TextColumn::make('stripe_event_type')
->label(__('admin.payment_transactions.fields.stripe_event_type'))
->toggleable(),
TextColumn::make('stripe_checkout_session_id')
->label(__('admin.payment_transactions.fields.stripe_checkout_session_id_short'))
->copyable()
->searchable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('stripe_invoice_id')
->label(__('admin.payment_transactions.fields.stripe_invoice_id_short'))
->copyable()
->searchable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('stripe_price_id')
->label(__('admin.payment_transactions.fields.stripe_price_id'))
->copyable()
->searchable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('error_message')
->label(__('admin.payment_transactions.fields.error_message'))
->limit(60)
->toggleable(),
])
->filters([
SelectFilter::make('status')
->label(__('admin.payment_transactions.fields.status'))
->options(PaymentTransactionStatus::class),
SelectFilter::make('type')
->label(__('admin.payment_transactions.fields.type'))
->options(PaymentTransactionType::class),
])
->recordActions([
ViewAction::make(),
]);
}
}