mirror of
https://github.com/snipe/snipe-it.git
synced 2025-03-05 20:52:15 -08:00
almost wrapped up StoreAssetAction.php
This commit is contained in:
parent
eaa10249c2
commit
34886ee69a
|
@ -13,10 +13,14 @@ use App\Models\User;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Support\Facades\Crypt;
|
use Illuminate\Support\Facades\Crypt;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Illuminate\Support\MessageBag;
|
use Illuminate\Support\MessageBag;
|
||||||
|
|
||||||
class StoreAssetAction extends BaseAction
|
class StoreAssetAction extends BaseAction
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @throws CheckoutNotAllowed
|
||||||
|
*/
|
||||||
public static function run(
|
public static function run(
|
||||||
$model_id,//gonna make these two optional for now... we can either make them required here or use the spread operator when calling...
|
$model_id,//gonna make these two optional for now... we can either make them required here or use the spread operator when calling...
|
||||||
$status_id,//
|
$status_id,//
|
||||||
|
@ -80,13 +84,19 @@ class StoreAssetAction extends BaseAction
|
||||||
$asset->location_id = $rtd_location_id;
|
$asset->location_id = $rtd_location_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//api only
|
||||||
|
if ($request->has('image_source')) {
|
||||||
|
$request->offsetSet('image', $request->offsetGet('image_source'));
|
||||||
|
}
|
||||||
|
|
||||||
if ($request->has('image')) {
|
if ($request->has('image')) {
|
||||||
$asset = $request->handleImages($asset);
|
$asset = $request->handleImages($asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
$model = AssetModel::find($model_id);
|
$model = AssetModel::find($model_id);
|
||||||
|
|
||||||
if (($model) && ($model->fieldset)) {
|
// added instanceof, was only in api before
|
||||||
|
if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) {
|
||||||
foreach ($model->fieldset->fields as $field) {
|
foreach ($model->fieldset->fields as $field) {
|
||||||
if ($field->field_encrypted == '1') {
|
if ($field->field_encrypted == '1') {
|
||||||
if (Gate::allows('assets.view.encrypted_custom_fields')) {
|
if (Gate::allows('assets.view.encrypted_custom_fields')) {
|
||||||
|
@ -106,9 +116,46 @@ class StoreAssetAction extends BaseAction
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this is the api's custom fieldset logic, is there a real difference???????
|
||||||
|
//if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) {
|
||||||
|
// foreach ($model->fieldset->fields as $field) {
|
||||||
|
//
|
||||||
|
// // Set the field value based on what was sent in the request
|
||||||
|
// $field_val = $request->input($field->db_column, null);
|
||||||
|
//
|
||||||
|
// // If input value is null, use custom field's default value
|
||||||
|
// if ($field_val == null) {
|
||||||
|
// Log::debug('Field value for '.$field->db_column.' is null');
|
||||||
|
// $field_val = $field->defaultValue($request->get('model_id'));
|
||||||
|
// Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id')));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // if the field is set to encrypted, make sure we encrypt the value
|
||||||
|
// if ($field->field_encrypted == '1') {
|
||||||
|
// Log::debug('This model field is encrypted in this fieldset.');
|
||||||
|
//
|
||||||
|
// if (Gate::allows('assets.view.encrypted_custom_fields')) {
|
||||||
|
//
|
||||||
|
// // If input value is null, use custom field's default value
|
||||||
|
// if (($field_val == null) && ($request->has('model_id') != '')) {
|
||||||
|
// $field_val = Crypt::encrypt($field->defaultValue($request->get('model_id')));
|
||||||
|
// } else {
|
||||||
|
// $field_val = Crypt::encrypt($request->input($field->db_column));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if ($field->element == 'checkbox') {
|
||||||
|
// if (is_array($field_val)) {
|
||||||
|
// $field_val = implode(',', $field_val);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
if ($asset->isValid() && $asset->save()) {
|
if ($asset->isValid() && $asset->save()) {
|
||||||
if (request('assigned_user')) {
|
if (request('assigned_user')) {
|
||||||
$target = User::find(request('assigned_user'));
|
$target = User::find(request('assigned_user'));
|
||||||
|
// the api doesn't have these location-y bits - good reason?
|
||||||
$location = $target->location_id;
|
$location = $target->location_id;
|
||||||
} elseif (request('assigned_asset')) {
|
} elseif (request('assigned_asset')) {
|
||||||
$target = Asset::find(request('assigned_asset'));
|
$target = Asset::find(request('assigned_asset'));
|
||||||
|
@ -121,6 +168,12 @@ class StoreAssetAction extends BaseAction
|
||||||
if (isset($target)) {
|
if (isset($target)) {
|
||||||
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
|
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this was in api and not gui
|
||||||
|
if ($asset->image) {
|
||||||
|
$asset->image = $asset->getImageUrl();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
|
|
|
@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
use App\Actions\Assets\StoreAssetAction;
|
use App\Actions\Assets\StoreAssetAction;
|
||||||
use App\Events\CheckoutableCheckedIn;
|
use App\Events\CheckoutableCheckedIn;
|
||||||
|
use App\Exceptions\CheckoutNotAllowed;
|
||||||
use App\Http\Requests\StoreAssetRequest;
|
use App\Http\Requests\StoreAssetRequest;
|
||||||
use App\Http\Requests\UpdateAssetRequest;
|
use App\Http\Requests\UpdateAssetRequest;
|
||||||
use App\Http\Traits\MigratesLegacyAssetLocations;
|
use App\Http\Traits\MigratesLegacyAssetLocations;
|
||||||
|
@ -595,19 +596,18 @@ class AssetsController extends Controller
|
||||||
*/
|
*/
|
||||||
public function store(StoreAssetRequest $request): JsonResponse
|
public function store(StoreAssetRequest $request): JsonResponse
|
||||||
{
|
{
|
||||||
$asset_tags = $request->input('asset_tags');
|
|
||||||
$serials = $request->input('serials');
|
try {
|
||||||
$custom_fields = $request->collect()->filter(function ($value, $key) {
|
$custom_fields = $request->collect()->filter(function ($value, $key) {
|
||||||
return starts_with($key, '_snipeit_');
|
return starts_with($key, '_snipeit_');
|
||||||
});
|
});
|
||||||
|
$asset = StoreAssetAction::run(
|
||||||
StoreAssetAction::run(
|
|
||||||
$request->validated('model_id'),
|
$request->validated('model_id'),
|
||||||
$request->validated('status_id'),
|
$request->validated('status_id'),
|
||||||
$request->validated('name'),
|
$request->validated('name'),
|
||||||
$serials[$key],
|
$request->validated('serial'),
|
||||||
$request->validated('company_id'),
|
$request->validated('company_id'),
|
||||||
$asset_tag,
|
$request->validated('asset_tag'),
|
||||||
$request->validated('order_number'),
|
$request->validated('order_number'),
|
||||||
$request->validated('notes'),
|
$request->validated('notes'),
|
||||||
$request->validated('user_id'),
|
$request->validated('user_id'),
|
||||||
|
@ -628,89 +628,15 @@ class AssetsController extends Controller
|
||||||
$custom_fields,
|
$custom_fields,
|
||||||
$request,
|
$request,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
$asset = new Asset();
|
|
||||||
$asset->model()->associate(AssetModel::find((int) $request->get('model_id')));
|
|
||||||
|
|
||||||
$asset->fill($request->validated());
|
|
||||||
$asset->created_by = auth()->id();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* this is here just legacy reasons. Api\AssetController
|
|
||||||
* used image_source once to allow encoded image uploads.
|
|
||||||
*/
|
|
||||||
if ($request->has('image_source')) {
|
|
||||||
$request->offsetSet('image', $request->offsetGet('image_source'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$asset = $request->handleImages($asset);
|
|
||||||
|
|
||||||
// Update custom fields in the database.
|
|
||||||
$model = AssetModel::find($request->input('model_id'));
|
|
||||||
|
|
||||||
// Check that it's an object and not a collection
|
|
||||||
// (Sometimes people send arrays here and they shouldn't
|
|
||||||
if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) {
|
|
||||||
foreach ($model->fieldset->fields as $field) {
|
|
||||||
|
|
||||||
// Set the field value based on what was sent in the request
|
|
||||||
$field_val = $request->input($field->db_column, null);
|
|
||||||
|
|
||||||
// If input value is null, use custom field's default value
|
|
||||||
if ($field_val == null) {
|
|
||||||
Log::debug('Field value for '.$field->db_column.' is null');
|
|
||||||
$field_val = $field->defaultValue($request->get('model_id'));
|
|
||||||
Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id')));
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the field is set to encrypted, make sure we encrypt the value
|
|
||||||
if ($field->field_encrypted == '1') {
|
|
||||||
Log::debug('This model field is encrypted in this fieldset.');
|
|
||||||
|
|
||||||
if (Gate::allows('assets.view.encrypted_custom_fields')) {
|
|
||||||
|
|
||||||
// If input value is null, use custom field's default value
|
|
||||||
if (($field_val == null) && ($request->has('model_id') != '')) {
|
|
||||||
$field_val = Crypt::encrypt($field->defaultValue($request->get('model_id')));
|
|
||||||
} else {
|
|
||||||
$field_val = Crypt::encrypt($request->input($field->db_column));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($field->element == 'checkbox') {
|
|
||||||
if(is_array($field_val)) {
|
|
||||||
$field_val = implode(',', $field_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$asset->{$field->db_column} = $field_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($asset->save()) {
|
|
||||||
if ($request->get('assigned_user')) {
|
|
||||||
$target = User::find(request('assigned_user'));
|
|
||||||
} elseif ($request->get('assigned_asset')) {
|
|
||||||
$target = Asset::find(request('assigned_asset'));
|
|
||||||
} elseif ($request->get('assigned_location')) {
|
|
||||||
$target = Location::find(request('assigned_location'));
|
|
||||||
}
|
|
||||||
if (isset($target)) {
|
|
||||||
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name')));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($asset->image) {
|
|
||||||
$asset->image = $asset->getImageUrl();
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.create.success')));
|
return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.create.success')));
|
||||||
|
|
||||||
|
// not sure why we're not using this yet, but i know there's a reason and a reason we want to
|
||||||
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.create.success')));
|
return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.create.success')));
|
||||||
|
} catch (CheckoutNotAllowed $e) {
|
||||||
|
return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage()), 200);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,6 @@ class AssetsController extends Controller
|
||||||
public function store(StoreAssetRequest $request): RedirectResponse
|
public function store(StoreAssetRequest $request): RedirectResponse
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$asset_tags = $request->input('asset_tags');
|
$asset_tags = $request->input('asset_tags');
|
||||||
$serials = $request->input('serials');
|
$serials = $request->input('serials');
|
||||||
$custom_fields = $request->collect()->filter(function ($value, $key) {
|
$custom_fields = $request->collect()->filter(function ($value, $key) {
|
||||||
|
@ -110,7 +109,7 @@ class AssetsController extends Controller
|
||||||
});
|
});
|
||||||
//DB::transaction(function () use ($request, $asset_tags, $serials, $custom_fields) {
|
//DB::transaction(function () use ($request, $asset_tags, $serials, $custom_fields) {
|
||||||
foreach ($asset_tags as $key => $asset_tag) {
|
foreach ($asset_tags as $key => $asset_tag) {
|
||||||
StoreAssetAction::run(
|
$asset = StoreAssetAction::run(
|
||||||
$request->validated('model_id'),
|
$request->validated('model_id'),
|
||||||
$request->validated('status_id'),
|
$request->validated('status_id'),
|
||||||
$request->validated('name'),
|
$request->validated('name'),
|
||||||
|
@ -139,129 +138,16 @@ class AssetsController extends Controller
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
//});
|
//});
|
||||||
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.create.success'));
|
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
||||||
|
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
||||||
|
->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)]));
|
||||||
} catch (CheckoutNotAllowed $e) {
|
} catch (CheckoutNotAllowed $e) {
|
||||||
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.create.error'));
|
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.create.error'));
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return redirect()->back()->withInput()->withErrors($asset);
|
return redirect()->back()->with('error', trans('admin/hardware/message.create.error'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// so do we want to foreach over the action, or convert the api's asset tags to an array as well
|
|
||||||
// so we can just easily add it to the action?
|
|
||||||
// (obviously then this would move up to the request)
|
// (obviously then this would move up to the request)
|
||||||
$this->validate($request, ['asset_tags' => ['required', 'array']]);
|
$this->validate($request, ['asset_tags' => ['required', 'array']]);
|
||||||
|
|
||||||
// Handle asset tags - there could be one, or potentially many.
|
|
||||||
// This is only necessary on create, not update, since bulk editing is handled
|
|
||||||
// differently
|
|
||||||
$asset_tags = $request->input('asset_tags');
|
|
||||||
|
|
||||||
$settings = Setting::getSettings();
|
|
||||||
|
|
||||||
$success = false;
|
|
||||||
$serials = $request->input('serials');
|
|
||||||
|
|
||||||
for ($a = 1; $a <= count($asset_tags); $a++) {
|
|
||||||
$asset = new Asset();
|
|
||||||
$asset->model()->associate(AssetModel::find($request->input('model_id')));
|
|
||||||
$asset->name = $request->input('name');
|
|
||||||
|
|
||||||
// Check for a corresponding serial
|
|
||||||
if (($serials) && (array_key_exists($a, $serials))) {
|
|
||||||
$asset->serial = $serials[$a];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($asset_tags) && (array_key_exists($a, $asset_tags))) {
|
|
||||||
$asset->asset_tag = $asset_tags[$a];
|
|
||||||
}
|
|
||||||
|
|
||||||
$asset->company_id = Company::getIdForCurrentUser($request->input('company_id'));
|
|
||||||
$asset->model_id = $request->input('model_id');
|
|
||||||
$asset->order_number = $request->input('order_number');
|
|
||||||
$asset->notes = $request->input('notes');
|
|
||||||
$asset->created_by = auth()->id();
|
|
||||||
$asset->status_id = request('status_id');
|
|
||||||
$asset->warranty_months = request('warranty_months', null);
|
|
||||||
$asset->purchase_cost = request('purchase_cost');
|
|
||||||
$asset->purchase_date = request('purchase_date', null);
|
|
||||||
$asset->asset_eol_date = request('asset_eol_date', null);
|
|
||||||
$asset->assigned_to = request('assigned_to', null);
|
|
||||||
$asset->supplier_id = request('supplier_id', null);
|
|
||||||
$asset->requestable = request('requestable', 0);
|
|
||||||
$asset->rtd_location_id = request('rtd_location_id', null);
|
|
||||||
$asset->byod = request('byod', 0);
|
|
||||||
|
|
||||||
if (! empty($settings->audit_interval)) {
|
|
||||||
$asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set location_id to rtd_location_id ONLY if the asset isn't being checked out
|
|
||||||
if (!request('assigned_user') && !request('assigned_asset') && !request('assigned_location')) {
|
|
||||||
$asset->location_id = $request->input('rtd_location_id', null);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the image (if one was chosen.)
|
|
||||||
//this one's interesting...
|
|
||||||
if ($request->has('image')) {
|
|
||||||
$asset = $request->handleImages($asset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update custom fields in the database.
|
|
||||||
// Validation for these fields is handled through the AssetRequest form request
|
|
||||||
$model = AssetModel::find($request->get('model_id'));
|
|
||||||
|
|
||||||
if (($model) && ($model->fieldset)) {
|
|
||||||
foreach ($model->fieldset->fields as $field) {
|
|
||||||
if ($field->field_encrypted == '1') {
|
|
||||||
if (Gate::allows('assets.view.encrypted_custom_fields')) {
|
|
||||||
if (is_array($request->input($field->db_column))) {
|
|
||||||
$asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column)));
|
|
||||||
} else {
|
|
||||||
$asset->{$field->db_column} = Crypt::encrypt($request->input($field->db_column));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (is_array($request->input($field->db_column))) {
|
|
||||||
$asset->{$field->db_column} = implode(', ', $request->input($field->db_column));
|
|
||||||
} else {
|
|
||||||
$asset->{$field->db_column} = $request->input($field->db_column);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the asset before saving
|
|
||||||
if ($asset->isValid() && $asset->save()) {
|
|
||||||
if (request('assigned_user')) {
|
|
||||||
$target = User::find(request('assigned_user'));
|
|
||||||
$location = $target->location_id;
|
|
||||||
} elseif (request('assigned_asset')) {
|
|
||||||
$target = Asset::find(request('assigned_asset'));
|
|
||||||
$location = $target->location_id;
|
|
||||||
} elseif (request('assigned_location')) {
|
|
||||||
$target = Location::find(request('assigned_location'));
|
|
||||||
$location = $target->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($target)) {
|
|
||||||
$asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location);
|
|
||||||
}
|
|
||||||
|
|
||||||
$success = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]);
|
|
||||||
|
|
||||||
|
|
||||||
if ($success) {
|
|
||||||
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
|
|
||||||
->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->back()->withInput()->withErrors($asset->getErrors());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,14 +36,6 @@ class StoreAssetRequest extends ImageUploadRequest
|
||||||
|
|
||||||
$this->parseLastAuditDate();
|
$this->parseLastAuditDate();
|
||||||
|
|
||||||
// maybe do something like this?
|
|
||||||
//if (!is_array($this->asset_tag)) {
|
|
||||||
// $this->asset_tag = [$this->asset_tag];
|
|
||||||
//}
|
|
||||||
//if (!is_array($this->serial)) {
|
|
||||||
// $this->serial = [$this->serial];
|
|
||||||
//}
|
|
||||||
|
|
||||||
$this->merge([
|
$this->merge([
|
||||||
'asset_tag' => $this->asset_tag ?? Asset::autoincrement_asset(),
|
'asset_tag' => $this->asset_tag ?? Asset::autoincrement_asset(),
|
||||||
'company_id' => $idForCurrentUser,
|
'company_id' => $idForCurrentUser,
|
||||||
|
|
Loading…
Reference in a new issue