createComponentIfNotExists(); } /** * Create a component if a duplicate does not exist * * @author Daniel Melzter * * @since 3.0 */ public function createComponentIfNotExists() { $component = null; $this->log('Creating Component'); $component = Component::where('name', trim($this->item['name'])) ->where('serial', trim($this->item['serial'])) ->first(); if ($component) { $this->log('A matching Component '.$this->item['name'].' with serial '.$this->item['serial'].' already exists. '); if (! $this->updating) { $this->log('Skipping Component'); return; } $this->log('Updating Component'); $component->update($this->sanitizeItemForUpdating($component)); // update() already saves the model, no need to call save() again while Model::unguard() is active $component->setImported(true); return; } $this->log('No matching component, creating one'); $component = new Component; $component->created_by = auth()->id(); $component->fill($this->sanitizeItemForStoring($component)); // This sets an attribute on the Loggable trait for the action log $component->setImported(true); if ($component->save()) { $this->log('Component '.$this->item['name'].' was created'); // If we have an asset tag, checkout to that asset. if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) { if (! $component->canCheckoutTo($asset)) { $this->log(trans('general.error_checkout_company_mismatch', [ 'item' => trans('general.component').' "'.$component->name.'"', 'item_company' => $component->company?->name ?? trans('general.unassigned'), 'target' => trans('general.asset').' "'.$asset->display_name.'"', ])); } else { $component->assets()->attach($component->id, [ 'component_id' => $component->id, 'created_by' => auth()->id(), 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => 1, // Only assign the first one to the asset 'asset_id' => $asset->id, ]); } } return; } $this->logError($component, 'Component'); } }