log(__CLASS__ . ' Démarrage du traitement'); $files = Storage::disk('tracabilite')->files(); // Suppression des fichiers dans archives qui ont plus de 2j $archives = Storage::disk('tracabilite')->files('archives'); foreach ($archives as $archive) { if ($archive == ".gitignore" || $archive == ".gitkeep") { continue; } if (Storage::disk('tracabilite')->lastModified($archive) < strtotime(Carbon::now()->subDays(2))) { Storage::disk('tracabilite')->delete($archive); } } $progress = 0; $total = count($files) - 1; foreach ($files as $filename) { if ($filename == ".gitignore" || $filename == ".gitkeep") { continue; } // ---- Récupération du contenu $file = Storage::disk('tracabilite')->get($filename); $fileContent = simplexml_load_string('' . $file . ''); // Transforme le fichier en tableau de données $tracas = $this->extract($fileContent); // Mise en BDD des données du fichier xml $fields = []; foreach ($tracas['ENRLOT'] as $traca) { $fields[] = $this->processFields($traca); } // Mise en base des données foreach ($fields as $field) { $checkFields = [ 'no_lot' => $field["no_lot"], 'no_opa' => $field['no_opa'], 'no_elev' => $field['no_elev'] ]; TraceabilityDatas::updateOrCreate($checkFields, $field); } Storage::disk('tracabilite')->move($filename, 'archives/' . $filename); $this->log(__CLASS__ . sprintf(' traitement %d sur %s ', $progress++, $total)); } $this->log(__CLASS__ . ' Fin du traitement'); } private function log(string $message) { if ($this->console) { $this->console->info($message); } Log::debug($message); } private function extract($sxe = null) { if (!$sxe instanceof SimpleXMLElement) { return array(); } $extract = array(); foreach ($sxe->children() as $key => $value) { if (array_key_exists($key, $extract)) { if (!isset($extract[$key][0])) { $tmp_extract = $extract[$key]; $extract[$key] = array(); $extract[$key][0] = $tmp_extract; } else { $extract[$key] = (array)$extract[$key]; } } if ($value->count()) { if (isset($extract[$key]) && is_array($extract[$key])) { $extract[$key][] = $this->extract($value); } else { $extract[$key] = $this->extract($value); } } else { if (isset($extract[$key]) && is_array($extract[$key])) { $extract[$key][] = empty(strval($value)) && strval($value) !== '0' ? null : strval($value); } else { $extract[$key] = empty(strval($value)) && strval($value) !== '0' ? null : strval($value); } } } return $extract; } private function processFields($fields) { $result = []; foreach ($fields as $key => $field) { // Le ctype_upper est la pour les balise entièrement en majuscule $result[strtolower($key)] = $field; } return $result; } }