fix(plans): prevent deletion of plans with active subscriptions

- Fix bulk delete and individual delete actions using before() hook with halt()
  - Add daily/weekly billing cycle options to plan resource and Polar provider
  - Enhance payment confirmation with dynamic polling and loading states
  - Add graceful handling for deleted plans in subscription display
  - Update Polar provider to support dynamic billing cycles
This commit is contained in:
idevakk
2025-12-07 02:23:14 -08:00
parent 1b438cbf89
commit 5fabec1f9d
7 changed files with 225 additions and 93 deletions

View File

@@ -690,4 +690,59 @@ class Subscription extends Model
// Fallback to legacy monthly_billing
return $this->plan && $this->plan->monthly_billing ? 30 : 365;
}
/**
* Get plan display name, handles deleted plans gracefully
*/
public function getPlanDisplayName(): string
{
if ($this->plan) {
return $this->plan->name;
}
// Check provider data for stored plan name
if ($this->provider_data) {
// Check for Polar plan name
if (isset($this->provider_data['polar_subscription']['product']['name'])) {
return $this->provider_data['polar_subscription']['product']['name'];
}
// Check for stored plan details
if (isset($this->provider_data['plan_details']['name'])) {
return $this->provider_data['plan_details']['name'];
}
// Check metadata
if (isset($this->provider_data['plan_name'])) {
return $this->provider_data['plan_name'];
}
}
return 'Deleted Plan';
}
/**
* Get plan price, handles deleted plans gracefully
*/
public function getPlanPrice(): float
{
if ($this->plan) {
return $this->plan->price;
}
// Check provider data for stored plan price
if ($this->provider_data) {
// Check for Polar subscription amount
if (isset($this->provider_data['polar_subscription']['amount'])) {
return $this->provider_data['polar_subscription']['amount'] / 100; // Convert from cents
}
// Check for stored plan details
if (isset($this->provider_data['plan_details']['price'])) {
return (float) $this->provider_data['plan_details']['price'];
}
}
return 0.0;
}
}