Fixes for timezone correction

This commit is contained in:
David Bomba 2023-07-27 17:33:55 +10:00
parent 0e152fff26
commit aac1cab448
3 changed files with 81 additions and 9 deletions

View File

@ -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') &&

View File

@ -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;
}
}

View File

@ -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()
{