Tests for reminders

This commit is contained in:
David Bomba 2022-08-10 13:35:47 +10:00
parent 12ccb04f76
commit 2893c98b0e
5 changed files with 108 additions and 3 deletions

View File

@ -98,6 +98,8 @@ class BillingPortalPurchase extends Component
*/ */
public $payment_method_id; public $payment_method_id;
private $user_coupon;
/** /**
* List of steps that frontend form follows. * List of steps that frontend form follows.
* *
@ -436,32 +438,45 @@ class BillingPortalPurchase extends Component
*/ */
public function updateQuantity(string $option): int public function updateQuantity(string $option): int
{ {
$this->handleCoupon();
if ($this->quantity == 1 && $option == 'decrement') { if ($this->quantity == 1 && $option == 'decrement') {
$this->price = $this->price * 1;
return $this->quantity; return $this->quantity;
} }
if ($this->quantity >= $this->subscription->max_seats_limit && $option == 'increment') { if ($this->quantity > $this->subscription->max_seats_limit && $option == 'increment') {
$this->price = $this->price * $this->subscription->max_seats_limit;
return $this->quantity; return $this->quantity;
} }
if ($option == 'increment') { if ($option == 'increment') {
$this->quantity++; $this->quantity++;
$this->price = $this->subscription->promo_price * $this->quantity; $this->price = $this->price * $this->quantity;
return $this->quantity; return $this->quantity;
} }
$this->quantity--; $this->quantity--;
$this->price = $this->subscription->promo_price * $this->quantity; $this->price = $this->price * $this->quantity;
return $this->quantity; return $this->quantity;
} }
public function handleCoupon() public function handleCoupon()
{ {
if($this->steps['discount_applied']){
$this->price = $this->subscription->promo_price;
return;
}
if ($this->coupon == $this->subscription->promo_code) { if ($this->coupon == $this->subscription->promo_code) {
$this->price = $this->subscription->promo_price; $this->price = $this->subscription->promo_price;
$this->quantity = 1;
$this->steps['discount_applied'] = true; $this->steps['discount_applied'] = true;
} }
else
$this->price = $this->subscription->price;
} }
public function passwordlessLogin() public function passwordlessLogin()

View File

