From eaa10249c2930348daf7f256be9c9d0735b620f6 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 29 Oct 2024 16:16:01 -0500 Subject: [PATCH] alright, this mostly works. --- app/Actions/Assets/StoreAssetAction.php | 117 +++++++++++++++++- app/Http/Controllers/Api/AssetsController.php | 36 ++++++ .../Controllers/Assets/AssetsController.php | 53 ++++++-- app/Http/Requests/StoreAssetRequest.php | 12 +- 4 files changed, 200 insertions(+), 18 deletions(-) diff --git a/app/Actions/Assets/StoreAssetAction.php b/app/Actions/Assets/StoreAssetAction.php index b2e8187ca5..af771924f6 100644 --- a/app/Actions/Assets/StoreAssetAction.php +++ b/app/Actions/Assets/StoreAssetAction.php @@ -3,17 +3,130 @@ namespace App\Actions\Assets; use App\Actions\BaseAction; +use App\Exceptions\CheckoutNotAllowed; +use App\Models\Asset; +use App\Models\AssetModel; +use App\Models\Company; +use App\Models\Location; use App\Models\Setting; +use App\Models\User; +use Carbon\Carbon; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\MessageBag; class StoreAssetAction extends BaseAction { - public static function run($validatedData) + 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... + $status_id,// + $name = null, + $serial = null, + $company_id = null, + $asset_tag = null, + $order_number = null, + $notes = null, + $user_id = null, + $warranty_months = null, + $purchase_cost = null, + $asset_eol_date = null, + $purchase_date = null, + $assigned_to = null, + $supplier_id = null, + $requestable = null, + $rtd_location_id = null, + $location_id = null, //do something with this + $files = null, + $byod = 0, + $assigned_user = null, + $assigned_asset = null, + $assigned_location = null, + $custom_fields = null, + $request = null, //temp for handleImages + $next_audit_date = null, + ) { $settings = Setting::getSettings(); - foreach ($validatedData['asset_tag'] as $key => $tag) { + // initial setting up of asset + $asset = new Asset(); + $asset->model()->associate(AssetModel::find($model_id)); + $asset->name = $name; + $asset->serial = $serial; + $asset->asset_tag = $asset_tag; + $asset->company_id = Company::getIdForCurrentUser($company_id); + $asset->model_id = $model_id; + $asset->order_number = $order_number; + $asset->notes = $notes; + $asset->created_by = auth()->id(); + $asset->status_id = $status_id; + $asset->warranty_months = $warranty_months; + $asset->purchase_cost = $purchase_cost; + $asset->purchase_date = $purchase_date; + $asset->asset_eol_date = $asset_eol_date; + $asset->assigned_to = $assigned_to; + $asset->supplier_id = $supplier_id; + $asset->requestable = $requestable; + $asset->rtd_location_id = $rtd_location_id; + $asset->byod = $byod; + + // set up next audit date + 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 (!$assigned_user && !$assigned_asset && !$assigned_location) { + $asset->location_id = $rtd_location_id; + } + if ($request->has('image')) { + $asset = $request->handleImages($asset); + } + + $model = AssetModel::find($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); + } + } + } + } + + 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); + } + } + + if ($asset->save()) { + return $asset; + } else { + return $asset->getErrors(); + } } } \ No newline at end of file diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index d4a103be37..d8488f3229 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api; +use App\Actions\Assets\StoreAssetAction; use App\Events\CheckoutableCheckedIn; use App\Http\Requests\StoreAssetRequest; use App\Http\Requests\UpdateAssetRequest; @@ -594,6 +595,41 @@ class AssetsController extends Controller */ public function store(StoreAssetRequest $request): JsonResponse { + $asset_tags = $request->input('asset_tags'); + $serials = $request->input('serials'); + $custom_fields = $request->collect()->filter(function ($value, $key) { + return starts_with($key, '_snipeit_'); + }); + + StoreAssetAction::run( + $request->validated('model_id'), + $request->validated('status_id'), + $request->validated('name'), + $serials[$key], + $request->validated('company_id'), + $asset_tag, + $request->validated('order_number'), + $request->validated('notes'), + $request->validated('user_id'), + $request->validated('warranty_months'), + $request->validated('purchase_cost'), + $request->validated('asset_eol_date'), + $request->validated('purchase_date'), + $request->validated('assigned_to'), + $request->validated('supplier_id'), + $request->validated('requestable'), + $request->validated('rtd_location_id'), + $request->validated('location_id'), + $request->validated('files'), + $request->validated('byod'), + $request->validated('assigned_user'), + $request->validated('assigned_asset'), + $request->validated('assigned_location'), + $custom_fields, + $request, + ); + + $asset = new Asset(); $asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 4f6374265d..1479d11fd0 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Assets; use App\Actions\Assets\StoreAssetAction; use App\Events\CheckoutableCheckedIn; +use App\Exceptions\CheckoutNotAllowed; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Requests\ImageUploadRequest; @@ -101,16 +102,50 @@ class AssetsController extends Controller public function store(StoreAssetRequest $request): RedirectResponse { try { - DB::beginTransaction(); - foreach ($request->input('asset_tags') as $key => $tag) { - StoreAssetAction::run($request->validated(), $key); + + $asset_tags = $request->input('asset_tags'); + $serials = $request->input('serials'); + $custom_fields = $request->collect()->filter(function ($value, $key) { + return starts_with($key, '_snipeit_'); + }); + //DB::transaction(function () use ($request, $asset_tags, $serials, $custom_fields) { + foreach ($asset_tags as $key => $asset_tag) { + StoreAssetAction::run( + $request->validated('model_id'), + $request->validated('status_id'), + $request->validated('name'), + $serials[$key], + $request->validated('company_id'), + $asset_tag, + $request->validated('order_number'), + $request->validated('notes'), + $request->validated('user_id'), + $request->validated('warranty_months'), + $request->validated('purchase_cost'), + $request->validated('asset_eol_date'), + $request->validated('purchase_date'), + $request->validated('assigned_to'), + $request->validated('supplier_id'), + $request->validated('requestable'), + $request->validated('rtd_location_id'), + $request->validated('location_id'), + $request->validated('files'), + $request->validated('byod'), + $request->validated('assigned_user'), + $request->validated('assigned_asset'), + $request->validated('assigned_location'), + $custom_fields, + $request, //this is just for the handleImages method... + ); } - DB::commit(); + //}); + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.create.success')); + } catch (CheckoutNotAllowed $e) { + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.create.error')); } catch (\Exception $e) { - return back()->with('error', $e->getMessage()); + return redirect()->back()->withInput()->withErrors($asset); } - // There are a lot more rules to add here but prevents - // errors around `asset_tags` not being present below. + // 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? @@ -167,6 +202,7 @@ class AssetsController extends Controller } // Create the image (if one was chosen.) + //this one's interesting... if ($request->has('image')) { $asset = $request->handleImages($asset); } @@ -221,11 +257,8 @@ class AssetsController extends Controller 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()); diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index c34be2dbfa..8f013cb218 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -37,12 +37,12 @@ class StoreAssetRequest extends ImageUploadRequest $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]; - } + //if (!is_array($this->asset_tag)) { + // $this->asset_tag = [$this->asset_tag]; + //} + //if (!is_array($this->serial)) { + // $this->serial = [$this->serial]; + //} $this->merge([ 'asset_tag' => $this->asset_tag ?? Asset::autoincrement_asset(),