From 961b352508fe278f0f748c5fa165e3099d45c2c1 Mon Sep 17 00:00:00 2001 From: Marcel Diegelmann Date: Tue, 22 Jul 2025 10:30:22 +0200 Subject: [PATCH] BOMImporter: Verbesserung des CSV-Parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Das Parsing wurde angepasst, um sowohl Komma- als auch Semikolon-getrennte CSV-Dateien zu unterstützen. Zudem werden Spaltennamen in Kleinbuchstaben konvertiert und zusätzliche Fallback-Logik für bestimmte Felder hinzugefügt. --- .../ImportExportSystem/BOMImporter.php | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Services/ImportExportSystem/BOMImporter.php b/src/Services/ImportExportSystem/BOMImporter.php index d1c5f939..5332d558 100644 --- a/src/Services/ImportExportSystem/BOMImporter.php +++ b/src/Services/ImportExportSystem/BOMImporter.php @@ -446,14 +446,27 @@ class BOMImporter function parseCsv(string $csvData, string $objectType = ProjectBOMEntry::class): ImporterResult { $result = new ImporterResult(); - $rows = explode("\n", trim($csvData)); - $headers = str_getcsv(array_shift($rows), ';'); + $rows = explode("\r\n", trim($csvData)); + $headers = str_getcsv(array_shift($rows), ','); + + if (count($headers) === 1 && isset($headers[0])) { + //If only one column was recognized, try fallback with semicolon as a separator + $headers = str_getcsv($headers[0], ';'); + } foreach ($rows as $key => $row) { $entry = []; - $values = str_getcsv($row, ';'); + $values = str_getcsv($row, ','); + + if (count($values) === 1 || count($values) !== count($headers)) { + //If only one column was recognized, try fallback with semicolon as a separator + $values = str_getcsv($row, ';'); + } foreach ($headers as $index => $column) { + //Change the column names in small letters + $column = strtolower($column); + //Convert column name into hierarchy $path = explode('_', $column); $temp = &$entry; @@ -506,6 +519,11 @@ class BOMImporter )); } + if (isset($entry['id']) && is_numeric($entry['id'])) { + //Use id column as a fallback for the expected part_id column + $entry['part']['id'] = (int) $entry['id']; + } + if (isset($entry['part'])) { $this->processPart($entry, $result, $key, $objectType, self::IMPORT_TYPE_CSV); } else { @@ -788,7 +806,12 @@ class BOMImporter $bomEntry->setQuantity((float) $entry['quantity']); if (isset($entry['name'])) { - $bomEntry->setName(trim($entry['name']) === '' ? null : trim ($entry['name'])); + $givenName = trim($entry['name']) === '' ? null : trim ($entry['name']); + + if ($givenName !== null && $bomEntry->getPart() !== null && $bomEntry->getPart()->getName() !== $givenName) { + //Apply different names for parts list entry + $bomEntry->setName(trim($entry['name']) === '' ? null : trim ($entry['name'])); + } } else { $bomEntry->setName(null); }