diff --git a/src/Command/CleanMobileCommand.php b/src/Command/CleanMobileCommand.php index dac0900..0b3becd 100644 --- a/src/Command/CleanMobileCommand.php +++ b/src/Command/CleanMobileCommand.php @@ -72,7 +72,24 @@ final class CleanMobileCommand extends Command // ------------------------------------------------------------- // 2️⃣ CSV reader / writer (semicolon‑separated) // ------------------------------------------------------------- - $csvReader = Reader::createFromPath($inputPath, 'r'); + $contents = file_get_contents($inputPath); + if ($contents === false) { + $io->error("Could not read input file: $inputPath"); + return Command::FAILURE; + } + + // Keep UTF-8 files unchanged; convert legacy exports before parsing + // so every field (including clinic names and headers) is UTF-8. + if (preg_match('//u', $contents) !== 1) { + $contents = iconv('ISO-8859-1', 'UTF-8', $contents); + if ($contents === false) { + $io->error('Could not convert input file from ISO-8859-1 to UTF-8.'); + return Command::FAILURE; + } + $io->note('Converted input from ISO-8859-1 to UTF-8.'); + } + + $csvReader = Reader::createFromString($contents); $csvReader->setDelimiter(';'); $csvReader->setHeaderOffset(0); // first line = header $header = $csvReader->getHeader(); @@ -95,26 +112,6 @@ final class CleanMobileCommand extends Command '17', ]; - $sanitiseUtf8 = static function(?string $raw): ?string { - $utf8 = null; - if (mb_check_encoding($raw, 'UTF-8')) { - $utf8 = $raw; - } else { - $encodings = ['Windows-1252', 'ISO-8859-1', 'CP1252', 'ASCII']; - foreach ($encodings as $src) { - $utf8 = @iconv($src, 'UTF-8//TRANSLIT//IGNORE', $raw); - if ($utf8 !== false) { - break; - } - } - if ($utf8 === false) { - // Could not be converted – treat it as “invalid”. - return null; - } - } - return $utf8; - }; - // ------------------------------------------------------------- // 4️⃣ Helper closures // ------------------------------------------------------------- @@ -234,7 +231,7 @@ final class CleanMobileCommand extends Command $contact->setParsedAt(new \DateTimeImmutable()); $contact->setStudyId($study_id); $contact->setParsedFileLinenum($rowCount + 1); - $contact->setParsedFileLine($sanitiseUtf8(implode(';', $row))); + $contact->setParsedFileLine(implode(';', $row)); // $contact->setMsgContentType($rowCount % 2 ? 1 : 2); // alternativ lang oder kurz $contact->setMsgContentType(2); // nur kurzformat $quartal = $today->format('Y') . ceil($today->format('n') / 3);