diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 311da19e490c..7feddb565bb5 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -704,9 +704,27 @@ class AccountController extends BaseController return AccountController::saveTaxRates(); } elseif ($section === ACCOUNT_PAYMENT_TERMS) { return AccountController::savePaymetTerms(); + } elseif ($section === ACCOUNT_MANAGEMENT) { + return AccountController::saveAccountManagement(); } } + /** + * @return \Illuminate\Http\RedirectResponse + */ + private function saveAccountManagement() + { + $account = Auth::user()->account; + $modules = Input::get('modules'); + + $account->enabled_modules = $modules ? array_sum($modules) : 0; + $account->save(); + + Session::flash('message', trans('texts.updated_settings')); + + return Redirect::to('settings/'.ACCOUNT_MANAGEMENT); + } + /** * @return \Illuminate\Http\RedirectResponse */ diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index c4d69f219c0f..e7bcd6e82e91 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -95,7 +95,7 @@ class ClientController extends BaseController if($user->can('create', ENTITY_TASK)){ $actionLinks[] = ['label' => trans('texts.new_task'), 'url' => URL::to('/tasks/create/'.$client->public_id)]; } - if (Utils::hasFeature(FEATURE_QUOTES) && $user->can('create', ENTITY_INVOICE)) { + if (Utils::hasFeature(FEATURE_QUOTES) && $user->can('create', ENTITY_QUOTE)) { $actionLinks[] = ['label' => trans('texts.new_quote'), 'url' => URL::to('/quotes/create/'.$client->public_id)]; } diff --git a/app/Models/Account.php b/app/Models/Account.php index dbe7e447f7e6..4db6511136bc 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -103,18 +103,18 @@ class Account extends Eloquent ]; public static $modules = [ - 1 => ENTITY_RECURRING_INVOICE, - 2 => ENTITY_CREDIT, - 4 => ENTITY_QUOTE, - 8 => ENTITY_TASK, - 16 => ENTITY_EXPENSE, - 32 => ENTITY_VENDOR, + ENTITY_RECURRING_INVOICE => 1, + ENTITY_CREDIT => 2, + ENTITY_QUOTE => 4, + ENTITY_TASK => 8, + ENTITY_EXPENSE => 16, + ENTITY_VENDOR => 32, ]; public static $dashboardSections = [ - 1 => 'total_revenue', - 2 => 'average_invoice', - 4 => 'outstanding', + 'total_revenue' => 1, + 'average_invoice' => 2, + 'outstanding' => 4, ]; /** @@ -1846,6 +1846,20 @@ class Account extends Eloquent public function getFontFolders(){ return array_map(function($item){return $item['folder'];}, $this->getFontsData()); } + + public function isModuleEnabled($entityType) + { + if (in_array($entityType, [ + ENTITY_CLIENT, + ENTITY_INVOICE, + ENTITY_PRODUCT, + ENTITY_PAYMENT, + ])) { + return true; + } + + return $this->enabled_modules & static::$modules[$entityType]; + } } Account::updated(function ($account) diff --git a/app/Ninja/Datatables/ClientDatatable.php b/app/Ninja/Datatables/ClientDatatable.php index 4b0ca68b0544..400e51f08ce7 100644 --- a/app/Ninja/Datatables/ClientDatatable.php +++ b/app/Ninja/Datatables/ClientDatatable.php @@ -93,7 +93,7 @@ class ClientDatatable extends EntityDatatable return URL::to("quotes/create/{$model->public_id}"); }, function ($model) { - return Auth::user()->hasFeature(FEATURE_QUOTES) && Auth::user()->can('create', ENTITY_INVOICE); + return Auth::user()->hasFeature(FEATURE_QUOTES) && Auth::user()->can('create', ENTITY_QUOTE); } ], [ diff --git a/app/Ninja/Transformers/ContactTransformer.php b/app/Ninja/Transformers/ContactTransformer.php index fa0126011690..279658979ef3 100644 --- a/app/Ninja/Transformers/ContactTransformer.php +++ b/app/Ninja/Transformers/ContactTransformer.php @@ -26,4 +26,4 @@ class ContactTransformer extends EntityTransformer 'send_invoice' => (bool) $contact->send_invoice, ]); } -} \ No newline at end of file +} diff --git a/app/Policies/EntityPolicy.php b/app/Policies/EntityPolicy.php index 04951f35e27a..9a5216ec87c8 100644 --- a/app/Policies/EntityPolicy.php +++ b/app/Policies/EntityPolicy.php @@ -16,7 +16,11 @@ class EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { + public static function create(User $user, $item) { + if ( ! static::checkModuleEnabled($user, $item)) { + return false; + } + return $user->hasPermission('create_all'); } @@ -27,6 +31,10 @@ class EntityPolicy * @return bool */ public static function edit(User $user, $item) { + if ( ! static::checkModuleEnabled($user, $item)) { + return false; + } + return $user->hasPermission('edit_all') || $user->owns($item); } @@ -37,6 +45,10 @@ class EntityPolicy * @return bool */ public static function view(User $user, $item) { + if ( ! static::checkModuleEnabled($user, $item)) { + return false; + } + return $user->hasPermission('view_all') || $user->owns($item); } @@ -57,4 +69,10 @@ class EntityPolicy public static function editByOwner(User $user, $ownerUserId) { return $user->hasPermission('edit_all') || $user->id == $ownerUserId; } + + private static function checkModuleEnabled(User $user, $item) + { + $entityType = is_string($item) ? $item : $item->getEntityType(); + return $user->account->isModuleEnabled($entityType); + } } diff --git a/app/Policies/ExpensePolicy.php b/app/Policies/ExpensePolicy.php index d281d2f407c2..92a22ac5807f 100644 --- a/app/Policies/ExpensePolicy.php +++ b/app/Policies/ExpensePolicy.php @@ -10,8 +10,8 @@ class ExpensePolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { - if ( ! parent::create($user)) { + public static function create(User $user, $item) { + if ( ! parent::create($user, $item)) { return false; } diff --git a/app/Policies/GenericEntityPolicy.php b/app/Policies/GenericEntityPolicy.php index 264867a262d5..fc18c7c550c9 100644 --- a/app/Policies/GenericEntityPolicy.php +++ b/app/Policies/GenericEntityPolicy.php @@ -25,7 +25,7 @@ class GenericEntityPolicy if (method_exists("App\\Policies\\{$itemType}Policy", 'editByOwner')) { return call_user_func(["App\\Policies\\{$itemType}Policy", 'editByOwner'], $user, $ownerUserId); } - + return false; } @@ -40,7 +40,7 @@ class GenericEntityPolicy if (method_exists("App\\Policies\\{$itemType}Policy", 'viewByOwner')) { return call_user_func(["App\\Policies\\{$itemType}Policy", 'viewByOwner'], $user, $ownerUserId); } - + return false; } @@ -50,11 +50,26 @@ class GenericEntityPolicy * @return bool|mixed */ public static function create(User $user, $itemType) { - $itemType = Utils::getEntityName($itemType); - if (method_exists("App\\Policies\\{$itemType}Policy", 'create')) { - return call_user_func(["App\\Policies\\{$itemType}Policy", 'create'], $user); + $entityName = Utils::getEntityName($itemType); + if (method_exists("App\\Policies\\{$entityName}Policy", 'create')) { + return call_user_func(["App\\Policies\\{$entityName}Policy", 'create'], $user, $itemType); } - + return false; } -} \ No newline at end of file + + /** + * @param User $user + * @param $itemType + * @return bool|mixed + */ + public static function view(User $user, $itemType) { + $entityName = Utils::getEntityName($itemType); + if (method_exists("App\\Policies\\{$entityName}Policy", 'view')) { + return call_user_func(["App\\Policies\\{$entityName}Policy", 'view'], $user, $itemType); + } + + return false; + } + +} diff --git a/app/Policies/QuotePolicy.php b/app/Policies/QuotePolicy.php index 8d5f60ea7fbc..6d1920d16c95 100644 --- a/app/Policies/QuotePolicy.php +++ b/app/Policies/QuotePolicy.php @@ -10,8 +10,8 @@ class QuotePolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { - if ( ! parent::create($user)) { + public static function create(User $user, $item) { + if ( ! parent::create($user, $item)) { return false; } diff --git a/app/Policies/TaskPolicy.php b/app/Policies/TaskPolicy.php index 6e7391e031dc..aa0a2ef76239 100644 --- a/app/Policies/TaskPolicy.php +++ b/app/Policies/TaskPolicy.php @@ -10,8 +10,8 @@ class TaskPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { - if ( ! parent::create($user)) { + public static function create(User $user, $item) { + if ( ! parent::create($user, $item)) { return false; } diff --git a/app/Policies/VendorPolicy.php b/app/Policies/VendorPolicy.php index 8c388193251d..f806ae826048 100644 --- a/app/Policies/VendorPolicy.php +++ b/app/Policies/VendorPolicy.php @@ -10,12 +10,12 @@ class VendorPolicy extends EntityPolicy * @param User $user * @return bool */ - public static function create(User $user) { - if ( ! parent::create($user)) { + public static function create(User $user, $item) { + if ( ! parent::create($user, $item)) { return false; } return $user->hasFeature(FEATURE_EXPENSES); } - + } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index eb1bbaa389e6..8e80b75c12d8 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2173,6 +2173,7 @@ $LANG = array( 'white_label_license_key' => 'License Key', 'invalid_white_label_license' => 'The white label license is not valid', 'created_by' => 'Created by :name', + 'modules' => 'Modules', ); diff --git a/resources/views/accounts/management.blade.php b/resources/views/accounts/management.blade.php index 8d1a14482fcb..bf6d123fc7ae 100644 --- a/resources/views/accounts/management.blade.php +++ b/resources/views/accounts/management.blade.php @@ -140,6 +140,35 @@ @endif {!! Former::close() !!} + + {!! Former::open('settings/account_management') !!} +