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 68b200162..c659ff58f 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 000000000..3cb594e91 --- /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 000000000..718c7e31d --- /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 d9efb8979..a72f4ccf8 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 ab2062bfb..107c8e9d5 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 55815f327..11a8e0cd9 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 d2ee90376..29591e998 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 d8c15ea43..4bb11aac9 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 c659ff58f..1ab40663c 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 e958afdc9..a3d823d20 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 718c7e31d..7b033cb6a 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 a72f4ccf8..9acb3c80d 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 11a8e0cd9..e1b511856 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 29591e998..de24f7277 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 4bb11aac9..c83ff2d30 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 1ab40663c..e7e4d76a6 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 7b033cb6a..07ba15532 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 9acb3c80d..1c920624b 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 a3d823d20..84e74b1d0 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");