toDateTimeString()); $this->timezoneAware(); } else { //multiDB environment, need to foreach (MultiDB::$dbs as $db) { MultiDB::setDB($db); nlog('Subscription Cron for ' . $db . ' ' . now()->toDateTimeString()); $this->timezoneAware(); } } } //Requires the crons to be updated and set to hourly @ 00:01 private function timezoneAware() { $grouped_company_ids = Invoice::select('company_id') ->where('is_deleted', 0) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->where('balance', '>', 0) ->where('is_proforma', 0) ->whereDate('due_date', '<=', now()->addDay()->startOfDay()) ->whereNull('deleted_at') ->whereNotNull('subscription_id') ->groupBy('company_id') ->cursor() ->each(function ($company_id){ $company = Company::find($company_id); $timezone_now = now()->setTimezone($company->timezone()->name); //Capture companies within the window of 00:00 and 00:30 if($timezone_now->gt($timezone_now->copy()->startOfDay()) && $timezone_now->lt($timezone_now->copy()->startOfDay()->addMinutes(30))) { Invoice::query() ->where('company_id', $company->id) ->whereNull('deleted_at') ->where('is_deleted', 0) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->where('is_proforma', 0) ->whereNotNull('subscription_id') ->where('balance', '>', 0) ->whereDate('due_date', '<=', now()->addDay()->startOfDay()) ->cursor() ->each(function (Invoice $invoice) { $subscription = $invoice->subscription; $body = [ 'context' => 'plan_expired', 'client' => $invoice->client->hashed_id, 'invoice' => $invoice->hashed_id, 'subscription' => $subscription->hashed_id, ]; $this->sendLoad($subscription, $body); //This will send the notification daily. //We'll need to handle this by performing some action on the invoice to either archive it or delete it? }); } }); } }