diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index fc96d98594dd..dbe2d7dd58ba 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -51,6 +51,7 @@ class ProjectController extends BaseController public function create(ProjectRequest $request) { $data = [ + 'account' => auth()->user()->account, 'project' => null, 'method' => 'POST', 'url' => 'projects', @@ -67,6 +68,7 @@ class ProjectController extends BaseController $project = $request->entity(); $data = [ + 'account' => auth()->user()->account, 'project' => $project, 'method' => 'PUT', 'url' => 'projects/' . $project->public_id, diff --git a/app/Http/Controllers/TwoFactorController.php b/app/Http/Controllers/TwoFactorController.php index e4204014b052..e6a5c0473276 100644 --- a/app/Http/Controllers/TwoFactorController.php +++ b/app/Http/Controllers/TwoFactorController.php @@ -11,7 +11,7 @@ class TwoFactorController extends Controller { $user = auth()->user(); - if ($user->google_2fa_secret || ! $user->phone) { + if ($user->google_2fa_secret || ! $user->phone || ! $user->confirmed) { return redirect('/settings/user_details'); } @@ -39,7 +39,7 @@ class TwoFactorController extends Controller $user = auth()->user(); $secret = session()->pull('2fa:secret'); - if ($secret && ! $user->google_2fa_secret && $user->phone) { + if ($secret && ! $user->google_2fa_secret && $user->phone && $user->confirmed) { $user->google_2fa_secret = Crypt::encrypt($secret); $user->save(); diff --git a/app/Libraries/Utils.php b/app/Libraries/Utils.php index 58e1eb1333c6..b0468d9f836d 100644 --- a/app/Libraries/Utils.php +++ b/app/Libraries/Utils.php @@ -89,6 +89,11 @@ class Utils return env('NINJA_DEV') == 'true'; } + public static function isTimeTracker() + { + return array_get($_SERVER, 'HTTP_USER_AGENT') == TIME_TRACKER_USER_AGENT; + } + public static function requireHTTPS() { if (Request::root() === 'http://ninja.dev' || Request::root() === 'http://ninja.dev:8000') { diff --git a/app/Models/Activity.php b/app/Models/Activity.php index c637f467913f..43b9fff4795e 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -126,7 +126,7 @@ class Activity extends Eloquent 'user' => $isSystem ? '' . trans('texts.system') . '' : e($user->getDisplayName()), 'invoice' => $invoice ? link_to($invoice->getRoute(), $invoice->getDisplayName()) : null, 'quote' => $invoice ? link_to($invoice->getRoute(), $invoice->getDisplayName()) : null, - 'contact' => $contactId ? e($client->getDisplayName()) : e($user->getDisplayName()), + 'contact' => $contactId ? link_to($client->getRoute(), $client->getDisplayName()) : e($user->getDisplayName()), 'payment' => $payment ? e($payment->transaction_reference) : null, 'payment_amount' => $payment ? $account->formatMoney($payment->amount, $payment) : null, 'adjustment' => $this->adjustment ? $account->formatMoney($this->adjustment, $this) : null, diff --git a/app/Ninja/Datatables/ActivityDatatable.php b/app/Ninja/Datatables/ActivityDatatable.php index 8b3887659321..6fa614dab252 100644 --- a/app/Ninja/Datatables/ActivityDatatable.php +++ b/app/Ninja/Datatables/ActivityDatatable.php @@ -15,8 +15,17 @@ class ActivityDatatable extends EntityDatatable 'activities.id', function ($model) { $str = Utils::timestampToDateTimeString(strtotime($model->created_at)); + $activityTypes = [ + ACTIVITY_TYPE_VIEW_INVOICE, + ACTIVITY_TYPE_VIEW_QUOTE, + ACTIVITY_TYPE_CREATE_PAYMENT, + ACTIVITY_TYPE_APPROVE_QUOTE, + ]; - if ($model->contact_id && ! in_array($model->ip, ['127.0.0.1', '192.168.255.33'])) { + if ($model->contact_id + && ! $model->is_system + && in_array($model->activity_type_id, $activityTypes) + && ! in_array($model->ip, ['127.0.0.1', '192.168.255.33'])) { $ipLookUpLink = IP_LOOKUP_URL . $model->ip; $str .= sprintf(' ', $model->ip, $ipLookUpLink); } diff --git a/app/Ninja/Presenters/AccountPresenter.php b/app/Ninja/Presenters/AccountPresenter.php index 21f662284997..b3f3e07ad2c0 100644 --- a/app/Ninja/Presenters/AccountPresenter.php +++ b/app/Ninja/Presenters/AccountPresenter.php @@ -52,6 +52,18 @@ class AccountPresenter extends Presenter return Utils::addHttp($this->entity->website); } + /** + * @return string + */ + public function taskRate() + { + if ($this->entity->task_rate) { + return Utils::roundSignificant($this->entity->task_rate); + } else { + return ''; + } + } + /** * @return mixed */ diff --git a/app/Ninja/Presenters/ClientPresenter.php b/app/Ninja/Presenters/ClientPresenter.php index 88353ac8846a..6bc87ebb46c1 100644 --- a/app/Ninja/Presenters/ClientPresenter.php +++ b/app/Ninja/Presenters/ClientPresenter.php @@ -50,4 +50,16 @@ class ClientPresenter extends EntityPresenter return sprintf('%s: %s %s', trans('texts.payment_terms'), trans('texts.payment_terms_net'), $client->defaultDaysDue()); } + + /** + * @return string + */ + public function taskRate() + { + if ($this->entity->task_rate) { + return Utils::roundSignificant($this->entity->task_rate); + } else { + return ''; + } + } } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index aae68f215384..adfc27a1a03f 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2519,6 +2519,9 @@ $LANG = array( 'add_product' => 'Add Product', 'email_will_be_sent_on' => 'Note: the email will be sent on :date.', 'invoice_product' => 'Invoice Product', + 'self_host_login' => 'Self-Host Login', + 'set_self_hoat_url' => 'Self-Host URL', + 'local_storage_required' => 'Error: local storage is not available.', ); diff --git a/resources/views/accounts/user_details.blade.php b/resources/views/accounts/user_details.blade.php index f0d31c67513d..a919d5a151a9 100644 --- a/resources/views/accounts/user_details.blade.php +++ b/resources/views/accounts/user_details.blade.php @@ -50,21 +50,22 @@ !!} @endif - @if ($user->google_2fa_secret) - {!! Former::checkbox('enable_two_factor') - ->help(trans('texts.enable_two_factor_help')) - ->text(trans('texts.enable')) - ->value(1) !!} - @elseif ($user->phone) - {!! Former::plaintext('enable_two_factor')->value( - Button::primary(trans('texts.enable'))->asLinkTo(url('settings/enable_two_factor'))->small() - )->help('enable_two_factor_help') !!} - @else - {!! Former::plaintext('enable_two_factor') - ->value('' . trans('texts.set_phone_for_two_factor') . '') !!} + @if ($user->confirmed) + @if ($user->google_2fa_secret) + {!! Former::checkbox('enable_two_factor') + ->help(trans('texts.enable_two_factor_help')) + ->text(trans('texts.enable')) + ->value(1) !!} + @elseif ($user->phone) + {!! Former::plaintext('enable_two_factor')->value( + Button::primary(trans('texts.enable'))->asLinkTo(url('settings/enable_two_factor'))->small() + )->help('enable_two_factor_help') !!} + @else + {!! Former::plaintext('enable_two_factor') + ->value('' . trans('texts.set_phone_for_two_factor') . '') !!} + @endif @endif - {!! Former::checkbox('dark_mode') ->help(trans('texts.dark_mode_help')) ->text(trans('texts.enable')) diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 15c87890b8ef..0f229e85daba 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -83,7 +83,11 @@ {!! link_to('/recover_password', trans('texts.recover_password')) !!}