From 0676a1f5c702a736f7775223c0e2e30552aa76c6 Mon Sep 17 00:00:00 2001 From: Konstantinos Arvanitakis Date: Thu, 3 Sep 2026 18:26:48 +0300 Subject: [PATCH] Feat: Recording Payment Transactions --- .../Listeners/RecordPaymentTransaction.php | 57 +++++++++++++++++++ src/Order/Services/TransactionRecorder.php | 55 ++++++++++++++++++ src/Payment/Services/TransactionRecorder.php | 49 ---------------- src/Providers/OrderServiceProvider.php | 7 +++ 4 files changed, 119 insertions(+), 49 deletions(-) create mode 100644 src/Order/Listeners/RecordPaymentTransaction.php create mode 100644 src/Order/Services/TransactionRecorder.php delete mode 100644 src/Payment/Services/TransactionRecorder.php diff --git a/src/Order/Listeners/RecordPaymentTransaction.php b/src/Order/Listeners/RecordPaymentTransaction.php new file mode 100644 index 0000000..ae88025 --- /dev/null +++ b/src/Order/Listeners/RecordPaymentTransaction.php @@ -0,0 +1,57 @@ +context['order_id'] ?? null; + + if ($orderId === null) { + return; + } + + $order = Order::findOrFail($orderId); + + $type = match ($event::class) { + PaymentAuthorized::class => 'intent', + PaymentCaptured::class => 'capture', + PaymentRefunded::class => 'refund', + PaymentVoided::class => 'void', + }; + + $this->transactions->record($order, $type, $event->type, $event->result); + } +} diff --git a/src/Order/Services/TransactionRecorder.php b/src/Order/Services/TransactionRecorder.php new file mode 100644 index 0000000..fc13e29 --- /dev/null +++ b/src/Order/Services/TransactionRecorder.php @@ -0,0 +1,55 @@ +transactions()->create([ + 'success' => $result->status === PaymentResultStatus::Succeeded, + 'type' => $type, + 'driver' => $driver, + 'amount' => $result->amount->value, + 'reference' => $result->reference, + 'status' => $result->status->name, + 'notes' => $result->failureReason, + 'meta' => $result->meta, + ]); + } +} diff --git a/src/Payment/Services/TransactionRecorder.php b/src/Payment/Services/TransactionRecorder.php deleted file mode 100644 index 4b27e71..0000000 --- a/src/Payment/Services/TransactionRecorder.php +++ /dev/null @@ -1,49 +0,0 @@ -transactions()->create([ - 'success' => $result->success, - 'type' => 'refund', - 'driver' => $driver, - 'amount' => $result->amount, - 'reference' => $result->reference, - 'status' => $result->success ? 'succeeded' : 'failed', - 'notes' => $notes ?? $result->message, - 'meta' => $result->meta, - ]); - } - - public function recordCapture(Order $order, string $driver, CaptureResult $result, ?string $notes = null): Transaction - { - return $order->transactions()->create([ - 'success' => $result->success, - 'type' => 'capture', - 'driver' => $driver, - 'amount' => $result->amount, - 'reference' => $result->reference, - 'status' => $result->success ? 'succeeded' : 'failed', - 'notes' => $notes ?? $result->message, - 'meta' => $result->meta, - ]); - } -} diff --git a/src/Providers/OrderServiceProvider.php b/src/Providers/OrderServiceProvider.php index 73ca692..3bb84a7 100644 --- a/src/Providers/OrderServiceProvider.php +++ b/src/Providers/OrderServiceProvider.php @@ -9,6 +9,7 @@ use Lunar\Models\Transaction; use Modules\Core\Notification\NotificationRegistry; use Modules\Core\Order\Listeners\ApplyResolvedPaymentStatus; use Modules\Core\Order\Listeners\DeriveOrderDeliveredFromShipment; +use Modules\Core\Order\Listeners\RecordPaymentTransaction; use Modules\Core\Order\Notifications\OrderCapturedNotification; use Modules\Core\Order\Notifications\OrderDeliveredNotification; use Modules\Core\Order\Notifications\OrderRefundedNotification; @@ -18,6 +19,8 @@ use Modules\Core\Order\Observers\TransactionObserver; use Modules\Core\Order\Support\OrderStatus; use Modules\Core\Payment\Events\PaymentAuthorized; use Modules\Core\Payment\Events\PaymentCaptured; +use Modules\Core\Payment\Events\PaymentRefunded; +use Modules\Core\Payment\Events\PaymentVoided; use Modules\Core\Shipping\Events\ShipmentStatusUpdatedByCarrier; class OrderServiceProvider extends ServiceProvider @@ -33,6 +36,10 @@ class OrderServiceProvider extends ServiceProvider Event::listen(ShipmentStatusUpdatedByCarrier::class, DeriveOrderDeliveredFromShipment::class); Event::listen(PaymentCaptured::class, ApplyResolvedPaymentStatus::class); Event::listen(PaymentAuthorized::class, ApplyResolvedPaymentStatus::class); + Event::listen(PaymentCaptured::class, RecordPaymentTransaction::class); + Event::listen(PaymentAuthorized::class, RecordPaymentTransaction::class); + Event::listen(PaymentVoided::class, RecordPaymentTransaction::class); + Event::listen(PaymentRefunded::class, RecordPaymentTransaction::class); NotificationRegistry::get()->register([ OrderDeliveredNotification::class,