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!=''))