From 602c8e81e5c8fa81372098aa2c9ea3b03f495fe7 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 29 Jan 2017 22:07:44 +0200 Subject: [PATCH] Fix invoice link if user has multiple companies #578 --- app/Http/Controllers/AccountController.php | 7 ++-- app/Http/Controllers/Auth/AuthController.php | 3 +- app/Http/Controllers/UserController.php | 41 ++++++++------------ app/Http/routes.php | 1 + app/Models/Account.php | 5 +++ app/Ninja/Datatables/InvoiceDatatable.php | 2 - app/Ninja/Mailers/UserMailer.php | 8 +++- app/Ninja/Presenters/EntityPresenter.php | 8 +++- app/Ninja/Repositories/AccountRepository.php | 15 ++++++- 9 files changed, 55 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 83f90f0869e5..cbab239479eb 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -1354,10 +1354,11 @@ class AccountController extends BaseController }); $this->accountRepo->unlinkAccount($account); - if ($account->company->accounts->count() == 1) { - $account->company->forceDelete(); - } else { + + if ($account->hasMultipleAccounts()) { $account->forceDelete(); + } else { + $account->company->forceDelete(); } Auth::logout(); diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index c016c6ba97ee..79efb8d07928 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -172,7 +172,8 @@ class AuthController extends Controller if (Auth::check() && !Auth::user()->registered) { $account = Auth::user()->account; $this->accountRepo->unlinkAccount($account); - if ($account->company->accounts->count() == 1) { + + if ( ! $account->hasMultipleAccounts()) { $account->company->forceDelete(); } $account->forceDelete(); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 1646c539f8c8..1f8dd1c0d064 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -270,31 +270,6 @@ class UserController extends BaseController } } - /** - * Log the user out of the application. - * - */ - /* - public function logout() - { - if (Auth::check()) { - if (!Auth::user()->registered) { - $account = Auth::user()->account; - $this->accountRepo->unlinkAccount($account); - if ($account->company->accounts->count() == 1) { - $account->company->forceDelete(); - } - $account->forceDelete(); - } - } - - Auth::logout(); - Session::flush(); - - return Redirect::to('/')->with('clearGuestKey', true); - } - */ - public function changePassword() { // check the current password is correct @@ -347,6 +322,22 @@ class UserController extends BaseController } } + public function viewAccountByKey($accountKey) + { + $user = $this->accountRepo->findUser(Auth::user(), $accountKey); + + if ( ! $user) { + return redirect()->to('/'); + } + + Auth::loginUsingId($user->id); + Auth::user()->account->loadLocalizationSettings(); + + $redirectTo = request()->redirect_to ?: '/'; + + return redirect()->to($redirectTo); + } + public function unlinkAccount($userAccountId, $userId) { $this->accountRepo->unlinkUser($userAccountId, $userId); diff --git a/app/Http/routes.php b/app/Http/routes.php index e30f3fa09b7e..91692222fbb9 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -232,6 +232,7 @@ Route::group([ Route::post('users/bulk', 'UserController@bulk'); Route::get('send_confirmation/{user_id}', 'UserController@sendConfirmation'); Route::get('/switch_account/{user_id}', 'UserController@switchAccount'); + Route::get('/account/{account_key}', 'UserController@viewAccountByKey'); Route::get('/unlink_account/{user_account_id}/{user_id}', 'UserController@unlinkAccount'); Route::get('/manage_companies', 'UserController@manageCompanies'); diff --git a/app/Models/Account.php b/app/Models/Account.php index b1df65189390..9742d3cbb5e9 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -1732,6 +1732,11 @@ class Account extends Eloquent return Carbon::now($this->getTimezone())->addDays($numDays)->format('Y-m-d'); } + + public function hasMultipleAccounts() + { + return $this->company->accounts->count() > 1; + } } Account::updated(function ($account) diff --git a/app/Ninja/Datatables/InvoiceDatatable.php b/app/Ninja/Datatables/InvoiceDatatable.php index abe8cec38831..546c71152a76 100644 --- a/app/Ninja/Datatables/InvoiceDatatable.php +++ b/app/Ninja/Datatables/InvoiceDatatable.php @@ -180,12 +180,10 @@ class InvoiceDatatable extends EntityDatatable if ($this->entityType == ENTITY_INVOICE || $this->entityType == ENTITY_QUOTE) { $actions[] = \DropdownButton::DIVIDER; - /* $actions[] = [ 'label' => mtrans($this->entityType, 'email_' . $this->entityType), 'url' => 'javascript:submitForm_'.$this->entityType.'("emailInvoice")', ]; - */ $actions[] = [ 'label' => mtrans($this->entityType, 'mark_sent'), 'url' => 'javascript:submitForm_'.$this->entityType.'("markSent")', diff --git a/app/Ninja/Mailers/UserMailer.php b/app/Ninja/Mailers/UserMailer.php index 2508a7f93f74..95295813ef40 100644 --- a/app/Ninja/Mailers/UserMailer.php +++ b/app/Ninja/Mailers/UserMailer.php @@ -59,6 +59,12 @@ class UserMailer extends Mailer $account = $user->account; $client = $invoice->client; + if ($account->hasMultipleAccounts()) { + $link = url(sprintf('/account/%s?redirect_to=%s', $account->account_key, $invoice->present()->path)); + } else { + $link = $invoice->present()->url; + } + $data = [ 'entityType' => $entityType, 'clientName' => $client->getDisplayName(), @@ -66,7 +72,7 @@ class UserMailer extends Mailer 'userName' => $user->getDisplayName(), 'invoiceAmount' => $account->formatMoney($invoice->getRequestedAmount(), $client), 'invoiceNumber' => $invoice->invoice_number, - 'invoiceLink' => SITE_URL."/{$entityType}s/{$invoice->public_id}", + 'invoiceLink' => $link, 'account' => $account, ]; diff --git a/app/Ninja/Presenters/EntityPresenter.php b/app/Ninja/Presenters/EntityPresenter.php index cc069b5c5e45..9cb8b746faf1 100644 --- a/app/Ninja/Presenters/EntityPresenter.php +++ b/app/Ninja/Presenters/EntityPresenter.php @@ -10,12 +10,16 @@ class EntityPresenter extends Presenter * @return string */ public function url() + { + return url($this->path()); + } + + public function path() { $type = Utils::pluralizeEntityType($this->entity->getEntityType()); $id = $this->entity->public_id; - $link = sprintf('/%s/%s', $type, $id); - return URL::to($link); + return sprintf('/%s/%s', $type, $id); } public function editUrl() diff --git a/app/Ninja/Repositories/AccountRepository.php b/app/Ninja/Repositories/AccountRepository.php index b3816a89ae77..d9d77380ef19 100644 --- a/app/Ninja/Repositories/AccountRepository.php +++ b/app/Ninja/Repositories/AccountRepository.php @@ -505,6 +505,19 @@ class AccountRepository } } + public function findUser($user, $accountKey) + { + $users = $this->findUsers($user, 'account'); + + foreach ($users as $user) { + if ($accountKey && hash_equals($user->account->account_key, $accountKey)) { + return $user; + } + } + + return false; + } + public function findUserAccounts($userId1, $userId2 = false) { if (!Schema::hasTable('user_accounts')) { @@ -674,7 +687,7 @@ class AccountRepository $user = User::whereId($userId)->first(); - if (!$user->public_id && $user->account->company->accounts->count() > 1) { + if (!$user->public_id && $user->account->hasMultipleAccounts()) { $company = Company::create(); $company->save(); $user->account->company_id = $company->id;