Merge branch 'develop' into Modal_fix_p2

This commit is contained in:
Godfrey M 2024-09-25 11:10:24 -07:00
commit 926a319552
940 changed files with 7498 additions and 4257 deletions

103
app/Console/Commands/LdapSync.php Executable file → Normal file
View file

@ -53,18 +53,22 @@ class LdapSync extends Command
ini_set('max_execution_time', env('LDAP_TIME_LIM', 600)); //600 seconds = 10 minutes ini_set('max_execution_time', env('LDAP_TIME_LIM', 600)); //600 seconds = 10 minutes
ini_set('memory_limit', env('LDAP_MEM_LIM', '500M')); ini_set('memory_limit', env('LDAP_MEM_LIM', '500M'));
$ldap_result_username = Setting::getSettings()->ldap_username_field;
$ldap_result_last_name = Setting::getSettings()->ldap_lname_field; $ldap_map = [
$ldap_result_first_name = Setting::getSettings()->ldap_fname_field; "username" => Setting::getSettings()->ldap_username_field,
$ldap_result_active_flag = Setting::getSettings()->ldap_active_flag; "last_name" => Setting::getSettings()->ldap_lname_field,
$ldap_result_emp_num = Setting::getSettings()->ldap_emp_num; "first_name" => Setting::getSettings()->ldap_fname_field,
$ldap_result_email = Setting::getSettings()->ldap_email; "active_flag" => Setting::getSettings()->ldap_active_flag,
$ldap_result_phone = Setting::getSettings()->ldap_phone_field; "emp_num" => Setting::getSettings()->ldap_emp_num,
$ldap_result_jobtitle = Setting::getSettings()->ldap_jobtitle; "email" => Setting::getSettings()->ldap_email,
$ldap_result_country = Setting::getSettings()->ldap_country; "phone" => Setting::getSettings()->ldap_phone_field,
$ldap_result_location = Setting::getSettings()->ldap_location; "jobtitle" => Setting::getSettings()->ldap_jobtitle,
$ldap_result_dept = Setting::getSettings()->ldap_dept; "country" => Setting::getSettings()->ldap_country,
$ldap_result_manager = Setting::getSettings()->ldap_manager; "location" => Setting::getSettings()->ldap_location,
"dept" => Setting::getSettings()->ldap_dept,
"manager" => Setting::getSettings()->ldap_manager,
];
$ldap_default_group = Setting::getSettings()->ldap_default_group; $ldap_default_group = Setting::getSettings()->ldap_default_group;
$search_base = Setting::getSettings()->ldap_base_dn; $search_base = Setting::getSettings()->ldap_base_dn;
@ -107,14 +111,21 @@ class LdapSync extends Command
} }
/** /**
* If a filter has been specified, use that * If a filter has been specified, use that, otherwise default to null
*/ */
if ($this->option('filter') != '') { if ($this->option('filter') != '') {
$results = Ldap::findLdapUsers($search_base, -1, $this->option('filter')); $filter = $this->option('filter');
} else { } else {
$results = Ldap::findLdapUsers($search_base); $filter = null;
} }
/**
* We only need to request the LDAP attributes that we process
*/
$attributes = array_values(array_filter($ldap_map));
$results = Ldap::findLdapUsers($search_base, -1, $filter, $attributes);
} catch (\Exception $e) { } catch (\Exception $e) {
if ($this->option('json_summary')) { if ($this->option('json_summary')) {
$json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []]; $json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []];
@ -183,17 +194,17 @@ class LdapSync extends Command
} }
$usernames = []; $usernames = [];
for ($i = 0; $i < $location_users['count']; $i++) { for ($i = 0; $i < $location_users['count']; $i++) {
if (array_key_exists($ldap_result_username, $location_users[$i])) { if (array_key_exists($ldap_map["username"], $location_users[$i])) {
$location_users[$i]['ldap_location_override'] = true; $location_users[$i]['ldap_location_override'] = true;
$location_users[$i]['location_id'] = $ldap_loc['id']; $location_users[$i]['location_id'] = $ldap_loc['id'];
$usernames[] = $location_users[$i][$ldap_result_username][0]; $usernames[] = $location_users[$i][$ldap_map["username"]][0];
} }
} }
// Delete located users from the general group. // Delete located users from the general group.
foreach ($results as $key => $generic_entry) { foreach ($results as $key => $generic_entry) {
if ((is_array($generic_entry)) && (array_key_exists($ldap_result_username, $generic_entry))) { if ((is_array($generic_entry)) && (array_key_exists($ldap_map["username"], $generic_entry))) {
if (in_array($generic_entry[$ldap_result_username][0], $usernames)) { if (in_array($generic_entry[$ldap_map["username"]][0], $usernames)) {
unset($results[$key]); unset($results[$key]);
} }
} }
@ -219,22 +230,22 @@ class LdapSync extends Command
for ($i = 0; $i < $results['count']; $i++) { for ($i = 0; $i < $results['count']; $i++) {
$item = []; $item = [];
$item['username'] = $results[$i][$ldap_result_username][0] ?? ''; $item['username'] = $results[$i][$ldap_map["username"]][0] ?? '';
$item['employee_number'] = $results[$i][$ldap_result_emp_num][0] ?? ''; $item['employee_number'] = $results[$i][$ldap_map["emp_num"]][0] ?? '';
$item['lastname'] = $results[$i][$ldap_result_last_name][0] ?? ''; $item['lastname'] = $results[$i][$ldap_map["last_name"]][0] ?? '';
$item['firstname'] = $results[$i][$ldap_result_first_name][0] ?? ''; $item['firstname'] = $results[$i][$ldap_map["first_name"]][0] ?? '';
$item['email'] = $results[$i][$ldap_result_email][0] ?? ''; $item['email'] = $results[$i][$ldap_map["email"]][0] ?? '';
$item['ldap_location_override'] = $results[$i]['ldap_location_override'] ?? ''; $item['ldap_location_override'] = $results[$i]['ldap_location_override'] ?? '';
$item['location_id'] = $results[$i]['location_id'] ?? ''; $item['location_id'] = $results[$i]['location_id'] ?? '';
$item['telephone'] = $results[$i][$ldap_result_phone][0] ?? ''; $item['telephone'] = $results[$i][$ldap_map["phone"]][0] ?? '';
$item['jobtitle'] = $results[$i][$ldap_result_jobtitle][0] ?? ''; $item['jobtitle'] = $results[$i][$ldap_map["jobtitle"]][0] ?? '';
$item['country'] = $results[$i][$ldap_result_country][0] ?? ''; $item['country'] = $results[$i][$ldap_map["country"]][0] ?? '';
$item['department'] = $results[$i][$ldap_result_dept][0] ?? ''; $item['department'] = $results[$i][$ldap_map["dept"]][0] ?? '';
$item['manager'] = $results[$i][$ldap_result_manager][0] ?? ''; $item['manager'] = $results[$i][$ldap_map["manager"]][0] ?? '';
$item['location'] = $results[$i][$ldap_result_location][0] ?? ''; $item['location'] = $results[$i][$ldap_map["location"]][0] ?? '';
// ONLY if you are using the "ldap_location" option *AND* you have an actual result // ONLY if you are using the "ldap_location" option *AND* you have an actual result
if ($ldap_result_location && $item['location']) { if ($ldap_map["location"] && $item['location']) {
$location = Location::firstOrCreate([ $location = Location::firstOrCreate([
'name' => $item['location'], 'name' => $item['location'],
]); ]);
@ -257,38 +268,38 @@ class LdapSync extends Command
} }
//If a sync option is not filled in on the LDAP settings don't populate the user field //If a sync option is not filled in on the LDAP settings don't populate the user field
if($ldap_result_username != null){ if($ldap_map["username"] != null){
$user->username = $item['username']; $user->username = $item['username'];
} }
if($ldap_result_last_name != null){ if($ldap_map["last_name"] != null){
$user->last_name = $item['lastname']; $user->last_name = $item['lastname'];
} }
if($ldap_result_first_name != null){ if($ldap_map["first_name"] != null){
$user->first_name = $item['firstname']; $user->first_name = $item['firstname'];
} }
if($ldap_result_emp_num != null){ if($ldap_map["emp_num"] != null){
$user->employee_num = e($item['employee_number']); $user->employee_num = e($item['employee_number']);
} }
if($ldap_result_email != null){ if($ldap_map["email"] != null){
$user->email = $item['email']; $user->email = $item['email'];
} }
if($ldap_result_phone != null){ if($ldap_map["phone"] != null){
$user->phone = $item['telephone']; $user->phone = $item['telephone'];
} }
if($ldap_result_jobtitle != null){ if($ldap_map["jobtitle"] != null){
$user->jobtitle = $item['jobtitle']; $user->jobtitle = $item['jobtitle'];
} }
if($ldap_result_country != null){ if($ldap_map["country"] != null){
$user->country = $item['country']; $user->country = $item['country'];
} }
if($ldap_result_dept != null){ if($ldap_map["dept"] != null){
$user->department_id = $department->id; $user->department_id = $department->id;
} }
if($ldap_result_location != null){ if($ldap_map["location"] != null){
$user->location_id = $location ? $location->id : null; $user->location_id = $location ? $location->id : null;
} }
if($ldap_result_manager != null){ if($ldap_map["manager"] != null){
if($item['manager'] != null) { if($item['manager'] != null) {
// Check Cache first // Check Cache first
if (isset($manager_cache[$item['manager']])) { if (isset($manager_cache[$item['manager']])) {
@ -305,7 +316,7 @@ class LdapSync extends Command
$ldap_manager = [ $ldap_manager = [
"count" => 1, "count" => 1,
0 => [ 0 => [
$ldap_result_username => [$item['manager']] $ldap_map["username"] => [$item['manager']]
] ]
]; ];
} }
@ -314,7 +325,7 @@ class LdapSync extends Command
// Get the Manager's username // Get the Manager's username
// PHP LDAP returns every LDAP attribute as an array, and 90% of the time it's an array of just one item. But, hey, it's an array. // PHP LDAP returns every LDAP attribute as an array, and 90% of the time it's an array of just one item. But, hey, it's an array.
$ldapManagerUsername = $ldap_manager[0][$ldap_result_username][0]; $ldapManagerUsername = $ldap_manager[0][$ldap_map["username"]][0];
// Get User from Manager username. // Get User from Manager username.
$ldap_manager = User::where('username', $ldapManagerUsername)->first(); $ldap_manager = User::where('username', $ldapManagerUsername)->first();
@ -331,10 +342,10 @@ class LdapSync extends Command
} }
// Sync activated state for Active Directory. // Sync activated state for Active Directory.
if ( !empty($ldap_result_active_flag)) { // IF we have an 'active' flag set.... if ( !empty($ldap_map["active_flag"])) { // IF we have an 'active' flag set....
// ....then *most* things that are truthy will activate the user. Anything falsey will deactivate them. // ....then *most* things that are truthy will activate the user. Anything falsey will deactivate them.
// (Specifically, we don't handle a value of '0.0' correctly) // (Specifically, we don't handle a value of '0.0' correctly)
$raw_value = @$results[$i][$ldap_result_active_flag][0]; $raw_value = @$results[$i][$ldap_map["active_flag"]][0];
$filter_var = filter_var($raw_value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); $filter_var = filter_var($raw_value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
$boolean_cast = (bool)$raw_value; $boolean_cast = (bool)$raw_value;

View file

@ -50,7 +50,7 @@ class SendAcceptanceReminder extends Command
$query->where('accepted_at', null) $query->where('accepted_at', null)
->where('declined_at', null); ->where('declined_at', null);
}) })
->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model', 'checkoutable.admin']) ->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model', 'checkoutable.adminuser'])
->get(); ->get();
$count = 0; $count = 0;

View file

@ -73,7 +73,7 @@ class AccessoriesController extends Controller
$accessory->purchase_date = request('purchase_date'); $accessory->purchase_date = request('purchase_date');
$accessory->purchase_cost = request('purchase_cost'); $accessory->purchase_cost = request('purchase_cost');
$accessory->qty = request('qty'); $accessory->qty = request('qty');
$accessory->user_id = auth()->id(); $accessory->created_by = auth()->id();
$accessory->supplier_id = request('supplier_id'); $accessory->supplier_id = request('supplier_id');
$accessory->notes = request('notes'); $accessory->notes = request('notes');

View file

@ -78,7 +78,7 @@ class AccessoryCheckoutController extends Controller
AccessoryCheckout::create([ AccessoryCheckout::create([
'accessory_id' => $accessory->id, 'accessory_id' => $accessory->id,
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'user_id' => Auth::id(), 'created_by' => auth()->id(),
'assigned_to' => $target->id, 'assigned_to' => $target->id,
'assigned_type' => $target::class, 'assigned_type' => $target::class,
'note' => $request->input('note'), 'note' => $request->input('note'),

View file

@ -237,7 +237,11 @@ class AcceptanceController extends Controller
} }
$acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note')); $acceptance->accept($sig_filename, $item->getEula(), $pdf_filename, $request->input('note'));
try {
$acceptance->notify(new AcceptanceAssetAcceptedNotification($data)); $acceptance->notify(new AcceptanceAssetAcceptedNotification($data));
} catch (\Exception $e) {
Log::error($e);
}
event(new CheckoutAccepted($acceptance)); event(new CheckoutAccepted($acceptance));
$return_msg = trans('admin/users/message.accepted'); $return_msg = trans('admin/users/message.accepted');

View file

@ -56,7 +56,8 @@ class AccessoriesController extends Controller
]; ];
$accessories = Accessory::select('accessories.*')->with('category', 'company', 'manufacturer', 'checkouts', 'location', 'supplier') $accessories = Accessory::select('accessories.*')
->with('category', 'company', 'manufacturer', 'checkouts', 'location', 'supplier', 'adminuser')
->withCount('checkouts as checkouts_count'); ->withCount('checkouts as checkouts_count');
if ($request->filled('search')) { if ($request->filled('search')) {
@ -111,6 +112,9 @@ class AccessoriesController extends Controller
case 'supplier': case 'supplier':
$accessories = $accessories->OrderSupplier($order); $accessories = $accessories->OrderSupplier($order);
break; break;
case 'created_by':
$accessories = $accessories->OrderByCreatedByName($order);
break;
default: default:
$accessories = $accessories->orderBy($column_sort, $order); $accessories = $accessories->orderBy($column_sort, $order);
break; break;
@ -287,7 +291,7 @@ class AccessoriesController extends Controller
AccessoryCheckout::create([ AccessoryCheckout::create([
'accessory_id' => $accessory->id, 'accessory_id' => $accessory->id,
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'user_id' => Auth::id(), 'created_by' => auth()->id(),
'assigned_to' => $target->id, 'assigned_to' => $target->id,
'assigned_type' => $target::class, 'assigned_type' => $target::class,
'note' => $request->input('note'), 'note' => $request->input('note'),

View file

@ -34,7 +34,7 @@ class AssetMaintenancesController extends Controller
$this->authorize('view', Asset::class); $this->authorize('view', Asset::class);
$maintenances = AssetMaintenance::select('asset_maintenances.*') $maintenances = AssetMaintenance::select('asset_maintenances.*')
->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'admin'); ->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'adminuser');
if ($request->filled('search')) { if ($request->filled('search')) {
$maintenances = $maintenances->TextSearch($request->input('search')); $maintenances = $maintenances->TextSearch($request->input('search'));
@ -48,6 +48,10 @@ class AssetMaintenancesController extends Controller
$maintenances->where('asset_maintenances.supplier_id', '=', $request->input('supplier_id')); $maintenances->where('asset_maintenances.supplier_id', '=', $request->input('supplier_id'));
} }
if ($request->filled('created_by')) {
$maintenances->where('asset_maintenances.created_by', '=', $request->input('created_by'));
}
if ($request->filled('asset_maintenance_type')) { if ($request->filled('asset_maintenance_type')) {
$maintenances->where('asset_maintenance_type', '=', $request->input('asset_maintenance_type')); $maintenances->where('asset_maintenance_type', '=', $request->input('asset_maintenance_type'));
} }
@ -69,7 +73,7 @@ class AssetMaintenancesController extends Controller
'asset_tag', 'asset_tag',
'asset_name', 'asset_name',
'serial', 'serial',
'user_id', 'created_by',
'supplier', 'supplier',
'is_warranty', 'is_warranty',
'status_label', 'status_label',
@ -79,8 +83,8 @@ class AssetMaintenancesController extends Controller
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
switch ($sort) { switch ($sort) {
case 'user_id': case 'created_by':
$maintenances = $maintenances->OrderAdmin($order); $maintenances = $maintenances->OrderByCreatedBy($order);
break; break;
case 'supplier': case 'supplier':
$maintenances = $maintenances->OrderBySupplier($order); $maintenances = $maintenances->OrderBySupplier($order);
@ -124,7 +128,7 @@ class AssetMaintenancesController extends Controller
// create a new model instance // create a new model instance
$maintenance = new AssetMaintenance(); $maintenance = new AssetMaintenance();
$maintenance->fill($request->all()); $maintenance->fill($request->all());
$maintenance->user_id = Auth::id(); $maintenance->created_by = auth()->id();
// Was the asset maintenance created? // Was the asset maintenance created?
if ($maintenance->save()) { if ($maintenance->save()) {
@ -186,11 +190,8 @@ class AssetMaintenancesController extends Controller
{ {
$this->authorize('update', Asset::class); $this->authorize('update', Asset::class);
// Check if the asset maintenance exists // Check if the asset maintenance exists
$assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId);
if (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId);
return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot delete a maintenance for that asset'));
}
$assetMaintenance->delete(); $assetMaintenance->delete();

View file

@ -48,6 +48,8 @@ class AssetModelsController extends Controller
'assets_count', 'assets_count',
'category', 'category',
'fieldset', 'fieldset',
'deleted_at',
'updated_at',
]; ];
$assetmodels = AssetModel::select([ $assetmodels = AssetModel::select([
@ -67,7 +69,7 @@ class AssetModelsController extends Controller
'models.deleted_at', 'models.deleted_at',
'models.updated_at', 'models.updated_at',
]) ])
->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues') ->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues','adminuser')
->withCount('assets as assets_count'); ->withCount('assets as assets_count');
if ($request->input('status')=='deleted') { if ($request->input('status')=='deleted') {

View file

@ -56,6 +56,11 @@ class AssetsController extends Controller
public function index(Request $request, $action = null, $upcoming_status = null) : JsonResponse | array public function index(Request $request, $action = null, $upcoming_status = null) : JsonResponse | array
{ {
// This handles the legacy audit endpoints :(
if ($action == 'audit') {
$action = 'audits';
}
$filter_non_deprecable_assets = false; $filter_non_deprecable_assets = false;
/** /**
@ -121,7 +126,7 @@ class AssetsController extends Controller
} }
$assets = Asset::select('assets.*') $assets = Asset::select('assets.*')
->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo', ->with('location', 'assetstatus', 'company', 'defaultLoc','assignedTo', 'adminuser','model.depreciation',
'model.category', 'model.manufacturer', 'model.fieldset','supplier'); //it might be tempting to add 'assetlog' here, but don't. It blows up update-heavy users. 'model.category', 'model.manufacturer', 'model.fieldset','supplier'); //it might be tempting to add 'assetlog' here, but don't. It blows up update-heavy users.
@ -154,8 +159,8 @@ class AssetsController extends Controller
* Handle due and overdue audits and checkin dates * Handle due and overdue audits and checkin dates
*/ */
switch ($action) { switch ($action) {
case 'audits': // Audit (singular) is left over from earlier legacy APIs
case 'audits' :
switch ($upcoming_status) { switch ($upcoming_status) {
case 'due': case 'due':
$assets->DueForAudit($settings); $assets->DueForAudit($settings);
@ -371,8 +376,33 @@ class AssetsController extends Controller
case 'assigned_to': case 'assigned_to':
$assets->OrderAssigned($order); $assets->OrderAssigned($order);
break; break;
case 'created_by':
$assets->OrderByCreatedByName($order);
break;
default: default:
$numeric_sort = false;
// Search through the custom fields array to see if we're sorting on a custom field
if (array_search($column_sort, $all_custom_fields->pluck('db_column')->toArray()) !== false) {
// Check to see if this is a numeric field type
foreach ($all_custom_fields as $field) {
if (($field->db_column == $sort_override) && ($field->format == 'NUMERIC')) {
$numeric_sort = true;
break;
}
}
// This may not work for all databases, but it works for MySQL
if ($numeric_sort) {
$assets->orderByRaw($sort_override . ' * 1 ' . $order);
} else {
$assets->orderBy($sort_override, $order);
}
} else {
$assets->orderBy($column_sort, $order); $assets->orderBy($column_sort, $order);
}
break; break;
} }
@ -568,7 +598,7 @@ class AssetsController extends Controller
$asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); $asset->model()->associate(AssetModel::find((int) $request->get('model_id')));
$asset->fill($request->validated()); $asset->fill($request->validated());
$asset->user_id = Auth::id(); $asset->created_by = auth()->id();
/** /**
* this is here just legacy reasons. Api\AssetController * this is here just legacy reasons. Api\AssetController

View file

@ -43,6 +43,7 @@ class CategoriesController extends Controller
$categories = Category::select([ $categories = Category::select([
'id', 'id',
'created_by',
'created_at', 'created_at',
'updated_at', 'updated_at',
'name', 'category_type', 'name', 'category_type',
@ -50,8 +51,10 @@ class CategoriesController extends Controller
'eula_text', 'eula_text',
'require_acceptance', 'require_acceptance',
'checkin_email', 'checkin_email',
'image' 'image',
])->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count'); ])
->with('adminuser')
->withCount('accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count');
/* /*
@ -91,13 +94,33 @@ class CategoriesController extends Controller
$categories->where('checkin_email', '=', $request->input('checkin_email')); $categories->where('checkin_email', '=', $request->input('checkin_email'));
} }
if ($request->filled('created_by')) {
$categories->where('created_by', '=', $request->input('created_by'));
}
if ($request->filled('created_at')) {
$categories->where('created_at', '=', $request->input('created_at'));
}
if ($request->filled('updated_at')) {
$categories->where('updated_at', '=', $request->input('updated_at'));
}
// Make sure the offset and limit are actually integers and do not exceed system limits // Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $categories->count()) ? $categories->count() : app('api_offset_value'); $offset = ($request->input('offset') > $categories->count()) ? $categories->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'assets_count'; $sort_override = $request->input('sort');
$categories->orderBy($sort, $order); $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets_count';
switch ($sort_override) {
case 'created_by':
$categories = $categories->OrderByCreatedBy($order);
break;
default:
$categories = $categories->orderBy($column_sort, $order);
break;
}
$total = $categories->count(); $total = $categories->count();
$categories = $categories->skip($offset)->take($limit)->get(); $categories = $categories->skip($offset)->take($limit)->get();

View file

@ -42,7 +42,7 @@ class CompaniesController extends Controller
$companies = Company::withCount(['assets as assets_count' => function ($query) { $companies = Company::withCount(['assets as assets_count' => function ($query) {
$query->AssetsForShow(); $query->AssetsForShow();
}])->withCount('licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count'); }])->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count');
if ($request->filled('search')) { if ($request->filled('search')) {
$companies->TextSearch($request->input('search')); $companies->TextSearch($request->input('search'));
@ -56,17 +56,29 @@ class CompaniesController extends Controller
$companies->where('email', '=', $request->input('email')); $companies->where('email', '=', $request->input('email'));
} }
if ($request->filled('created_by')) {
$companies->where('created_by', '=', $request->input('created_by'));
}
// Make sure the offset and limit are actually integers and do not exceed system limits // Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $companies->count()) ? $companies->count() : app('api_offset_value'); $offset = ($request->input('offset') > $companies->count()) ? $companies->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $sort_override = $request->input('sort');
$companies->orderBy($sort, $order); $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at';
switch ($sort_override) {
case 'created_by':
$companies = $companies->OrderByCreatedBy($order);
break;
default:
$companies = $companies->orderBy($column_sort, $order);
break;
}
$total = $companies->count(); $total = $companies->count();
$companies = $companies->skip($offset)->take($limit)->get(); $companies = $companies->skip($offset)->take($limit)->get();
return (new CompaniesTransformer)->transformCompanies($companies, $total); return (new CompaniesTransformer)->transformCompanies($companies, $total);

View file

@ -47,7 +47,7 @@ class ComponentsController extends Controller
]; ];
$components = Component::select('components.*') $components = Component::select('components.*')
->with('company', 'location', 'category', 'assets', 'supplier'); ->with('company', 'location', 'category', 'assets', 'supplier', 'adminuser');
if ($request->filled('search')) { if ($request->filled('search')) {
$components = $components->TextSearch($request->input('search')); $components = $components->TextSearch($request->input('search'));
@ -98,6 +98,9 @@ class ComponentsController extends Controller
case 'supplier': case 'supplier':
$components = $components->OrderSupplier($order); $components = $components->OrderSupplier($order);
break; break;
case 'created_by':
$components = $components->OrderByCreatedBy($order);
break;
default: default:
$components = $components->orderBy($column_sort, $order); $components = $components->orderBy($column_sort, $order);
break; break;
@ -270,7 +273,7 @@ class ComponentsController extends Controller
'component_id' => $component->id, 'component_id' => $component->id,
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'assigned_qty' => $request->get('assigned_qty', 1), 'assigned_qty' => $request->get('assigned_qty', 1),
'user_id' => auth()->id(), 'created_by' => auth()->id(),
'asset_id' => $request->get('assigned_to'), 'asset_id' => $request->get('assigned_to'),
'note' => $request->get('note'), 'note' => $request->get('note'),
]); ]);

View file

@ -92,6 +92,9 @@ class ConsumablesController extends Controller
case 'supplier': case 'supplier':
$consumables = $consumables->OrderSupplier($order); $consumables = $consumables->OrderSupplier($order);
break; break;
case 'created_by':
$consumables = $consumables->OrderByCreatedBy($order);
break;
default: default:
// This array is what determines which fields should be allowed to be sorted on ON the table itself. // This array is what determines which fields should be allowed to be sorted on ON the table itself.
// These must match a column on the consumables table directly. // These must match a column on the consumables table directly.
@ -210,7 +213,7 @@ class ConsumablesController extends Controller
$consumable = Consumable::with(['consumableAssignments'=> function ($query) { $consumable = Consumable::with(['consumableAssignments'=> function ($query) {
$query->orderBy($query->getModel()->getTable().'.created_at', 'DESC'); $query->orderBy($query->getModel()->getTable().'.created_at', 'DESC');
}, },
'consumableAssignments.admin'=> function ($query) { 'consumableAssignments.adminuser'=> function ($query) {
}, },
'consumableAssignments.user'=> function ($query) { 'consumableAssignments.user'=> function ($query) {
}, },
@ -228,7 +231,8 @@ class ConsumablesController extends Controller
'name' => ($consumable_assignment->user) ? $consumable_assignment->user->present()->nameUrl() : 'Deleted User', 'name' => ($consumable_assignment->user) ? $consumable_assignment->user->present()->nameUrl() : 'Deleted User',
'created_at' => Helper::getFormattedDateObject($consumable_assignment->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($consumable_assignment->created_at, 'datetime'),
'note' => ($consumable_assignment->note) ? e($consumable_assignment->note) : null, 'note' => ($consumable_assignment->note) ? e($consumable_assignment->note) : null,
'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->present()->nameUrl() : null, 'admin' => ($consumable_assignment->adminuser) ? $consumable_assignment->adminuser->present()->nameUrl() : null, // legacy, so we don't change the shape of the response
'created_by' => ($consumable_assignment->adminuser) ? $consumable_assignment->adminuser->present()->nameUrl() : null,
]; ];
} }
@ -277,7 +281,7 @@ class ConsumablesController extends Controller
$consumable->users()->attach($consumable->id, $consumable->users()->attach($consumable->id,
[ [
'consumable_id' => $consumable->id, 'consumable_id' => $consumable->id,
'user_id' => $user->id, 'created_by' => $user->id,
'assigned_to' => $request->input('assigned_to'), 'assigned_to' => $request->input('assigned_to'),
'note' => $request->input('note'), 'note' => $request->input('note'),
] ]

View file

@ -97,7 +97,7 @@ class DepartmentsController extends Controller
$department->fill($request->all()); $department->fill($request->all());
$department = $request->handleImages($department); $department = $request->handleImages($department);
$department->user_id = auth()->id(); $department->created_by = auth()->id();
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
if ($department->save()) { if ($department->save()) {

View file

@ -32,7 +32,8 @@ class DepreciationsController extends Controller
'licenses_count', 'licenses_count',
]; ];
$depreciations = Depreciation::select('id','name','months','depreciation_min','depreciation_type','user_id','created_at','updated_at') $depreciations = Depreciation::select('id','name','months','depreciation_min','depreciation_type','created_at','updated_at', 'created_by')
->with('adminuser')
->withCount('assets as assets_count') ->withCount('assets as assets_count')
->withCount('models as models_count') ->withCount('models as models_count')
->withCount('licenses as licenses_count'); ->withCount('licenses as licenses_count');
@ -44,10 +45,18 @@ class DepreciationsController extends Controller
// Make sure the offset and limit are actually integers and do not exceed system limits // Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $depreciations->count()) ? $depreciations->count() : app('api_offset_value'); $offset = ($request->input('offset') > $depreciations->count()) ? $depreciations->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $sort_override = $request->input('sort');
$depreciations->orderBy($sort, $order); $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at';
switch ($sort_override) {
case 'created_by':
$depreciations = $depreciations->OrderByCreatedBy($order);
break;
default:
$depreciations = $depreciations->orderBy($column_sort, $order);
break;
}
$total = $depreciations->count(); $total = $depreciations->count();
$depreciations = $depreciations->skip($offset)->take($limit)->get(); $depreciations = $depreciations->skip($offset)->take($limit)->get();

View file

@ -23,9 +23,8 @@ class GroupsController extends Controller
$this->authorize('superadmin'); $this->authorize('superadmin');
$this->authorize('view', Group::class); $this->authorize('view', Group::class);
$allowed_columns = ['id', 'name', 'created_at', 'users_count'];
$groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('admin')->withCount('users as users_count'); $groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at', 'created_by')->with('adminuser')->withCount('users as users_count');
if ($request->filled('search')) { if ($request->filled('search')) {
$groups = $groups->TextSearch($request->input('search')); $groups = $groups->TextSearch($request->input('search'));
@ -35,13 +34,29 @@ class GroupsController extends Controller
$groups->where('name', '=', $request->input('name')); $groups->where('name', '=', $request->input('name'));
} }
// Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $groups->count()) ? $groups->count() : app('api_offset_value'); $offset = ($request->input('offset') > $groups->count()) ? $groups->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
switch ($request->input('sort')) {
case 'created_by':
$groups = $groups->OrderByCreatedBy($order);
break;
default:
// This array is what determines which fields should be allowed to be sorted on ON the table itself.
// These must match a column on the consumables table directly.
$allowed_columns = [
'id',
'name',
'created_at',
'users_count',
];
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
$groups->orderBy($sort, $order); $groups = $groups->orderBy($sort, $order);
break;
}
$total = $groups->count(); $total = $groups->count();
$groups = $groups->skip($offset)->take($limit)->get(); $groups = $groups->skip($offset)->take($limit)->get();

View file

@ -107,7 +107,7 @@ class LicenseSeatsController extends Controller
// attempt to update the license seat // attempt to update the license seat
$licenseSeat->fill($request->all()); $licenseSeat->fill($request->all());
$licenseSeat->user_id = auth()->id(); $licenseSeat->created_by = auth()->id();
// check if this update is a checkin operation // check if this update is a checkin operation
// 1. are relevant fields touched at all? // 1. are relevant fields touched at all?

View file

@ -70,8 +70,8 @@ class LicensesController extends Controller
$licenses->where('depreciation_id', '=', $request->input('depreciation_id')); $licenses->where('depreciation_id', '=', $request->input('depreciation_id'));
} }
if ($request->filled('user_id')) { if ($request->filled('created_by')) {
$licenses->where('user_id', '=', $request->input('user_id')); $licenses->where('created_by', '=', $request->input('created_by'));
} }
if (($request->filled('maintained')) && ($request->input('maintained')=='true')) { if (($request->filled('maintained')) && ($request->input('maintained')=='true')) {
@ -117,7 +117,7 @@ class LicensesController extends Controller
$licenses = $licenses->leftJoin('companies', 'licenses.company_id', '=', 'companies.id')->orderBy('companies.name', $order); $licenses = $licenses->leftJoin('companies', 'licenses.company_id', '=', 'companies.id')->orderBy('companies.name', $order);
break; break;
case 'created_by': case 'created_by':
$licenses = $licenses->OrderCreatedBy($order); $licenses = $licenses->OrderByCreatedBy($order);
break; break;
default: default:
$allowed_columns = $allowed_columns =
@ -182,7 +182,7 @@ class LicensesController extends Controller
public function show($id) : JsonResponse | array public function show($id) : JsonResponse | array
{ {
$this->authorize('view', License::class); $this->authorize('view', License::class);
$license = License::withCount('freeSeats')->findOrFail($id); $license = License::withCount('freeSeats as free_seats_count')->findOrFail($id);
$license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset');
return (new LicensesTransformer)->transformLicense($license); return (new LicensesTransformer)->transformLicense($license);
@ -220,7 +220,6 @@ class LicensesController extends Controller
*/ */
public function destroy($id) : JsonResponse public function destroy($id) : JsonResponse
{ {
//
$license = License::findOrFail($id); $license = License::findOrFail($id);
$this->authorize('delete', $license); $this->authorize('delete', $license);

View file

@ -25,11 +25,42 @@ class ManufacturersController extends Controller
public function index(Request $request) : JsonResponse | array public function index(Request $request) : JsonResponse | array
{ {
$this->authorize('view', Manufacturer::class); $this->authorize('view', Manufacturer::class);
$allowed_columns = ['id', 'name', 'url', 'support_url', 'support_email', 'warranty_lookup_url', 'support_phone', 'created_at', 'updated_at', 'image', 'assets_count', 'consumables_count', 'components_count', 'licenses_count']; $allowed_columns = [
'id',
'name',
'url',
'support_url',
'support_email',
'warranty_lookup_url',
'support_phone',
'created_at',
'updated_at',
'image',
'assets_count',
'consumables_count',
'components_count',
'licenses_count'
];
$manufacturers = Manufacturer::select( $manufacturers = Manufacturer::select([
['id', 'name', 'url', 'support_url', 'warranty_lookup_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'deleted_at'] 'id',
)->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count'); 'name',
'url',
'support_url',
'warranty_lookup_url',
'support_email',
'support_phone',
'created_by',
'created_at',
'updated_at',
'image',
'deleted_at',
])
->with('adminuser')
->withCount('assets as assets_count')
->withCount('licenses as licenses_count')
->withCount('consumables as consumables_count')
->withCount('accessories as accessories_count');
if ($request->input('deleted') == 'true') { if ($request->input('deleted') == 'true') {
$manufacturers->onlyTrashed(); $manufacturers->onlyTrashed();
@ -66,10 +97,18 @@ class ManufacturersController extends Controller
// Make sure the offset and limit are actually integers and do not exceed system limits // Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $manufacturers->count()) ? $manufacturers->count() : app('api_offset_value'); $offset = ($request->input('offset') > $manufacturers->count()) ? $manufacturers->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $sort_override = $request->input('sort');
$manufacturers->orderBy($sort, $order); $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at';
switch ($sort_override) {
case 'created_by':
$manufacturers = $manufacturers->OrderByCreatedBy($order);
break;
default:
$manufacturers = $manufacturers->orderBy($column_sort, $order);
break;
}
$total = $manufacturers->count(); $total = $manufacturers->count();
$manufacturers = $manufacturers->skip($offset)->take($limit)->get(); $manufacturers = $manufacturers->skip($offset)->take($limit)->get();
@ -181,7 +220,7 @@ class ManufacturersController extends Controller
$logaction->item_type = Manufacturer::class; $logaction->item_type = Manufacturer::class;
$logaction->item_id = $manufacturer->id; $logaction->item_id = $manufacturer->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');
return response()->json(Helper::formatStandardApiResponse('success', trans('admin/manufacturers/message.restore.success')), 200); return response()->json(Helper::formatStandardApiResponse('success', trans('admin/manufacturers/message.restore.success')), 200);

View file

@ -23,9 +23,8 @@ class PredefinedKitsController extends Controller
public function index(Request $request) : JsonResponse | array public function index(Request $request) : JsonResponse | array
{ {
$this->authorize('view', PredefinedKit::class); $this->authorize('view', PredefinedKit::class);
$allowed_columns = ['id', 'name'];
$kits = PredefinedKit::query(); $kits = PredefinedKit::query()->with('adminuser');
if ($request->filled('search')) { if ($request->filled('search')) {
$kits = $kits->TextSearch($request->input('search')); $kits = $kits->TextSearch($request->input('search'));
@ -36,8 +35,25 @@ class PredefinedKitsController extends Controller
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'desc' ? 'desc' : 'asc'; $order = $request->input('order') === 'desc' ? 'desc' : 'asc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'name';
$kits->orderBy($sort, $order); switch ($request->input('sort')) {
case 'created_by':
$kits = $kits->OrderByCreatedBy($order);
break;
default:
// This array is what determines which fields should be allowed to be sorted on ON the table itself.
// These must match a column on the consumables table directly.
$allowed_columns = [
'id',
'name',
'created_at',
'updated_at',
];
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
$kits = $kits->orderBy($sort, $order);
break;
}
$total = $kits->count(); $total = $kits->count();
$kits = $kits->skip($offset)->take($limit)->get(); $kits = $kits->skip($offset)->take($limit)->get();

View file

@ -20,7 +20,7 @@ class ReportsController extends Controller
{ {
$this->authorize('reports.view'); $this->authorize('reports.view');
$actionlogs = Actionlog::with('item', 'user', 'admin', 'target', 'location'); $actionlogs = Actionlog::with('item', 'user', 'adminuser', 'target', 'location');
if ($request->filled('search')) { if ($request->filled('search')) {
$actionlogs = $actionlogs->TextSearch(e($request->input('search'))); $actionlogs = $actionlogs->TextSearch(e($request->input('search')));
@ -48,8 +48,8 @@ class ReportsController extends Controller
$actionlogs = $actionlogs->where('action_type', '=', $request->input('action_type'))->orderBy('created_at', 'desc'); $actionlogs = $actionlogs->where('action_type', '=', $request->input('action_type'))->orderBy('created_at', 'desc');
} }
if ($request->filled('user_id')) { if ($request->filled('created_by')) {
$actionlogs = $actionlogs->where('user_id', '=', $request->input('user_id')); $actionlogs = $actionlogs->where('created_by', '=', $request->input('created_by'));
} }
if ($request->filled('action_source')) { if ($request->filled('action_source')) {
@ -68,13 +68,14 @@ class ReportsController extends Controller
'id', 'id',
'created_at', 'created_at',
'target_id', 'target_id',
'user_id', 'created_by',
'accept_signature', 'accept_signature',
'action_type', 'action_type',
'note', 'note',
'remote_ip', 'remote_ip',
'user_agent', 'user_agent',
'action_source', 'action_source',
'action_date',
]; ];
@ -86,8 +87,8 @@ class ReportsController extends Controller
$order = ($request->input('order') == 'asc') ? 'asc' : 'desc'; $order = ($request->input('order') == 'asc') ? 'asc' : 'desc';
switch ($request->input('sort')) { switch ($request->input('sort')) {
case 'admin': case 'created_by':
$actionlogs->OrderAdmin($order); $actionlogs->OrderByCreatedBy($order);
break; break;
default: default:
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';

View file

@ -25,9 +25,17 @@ class StatuslabelsController extends Controller
public function index(Request $request) : array public function index(Request $request) : array
{ {
$this->authorize('view', Statuslabel::class); $this->authorize('view', Statuslabel::class);
$allowed_columns = ['id', 'name', 'created_at', 'assets_count', 'color', 'notes', 'default_label']; $allowed_columns = [
'id',
'name',
'created_at',
'assets_count',
'color',
'notes',
'default_label'
];
$statuslabels = Statuslabel::withCount('assets as assets_count'); $statuslabels = Statuslabel::with('adminuser')->withCount('assets as assets_count');
if ($request->filled('search')) { if ($request->filled('search')) {
$statuslabels = $statuslabels->TextSearch($request->input('search')); $statuslabels = $statuslabels->TextSearch($request->input('search'));
@ -54,10 +62,18 @@ class StatuslabelsController extends Controller
// Make sure the offset and limit are actually integers and do not exceed system limits // Make sure the offset and limit are actually integers and do not exceed system limits
$offset = ($request->input('offset') > $statuslabels->count()) ? $statuslabels->count() : app('api_offset_value'); $offset = ($request->input('offset') > $statuslabels->count()) ? $statuslabels->count() : app('api_offset_value');
$limit = app('api_limit_value'); $limit = app('api_limit_value');
$order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $order = $request->input('order') === 'asc' ? 'asc' : 'desc';
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $sort_override = $request->input('sort');
$statuslabels->orderBy($sort, $order); $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at';
switch ($sort_override) {
case 'created_by':
$statuslabels = $statuslabels->OrderByCreatedBy($order);
break;
default:
$statuslabels = $statuslabels->orderBy($column_sort, $order);
break;
}
$total = $statuslabels->count(); $total = $statuslabels->count();
$statuslabels = $statuslabels->skip($offset)->take($limit)->get(); $statuslabels = $statuslabels->skip($offset)->take($limit)->get();

View file

@ -206,6 +206,10 @@ class UsersController extends Controller
$users->where('autoassign_licenses', '=', $request->input('autoassign_licenses')); $users->where('autoassign_licenses', '=', $request->input('autoassign_licenses'));
} }
if ($request->filled('locale')) {
$users = $users->where('users.locale', '=', $request->input('locale'));
}
if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) { if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) {
$users = $users->onlyTrashed(); $users = $users->onlyTrashed();
@ -276,6 +280,7 @@ class UsersController extends Controller
'end_date', 'end_date',
'autoassign_licenses', 'autoassign_licenses',
'website', 'website',
'locale',
]; ];
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'first_name'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'first_name';
@ -686,7 +691,7 @@ class UsersController extends Controller
$logaction->item_type = User::class; $logaction->item_type = User::class;
$logaction->item_id = $user->id; $logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('2FA reset'); $logaction->logaction('2FA reset');
return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200); return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200);
@ -736,7 +741,7 @@ class UsersController extends Controller
$logaction->item_type = User::class; $logaction->item_type = User::class;
$logaction->item_id = $user->id; $logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored')), 200); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored')), 200);

View file

@ -109,7 +109,7 @@ class AssetMaintenancesController extends Controller
$assetMaintenance->title = $request->input('title'); $assetMaintenance->title = $request->input('title');
$assetMaintenance->start_date = $request->input('start_date'); $assetMaintenance->start_date = $request->input('start_date');
$assetMaintenance->completion_date = $request->input('completion_date'); $assetMaintenance->completion_date = $request->input('completion_date');
$assetMaintenance->user_id = Auth::id(); $assetMaintenance->created_by = auth()->id();
if (($assetMaintenance->completion_date !== null) if (($assetMaintenance->completion_date !== null)
&& ($assetMaintenance->start_date !== '') && ($assetMaintenance->start_date !== '')

View file

@ -78,7 +78,7 @@ class AssetModelsController extends Controller
$model->manufacturer_id = $request->input('manufacturer_id'); $model->manufacturer_id = $request->input('manufacturer_id');
$model->category_id = $request->input('category_id'); $model->category_id = $request->input('category_id');
$model->notes = $request->input('notes'); $model->notes = $request->input('notes');
$model->user_id = Auth::id(); $model->created_by = auth()->id();
$model->requestable = $request->has('requestable'); $model->requestable = $request->has('requestable');
if ($request->input('fieldset_id') != '') { if ($request->input('fieldset_id') != '') {
@ -237,7 +237,7 @@ class AssetModelsController extends Controller
$logaction->item_type = AssetModel::class; $logaction->item_type = AssetModel::class;
$logaction->item_id = $model->id; $logaction->item_id = $model->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');

View file

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Assets; namespace App\Http\Controllers\Assets;
use App\Events\CheckoutableCheckedIn;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
@ -132,7 +133,7 @@ class AssetsController extends Controller
$asset->model_id = $request->input('model_id'); $asset->model_id = $request->input('model_id');
$asset->order_number = $request->input('order_number'); $asset->order_number = $request->input('order_number');
$asset->notes = $request->input('notes'); $asset->notes = $request->input('notes');
$asset->user_id = Auth::id(); $asset->created_by = auth()->id();
$asset->status_id = request('status_id'); $asset->status_id = request('status_id');
$asset->warranty_months = request('warranty_months', null); $asset->warranty_months = request('warranty_months', null);
$asset->purchase_cost = request('purchase_cost'); $asset->purchase_cost = request('purchase_cost');
@ -328,16 +329,21 @@ class AssetsController extends Controller
} }
$asset->supplier_id = $request->input('supplier_id', null); $asset->supplier_id = $request->input('supplier_id', null);
$asset->expected_checkin = $request->input('expected_checkin', null); $asset->expected_checkin = $request->input('expected_checkin', null);
$asset->requestable = $request->input('requestable', 0);
// If the box isn't checked, it's not in the request at all.
$asset->requestable = $request->filled('requestable');
$asset->rtd_location_id = $request->input('rtd_location_id', null); $asset->rtd_location_id = $request->input('rtd_location_id', null);
$asset->byod = $request->input('byod', 0); $asset->byod = $request->input('byod', 0);
$status = Statuslabel::find($asset->status_id); $status = Statuslabel::find($request->input('status_id'));
if ($status && $status->archived) { // This is a non-deployable status label - we should check the asset back in.
if (($status && $status->getStatuslabelType() != 'deployable') && ($target = $asset->assignedTo)) {
$originalValues = $asset->getRawOriginal();
$asset->assigned_to = null; $asset->assigned_to = null;
$asset->assigned_type = null;
$asset->accepted = null;
event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on asset update', date('Y-m-d H:i:s'), $originalValues));
} }
if ($asset->assigned_to == '') { if ($asset->assigned_to == '') {
@ -739,7 +745,7 @@ class AssetsController extends Controller
Actionlog::firstOrCreate([ Actionlog::firstOrCreate([
'item_id' => $asset->id, 'item_id' => $asset->id,
'item_type' => Asset::class, 'item_type' => Asset::class,
'user_id' => auth()->id(), 'created_by' => auth()->id(),
'note' => 'Checkout imported by '.auth()->user()->present()->fullName().' from history importer', 'note' => 'Checkout imported by '.auth()->user()->present()->fullName().' from history importer',
'target_id' => $item[$asset_tag][$batch_counter]['user_id'], 'target_id' => $item[$asset_tag][$batch_counter]['user_id'],
'target_type' => User::class, 'target_type' => User::class,
@ -767,7 +773,7 @@ class AssetsController extends Controller
Actionlog::firstOrCreate([ Actionlog::firstOrCreate([
'item_id' => $item[$asset_tag][$batch_counter]['asset_id'], 'item_id' => $item[$asset_tag][$batch_counter]['asset_id'],
'item_type' => Asset::class, 'item_type' => Asset::class,
'user_id' => auth()->id(), 'created_by' => auth()->id(),
'note' => 'Checkin imported by '.auth()->user()->present()->fullName().' from history importer', 'note' => 'Checkin imported by '.auth()->user()->present()->fullName().' from history importer',
'target_id' => null, 'target_id' => null,
'created_at' => $checkin_date, 'created_at' => $checkin_date,

View file

@ -10,6 +10,7 @@ use App\Models\AssetModel;
use App\Models\Statuslabel; use App\Models\Statuslabel;
use App\Models\Setting; use App\Models\Setting;
use App\View\Label; use App\View\Label;
use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -271,6 +272,23 @@ class BulkAssetsController extends Controller
$this->conditionallyAddItem($custom_field_column); $this->conditionallyAddItem($custom_field_column);
} }
if (!($asset->eol_explicit)) {
if ($request->filled('model_id')) {
$model = AssetModel::find($request->input('model_id'));
if ($model->eol > 0) {
if ($request->filled('purchase_date')) {
$this->update_array['asset_eol_date'] = Carbon::parse($request->input('purchase_date'))->addMonths($model->eol)->format('Y-m-d');
} else {
$this->update_array['asset_eol_date'] = Carbon::parse($asset->purchase_date)->addMonths($model->eol)->format('Y-m-d');
}
} else {
$this->update_array['asset_eol_date'] = null;
}
} elseif (($request->filled('purchase_date')) && ($asset->model->eol > 0)) {
$this->update_array['asset_eol_date'] = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d');
}
}
/** /**
* Blank out fields that were requested to be blanked out via checkbox * Blank out fields that were requested to be blanked out via checkbox
*/ */
@ -281,6 +299,9 @@ class BulkAssetsController extends Controller
if ($request->input('null_purchase_date')=='1') { if ($request->input('null_purchase_date')=='1') {
$this->update_array['purchase_date'] = null; $this->update_array['purchase_date'] = null;
if (!($asset->eol_explicit)) {
$this->update_array['asset_eol_date'] = null;
}
} }
if ($request->input('null_expected_checkin_date')=='1') { if ($request->input('null_expected_checkin_date')=='1') {

View file

@ -69,7 +69,7 @@ class CategoriesController extends Controller
$category->use_default_eula = $request->input('use_default_eula', '0'); $category->use_default_eula = $request->input('use_default_eula', '0');
$category->require_acceptance = $request->input('require_acceptance', '0'); $category->require_acceptance = $request->input('require_acceptance', '0');
$category->checkin_email = $request->input('checkin_email', '0'); $category->checkin_email = $request->input('checkin_email', '0');
$category->user_id = Auth::id(); $category->created_by = auth()->id();
$category = $request->handleImages($category); $category = $request->handleImages($category);
if ($category->save()) { if ($category->save()) {

View file

@ -60,6 +60,7 @@ final class CompaniesController extends Controller
$company->phone = $request->input('phone'); $company->phone = $request->input('phone');
$company->fax = $request->input('fax'); $company->fax = $request->input('fax');
$company->email = $request->input('email'); $company->email = $request->input('email');
$company->created_by = auth()->id();
$company = $request->handleImages($company); $company = $request->handleImages($company);

View file

@ -106,7 +106,7 @@ class ComponentCheckoutController extends Controller
$component->asset_id = $request->input('asset_id'); $component->asset_id = $request->input('asset_id');
$component->assets()->attach($component->id, [ $component->assets()->attach($component->id, [
'component_id' => $component->id, 'component_id' => $component->id,
'user_id' => auth()->user()->id, 'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'), 'created_at' => date('Y-m-d H:i:s'),
'assigned_qty' => $request->input('assigned_qty'), 'assigned_qty' => $request->input('assigned_qty'),
'asset_id' => $request->input('asset_id'), 'asset_id' => $request->input('asset_id'),

View file

@ -81,7 +81,7 @@ class ComponentsController extends Controller
$component->purchase_date = $request->input('purchase_date', null); $component->purchase_date = $request->input('purchase_date', null);
$component->purchase_cost = $request->input('purchase_cost', null); $component->purchase_cost = $request->input('purchase_cost', null);
$component->qty = $request->input('qty'); $component->qty = $request->input('qty');
$component->user_id = Auth::id(); $component->created_by = auth()->id();
$component->notes = $request->input('notes'); $component->notes = $request->input('notes');
$component = $request->handleImages($component); $component = $request->handleImages($component);

View file

@ -95,7 +95,7 @@ class ConsumableCheckoutController extends Controller
for($i = 0; $i < $quantity; $i++){ for($i = 0; $i < $quantity; $i++){
$consumable->users()->attach($consumable->id, [ $consumable->users()->attach($consumable->id, [
'consumable_id' => $consumable->id, 'consumable_id' => $consumable->id,
'user_id' => $admin_user->id, 'created_by' => $admin_user->id,
'assigned_to' => e($request->input('assigned_to')), 'assigned_to' => e($request->input('assigned_to')),
'note' => $request->input('note'), 'note' => $request->input('note'),
]); ]);

View file

@ -81,7 +81,7 @@ class ConsumablesController extends Controller
$consumable->purchase_date = $request->input('purchase_date'); $consumable->purchase_date = $request->input('purchase_date');
$consumable->purchase_cost = $request->input('purchase_cost'); $consumable->purchase_cost = $request->input('purchase_cost');
$consumable->qty = $request->input('qty'); $consumable->qty = $request->input('qty');
$consumable->user_id = Auth::id(); $consumable->created_by = auth()->id();
$consumable->notes = $request->input('notes'); $consumable->notes = $request->input('notes');
@ -221,7 +221,7 @@ class ConsumablesController extends Controller
$consumable = clone $consumable_to_close; $consumable = clone $consumable_to_close;
$consumable->id = null; $consumable->id = null;
$consumable->image = null; $consumable->image = null;
$consumable->user_id = null; $consumable->created_by = null;
return view('consumables/edit')->with('item', $consumable); return view('consumables/edit')->with('item', $consumable);
} }

View file

@ -104,7 +104,7 @@ class CustomFieldsController extends Controller
"auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0), "auto_add_to_fieldsets" => $request->get("auto_add_to_fieldsets", 0),
"show_in_listview" => $request->get("show_in_listview", 0), "show_in_listview" => $request->get("show_in_listview", 0),
"show_in_requestable_list" => $request->get("show_in_requestable_list", 0), "show_in_requestable_list" => $request->get("show_in_requestable_list", 0),
"user_id" => Auth::id() "user_id" => auth()->id()
]); ]);
@ -248,7 +248,7 @@ class CustomFieldsController extends Controller
$field->name = trim(e($request->get("name"))); $field->name = trim(e($request->get("name")));
$field->element = e($request->get("element")); $field->element = e($request->get("element"));
$field->field_values = $request->get("field_values"); $field->field_values = $request->get("field_values");
$field->user_id = Auth::id(); $field->created_by = auth()->id();
$field->help_text = $request->get("help_text"); $field->help_text = $request->get("help_text");
$field->show_in_email = $show_in_email; $field->show_in_email = $show_in_email;
$field->is_unique = $request->get("is_unique", 0); $field->is_unique = $request->get("is_unique", 0);

View file

@ -90,7 +90,7 @@ class CustomFieldsetsController extends Controller
$fieldset = new CustomFieldset([ $fieldset = new CustomFieldset([
'name' => $request->get('name'), 'name' => $request->get('name'),
'user_id' => auth()->id(), 'created_by' => auth()->id(),
]); ]);
$validator = Validator::make($request->all(), $fieldset->rules); $validator = Validator::make($request->all(), $fieldset->rules);

View file

@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use \Illuminate\Contracts\View\View; use \Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Session;
/** /**
@ -44,6 +45,8 @@ class DashboardController extends Controller
return view('dashboard')->with('asset_stats', $asset_stats)->with('counts', $counts); return view('dashboard')->with('asset_stats', $asset_stats)->with('counts', $counts);
} else { } else {
Session::reflash();
// Redirect to the profile page // Redirect to the profile page
return redirect()->intended('account/view-assets'); return redirect()->intended('account/view-assets');
} }

View file

@ -51,7 +51,7 @@ class DepartmentsController extends Controller
$this->authorize('create', Department::class); $this->authorize('create', Department::class);
$department = new Department; $department = new Department;
$department->fill($request->all()); $department->fill($request->all());
$department->user_id = auth()->id(); $department->created_by = auth()->id();
$department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null);
$department->location_id = ($request->filled('location_id') ? $request->input('location_id') : null); $department->location_id = ($request->filled('location_id') ? $request->input('location_id') : null);
$department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null); $department->company_id = ($request->filled('company_id') ? $request->input('company_id') : null);

View file

@ -61,7 +61,7 @@ class DepreciationsController extends Controller
// Depreciation data // Depreciation data
$depreciation->name = $request->input('name'); $depreciation->name = $request->input('name');
$depreciation->months = $request->input('months'); $depreciation->months = $request->input('months');
$depreciation->user_id = Auth::id(); $depreciation->created_by = auth()->id();
$request->validate([ $request->validate([
'depreciation_min' => [ 'depreciation_min' => [

View file

@ -55,6 +55,7 @@ class PredefinedKitsController extends Controller
// Create a new Predefined Kit // Create a new Predefined Kit
$kit = new PredefinedKit; $kit = new PredefinedKit;
$kit->name = $request->input('name'); $kit->name = $request->input('name');
$kit->created_by = auth()->id();
if (! $kit->save()) { if (! $kit->save()) {
return redirect()->back()->withInput()->withErrors($kit->getErrors()); return redirect()->back()->withInput()->withErrors($kit->getErrors());

View file

@ -77,7 +77,7 @@ class LicenseCheckoutController extends Controller
$this->authorize('checkout', $license); $this->authorize('checkout', $license);
$licenseSeat = $this->findLicenseSeatToCheckout($license, $seatId); $licenseSeat = $this->findLicenseSeatToCheckout($license, $seatId);
$licenseSeat->user_id = Auth::id(); $licenseSeat->created_by = auth()->id();
$licenseSeat->notes = $request->input('notes'); $licenseSeat->notes = $request->input('notes');

View file

@ -99,7 +99,7 @@ class LicensesController extends Controller
$license->supplier_id = $request->input('supplier_id'); $license->supplier_id = $request->input('supplier_id');
$license->category_id = $request->input('category_id'); $license->category_id = $request->input('category_id');
$license->termination_date = $request->input('termination_date'); $license->termination_date = $request->input('termination_date');
$license->user_id = Auth::id(); $license->created_by = auth()->id();
$license->min_amt = $request->input('min_amt'); $license->min_amt = $request->input('min_amt');
session()->put(['redirect_option' => $request->get('redirect_option')]); session()->put(['redirect_option' => $request->get('redirect_option')]);

View file

@ -75,7 +75,7 @@ class LocationsController extends Controller
$location->zip = $request->input('zip'); $location->zip = $request->input('zip');
$location->ldap_ou = $request->input('ldap_ou'); $location->ldap_ou = $request->input('ldap_ou');
$location->manager_id = $request->input('manager_id'); $location->manager_id = $request->input('manager_id');
$location->user_id = auth()->id(); $location->created_by = auth()->id();
$location->phone = request('phone'); $location->phone = request('phone');
$location->fax = request('fax'); $location->fax = request('fax');
@ -278,7 +278,7 @@ class LocationsController extends Controller
$logaction->item_type = Location::class; $logaction->item_type = Location::class;
$logaction->item_id = $location->id; $logaction->item_id = $location->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');
return redirect()->route('locations.index')->with('success', trans('admin/locations/message.restore.success')); return redirect()->route('locations.index')->with('success', trans('admin/locations/message.restore.success'));

View file

@ -61,7 +61,7 @@ class ManufacturersController extends Controller
$this->authorize('create', Manufacturer::class); $this->authorize('create', Manufacturer::class);
$manufacturer = new Manufacturer; $manufacturer = new Manufacturer;
$manufacturer->name = $request->input('name'); $manufacturer->name = $request->input('name');
$manufacturer->user_id = Auth::id(); $manufacturer->created_by = auth()->id();
$manufacturer->url = $request->input('url'); $manufacturer->url = $request->input('url');
$manufacturer->support_url = $request->input('support_url'); $manufacturer->support_url = $request->input('support_url');
$manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url'); $manufacturer->warranty_lookup_url = $request->input('warranty_lookup_url');
@ -219,7 +219,7 @@ class ManufacturersController extends Controller
$logaction->item_type = Manufacturer::class; $logaction->item_type = Manufacturer::class;
$logaction->item_id = $manufacturer->id; $logaction->item_id = $manufacturer->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');
// Redirect them to the deleted page if there are more, otherwise the section index // Redirect them to the deleted page if there are more, otherwise the section index

View file

@ -703,6 +703,10 @@ class ReportsController extends Controller
$assets->whereBetween('assets.expected_checkin', [$request->input('expected_checkin_start'), $request->input('expected_checkin_end')]); $assets->whereBetween('assets.expected_checkin', [$request->input('expected_checkin_start'), $request->input('expected_checkin_end')]);
} }
if (($request->filled('asset_eol_date_start')) && ($request->filled('asset_eol_date_end'))) {
$assets->whereBetween('assets.asset_eol_date', [$request->input('asset_eol_date_start'), $request->input('asset_eol_date_end')]);
}
if (($request->filled('last_audit_start')) && ($request->filled('last_audit_end'))) { if (($request->filled('last_audit_start')) && ($request->filled('last_audit_end'))) {
$last_audit_start = Carbon::parse($request->input('last_audit_start'))->startOfDay(); $last_audit_start = Carbon::parse($request->input('last_audit_start'))->startOfDay();
$last_audit_end = Carbon::parse($request->input('last_audit_end'))->endOfDay(); $last_audit_end = Carbon::parse($request->input('last_audit_end'))->endOfDay();
@ -778,7 +782,7 @@ class ReportsController extends Controller
} }
if ($request->filled('eol')) { if ($request->filled('eol')) {
$row[] = ($asset->asset_eol_date) ? $asset->asset_eol_date : ''; $row[] = ($asset->purchase_date != '') ? $asset->asset_eol_date : '';
} }
if ($request->filled('order')) { if ($request->filled('order')) {

View file

@ -181,7 +181,7 @@ class SettingsController extends Controller
$settings->brand = 1; $settings->brand = 1;
$settings->locale = $request->input('locale', 'en-US'); $settings->locale = $request->input('locale', 'en-US');
$settings->default_currency = $request->input('default_currency', 'USD'); $settings->default_currency = $request->input('default_currency', 'USD');
$settings->user_id = 1; $settings->created_by = 1;
$settings->email_domain = $request->input('email_domain'); $settings->email_domain = $request->input('email_domain');
$settings->email_format = $request->input('email_format'); $settings->email_format = $request->input('email_format');
$settings->next_auto_tag_base = 1; $settings->next_auto_tag_base = 1;

View file

@ -69,7 +69,7 @@ class StatuslabelsController extends Controller
// Save the Statuslabel data // Save the Statuslabel data
$statusLabel->name = $request->input('name'); $statusLabel->name = $request->input('name');
$statusLabel->user_id = Auth::id(); $statusLabel->created_by = auth()->id();
$statusLabel->notes = $request->input('notes'); $statusLabel->notes = $request->input('notes');
$statusLabel->deployable = $statusType['deployable']; $statusLabel->deployable = $statusType['deployable'];
$statusLabel->pending = $statusType['pending']; $statusLabel->pending = $statusType['pending'];

View file

@ -62,7 +62,7 @@ class SuppliersController extends Controller
$supplier->email = request('email'); $supplier->email = request('email');
$supplier->notes = request('notes'); $supplier->notes = request('notes');
$supplier->url = $supplier->addhttp(request('url')); $supplier->url = $supplier->addhttp(request('url'));
$supplier->user_id = Auth::id(); $supplier->created_by = auth()->id();
$supplier = $request->handleImages($supplier); $supplier = $request->handleImages($supplier);
if ($supplier->save()) { if ($supplier->save()) {

View file

@ -101,7 +101,7 @@ class BulkUsersController extends Controller
$user_raw_array = $request->input('ids'); $user_raw_array = $request->input('ids');
// Remove the user from any updates. // Remove the user from any updates.
$user_raw_array = array_diff($user_raw_array, [Auth::id()]); $user_raw_array = array_diff($user_raw_array, [auth()->id()]);
$manager_conflict = false; $manager_conflict = false;
$users = User::whereIn('id', $user_raw_array)->where('id', '!=', auth()->id())->get(); $users = User::whereIn('id', $user_raw_array)->where('id', '!=', auth()->id())->get();
@ -157,12 +157,16 @@ class BulkUsersController extends Controller
$this->update_array['end_date'] = null; $this->update_array['end_date'] = null;
} }
if ($request->input('null_locale')=='1') {
$this->update_array['locale'] = null;
}
if (! $manager_conflict) { if (! $manager_conflict) {
$this->conditionallyAddItem('manager_id'); $this->conditionallyAddItem('manager_id');
} }
// Save the updated info // Save the updated info
User::whereIn('id', $user_raw_array) User::whereIn('id', $user_raw_array)
->where('id', '!=', Auth::id())->update($this->update_array); ->where('id', '!=', auth()->id())->update($this->update_array);
if (array_key_exists('location_id', $this->update_array)){ if (array_key_exists('location_id', $this->update_array)){
Asset::where('assigned_type', User::class) Asset::where('assigned_type', User::class)
@ -224,7 +228,7 @@ class BulkUsersController extends Controller
$user_raw_array = request('ids'); $user_raw_array = request('ids');
if (($key = array_search(Auth::id(), $user_raw_array)) !== false) { if (($key = array_search(auth()->id(), $user_raw_array)) !== false) {
unset($user_raw_array[$key]); unset($user_raw_array[$key]);
} }
@ -289,7 +293,7 @@ class BulkUsersController extends Controller
$logAction->item_type = $itemType; $logAction->item_type = $itemType;
$logAction->target_id = $item->assigned_to; $logAction->target_id = $item->assigned_to;
$logAction->target_type = User::class; $logAction->target_type = User::class;
$logAction->user_id = Auth::id(); $logAction->created_at = auth()->id();
$logAction->note = 'Bulk checkin items'; $logAction->note = 'Bulk checkin items';
$logAction->logaction('checkin from'); $logAction->logaction('checkin from');
} }
@ -303,7 +307,7 @@ class BulkUsersController extends Controller
$logAction->item_type = Accessory::class; $logAction->item_type = Accessory::class;
$logAction->target_id = $accessoryUserRow->assigned_to; $logAction->target_id = $accessoryUserRow->assigned_to;
$logAction->target_type = User::class; $logAction->target_type = User::class;
$logAction->user_id = Auth::id(); $logAction->created_at = auth()->id();
$logAction->note = 'Bulk checkin items'; $logAction->note = 'Bulk checkin items';
$logAction->logaction('checkin from'); $logAction->logaction('checkin from');
} }
@ -317,7 +321,7 @@ class BulkUsersController extends Controller
$logAction->item_type = Consumable::class; $logAction->item_type = Consumable::class;
$logAction->target_id = $consumableUserRow->assigned_to; $logAction->target_id = $consumableUserRow->assigned_to;
$logAction->target_type = User::class; $logAction->target_type = User::class;
$logAction->user_id = Auth::id(); $logAction->created_at = auth()->id();
$logAction->note = 'Bulk checkin items'; $logAction->note = 'Bulk checkin items';
$logAction->logaction('checkin from'); $logAction->logaction('checkin from');
} }

View file

@ -46,7 +46,7 @@ class UserFilesController extends Controller
$logAction = new Actionlog(); $logAction = new Actionlog();
$logAction->item_id = $user->id; $logAction->item_id = $user->id;
$logAction->item_type = User::class; $logAction->item_type = User::class;
$logAction->user_id = Auth::id(); $logAction->created_by = auth()->id();
$logAction->note = $request->input('notes'); $logAction->note = $request->input('notes');
$logAction->target_id = null; $logAction->target_id = null;
$logAction->created_at = date("Y-m-d H:i:s"); $logAction->created_at = date("Y-m-d H:i:s");

View file

@ -372,7 +372,7 @@ class UsersController extends Controller
$logaction->item_type = User::class; $logaction->item_type = User::class;
$logaction->item_id = $user->id; $logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s'); $logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = auth()->id(); $logaction->created_by = auth()->id();
$logaction->logaction('restore'); $logaction->logaction('restore');
// Redirect them to the deleted page if there are more, otherwise the section index // Redirect them to the deleted page if there are more, otherwise the section index

View file

@ -60,7 +60,7 @@ class ItemImportRequest extends FormRequest
$fieldMappings = array_change_key_case(array_flip($import->field_map), CASE_LOWER); $fieldMappings = array_change_key_case(array_flip($import->field_map), CASE_LOWER);
} }
$importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback']) $importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback'])
->setUserId(Auth::id()) ->setUserId(auth()->id())
->setUpdating($this->get('import-update')) ->setUpdating($this->get('import-update'))
->setShouldNotify($this->get('send-welcome')) ->setShouldNotify($this->get('send-welcome'))
->setUsernameFormat('firstname.lastname') ->setUsernameFormat('firstname.lastname')

View file

@ -9,6 +9,7 @@ use App\Models\Setting;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidFormatException;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
use App\Rules\AssetCannotBeCheckedOutToNondeployableStatus;
class StoreAssetRequest extends ImageUploadRequest class StoreAssetRequest extends ImageUploadRequest
{ {
@ -61,6 +62,7 @@ class StoreAssetRequest extends ImageUploadRequest
return array_merge( return array_merge(
$modelRules, $modelRules,
['status_id' => [new AssetCannotBeCheckedOutToNondeployableStatus()]],
parent::rules(), parent::rules(),
); );
} }

View file

@ -38,9 +38,12 @@ class AccessoriesTransformer
'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost), 'purchase_cost' => Helper::formatCurrencyOutput($accessory->purchase_cost),
'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null,
'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null,
'remaining_qty' => (int) $accessory->numRemaining(), 'remaining_qty' => (int) ($accessory->qty - $accessory->checkouts_count),
'checkouts_count' => $accessory->checkouts_count, 'checkouts_count' => $accessory->checkouts_count,
'created_by' => ($accessory->adminuser) ? [
'id' => (int) $accessory->adminuser->id,
'name'=> e($accessory->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($accessory->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($accessory->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($accessory->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($accessory->updated_at, 'datetime'),
@ -57,7 +60,7 @@ class AccessoriesTransformer
$permissions_array['user_can_checkout'] = false; $permissions_array['user_can_checkout'] = false;
if ($accessory->numRemaining() > 0) { if (($accessory->qty - $accessory->checkouts_count) > 0) {
$permissions_array['user_can_checkout'] = true; $permissions_array['user_can_checkout'] = true;
} }

View file

@ -176,11 +176,17 @@ class ActionlogsTransformer
'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(null, $actionlog->item), 'date'): null, 'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(null, $actionlog->item), 'date'): null,
'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item), 'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item),
'action_type' => $actionlog->present()->actionType(), 'action_type' => $actionlog->present()->actionType(),
'admin' => ($actionlog->admin) ? [ 'admin' => ($actionlog->adminuser) ? [
'id' => (int) $actionlog->admin->id, 'id' => (int) $actionlog->adminuser->id,
'name' => e($actionlog->admin->getFullNameAttribute()), 'name' => e($actionlog->adminuser->getFullNameAttribute()),
'first_name'=> e($actionlog->admin->first_name), 'first_name'=> e($actionlog->adminuser->first_name),
'last_name'=> e($actionlog->admin->last_name) 'last_name'=> e($actionlog->adminuser->last_name)
] : null,
'created_by' => ($actionlog->adminuser) ? [
'id' => (int) $actionlog->adminuser->id,
'name' => e($actionlog->adminuser->getFullNameAttribute()),
'first_name'=> e($actionlog->adminuser->first_name),
'last_name'=> e($actionlog->adminuser->last_name)
] : null, ] : null,
'target' => ($actionlog->target) ? [ 'target' => ($actionlog->target) ? [
'id' => (int) $actionlog->target->id, 'id' => (int) $actionlog->target->id,

View file

@ -64,7 +64,14 @@ class AssetMaintenancesTransformer
'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'date'), 'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'date'),
'asset_maintenance_time' => $assetmaintenance->asset_maintenance_time, 'asset_maintenance_time' => $assetmaintenance->asset_maintenance_time,
'completion_date' => Helper::getFormattedDateObject($assetmaintenance->completion_date, 'date'), 'completion_date' => Helper::getFormattedDateObject($assetmaintenance->completion_date, 'date'),
'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id, 'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null, 'user_id' => ($assetmaintenance->adminuser) ? [
'id' => $assetmaintenance->adminuser->id,
'name'=> e($assetmaintenance->admin->getFullNameAttribute())
] : null, // legacy to not change the shape of the API
'created_by' => ($assetmaintenance->adminuser) ? [
'id' => (int) $assetmaintenance->adminuser->id,
'name'=> e($assetmaintenance->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'),
'is_warranty'=> $assetmaintenance->is_warranty, 'is_warranty'=> $assetmaintenance->is_warranty,

View file

@ -80,6 +80,10 @@ class AssetsTransformer
'assigned_to' => $this->transformAssignedTo($asset), 'assigned_to' => $this->transformAssignedTo($asset),
'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months.' '.trans('admin/hardware/form.months')) : null, 'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months.' '.trans('admin/hardware/form.months')) : null,
'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null,
'created_by' => ($asset->adminuser) ? [
'id' => (int) $asset->adminuser->id,
'name'=> e($asset->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'),
'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime'), 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime'),

View file

@ -62,6 +62,10 @@ class CategoriesTransformer
'consumables_count' => (int) $category->consumables_count, 'consumables_count' => (int) $category->consumables_count,
'components_count' => (int) $category->components_count, 'components_count' => (int) $category->components_count,
'licenses_count' => (int) $category->licenses_count, 'licenses_count' => (int) $category->licenses_count,
'created_by' => ($category->adminuser) ? [
'id' => (int) $category->adminuser->id,
'name'=> e($category->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($category->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($category->updated_at, 'datetime'),
]; ];

View file

@ -30,14 +30,18 @@ class CompaniesTransformer
'fax' => ($company->fax!='') ? e($company->fax): null, 'fax' => ($company->fax!='') ? e($company->fax): null,
'email' => ($company->email!='') ? e($company->email): null, 'email' => ($company->email!='') ? e($company->email): null,
'image' => ($company->image) ? Storage::disk('public')->url('companies/'.e($company->image)) : null, 'image' => ($company->image) ? Storage::disk('public')->url('companies/'.e($company->image)) : null,
'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'),
'assets_count' => (int) $company->assets_count, 'assets_count' => (int) $company->assets_count,
'licenses_count' => (int) $company->licenses_count, 'licenses_count' => (int) $company->licenses_count,
'accessories_count' => (int) $company->accessories_count, 'accessories_count' => (int) $company->accessories_count,
'consumables_count' => (int) $company->consumables_count, 'consumables_count' => (int) $company->consumables_count,
'components_count' => (int) $company->components_count, 'components_count' => (int) $company->components_count,
'users_count' => (int) $company->users_count, 'users_count' => (int) $company->users_count,
'created_by' => ($company->adminuser) ? [
'id' => (int) $company->adminuser->id,
'name'=> e($company->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'),
]; ];
$permissions_array['available_actions'] = [ $permissions_array['available_actions'] = [

View file

@ -47,6 +47,10 @@ class ComponentsTransformer
'name' => e($component->company->name), 'name' => e($component->company->name),
] : null, ] : null,
'notes' => ($component->notes) ? Helper::parseEscapedMarkedownInline($component->notes) : null, 'notes' => ($component->notes) ? Helper::parseEscapedMarkedownInline($component->notes) : null,
'created_by' => ($component->adminuser) ? [
'id' => (int) $component->adminuser->id,
'name'=> e($component->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'),
'user_can_checkout' => ($component->numRemaining() > 0) ? 1 : 0, 'user_can_checkout' => ($component->numRemaining() > 0) ? 1 : 0,

View file

@ -40,6 +40,10 @@ class ConsumablesTransformer
'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'), 'purchase_date' => Helper::getFormattedDateObject($consumable->purchase_date, 'date'),
'qty' => (int) $consumable->qty, 'qty' => (int) $consumable->qty,
'notes' => ($consumable->notes) ? Helper::parseEscapedMarkedownInline($consumable->notes) : null, 'notes' => ($consumable->notes) ? Helper::parseEscapedMarkedownInline($consumable->notes) : null,
'created_by' => ($consumable->adminuser) ? [
'id' => (int) $consumable->adminuser->id,
'name'=> e($consumable->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($consumable->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($consumable->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($consumable->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($consumable->updated_at, 'datetime'),
]; ];

View file

@ -31,6 +31,10 @@ class DepreciationsTransformer
'assets_count' => $depreciation->assets_count, 'assets_count' => $depreciation->assets_count,
'models_count' => $depreciation->models_count, 'models_count' => $depreciation->models_count,
'licenses_count' => $depreciation->licenses_count, 'licenses_count' => $depreciation->licenses_count,
'created_by' => ($depreciation->adminuser) ? [
'id' => (int) $depreciation->adminuser->id,
'name'=> e($depreciation->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($depreciation->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($depreciation->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($depreciation->updated_at, 'datetime') 'updated_at' => Helper::getFormattedDateObject($depreciation->updated_at, 'datetime')
]; ];

View file

@ -26,7 +26,10 @@ class GroupsTransformer
'name' => e($group->name), 'name' => e($group->name),
'permissions' => json_decode($group->permissions), 'permissions' => json_decode($group->permissions),
'users_count' => (int) $group->users_count, 'users_count' => (int) $group->users_count,
'created_by' => ($group->admin) ? e($group->admin->present()->fullName) : null, 'created_by' => ($group->adminuser) ? [
'id' => (int) $group->adminuser->id,
'name'=> e($group->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($group->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($group->updated_at, 'datetime'),
]; ];

View file

@ -61,7 +61,7 @@ class LicensesTransformer
'checkin' => Gate::allows('checkin', License::class), 'checkin' => Gate::allows('checkin', License::class),
'clone' => Gate::allows('create', License::class), 'clone' => Gate::allows('create', License::class),
'update' => Gate::allows('update', License::class), 'update' => Gate::allows('update', License::class),
'delete' => (Gate::allows('delete', License::class) && ($license->seats == $license->availCount()->count())) ? true : false, 'delete' => (Gate::allows('delete', License::class) && ($license->free_seats_count > 0)) ? true : false,
]; ];
$array += $permissions_array; $array += $permissions_array;

View file

@ -36,6 +36,10 @@ class ManufacturersTransformer
'licenses_count' => (int) $manufacturer->licenses_count, 'licenses_count' => (int) $manufacturer->licenses_count,
'consumables_count' => (int) $manufacturer->consumables_count, 'consumables_count' => (int) $manufacturer->consumables_count,
'accessories_count' => (int) $manufacturer->accessories_count, 'accessories_count' => (int) $manufacturer->accessories_count,
'created_by' => ($manufacturer->adminuser) ? [
'id' => (int) $manufacturer->adminuser->id,
'name'=> e($manufacturer->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($manufacturer->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($manufacturer->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($manufacturer->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($manufacturer->updated_at, 'datetime'),
'deleted_at' => Helper::getFormattedDateObject($manufacturer->deleted_at, 'datetime'), 'deleted_at' => Helper::getFormattedDateObject($manufacturer->deleted_at, 'datetime'),

View file

@ -2,6 +2,7 @@
namespace App\Http\Transformers; namespace App\Http\Transformers;
use App\Helpers\Helper;
use App\Models\PredefinedKit; use App\Models\PredefinedKit;
use App\Models\SnipeModel; use App\Models\SnipeModel;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
@ -30,6 +31,12 @@ class PredefinedKitsTransformer
$array = [ $array = [
'id' => (int) $kit->id, 'id' => (int) $kit->id,
'name' => e($kit->name), 'name' => e($kit->name),
'created_by' => ($kit->adminuser) ? [
'id' => (int) $kit->adminuser->id,
'name'=> e($kit->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($kit->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($kit->updated_at, 'datetime'),
]; ];
$permissions_array['available_actions'] = [ $permissions_array['available_actions'] = [

View file

@ -30,6 +30,10 @@ class StatuslabelsTransformer
'default_label' => ($statuslabel->default_label == '1') ? true : false, 'default_label' => ($statuslabel->default_label == '1') ? true : false,
'assets_count' => (int) $statuslabel->assets_count, 'assets_count' => (int) $statuslabel->assets_count,
'notes' => e($statuslabel->notes), 'notes' => e($statuslabel->notes),
'created_by' => ($statuslabel->adminuser) ? [
'id' => (int) $statuslabel->adminuser->id,
'name'=> e($statuslabel->adminuser->present()->fullName()),
] : null,
'created_at' => Helper::getFormattedDateObject($statuslabel->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($statuslabel->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($statuslabel->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($statuslabel->updated_at, 'datetime'),
]; ];

View file

@ -177,7 +177,7 @@ class AssetImporter extends ItemImporter
$this->log('Asset '.$this->item['name'].' with serial number '.$this->item['serial'].' was created'); $this->log('Asset '.$this->item['name'].' with serial number '.$this->item['serial'].' was created');
// If we have a target to checkout to, lets do so. // If we have a target to checkout to, lets do so.
//-- user_id is a property of the abstract class Importer, which this class inherits from and it's set by //-- created_by is a property of the abstract class Importer, which this class inherits from and it's set by
//-- the class that needs to use it (command importer or GUI importer inside the project). //-- the class that needs to use it (command importer or GUI importer inside the project).
if (isset($target) && ($target !== false)) { if (isset($target) && ($target !== false)) {
if (!is_null($asset->assigned_to)){ if (!is_null($asset->assigned_to)){
@ -186,7 +186,7 @@ class AssetImporter extends ItemImporter
} }
} }
$asset->fresh()->checkOut($target, $this->user_id, $checkout_date, null, 'Checkout from CSV Importer', $asset->name); $asset->fresh()->checkOut($target, $this->created_by, $checkout_date, null, 'Checkout from CSV Importer', $asset->name);
} }
return; return;

View file

@ -58,7 +58,7 @@ class ComponentImporter extends ItemImporter
if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) { if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) {
$component->assets()->attach($component->id, [ $component->assets()->attach($component->id, [
'component_id' => $component->id, 'component_id' => $component->id,
'user_id' => $this->user_id, 'created_by' => $this->created_by,
'created_at' => date('Y-m-d H:i:s'), 'created_at' => date('Y-m-d H:i:s'),
'assigned_qty' => 1, // Only assign the first one to the asset 'assigned_qty' => 1, // Only assign the first one to the asset
'asset_id' => $asset->id, 'asset_id' => $asset->id,

View file

@ -22,7 +22,7 @@ abstract class Importer
* @var * @var
*/ */
protected $user_id; protected $created_by;
/** /**
* Are we updating items in the import * Are we updating items in the import
* @var bool * @var bool
@ -395,7 +395,7 @@ abstract class Importer
} }
/** /**
* Matches a user by user_id if user_name provided is a number * Matches a user by created_by if user_name provided is a number
* @param string $user_name users full name from csv * @param string $user_name users full name from csv
* @return User User Matching ID * @return User User Matching ID
*/ */
@ -412,13 +412,13 @@ abstract class Importer
/** /**
* Sets the Id of User performing import. * Sets the Id of User performing import.
* *
* @param mixed $user_id the user id * @param mixed $created_by the user id
* *
* @return self * @return self
*/ */
public function setUserId($user_id) public function setUserId($created_by)
{ {
$this->user_id = $user_id; $this->created_by = $created_by;
return $this; return $this;
} }

View file

@ -94,7 +94,7 @@ class ItemImporter extends Importer
$this->item['qty'] = $this->findCsvMatch($row, 'quantity'); $this->item['qty'] = $this->findCsvMatch($row, 'quantity');
$this->item['requestable'] = $this->findCsvMatch($row, 'requestable'); $this->item['requestable'] = $this->findCsvMatch($row, 'requestable');
$this->item['user_id'] = $this->user_id; $this->item['created_by'] = $this->created_by;
$this->item['serial'] = $this->findCsvMatch($row, 'serial'); $this->item['serial'] = $this->findCsvMatch($row, 'serial');
// NO need to call this method if we're running the user import. // NO need to call this method if we're running the user import.
// TODO: Merge these methods. // TODO: Merge these methods.
@ -301,7 +301,7 @@ class ItemImporter extends Importer
$category = new Category(); $category = new Category();
$category->name = $asset_category; $category->name = $asset_category;
$category->category_type = $item_type; $category->category_type = $item_type;
$category->user_id = $this->user_id; $category->created_by = $this->created_by;
if ($category->save()) { if ($category->save()) {
$this->log('Category '.$asset_category.' was created'); $this->log('Category '.$asset_category.' was created');
@ -425,7 +425,7 @@ class ItemImporter extends Importer
//Otherwise create a manufacturer. //Otherwise create a manufacturer.
$manufacturer = new Manufacturer(); $manufacturer = new Manufacturer();
$manufacturer->name = trim($item_manufacturer); $manufacturer->name = trim($item_manufacturer);
$manufacturer->user_id = $this->user_id; $manufacturer->created_by = $this->created_by;
if ($manufacturer->save()) { if ($manufacturer->save()) {
$this->log('Manufacturer '.$manufacturer->name.' was created'); $this->log('Manufacturer '.$manufacturer->name.' was created');
@ -466,7 +466,7 @@ class ItemImporter extends Importer
$location->city = ''; $location->city = '';
$location->state = ''; $location->state = '';
$location->country = ''; $location->country = '';
$location->user_id = $this->user_id; $location->created_by = $this->created_by;
if ($location->save()) { if ($location->save()) {
$this->log('Location '.$asset_location.' was created'); $this->log('Location '.$asset_location.' was created');
@ -502,7 +502,7 @@ class ItemImporter extends Importer
$supplier = new Supplier(); $supplier = new Supplier();
$supplier->name = $item_supplier; $supplier->name = $item_supplier;
$supplier->user_id = $this->user_id; $supplier->created_by = $this->created_by;
if ($supplier->save()) { if ($supplier->save()) {
$this->log('Supplier '.$item_supplier.' was created'); $this->log('Supplier '.$item_supplier.' was created');

View file

@ -103,13 +103,13 @@ class LicenseImporter extends ItemImporter
if ($checkout_target) { if ($checkout_target) {
$targetLicense->assigned_to = $checkout_target->id; $targetLicense->assigned_to = $checkout_target->id;
$targetLicense->user_id = Auth::id(); $targetLicense->created_by = auth()->id();
if ($asset) { if ($asset) {
$targetLicense->asset_id = $asset->id; $targetLicense->asset_id = $asset->id;
} }
$targetLicense->save(); $targetLicense->save();
} elseif ($asset) { } elseif ($asset) {
$targetLicense->user_id = Auth::id(); $targetLicense->created_by = auth()->id();
$targetLicense->asset_id = $asset->id; $targetLicense->asset_id = $asset->id;
$targetLicense->save(); $targetLicense->save();
} }

View file

@ -65,7 +65,7 @@ class LocationImporter extends ItemImporter
$this->item['ldap_ou'] = trim($this->findCsvMatch($row, 'ldap_ou')); $this->item['ldap_ou'] = trim($this->findCsvMatch($row, 'ldap_ou'));
$this->item['manager'] = trim($this->findCsvMatch($row, 'manager')); $this->item['manager'] = trim($this->findCsvMatch($row, 'manager'));
$this->item['manager_username'] = trim($this->findCsvMatch($row, 'manager_username')); $this->item['manager_username'] = trim($this->findCsvMatch($row, 'manager_username'));
$this->item['user_id'] = auth()->id(); $this->item['created_by'] = auth()->id();
if ($this->findCsvMatch($row, 'parent_location')) { if ($this->findCsvMatch($row, 'parent_location')) {
$this->item['parent_id'] = $this->createOrFetchLocation(trim($this->findCsvMatch($row, 'parent_location'))); $this->item['parent_id'] = $this->createOrFetchLocation(trim($this->findCsvMatch($row, 'parent_location')));

View file

@ -165,7 +165,7 @@ class UserImporter extends ItemImporter
$department = new department(); $department = new department();
$department->name = $department_name; $department->name = $department_name;
$department->user_id = $this->user_id; $department->created_by = $this->created_by;
if ($department->save()) { if ($department->save()) {
$this->log('department ' . $department_name . ' was created'); $this->log('department ' . $department_name . ' was created');

View file

@ -111,7 +111,7 @@ class LogListener
$logaction->target_type = User::class; $logaction->target_type = User::class;
$logaction->action_type = 'merged'; $logaction->action_type = 'merged';
$logaction->note = trans('general.merged_log_this_user_from', $to_from_array); $logaction->note = trans('general.merged_log_this_user_from', $to_from_array);
$logaction->user_id = $event->admin->id ?? null; $logaction->created_by = $event->admin->id ?? null;
$logaction->save(); $logaction->save();
// Add a record to the users being merged TO // Add a record to the users being merged TO
@ -122,7 +122,7 @@ class LogListener
$logaction->item_type = User::class; $logaction->item_type = User::class;
$logaction->action_type = 'merged'; $logaction->action_type = 'merged';
$logaction->note = trans('general.merged_log_this_user_into', $to_from_array); $logaction->note = trans('general.merged_log_this_user_into', $to_from_array);
$logaction->user_id = $event->admin->id ?? null; $logaction->created_by = $event->admin->id ?? null;
$logaction->save(); $logaction->save();

View file

@ -2,6 +2,8 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\CustomField;
use Livewire\Attributes\Computed;
use Livewire\Component; use Livewire\Component;
use App\Models\CustomFieldset; use App\Models\CustomFieldset;
@ -12,37 +14,95 @@ class CustomFieldSetDefaultValuesForModel extends Component
public $add_default_values; public $add_default_values;
public $fieldset_id; public $fieldset_id;
public $fields;
public $model_id; public $model_id;
public function mount() public array $selectedValues = [];
public function mount($model_id = null)
{ {
if(is_null($this->model_id)){ $this->model_id = $model_id;
return; $this->fieldset_id = $this->model?->fieldset_id;
$this->add_default_values = ($this->model?->defaultValues->count() > 0);
$this->initializeSelectedValuesArray();
$this->populatedSelectedValuesArray();
} }
$this->model = AssetModel::find($this->model_id); // It's possible to do some clever route-model binding here, but let's keep it simple, shall we? #[Computed]
$this->fieldset_id = $this->model->fieldset_id; public function model()
$this->fields = null;
if ($fieldset = CustomFieldset::find($this->fieldset_id)) {
$this->fields = CustomFieldset::find($this->fieldset_id)->fields;
}
$this->add_default_values = ($this->model->defaultValues->count() > 0);
}
public function updatedFieldsetId()
{ {
if (CustomFieldset::find($this->fieldset_id)) { return AssetModel::find($this->model_id);
$this->fields = CustomFieldset::find($this->fieldset_id)->fields;
} }
#[Computed]
public function fields()
{
$customFieldset = CustomFieldset::find($this->fieldset_id);
if ($customFieldset) {
return $customFieldset?->fields;
}
return collect();
} }
public function render() public function render()
{ {
return view('livewire.custom-field-set-default-values-for-model'); return view('livewire.custom-field-set-default-values-for-model');
} }
/**
* Livewire property binding plays nicer with arrays when it knows
* which keys will be present instead of them being
* dynamically added (this is especially true for checkboxes).
*
* Let's go ahead and initialize selectedValues with all the potential keys (custom field db_columns).
*
* @return void
*/
private function initializeSelectedValuesArray(): void
{
CustomField::all()->each(function ($field) {
$this->selectedValues[$field->db_column] = null;
if ($field->element === 'checkbox') {
$this->selectedValues[$field->db_column] = [];
}
});
}
/**
* Populate the selectedValues array with the
* default values or old input for each field.
*
* @return void
*/
private function populatedSelectedValuesArray(): void
{
$this->fields->each(function ($field) {
$this->selectedValues[$field->db_column] = $this->getSelectedValueForField($field);
});
}
private function getSelectedValueForField(CustomField $field)
{
$defaultValue = $field->defaultValue($this->model_id);
// if old() contains a value for default_values that means
// the user has submitted the form and we were redirected
// back with the old input.
// Let's use what they had previously set.
if (old('default_values')) {
$defaultValue = old('default_values.' . $field->id);
}
// on first load the default value for checkboxes will be
// a comma-separated string but if we're loading the page
// with old input then it was already parsed into an array.
if ($field->element === 'checkbox' && is_string($defaultValue)) {
$defaultValue = explode(', ', $defaultValue);
}
return $defaultValue;
}
} }

View file

@ -47,10 +47,10 @@ class OauthClients extends Component
{ {
// test for safety // test for safety
// ->delete must be of type Client - thus the model binding // ->delete must be of type Client - thus the model binding
if ($clientId->user_id == auth()->id()) { if ($clientId->created_by == auth()->id()) {
app(ClientRepository::class)->delete($clientId); app(ClientRepository::class)->delete($clientId);
} else { } else {
Log::warning('User ' . auth()->id() . ' attempted to delete client ' . $clientId->id . ' which belongs to user ' . $clientId->user_id); Log::warning('User ' . auth()->id() . ' attempted to delete client ' . $clientId->id . ' which belongs to user ' . $clientId->created_by);
$this->authorizationError = 'You are not authorized to delete this client.'; $this->authorizationError = 'You are not authorized to delete this client.';
} }
} }
@ -58,10 +58,10 @@ class OauthClients extends Component
public function deleteToken($tokenId): void public function deleteToken($tokenId): void
{ {
$token = app(TokenRepository::class)->find($tokenId); $token = app(TokenRepository::class)->find($tokenId);
if ($token->user_id == auth()->id()) { if ($token->created_by == auth()->id()) {
app(TokenRepository::class)->revokeAccessToken($tokenId); app(TokenRepository::class)->revokeAccessToken($tokenId);
} else { } else {
Log::warning('User ' . auth()->id() . ' attempted to delete token ' . $tokenId . ' which belongs to user ' . $token->user_id); Log::warning('User ' . auth()->id() . ' attempted to delete token ' . $tokenId . ' which belongs to user ' . $token->created_by);
$this->authorizationError = 'You are not authorized to delete this token.'; $this->authorizationError = 'You are not authorized to delete this token.';
} }
} }
@ -84,12 +84,12 @@ class OauthClients extends Component
]); ]);
$client = app(ClientRepository::class)->find($editClientId->id); $client = app(ClientRepository::class)->find($editClientId->id);
if ($client->user_id == auth()->id()) { if ($client->created_by == auth()->id()) {
$client->name = $this->editName; $client->name = $this->editName;
$client->redirect = $this->editRedirect; $client->redirect = $this->editRedirect;
$client->save(); $client->save();
} else { } else {
Log::warning('User ' . auth()->id() . ' attempted to edit client ' . $editClientId->id . ' which belongs to user ' . $client->user_id); Log::warning('User ' . auth()->id() . ' attempted to edit client ' . $editClientId->id . ' which belongs to user ' . $client->created_by);
$this->authorizationError = 'You are not authorized to edit this client.'; $this->authorizationError = 'You are not authorized to edit this client.';
} }

View file

@ -259,6 +259,18 @@ class Accessory extends SnipeModel
->with('assignedTo'); ->with('assignedTo');
} }
/**
* Establishes the accessory -> admin user relationship
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v7.0.13]
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* Checks whether or not the accessory has users * Checks whether or not the accessory has users
* *
@ -410,6 +422,16 @@ class Accessory extends SnipeModel
* ----------------------------------------------- * -----------------------------------------------
**/ **/
/**
* Query builder scope to order on created_by name
*
*/
public function scopeOrderByCreatedByName($query, $order)
{
return $query->leftJoin('users as admin_sort', 'accessories.created_by', '=', 'admin_sort.id')->select('accessories.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
/** /**
* Query builder scope to order on company * Query builder scope to order on company
* *

View file

@ -22,7 +22,7 @@ class AccessoryCheckout extends Model
{ {
use Searchable; use Searchable;
protected $fillable = ['user_id', 'accessory_id', 'assigned_to', 'assigned_type', 'note']; protected $fillable = ['created_by', 'accessory_id', 'assigned_to', 'assigned_type', 'note'];
protected $table = 'accessories_checkout'; protected $table = 'accessories_checkout';
/** /**

View file

@ -21,7 +21,7 @@ class Actionlog extends SnipeModel
// This is to manually set the source (via setActionSource()) for determineActionSource() // This is to manually set the source (via setActionSource()) for determineActionSource()
protected ?string $source = null; protected ?string $source = null;
protected $with = ['admin']; protected $with = ['adminuser'];
protected $presenter = \App\Presenters\ActionlogPresenter::class; protected $presenter = \App\Presenters\ActionlogPresenter::class;
use SoftDeletes; use SoftDeletes;
@ -32,7 +32,7 @@ class Actionlog extends SnipeModel
protected $fillable = [ protected $fillable = [
'created_at', 'created_at',
'item_type', 'item_type',
'user_id', 'created_by',
'item_id', 'item_id',
'action_type', 'action_type',
'note', 'note',
@ -52,7 +52,7 @@ class Actionlog extends SnipeModel
'action_type', 'action_type',
'note', 'note',
'log_meta', 'log_meta',
'user_id', 'created_by',
'remote_ip', 'remote_ip',
'user_agent', 'user_agent',
'action_source' 'action_source'
@ -65,7 +65,7 @@ class Actionlog extends SnipeModel
*/ */
protected $searchableRelations = [ protected $searchableRelations = [
'company' => ['name'], 'company' => ['name'],
'admin' => ['first_name','last_name','username', 'email'], 'adminuser' => ['first_name','last_name','username', 'email'],
'user' => ['first_name','last_name','username', 'email'], 'user' => ['first_name','last_name','username', 'email'],
'assets' => ['asset_tag','name'], 'assets' => ['asset_tag','name'],
]; ];
@ -198,9 +198,9 @@ class Actionlog extends SnipeModel
* @since [v3.0] * @since [v3.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(User::class, 'user_id') return $this->belongsTo(User::class, 'created_by')
->withTrashed(); ->withTrashed();
} }
@ -374,8 +374,8 @@ class Actionlog extends SnipeModel
$this->source = $source; $this->source = $source;
} }
public function scopeOrderAdmin($query, $order) public function scopeOrderByCreatedBy($query, $order)
{ {
return $query->leftJoin('users as admin_sort', 'action_logs.user_id', '=', 'admin_sort.id')->select('action_logs.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); return $query->leftJoin('users as admin_sort', 'action_logs.created_by', '=', 'admin_sort.id')->select('action_logs.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
} }
} }

View file

@ -30,7 +30,7 @@ class Asset extends Depreciable
{ {
protected $presenter = AssetPresenter::class; protected $presenter = AssetPresenter::class;
protected $with = ['model', 'admin']; protected $with = ['model', 'adminuser'];
use CompanyableTrait; use CompanyableTrait;
use HasFactory, Loggable, Requestable, Presentable, SoftDeletes, ValidatingTrait, UniqueUndeletedTrait; use HasFactory, Loggable, Requestable, Presentable, SoftDeletes, ValidatingTrait, UniqueUndeletedTrait;
@ -108,7 +108,6 @@ class Asset extends Depreciable
'expected_checkin' => ['nullable', 'date'], 'expected_checkin' => ['nullable', 'date'],
'last_audit_date' => ['nullable', 'date_format:Y-m-d H:i:s'], 'last_audit_date' => ['nullable', 'date_format:Y-m-d H:i:s'],
'next_audit_date' => ['nullable', 'date'], 'next_audit_date' => ['nullable', 'date'],
//'after:last_audit_date'],
'location_id' => ['nullable', 'exists:locations,id'], 'location_id' => ['nullable', 'exists:locations,id'],
'rtd_location_id' => ['nullable', 'exists:locations,id'], 'rtd_location_id' => ['nullable', 'exists:locations,id'],
'purchase_date' => ['nullable', 'date', 'date_format:Y-m-d'], 'purchase_date' => ['nullable', 'date', 'date_format:Y-m-d'],
@ -710,15 +709,15 @@ class Asset extends Depreciable
} }
/** /**
* Get action logs history for this asset * Get user who created the item
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'user_id'); return $this->belongsTo(\App\Models\User::class, 'created_by');
} }
@ -931,9 +930,20 @@ class Asset extends Depreciable
* */ * */
public function checkInvalidNextAuditDate() public function checkInvalidNextAuditDate()
{ {
if (($this->last_audit_date) && ($this->next_audit_date) && ($this->last_audit_date > $this->next_audit_date)) {
// Deliberately parse the dates as Y-m-d (without H:i:s) to compare them
if ($this->last_audit_date) {
$last = Carbon::parse($this->last_audit_date)->format('Y-m-d');
}
if ($this->next_audit_date) {
$next = Carbon::parse($this->next_audit_date)->format('Y-m-d');
}
if ((isset($last) && (isset($next))) && ($last > $next)) {
return true; return true;
} }
return false; return false;
} }
@ -950,11 +960,12 @@ class Asset extends Depreciable
{ {
if (($this->model) && ($this->model->category)) { if (($this->model) && ($this->model->category)) {
if ($this->model->category->eula_text) { if (($this->model->category->eula_text) && ($this->model->category->use_default_eula === 0)) {
return Helper::parseEscapedMarkedown($this->model->category->eula_text); return Helper::parseEscapedMarkedown($this->model->category->eula_text);
} elseif ($this->model->category->use_default_eula == '1') { } elseif ($this->model->category->use_default_eula === 1) {
return Helper::parseEscapedMarkedown(Setting::getSettings()->default_eula_text); return Helper::parseEscapedMarkedown(Setting::getSettings()->default_eula_text);
} else { } else {
return false; return false;
} }
} }
@ -1760,6 +1771,20 @@ class Asset extends Depreciable
} }
/**
* Query builder scope to order on created_by name
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
* @param text $order Order
*
* @return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderByCreatedByName($query, $order)
{
return $query->leftJoin('users as admin_sort', 'assets.created_by', '=', 'admin_sort.id')->select('assets.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
/** /**
* Query builder scope to order on assigned user * Query builder scope to order on assigned user
* *

View file

@ -174,7 +174,7 @@ class AssetMaintenance extends Model implements ICompanyableChild
* @author A. Gianotto <snipe@snipe.net> * @author A. Gianotto <snipe@snipe.net>
* @version v3.0 * @version v3.0
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'user_id') return $this->belongsTo(\App\Models\User::class, 'user_id')
->withTrashed(); ->withTrashed();
@ -207,20 +207,6 @@ class AssetMaintenance extends Model implements ICompanyableChild
} }
/**
* Query builder scope to order on admin user
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
* @param string $order Order
*
* @return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderAdmin($query, $order)
{
return $query->leftJoin('users', 'asset_maintenances.user_id', '=', 'users.id')
->orderBy('users.first_name', $order)
->orderBy('users.last_name', $order);
}
/** /**
* Query builder scope to order on asset tag * Query builder scope to order on asset tag
@ -278,4 +264,12 @@ class AssetMaintenance extends Model implements ICompanyableChild
->leftjoin('status_labels as maintained_asset_status', 'maintained_asset_status.id', '=', 'maintained_asset.status_id') ->leftjoin('status_labels as maintained_asset_status', 'maintained_asset_status.id', '=', 'maintained_asset.status_id')
->orderBy('maintained_asset_status.name', $order); ->orderBy('maintained_asset_status.name', $order);
} }
/**
* Query builder scope to order on the user that created it
*/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'asset_maintenances.created_by', '=', 'admin_sort.id')->select('asset_maintenances.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -36,7 +36,6 @@ class AssetModel extends SnipeModel
protected $injectUniqueIdentifier = true; protected $injectUniqueIdentifier = true;
use ValidatingTrait; use ValidatingTrait;
protected $table = 'models'; protected $table = 'models';
protected $hidden = ['user_id', 'deleted_at'];
protected $presenter = AssetModelPresenter::class; protected $presenter = AssetModelPresenter::class;
// Declare the rules for the model validation // Declare the rules for the model validation
@ -69,7 +68,6 @@ class AssetModel extends SnipeModel
'model_number', 'model_number',
'name', 'name',
'notes', 'notes',
'user_id',
]; ];
use Searchable; use Searchable;
@ -226,6 +224,18 @@ class AssetModel extends SnipeModel
->orderBy('created_at', 'desc'); ->orderBy('created_at', 'desc');
} }
/**
* Get user who created the item
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* ----------------------------------------------- * -----------------------------------------------

View file

@ -29,17 +29,17 @@ class Category extends SnipeModel
use SoftDeletes; use SoftDeletes;
protected $table = 'categories'; protected $table = 'categories';
protected $hidden = ['user_id', 'deleted_at']; protected $hidden = ['created_by', 'deleted_at'];
protected $casts = [ protected $casts = [
'user_id' => 'integer', 'created_by' => 'integer',
]; ];
/** /**
* Category validation rules * Category validation rules
*/ */
public $rules = [ public $rules = [
'user_id' => 'numeric|nullable', 'created_by' => 'numeric|nullable',
'name' => 'required|min:1|max:255|two_column_unique_undeleted:category_type', 'name' => 'required|min:1|max:255|two_column_unique_undeleted:category_type',
'require_acceptance' => 'boolean', 'require_acceptance' => 'boolean',
'use_default_eula' => 'boolean', 'use_default_eula' => 'boolean',
@ -70,7 +70,7 @@ class Category extends SnipeModel
'name', 'name',
'require_acceptance', 'require_acceptance',
'use_default_eula', 'use_default_eula',
'user_id', 'created_by',
]; ];
use Searchable; use Searchable;
@ -228,6 +228,11 @@ class Category extends SnipeModel
return $this->hasMany(\App\Models\AssetModel::class, 'category_id'); return $this->hasMany(\App\Models\AssetModel::class, 'category_id');
} }
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* Checks for a category-specific EULA, and if that doesn't exist, * Checks for a category-specific EULA, and if that doesn't exist,
* checks for a settings level EULA * checks for a settings level EULA
@ -286,4 +291,9 @@ class Category extends SnipeModel
{ {
return $query->where('require_acceptance', '=', true); return $query->where('require_acceptance', '=', true);
} }
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'categories.created_by', '=', 'admin_sort.id')->select('categories.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -13,7 +13,7 @@ class CheckoutRequest extends Model
public function user() public function user()
{ {
return $this->belongsTo(User::class); return $this->belongsTo(User::class, 'user_id', 'id');
} }
public function requestingUser() public function requestingUser()

View file

@ -67,6 +67,7 @@ final class Company extends SnipeModel
'phone', 'phone',
'fax', 'fax',
'email', 'email',
'created_by'
]; ];
private static function isFullMultipleCompanySupportEnabled() private static function isFullMultipleCompanySupportEnabled()
@ -186,12 +187,15 @@ final class Company extends SnipeModel
*/ */
public function isDeletable() public function isDeletable()
{ {
return Gate::allows('delete', $this) return Gate::allows('delete', $this)
&& ($this->assets()->count() === 0) && (($this->assets_count ?? $this->assets()->count()) === 0)
&& ($this->accessories()->count() === 0) && (($this->accessories_count ?? $this->accessories()->count()) === 0)
&& ($this->consumables()->count() === 0) && (($this->licenses_count ?? $this->licenses()->count()) === 0)
&& ($this->components()->count() === 0) && (($this->components_count ?? $this->components()->count()) === 0)
&& ($this->users()->count() === 0); && (($this->consumables_count ?? $this->consumables()->count()) === 0)
&& (($this->accessories_count ?? $this->accessories()->count()) === 0)
&& (($this->users_count ?? $this->users()->count()) === 0);
} }
/** /**
@ -294,6 +298,12 @@ final class Company extends SnipeModel
} }
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* I legit do not know what this method does, but we can't remove it (yet). * I legit do not know what this method does, but we can't remove it (yet).
* *
@ -329,4 +339,13 @@ final class Company extends SnipeModel
} }
} }
/**
* Query builder scope to order on the user that created it
*/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'companies.created_by', '=', 'admin_sort.id')->select('companies.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -130,7 +130,7 @@ class Component extends SnipeModel
*/ */
public function assets() public function assets()
{ {
return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'user_id', 'note'); return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'created_by', 'note');
} }
/** /**
@ -142,9 +142,9 @@ class Component extends SnipeModel
* @since [v3.0] * @since [v3.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'user_id'); return $this->belongsTo(\App\Models\User::class, 'created_by');
} }
/** /**
@ -310,4 +310,9 @@ class Component extends SnipeModel
{ {
return $query->leftJoin('suppliers', 'components.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); return $query->leftJoin('suppliers', 'components.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order);
} }
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'components.created_by', '=', 'admin_sort.id')->select('components.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -154,9 +154,9 @@ class Consumable extends SnipeModel
* @since [v3.0] * @since [v3.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(User::class, 'user_id'); return $this->belongsTo(User::class, 'created_by');
} }
/** /**
@ -256,7 +256,7 @@ class Consumable extends SnipeModel
*/ */
public function users() : Relation public function users() : Relation
{ {
return $this->belongsToMany(User::class, 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('user_id')->withTrashed()->withTimestamps(); return $this->belongsToMany(User::class, 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('created_by')->withTrashed()->withTimestamps();
} }
/** /**
@ -451,4 +451,9 @@ class Consumable extends SnipeModel
{ {
return $query->leftJoin('suppliers', 'consumables.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); return $query->leftJoin('suppliers', 'consumables.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order);
} }
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as users_sort', 'consumables.created_by', '=', 'users_sort.id')->select('consumables.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order);
}
} }

View file

@ -26,8 +26,8 @@ class ConsumableAssignment extends Model
return $this->belongsTo(\App\Models\User::class, 'assigned_to'); return $this->belongsTo(\App\Models\User::class, 'assigned_to');
} }
public function admin() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'user_id'); return $this->belongsTo(\App\Models\User::class, 'created_by');
} }
} }

View file

@ -42,7 +42,7 @@ class Department extends SnipeModel
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'user_id', 'created_by',
'name', 'name',
'phone', 'phone',
'fax', 'fax',

View file

@ -88,4 +88,27 @@ class Depreciation extends SnipeModel
return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'depreciation_id', 'model_id'); return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'depreciation_id', 'model_id');
} }
/**
* Get the user that created the depreciation
*
* @author A. Gianotto <snipe@snipe.net>
* @since [v7.0.13]
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/**
* -----------------------------------------------
* BEGIN QUERY SCOPES
* -----------------------------------------------
**/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'depreciations.created_by', '=', 'admin_sort.id')->select('depreciations.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -65,7 +65,7 @@ class Group extends SnipeModel
* @since [v6.3.0] * @since [v6.3.0]
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
*/ */
public function admin() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'created_by'); return $this->belongsTo(\App\Models\User::class, 'created_by');
} }
@ -81,4 +81,16 @@ class Group extends SnipeModel
{ {
return json_decode($this->permissions, true); return json_decode($this->permissions, true);
} }
/**
* -----------------------------------------------
* BEGIN QUERY SCOPES
* -----------------------------------------------
**/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'permission_groups.created_by', '=', 'admin_sort.id')->select('permission_groups.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -283,9 +283,10 @@ class Ldap extends Model
* @param $base_dn * @param $base_dn
* @param $count * @param $count
* @param $filter * @param $filter
* @param $attributes
* @return array|bool * @return array|bool
*/ */
public static function findLdapUsers($base_dn = null, $count = -1, $filter = null) public static function findLdapUsers($base_dn = null, $count = -1, $filter = null, $attributes = [])
{ {
$ldapconn = self::connectToLdap(); $ldapconn = self::connectToLdap();
self::bindAdminToLdap($ldapconn); self::bindAdminToLdap($ldapconn);
@ -319,7 +320,7 @@ class Ldap extends Model
//if($count == -1) { //count is -1 means we have to employ paging to query the entire directory //if($count == -1) { //count is -1 means we have to employ paging to query the entire directory
$ldap_controls = [['oid' => LDAP_CONTROL_PAGEDRESULTS, 'iscritical' => false, 'value' => ['size'=> $count == -1||$count>$page_size ? $page_size : $count, 'cookie' => $cookie]]]; $ldap_controls = [['oid' => LDAP_CONTROL_PAGEDRESULTS, 'iscritical' => false, 'value' => ['size'=> $count == -1||$count>$page_size ? $page_size : $count, 'cookie' => $cookie]]];
//} //}
$search_results = ldap_search($ldapconn, $base_dn, $filter, [], 0, /* $page_size */ -1, -1, LDAP_DEREF_NEVER, $ldap_controls); // TODO - I hate the @, and I hate that we get a full page even if we ask for 10 records. Can we use an ldap_control? $search_results = ldap_search($ldapconn, $base_dn, $filter, $attributes, 0, /* $page_size */ -1, -1, LDAP_DEREF_NEVER, $ldap_controls); // TODO - I hate the @, and I hate that we get a full page even if we ask for 10 records. Can we use an ldap_control?
Log::debug("LDAP search executed successfully."); Log::debug("LDAP search executed successfully.");
if (! $search_results) { if (! $search_results) {
return redirect()->route('users.index')->with('error', trans('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); // TODO this is never called in any routed context - only from the Artisan command. So this redirect will never work. return redirect()->route('users.index')->with('error', trans('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); // TODO this is never called in any routed context - only from the Artisan command. So this redirect will never work.

View file

@ -81,8 +81,7 @@ class License extends Depreciable
'serial', 'serial',
'supplier_id', 'supplier_id',
'termination_date', 'termination_date',
'free_seat_count', 'created_by',
'user_id',
'min_amt', 'min_amt',
]; ];
@ -184,7 +183,7 @@ class License extends Depreciable
$logAction = new Actionlog; $logAction = new Actionlog;
$logAction->item_type = self::class; $logAction->item_type = self::class;
$logAction->item_id = $license->id; $logAction->item_id = $license->id;
$logAction->user_id = Auth::id() ?: 1; // We don't have an id while running the importer from CLI. $logAction->created_by = auth()->id() ?: 1; // We don't have an id while running the importer from CLI.
$logAction->note = "deleted ${change} seats"; $logAction->note = "deleted ${change} seats";
$logAction->target_id = null; $logAction->target_id = null;
$logAction->logaction('delete seats'); $logAction->logaction('delete seats');
@ -196,7 +195,7 @@ class License extends Depreciable
$licenseInsert = []; $licenseInsert = [];
for ($i = $oldSeats; $i < $newSeats; $i++) { for ($i = $oldSeats; $i < $newSeats; $i++) {
$licenseInsert[] = [ $licenseInsert[] = [
'user_id' => Auth::id(), 'created_by' => auth()->id(),
'license_id' => $license->id, 'license_id' => $license->id,
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
@ -216,7 +215,7 @@ class License extends Depreciable
$logAction = new Actionlog(); $logAction = new Actionlog();
$logAction->item_type = self::class; $logAction->item_type = self::class;
$logAction->item_id = $license->id; $logAction->item_id = $license->id;
$logAction->user_id = Auth::id() ?: 1; // Importer. $logAction->created_by = auth()->id() ?: 1; // Importer.
$logAction->note = "added ${change} seats"; $logAction->note = "added ${change} seats";
$logAction->target_id = null; $logAction->target_id = null;
$logAction->logaction('add seats'); $logAction->logaction('add seats');
@ -434,7 +433,7 @@ class License extends Depreciable
*/ */
public function adminuser() public function adminuser()
{ {
return $this->belongsTo(\App\Models\User::class, 'user_id'); return $this->belongsTo(\App\Models\User::class, 'created_by');
} }
/** /**
@ -739,14 +738,9 @@ class License extends Depreciable
/** /**
* Query builder scope to order on the user that created it * Query builder scope to order on the user that created it
*
* @param \Illuminate\Database\Query\Builder $query Query builder instance
* @param text $order Order
*
* @return \Illuminate\Database\Query\Builder Modified query builder
*/ */
public function scopeOrderCreatedBy($query, $order) public function scopeOrderByCreatedBy($query, $order)
{ {
return $query->leftJoin('users as users_sort', 'licenses.user_id', '=', 'users_sort.id')->select('licenses.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order); return $query->leftJoin('users as admin_sort', 'licenses.created_by', '=', 'admin_sort.id')->select('licenses.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
} }
} }

View file

@ -37,7 +37,7 @@ trait Loggable
$log = new Actionlog; $log = new Actionlog;
$log = $this->determineLogItemType($log); $log = $this->determineLogItemType($log);
if (auth()->user()) { if (auth()->user()) {
$log->user_id = auth()->id(); $log->created_by = auth()->id();
} }
if (! isset($target)) { if (! isset($target)) {
@ -149,7 +149,7 @@ trait Loggable
} }
if (auth()->user()) { if (auth()->user()) {
$log->user_id = auth()->id(); $log->created_by = auth()->id();
} }
$changed = []; $changed = [];
@ -225,14 +225,14 @@ trait Loggable
} }
$log->location_id = ($location_id) ? $location_id : null; $log->location_id = ($location_id) ? $location_id : null;
$log->note = $note; $log->note = $note;
$log->user_id = auth()->id(); $log->created_by = auth()->id();
$log->filename = $filename; $log->filename = $filename;
$log->logaction('audit'); $log->logaction('audit');
$params = [ $params = [
'item' => $log->item, 'item' => $log->item,
'filename' => $log->filename, 'filename' => $log->filename,
'admin' => $log->admin, 'admin' => $log->adminuser,
'location' => ($location) ? $location->name : '', 'location' => ($location) ? $location->name : '',
'note' => $note, 'note' => $note,
]; ];
@ -248,9 +248,9 @@ trait Loggable
*/ */
public function logCreate($note = null) public function logCreate($note = null)
{ {
$user_id = -1; $created_by = -1;
if (auth()->user()) { if (auth()->user()) {
$user_id = auth()->id(); $created_by = auth()->id();
} }
$log = new Actionlog; $log = new Actionlog;
if (static::class == LicenseSeat::class) { if (static::class == LicenseSeat::class) {
@ -262,7 +262,7 @@ trait Loggable
} }
$log->location_id = null; $log->location_id = null;
$log->note = $note; $log->note = $note;
$log->user_id = $user_id; $log->created_by = $created_by;
$log->logaction('create'); $log->logaction('create');
$log->save(); $log->save();
@ -284,7 +284,7 @@ trait Loggable
$log->item_type = static::class; $log->item_type = static::class;
$log->item_id = $this->id; $log->item_id = $this->id;
} }
$log->user_id = auth()->id(); $log->created_by = auth()->id();
$log->note = $note; $log->note = $note;
$log->target_id = null; $log->target_id = null;
$log->created_at = date('Y-m-d H:i:s'); $log->created_at = date('Y-m-d H:i:s');

View file

@ -74,10 +74,10 @@ class Manufacturer extends SnipeModel
public function isDeletable() public function isDeletable()
{ {
return Gate::allows('delete', $this) return Gate::allows('delete', $this)
&& ($this->assets()->count() === 0) && (($this->assets_count ?? $this->assets()->count()) === 0)
&& ($this->licenses()->count() === 0) && (($this->licenses_count ?? $this->licenses()->count()) === 0)
&& ($this->consumables()->count() === 0) && (($this->consumables_count ?? $this->consumables()->count()) === 0)
&& ($this->accessories()->count() === 0) && (($this->accessories_count ?? $this->accessories()->count()) === 0)
&& ($this->deleted_at == ''); && ($this->deleted_at == '');
} }
@ -105,4 +105,19 @@ class Manufacturer extends SnipeModel
{ {
return $this->hasMany(\App\Models\Consumable::class, 'manufacturer_id'); return $this->hasMany(\App\Models\Consumable::class, 'manufacturer_id');
} }
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/**
* Query builder scope to order on the user that created it
*/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'manufacturers.created_by', '=', 'admin_sort.id')->select('manufacturers.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -4,6 +4,7 @@ namespace App\Models;
use App\Models\Traits\Searchable; use App\Models\Traits\Searchable;
use App\Presenters\Presentable; use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Watson\Validating\ValidatingTrait; use Watson\Validating\ValidatingTrait;
@ -16,6 +17,7 @@ use Watson\Validating\ValidatingTrait;
class PredefinedKit extends SnipeModel class PredefinedKit extends SnipeModel
{ {
protected $presenter = \App\Presenters\PredefinedKitPresenter::class; protected $presenter = \App\Presenters\PredefinedKitPresenter::class;
use HasFactory;
use Presentable; use Presentable;
protected $table = 'kits'; protected $table = 'kits';
@ -133,6 +135,13 @@ class PredefinedKit extends SnipeModel
*/ */
protected $searchableRelations = []; protected $searchableRelations = [];
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* Establishes the kits -> models relationship * Establishes the kits -> models relationship
* @return \Illuminate\Database\Eloquent\Relations\Relation * @return \Illuminate\Database\Eloquent\Relations\Relation
@ -179,4 +188,9 @@ class PredefinedKit extends SnipeModel
* BEGIN QUERY SCOPES * BEGIN QUERY SCOPES
* ----------------------------------------------- * -----------------------------------------------
**/ **/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'kits.created_by', '=', 'admin_sort.id')->select('kits.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -29,19 +29,19 @@ trait Requestable
public function request($qty = 1) public function request($qty = 1)
{ {
$this->requests()->save( $this->requests()->save(
new CheckoutRequest(['user_id' => Auth::id(), 'qty' => $qty]) new CheckoutRequest(['user_id' => auth()->id(), 'qty' => $qty])
); );
} }
public function deleteRequest() public function deleteRequest()
{ {
$this->requests()->where('user_id', Auth::id())->delete(); $this->requests()->where('user_id', auth()->id())->delete();
} }
public function cancelRequest($user_id = null) public function cancelRequest($user_id = null)
{ {
if (!$user_id){ if (!$user_id){
$user_id = Auth::id(); $user_id = auth()->id();
} }
$this->requests()->where('user_id', $user_id)->update(['canceled_at' => \Carbon\Carbon::now()]); $this->requests()->where('user_id', $user_id)->update(['canceled_at' => \Carbon\Carbon::now()]);

View file

@ -64,6 +64,11 @@ class Statuslabel extends SnipeModel
return $this->hasMany(\App\Models\Asset::class, 'status_id'); return $this->hasMany(\App\Models\Asset::class, 'status_id');
} }
public function adminuser()
{
return $this->belongsTo(\App\Models\User::class, 'created_by');
}
/** /**
* Gets the status label type * Gets the status label type
* *
@ -161,4 +166,9 @@ class Statuslabel extends SnipeModel
return $statustype; return $statustype;
} }
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', 'status_labels.created_by', '=', 'admin_sort.id')->select('status_labels.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
} }

View file

@ -122,6 +122,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
'jobtitle', 'jobtitle',
'employee_num', 'employee_num',
'website', 'website',
'locale',
]; ];
/** /**

View file

@ -192,10 +192,9 @@ public function toGoogleChat()
* @return \Illuminate\Notifications\Messages\MailMessage * @return \Illuminate\Notifications\Messages\MailMessage
*/ */
public function toMail() public function toMail()
{ { $this->item->load('assetstatus');
$eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : '';
$req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0;
$fields = []; $fields = [];
// Check if the item has custom fields associated with it // Check if the item has custom fields associated with it

Some files were not shown because too many files have changed in this diff Show more