2017-01-11 18:14:06 -08:00
|
|
|
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
|
|
|
|
use App\Helpers\Helper;
|
|
|
|
use App\Http\Requests\AssetCheckinRequest;
|
|
|
|
use App\Http\Requests\AssetCheckoutRequest;
|
|
|
|
use App\Http\Requests\AssetFileRequest;
|
|
|
|
use App\Http\Requests\AssetRequest;
|
|
|
|
use App\Http\Requests\ItemImportRequest;
|
|
|
|
use App\Models\Actionlog;
|
|
|
|
use App\Models\Asset;
|
|
|
|
use App\Models\AssetModel;
|
|
|
|
use App\Models\Company;
|
|
|
|
use App\Models\CustomField;
|
|
|
|
use App\Models\Location;
|
|
|
|
use App\Models\Setting;
|
|
|
|
use App\Models\User;
|
|
|
|
use Artisan;
|
|
|
|
use Auth;
|
|
|
|
use Carbon\Carbon;
|
|
|
|
use Config;
|
|
|
|
use DB;
|
|
|
|
use Gate;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Image;
|
|
|
|
use Input;
|
|
|
|
use Lang;
|
|
|
|
use League\Csv\Reader;
|
|
|
|
use Log;
|
|
|
|
use Mail;
|
|
|
|
use Paginator;
|
|
|
|
use Redirect;
|
|
|
|
use Response;
|
|
|
|
use Slack;
|
|
|
|
use Str;
|
|
|
|
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
|
|
|
use TCPDF;
|
|
|
|
use Validator;
|
|
|
|
use View;
|
|
|
|
use App\Http\Controllers\Controller;
|
2017-01-11 23:40:56 -08:00
|
|
|
use Zend\Diactoros\Response\JsonResponse;
|
2017-01-11 18:14:06 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This class controls all actions related to assets for
|
|
|
|
* the Snipe-IT Asset Management application.
|
|
|
|
*
|
|
|
|
* @version v1.0
|
|
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
|
|
*/
|
|
|
|
class AssetsController extends Controller
|
|
|
|
{
|
|
|
|
|
2017-01-11 23:40:56 -08:00
|
|
|
/**
|
|
|
|
* Returns JSON listing of all assets
|
|
|
|
*
|
|
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
|
|
* @param int $assetId
|
|
|
|
* @since [v4.0]
|
|
|
|
* @return JsonResponse
|
|
|
|
*/
|
2017-01-11 18:14:06 -08:00
|
|
|
public function index(Request $request, $status = null)
|
|
|
|
{
|
|
|
|
$this->authorize('index', 'App\Models\Asset');
|
|
|
|
|
|
|
|
$assets = Company::scopeCompanyables(Asset::select('assets.*'))->with(
|
|
|
|
'assetLoc', 'assetstatus', 'defaultLoc', 'assetlog', 'company',
|
|
|
|
'model.category', 'model.manufacturer', 'model.fieldset');
|
|
|
|
|
2017-01-11 19:00:34 -08:00
|
|
|
$request->has('search') ? $assets = $assets->TextSearch(e($request->get('search'))) : '';
|
2017-01-11 18:14:06 -08:00
|
|
|
$offset = request('offset', 0);
|
|
|
|
$limit = request('limit', 50);
|
2017-01-11 19:00:34 -08:00
|
|
|
$request->has('order_number') ? $assets->where('order_number', '=', e($request->get('order_number'))) : '';
|
|
|
|
|
2017-01-11 18:14:06 -08:00
|
|
|
|
|
|
|
|
|
|
|
switch ($status) {
|
|
|
|
case 'Deleted':
|
|
|
|
$assets->withTrashed()->Deleted();
|
|
|
|
break;
|
|
|
|
case 'Pending':
|
|
|
|
$assets->Pending();
|
|
|
|
break;
|
|
|
|
case 'RTD':
|
|
|
|
$assets->RTD();
|
|
|
|
break;
|
|
|
|
case 'Undeployable':
|
|
|
|
$assets->Undeployable();
|
|
|
|
break;
|
|
|
|
case 'Archived':
|
|
|
|
$assets->Archived();
|
|
|
|
break;
|
|
|
|
case 'Requestable':
|
|
|
|
$assets->RequestableAssets();
|
|
|
|
break;
|
|
|
|
case 'Deployed':
|
|
|
|
$assets->Deployed();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2017-01-11 19:00:34 -08:00
|
|
|
$request->has('status_id') ? $assets->where('status_id', '=', e($request->get('status_id'))) : '';
|
2017-01-11 18:14:06 -08:00
|
|
|
|
|
|
|
$allowed_columns = [
|
|
|
|
'id',
|
|
|
|
'name',
|
|
|
|
'asset_tag',
|
|
|
|
'serial',
|
|
|
|
'model',
|
|
|
|
'model_number',
|
|
|
|
'last_checkout',
|
|
|
|
'category',
|
|
|
|
'manufacturer',
|
|
|
|
'notes',
|
|
|
|
'expected_checkin',
|
|
|
|
'order_number',
|
|
|
|
'companyName',
|
|
|
|
'location',
|
|
|
|
'image',
|
|
|
|
'status_label',
|
|
|
|
'assigned_to',
|
|
|
|
'created_at',
|
|
|
|
'purchase_date',
|
|
|
|
'purchase_cost'
|
|
|
|
];
|
|
|
|
$all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load
|
|
|
|
foreach ($all_custom_fields as $field) {
|
|
|
|
$allowed_columns[]=$field->db_column_name();
|
|
|
|
}
|
|
|
|
|
|
|
|
$order = $request->get('order') === 'asc' ? 'asc' : 'desc';
|
|
|
|
$sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'asset_tag';
|
|
|
|
|
|
|
|
switch ($sort) {
|
|
|
|
case 'model':
|
|
|
|
$assets = $assets->OrderModels($order);
|
|
|
|
break;
|
|
|
|
case 'model_number':
|
|
|
|
$assets = $assets->OrderModelNumber($order);
|
|
|
|
break;
|
|
|
|
case 'category':
|
|
|
|
$assets = $assets->OrderCategory($order);
|
|
|
|
break;
|
|
|
|
case 'manufacturer':
|
|
|
|
$assets = $assets->OrderManufacturer($order);
|
|
|
|
break;
|
|
|
|
case 'companyName':
|
|
|
|
$assets = $assets->OrderCompany($order);
|
|
|
|
break;
|
|
|
|
case 'location':
|
|
|
|
$assets = $assets->OrderLocation($order);
|
|
|
|
break;
|
|
|
|
case 'status_label':
|
|
|
|
$assets = $assets->OrderStatus($order);
|
|
|
|
break;
|
|
|
|
case 'assigned_to':
|
|
|
|
$assets = $assets->OrderAssigned($order);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$assets = $assets->orderBy($sort, $order);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
$assetCount = $assets->count();
|
|
|
|
$assets = $assets->skip($offset)->take($limit)->get();
|
|
|
|
|
|
|
|
$rows = array();
|
|
|
|
foreach ($assets as $asset) {
|
|
|
|
$row = $asset->present()->forDataTable($all_custom_fields);
|
|
|
|
if (($request->has('report')) && ($request->get('report')=='true')) {
|
|
|
|
$rows[]= Helper::stripTagsFromJSON($row);
|
|
|
|
} else {
|
|
|
|
$rows[]= $row;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2017-01-11 19:00:34 -08:00
|
|
|
$data = array('total' => $assetCount, 'rows' => $rows);
|
2017-01-11 18:14:06 -08:00
|
|
|
return $data;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-01-11 19:00:34 -08:00
|
|
|
/**
|
|
|
|
* Returns JSON with information about an asset for detail view.
|
|
|
|
*
|
|
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
|
|
* @param int $assetId
|
2017-01-11 23:40:56 -08:00
|
|
|
* @since [v4.0]
|
|
|
|
* @return JsonResponse
|
2017-01-11 19:00:34 -08:00
|
|
|
*/
|
|
|
|
public function show($id = null)
|
|
|
|
{
|
|
|
|
|
|
|
|
if ($asset = Asset::withTrashed()->find($id)) {
|
|
|
|
$this->authorize('view', $asset);
|
|
|
|
$asset = $asset->present()->detail();
|
|
|
|
return $asset;
|
|
|
|
}
|
|
|
|
|
2017-01-11 19:12:25 -08:00
|
|
|
return response()->json(['error' => trans('admin/hardware/message.does_not_exist')], 404);
|
2017-01-11 19:00:34 -08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-01-11 23:40:56 -08:00
|
|
|
/**
|
|
|
|
* Accepts a POST request to create a new asset
|
|
|
|
*
|
|
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
|
|
* @param int $assetId
|
|
|
|
* @since [v4.0]
|
|
|
|
* @return Redirect
|
|
|
|
*/
|
|
|
|
public function store(AssetRequest $request)
|
|
|
|
{
|
|
|
|
$this->authorize('create', Asset::class);
|
|
|
|
|
|
|
|
$asset = new Asset();
|
|
|
|
$asset->model()->associate(AssetModel::find(e($request->get('model_id'))));
|
|
|
|
|
|
|
|
$asset->name = $request->get('name');
|
|
|
|
$asset->serial = $request->get('serial');
|
|
|
|
$asset->company_id = Company::getIdForCurrentUser($request->get('company_id'));
|
|
|
|
$asset->model_id = $request->get('model_id');
|
|
|
|
$asset->order_number = $request->get('order_number');
|
|
|
|
$asset->notes = $request->get('notes');
|
|
|
|
$asset->asset_tag = $request->get('asset_tag');
|
|
|
|
$asset->user_id = Auth::id();
|
|
|
|
$asset->archived = '0';
|
|
|
|
$asset->physical = '1';
|
|
|
|
$asset->depreciate = '0';
|
|
|
|
$asset->status_id = $request->get('status_id', 0);
|
|
|
|
$asset->warranty_months = $request->get('warranty_months', null);
|
|
|
|
$asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost'));
|
|
|
|
$asset->purchase_date = $request->get('purchase_date', null);
|
|
|
|
$asset->assigned_to = $request->get('assigned_to', null);
|
|
|
|
$asset->supplier_id = $request->get('supplier_id', 0);
|
|
|
|
$asset->requestable = $request->get('requestable', 0);
|
|
|
|
$asset->rtd_location_id = $request->get('rtd_location_id', null);
|
|
|
|
|
|
|
|
// Update custom fields in the database.
|
|
|
|
// Validation for these fields is handled through the AssetRequest form request
|
|
|
|
// Need to investigate and fix. Using static method for now.
|
|
|
|
$model = AssetModel::find($request->get('model_id'));
|
|
|
|
if ($model->fieldset) {
|
|
|
|
foreach ($model->fieldset->fields as $field) {
|
|
|
|
$asset->{CustomField::name_to_db_name($field->name)} = e($request->input(CustomField::name_to_db_name($field->name)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($asset->save()) {
|
|
|
|
$asset->logCreate();
|
|
|
|
if(request('assigned_user')) {
|
|
|
|
$target = User::find(request('assigned_user'));
|
|
|
|
} elseif(request('assigned_asset')) {
|
|
|
|
$target = Asset::find(request('assigned_asset'));
|
|
|
|
} elseif(request('assigned_location')) {
|
|
|
|
$target = Location::find(request('assigned_location'));
|
|
|
|
}
|
|
|
|
if ($target) {
|
|
|
|
$asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name')));
|
|
|
|
}
|
|
|
|
return response()->json(['success' => trans('admin/hardware/message.create.success')]);
|
|
|
|
|
|
|
|
}
|
|
|
|
return response()->json(['errors' => $asset->getErrors()], 500);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a given asset (mark as deleted).
|
|
|
|
*
|
|
|
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
|
|
|
* @param int $assetId
|
|
|
|
* @since [v4.0]
|
|
|
|
* @return Redirect
|
|
|
|
*/
|
|
|
|
public function destroy($id)
|
|
|
|
{
|
|
|
|
|
|
|
|
if ($asset = Asset::find($id)) {
|
|
|
|
$this->authorize('delete', $asset);
|
|
|
|
|
|
|
|
DB::table('assets')
|
|
|
|
->where('id', $asset->id)
|
|
|
|
->update(array('assigned_to' => null));
|
|
|
|
|
|
|
|
$asset->delete();
|
|
|
|
return response()->json(['success' => trans('admin/hardware/message.delete.success')]);
|
|
|
|
|
|
|
|
}
|
|
|
|
return response()->json(['error' => trans('admin/hardware/message.does_not_exist')], 404);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-01-11 19:00:34 -08:00
|
|
|
|
2017-01-11 18:14:06 -08:00
|
|
|
}
|