From 01404a75f612a1e1b38d967f0103bc2370628558 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 24 Mar 2023 14:03:58 +1100 Subject: [PATCH 1/7] dynamically load broadcaster --- app/Providers/AppServiceProvider.php | 7 +++++++ config/app.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ed8b2a643c0c..041b2d2c8d1b 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -121,4 +121,11 @@ class AppServiceProvider extends ServiceProvider Artisan::call('db:seed'); }); } + + public function register(): void + { + + $this->app->register(\App\Providers\BroadcastServiceProvider::class); + + } } diff --git a/config/app.php b/config/app.php index 16c82b06b607..225f88c32d82 100644 --- a/config/app.php +++ b/config/app.php @@ -194,7 +194,7 @@ return [ */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, - App\Providers\BroadcastServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, App\Providers\ComposerServiceProvider::class, From 3daa49a6188408139eb93e61722f45511c63c54a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 24 Mar 2023 14:04:46 +1100 Subject: [PATCH 2/7] Dynamically load broadcastprovider --- app/Providers/AppServiceProvider.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index b44c4447e2bd..d0f17d0a170c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -123,8 +123,8 @@ class AppServiceProvider extends ServiceProvider public function register(): void { - - $this->app->register(\App\Providers\BroadcastServiceProvider::class); - + if (Ninja::isHosted()) { + $this->app->register(\App\Providers\BroadcastServiceProvider::class); + } } } From 0472cb97f8d025eb15fe6c70599bea1cfa73fd3d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 25 Mar 2023 11:51:06 +1100 Subject: [PATCH 3/7] Fixes for recurring price increases/updates --- app/Jobs/RecurringInvoice/UpdateRecurring.php | 2 ++ app/Services/Recurring/UpdatePrice.php | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Jobs/RecurringInvoice/UpdateRecurring.php b/app/Jobs/RecurringInvoice/UpdateRecurring.php index 5c124922b059..ee0527bcab83 100644 --- a/app/Jobs/RecurringInvoice/UpdateRecurring.php +++ b/app/Jobs/RecurringInvoice/UpdateRecurring.php @@ -40,6 +40,8 @@ class UpdateRecurring implements ShouldQueue { MultiDB::setDb($this->company->db); + $this->user->setCompany($this->company); + RecurringInvoice::where('company_id', $this->company->id) ->whereIn('id', $this->ids) ->chunk(100, function ($recurring_invoices) { diff --git a/app/Services/Recurring/UpdatePrice.php b/app/Services/Recurring/UpdatePrice.php index 1666f1c4a4f1..92600b9ec7a7 100644 --- a/app/Services/Recurring/UpdatePrice.php +++ b/app/Services/Recurring/UpdatePrice.php @@ -26,17 +26,19 @@ class UpdatePrice extends AbstractService $line_items = $this->recurring_invoice->line_items; foreach ($line_items as $key => $line_item) { + $product = Product::where('company_id', $this->recurring_invoice->company_id) ->where('product_key', $line_item->product_key) ->where('is_deleted', 0) ->first(); if ($product) { - $line_items[$key]->cost = $product->cost; + $line_items[$key]->cost = floatval($product->cost); } } $this->recurring_invoice->line_items = $line_items; + $this->recurring_invoice->calc()->getInvoice()->save(); } } From fb4a4ac126cbbf0bc79e6afe7cabf111658ed230 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 28 Mar 2023 07:36:22 +1100 Subject: [PATCH 4/7] Update payment notifications --- app/Listeners/Payment/PaymentNotification.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/Listeners/Payment/PaymentNotification.php b/app/Listeners/Payment/PaymentNotification.php index 5f581f88b3f8..b1b7c82eef12 100644 --- a/app/Listeners/Payment/PaymentNotification.php +++ b/app/Listeners/Payment/PaymentNotification.php @@ -39,7 +39,6 @@ class PaymentNotification implements ShouldQueue * Handle the event. * * @param object $event - * @return bool */ public function handle($event) { @@ -51,6 +50,15 @@ class PaymentNotification implements ShouldQueue $payment = $event->payment; + + /*Google Analytics Track Revenue*/ + if (isset($payment->company->google_analytics_key)) { + $this->trackRevenue($event); + } + + if($payment->is_manual) + return; + /*User notifications*/ foreach ($payment->company->company_users as $company_user) { $user = $company_user->user; @@ -80,10 +88,6 @@ class PaymentNotification implements ShouldQueue } } - /*Google Analytics Track Revenue*/ - if (isset($payment->company->google_analytics_key)) { - $this->trackRevenue($event); - } } private function trackRevenue($event) From e85b0c59646aae0f0140d3608a7f38e35bb28f27 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 28 Mar 2023 17:39:28 +1100 Subject: [PATCH 5/7] Updates for languages --- lang/en/texts.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lang/en/texts.php b/lang/en/texts.php index 4d43dc320f55..8772eef6db6f 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5015,6 +5015,22 @@ $LANG = array( 'restored_payment_link' => 'Successfully restored payment link', 'search_payment_link' => 'Search 1 Payment Link', 'search_payment_links' => 'Search :count Payment Links', + 'increase_prices' => 'Increase Prices', + 'update_prices' => 'Update Prices', + 'incresed_prices' => 'Successfully queued prices to be increased', + 'updated_prices' => 'Successfully queued prices to be updated', + 'api_token' => 'API Token', + 'api_key' => 'API Key', + 'endpoint' => 'Endpoint', + 'not_billable' => 'Not Billable', + 'allow_billable_task_items' => 'Allow Billable Task Items', + 'allow_billable_task_items_help' => 'Enable configuring which task items are billed', + 'show_task_item_description' => 'Show Task Item Description', + 'show_task_item_description_help' => 'Enable specifying task item descriptions', + 'email_record' => 'Email Record', + 'invoice_product_columns' => 'Invoice Product Columns', + 'quote_product_columns' => 'Quote Product Columns', + 'vendors' => 'Vendors', ); From f5cdf07d781c135e5e0b26b6bcd3ed129f594cba Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 29 Mar 2023 17:53:49 +1100 Subject: [PATCH 6/7] Tests for calculating recurring next send dates --- app/Models/RecurringInvoice.php | 2 + tests/Feature/RecurringInvoiceTest.php | 3 + tests/Unit/RecurringDatesTest.php | 355 ++++++++++++++++++++++++- 3 files changed, 355 insertions(+), 5 deletions(-) diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 83eed4296d32..bb5092d61006 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -418,6 +418,8 @@ class RecurringInvoice extends BaseModel $offset = $this->client->timezone_offset(); + nlog("offset = {$offset}"); + /* If this setting is enabled, the recurring invoice may be set in the past */ if ($this->company->stop_on_unpaid_recurring) { diff --git a/tests/Feature/RecurringInvoiceTest.php b/tests/Feature/RecurringInvoiceTest.php index 1bad12fdb739..9b44fb8eef14 100644 --- a/tests/Feature/RecurringInvoiceTest.php +++ b/tests/Feature/RecurringInvoiceTest.php @@ -56,6 +56,8 @@ class RecurringInvoiceTest extends TestCase $this->makeTestData(); } + + public function testBulkIncreasePriceWithJob() { @@ -561,4 +563,5 @@ class RecurringInvoiceTest extends TestCase $this->assertEquals(null, $invoice->subscription_id); } + } diff --git a/tests/Unit/RecurringDatesTest.php b/tests/Unit/RecurringDatesTest.php index c996694f58a4..47e734757f2d 100644 --- a/tests/Unit/RecurringDatesTest.php +++ b/tests/Unit/RecurringDatesTest.php @@ -11,12 +11,21 @@ namespace Tests\Unit; -use App\Factory\RecurringInvoiceFactory; -use App\Models\RecurringInvoice; -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Illuminate\Support\Carbon; -use Tests\MockAccountData; use Tests\TestCase; +use App\Models\User; +use App\Models\Client; +use App\Models\Account; +use App\Models\Company; +use Tests\MockAccountData; +use App\Models\ClientContact; +use Illuminate\Support\Carbon; +use App\Utils\Traits\MakesHash; +use App\Models\RecurringInvoice; +use App\DataMapper\CompanySettings; +use App\DataMapper\DefaultSettings; +use App\Factory\RecurringInvoiceFactory; +use App\Factory\InvoiceToRecurringInvoiceFactory; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -24,6 +33,7 @@ use Tests\TestCase; */ class RecurringDatesTest extends TestCase { + use MakesHash; use MockAccountData; use DatabaseTransactions; @@ -34,6 +44,341 @@ class RecurringDatesTest extends TestCase $this->makeTestData(); } + + public function testDailyFrequencyCalc4() + { + + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '6'; + $settings->timezone_id = '1'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals('6', $client->getSetting('entity_send_time')); + $this->assertEquals('1', $client->getSetting('timezone_id')); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + } + + public function testDailyFrequencyCalc3() + { + + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '1'; + $settings->timezone_id = '1'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + $this->assertEquals('1', $client->getSetting('entity_send_time')); + $this->assertEquals('1', $client->getSetting('timezone_id')); + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + + } + + public function testDailyFrequencyCalc2() + { + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '23'; + $settings->timezone_id = '113'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + $this->assertEquals('23', $client->getSetting('entity_send_time')); + $this->assertEquals('113', $client->getSetting('timezone_id')); + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + } + + public function testDailyFrequencyCalc() + { + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '1'; + $settings->timezone_id = '113'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + $this->assertEquals('1', $client->getSetting('entity_send_time')); + $this->assertEquals('113', $client->getSetting('timezone_id')); + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + nlog($recurring_invoice->next_send_date); + nlog($recurring_invoice->next_send_date_client); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + + + } + public function testRecurringDatesDraftInvoice() { $recurring_invoice = RecurringInvoiceFactory::create($this->company->id, $this->user->id); From ebdf25e1a84acfbed9f63a1e3b59c41c8f647f9c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 29 Mar 2023 18:14:28 +1100 Subject: [PATCH 7/7] Use travel to move timezones --- app/Models/RecurringInvoice.php | 2 - tests/Unit/RecurringDatesTest.php | 183 +++++++++++++++++++++++++++++- 2 files changed, 180 insertions(+), 5 deletions(-) diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index bb5092d61006..83eed4296d32 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -418,8 +418,6 @@ class RecurringInvoice extends BaseModel $offset = $this->client->timezone_offset(); - nlog("offset = {$offset}"); - /* If this setting is enabled, the recurring invoice may be set in the past */ if ($this->company->stop_on_unpaid_recurring) { diff --git a/tests/Unit/RecurringDatesTest.php b/tests/Unit/RecurringDatesTest.php index 47e734757f2d..e4c89c4b0415 100644 --- a/tests/Unit/RecurringDatesTest.php +++ b/tests/Unit/RecurringDatesTest.php @@ -45,6 +45,186 @@ class RecurringDatesTest extends TestCase } + public function testDailyFrequencyCalc6() + { + $this->travelTo(now()->subHours(8)); + + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '1'; + $settings->timezone_id = '113'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals('1', $client->getSetting('entity_send_time')); + $this->assertEquals('113', $client->getSetting('timezone_id')); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDays(2)->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDays(2)->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $this->travelBack(); + + } + + + + + public function testDailyFrequencyCalc5() + { + + $account = Account::factory()->create(); + + $settings = CompanySettings::defaults(); + $settings->entity_send_time = '23'; + $settings->timezone_id = '113'; + + $company = Company::factory()->create([ + 'account_id' => $account->id, + 'settings' => $settings, + ]); + + $account->default_company_id = $company->id; + $account->save(); + + $user = User::factory()->create([ + 'account_id' => $account->id, + 'confirmation_code' => $this->createDbHash(config('database.default')), + 'email' => 'whiz@gmail.com', + ]); + + $userPermissions = collect([ + 'view_invoice', + 'view_client', + 'edit_client', + 'edit_invoice', + 'create_invoice', + 'create_client', + ]); + + $userSettings = DefaultSettings::userSettings(); + + $user->companies()->attach($company->id, [ + 'account_id' => $account->id, + 'is_owner' => 1, + 'is_admin' => 1, + 'notifications' => CompanySettings::notificationDefaults(), + 'permissions' => $userPermissions->toJson(), + 'settings' => json_encode($userSettings), + 'is_locked' => 0, + ]); + + $client = Client::factory()->create(['user_id' => $user->id, 'company_id' => $company->id]); + + ClientContact::factory()->create([ + 'user_id' => $user->id, + 'client_id' => $client->id, + 'company_id' => $company->id, + 'is_primary' => 1, + ]); + + + + $recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, + 'next_send_date' => now()->format('Y-m-d'), + 'next_send_date_client' => now()->format('Y-m-d'), + 'date' => now()->format('Y-m-d'), + 'remaining_cycles' => -1, + 'status_id' => 1, + ]); + + $recurring_invoice->service()->start()->save(); + + $this->assertEquals('23', $client->getSetting('entity_send_time')); + $this->assertEquals('113', $client->getSetting('timezone_id')); + + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date)->format('Y-m-d')); + $this->assertEquals(now()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + $recurring_invoice->next_send_date = $recurring_invoice->nextSendDate(); + $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); + $recurring_invoice->save(); + + $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); + $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d')); + + } + + public function testDailyFrequencyCalc4() { @@ -369,9 +549,6 @@ class RecurringDatesTest extends TestCase $recurring_invoice->next_send_date_client = $recurring_invoice->nextSendDateClient(); $recurring_invoice->save(); - nlog($recurring_invoice->next_send_date); - nlog($recurring_invoice->next_send_date_client); - $this->assertEquals(now()->startOfDay()->addDay()->addSeconds($client->timezone_offset()), Carbon::parse($recurring_invoice->next_send_date)); $this->assertEquals(now()->addDay()->format('Y-m-d'), Carbon::parse($recurring_invoice->next_send_date_client)->format('Y-m-d'));