From e254a9ad73e9a7541a8b5fa2a4a1b8d5bf26cee0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 26 May 2021 10:35:39 +1000 Subject: [PATCH] Refactor reminders --- app/Jobs/Util/ReminderJob.php | 2 +- app/Observers/InvoiceObserver.php | 3 + app/Services/Invoice/InvoiceService.php | 8 ++ app/Services/Invoice/MarkSent.php | 3 +- app/Services/Invoice/UpdateReminder.php | 131 +++++++++++++++++++++++ app/Utils/Traits/MakesReminders.php | 115 +------------------- tests/Feature/ReminderTest.php | 6 +- tests/Integration/CheckRemindersTest.php | 12 +-- 8 files changed, 155 insertions(+), 125 deletions(-) create mode 100644 app/Services/Invoice/UpdateReminder.php diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index c0f4a7bcfefe..5988076a16ee 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -68,7 +68,7 @@ class ReminderJob implements ShouldQueue event(new InvoiceWasEmailed($invoice->invitations->first(), $invoice->company, Ninja::eventVars(), $reminder_template)); } - $invoice->setReminder(); + $invoice->service()->setReminder()->save(); } else { $invoice->next_send_date = null; diff --git a/app/Observers/InvoiceObserver.php b/app/Observers/InvoiceObserver.php index db104603dbf6..d3f425c3f577 100644 --- a/app/Observers/InvoiceObserver.php +++ b/app/Observers/InvoiceObserver.php @@ -52,6 +52,9 @@ class InvoiceObserver WebhookHandler::dispatch(Webhook::EVENT_UPDATE_INVOICE, $invoice, $invoice->company); } + if($invoice->isDirty('date') || $invoice->isDirty('due_date')) + $invoice->service()->setReminder()->save(); + // UnlinkFile::dispatchNow(config('filesystems.default'), $invoice->client->invoice_filepath() . $invoice->numberFormatter().'.pdf'); } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index adb0c4e5c5ea..f93d5a88db30 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -21,6 +21,7 @@ use App\Models\Invoice; use App\Models\Payment; use App\Models\Task; use App\Services\Client\ClientService; +use App\Services\Invoice\UpdateReminder; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use Illuminate\Support\Carbon; @@ -425,6 +426,13 @@ class InvoiceService return $this; } + public function setReminder($settings = null) + { + $this->invoice = (new UpdateReminder($this->invoice, $settings))->run(); + + return $this; + } + /** * Saves the invoice. * @return Invoice object diff --git a/app/Services/Invoice/MarkSent.php b/app/Services/Invoice/MarkSent.php index 11e36d590503..07dd66e817eb 100644 --- a/app/Services/Invoice/MarkSent.php +++ b/app/Services/Invoice/MarkSent.php @@ -46,10 +46,9 @@ class MarkSent extends AbstractService ->setDueDate() ->updateBalance($this->invoice->amount) ->deletePdf() + ->setReminder() ->save(); - $this->invoice->setReminder(); - $this->client->service()->updateBalance($this->invoice->balance)->save(); $this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, "Invoice {$this->invoice->number} marked as sent."); diff --git a/app/Services/Invoice/UpdateReminder.php b/app/Services/Invoice/UpdateReminder.php new file mode 100644 index 000000000000..c9a0078e6d7a --- /dev/null +++ b/app/Services/Invoice/UpdateReminder.php @@ -0,0 +1,131 @@ +invoice = $invoice; + $this->settings = $settings; + } + + public function run() + { + + if (! $this->settings) { + $this->settings = $this->invoice->client->getMergedSettings(); + } + + if (! $this->invoice->isPayable()) { + $this->invoice->next_send_date = null; + $this->invoice->save(); + + return; //exit early + } + + $date_collection = collect(); + + if (is_null($this->invoice->reminder1_sent) && + $this->settings->schedule_reminder1 == 'after_invoice_date' && + $this->settings->num_days_reminder1 > 0) { + $reminder_date = Carbon::parse($this->invoice->date)->addDays($this->settings->num_days_reminder1); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder1_sent) && + $this->settings->schedule_reminder1 == 'before_due_date' && + $this->settings->num_days_reminder1 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->subDays($this->settings->num_days_reminder1); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder1_sent) && + $this->settings->schedule_reminder1 == 'after_due_date' && + $this->settings->num_days_reminder1 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->addDays($this->settings->num_days_reminder1); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder2_sent) && + $this->settings->schedule_reminder2 == 'after_invoice_date' && + $this->settings->num_days_reminder2 > 0) { + $reminder_date = Carbon::parse($this->invoice->date)->addDays($this->settings->num_days_reminder2); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder2_sent) && + $this->settings->schedule_reminder2 == 'before_due_date' && + $this->settings->num_days_reminder2 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->subDays($this->settings->num_days_reminder2); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder2_sent) && + $this->settings->schedule_reminder2 == 'after_due_date' && + $this->settings->num_days_reminder2 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->addDays($this->settings->num_days_reminder2); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder3_sent) && + $this->settings->schedule_reminder3 == 'after_invoice_date' && + $this->settings->num_days_reminder3 > 0) { + $reminder_date = Carbon::parse($this->invoice->date)->addDays($this->settings->num_days_reminder3); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder3_sent) && + $this->settings->schedule_reminder3 == 'before_due_date' && + $this->settings->num_days_reminder3 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->subDays($this->settings->num_days_reminder3); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + if (is_null($this->invoice->reminder3_sent) && + $this->settings->schedule_reminder3 == 'after_due_date' && + $this->settings->num_days_reminder3 > 0) { + $reminder_date = Carbon::parse($this->invoice->due_date)->addDays($this->settings->num_days_reminder3); + + if ($reminder_date->gt(Carbon::parse($this->invoice->next_send_date))); + $date_collection->push($reminder_date->format('Y-m-d')); + } + + $this->invoice->next_send_date = $date_collection->sort()->first(); + + return $this->invoice; + } +} \ No newline at end of file diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index b650de23b474..d0457321f141 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -19,116 +19,7 @@ use Illuminate\Support\Carbon; */ trait MakesReminders { - public function setReminder($settings = null) - { - if (! $settings) { - $settings = $this->client->getMergedSettings(); - } - - if (! $this->isPayable()) { - $this->next_send_date = null; - $this->save(); - - return; //exit early - } - - $date_collection = collect(); - - if (is_null($this->reminder1_sent) && - $settings->schedule_reminder1 == 'after_invoice_date' && - $settings->num_days_reminder1 > 0) { - $reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder1); - nlog("reminder 1 = after invoice date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_invoice_date pushed to collection'); - } - - if (is_null($this->reminder1_sent) && - $settings->schedule_reminder1 == 'before_due_date' && - $settings->num_days_reminder1 > 0) { - $reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder1); - nlog("reminder 1 = before_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('before_due_date pushed to collection'); - } - - if (is_null($this->reminder1_sent) && - $settings->schedule_reminder1 == 'after_due_date' && - $settings->num_days_reminder1 > 0) { - $reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder1); - nlog("reminder 1 = after_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_due_date pushed to collection'); - } - - if (is_null($this->reminder2_sent) && - $settings->schedule_reminder2 == 'after_invoice_date' && - $settings->num_days_reminder2 > 0) { - $reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder2); - nlog("reminder 2 = after_invoice_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_invoice_date pushed to collection'); - } - - if (is_null($this->reminder2_sent) && - $settings->schedule_reminder2 == 'before_due_date' && - $settings->num_days_reminder2 > 0) { - $reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder2); - nlog("reminder 2 = before_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('before_due_date pushed to collection'); - } - - if (is_null($this->reminder2_sent) && - $settings->schedule_reminder2 == 'after_due_date' && - $settings->num_days_reminder2 > 0) { - $reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder2); - nlog("reminder 2 = after_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_due_date pushed to collection'); - } - - if (is_null($this->reminder3_sent) && - $settings->schedule_reminder3 == 'after_invoice_date' && - $settings->num_days_reminder3 > 0) { - $reminder_date = Carbon::parse($this->date)->addDays($settings->num_days_reminder3); - nlog("reminder 3 = after_invoice_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_invoice_date pushed to collection'); - } - - if (is_null($this->reminder3_sent) && - $settings->schedule_reminder3 == 'before_due_date' && - $settings->num_days_reminder3 > 0) { - $reminder_date = Carbon::parse($this->due_date)->subDays($settings->num_days_reminder3); - nlog("reminder 3 = before_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('before_due_date pushed to collection'); - } - - if (is_null($this->reminder3_sent) && - $settings->schedule_reminder3 == 'after_due_date' && - $settings->num_days_reminder3 > 0) { - $reminder_date = Carbon::parse($this->due_date)->addDays($settings->num_days_reminder3); - nlog("reminder 3 = after_due_date = {$reminder_date}"); - - if ($reminder_date->gt(Carbon::parse($this->next_send_date))); - $date_collection->push($reminder_date->format('Y-m-d')); nlog('after_due_date pushed to collection'); - } - - $this->next_send_date = $date_collection->sort()->first(); - - $this->save(); - } - + public function inReminderWindow($schedule_reminder, $num_days_reminder) { switch ($schedule_reminder) { @@ -195,11 +86,9 @@ trait MakesReminders private function addTimeInterval($date, $endless_reminder_frequency_id) :?Carbon { - if (!$date) { + if (!$date) return null; - } - switch ($endless_reminder_frequency_id) { case RecurringInvoice::FREQUENCY_WEEKLY: return Carbon::parse($date)->addWeek()->startOfDay(); diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index 8ed4c6bea559..3651be8c7f5b 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -75,7 +75,7 @@ class ReminderTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals($this->invoice->next_send_date, Carbon::now()->addDays(7)->format('Y-m-d')); @@ -102,7 +102,7 @@ class ReminderTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->invoice->fresh(); @@ -132,7 +132,7 @@ class ReminderTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->invoice->fresh(); diff --git a/tests/Integration/CheckRemindersTest.php b/tests/Integration/CheckRemindersTest.php index b8f2cbb265f8..f58cc42339fa 100644 --- a/tests/Integration/CheckRemindersTest.php +++ b/tests/Integration/CheckRemindersTest.php @@ -52,7 +52,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals(0, Carbon::now()->addDays(7)->diffInDays($this->invoice->next_send_date)); } @@ -75,7 +75,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent()->setStatus(Invoice::STATUS_PAID); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals($this->invoice->next_send_date, null); } @@ -98,7 +98,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals(0, Carbon::parse($this->invoice->due_date)->subDays(29)->diffInDays($this->invoice->next_send_date)); } @@ -118,7 +118,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals(0, Carbon::parse($this->invoice->due_date)->addDays(1)->diffInDays($this->invoice->next_send_date)); } @@ -141,7 +141,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals($this->invoice->next_send_date, null); } @@ -164,7 +164,7 @@ class CheckRemindersTest extends TestCase $this->company->settings = $settings; $this->invoice->service()->markSent(); - $this->invoice->setReminder($settings); + $this->invoice->service()->setReminder($settings)->save(); $this->assertEquals($this->invoice->next_send_date, null); }