diff --git a/app/Console/Commands/SendRemindersCron.php b/app/Console/Commands/SendRemindersCron.php index f5b60b7feef0..01b2f1087e74 100644 --- a/app/Console/Commands/SendRemindersCron.php +++ b/app/Console/Commands/SendRemindersCron.php @@ -11,16 +11,24 @@ namespace App\Console\Commands; +use App\DataMapper\InvoiceItem; +use App\Events\Invoice\InvoiceWasEmailed; +use App\Jobs\Entity\EmailEntity; use App\Jobs\Ninja\SendReminders; +use App\Jobs\Util\WebhookHandler; use App\Libraries\MultiDB; use App\Models\Invoice; use App\Models\Quote; use App\Models\Webhook; +use App\Utils\Ninja; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesReminders; use Illuminate\Console\Command; -use App\Jobs\Util\WebhookHandler; +use Illuminate\Support\Facades\App; class SendRemindersCron extends Command { + use MakesReminders, MakesDates; /** * The name and signature of the console command. * @@ -52,11 +60,171 @@ class SendRemindersCron extends Command */ public function handle() { - SendReminders::dispatchNow(); - $this->webHookOverdueInvoices(); - $this->webHookExpiredQuotes(); + Invoice::where('next_send_date', '<=', now()->toDateTimeString()) + ->whereNull('deleted_at') + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) + ->where('balance', '>', 0) + ->whereHas('client', function ($query) { + $query->where('is_deleted',0) + ->where('deleted_at', NULL); + }) + ->whereHas('company', function ($query) { + $query->where('is_disabled',0); + }) + ->with('invitations')->cursor()->each(function ($invoice) { + + if ($invoice->isPayable()) { + $reminder_template = $invoice->calculateTemplate('invoice'); + $invoice->service()->touchReminder($reminder_template)->save(); + $invoice = $this->calcLateFee($invoice, $reminder_template); + + //check if this reminder needs to be emailed + if(in_array($reminder_template, ['reminder1','reminder2','reminder3']) && $invoice->client->getSetting("enable_".$reminder_template)) + { + $invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) { + EmailEntity::dispatch($invitation, $invitation->company, $reminder_template); + nlog("Firing reminder email for invoice {$invoice->number}"); + }); + + if ($invoice->invitations->count() > 0) { + event(new InvoiceWasEmailed($invoice->invitations->first(), $invoice->company, Ninja::eventVars(), $reminder_template)); + } + } + $invoice->service()->setReminder()->save(); + + } else { + $invoice->next_send_date = null; + $invoice->save(); + } + + }); + + + // SendReminders::dispatchNow(); + + // $this->webHookOverdueInvoices(); + // $this->webHookExpiredQuotes(); } + + + private function calcLateFee($invoice, $template) :Invoice + { + $late_fee_amount = 0; + $late_fee_percent = 0; + + switch ($template) { + case 'reminder1': + $late_fee_amount = $invoice->client->getSetting('late_fee_amount1'); + $late_fee_percent = $invoice->client->getSetting('late_fee_percent1'); + break; + case 'reminder2': + $late_fee_amount = $invoice->client->getSetting('late_fee_amount2'); + $late_fee_percent = $invoice->client->getSetting('late_fee_percent2'); + break; + case 'reminder3': + $late_fee_amount = $invoice->client->getSetting('late_fee_amount3'); + $late_fee_percent = $invoice->client->getSetting('late_fee_percent3'); + break; + case 'endless_reminder': + $late_fee_amount = $invoice->client->getSetting('late_fee_endless_amount'); + $late_fee_percent = $invoice->client->getSetting('late_fee_endless_percent'); + break; + default: + $late_fee_amount = 0; + $late_fee_percent = 0; + break; + } + + return $this->setLateFee($invoice, $late_fee_amount, $late_fee_percent); + } + + /** + * Applies the late fee to the invoice line items + * + * @param Invoice $invoice + * @param float $amount The fee amount + * @param float $percent The fee percentage amount + * + * @return Invoice + */ + private function setLateFee($invoice, $amount, $percent) :Invoice + { + + App::forgetInstance('translator'); + $t = app('translator'); + $t->replace(Ninja::transformTranslations($invoice->client->getMergedSettings())); + App::setLocale($invoice->client->locale()); + + $temp_invoice_balance = $invoice->balance; + + if ($amount <= 0 && $percent <= 0) { + return $invoice; + } + + $fee = $amount; + + if ($invoice->partial > 0) { + $fee += round($invoice->partial * $percent / 100, 2); + } else { + $fee += round($invoice->balance * $percent / 100, 2); + } + + $invoice_item = new InvoiceItem; + $invoice_item->type_id = '5'; + $invoice_item->product_key = trans('texts.fee'); + $invoice_item->notes = ctrans('texts.late_fee_added', ['date' => $this->translateDate(now()->startOfDay(), $invoice->client->date_format(), $invoice->client->locale())]); + $invoice_item->quantity = 1; + $invoice_item->cost = $fee; + + $invoice_items = $invoice->line_items; + $invoice_items[] = $invoice_item; + + $invoice->line_items = $invoice_items; + + /**Refresh Invoice values*/ + $invoice->calc()->getInvoice()->save(); + $invoice->fresh(); + $invoice->service()->deletePdf(); + + /* Refresh the client here to ensure the balance is fresh */ + $client = $invoice->client; + $client = $client->fresh(); + + nlog("adjusting client balance and invoice balance by ". ($invoice->balance - $temp_invoice_balance)); + $client->service()->updateBalance($invoice->balance - $temp_invoice_balance)->save(); + $invoice->ledger()->updateInvoiceBalance($invoice->balance - $temp_invoice_balance, "Late Fee Adjustment for invoice {$invoice->number}"); + + return $invoice; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + private function webHookOverdueInvoices() {