@ -75,6 +75,7 @@ class ReminderJob implements ShouldQueue
->with('invitations')->cursor()->each(function ($invoice) { ->with('invitations')->cursor()->each(function ($invoice) {
if ($invoice->isPayable()) { if ($invoice->isPayable()) {
$reminder_template = $invoice->calculateTemplate('invoice'); $reminder_template = $invoice->calculateTemplate('invoice');
nlog("reminder template = {$reminder_template}");
$invoice->service()->touchReminder($reminder_template)->save(); $invoice->service()->touchReminder($reminder_template)->save();
$invoice = $this->calcLateFee($invoice, $reminder_template); $invoice = $this->calcLateFee($invoice, $reminder_template);
@ -93,6 +94,7 @@ class ReminderJob implements ShouldQueue
$invoice->client->getSetting($enabled_reminder) && $invoice->client->getSetting($enabled_reminder) &&
$invoice->client->getSetting('send_reminders') && $invoice->client->getSetting('send_reminders') &&
(Ninja::isSelfHost() || $invoice->company->account->isPaidHostedClient())) { (Ninja::isSelfHost() || $invoice->company->account->isPaidHostedClient())) {
$invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) { $invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) {
EmailEntity::dispatch($invitation, $invitation->company, $reminder_template); EmailEntity::dispatch($invitation, $invitation->company, $reminder_template);
nlog("Firing reminder email for invoice {$invoice->number}"); nlog("Firing reminder email for invoice {$invoice->number}");

View File

@ -370,6 +370,8 @@ class Client extends BaseModel implements HasLocalePreference
return $this->settings->{$setting}; return $this->settings->{$setting};
} elseif (is_bool($this->settings->{$setting})) { } elseif (is_bool($this->settings->{$setting})) {
return $this->settings->{$setting}; return $this->settings->{$setting};
} elseif (is_int($this->settings->{$setting})) { //10-08-2022 integer client values are not being passed back! This resolves it.
return $this->settings->{$setting};
} }
} }

View File

@ -21,6 +21,7 @@ trait MakesReminders
{ {
public function inReminderWindow($schedule_reminder, $num_days_reminder) public function inReminderWindow($schedule_reminder, $num_days_reminder)
{ {
switch ($schedule_reminder) { switch ($schedule_reminder) {
case 'after_invoice_date': case 'after_invoice_date':
return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay()); return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay());

View File

@ -48,6 +48,89 @@ class ReminderTest extends TestCase
$this->withoutExceptionHandling(); $this->withoutExceptionHandling();
} }
public function testForClientTimezoneEdges()
{
$this->invoice->next_send_date = null;
$this->invoice->date = now()->format('Y-m-d');
$this->invoice->due_date = Carbon::now()->addDays(5)->format('Y-m-d');
$this->invoice->save();
$settings = $this->company->settings;
$settings->enable_reminder1 = true;
$settings->schedule_reminder1 = 'before_due_date';
$settings->num_days_reminder1 = 4;
$settings->enable_reminder2 = true;
$settings->schedule_reminder2 = 'before_due_date';
$settings->num_days_reminder2 = 2;
$settings->enable_reminder3 = true;
$settings->schedule_reminder3 = 'after_due_date';
$settings->num_days_reminder3 = 3;
$settings->timezone_id = '15';
$settings->entity_send_time = 8;
$this->client->company->settings = $settings;
$this->client->push();
$client_settings = $settings;
$client_settings->timezone_id = '15';
$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();
$next_send_date = Carbon::parse($this->invoice->next_send_date);
$calculatedReminderDate = Carbon::parse($this->invoice->due_date)->subDays(4)->addSeconds($this->invoice->client->timezone_offset());
nlog($next_send_date->format('Y-m-d h:i:s'));
nlog($calculatedReminderDate->format('Y-m-d h:i:s'));
$this->travelTo(now()->addDays(1));
$reminder_template = $this->invoice->calculateTemplate('invoice');
$this->assertEquals('reminder1', $reminder_template);
$this->assertTrue($next_send_date->eq($calculatedReminderDate));
$this->invoice->service()->touchReminder($reminder_template)->save();
$this->assertNotNull($this->invoice->last_sent_date);
$this->assertNotNull($this->invoice->reminder1_sent);
$this->assertNotNull($this->invoice->reminder_last_sent);
//calc next send date
$this->invoice->service()->setReminder()->save();
$next_send_date = Carbon::parse($this->invoice->next_send_date);
nlog($next_send_date->format('Y-m-d h:i:s'));
$calculatedReminderDate = Carbon::parse($this->invoice->due_date)->subDays(2)->addSeconds($this->invoice->client->timezone_offset());
$this->assertTrue($next_send_date->eq($calculatedReminderDate));
$this->travelTo(now()->addDays(2));
$reminder_template = $this->invoice->calculateTemplate('invoice');
$this->assertEquals('reminder2', $reminder_template);
$this->invoice->service()->touchReminder($reminder_template)->save();
$this->assertNotNull($this->invoice->reminder2_sent);
$this->invoice->service()->setReminder()->save();
$next_send_date = Carbon::parse($this->invoice->next_send_date);
$calculatedReminderDate = Carbon::parse($this->invoice->due_date)->addDays(3)->addSeconds($this->invoice->client->timezone_offset());
$this->assertTrue($next_send_date->eq($calculatedReminderDate));
nlog($next_send_date->format('Y-m-d h:i:s'));
}
public function testReminderQueryCatchesDate() public function testReminderQueryCatchesDate()
{ {
$this->invoice->next_send_date = now()->format('Y-m-d'); $this->invoice->next_send_date = now()->format('Y-m-d');
@ -189,4 +272,6 @@ class ReminderTest extends TestCase
$this->assertNotNull($this->invoice->next_send_date); $this->assertNotNull($this->invoice->next_send_date);
} }
} }