Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/Http/Controllers/Api/ImportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public function store() : JsonResponse
if (function_exists('iconv')) {
$file_contents = $file->getContent(); //TODO - this *does* load the whole file in RAM, but we need that to be able to 'iconv' it?
$encoding = $detector->getEncoding($file_contents);
\Log::warning("Discovered encoding: $encoding in uploaded CSV");
\Log::debug("Discovered encoding: $encoding in uploaded CSV");
$reader = null;
if (strcasecmp($encoding, 'UTF-8') != 0) {
$transliterated = false;
Expand Down Expand Up @@ -103,7 +103,7 @@ public function store() : JsonResponse
$reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak?

try {
$import->header_row = $reader->fetchOne(0);
$import->header_row = $reader->nth(0);
} catch (JsonEncodingException $e) {
return response()->json(
Helper::formatStandardApiResponse(
Expand Down Expand Up @@ -136,7 +136,7 @@ public function store() : JsonResponse

try {
// Grab the first row to display via ajax as the user picks fields
$import->first_row = $reader->fetchOne(1);
$import->first_row = $reader->nth(1);
} catch (JsonEncodingException $e) {
return response()->json(
Helper::formatStandardApiResponse(
Expand Down
25 changes: 23 additions & 2 deletions app/Importer/AssetModelImporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,32 @@ public function createAssetModelIfNotExists(array $row)
{

$editingAssetModel = false;
$assetModel = AssetModel::where('name', '=', $this->findCsvMatch($row, 'name'))->first();

/**
* This part gets a little confusing, since folks might be importing multiple models with the same name and different model numbers for the first time
* or they might be wanting to update existing models with new model numbers.
*/

// They are not trying to update existing models, so we'll check for duplicates with model name *and* number
if (! $this->updating) {
$this->log('Finding model by name and model number: '.$this->findCsvMatch($row, 'name').' / '.$this->findCsvMatch($row, 'model_number'));
$assetModel = AssetModel::where('name', '=', $this->findCsvMatch($row, 'name'))->where('model_number', '=', $this->findCsvMatch($row, 'model_number'))->first();
} else {

if ($this->findCsvMatch($row, 'id')!='') {
// Override model if an ID was given
$this->log('Finding model by ID: '.$this->findCsvMatch($row, 'id'));
$assetModel = AssetModel::find($this->findCsvMatch($row, 'id'));
} else {
$this->log('Finding model by name: '.$this->findCsvMatch($row, 'name'));
$assetModel = AssetModel::where('name', '=', $this->findCsvMatch($row, 'name'))->first();
}
}


if ($assetModel) {
if (! $this->updating) {
$this->log('A matching Model '.$this->item['name'].' already exists');
$this->log('A matching Model '.$this->item['name'].' already exists and we are not updating. Skipping.');
return;
}

Expand Down
1 change: 1 addition & 0 deletions app/Livewire/Importer.php
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,7 @@ public function mount()


$this->assetmodels_fields = [
'id' => trans('general.id'),
'category' => trans('general.category'),
'eol' => trans('general.eol'),
'fieldset' => trans('admin/models/general.fieldset'),
Expand Down
24 changes: 12 additions & 12 deletions tests/Feature/Importing/Api/ImportAssetModelsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,28 +113,28 @@ public function whenRequiredColumnsAreMissingInImportFile(): void
#[Test]
public function updateAssetModelFromImport(): void
{
$assetmodel = AssetModel::factory()->create()->refresh();
$category = Category::find($assetmodel->category->name);
$importFileBuilder = ImportFileBuilder::new(['name' => $assetmodel->name, 'model_number' => Str::random(), 'category' => $category]);
$assetmodel = AssetModel::factory()->create();
$category = Category::find($assetmodel->category_id);
$importFileBuilder = ImportFileBuilder::new(['name' => $assetmodel->name, 'model_number' => Str::random(), 'category' => $category->name]);

$row = $importFileBuilder->firstRow();
$import = Import::factory()->assetmodel()->create(['file_path' => $importFileBuilder->saveToImportsDirectory()]);

$this->actingAsForApi(User::factory()->superuser()->create());
$this->importFileResponse(['import' => $import->id, 'import-update' => true])->assertOk();
$this->importFileResponse(['import' => $import->id, 'import-update' => true])
->assertOk()
->assertExactJson([
'payload' => null,
'status' => 'success',
'messages' => ['redirect_url' => route('models.index')]
]);

$updatedAssetmodel = AssetModel::query()->find($assetmodel->id);
$updatedAttributes = [
'name',
'model_number'
];

$this->assertEquals($row['model_number'], $updatedAssetmodel->model_number);
$this->assertEquals($row['name'], $updatedAssetmodel->name);

$this->assertEquals(
Arr::except($assetmodel->attributesToArray(), array_merge($updatedAttributes, $assetmodel->getDates())),
Arr::except($updatedAssetmodel->attributesToArray(), array_merge($updatedAttributes, $assetmodel->getDates())),
);
}


}
Loading