Updated checkout to wait for backend confirmation before advancing, added a “Processing payment…” state with retry/ refresh fallback, and now use Paddle totals/currency for purchase records + confirmation emails (with new email translations).

This commit is contained in:
Codex Agent
2025-12-22 09:06:48 +01:00
parent 41d29eb7d3
commit 84234bfb8e
36 changed files with 1742 additions and 187 deletions

View File

@@ -4,20 +4,20 @@ namespace App\Services\GiftVouchers;
use App\Enums\CouponStatus;
use App\Enums\CouponType;
use App\Jobs\NotifyGiftVoucherReminder;
use App\Jobs\SyncCouponToPaddle;
use App\Mail\GiftVoucherIssued;
use App\Jobs\NotifyGiftVoucherReminder;
use App\Models\Coupon;
use App\Models\GiftVoucher;
use App\Models\Package;
use App\Services\Paddle\PaddleTransactionService;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Carbon\Carbon;
class GiftVoucherService
{
@@ -28,7 +28,7 @@ class GiftVoucherService
*/
public function issueFromPaddle(array $payload): GiftVoucher
{
$metadata = $payload['metadata'] ?? [];
$metadata = $this->extractCustomData($payload);
$priceId = $this->resolvePriceId($payload);
$amount = $this->resolveAmount($payload);
$currency = Str::upper($this->resolveCurrency($payload));
@@ -193,7 +193,7 @@ class GiftVoucherService
protected function resolvePriceId(array $payload): ?string
{
$metadata = $payload['metadata'] ?? [];
$metadata = $this->extractCustomData($payload);
if (is_array($metadata) && ! empty($metadata['paddle_price_id'])) {
return $metadata['paddle_price_id'];
@@ -242,6 +242,29 @@ class GiftVoucherService
?? 'EUR';
}
/**
* @param array<string, mixed> $payload
* @return array<string, mixed>
*/
protected function extractCustomData(array $payload): array
{
$customData = [];
if (isset($payload['custom_data']) && is_array($payload['custom_data'])) {
$customData = $payload['custom_data'];
}
if (isset($payload['customData']) && is_array($payload['customData'])) {
$customData = array_merge($customData, $payload['customData']);
}
if (isset($payload['metadata']) && is_array($payload['metadata'])) {
$customData = array_merge($customData, $payload['metadata']);
}
return $customData;
}
protected function generateCode(): string
{
return 'GIFT-'.Str::upper(Str::random(8));