diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index ebe0ca6c2688..e4cfaaeef984 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -98,6 +98,8 @@ class BillingPortalPurchase extends Component */ public $payment_method_id; + private $user_coupon; + /** * List of steps that frontend form follows. * @@ -436,32 +438,45 @@ class BillingPortalPurchase extends Component */ public function updateQuantity(string $option): int { + $this->handleCoupon(); + if ($this->quantity == 1 && $option == 'decrement') { + $this->price = $this->price * 1; 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; } if ($option == 'increment') { $this->quantity++; - $this->price = $this->subscription->promo_price * $this->quantity; + $this->price = $this->price * $this->quantity; return $this->quantity; } $this->quantity--; - $this->price = $this->subscription->promo_price * $this->quantity; + $this->price = $this->price * $this->quantity; return $this->quantity; } public function handleCoupon() { + + if($this->steps['discount_applied']){ + $this->price = $this->subscription->promo_price; + return; + } + if ($this->coupon == $this->subscription->promo_code) { $this->price = $this->subscription->promo_price; + $this->quantity = 1; $this->steps['discount_applied'] = true; } + else + $this->price = $this->subscription->price; } public function passwordlessLogin() diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index 4aef5a9a3a60..877a5b6516ea 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -75,6 +75,7 @@ class ReminderJob implements ShouldQueue ->with('invitations')->cursor()->each(function ($invoice) { if ($invoice->isPayable()) { $reminder_template = $invoice->calculateTemplate('invoice'); + nlog("reminder template = {$reminder_template}"); $invoice->service()->touchReminder($reminder_template)->save(); $invoice = $this->calcLateFee($invoice, $reminder_template); @@ -93,6 +94,7 @@ class ReminderJob implements ShouldQueue $invoice->client->getSetting($enabled_reminder) && $invoice->client->getSetting('send_reminders') && (Ninja::isSelfHost() || $invoice->company->account->isPaidHostedClient())) { + $invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) { EmailEntity::dispatch($invitation, $invitation->company, $reminder_template); nlog("Firing reminder email for invoice {$invoice->number}"); diff --git a/app/Models/Client.php b/app/Models/Client.php index 1962fda33806..0d55cce34413 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -370,6 +370,8 @@ class Client extends BaseModel implements HasLocalePreference return $this->settings->{$setting}; } elseif (is_bool($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}; } } diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 5cc0ceff4ca6..eabecca32747 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -21,6 +21,7 @@ trait MakesReminders { public function inReminderWindow($schedule_reminder, $num_days_reminder) { + switch ($schedule_reminder) { case 'after_invoice_date': return Carbon::parse($this->date)->addDays($num_days_reminder)->startOfDay()->eq(Carbon::now()->startOfDay()); diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index 5ea9884239c6..2e9a30fe10f5 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -48,6 +48,89 @@ class ReminderTest extends TestCase $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() { $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); } + + }