From aac1cab4485983beb3d7cc7597b8195d2e01ce6b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 27 Jul 2023 17:33:55 +1000 Subject: [PATCH] Fixes for timezone correction --- app/Jobs/Util/ReminderJob.php | 4 +- app/Utils/Traits/MakesReminders.php | 24 +++++++---- tests/Feature/ReminderTest.php | 62 +++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index 2f80eeb6c628..3a2d00919cc5 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -125,7 +125,7 @@ class ReminderJob implements ShouldQueue } $reminder_template = $invoice->calculateTemplate('invoice'); - // nlog("reminder template = {$reminder_template}"); + nlog("reminder template = {$reminder_template}"); $invoice->service()->touchReminder($reminder_template)->save(); $fees = $this->calcLateFee($invoice, $reminder_template); @@ -139,7 +139,7 @@ class ReminderJob implements ShouldQueue if ($reminder_template == 'endless_reminder') { $enabled_reminder = 'enable_reminder_endless'; } - + if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'reminder_endless', 'endless_reminder']) && $invoice->client->getSetting($enabled_reminder) && $invoice->client->getSetting('send_reminders') && diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 2d9f8b80b607..d886ffaacbb8 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -19,21 +19,31 @@ use Illuminate\Support\Carbon; */ trait MakesReminders { + /** + * + * @param string $schedule_reminder + * @param string $num_days_reminder + * @return ?bool + */ public function inReminderWindow($schedule_reminder, $num_days_reminder) { + + $offset = $this->client->timezone_offset(); + + // nlog($schedule_reminder. " ". $num_days_reminder); + // nlog("date = " . Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)); + // nlog("due date = " . Carbon::parse($this->due_date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)); + // nlog("now = " . Carbon::now()->startOfDay()->format('Y-m-d H:i:s')); + switch ($schedule_reminder) { case 'after_invoice_date': - return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay()); - break; + return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)->eq(Carbon::now()); case 'before_due_date': - return Carbon::parse($this->due_date)->subDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay()); - break; + return Carbon::parse($this->due_date)->subDays($num_days_reminder)->startOfDay()->addSeconds($offset)->eq(Carbon::now()); case 'after_due_date': - return Carbon::parse($this->due_date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay()); - break; + return Carbon::parse($this->due_date)->addDays($num_days_reminder)->startOfDay()->addSeconds($offset)->eq(Carbon::now()); default: return null; - break; } } diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index 8be2e0952e6c..5812e955db47 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -50,6 +50,68 @@ class ReminderTest extends TestCase $this->withoutExceptionHandling(); } + public function testForReminderFiringCorrectly() + { + + $this->invoice->next_send_date = null; + $this->invoice->date = now()->format('Y-m-d'); + $this->invoice->last_sent_date = now(); + $this->invoice->due_date = Carbon::now()->addDays(5)->format('Y-m-d'); + $this->invoice->reminder_last_sent = null; + $this->invoice->save(); + + $settings = $this->company->settings; + $settings->enable_reminder1 = true; + $settings->schedule_reminder1 = 'after_invoice_date'; + $settings->num_days_reminder1 = 2; + $settings->enable_reminder2 = false; + $settings->schedule_reminder2 = ''; + $settings->num_days_reminder2 = 0; + $settings->enable_reminder3 = false; + $settings->schedule_reminder3 = ''; + $settings->num_days_reminder3 = 0; + $settings->timezone_id = '109'; + $settings->entity_send_time = 6; + $settings->endless_reminder_frequency_id = ''; + $settings->enable_reminder_endless = false; + + $this->client->company->settings = $settings; + $this->client->push(); + + $client_settings = $settings; + $client_settings->timezone_id = '5'; + $client_settings->entity_send_time = 8; + + $this->invoice->client->settings = $client_settings; + $this->invoice->push(); + + $this->invoice = $this->invoice->service()->markSent()->save(); + $this->invoice->service()->setReminder($client_settings)->save(); + + $this->invoice = $this->invoice->fresh(); + + //due to UTC server time, we actually send the "day before" + $this->assertEquals(now()->addDays(1)->format('Y-m-d'), Carbon::parse($this->invoice->next_send_date)->format('Y-m-d')); + + $this->travelTo(now()->startOfDay()); + + for($x=0; $x<46; $x++) { + + // nlog("traveller {$x} ".now()->format('Y-m-d h:i:s')); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNull($this->invoice->reminder1_sent); + $this->assertNull($this->invoice->reminder_last_sent); + + $this->travelTo(now()->addHours(1)); + } + + // nlog("traveller ".now()->format('Y-m-d')); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNotNull($this->invoice->reminder1_sent); + + } public function testForSingleEndlessReminder() {