diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index ddd828c6f4..f544f2bc36 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1329,6 +1329,8 @@ class Helper return 'fa-solid fa-store'; case 'manufacturer': return 'fa-solid fa-building'; + case 'category': + return 'fa-solid fa-table-columns'; } } diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index b70d4f218e..c18df26683 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -240,6 +240,9 @@ class ImportController extends Controller case 'manufacturer': $redirectTo = 'manufacturers.index'; break; + case 'category': + $redirectTo = 'categories.index'; + break; } if ($errors) { //Failure diff --git a/app/Importer/CategoryImporter.php b/app/Importer/CategoryImporter.php new file mode 100644 index 0000000000..4eeb48c609 --- /dev/null +++ b/app/Importer/CategoryImporter.php @@ -0,0 +1,99 @@ +createCategoryIfNotExists($row); + } + + /** + * Create a category if a duplicate does not exist. + * @todo Investigate how this should interact with Importer::createCategoryIfNotExists + * + * @author A. Gianotto + * @since 6.1.0 + * @param array $row + */ + public function createCategoryIfNotExists(array $row) + { + + $editingCategory = false; + + $category = Category::where('name', '=', $this->findCsvMatch($row, 'name'))->first(); + + if ($this->findCsvMatch($row, 'id')!='') { + // Override category if an ID was given + \Log::debug('Finding category by ID: '.$this->findCsvMatch($row, 'id')); + $category = Category::find($this->findCsvMatch($row, 'id')); + } + + + if ($category) { + if (! $this->updating) { + $this->log('A matching Category '.$this->item['name'].' already exists'); + return; + } + + $this->log('Updating Category'); + $editingCategory = true; + } else { + $this->log('No Matching Category, Create a new one'); + $category = new Category; + $category->created_by = auth()->id(); + } + + // Pull the records from the CSV to determine their values + $this->item['name'] = trim($this->findCsvMatch($row, 'name')); + $this->item['notes'] = trim($this->findCsvMatch($row, 'notes')); + $this->item['eula_text'] = trim($this->findCsvMatch($row, 'eula_text')); + $this->item['category_type'] = trim($this->findCsvMatch($row, 'category_type')); + $this->item['use_default_eula'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'use_default_eula'))) == 1) ? 1 : 0; + $this->item['require_acceptance'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'require_acceptance'))) == 1) ? 1 : 0; + $this->item['checkin_email'] = trim(($this->fetchHumanBoolean($this->findCsvMatch($row, 'checkin_email'))) == 1) ? 1 : 0; + + + Log::debug('Item array is: '); + Log::debug(print_r($this->item, true)); + + + if ($editingCategory) { + Log::debug('Updating existing category'); + $category->update($this->sanitizeItemForUpdating($category)); + } else { + Log::debug('Creating category'); + $category->fill($this->sanitizeItemForStoring($category)); + } + + if ($category->save()) { + $this->log('Category '.$category->name.' created or updated from CSV import'); + return $category; + + } else { + Log::debug($category->getErrors()); + $this->logError($category, 'Category "'.$this->item['name'].'"'); + return $category->errors; + } + + + } +} \ No newline at end of file diff --git a/app/Importer/ItemImporter.php b/app/Importer/ItemImporter.php index b13dba25fe..9283e79ab9 100644 --- a/app/Importer/ItemImporter.php +++ b/app/Importer/ItemImporter.php @@ -110,7 +110,7 @@ class ItemImporter extends Importer protected function determineCheckout($row) { // Locations don't get checked out to anyone/anything - if ((get_class($this) == LocationImporter::class) || (get_class($this) == AssetModelImporter::class) || (get_class($this) == SupplierImporter::class) || (get_class($this) == ManufacturerImporter::class)) { + if ((get_class($this) == LocationImporter::class) || (get_class($this) == AssetModelImporter::class) || (get_class($this) == SupplierImporter::class) || (get_class($this) == ManufacturerImporter::class) || (get_class($this) == CategoryImporter::class)) { return; } diff --git a/app/Livewire/Importer.php b/app/Livewire/Importer.php index fcd2ba6d6b..eef569e314 100644 --- a/app/Livewire/Importer.php +++ b/app/Livewire/Importer.php @@ -42,6 +42,7 @@ class Importer extends Component public $consumables_fields; public $components_fields; public $manufacturers_fields; + public $categories_fields; public $aliases_fields; protected $rules = [ @@ -103,6 +104,9 @@ class Importer extends Component case 'manufacturer': $results = $this->manufacturers_fields; break; + case 'category': + $results = $this->categories_fields; + break; default: $results = []; } @@ -176,6 +180,7 @@ class Importer extends Component 'user' => trans('general.users'), 'supplier' => trans('general.suppliers'), 'manufacturer' => trans('general.manufacturers'), + 'category' => trans('general.categories'), ]; /** @@ -379,6 +384,18 @@ class Importer extends Component 'url' => trans('general.url'), ]; + $this->categories_fields = [ + 'id' => trans('general.id'), + 'name' => trans('general.name'), + 'notes' => trans('general.notes'), + 'category_type' => trans('admin/categories/general.import_category_type'), + 'eula_text' => trans('admin/categories/general.import_eula_text'), + 'use_default_eula' => trans('admin/categories/general.use_default_eula_column'), + 'require_acceptance' => trans('admin/categories/general.import_require_acceptance'), + 'checkin_email' => trans('admin/categories/general.import_checkin_email'), + ]; + + $this->assetmodels_fields = [ 'category' => trans('general.category'), diff --git a/database/factories/ImportFactory.php b/database/factories/ImportFactory.php index 95c9645524..5355cac834 100644 --- a/database/factories/ImportFactory.php +++ b/database/factories/ImportFactory.php @@ -219,4 +219,18 @@ class ImportFactory extends Factory }); } + public function categories() + { + return $this->state(function (array $attributes) { + $fileBuilder = Importing\CategoriesImportFileBuilder::new(); + $attributes['name'] = "Category {$attributes['name']}"; + $attributes['import_type'] = 'category'; + $attributes['header_row'] = $fileBuilder->toCsv()[0]; + $attributes['first_row'] = $fileBuilder->firstRow(); + + return $attributes; + }); + } + + } diff --git a/resources/lang/en-US/admin/categories/general.php b/resources/lang/en-US/admin/categories/general.php index 2fe448b44e..a468bf3e08 100644 --- a/resources/lang/en-US/admin/categories/general.php +++ b/resources/lang/en-US/admin/categories/general.php @@ -21,5 +21,9 @@ return array( 'use_default_eula' => 'Use the primary default EULA instead.', 'use_default_eula_disabled' => 'Use the primary default EULA instead. No primary default EULA is set. Please add one in Settings.', 'use_default_eula_column' => 'Use default EULA', + 'import_require_acceptance' => 'Require Acceptance', + 'import_checkin_email' => 'Send Checkin Email', + 'import_eula_text' => 'EULA text', + 'import_category_type' => 'Category Type', ); diff --git a/resources/views/livewire/importer.blade.php b/resources/views/livewire/importer.blade.php index c2514f6809..8756bd4462 100644 --- a/resources/views/livewire/importer.blade.php +++ b/resources/views/livewire/importer.blade.php @@ -191,7 +191,7 @@ - @if (($typeOfImport != 'location' && $typeOfImport!= 'assetModel' && $typeOfImport!= 'component' && $typeOfImport!= 'supplier') && $typeOfImport!= 'manufacturer' && ($typeOfImport!='')) + @if (($typeOfImport != 'location' && $typeOfImport!= 'assetModel' && $typeOfImport!= 'component' && $typeOfImport!= 'supplier') && $typeOfImport!= 'manufacturer' && $typeOfImport!= 'category' && ($typeOfImport!=''))