Skip to content

Commit ad21a56

Browse files
Merge pull request #8105 from bakaphp/fix/reverse-payments
Fix/reverse payments
2 parents 37b2eb4 + 5a3661c commit ad21a56

File tree

6 files changed

+921
-82
lines changed

6 files changed

+921
-82
lines changed

src/Domains/Connectors/Movipass/Actions/ProcessPaymentAction.php

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,32 +63,46 @@ public function execute(ConsumerAuthentication $consumerData): array
6363

6464
$intentId = $this->order->fresh()->get(CustomFieldEnum::ECHO_PAY_PAYMENT_INTENT_ID->value);
6565
$bankTransaction = explode(':', $intentId)[1];
66-
if ($this->order->get(CustomFieldEnum::ECHO_PAY_SHOULD_CAPTURE->value)) {
67-
$paymentProcessor->capturePayment($this->payment, $this->order, $bankTransaction);
68-
try {
69-
if ($orderStatus = $this->order->orderType?->statuses()->where('slug', PaymentStatusEnum::PAID->value)->first()) {
70-
new TransitionOrderStateAction(
71-
$this->order,
72-
$this->payment->user,
73-
$orderStatus
74-
)->execute(true);
75-
}
76-
new SendPaymentReceiptAction(
66+
67+
if (! $this->order->get(CustomFieldEnum::ECHO_PAY_SHOULD_CAPTURE->value)) {
68+
return $this->handleReversal($paymentProcessor, $bankTransaction, $result['message']);
69+
}
70+
71+
$captureResult = $paymentProcessor->capturePayment($this->payment, $this->order, $bankTransaction);
72+
73+
if ($captureResult['status'] === 'error') {
74+
return $this->handleReversal($paymentProcessor, $bankTransaction, 'Capture failed: ' . $captureResult['message']);
75+
}
76+
77+
try {
78+
if ($orderStatus = $this->order->orderType?->statuses()->where('slug', PaymentStatusEnum::PAID->value)->first()) {
79+
new TransitionOrderStateAction(
7780
$this->order,
78-
$this->payment,
79-
$this->payment->user
80-
)->execute();
81-
} catch (Exception $e) {
82-
report($e);
81+
$this->payment->user,
82+
$orderStatus
83+
)->execute(true);
8384
}
84-
} else {
85-
$reason = $result['message'];
86-
$response = $paymentProcessor->reversePayment($this->payment, $this->order, $bankTransaction, $reason);
87-
$result['status'] = PaymentStatusEnum::FAILED->value;
88-
$result['message'] = $response['message'] . ' - ' . $reason;
89-
$result['data'] = $response['data'];
85+
86+
new SendPaymentReceiptAction(
87+
$this->order,
88+
$this->payment,
89+
$this->payment->user
90+
)->execute();
91+
} catch (Exception $e) {
92+
report($e);
9093
}
9194

9295
return $result;
9396
}
97+
98+
private function handleReversal(PortalPaymentProcessor $paymentProcessor, string $bankTransaction, string $reason): array
99+
{
100+
$response = $paymentProcessor->reversePayment($this->payment, $this->order, $bankTransaction, $reason);
101+
102+
return [
103+
'status' => PaymentStatusEnum::FAILED->value,
104+
'message' => $response['message'] . ' - ' . $reason,
105+
'data' => $response['data'],
106+
];
107+
}
94108
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Kanvas\Souk\Payments\Actions;
6+
7+
use Kanvas\Souk\Payments\Models\PaymentLogs;
8+
use Kanvas\Souk\Payments\Models\Payments;
9+
use Throwable;
10+
11+
class LogPaymentEventAction
12+
{
13+
public function execute(Payments $payment, string $event, array $context = []): void
14+
{
15+
try {
16+
PaymentLogs::create([
17+
'payments_id' => $payment->id,
18+
'apps_id' => $payment->apps_id,
19+
'companies_id' => $payment->companies_id,
20+
'users_id' => $payment->users_id,
21+
'status' => $event,
22+
'metadata' => $context,
23+
]);
24+
} catch (Throwable $e) {
25+
report($e);
26+
}
27+
}
28+
}

src/Domains/Souk/Payments/Models/PaymentLogs.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44

55
namespace Kanvas\Souk\Payments\Models;
66

7+
use Baka\Casts\Json;
78
use Kanvas\Souk\Models\BaseModel;
89

910
class PaymentLogs extends BaseModel
1011
{
1112
protected $table = 'payment_logs';
1213
protected $guarded = [];
14+
15+
protected $casts = [
16+
'metadata' => Json::class,
17+
];
1318
}

src/Domains/Souk/Payments/Models/Payments.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Illuminate\Database\Eloquent\Relations\HasMany;
1010
use Kanvas\Payments\Models\PaymentMethods;
1111
use Kanvas\Souk\Models\BaseModel;
12+
use Kanvas\Souk\Payments\Actions\LogPaymentEventAction;
1213
use Kanvas\Souk\Payments\Enums\PaymentStatusEnum;
1314
use Kanvas\Workflow\Traits\CanUseWorkflow;
1415

@@ -66,6 +67,11 @@ public function addMetadata(array $metadata): void
6667
];
6768
}
6869

70+
public function addLog(string $event, array $context = []): void
71+
{
72+
app(LogPaymentEventAction::class)->execute($this, $event, $context);
73+
}
74+
6975
public function scopePending($query)
7076
{
7177
return $query->whereIn('status', [PaymentStatusEnum::PENDING->value, PaymentStatusEnum::PENDING_AUTHORIZATION->value]);

0 commit comments

Comments
 (0)