mirror of
https://github.com/snipe/snipe-it.git
synced 2025-03-05 20:52:15 -08:00
Bulk asset audit form (needs more testing)
This commit is contained in:
parent
e439f15a64
commit
22233e3ba6
|
@ -507,27 +507,34 @@ class AssetsController extends Controller
|
||||||
* @since [v4.0]
|
* @since [v4.0]
|
||||||
* @return JsonResponse
|
* @return JsonResponse
|
||||||
*/
|
*/
|
||||||
public function audit(Request $request, $id) {
|
public function audit(Request $request) {
|
||||||
|
|
||||||
|
|
||||||
$this->authorize('audit', Asset::class);
|
$this->authorize('audit', Asset::class);
|
||||||
|
|
||||||
$rules = array(
|
$rules = array(
|
||||||
|
'asset_tag' => 'required',
|
||||||
'location_id' => 'exists:locations,id|nullable|numeric',
|
'location_id' => 'exists:locations,id|nullable|numeric',
|
||||||
'next_audit_date' => 'date|nullable'
|
'next_audit_date' => 'date|nullable'
|
||||||
);
|
);
|
||||||
|
|
||||||
$validator = \Validator::make($request->all(), $rules);
|
$validator = Validator::make($request->all(), $rules);
|
||||||
if ($validator->fails()) {
|
if ($validator->fails()) {
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
|
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
|
||||||
}
|
}
|
||||||
|
|
||||||
$asset = Asset::findOrFail($id);
|
$asset = Asset::where('asset_tag','=', $request->input('asset_tag'))->first();
|
||||||
$asset->next_audit_date = $request->input('next_audit_date');
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($asset) {
|
||||||
|
$asset->next_audit_date = $request->input('next_audit_date');
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
$asset->logAudit(request('note'),request('location_id'));
|
$log = $asset->logAudit(request('note'),request('location_id'));
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.audit.success')));
|
return response()->json(Helper::formatStandardApiResponse('success', ['asset_tag'=> e($asset->asset_tag), 'note'=> e($request->input('note')), 'next_audit_date' => Helper::getFormattedDateObject($log->calcNextAuditDate())], trans('admin/hardware/message.audit.success')));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag'=> e($request->input('asset_tag'))], 'Asset with tag '.$request->input('asset_tag').' not found'));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1238,6 +1238,16 @@ class AssetsController extends Controller
|
||||||
return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors);
|
return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function quickScan(Request $request)
|
||||||
|
{
|
||||||
|
$this->authorize('audit', Asset::class);
|
||||||
|
$dt = Carbon::now()->addMonths(12)->toDateString();
|
||||||
|
return view('hardware/quickscan')->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function audit(Request $request, $id)
|
public function audit(Request $request, $id)
|
||||||
{
|
{
|
||||||
$this->authorize('audit', Asset::class);
|
$this->authorize('audit', Asset::class);
|
||||||
|
|
|
@ -154,31 +154,23 @@ class Actionlog extends SnipeModel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function daysUntilNextAudit($monthInterval = null, $asset = null) {
|
public function daysUntilNextAudit($monthInterval = 12, $asset = null) {
|
||||||
|
|
||||||
// check for next_audit_date to override global
|
$now = Carbon::now();
|
||||||
|
|
||||||
if (!$monthInterval) {
|
|
||||||
$monthInterval = 12;
|
|
||||||
}
|
|
||||||
$last_audit_date = $this->created_at;
|
$last_audit_date = $this->created_at;
|
||||||
$next_audit_days = $last_audit_date->diffInDays($last_audit_date->copy()->addMonth($monthInterval));
|
$next_audit = $last_audit_date->addMonth($monthInterval);
|
||||||
|
$next_audit_days = $now->diffInDays($next_audit);
|
||||||
|
|
||||||
// Override the default setting for interval if the asset has its own next audit date
|
// Override the default setting for interval if the asset has its own next audit date
|
||||||
if (($asset) && ($asset->next_audit_date)) {
|
if (($asset) && ($asset->next_audit_date)) {
|
||||||
$override_default_next = \Carbon::parse($asset->next_audit_date);
|
$override_default_next = \Carbon::parse($asset->next_audit_date);
|
||||||
$suborder['payment_date'] = $override_default_next->format('M d Y');
|
$next_audit_days = $override_default_next->diffInDays($now);
|
||||||
$next_audit_days = $last_audit_date->diffInDays($override_default_next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $next_audit_days;
|
return $next_audit_days;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function calcNextAuditDate($monthInterval = null, $asset = null) {
|
public function calcNextAuditDate($monthInterval = 12, $asset = null) {
|
||||||
|
|
||||||
if (!$monthInterval) {
|
|
||||||
$monthInterval = 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
$last_audit_date = Carbon::parse($this->created_at);
|
$last_audit_date = Carbon::parse($this->created_at);
|
||||||
// If there is an asset-specific next date already given,
|
// If there is an asset-specific next date already given,
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
'avatar_upload' => 'Upload Avatar',
|
'avatar_upload' => 'Upload Avatar',
|
||||||
'back' => 'Back',
|
'back' => 'Back',
|
||||||
'bad_data' => 'Nothing found. Maybe bad data?',
|
'bad_data' => 'Nothing found. Maybe bad data?',
|
||||||
|
'bulkaudit' => 'Bulk Audit',
|
||||||
|
'bulkaudit_status' => 'Audit Status',
|
||||||
'bulk_checkout' => 'Bulk Checkout',
|
'bulk_checkout' => 'Bulk Checkout',
|
||||||
'cancel' => 'Cancel',
|
'cancel' => 'Cancel',
|
||||||
'categories' => 'Categories',
|
'categories' => 'Categories',
|
||||||
|
|
198
resources/views/hardware/quickscan.blade.php
Normal file
198
resources/views/hardware/quickscan.blade.php
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
@extends('layouts/default')
|
||||||
|
|
||||||
|
{{-- Page title --}}
|
||||||
|
@section('title')
|
||||||
|
{{ trans('general.bulkaudit') }}
|
||||||
|
@parent
|
||||||
|
@stop
|
||||||
|
|
||||||
|
{{-- Page content --}}
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
padding-left: 0px !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
{{ Form::open(['method' => 'POST', 'class' => 'form-horizontal', 'role' => 'form', 'id' => 'audit-form' ]) }}
|
||||||
|
<!-- left column -->
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="box box-default">
|
||||||
|
<div class="box-header with-border">
|
||||||
|
<h3 class="box-title"> {{ trans('general.bulkaudit') }} </h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
{{csrf_field()}}
|
||||||
|
|
||||||
|
<!-- Next Audit -->
|
||||||
|
<div class="form-group {{ $errors->has('asset_tag') ? 'error' : '' }}">
|
||||||
|
{{ Form::label('asset_tag', trans('general.asset_tag'), array('class' => 'col-md-3 control-label', 'id' => 'audit_tag')) }}
|
||||||
|
<div class="col-md-9">
|
||||||
|
<div class="input-group date col-md-5" data-date-format="yyyy-mm-dd">
|
||||||
|
<input type="text" class="form-control" name="asset_tag" id="asset_tag" value="{{ Input::old('asset_tag') }}">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{!! $errors->first('asset_tag', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Locations -->
|
||||||
|
<div id="location_id" class="form-group{{ $errors->has('location_id') ? ' has-error' : '' }}">
|
||||||
|
{{ Form::label('location_id', trans('general.location'), array('class' => 'col-md-3 control-label')) }}
|
||||||
|
<div class="col-md-9">
|
||||||
|
{{ Form::select('location_id', $locations_list , Input::old('location_id'), array('class'=>'select2', 'id'=>'location_id', 'style'=>'width:100%')) }}
|
||||||
|
|
||||||
|
{!! $errors->first('location_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Next Audit -->
|
||||||
|
<div class="form-group {{ $errors->has('next_audit_date') ? 'error' : '' }}">
|
||||||
|
{{ Form::label('next_audit_date', trans('general.next_audit_date'), array('class' => 'col-md-3 control-label')) }}
|
||||||
|
<div class="col-md-9">
|
||||||
|
<div class="input-group date col-md-5" data-provide="datepicker" data-date-format="yyyy-mm-dd">
|
||||||
|
<input type="text" class="form-control" placeholder="{{ trans('general.next_audit_date') }}" name="next_audit_date" id="next_audit_date" value="{{ Input::old('next_audit_date', $next_audit_date) }}">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
|
||||||
|
</div>
|
||||||
|
{!! $errors->first('next_audit_date', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Note -->
|
||||||
|
<div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
|
||||||
|
{{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
|
||||||
|
<div class="col-md-8">
|
||||||
|
<textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note') }}</textarea>
|
||||||
|
{!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div> <!--/.box-body-->
|
||||||
|
<div class="box-footer">
|
||||||
|
<a class="btn btn-link" href="{{ route('hardware.index') }}"> {{ trans('button.cancel') }}</a>
|
||||||
|
<button type="submit" id="audit_button" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.audit') }}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{{Form::close()}}
|
||||||
|
</div> <!--/.col-md-7-->
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="box box-default" id="audited-div" style="display: none">
|
||||||
|
<div class="box-header with-border">
|
||||||
|
<h3 class="box-title"> {{ trans('general.bulkaudit_status') }} </h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
|
||||||
|
<table id="audited" class="table table-striped snipe-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{ trans('general.asset_tag') }}</th>
|
||||||
|
<th>{{ trans('general.bulkaudit_status') }}</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<td colspan="3"><span id="audit-counter">0</span> assets audited</td>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
<tbody>
|
||||||
|
<tr id="audit-loader" style="display: none;">
|
||||||
|
<td colspan="3">
|
||||||
|
<i class="fa fa-spinner spin" aria-hidden="true"></i> Processing...
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@stop
|
||||||
|
|
||||||
|
|
||||||
|
@section('moar_scripts')
|
||||||
|
<script>
|
||||||
|
|
||||||
|
$("#audit-form").submit(function (event) {
|
||||||
|
$('#audited-div').show();
|
||||||
|
$('#audit-loader').show();
|
||||||
|
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var form = $("#audit-form").get(0);
|
||||||
|
var formData = $('#audit-form').serializeArray();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: "{{ route('api.asset.audit') }}",
|
||||||
|
type : 'POST',
|
||||||
|
headers: {
|
||||||
|
"X-Requested-With": 'XMLHttpRequest',
|
||||||
|
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
|
||||||
|
},
|
||||||
|
dataType : 'json',
|
||||||
|
data : formData,
|
||||||
|
success : function (data) {
|
||||||
|
if (data.status == 'success') {
|
||||||
|
$('#audited tbody').append("<tr class='success'><td>" + data.payload.asset_tag + "</td><td>" + data.messages + "</td><td><i class='fa fa-check text-success'></i></td></tr>");
|
||||||
|
incrementOnSuccess();
|
||||||
|
} else {
|
||||||
|
handleAuditFail(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function (data) {
|
||||||
|
handleAuditFail(data);
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
$('#audit-loader').hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleAuditFail (data) {
|
||||||
|
if (data.asset_tag) {
|
||||||
|
var asset_tag = data.asset_tag;
|
||||||
|
} else {
|
||||||
|
var asset_tag = '';
|
||||||
|
}
|
||||||
|
if (data.messages) {
|
||||||
|
var messages = data.messages;
|
||||||
|
} else {
|
||||||
|
var messages = '';
|
||||||
|
}
|
||||||
|
$('#audited tbody').append("<tr class='danger'><td>" + asset_tag + "</td><td>" + messages + "</td><td><i class='fa fa-times text-danger'></i></td></tr>");
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementOnSuccess() {
|
||||||
|
var x = parseInt($('#audit-counter').html());
|
||||||
|
y = x + 1;
|
||||||
|
$('#audit-counter').html(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#audit_tag").focus();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
@stop
|
|
@ -414,6 +414,9 @@
|
||||||
<li><a href="{{ route('maintenances.index') }}">@lang('general.asset_maintenances') </a></li>
|
<li><a href="{{ route('maintenances.index') }}">@lang('general.asset_maintenances') </a></li>
|
||||||
<li><a href="{{ url('hardware/history') }}">@lang('general.import-history') </a></li>
|
<li><a href="{{ url('hardware/history') }}">@lang('general.import-history') </a></li>
|
||||||
@endcan
|
@endcan
|
||||||
|
@can('audit', \App\Models\Asset::class)
|
||||||
|
<li><a href="{{ route('assets.bulkaudit') }}">@lang('general.bulkaudit') </a></li>
|
||||||
|
@endcan
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@endcan
|
@endcan
|
||||||
|
|
|
@ -214,7 +214,7 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () {
|
||||||
|
|
||||||
Route::group(['prefix' => 'hardware'], function () {
|
Route::group(['prefix' => 'hardware'], function () {
|
||||||
|
|
||||||
Route::post('audit/{id}', [
|
Route::post('audit', [
|
||||||
'as' => 'api.asset.audit',
|
'as' => 'api.asset.audit',
|
||||||
'uses' => 'AssetsController@audit'
|
'uses' => 'AssetsController@audit'
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -12,6 +12,11 @@ Route::group(
|
||||||
'middleware' => ['auth']],
|
'middleware' => ['auth']],
|
||||||
function () {
|
function () {
|
||||||
|
|
||||||
|
Route::get( 'bulkaudit', [
|
||||||
|
'as' => 'assets.bulkaudit',
|
||||||
|
'uses' => 'AssetsController@quickScan'
|
||||||
|
]);
|
||||||
|
|
||||||
# Asset Maintenances
|
# Asset Maintenances
|
||||||
Route::resource('maintenances', 'AssetMaintenancesController', [
|
Route::resource('maintenances', 'AssetMaintenancesController', [
|
||||||
'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id']
|
'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id']
|
||||||
|
@ -128,6 +133,8 @@ Route::group(
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue