$company->id]); // Override settings and currencies Overrider::load('settings'); Overrider::load('currencies'); $company->setSettings(); $recurring = $company->recurring(); foreach ($recurring as $recur) { $schedule = $this->schedule($recur); $current = Date::parse($schedule->current()->getStart()); // Check if should recur today if ($today->ne($current)) { continue; } $type = end(explode('\\', $recur->recurable_type)); $model = $type::find($recur->recurable_id); if (!$model) { continue; } switch ($type) { case 'Bill': $this->recurBill($company, $model); break; case 'Invoice': $this->recurInvoice($company, $model); break; case 'Payment': case 'Revenue': $model->duplicate(); break; } } } // Unset company_id session()->forget('company_id'); } protected function recurInvoice($company, $model) { $clone = $model->duplicate(); // Add invoice history InvoiceHistory::create([ 'company_id' => session('company_id'), 'invoice_id' => $clone->id, 'status_code' => 'draft', 'notify' => 0, 'description' => trans('messages.success.added', ['type' => $clone->invoice_number]), ]); // Notify the customer if ($clone->customer && !empty($clone->customer_email)) { $clone->customer->notify(new InvoiceNotification($clone)); } // Notify all users assigned to this company foreach ($company->users as $user) { if (!$user->can('read-notifications')) { continue; } $user->notify(new InvoiceNotification($clone)); } // Update next invoice number $this->increaseNextInvoiceNumber(); } protected function recurBill($company, $model) { $clone = $model->duplicate(); // Add bill history BillHistory::create([ 'company_id' => session('company_id'), 'bill_id' => $clone->id, 'status_code' => 'draft', 'notify' => 0, 'description' => trans('messages.success.added', ['type' => $clone->bill_number]), ]); // Notify all users assigned to this company foreach ($company->users as $user) { if (!$user->can('read-notifications')) { continue; } $user->notify(new BillNotification($clone)); } } protected function schedule($recur) { $config = new ArrayTransformerConfig(); $config->enableLastDayOfMonthFix(); $transformer = new ArrayTransformer(); $transformer->setConfig($config); return $transformer->transform($this->rule($recur)); } protected function rule($recur) { $rule = (new Rule()) ->setStartDate($recur->started_at) ->setTimezone(setting('general.timezone')) ->setFreq(strtoupper($recur->frequency)) ->setInterval($recur->interval) ->setCount($recur->count); return $rule; } }