From 8e2cea71290cba20b6d5a334990859af8aa07125 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 5 Nov 2020 12:33:31 +1100 Subject: [PATCH] Working on reminders --- app/Jobs/Ninja/SendReminders.php | 52 ++++++++++++++++++++++---- app/Utils/Traits/MakesReminders.php | 22 +++++------ app/Utils/Traits/QuoteEmailBuilder.php | 7 ++-- 3 files changed, 59 insertions(+), 22 deletions(-) diff --git a/app/Jobs/Ninja/SendReminders.php b/app/Jobs/Ninja/SendReminders.php index 530795612cd9..abac040c2fd1 100644 --- a/app/Jobs/Ninja/SendReminders.php +++ b/app/Jobs/Ninja/SendReminders.php @@ -23,6 +23,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Carbon; class SendReminders implements ShouldQueue { @@ -68,17 +69,13 @@ class SendReminders implements ShouldQueue } - private function chargeLateFee() - { - - } - private function sendReminderEmails() { $invoices = Invoice::where('is_deleted', 0) ->where('balance', '>', 0) ->whereDate('next_send_date', '<=', now()->startOfDay()) ->whereNotNull('next_send_date') + ->with('client') ->cursor(); //we only need invoices that are payable @@ -118,11 +115,52 @@ class SendReminders implements ShouldQueue } } - private function calculateNextSendDate($invoice, $template) + private function calculateNextSendDate($invoice) { + $dates = collect(); + + $settings = $invoice->client->getMergedSettings(); + + if((int)$settings->schedule_reminder1 > 0) + $dates->push($this->calculateScheduledDate($invoice, (int)$settings->schedule_reminder1, (int)$settings->num_days_reminder1)); + + if((int)$settings->num_days_reminder2 > 0) + $dates->push($this->calculateScheduledDate($invoice, (int)$settings->schedule_reminder2, (int)$settings->num_days_reminder2)); + + if((int)$settings->num_days_reminder3 > 0) + $dates->push($this->calculateScheduledDate($invoice, (int)$settings->schedule_reminder3, (int)$settings->num_days_reminder3)); + + if((int)$settings->endless_reminder_frequency_id > 0) + $dates->push(); + + //calculate every potential date, then pluck the next one + //reminder1,2,3, and endless could potentially be the NEXT_SEND_DATE + // + //we check num_days to determine if the setting is ACTIVE } + + + private function calculateScheduledDate($invoice, $schedule_reminder, $num_days_reminder) + { + switch ($schedule_reminder) { + case 'after_invoice_date': + return Carbon::parse($invoice->date)->addDays($num_days_reminder)->startOfDay(); + break; + case 'before_due_date': + return Carbon::parse($invoice->due_date)->subDays($num_days_reminder)->startOfDay(); + break; + case 'after_due_date': + return Carbon::parse($invoice->due_date)->addDays($num_days_reminder)->startOfDay(); + break; + default: + return null; + break; + } + } + + private function sendReminder($invoice, $template) { $invoice = $this->calcLateFee($invoice, $template); @@ -140,7 +178,7 @@ class SendReminders implements ShouldQueue $invoice->last_sent_date = now(); $invoice->reminder_last_send = now(); - $invoice->next_send_date = $this->calculateNextSendDate($invoice, $template); + $invoice->next_send_date = $this->calculateNextSendDate($invoice); if(in_array($template, ['reminder1', 'reminder2', 'reminder3'])) $invoice->{$template."_send"} = now(); diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 1c039de1fa98..6d071f501af8 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -234,27 +234,27 @@ trait MakesReminders switch ($endless_reminder_frequency_id) { case RecurringInvoice::FREQUENCY_WEEKLY: - return Carbon::parse($this->next_send_date)->addWeek()->startOfDay(); + return Carbon::parse($this->last_sent_date)->addWeek()->startOfDay(); case RecurringInvoice::FREQUENCY_TWO_WEEKS: - return Carbon::parse($this->next_send_date)->addWeeks(2)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addWeeks(2)->startOfDay(); case RecurringInvoice::FREQUENCY_FOUR_WEEKS: - return Carbon::parse($this->next_send_date)->addWeeks(4)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addWeeks(4)->startOfDay(); case RecurringInvoice::FREQUENCY_MONTHLY: - return Carbon::parse($this->next_send_date)->addMonthNoOverflow()->startOfDay(); + return Carbon::parse($this->last_sent_date)->addMonthNoOverflow()->startOfDay(); case RecurringInvoice::FREQUENCY_TWO_MONTHS: - return Carbon::parse($this->next_send_date)->addMonthsNoOverflow(2)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addMonthsNoOverflow(2)->startOfDay(); case RecurringInvoice::FREQUENCY_THREE_MONTHS: - return Carbon::parse($this->next_send_date)->addMonthsNoOverflow(3)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addMonthsNoOverflow(3)->startOfDay(); case RecurringInvoice::FREQUENCY_FOUR_MONTHS: - return Carbon::parse($this->next_send_date)->addMonthsNoOverflow(4)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addMonthsNoOverflow(4)->startOfDay(); case RecurringInvoice::FREQUENCY_SIX_MONTHS: - return Carbon::parse($this->next_send_date)->addMonthsNoOverflow(6)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addMonthsNoOverflow(6)->startOfDay(); case RecurringInvoice::FREQUENCY_ANNUALLY: - return Carbon::parse($this->next_send_date)->addYear()->startOfDay(); + return Carbon::parse($this->last_sent_date)->addYear()->startOfDay(); case RecurringInvoice::FREQUENCY_TWO_YEARS: - return Carbon::parse($this->next_send_date)->addYears(2)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addYears(2)->startOfDay(); case RecurringInvoice::FREQUENCY_THREE_YEARS: - return Carbon::parse($this->next_send_date)->addYears(3)->startOfDay(); + return Carbon::parse($this->last_sent_date)->addYears(3)->startOfDay(); default: return null; } diff --git a/app/Utils/Traits/QuoteEmailBuilder.php b/app/Utils/Traits/QuoteEmailBuilder.php index 230f3f817bd5..a87a1fb1cdf5 100644 --- a/app/Utils/Traits/QuoteEmailBuilder.php +++ b/app/Utils/Traits/QuoteEmailBuilder.php @@ -30,11 +30,10 @@ trait QuoteEmailBuilder */ public function getEmailData($reminder_template = null, $contact = null) :array { - //client - //$client = $this->client; - if (! $reminder_template) { - $reminder_template = $this->calculateTemplate('quote'); + $reminder_template = 'quote'; + + //$reminder_template = $this->calculateTemplate('quote'); } //Need to determine which email template we are producing