Consolidate pricing onto a single source. Pro is deferred from launch (left dormant: no Stripe price, no card), so the offered set is 3 tiers. - Extract the pricing grid and footer into shared components (PricingGrid.vue, landing/SiteFooter.vue); add a /pricing route rendering Pricing.vue; remove the pricing section from Home - Repoint every upgrade link to the /pricing route (LandingNav and SiteFooter via RouterLink, UpsellBanner CTA) — no more #pricing anchors - Bump Smart (plus) SMS daily limit 1 -> 3 (PlanSeeder + PlanFactory), update PlanFeaturesTest assertion - Rewrite /pricing card bullets to match real entitlements (drop unbuilt promises: multi-location tracking, 14-day trend, supermarket anchor) - Fix stale "1/day" SMS references in notifications.md, tiers.md, docs/tiers.md - Delete unused resources/views/components/pricing-card.blade.php Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
112 lines
3.5 KiB
PHP
112 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Database\Factories;
|
|
|
|
use App\Enums\PlanTier;
|
|
use App\Models\Plan;
|
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
|
|
|
/**
|
|
* @extends Factory<Plan>
|
|
*/
|
|
class PlanFactory extends Factory
|
|
{
|
|
public function definition(): array
|
|
{
|
|
return [
|
|
'name' => PlanTier::Free->value,
|
|
'stripe_price_id_monthly' => null,
|
|
'stripe_price_id_annual' => null,
|
|
'max_fuel_types' => 1,
|
|
'email_enabled' => true,
|
|
'email_frequency' => 'weekly_digest',
|
|
'push_enabled' => false,
|
|
'push_frequency' => 'none',
|
|
'whatsapp_enabled' => false,
|
|
'whatsapp_daily_limit' => 0,
|
|
'whatsapp_scheduled_updates' => 0,
|
|
'sms_enabled' => false,
|
|
'sms_daily_limit' => 0,
|
|
'ai_predictions' => false,
|
|
'price_threshold' => false,
|
|
'score_alerts' => false,
|
|
'active' => true,
|
|
];
|
|
}
|
|
|
|
public function free(): static
|
|
{
|
|
return $this->state(fn () => [
|
|
'name' => PlanTier::Free->value,
|
|
'stripe_price_id_monthly' => null,
|
|
'stripe_price_id_annual' => null,
|
|
]);
|
|
}
|
|
|
|
public function basic(): static
|
|
{
|
|
return $this->state(fn () => [
|
|
'name' => PlanTier::Basic->value,
|
|
'stripe_price_id_monthly' => 'price_basic_monthly_test',
|
|
'stripe_price_id_annual' => 'price_basic_annual_test',
|
|
'max_fuel_types' => 1,
|
|
'email_enabled' => true,
|
|
'email_frequency' => 'daily',
|
|
'push_enabled' => true,
|
|
'push_frequency' => 'daily',
|
|
'whatsapp_enabled' => true,
|
|
'whatsapp_daily_limit' => 5,
|
|
'whatsapp_scheduled_updates' => 2,
|
|
'sms_enabled' => false,
|
|
'sms_daily_limit' => 0,
|
|
'ai_predictions' => false,
|
|
'price_threshold' => true,
|
|
'score_alerts' => true,
|
|
]);
|
|
}
|
|
|
|
public function plus(): static
|
|
{
|
|
return $this->state(fn () => [
|
|
'name' => PlanTier::Plus->value,
|
|
'stripe_price_id_monthly' => 'price_plus_monthly_test',
|
|
'stripe_price_id_annual' => 'price_plus_annual_test',
|
|
'max_fuel_types' => 1,
|
|
'email_enabled' => true,
|
|
'email_frequency' => 'triggered',
|
|
'push_enabled' => true,
|
|
'push_frequency' => 'triggered',
|
|
'whatsapp_enabled' => true,
|
|
'whatsapp_daily_limit' => 5,
|
|
'whatsapp_scheduled_updates' => 2,
|
|
'sms_enabled' => true,
|
|
'sms_daily_limit' => 3,
|
|
'ai_predictions' => true,
|
|
'price_threshold' => true,
|
|
'score_alerts' => true,
|
|
]);
|
|
}
|
|
|
|
public function pro(): static
|
|
{
|
|
return $this->state(fn () => [
|
|
'name' => PlanTier::Pro->value,
|
|
'stripe_price_id_monthly' => 'price_pro_monthly_test',
|
|
'stripe_price_id_annual' => 'price_pro_annual_test',
|
|
'max_fuel_types' => null,
|
|
'email_enabled' => true,
|
|
'email_frequency' => 'triggered',
|
|
'push_enabled' => true,
|
|
'push_frequency' => 'triggered',
|
|
'whatsapp_enabled' => true,
|
|
'whatsapp_daily_limit' => 5,
|
|
'whatsapp_scheduled_updates' => 2,
|
|
'sms_enabled' => true,
|
|
'sms_daily_limit' => 3,
|
|
'ai_predictions' => true,
|
|
'price_threshold' => true,
|
|
'score_alerts' => true,
|
|
]);
|
|
}
|
|
}
|