From a99aa30669a5980cd6403abf98d7f2292833a0f5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 23 Jun 2021 11:57:40 +1000 Subject: [PATCH 1/4] Forward request to V5 --- .../Controllers/Migration/StepsController.php | 25 ++++++++++++ app/Http/Requests/MigrationForwardRequest.php | 30 +++++++++++++++ ...21_06_22_234707_add_forward_url_for_v5.php | 30 +++++++++++++++ resources/views/accounts/management.blade.php | 38 ++++++++++++++++++- routes/web.php | 1 + 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 app/Http/Requests/MigrationForwardRequest.php create mode 100644 database/migrations/2021_06_22_234707_add_forward_url_for_v5.php diff --git a/app/Http/Controllers/Migration/StepsController.php b/app/Http/Controllers/Migration/StepsController.php index 68b2001620fb..c659ff58f911 100644 --- a/app/Http/Controllers/Migration/StepsController.php +++ b/app/Http/Controllers/Migration/StepsController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\BaseController; use App\Http\Requests\MigrationAuthRequest; use App\Http\Requests\MigrationCompaniesRequest; use App\Http\Requests\MigrationEndpointRequest; +use App\Http\Requests\MigrationForwardRequest; use App\Http\Requests\MigrationTypeRequest; use App\Libraries\Utils; use App\Models\Account; @@ -15,6 +16,8 @@ use App\Services\Migration\CompleteService; use App\Traits\GenerateMigrationResources; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; +use Validator; +use Illuminate\Http\Request; class StepsController extends BaseController { @@ -83,6 +86,28 @@ class StepsController extends BaseController ); } + public function forwardUrl(Request $request) + { + + $rules = [ + 'url' => 'nullable|url', + ]; + + $validator = Validator::make($request->all(), $rules); + + if ($validator->fails()) { + return back() + ->withErrors($validator) + ->withInput(); + } + + $account = \Auth::user()->account; + $account->forward_url_for_v5 = rtrim($request->input('url'),'/'); + $account->save(); + + return back(); + } + public function endpoint() { if ($this->shouldGoBack('endpoint')) { diff --git a/app/Http/Requests/MigrationForwardRequest.php b/app/Http/Requests/MigrationForwardRequest.php new file mode 100644 index 000000000000..3cb594e9132f --- /dev/null +++ b/app/Http/Requests/MigrationForwardRequest.php @@ -0,0 +1,30 @@ + 'nullable|url', + ]; + } +} diff --git a/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php new file mode 100644 index 000000000000..718c7e31d067 --- /dev/null +++ b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php @@ -0,0 +1,30 @@ +text('forward_url_for_v5')->default(''); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/resources/views/accounts/management.blade.php b/resources/views/accounts/management.blade.php index d9efb89796dd..a72f4ccf8681 100644 --- a/resources/views/accounts/management.blade.php +++ b/resources/views/accounts/management.blade.php @@ -264,9 +264,45 @@ - {!! Former::close() !!} +
+
+

Forward customers to V5

+
+
+
+ {{ csrf_field() }} +
+ +
+
+ Once you are ready to forward your customers, enter your client portal URL for V5 here:
+

