mirror of
https://github.com/snipe/snipe-it.git
synced 2025-03-05 20:52:15 -08:00
alright, this mostly works.
This commit is contained in:
parent
6e8ab3723c
commit
eaa10249c2
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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')));
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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(),
|
||||
|
|
Loading…
Reference in a new issue