From 1599711deeabfcc0b33bba265949f64528d4f8db Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 5 Mar 2021 21:18:28 +1100 Subject: [PATCH 1/3] Observers and policy scaffold --- app/Console/Kernel.php | 3 + app/Jobs/Cron/BillingSubscriptionCron.php | 52 ++++++++++++++ app/Models/BillingSubscription.php | 19 +++++ app/Models/ClientSubscription.php | 19 +++++ app/Observers/BillingSubscriptionObserver.php | 72 +++++++++++++++++++ app/Observers/ClientSubscriptionObserver.php | 72 +++++++++++++++++++ app/Policies/BillingSubscriptionPolicy.php | 31 ++++++++ app/Providers/AppServiceProvider.php | 8 ++- app/Providers/AuthServiceProvider.php | 3 + 9 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 app/Jobs/Cron/BillingSubscriptionCron.php create mode 100644 app/Models/BillingSubscription.php create mode 100644 app/Models/ClientSubscription.php create mode 100644 app/Observers/BillingSubscriptionObserver.php create mode 100644 app/Observers/ClientSubscriptionObserver.php create mode 100644 app/Policies/BillingSubscriptionPolicy.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 24a661eae68f..1d3be1016fce 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -11,6 +11,7 @@ namespace App\Console; +use App\Jobs\Cron\BillingSubscriptionCron; use App\Jobs\Cron\RecurringInvoicesCron; use App\Jobs\Ninja\AdjustEmailQuota; use App\Jobs\Ninja\CompanySizeCheck; @@ -53,6 +54,8 @@ class Kernel extends ConsoleKernel $schedule->job(new UpdateExchangeRates)->daily()->withoutOverlapping(); + $schedule->job(new BillingSubscriptionCron)->daily()->withoutOverlapping(); + $schedule->job(new RecurringInvoicesCron)->hourly()->withoutOverlapping(); /* Run hosted specific jobs */ diff --git a/app/Jobs/Cron/BillingSubscriptionCron.php b/app/Jobs/Cron/BillingSubscriptionCron.php new file mode 100644 index 000000000000..993605593365 --- /dev/null +++ b/app/Jobs/Cron/BillingSubscriptionCron.php @@ -0,0 +1,52 @@ +isAdmin() || $user->hasPermission('create_billing_subscription') || $user->hasPermission('create_all'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3d96377fa950..c017572692c3 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -12,7 +12,9 @@ namespace App\Providers; use App\Models\Account; +use App\Models\BillingSubscription; use App\Models\Client; +use App\Models\ClientSubscription; use App\Models\Company; use App\Models\CompanyGateway; use App\Models\CompanyToken; @@ -26,7 +28,9 @@ use App\Models\Quote; use App\Models\Task; use App\Models\User; use App\Observers\AccountObserver; +use App\Observers\BillingSubscriptionObserver; use App\Observers\ClientObserver; +use App\Observers\ClientSubscriptionObserver; use App\Observers\CompanyGatewayObserver; use App\Observers\CompanyObserver; use App\Observers\CompanyTokenObserver; @@ -75,9 +79,10 @@ class AppServiceProvider extends ServiceProvider Schema::defaultStringLength(191); - User::observe(UserObserver::class); Account::observe(AccountObserver::class); + BillingSubscription::observe(BillingSubscriptionObserver::class); Client::observe(ClientObserver::class); + ClientSubscription::observe(ClientSubscriptionObserver::class); Company::observe(CompanyObserver::class); CompanyGateway::observe(CompanyGatewayObserver::class); CompanyToken::observe(CompanyTokenObserver::class); @@ -89,6 +94,7 @@ class AppServiceProvider extends ServiceProvider Proposal::observe(ProposalObserver::class); Quote::observe(QuoteObserver::class); Task::observe(TaskObserver::class); + User::observe(UserObserver::class); // Queue::before(function (JobProcessing $event) { // // \Log::info('Event Job '.$event->connectionName); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 23d6f3a59220..60281db3b3fe 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -12,6 +12,7 @@ namespace App\Providers; use App\Models\Activity; +use App\Models\BillingSubscription; use App\Models\Client; use App\Models\Company; use App\Models\CompanyGateway; @@ -37,6 +38,7 @@ use App\Models\User; use App\Models\Vendor; use App\Models\Webhook; use App\Policies\ActivityPolicy; +use App\Policies\BillingSubscriptionPolicy; use App\Policies\ClientPolicy; use App\Policies\CompanyGatewayPolicy; use App\Policies\CompanyPolicy; @@ -73,6 +75,7 @@ class AuthServiceProvider extends ServiceProvider */ protected $policies = [ Activity::class => ActivityPolicy::class, + BillingSubscription::class => BillingSubscriptionPolicy::class, Client::class => ClientPolicy::class, Company::class => CompanyPolicy::class, CompanyToken::class => CompanyTokenPolicy::class, From 097d9ac1b8909d5a0284df1c45bdce81fac2b626 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 6 Mar 2021 11:47:05 +1100 Subject: [PATCH 2/3] Padding out functionality --- app/Jobs/Cron/BillingSubscriptionCron.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/Jobs/Cron/BillingSubscriptionCron.php b/app/Jobs/Cron/BillingSubscriptionCron.php index 993605593365..453ab3befa02 100644 --- a/app/Jobs/Cron/BillingSubscriptionCron.php +++ b/app/Jobs/Cron/BillingSubscriptionCron.php @@ -49,4 +49,14 @@ class BillingSubscriptionCron } } } + + /* Our daily cron should check + + 1. Is the subscription still in trial phase? + 2. Check the recurring invoice and its remaining_cycles to see whether we need to cancel or perform any other function. + */ + private function processSubscription($client_subscription) + { + + } } From 93493116ed5ede879f062c327b191469b012cb7b Mon Sep 17 00:00:00 2001 From: = Date: Sat, 6 Mar 2021 17:19:57 +1100 Subject: [PATCH 3/3] Scaffolds for billing_subscriptions --- app/Jobs/Cron/BillingSubscriptionCron.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/Jobs/Cron/BillingSubscriptionCron.php b/app/Jobs/Cron/BillingSubscriptionCron.php index 453ab3befa02..091cb10c5f83 100644 --- a/app/Jobs/Cron/BillingSubscriptionCron.php +++ b/app/Jobs/Cron/BillingSubscriptionCron.php @@ -35,25 +35,34 @@ class BillingSubscriptionCron */ public function handle() : void { - /* Get all invoices where the send date is less than NOW + 30 minutes() */ if (! config('ninja.db.multi_db_enabled')) { - + $this->loopSubscriptions(); } else { //multiDB environment, need to foreach (MultiDB::$dbs as $db) { MultiDB::setDB($db); - + $this->loopSubscriptions(); } } } + private function loopSubscriptions() + { + $client_subs = ClientSubscription::whereNull('deleted_at') + ->cursor() + ->each(function ($cs){ + $this->processSubscription($cs); + }); + } + /* Our daily cron should check 1. Is the subscription still in trial phase? 2. Check the recurring invoice and its remaining_cycles to see whether we need to cancel or perform any other function. + 3. Any notifications that need to fire? */ private function processSubscription($client_subscription) {