public function import($file, OutputInterface $output) { $csvFile = new CsvFile($file); $csv = $csvFile->getCsv(); $i = 0; $cptTotal = 0; $progress = new ProgressBar($output, 100); $progress->start(); $configuration = $this->dm->getRepository('AppBundle:Configuration')->findConfiguration(); $produitsArray = $configuration->getProduitsArray(); $prestationsType = $this->dm->getRepository('AppBundle:Configuration')->findConfiguration()->getPrestationsArray(); foreach ($csv as $data) { if ($data[self::CSV_ETABLISSEMENT_ID] == "000000") { continue; } if (!preg_match('/^[0-9]+$/', $data[self::CSV_ETABLISSEMENT_ID])) { $output->writeln(sprintf("<error>établissement dont le numéro %s n'est pas correct</error>", $data[self::CSV_ETABLISSEMENT_ID])); continue; } $etablissement = $this->em->getRepository()->findOneByIdentifiantReprise($data[self::CSV_ETABLISSEMENT_ID]); if (!$etablissement) { $output->writeln(sprintf("<error>L'établissement %s n'existe pas</error>", $data[self::CSV_ETABLISSEMENT_ID])); continue; } $passage = new Passage(); $passage->setEtablissement($etablissement); if (!$data[self::CSV_DATE_PREVISION]) { $output->writeln(sprintf("<error>Le passage %s ne possède aucune date de prévision!</error>", $data[self::CSV_OLD_ID])); continue; } $passage->setDatePrevision(new \DateTime($data[self::CSV_DATE_PREVISION])); $passage->setIdentifiantReprise($data[self::CSV_OLD_ID]); $passage->setNumeroArchive($data[self::CSV_OLD_ID]); $contrat = $this->cm->getRepository()->findOneByIdentifiantReprise($data[self::CSV_CONTRAT_ID]); if (!$contrat) { //$output->writeln(sprintf("<error>Le contrat %s n'existe pas</error>", $data[self::CSV_CONTRAT_ID])); continue; } $this->dm->persist($passage); $doublonPassage = $this->pm->getRepository()->findOneById($passage->getId()); if ($doublonPassage) { $output->writeln(sprintf("<comment>Le passage d'id %s existe déjà en base (%s)!</comment>", $passage->getId(), $data[self::CSV_OLD_ID])); } $resultStatut = $this->generateStatut($data, $passage, $output); $passage->updateStatut(); if (!$resultStatut) { $output->writeln(sprintf("<error>Aucun statut déterminable pour le passage d'id %s (%s)!</error>", $passage->getId(), $data[self::CSV_OLD_ID])); continue; } $passage->setLibelle($data[self::CSV_LIBELLE]); $passage->setTypePassage($data[self::CSV_TYPE_PASSAGE]); $passage->setDescription(str_replace('#', "\n", $data[self::CSV_DESCRIPTION])); if (!preg_match('/^[0-9]+$/', $data[self::CSV_CONTRAT_ID])) { $output->writeln(sprintf("<error>Passage dont le numéro %s n'est pas correct</error>", $data[self::CSV_CONTRAT_ID])); continue; } if ($data[self::CSV_PRESTATIONS]) { $prestations = explode('#', $data[self::CSV_PRESTATIONS]); foreach ($prestations as $prestationNom) { if (trim($prestationNom) != "") { $prestationIdentifiant = strtoupper(Transliterator::urlize($prestationNom)); if (!array_key_exists($prestationIdentifiant, $prestationsType)) { $output->writeln(sprintf("<comment>La prestation : %s n'existe pas dans la configuration </comment>", $prestationIdentifiant)); continue; } $prestation = $prestationsType[$prestationIdentifiant]; $passage->addPrestation($prestation); $this->dm->persist($passage); } } } else { $output->writeln(sprintf("<comment>Le passage : %s n'a aucune presta </comment>", $data[self::CSV_OLD_ID])); } $identifiantRepriseTechnicien = $data[self::CSV_TECHNICIEN]; if (!is_null($identifiantRepriseTechnicien)) { $compte = $this->um->getRepository()->findOneByIdentifiantReprise($identifiantRepriseTechnicien); if (!is_null($compte)) { $passage->addTechnicien($compte); } } $passage->setContrat($contrat); $passage->setNumeroContratArchive($contrat->getNumeroArchive()); $produits = explode('#', $data[self::CSV_PRODUITS]); foreach ($produits as $produitStr) { if ($produitStr) { $produitdetail = explode('~', $produitStr); $produitQte = 0; $produitLib = $produitdetail[0]; if (count($produitdetail) > 1) { $produitQte = $produitdetail[1]; } if ($produitLib) { $produitToAdd = clone $produitsArray[strtoupper(Transliterator::urlize($produitLib))]; $produitToAdd->setNbUtilisePassage(0); $produitToAdd->setNbTotalContrat(null); $produitToAdd->setNbUtilisePassage($produitQte); $passage->addProduit($produitToAdd); $this->dm->persist($passage); } } } $contrat->addEtablissement($etablissement); $contrat->addPassage($etablissement, $passage); $i++; $cptTotal++; if ($cptTotal % (count($csv) / 100) == 0) { $progress->advance(); } if ($i >= 2000) { $this->dm->flush(); $this->dm->clear(); gc_collect_cycles(); $i = 0; } } $this->dm->flush(); $progress->finish(); }