BOMImporter: Verbesserung des CSV-Parsing

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.
This commit is contained in:
Marcel Diegelmann 2025-07-22 10:30:22 +02:00
parent 607050aecb
commit 961b352508

View file

@ -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);
}