src/EventSubscriber/FreematicaSubscriber.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Event\CsvBeneficiaryNotExistsRowEvent;
  4. use App\Event\CsvFilterFieldsErrorRowEvent;
  5. use App\Event\CsvImportReportsFileProcessedEvent;
  6. use App\Event\CsvNotValidHeaderFileEvent;
  7. use App\Event\CsvResponseDataErrorRowEvent;
  8. use App\Service\CsvGenerator;
  9. use App\Service\FileHelper;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class FreematicaSubscriber implements EventSubscriberInterface
  13. {
  14.     /** @var LoggerInterface $errorLogger */
  15.     private $logger;
  16.     /** @var CsvGenerator $csvGenerator */
  17.     private $csvGenerator;
  18.     /**
  19.      * @param LoggerInterface $freematicaLogger
  20.      * @param CsvGenerator $csvGenerator
  21.      */
  22.     public function __construct(LoggerInterface $freematicaLoggerCsvGenerator $csvGenerator)
  23.     {
  24.         $this->logger $freematicaLogger;
  25.         $this->csvGenerator $csvGenerator;
  26.     }
  27.     /**
  28.      * @return array
  29.      */
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             CsvResponseDataErrorRowEvent::class => 'onResponseDataRowError',
  34.             CsvNotValidHeaderFileEvent::class => 'onNotValidHeaderFile',
  35.             CsvFilterFieldsErrorRowEvent::class => 'onNotValidFilterRowFields',
  36.             CsvBeneficiaryNotExistsRowEvent::class => 'onBeneficiaryNotExistsRow',
  37.             CsvImportReportsFileProcessedEvent::class => 'onImportReportsFileProcessedEvent'
  38.         ];
  39.     }
  40.     /**
  41.      * @param CsvResponseDataErrorRowEvent $event
  42.      */
  43.     public function onResponseDataRowError(CsvResponseDataErrorRowEvent $event)
  44.     {
  45.         $row $event->getRow() + 1;
  46.         $fileName $event->getFile();
  47.         $this->logger->error("Error en la Fila: $row del fichero: $fileName, error en la conexión con Freematica");
  48.     }
  49.     /**
  50.      * @param CsvNotValidHeaderFileEvent $event
  51.      */
  52.     public function onNotValidHeaderFile(CsvNotValidHeaderFileEvent $event)
  53.     {
  54.         $data $event->getData();
  55.         $this->logger->error('No se ha procesado el fichero ' $data['file'] . ' Faltan las siguientes cabeceras:' implode('--'$data['missingRequiredFields']));
  56.     }
  57.     /**
  58.      * @param CsvFilterFieldsErrorRowEvent $event
  59.      */
  60.     public function onNotValidFilterRowFields(CsvFilterFieldsErrorRowEvent $event)
  61.     {
  62.         $data $event->getData();
  63.         /* Format data */
  64.         $errorFields $this->errorDescriptions($datafalse);
  65.         $this->logger->error($this->errorDescriptionsToString($data['row'], $data['file'], $errorFields));
  66.     }
  67.     /**
  68.      * @param CsvBeneficiaryNotExistsRowEvent $event
  69.      */
  70.     public function onBeneficiaryNotExistsRow(CsvBeneficiaryNotExistsRowEvent $event)
  71.     {
  72.         $row $event->getRow() + 1;
  73.         $fileName $event->getFile();
  74.         $this->logger->error("Error en la Fila: $row del fichero: $fileName, no se ha encontrado el beneficiario");
  75.     }
  76.     /**
  77.      * @param CsvImportReportsFileProcessedEvent $event
  78.      */
  79.     public function onImportReportsFileProcessedEvent(CsvImportReportsFileProcessedEvent $event)
  80.     {
  81.         foreach ($event->getErrorsByType() as $key => $item) {
  82.             if (!empty($item)) {
  83.                 if ($key === FileHelper::ERROR_DATA_DESCRIPTION_PATH) {
  84.                     $data = [];
  85.                     foreach ($item as $key1 => $value) {
  86.                         $data[] = $this->errorDescriptionsForFile(
  87.                             $key1$event->getMovedPath(), $this->errorDescriptions($valuetrue)
  88.                         );
  89.                     }
  90.                     $item $data;
  91.                 }
  92.                 $errorMovedPath $this->getErrorPath($event->getMovedPath(), $key);
  93.                 $this->csvGenerator->generateFile($item$errorMovedPath);
  94.             }
  95.         }
  96.     }
  97.     /**
  98.      * @param string $movedPath
  99.      * @param string $errorPath
  100.      * @return string
  101.      */
  102.     private function getErrorPath(string $movedPathstring $errorPath): string
  103.     {
  104.         $delimiter '/';
  105.         $file str_replace(FileHelper::PROCESSED_PATH''$movedPath);
  106.         $fileName explode($delimiter$file);
  107.         // Create directory if not exists
  108.         $collectivePath $errorPath $delimiter $fileName[1];
  109.         $this->csvGenerator->createDirectory($collectivePath);
  110.         return $collectivePath $delimiter $fileName[2];
  111.     }
  112.     /**
  113.      * @param array $data
  114.      * @param bool $fileType
  115.      * @return array
  116.      */
  117.     private function errorDescriptions(array $databool $fileType): array
  118.     {
  119.         /* Format data */
  120.         if ($fileType) {
  121.             return array_map(function ($key$value) {
  122.                 return "$key$value";
  123.             }, array_keys($data), array_values($data));
  124.         }
  125.         return array_map(function ($key$value) {
  126.             return "< $key => $value >";
  127.         }, array_keys($data['errorFields']), array_values($data['errorFields']));
  128.     }
  129.     /**
  130.      * @param int $row
  131.      * @param string $movedPath
  132.      * @param array $errorFields
  133.      * @return string
  134.      */
  135.     private function errorDescriptionsToString(int $rowstring $movedPath, array $errorFields): string
  136.     {
  137.         $row ++;
  138.         return "Error en la Fila: $row del fichero: $movedPath, Campos con error:" implode(' | '$errorFields);
  139.     }
  140.     /**
  141.      * @param int $row
  142.      * @param string $movedPath
  143.      * @param array $errorFields
  144.      * @return array
  145.      */
  146.     private function errorDescriptionsForFile(int $rowstring $movedPath, array $errorFields): array
  147.     {
  148.         $row ++;
  149.         return [
  150.             'Fila' => "Error en la Fila: $row",
  151.             'Fichero' => $movedPath,
  152.             'Campos con error' => implode("\r\n"$errorFields)
  153.         ];
  154.     }
  155. }