From 923af8833674572e149fdee4bea9ca0695f56a3b Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 30 Aug 2023 18:23:55 +0200 Subject: [PATCH] fix: subscriptions --- app/Http/Controllers/ServerController.php | 2 +- .../Livewire/Subscription/PricingPlans.php | 4 +- app/Jobs/CleanupInstanceStuffsJob.php | 2 +- app/Jobs/SubscriptionInvoiceFailedJob.php | 1 - app/Models/Subscription.php | 48 ++++++++++++++----- app/Models/User.php | 4 +- bootstrap/helpers/subscriptions.php | 24 +++++++--- config/constants.php | 7 ++- ...71051_add_stripe_plan_to_subscriptions.php | 29 +++++++++++ .../views/components/forms/button.blade.php | 6 ++- .../views/components/team/navbar.blade.php | 14 +----- .../emails/waitlist-confirmation.blade.php | 2 +- resources/views/livewire/dashboard.blade.php | 13 ++++- .../livewire/subscription/actions.blade.php | 28 ++++++----- .../views/livewire/team/delete.blade.php | 2 +- resources/views/subscription/cancel.blade.php | 3 -- resources/views/subscription/index.blade.php | 16 ++++--- .../views/subscription/success.blade.php | 3 -- routes/web.php | 2 - routes/webhooks.php | 6 ++- 20 files changed, 147 insertions(+), 69 deletions(-) create mode 100644 database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php delete mode 100644 resources/views/subscription/cancel.blade.php delete mode 100644 resources/views/subscription/success.blade.php diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index 54b8c7a8c..2e3b7f794 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -12,7 +12,7 @@ class ServerController extends Controller public function new_server() { - if (!is_cloud() || isInstanceAdmin()) { + if (!is_cloud()) { return view('server.create', [ 'limit_reached' => false, 'private_keys' => PrivateKey::ownedByCurrentTeam()->get(), diff --git a/app/Http/Livewire/Subscription/PricingPlans.php b/app/Http/Livewire/Subscription/PricingPlans.php index cc43599bb..7d77f68c4 100644 --- a/app/Http/Livewire/Subscription/PricingPlans.php +++ b/app/Http/Livewire/Subscription/PricingPlans.php @@ -48,8 +48,8 @@ class PricingPlans extends Component 'enabled' => true, ], 'mode' => 'subscription', - 'success_url' => route('subscription.success'), - 'cancel_url' => route('subscription.index',['cancelled' => true]), + 'success_url' => route('dashboard', ['success' => true]), + 'cancel_url' => route('subscription.index', ['cancelled' => true]), ]; $customer = currentTeam()->subscription?->stripe_customer_id ?? null; if ($customer) { diff --git a/app/Jobs/CleanupInstanceStuffsJob.php b/app/Jobs/CleanupInstanceStuffsJob.php index b133279ea..1275839d9 100644 --- a/app/Jobs/CleanupInstanceStuffsJob.php +++ b/app/Jobs/CleanupInstanceStuffsJob.php @@ -37,7 +37,7 @@ class CleanupInstanceStuffsJob implements ShouldQueue, ShouldBeUnique private function cleanup_waitlist() { - $waitlist = Waitlist::whereVerified(false)->where('created_at', '<', now()->subMinutes(config('constants.waitlist.confirmation_valid_for_minutes')))->get(); + $waitlist = Waitlist::whereVerified(false)->where('created_at', '<', now()->subMinutes(config('constants.waitlist.expiration')))->get(); foreach ($waitlist as $item) { $item->delete(); } diff --git a/app/Jobs/SubscriptionInvoiceFailedJob.php b/app/Jobs/SubscriptionInvoiceFailedJob.php index d6750f953..48e9fea64 100755 --- a/app/Jobs/SubscriptionInvoiceFailedJob.php +++ b/app/Jobs/SubscriptionInvoiceFailedJob.php @@ -9,7 +9,6 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; -use Stripe\Stripe; class SubscriptionInvoiceFailedJob implements ShouldQueue { diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php index e0a52d5b1..4acd7fe8a 100644 --- a/app/Models/Subscription.php +++ b/app/Models/Subscription.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Str; class Subscription extends Model { @@ -14,19 +15,44 @@ class Subscription extends Model } public function type() { - $basic = explode(',', config('subscription.lemon_squeezy_basic_plan_ids')); - $pro = explode(',', config('subscription.lemon_squeezy_pro_plan_ids')); - $ultimate = explode(',', config('subscription.lemon_squeezy_ultimate_plan_ids')); + if (isLemon()) { + $basic = explode(',', config('subscription.lemon_squeezy_basic_plan_ids')); + $pro = explode(',', config('subscription.lemon_squeezy_pro_plan_ids')); + $ultimate = explode(',', config('subscription.lemon_squeezy_ultimate_plan_ids')); - $subscription = $this->lemon_variant_id; - if (in_array($subscription, $basic)) { - return 'basic'; + $subscription = $this->lemon_variant_id; + if (in_array($subscription, $basic)) { + return 'basic'; + } + if (in_array($subscription, $pro)) { + return 'pro'; + } + if (in_array($subscription, $ultimate)) { + return 'ultimate'; + } } - if (in_array($subscription, $pro)) { - return 'pro'; - } - if (in_array($subscription, $ultimate)) { - return 'ultimate'; + if (isStripe()) { + if (!$this->stripe_plan_id) { + return 'unknown'; + } + $subscription = Subscription::where('id', $this->id)->first(); + if (!$subscription) { + return null; + } + $subscriptionPlanId = data_get($subscription,'stripe_plan_id'); + if (!$subscriptionPlanId) { + return null; + } + $subscriptionConfigs = collect(config('subscription')); + $stripePlanId = null; + $subscriptionConfigs->map(function ($value, $key) use ($subscriptionPlanId, &$stripePlanId) { + if ($value === $subscriptionPlanId){ + $stripePlanId = $key; + }; + })->first(); + if ($stripePlanId) { + return Str::of($stripePlanId)->after('stripe_price_id_')->before('_')->lower(); + } } return 'unknown'; } diff --git a/app/Models/User.php b/app/Models/User.php index ca3cf0bd3..9050de214 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -32,7 +32,7 @@ class User extends Authenticatable implements SendsEmail $team = [ 'name' => $user->name . "'s Team", 'personal_team' => true, - 'boarding' => true + 'show_boarding' => true ]; if ($user->id === 0) { $team['id'] = 0; @@ -94,7 +94,7 @@ class User extends Authenticatable implements SendsEmail public function currentTeam() { - return session('currentTeam'); + return Team::find(session('currentTeam')->id); } public function otherTeams() diff --git a/bootstrap/helpers/subscriptions.php b/bootstrap/helpers/subscriptions.php index ce58d1790..b02d56497 100644 --- a/bootstrap/helpers/subscriptions.php +++ b/bootstrap/helpers/subscriptions.php @@ -56,16 +56,16 @@ function isSubscriptionActive() if (!$subscription) { return false; } - if (config('subscription.provider') === 'lemon') { + if (isLemon()) { return $subscription->lemon_status === 'active'; } - if (config('subscription.provider') === 'stripe') { + // if (isPaddle()) { + // return $subscription->paddle_status === 'active'; + // } + if (isStripe()) { return $subscription->stripe_invoice_paid === true && $subscription->stripe_cancel_at_period_end === false; } return false; - // if (config('subscription.provider') === 'paddle') { - // return $subscription->paddle_status === 'active'; - // } } function isSubscriptionOnGracePeriod() @@ -78,12 +78,12 @@ function isSubscriptionOnGracePeriod() if (!$subscription) { return false; } - if (config('subscription.provider') === 'lemon') { + if (isLemon()) { $is_still_grace_period = $subscription->lemon_ends_at && Carbon::parse($subscription->lemon_ends_at) > Carbon::now(); return $is_still_grace_period; } - if (config('subscription.provider') === 'stripe') { + if (isStripe()) { return $subscription->stripe_cancel_at_period_end; } return false; @@ -92,6 +92,15 @@ function subscriptionProvider() { return config('subscription.provider'); } +function isLemon () { + return config('subscription.provider') === 'lemon'; +} +function isStripe() { + return config('subscription.provider') === 'stripe'; +} +function isPaddle() { + return config('subscription.provider') === 'paddle'; +} function getStripeCustomerPortalSession(Team $team) { Stripe::setApiKey(config('subscription.stripe_api_key')); @@ -124,5 +133,6 @@ function allowedPathsForBoardingAccounts() ...allowedPathsForUnsubscribedAccounts(), 'boarding', 'livewire/message/boarding', + 'livewire/message/boarding.index', ]; } diff --git a/config/constants.php b/config/constants.php index be7710e6b..209e9254b 100644 --- a/config/constants.php +++ b/config/constants.php @@ -1,7 +1,7 @@ [ - 'confirmation_valid_for_minutes' => 10, + 'expiration' => 10, ], 'invitation' => [ 'link' => [ @@ -15,5 +15,10 @@ return [ 'pro' => 10, 'ultimate' => 25, ], + 'smtp' => [ + 'basic' => false, + 'pro' => true, + 'ultimate' => true, + ], ], ]; diff --git a/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php b/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php new file mode 100644 index 000000000..3da187320 --- /dev/null +++ b/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php @@ -0,0 +1,29 @@ +string('stripe_plan_id')->nullable()->after('stripe_cancel_at_period_end'); + + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('subscriptions', function (Blueprint $table) { + $table->dropColumn('stripe_plan_id'); + }); + } +}; diff --git a/resources/views/components/forms/button.blade.php b/resources/views/components/forms/button.blade.php index a2350beda..f619e3ba1 100644 --- a/resources/views/components/forms/button.blade.php +++ b/resources/views/components/forms/button.blade.php @@ -12,7 +12,9 @@ @if ($attributes->get('type') === 'submit') @else - + @if ($attributes->has('wire:click')) + + @endif @endif diff --git a/resources/views/components/team/navbar.blade.php b/resources/views/components/team/navbar.blade.php index 39f5fff62..7923340c8 100644 --- a/resources/views/components/team/navbar.blade.php +++ b/resources/views/components/team/navbar.blade.php @@ -4,20 +4,10 @@
  1. - Currently active team: {{ session('currentTeam.name') }} + Currently active team: {{ session('currentTeam.name') }}
  2. - @if (session('currentTeam.description')) -
  3. - - {{ Str::limit(session('currentTeam.description'), 52) }} -
  4. - @endif