alright, this mostly works.

This commit is contained in:
spencerrlongg 2024-10-29 16:16:01 -05:00
parent 6e8ab3723c
commit eaa10249c2
4 changed files with 200 additions and 18 deletions

View file

@ -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();
}
}
}

View file

@ -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')));

View file

@ -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());

View file

@ -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(),