+
+
+
+ +
+ + @if($errors->has('url')) +
+ @foreach ($errors->get('url') as $message) + + + {{ $message }} + + @endforeach +
+ @endif +
+ +
+
+
+
+
+ @if (! Auth::user()->account->isNinjaOrLicenseAccount())
diff --git a/routes/web.php b/routes/web.php index ab2062bfb435..107c8e9d5bb4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -159,6 +159,7 @@ Route::group(['middleware' => ['lookup:user', 'auth:user']], function () { Route::get('migration/companies', 'Migration\StepsController@companies'); Route::post('migration/companies', 'Migration\StepsController@handleCompanies'); Route::get('migration/completed', 'Migration\StepsController@completed'); + Route::post('migration/forward', 'Migration\StepsController@forwardUrl'); Route::get('migration/import', 'Migration\StepsController@import'); From 7dc4ecd209b7f014d74551527f2c6fbcb8415cde Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 23 Jun 2021 12:43:29 +1000 Subject: [PATCH 2/4] Forward requests to V5 and disable V4 --- .../Commands/SendRecurringInvoices.php | 11 ++++++++-- app/Console/Commands/SendReminders.php | 8 +++---- .../Controllers/ClientPortalController.php | 11 ++++++++++ .../Controllers/Migration/StepsController.php | 22 +++++++++++++++---- app/Traits/GenerateMigrationResources.php | 2 +- ...21_06_22_234707_add_forward_url_for_v5.php | 1 + resources/views/accounts/management.blade.php | 3 ++- 7 files changed, 46 insertions(+), 12 deletions(-) diff --git a/app/Console/Commands/SendRecurringInvoices.php b/app/Console/Commands/SendRecurringInvoices.php index 55815f327710..11a8e0cd939f 100644 --- a/app/Console/Commands/SendRecurringInvoices.php +++ b/app/Console/Commands/SendRecurringInvoices.php @@ -70,7 +70,9 @@ class SendRecurringInvoices extends Command ->get(); foreach ($accounts as $account) { - $account->checkCounterReset(); + + if(!$account->is_disabled) + $account->checkCounterReset(); } } @@ -94,6 +96,11 @@ class SendRecurringInvoices extends Command $this->info(date('r') . ' Processing Invoice: '. $recurInvoice->id); $account = $recurInvoice->account; + + if($account->is_disabled){ + continue; + } + $account->loadLocalizationSettings($recurInvoice->client); Auth::loginUsingId($recurInvoice->activeUser()->id); @@ -127,7 +134,7 @@ class SendRecurringInvoices extends Command foreach ($expenses as $expense) { $shouldSendToday = $expense->shouldSendToday(); - if (! $shouldSendToday) { + if (! $shouldSendToday || $expense->account->is_disabled) { continue; } diff --git a/app/Console/Commands/SendReminders.php b/app/Console/Commands/SendReminders.php index d2ee903762b3..29591e99865b 100644 --- a/app/Console/Commands/SendReminders.php +++ b/app/Console/Commands/SendReminders.php @@ -109,7 +109,7 @@ class SendReminders extends Command /** @var Invoice $invoice */ foreach ($delayedAutoBillInvoices as $invoice) { - if ($invoice->isPaid()) { + if ($invoice->isPaid() || $invoice->account->is_deleted) { continue; } @@ -128,7 +128,7 @@ class SendReminders extends Command $this->info(date('r ') . $accounts->count() . ' accounts found with fees enabled'); foreach ($accounts as $account) { - if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS)) { + if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->is_disabled) { continue; } @@ -155,7 +155,7 @@ class SendReminders extends Command $this->info(date('r ') . count($accounts) . ' accounts found with reminders enabled'); foreach ($accounts as $account) { - if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS)) { + if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->is_disabled) { continue; } @@ -201,7 +201,7 @@ class SendReminders extends Command $account = $scheduledReport->account; $account->loadLocalizationSettings(); - if (! $account->hasFeature(FEATURE_REPORTS)) { + if (! $account->hasFeature(FEATURE_REPORTS) || $account->is_disabled) { continue; } diff --git a/app/Http/Controllers/ClientPortalController.php b/app/Http/Controllers/ClientPortalController.php index d8c15ea434a2..4bb11aac9c7a 100644 --- a/app/Http/Controllers/ClientPortalController.php +++ b/app/Http/Controllers/ClientPortalController.php @@ -67,6 +67,17 @@ class ClientPortalController extends BaseController $client = $invoice->client; $account = $invoice->account; + /* Forward requests from V4 to V5 if the domain is set */ + if(strlen($account->forward_url_for_v5) >1){ + + if ($invoice->isType(INVOICE_TYPE_QUOTE)) + $entity = 'quote'; + else + $entity = 'invoice'; + + return redirect($account->forward_url_for_v5."/client/".$entity."/".$invitationKey); + } + if (request()->silent) { session(['silent:' . $client->id => true]); return redirect(request()->url() . (request()->borderless ? '?borderless=true' : '')); diff --git a/app/Http/Controllers/Migration/StepsController.php b/app/Http/Controllers/Migration/StepsController.php index c659ff58f911..1ab40663cc7e 100644 --- a/app/Http/Controllers/Migration/StepsController.php +++ b/app/Http/Controllers/Migration/StepsController.php @@ -102,6 +102,14 @@ class StepsController extends BaseController } $account = \Auth::user()->account; + + if(strlen($request->input('url')) == 0) { + $account->is_disabled = false; + } + else { + $account->is_disabled = true; + } + $account->forward_url_for_v5 = rtrim($request->input('url'),'/'); $account->save(); @@ -201,22 +209,28 @@ class StepsController extends BaseController ); } + $completeService = (new CompleteService(session('MIGRATION_ACCOUNT_TOKEN'))); + try { $migrationData = $this->generateMigrationData($request->all()); - $completeService = (new CompleteService(session('MIGRATION_ACCOUNT_TOKEN'))) - ->data($migrationData) + + $completeService->data($migrationData) ->endpoint(session('MIGRATION_ENDPOINT')) ->start(); } - finally { + catch(\Exception $e){ + info($e->getMessage()); + return view('migration.completed', ['customMessage' => $e->getMessage()]); + } + if ($completeService->isSuccessful()) { return view('migration.completed'); } return view('migration.completed', ['customMessage' => $completeService->getErrors()[0]]); - } + } public function completed() diff --git a/app/Traits/GenerateMigrationResources.php b/app/Traits/GenerateMigrationResources.php index e958afdc904b..a3d823d20222 100644 --- a/app/Traits/GenerateMigrationResources.php +++ b/app/Traits/GenerateMigrationResources.php @@ -171,7 +171,7 @@ info("get company"); 'all_pages_footer' => $this->account->all_pages_footer ? (bool) $this->account->all_pages_footer : true, 'all_pages_header' => $this->account->all_pages_header ? (bool) $this->account->all_pages_header : true, 'show_currency_code' => $this->account->show_currency_code ? (bool) $this->account->show_currency_code : false, - 'enable_client_portal_password' => $this->account->enable_portal_password ? (bool) $this->account->enable_portal_password : true, + 'enable_client_portal_password' => $this->account->enable_portal_password ? (bool) $this->account->enable_portal_password : false, 'send_portal_password' => $this->account->send_portal_password ? (bool) $this->account->send_portal_password : false, 'recurring_number_prefix' => $this->account->recurring_invoice_number_prefix ? $this->account->recurring_invoice_number_prefix : 'R', 'enable_client_portal' => $this->account->enable_client_portal ? (bool) $this->account->enable_client_portal : false, diff --git a/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php index 718c7e31d067..7b033cb6ad94 100644 --- a/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php +++ b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php @@ -15,6 +15,7 @@ class AddForwardUrlForV5 extends Migration { Schema::table('accounts', function ($table) { $table->text('forward_url_for_v5')->default(''); + $table->boolean('is_disabled')->default(false); }); } diff --git a/resources/views/accounts/management.blade.php b/resources/views/accounts/management.blade.php index a72f4ccf8681..9acb3c80d7f1 100644 --- a/resources/views/accounts/management.blade.php +++ b/resources/views/accounts/management.blade.php @@ -277,7 +277,8 @@
- Once you are ready to forward your customers, enter your client portal URL for V5 here:
+ Once you are ready to forward your customers, enter your client portal URL for V5 here:

+ Please note once enabled. Your V4 account will become disabled. This means that your recurring invoices and any reminders will no longer fire from V4.

To renable your V4 installation simply set the forwarding url to a blank/empty value.

From 48cfe8cc6be8f2555f8bf5079e247f40d8270306 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 23 Jun 2021 14:46:13 +1000 Subject: [PATCH 3/4] Move new properties to account_email_settings --- app/Console/Commands/SendRecurringInvoices.php | 6 +++--- app/Console/Commands/SendReminders.php | 6 +++--- app/Http/Controllers/ClientPortalController.php | 4 ++-- app/Http/Controllers/Migration/StepsController.php | 10 +++++----- .../2021_06_22_234707_add_forward_url_for_v5.php | 2 +- resources/views/accounts/management.blade.php | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/Console/Commands/SendRecurringInvoices.php b/app/Console/Commands/SendRecurringInvoices.php index 11a8e0cd939f..e1b511856cc4 100644 --- a/app/Console/Commands/SendRecurringInvoices.php +++ b/app/Console/Commands/SendRecurringInvoices.php @@ -71,7 +71,7 @@ class SendRecurringInvoices extends Command foreach ($accounts as $account) { - if(!$account->is_disabled) + if(!$account->account_email_settings->is_disabled) $account->checkCounterReset(); } } @@ -97,7 +97,7 @@ class SendRecurringInvoices extends Command $account = $recurInvoice->account; - if($account->is_disabled){ + if($account->account_email_settings->is_disabled){ continue; } @@ -134,7 +134,7 @@ class SendRecurringInvoices extends Command foreach ($expenses as $expense) { $shouldSendToday = $expense->shouldSendToday(); - if (! $shouldSendToday || $expense->account->is_disabled) { + if (! $shouldSendToday || $expense->account->account_email_settings->is_disabled) { continue; } diff --git a/app/Console/Commands/SendReminders.php b/app/Console/Commands/SendReminders.php index 29591e99865b..de24f7277328 100644 --- a/app/Console/Commands/SendReminders.php +++ b/app/Console/Commands/SendReminders.php @@ -128,7 +128,7 @@ class SendReminders extends Command $this->info(date('r ') . $accounts->count() . ' accounts found with fees enabled'); foreach ($accounts as $account) { - if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->is_disabled) { + if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->account_email_settings->is_disabled) { continue; } @@ -155,7 +155,7 @@ class SendReminders extends Command $this->info(date('r ') . count($accounts) . ' accounts found with reminders enabled'); foreach ($accounts as $account) { - if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->is_disabled) { + if (! $account->hasFeature(FEATURE_EMAIL_TEMPLATES_REMINDERS) || $account->account_email_settings->is_disabled) { continue; } @@ -201,7 +201,7 @@ class SendReminders extends Command $account = $scheduledReport->account; $account->loadLocalizationSettings(); - if (! $account->hasFeature(FEATURE_REPORTS) || $account->is_disabled) { + if (! $account->hasFeature(FEATURE_REPORTS) || $account->account_email_settings->is_disabled) { continue; } diff --git a/app/Http/Controllers/ClientPortalController.php b/app/Http/Controllers/ClientPortalController.php index 4bb11aac9c7a..c83ff2d30bed 100644 --- a/app/Http/Controllers/ClientPortalController.php +++ b/app/Http/Controllers/ClientPortalController.php @@ -68,14 +68,14 @@ class ClientPortalController extends BaseController $account = $invoice->account; /* Forward requests from V4 to V5 if the domain is set */ - if(strlen($account->forward_url_for_v5) >1){ + if(strlen($account->account_email_settings->forward_url_for_v5) >1){ if ($invoice->isType(INVOICE_TYPE_QUOTE)) $entity = 'quote'; else $entity = 'invoice'; - return redirect($account->forward_url_for_v5."/client/".$entity."/".$invitationKey); + return redirect($account->account_email_settings->forward_url_for_v5."/client/".$entity."/".$invitationKey); } if (request()->silent) { diff --git a/app/Http/Controllers/Migration/StepsController.php b/app/Http/Controllers/Migration/StepsController.php index 1ab40663cc7e..e7e4d76a6822 100644 --- a/app/Http/Controllers/Migration/StepsController.php +++ b/app/Http/Controllers/Migration/StepsController.php @@ -101,17 +101,17 @@ class StepsController extends BaseController ->withInput(); } - $account = \Auth::user()->account; + $account_settings = \Auth::user()->account->account_email_settings; if(strlen($request->input('url')) == 0) { - $account->is_disabled = false; + $account_settings->is_disabled = false; } else { - $account->is_disabled = true; + $account_settings->is_disabled = true; } - $account->forward_url_for_v5 = rtrim($request->input('url'),'/'); - $account->save(); + $account_settings->forward_url_for_v5 = rtrim($request->input('url'),'/'); + $account_settings->save(); return back(); } diff --git a/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php index 7b033cb6ad94..07ba15532940 100644 --- a/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php +++ b/database/migrations/2021_06_22_234707_add_forward_url_for_v5.php @@ -13,7 +13,7 @@ class AddForwardUrlForV5 extends Migration */ public function up() { - Schema::table('accounts', function ($table) { + Schema::table('account_email_settings', function ($table) { $table->text('forward_url_for_v5')->default(''); $table->boolean('is_disabled')->default(false); }); diff --git a/resources/views/accounts/management.blade.php b/resources/views/accounts/management.blade.php index 9acb3c80d7f1..1c920624b7f6 100644 --- a/resources/views/accounts/management.blade.php +++ b/resources/views/accounts/management.blade.php @@ -285,7 +285,7 @@
- + @if($errors->has('url'))
@foreach ($errors->get('url') as $message) From 03d49928756961a7a937e9f7043335c56916f286 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 23 Jun 2021 22:53:46 +1000 Subject: [PATCH 4/4] Fixes for migrations --- app/Traits/GenerateMigrationResources.php | 44 +++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/app/Traits/GenerateMigrationResources.php b/app/Traits/GenerateMigrationResources.php index a3d823d20222..84e74b1d0115 100644 --- a/app/Traits/GenerateMigrationResources.php +++ b/app/Traits/GenerateMigrationResources.php @@ -211,9 +211,53 @@ info("get company"); 'auto_archive_quote' => $this->account->auto_archive_quote ? (bool) $this->account->auto_archive_quote : false, 'auto_email_invoice' => $this->account->auto_email_invoice ? (bool) $this->account->auto_email_invoice : false, 'counter_padding' => $this->account->invoice_number_padding ?: 4, + 'reply_to_email' => $this->account->account_email_settings->reply_to_email ?: '', + 'bcc_email' => $this->account->account_email_settings->bcc_email ?: '', + 'email_subject_invoice' => $this->account->account_email_settings->email_subject_invoice ?: '', + 'email_subject_quote' => $this->account->account_email_settings->email_subject_quote ?: '', + 'email_subject_payment' => $this->account->account_email_settings->email_subject_payment ?: '', + 'email_template_invoice' => $this->account->account_email_settings->email_template_invoice ?: '', + 'email_template_quote' => $this->account->account_email_settings->email_template_quote ?: '', + 'email_template_payment' => $this->account->account_email_settings->email_template_payment ?: '', + 'email_subject_reminder1' => $this->account->account_email_settings->email_subject_reminder1 ?: '', + 'email_subject_reminder2' => $this->account->account_email_settings->email_subject_reminder2 ?: '', + 'email_subject_reminder3' => $this->account->account_email_settings->email_subject_reminder3 ?: '', + 'email_subject_reminder_endless' => $this->account->account_email_settings->email_subject_reminder4 ?: '', + 'email_template_reminder1' => $this->account->account_email_settings->email_template_reminder1 ?: '', + 'email_template_reminder2' => $this->account->account_email_settings->email_template_reminder2 ?: '', + 'email_template_reminder3' => $this->account->account_email_settings->email_template_reminder3 ?: '', + 'email_template_reminder_endless' => $this->account->account_email_settings->email_template_reminder4 ?: '', + 'late_fee_amount1' => $this->account->account_email_settings->late_fee1_amount ?: 0, + 'late_fee_amount2' => $this->account->account_email_settings->late_fee2_amount ?: 0, + 'late_fee_amount3' => $this->account->account_email_settings->late_fee3_amount ?: 0, + 'late_fee_percent1' => $this->account->account_email_settings->late_fee1_percent ?: 0, + 'late_fee_percent2' => $this->account->account_email_settings->late_fee2_percent ?: 0, + 'late_fee_percent3' => $this->account->account_email_settings->late_fee3_percent ?: 0, + 'enable_reminder1' => $this->account->enable_reminder1 ? true : false, + 'enable_reminder2' => $this->account->enable_reminder2 ? true : false, + 'enable_reminder3' => $this->account->enable_reminder3 ? true : false, + 'enable_reminder_endless' => $this->account->enable_reminder4 ? true : false, + 'num_days_reminder1' => $this->account->num_days_reminder1 ?: 0, + 'num_days_reminder2' => $this->account->num_days_reminder2 ?: 0, + 'num_days_reminder3' => $this->account->num_days_reminder3 ?: 0, + 'schedule_reminder1' => $this->buildReminderString($this->account->direction_reminder1, $this->account->field_reminder1), + 'schedule_reminder2' => $this->buildReminderString($this->account->direction_reminder2, $this->account->field_reminder2), + 'schedule_reminder3' => $this->buildReminderString($this->account->direction_reminder3, $this->account->field_reminder3), + 'endless_reminder_frequency_id' => $this->account->account_email_settings->reset_counter_frequency_id ? $this->transformFrequencyId($this->account->account_email_settings->reset_counter_frequency_id) : 0, + 'email_signature' => $this->account->email_footer ?: '', ]; } + private function buildReminderString($direction, $field) + { + + $direction_string = $direction == 1 ? "after_" : "before_"; + $field_string = $field == 1 ? "due_date" : "invoice_date"; + + return $direction_string.$field_string; + + } + public function getTaxRates() { info("get tax rates");