diff --git a/app/Http/Controllers/Api/AccessoriesController.php b/app/Http/Controllers/Api/AccessoriesController.php index fd21ebaf3..dc2130e98 100644 --- a/app/Http/Controllers/Api/AccessoriesController.php +++ b/app/Http/Controllers/Api/AccessoriesController.php @@ -26,7 +26,10 @@ class AccessoriesController extends Controller */ public function index(Request $request) { - $this->authorize('view', Accessory::class); + if ($request->user()->cannot('reports.view')) { + $this->authorize('view', Accessory::class); + } + // This array is what determines which fields should be allowed to be sorted on ON the table itself, no relations // Relations will be handled in query scopes a little further down. diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 613158508..734125ff3 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -246,6 +246,7 @@ class UsersController extends Controller 'two_factor_optin', 'two_factor_enrolled', 'remote', + 'vip', 'start_date', 'end_date', ]; diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 8e2949860..41b2f257c 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -51,9 +51,8 @@ class ReportsController extends Controller public function getAccessoryReport() { $this->authorize('reports.view'); - $accessories = Accessory::orderBy('created_at', 'DESC')->with('company')->get(); - return view('reports/accessories', compact('accessories')); + return view('reports/accessories'); } /** diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index 0c6ab8834..83f271362 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -272,6 +272,7 @@ class UsersController extends Controller $user->activated = $request->input('activated', 0); $user->zip = $request->input('zip', null); $user->remote = $request->input('remote', 0); + $user->vip = $request->input('vip', 0); $user->website = $request->input('website', null); $user->start_date = $request->input('start_date', null); $user->end_date = $request->input('end_date', null); diff --git a/app/Models/User.php b/app/Models/User.php index 73a30b229..249178ce0 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -64,6 +64,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 'scim_externalid', 'avatar', 'gravatar', + 'vip', ]; protected $casts = [ @@ -71,6 +72,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 'manager_id' => 'integer', 'location_id' => 'integer', 'company_id' => 'integer', + 'vip' => 'boolean', ]; diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index bf4c81c80..4bfe4492f 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -85,6 +85,15 @@ class UserPresenter extends Presenter 'visible' => true, 'formatter' => 'usersLinkFormatter', ], + [ + 'field' => 'vip', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/general.vip_label'), + 'visible' => false, + 'formatter' => 'trueFalseFormatter', + ], [ 'field' => 'remote', 'searchable' => false, diff --git a/composer.lock b/composer.lock index 525c6f866..c34d46ce6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,6 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], + "content-hash": "590171872e4a6a29c78efde99fbbf00e", "packages": [ { "name": "alek13/slack", @@ -1809,24 +1810,24 @@ }, { "name": "dompdf/dompdf", - "version": "v2.0.0", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/dompdf/dompdf.git", - "reference": "79573d8b8a141ec8a17312515de8740eed014fa9" + "reference": "e8d2d5e37e8b0b30f0732a011295ab80680d7e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/79573d8b8a141ec8a17312515de8740eed014fa9", - "reference": "79573d8b8a141ec8a17312515de8740eed014fa9", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/e8d2d5e37e8b0b30f0732a011295ab80680d7e85", + "reference": "e8d2d5e37e8b0b30f0732a011295ab80680d7e85", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "masterminds/html5": "^2.0", - "phenx/php-font-lib": "^0.5.4", - "phenx/php-svg-lib": "^0.3.3 || ^0.4.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.3.3 <1.0.0", "php": "^7.1 || ^8.0" }, "require-dev": { @@ -1857,25 +1858,17 @@ ], "authors": [ { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - }, - { - "name": "Brian Sweeney", - "email": "eclecticgeek@gmail.com" - }, - { - "name": "Gabriel Bull", - "email": "me@gabrielbull.com" + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" } ], "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf", "support": { "issues": "https://github.com/dompdf/dompdf/issues", - "source": "https://github.com/dompdf/dompdf/tree/v2.0.0" + "source": "https://github.com/dompdf/dompdf/tree/v2.0.3" }, - "time": "2022-06-21T21:14:57+00:00" + "time": "2023-02-07T12:51:48+00:00" }, { "name": "dragonmantank/cron-expression", @@ -5130,16 +5123,16 @@ }, { "name": "masterminds/html5", - "version": "2.7.5", + "version": "2.7.6", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab" + "reference": "897eb517a343a2281f11bc5556d6548db7d93947" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f640ac1bdddff06ea333a920c95bbad8872429ab", - "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", + "reference": "897eb517a343a2281f11bc5556d6548db7d93947", "shasum": "" }, "require": { @@ -5193,9 +5186,9 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.7.5" + "source": "https://github.com/Masterminds/html5-php/tree/2.7.6" }, - "time": "2021-07-01T14:25:37+00:00" + "time": "2022-08-18T16:18:26+00:00" }, { "name": "maximebf/debugbar", @@ -6430,21 +6423,21 @@ }, { "name": "phenx/php-svg-lib", - "version": "0.4.1", + "version": "0.5.0", "source": { "type": "git", "url": "https://github.com/dompdf/php-svg-lib.git", - "reference": "4498b5df7b08e8469f0f8279651ea5de9626ed02" + "reference": "76876c6cf3080bcb6f249d7d59705108166a6685" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/4498b5df7b08e8469f0f8279651ea5de9626ed02", - "reference": "4498b5df7b08e8469f0f8279651ea5de9626ed02", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/76876c6cf3080bcb6f249d7d59705108166a6685", + "reference": "76876c6cf3080bcb6f249d7d59705108166a6685", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ^7.2 || ^7.3 || ^7.4 || ^8.0", + "php": "^7.1 || ^8.0", "sabberworm/php-css-parser": "^8.4" }, "require-dev": { @@ -6470,9 +6463,9 @@ "homepage": "https://github.com/PhenX/php-svg-lib", "support": { "issues": "https://github.com/dompdf/php-svg-lib/issues", - "source": "https://github.com/dompdf/php-svg-lib/tree/0.4.1" + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.0" }, - "time": "2022-03-07T12:52:04+00:00" + "time": "2022-09-06T12:16:56+00:00" }, { "name": "php-http/message-factory", diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index 24021921b..6f3cce872 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -44,7 +44,7 @@ class AssetFactory extends Factory 'user_id' => 1, 'asset_tag' => $this->faker->unixTime('now'), 'notes' => 'Created by DB seeder', - 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d'), 'purchase_cost' => $this->faker->randomFloat(2, '299.99', '2999.99'), 'order_number' => $this->faker->numberBetween(1000000, 50000000), 'supplier_id' => Supplier::all()->random()->id, diff --git a/database/migrations/2023_01_23_232933_add_vip_to_users.php b/database/migrations/2023_01_23_232933_add_vip_to_users.php new file mode 100644 index 000000000..344f35d24 --- /dev/null +++ b/database/migrations/2023_01_23_232933_add_vip_to_users.php @@ -0,0 +1,34 @@ +boolean('vip')->nullable()->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + if (Schema::hasColumn('users', 'vip')) { + $table->dropColumn('vip'); + } + }); + } +} diff --git a/resources/lang/en/admin/users/general.php b/resources/lang/en/admin/users/general.php index bdd9401da..a3b1699e2 100644 --- a/resources/lang/en/admin/users/general.php +++ b/resources/lang/en/admin/users/general.php @@ -43,6 +43,8 @@ return [ 'remote' => 'Remote', 'remote_help' => 'This can be useful if you need to filter by remote users who never or rarely come into your physical locations.', 'not_remote_label' => 'This is not a remote user', + 'vip_label' => 'VIP user', + 'vip_help' => 'This can be helpful to mark important people if you would like', 'create_user' => 'Create a user', 'create_user_page_explanation' => 'This is the account information you will use to access the site for the first time.', 'email_credentials' => 'Email credentials', diff --git a/resources/views/reports/accessories.blade.php b/resources/views/reports/accessories.blade.php index 49db62c7f..44f90682b 100644 --- a/resources/views/reports/accessories.blade.php +++ b/resources/views/reports/accessories.blade.php @@ -27,6 +27,7 @@ data-sort-order="asc" id="accessoriesReport" class="table table-striped snipe-table" + data-url="{{ route('api.accessories.index') }}" data-export-options='{ "fileName": "accessory-report-{{ date('Y-m-d') }}", "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] @@ -34,27 +35,17 @@ - {{ trans('admin/companies/table.title') }} - {{ trans('admin/accessories/table.title') }} - {{ trans('general.model_no') }} - {{ trans('admin/accessories/general.total') }} - {{ trans('admin/accessories/general.remaining') }} + {{ trans('admin/companies/table.title') }} + {{ trans('admin/accessories/table.title') }} + {{ trans('general.model_no') }} + {{ trans('admin/accessories/general.total') }} + {{ trans('admin/accessories/general.remaining') }} - @foreach ($accessories as $accessory) - - {{ is_null($accessory->company) ? '' : $accessory->company->name }} - {{ $accessory->name }} - {{ $accessory->model_number }} - {{ $accessory->qty }} - {{ $accessory->numRemaining() }} - - @endforeach - diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 3a85874b9..a0815b466 100755 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -370,6 +370,19 @@ @include ('partials.forms.edit.datepicker', ['translated_name' => trans('general.end_date'), 'fieldname' => 'end_date', 'item' => $user]) + +
+
+ +

{{ trans('admin/users/general.vip_help') }} +

+
+
+
diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php index cd9757854..3757dec07 100755 --- a/resources/views/users/view.blade.php +++ b/resources/views/users/view.blade.php @@ -519,7 +519,17 @@
@endif - + +
+
+ {{ trans('admin/users/general.vip_label') }} +
+
+ {!! ($user->vip=='1') ? ' '.trans('general.yes') : ' '.trans('general.no') !!} +
+
+ +
{{ trans('admin/users/general.remote') }}