Add PayPal webhook handling

This commit is contained in:
Codex Agent
2026-02-04 14:23:07 +01:00
parent 66c7131d79
commit 5c78ac00dd
12 changed files with 676 additions and 7 deletions

View File

@@ -4,6 +4,7 @@ namespace App\Services\Coupons;
use App\Enums\CouponStatus;
use App\Enums\CouponType;
use App\Models\CheckoutSession;
use App\Models\Coupon;
use App\Models\CouponRedemption;
use App\Models\Package;
@@ -18,11 +19,11 @@ class CouponService
/**
* @return array{coupon: Coupon, pricing: array<string, mixed>, source: string}
*/
public function preview(string $code, Package $package, ?Tenant $tenant = null): array
public function preview(string $code, Package $package, ?Tenant $tenant = null, ?string $provider = null): array
{
$coupon = $this->findCouponForCode($code);
$this->ensureCouponCanBeApplied($coupon, $package, $tenant);
$this->ensureCouponCanBeApplied($coupon, $package, $tenant, $this->resolveProvider($provider));
$pricing = $this->buildPricingBreakdown($coupon, $package, $tenant);
@@ -33,9 +34,9 @@ class CouponService
];
}
public function ensureCouponCanBeApplied(Coupon $coupon, Package $package, ?Tenant $tenant = null): void
public function ensureCouponCanBeApplied(Coupon $coupon, Package $package, ?Tenant $tenant = null, ?string $provider = null): void
{
if (! $coupon->lemonsqueezy_discount_id) {
if ($provider !== CheckoutSession::PROVIDER_PAYPAL && ! $coupon->lemonsqueezy_discount_id) {
throw ValidationException::withMessages([
'code' => __('marketing.coupon.errors.not_synced'),
]);
@@ -75,6 +76,17 @@ class CouponService
}
}
protected function resolveProvider(?string $provider): ?string
{
if ($provider && $provider !== '') {
return $provider;
}
$default = config('checkout.default_provider');
return is_string($default) && $default !== '' ? $default : null;
}
protected function findCouponForCode(string $code): Coupon
{
$normalized = Str::upper(trim($code));