src/Controller/SiteController.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\LogArchivos;
  4. use App\Entity\LogArchivosImportacionDetalle;
  5. use App\Entity\LogRechazadosDebitosAutomaticosDet;
  6. use App\Repository\ComprobantesRepository;
  7. use App\Repository\RecibosRepository;
  8. use App\Service\ArrayAdapter;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\Persistence\ManagerRegistry as PersistenceManagerRegistry;
  11. use phpDocumentor\Reflection\Types\Boolean;
  12. use Sonata\AdminBundle\Templating\TemplateRegistryInterface;
  13. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. use Symfony\Component\Filesystem\Filesystem;
  17. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  18. use Symfony\Component\Form\Extension\Core\Type\FileType;
  19. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  20. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Validator\Constraints\File;
  27. use Symfony\Component\HttpFoundation\File\File as FileFile;
  28. use DateTime;
  29. class SiteController extends AbstractController
  30. {
  31.     private TemplateRegistryInterface $templateRegistry;
  32.     protected $container;
  33.     public function __construct(
  34.         ContainerInterface                 $container,
  35.         TemplateRegistryInterface          $templateRegistry,
  36.         private ComprobantesRepository     $comprobantesRepository,
  37.         private RecibosRepository          $recibosRepository,
  38.         private PersistenceManagerRegistry $doctrine,
  39.         private ArrayAdapter               $arrayAdapter,
  40.         private RecibosAdminController     $recibosAdminController,
  41.         private EntityManagerInterface     $entityManager,
  42.         private RequestStack               $requestStack
  43.     )
  44.     {
  45.         $this->container $container;
  46.         $this->templateRegistry $templateRegistry;
  47.     }
  48.     /**
  49.      * @Route("/", name="index")
  50.      */
  51.     public function index(): Response
  52.     {
  53.         return $this->redirectToRoute('sonata_admin_dashboard');
  54.     }
  55.     #[Route('/admin/archivos/exportar'name'app_archivos_exportar'methods: ['GET''POST'])]
  56.     public function exportarArchivos(Request $request)
  57.     {
  58.         $this->denyAccessUnlessGranted('ROLE_ARCHIVOS_EXP_IMP');
  59.         $fechaActual = new \DateTime();
  60.         $anioActual date_format($fechaActual'Y');
  61.         $mesActual date_format($fechaActual'n'); //NUMERO DEL MES SIN 0 PARA LOS MESES DE UN DIGITO
  62.         $form $this->createFormBuilder()
  63.             ->add('tipo'ChoiceType::class, [
  64.                 'choices' => [
  65.                     'Por tarjeta' => 'tarjeta',
  66.                     'Por CBU' => 'cbu',
  67.                     'Por planilla' => 'planilla',
  68.                 ],
  69.                 "attr" => ['class' => "form-control"]
  70.             ])
  71.             ->add('organismo'EntityType::class, ['class' => 'App\Entity\Organismos'"attr" => ['class' => "form-control"], 'placeholder' => 'Todos''required' => false])
  72.             ->add('tarjeta'EntityType::class, ['class' => 'App\Entity\Tarjetas'"attr" => ['class' => "form-control"]])
  73.             ->add('periodoMes'ChoiceType::class, [
  74.                 'choices' => [
  75.                     '1' => '1',
  76.                     '2' => '2',
  77.                     '3' => '3',
  78.                     '4' => '4',
  79.                     '5' => '5',
  80.                     '6' => '6',
  81.                     '7' => '7',
  82.                     '8' => '8',
  83.                     '9' => '9',
  84.                     '10' => '10',
  85.                     '11' => '11',
  86.                     '12' => '12',
  87.                 ],
  88.                 'data' => $mesActual,
  89.                 'label' => 'Mes'
  90.             ])
  91.             ->add('periodoAnio'ChoiceType::class, [
  92.                 'choices' => [
  93.                     $anioActual => $anioActual 1,
  94.                     $anioActual => $anioActual,
  95.                     $anioActual => $anioActual 1,
  96.                 ],
  97.                 'data' => $anioActual,
  98.                 'label' => 'Año'
  99.             ])
  100.             ->add('exportar'SubmitType::class, array('label' => 'Exportar'"attr" => array('class' => "btn btn-success")))
  101.             ->getForm();
  102.         $form->handleRequest($request);
  103.         if ($form->isSubmitted() && $form->isValid()) { // si el formulario es valido
  104.             $params $form->getData();
  105.             $this->grabarLog('exportacion'$params);
  106.             if ($params['tipo'] == 'tarjeta') {
  107.                 $comprobantesDebitoAutomaticoTarjeta $this->comprobantesRepository->getComprobantesDebitoAutomaticoTarjeta($params['periodoMes'], $params['periodoAnio'], $params['tarjeta']->getId());
  108.                 if ($comprobantesDebitoAutomaticoTarjeta) {
  109.                     return $this->generarArchivo($comprobantesDebitoAutomaticoTarjeta$params);
  110.                 } else {
  111.                     $this->addFlash('error''¡No existen comprobantes para los filtros aplicados!');
  112.                 }
  113.                 $vars = array(
  114.                     'form' => $form->createView(),
  115.                     'base_template' => $this->templateRegistry->getTemplate('layout'),
  116.                 );
  117.                 return $this->render('\archivos\exportar.html.twig'$vars);
  118.             }
  119.         } else {
  120.             $vars = array(
  121.                 'form' => $form->createView(),
  122.                 'base_template' => $this->templateRegistry->getTemplate('layout'),
  123.             );
  124.             return $this->render('\archivos\exportar.html.twig'$vars);
  125.         }
  126.     }
  127.     #[Route('/admin/archivos/importar'name'app_archivos_importar'methods: ['GET''POST'])]
  128.     public function importarArchivos(Request $request)
  129.     {
  130.         $this->denyAccessUnlessGranted('ROLE_ARCHIVOS_EXP_IMP');
  131.         $fechaActual = new \DateTime();
  132.         $anioActual date_format($fechaActual'Y');
  133.         $mesActual date_format($fechaActual'n'); // NUMERO DEL MES SIN 0 PARA LOS MESES DE UN DIGITO
  134.         $tipoPuntoVenta 1// ENTRENAMIENTO
  135.         $form $this->createFormBuilder()
  136.             ->add('tipo'ChoiceType::class, [
  137.                 'choices' => [
  138.                     'Por tarjeta' => 'tarjeta',
  139.                     'Por CBU' => 'cbu',
  140.                     'Por planilla' => 'planilla',
  141.                 ],
  142.                 "attr" => ['class' => "form-control"]
  143.             ])
  144.             ->add('organismo'EntityType::class, ['class' => 'App\Entity\Organismos'"attr" => ['class' => "form-control"], 'placeholder' => 'Todos''required' => false])
  145.             ->add('tarjeta'EntityType::class, ['class' => 'App\Entity\Tarjetas'"attr" => ['class' => "form-control"]])
  146.             ->add('periodoMes'ChoiceType::class, [
  147.                 'choices' => [
  148.                     '1' => '1',
  149.                     '2' => '2',
  150.                     '3' => '3',
  151.                     '4' => '4',
  152.                     '5' => '5',
  153.                     '6' => '6',
  154.                     '7' => '7',
  155.                     '8' => '8',
  156.                     '9' => '9',
  157.                     '10' => '10',
  158.                     '11' => '11',
  159.                     '12' => '12',
  160.                 ],
  161.                 'data' => $mesActual,
  162.                 'label' => 'Mes'
  163.             ])
  164.             ->add('periodoAnio'ChoiceType::class, [
  165.                 'choices' => [
  166.                     $anioActual => $anioActual 1,
  167.                     $anioActual => $anioActual,
  168.                     $anioActual => $anioActual 1,
  169.                 ],
  170.                 'data' => $anioActual,
  171.                 'label' => 'Año'
  172.             ])
  173.             ->add('puntoVentaTipoComprobante'EntityType::class, array('class' => 'App\Entity\PuntoVentaTipocomprobante',
  174.                 'required' => true,
  175.                 'query_builder' => function (\Doctrine\ORM\EntityRepository $repository) use ($tipoPuntoVenta) {
  176.                     return $repository->createQueryBuilder('d')
  177.                         ->leftJoin('d.puntoVenta''pv')
  178.                         ->leftJoin('d.tipocomprobantes''tc')
  179.                         ->where('pv.puntoVentaTipo = :tipoPuntoVenta and tc.categoria = 2'// RECIBOS
  180.                         ->setParameter('tipoPuntoVenta'$tipoPuntoVenta);
  181.                 },
  182.             ))
  183.             ->add('archivo'FileType::class, [
  184.                 'label' => 'Archivo (txt)',
  185.                 'required' => true,
  186.                 'constraints' => [
  187.                     new File([
  188.                         'mimeTypes' => [
  189.                             'text/plain',
  190.                         ],
  191.                         'mimeTypesMessage' => 'Por favor, suba un archivo txt',
  192.                     ])
  193.                 ],
  194.             ])
  195.             ->add('importar'SubmitType::class, array('label' => 'Importar'"attr" => array('class' => "btn btn-success")))
  196.             ->getForm();
  197.         $form->handleRequest($request);
  198.         if ($form->isSubmitted() && $form->isValid()) { // si el formulario es valido
  199.             $params $form->getData();
  200.             $logArchivos $this->grabarLog('importacion'$params);
  201.             $params['logArchivos'] = $logArchivos;
  202.             if ($params['tipo'] == 'tarjeta') {
  203.                 $this->procesarArchivo($params);
  204.                 $vars = array(
  205.                     'form' => $form->createView(),
  206.                     'base_template' => $this->templateRegistry->getTemplate('layout'),
  207.                 );
  208.                 return $this->render('\archivos\importar.html.twig'$vars);
  209.             }
  210.         } else {
  211.             $vars = array(
  212.                 'form' => $form->createView(),
  213.                 'base_template' => $this->templateRegistry->getTemplate('layout'),
  214.             );
  215.             return $this->render('\archivos\importar.html.twig'$vars);
  216.         }
  217.     }
  218.     #[Route('/admin/archivos/importarrechazados'name'app_archivos_importar_rechazados'methods: ['GET''POST'])]
  219.     public function importarArchivosRechazados(Request $request)
  220.     {
  221.         $this->denyAccessUnlessGranted('ROLE_ARCHIVOS_EXP_IMP');
  222.         $fechaActual = new \DateTime();
  223.         $anioActual date_format($fechaActual'Y');
  224.         $mesActual date_format($fechaActual'n'); // NUMERO DEL MES SIN 0 PARA LOS MESES DE UN DIGITO
  225.         $tipoPuntoVenta 1// ENTRENAMIENTO
  226.         $form $this->createFormBuilder()
  227.             ->add('tipo'ChoiceType::class, [
  228.                 'choices' => [
  229.                     'Por tarjeta' => 'tarjeta',
  230.                     'Por CBU' => 'cbu',
  231.                     'Por planilla' => 'planilla',
  232.                 ],
  233.                 "attr" => ['class' => "form-control"]
  234.             ])
  235.             ->add('organismo'EntityType::class, ['class' => 'App\Entity\Organismos'"attr" => ['class' => "form-control"], 'placeholder' => 'Todos''required' => false])
  236.             ->add('tarjeta'EntityType::class, ['class' => 'App\Entity\Tarjetas'"attr" => ['class' => "form-control"]])
  237.             ->add('periodoMes'ChoiceType::class, [
  238.                 'choices' => [
  239.                     '1' => '1',
  240.                     '2' => '2',
  241.                     '3' => '3',
  242.                     '4' => '4',
  243.                     '5' => '5',
  244.                     '6' => '6',
  245.                     '7' => '7',
  246.                     '8' => '8',
  247.                     '9' => '9',
  248.                     '10' => '10',
  249.                     '11' => '11',
  250.                     '12' => '12',
  251.                 ],
  252.                 'data' => $mesActual,
  253.                 'label' => 'Mes'
  254.             ])
  255.             ->add('periodoAnio'ChoiceType::class, [
  256.                 'choices' => [
  257.                     $anioActual => $anioActual 1,
  258.                     $anioActual => $anioActual,
  259.                     $anioActual => $anioActual 1,
  260.                 ],
  261.                 'data' => $anioActual,
  262.                 'label' => 'Año'
  263.             ])
  264.             ->add('archivo'FileType::class, [
  265.                 'label' => 'Archivo (txt)',
  266.                 'required' => true,
  267.                 'constraints' => [
  268.                     new File([
  269.                         'mimeTypes' => [
  270.                             'text/plain',
  271.                         ],
  272.                         'mimeTypesMessage' => 'Por favor, suba un archivo txt',
  273.                     ])
  274.                 ],
  275.             ])
  276.             ->add('importar'SubmitType::class, array('label' => 'Importar'"attr" => array('class' => "btn btn-success")))
  277.             ->getForm();
  278.         $form->handleRequest($request);
  279.         if ($form->isSubmitted() && $form->isValid()) { // si el formulario es valido
  280.             $params $form->getData();
  281.             $logArchivos $this->grabarLog('rechazados'$params);
  282.             $params['logArchivos'] = $logArchivos;
  283.             if ($params['tipo'] == 'tarjeta') {
  284.                 $this->procesarArchivoObservacion($params);
  285.                 $this->addFlash('success''¡Archivo importado con exito!');
  286.                 $vars = array(
  287.                     'form' => $form->createView(),
  288.                     'base_template' => $this->templateRegistry->getTemplate('layout'),
  289.                 );
  290.                 return $this->render('\archivos\importarrechazados.html.twig'$vars);
  291.             }
  292.         } else {
  293.             $vars = array(
  294.                 'form' => $form->createView(),
  295.                 'base_template' => $this->templateRegistry->getTemplate('layout'),
  296.             );
  297.             return $this->render('\archivos\importarrechazados.html.twig'$vars);
  298.         }
  299.     }
  300.     public function grabarLog($accion$form)
  301.     {
  302.         $form['tarjeta'] = $form['tarjeta']->getNombre();
  303.         if (isset($form['puntoVentaTipoComprobante'])) {
  304.             $form['puntoVentaTipoComprobante'] = $form['puntoVentaTipoComprobante']->getPuntoVenta() . " " $form['puntoVentaTipoComprobante']->getTipocomprobantes();
  305.         }
  306.         unset($form['archivo']);
  307.         $logArchivos = new LogArchivos();
  308.         $logArchivos->setUser($this->getUser());
  309.         $logArchivos->setAccion($accion);
  310.         $logArchivos->setFechaCreacion(new \DateTime());
  311.         $logArchivos->setForm(json_encode($form));
  312.         $em $this->doctrine->getManager();
  313.         $em->persist($logArchivos);
  314.         $em->flush();
  315.         return $logArchivos;
  316.     }
  317.     public function generarArchivo($comprobantesDebitoAutomaticoTarjeta$params)
  318.     {
  319.         $tarjetaId $params['tarjeta']->getId();
  320.         switch ($tarjetaId) {
  321.             case 231// VISA - DEBITO -
  322.                 return $this->generarArchivoExportacionFiserv($comprobantesDebitoAutomaticoTarjeta);
  323.                 break;
  324.             case 151// VISA - CREDITO -
  325.                 return $this->generarArchivoExportacionFiserv($comprobantesDebitoAutomaticoTarjeta);
  326.                 break;
  327.             case 71// MASTERCARD - CREDITO -
  328.                 return $this->generarArchivoExportacionFiserv($comprobantesDebitoAutomaticoTarjeta);
  329.                 break;
  330.             case 141// UNICA - CREDITO -
  331.                 return $this->generarArchivoExportacionUnica($comprobantesDebitoAutomaticoTarjeta);
  332.                 break;
  333.             default:
  334.                 $this->addFlash('error''¡No se encontró un procesador para la tarjeta seleccionada!');
  335.                 $request $this->requestStack->getCurrentRequest();
  336.                 return $this->redirectToRoute($request->attributes->get('_route'));
  337.         }
  338.     }
  339.     public function generarArchivoExportacionFiserv($comprobantesDebitoAutomaticoTarjeta): BinaryFileResponse
  340.     {
  341.         $sumatoriaImportes 0;
  342.         $detalles = array();
  343.         $numero_comercio $this->getParameter('fiserv_number_store');
  344.         foreach ($comprobantesDebitoAutomaticoTarjeta as $comp) {
  345.             $comp['fecha_vencimiento'] = new DateTime($comp['fecha_vencimiento']);
  346.             $comp['fecha_vencimiento_formateada'] = $comp['fecha_vencimiento']->format('d-m-y');
  347.             $importe str_replace('.''', (number_format(floatval($comp['importe']), 2'.''')));
  348.             $dataDetalle = array(
  349.                 'nro_comercio' => str_pad($numero_comercio8'0'STR_PAD_LEFT),
  350.                 'tipo_registro' => '2',
  351.                 'nro_tarjeta' => $comp['numero_tarjeta'],
  352.                 'nro_referencia' => str_pad($comp['comp_id'], 12'0'STR_PAD_LEFT),
  353.                 'cuotas' => '001',
  354.                 'cuotasplan' => '999',
  355.                 'frecuenciadb' => '01',
  356.                 'importe' => str_pad($importe11'0'STR_PAD_LEFT),
  357.                 'periodo' => str_pad('1'5'0'STR_PAD_LEFT),
  358.                 'filler1' => ' ',
  359.                 'fecha_vto_pago' => str_replace('-''', ($comp['fecha_vencimiento_formateada'])),
  360.                 'datos_auxiliares' => str_pad(''40' 'STR_PAD_LEFT),
  361.                 'filler' => str_pad(' '92' 'STR_PAD_LEFT),
  362.             );
  363.             // Agregar el array de detalles al array general
  364.             $detalles[] = $dataDetalle;
  365.             $sumatoriaImportes += $importe;
  366.         }
  367.         if ($sumatoriaImportes >= 0) {
  368.             $signo "0";
  369.         } else {
  370.             $signo "-";
  371.         }
  372.         $fechaActual = new DateTime();
  373.         $dataEncabezado = array(
  374.             'nro_comercio' => str_pad($numero_comercio8'0'STR_PAD_LEFT),
  375.             'tipo_registro' => '1',
  376.             'fecha_registracion' => str_replace('-'''$fechaActual->format('d-m-y')),
  377.             'cantidad_registros' => str_pad(count($comprobantesDebitoAutomaticoTarjeta), 7'0'STR_PAD_LEFT),
  378.             'signo' => $signo,
  379.             'importe' => str_pad($sumatoriaImportes14'0'STR_PAD_LEFT),
  380.             'filler2' => str_pad(' '91' 'STR_PAD_LEFT)
  381.         );
  382.         $cadenaConcatenada '';
  383.         foreach ($dataEncabezado as $valor) {
  384.             // Concatenar cada par clave-valor en la cadena
  385.             $cadenaConcatenada .= $valor '';
  386.         }
  387.         $cadenaConcatenada .= "\n";
  388.         foreach ($detalles as $detalle) {
  389.             foreach ($detalle as $valor) {
  390.                 // Concatenar cada par clave-valor en la cadena
  391.                 $cadenaConcatenada .= $valor '';
  392.             }
  393.             $cadenaConcatenada .= "\n";
  394.         }
  395.         // Directorio temporal para almacenar el archivo
  396.         $tempDir sys_get_temp_dir();
  397.         // Ruta completa del archivo
  398.         $rutaArchivo $tempDir '/DA168D.txt';
  399.         // Crear el archivo y escribir el contenido
  400.         file_put_contents($rutaArchivo$cadenaConcatenada);
  401.         // Crear una BinaryFileResponse para la descarga
  402.         $response = new BinaryFileResponse($rutaArchivo);
  403.         // Configurar el nombre del archivo descargado
  404.         $response->setContentDisposition(
  405.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  406.             'DA168D.txt'
  407.         );
  408.         // Eliminar el archivo después de la descarga
  409.         $response->deleteFileAfterSend(true);
  410.         return $response;
  411.     }
  412.     public function generarArchivoExportacionUnica($comprobantesDebitoAutomaticoTarjeta): BinaryFileResponse
  413.     {
  414.         foreach ($comprobantesDebitoAutomaticoTarjeta as $comp) {
  415.             $importe str_replace('.''', (number_format(floatval($comp['importe']), 2'.''')));
  416.             $fechaActual = new DateTime();
  417.             $datadetalle = array(
  418.                 'nro_socio' => str_pad($comp['comp_id'], 9'0'STR_PAD_LEFT),
  419.                 'nro_tarjeta' => $comp['numero_tarjeta'],
  420.                 'importe' => str_pad($importe11'0'STR_PAD_LEFT),
  421.                 'libre1' => str_pad(''82' 'STR_PAD_LEFT),
  422.                 'nombre_comercio' => str_pad('CEMENTERIO PENTECOSTES'25' 'STR_PAD_LEFT),
  423.                 'fecha_registracion' => str_replace('-'''$fechaActual->format('d-m-y')),
  424.                 'libre2' => str_pad(''27' 'STR_PAD_LEFT),
  425.                 'numero_comercio' => str_pad('252525'11' 'STR_PAD_LEFT),
  426.                 'moneda' => 'P',
  427.                 'libre3' => str_pad(''21' 'STR_PAD_LEFT),
  428.                 'nro_tiquet' => str_pad($comp['cliente_id'], 4'0'STR_PAD_LEFT),
  429.                 'libre4' => str_pad(''10' 'STR_PAD_LEFT),
  430.                 'codigo_operacion' => '01',
  431.                 'libre5' => str_pad(''15' 'STR_PAD_LEFT),
  432.             );
  433.             // Agregar el array de detalles al array general
  434.             $detalles[] = $datadetalle;
  435.         }
  436.         $cadenaConcatenada '';
  437.         foreach ($detalles as $detalle) {
  438.             foreach ($detalle as $valor) {
  439.                 // Concatenar cada par clave-valor en la cadena
  440.                 $cadenaConcatenada .= $valor '';
  441.             }
  442.             $cadenaConcatenada .= "\n";
  443.         }
  444.         // Directorio temporal para almacenar el archivo
  445.         $tempDir sys_get_temp_dir();
  446.         // Ruta completa del archivo
  447.         $rutaArchivo $tempDir '/DA168D.txt';
  448.         // Crear el archivo y escribir el contenido
  449.         file_put_contents($rutaArchivo$cadenaConcatenada);
  450.         // Crear una BinaryFileResponse para la descarga
  451.         $response = new BinaryFileResponse($rutaArchivo);
  452.         // Configurar el nombre del archivo descargado
  453.         $response->setContentDisposition(
  454.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  455.             'DA168D.txt'
  456.         );
  457.         // Eliminar el archivo después de la descarga
  458.         $response->deleteFileAfterSend(true);
  459.         return $response;
  460.     }
  461.     public function procesarArchivo($params)
  462.     {
  463.         $tarjetaId $params['tarjeta']->getId();
  464.         switch ($tarjetaId) {
  465.             case 231// VISA - DEBITO
  466.                 $this->procesarArchivoImportacionFiserv($params);
  467.                 break;
  468.             case 151// VISA - CREDITO -
  469.                 $this->procesarArchivoImportacionFiserv($params);
  470.                 break;
  471.             case 71// MASTERCARD - CREDITO -
  472.                 $this->procesarArchivoImportacionFiserv($params);
  473.                 break;
  474.             case 141// UNICA - CREDITO -
  475.                 $this->procesarArchivoImportacionUnica($params);
  476.                 break;
  477.             default:
  478.                 $this->addFlash('error''¡No se encontró un procesador para la tarjeta seleccionada!');
  479.                 $request $this->requestStack->getCurrentRequest();
  480.                 return $this->redirectToRoute($request->attributes->get('_route'));
  481.         }
  482.     }
  483.     public function procesarArchivoImportacionFiserv($params)
  484.     {
  485.         // Ruta del archivo txt
  486.         $archivo $params['archivo'];
  487.         $filePath $archivo->getPathname();
  488.         // Verificar si el archivo existe
  489.         $filesystem = new Filesystem();
  490.         if (!$filesystem->exists($filePath)) {
  491.             throw $this->createNotFoundException('El archivo no existe.');
  492.         }
  493.         // Obtener un objeto SplFileObject para leer el archivo
  494.         $file = new FileFile($filePath);
  495.         $fileObject $file->openFile('r');
  496.         // Recorrer el archivo línea por línea
  497.         $arrayDatosGeneral = array();
  498.         while (!$fileObject->eof()) {
  499.             $lines $fileObject->fgets();
  500.             if (substr($lines21) == "2") { // SOLO PROCESAR LOS DEBITOS
  501.                 $arrayDatos $this->procesarLineaFiserv($lines);
  502.                 $arrayDatosGeneral[] = $arrayDatos;
  503.             }
  504.         }
  505.         foreach ($arrayDatosGeneral as $item) {
  506.             $paramsFromLines $this->arrayAdapter->adaptFiserv($item$params);
  507.             // VALIDACIONES ANTES DE GENERAR EL RECIBO
  508.             // VALIDAR QUE EL COMPROBANTE FACTURA, NO TENGA YA UN RECIBO ASOCIADO.
  509.             // VALIDAR EL IMPORTE DEL COMPROBANTE CONTRA EL IMPORTE QUE DICE EL ARCHIVO DE IMPORTACION.
  510.             if ($this->validacionesFiserv($item$params$paramsFromLines)) {
  511.                 try {
  512.                     $recibo $this->recibosAdminController->grabarRecibo($paramsFromLines);
  513.                     $this->grabarLogImportacionDetalle($recibo$params$paramsFromLines);
  514.                 } catch (\Exception $e) {
  515.                     $entityManager $this->entityManager;
  516.                     if ($entityManager->getConnection()->isTransactionActive()) {
  517.                         $entityManager->rollback();
  518.                         $entityManager->beginTransaction();
  519.                     }
  520.                     $mensaje 'Error al realizar la acción: ' $e->getMessage() . '. No se generó ningun recibo, corrija el error y vuelva a importar.';
  521.                     $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  522.                     $entityManager->commit();
  523.                 }
  524.             }
  525.         }
  526.     }
  527.     public function procesarArchivoImportacionUnica($params)
  528.     {
  529.         // Ruta del archivo txt
  530.         $archivounica $params['archivo'];
  531.         $filePath $archivounica->getPathname();
  532.         // Verificar si el archivo existe
  533.         $filesystem = new Filesystem();
  534.         if (!$filesystem->exists($filePath)) {
  535.             throw $this->createNotFoundException('El archivo no existe.');
  536.         }
  537.         // Obtener un objeto SplFileObject para leer el archivo
  538.         $file = new FileFile($filePath);
  539.         $fileObject $file->openFile('r');
  540.         // Recorrer el archivo línea por línea
  541.         $arrayDatosGeneral = array();
  542.         while (!$fileObject->eof()) {
  543.             $lines $fileObject->fgets();
  544.             if (substr($lines1151) == " ") { // SOLO PROCESAR LOS DEBITOS
  545.                 $arrayDatos $this->procesarLineaUnica($lines);
  546.                 $arrayDatosGeneral[] = $arrayDatos;
  547.             }
  548.         }
  549.         foreach ($arrayDatosGeneral as $item) {
  550.            $paramsFromLines $this->arrayAdapter->adaptUnica($item$params);
  551.             // VALIDACIONES ANTES DE GENERAR EL RECIBO
  552.             // VALIDAR QUE EL COMPROBANTE FACTURA, NO TENGA YA UN RECIBO ASOCIADO.
  553.             // VALIDAR EL IMPORTE DEL COMPROBANTE CONTRA EL IMPORTE QUE DICE EL ARCHIVO DE IMPORTACION.
  554.             if ($this->validacionesUnica($item$params$paramsFromLines)) {
  555.                 try {
  556.                     $recibo $this->recibosAdminController->grabarRecibo($paramsFromLines);
  557.                     $this->grabarLogImportacionDetalle($recibo$params$paramsFromLines);
  558.                 } catch (\Exception $e) {
  559.                     $entityManager $this->entityManager;
  560.                     if ($entityManager->getConnection()->isTransactionActive()) {
  561.                         $entityManager->rollback();
  562.                         $entityManager->beginTransaction();
  563.                     }
  564.                     $mensaje 'Error al realizar la acción: ' $e->getMessage() . '. No se generó ningun recibo, corrija el error y vuelva a importar.';
  565.                     $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  566.                     $entityManager->commit();
  567.                 }
  568.             }
  569.         }
  570.     }
  571.     public function procesarLineaFiserv($lines)
  572.     {
  573.         $arrayDatos = array();
  574.         // 1 - Sigla "AC"-> 2 bytes
  575.         $arrayDatos['sigla'] = substr($lines02);
  576.         // 2 - Tipo De Registro -> 1 bytes
  577.         $arrayDatos['tipo_de_ingreso'] = substr($lines21);
  578.         if ($arrayDatos['tipo_de_ingreso'] == 1) {
  579.             // 3 - Identificacion ->  8 bytes
  580.             $arrayDatos['identificacion'] = substr($lines37);
  581.             // 4 - Numero De Comercio ->  8 bytes
  582.             $arrayDatos['numero_comercio'] = substr($lines108);
  583.             // 5 - Fecha Presentacion -> 6 bytes
  584.             // FORMATO DDMMAA
  585.             $arrayDatos['fecha_presentacion'] = substr($lines186);
  586.             // 6- Filler -> 6 bytes
  587.             // Se completara con 0
  588.             $arrayDatos['filler'] = substr($lines246);
  589.             // 7 - Cantidad de Debitos ->  6 bytes
  590.             $arrayDatos['cantidad_de_debitos'] = substr($lines306);
  591.             // 8 - Signo Importe  ->  1 bytes
  592.             // Valor '0' -> signo positivo
  593.             // Valor '-' -> signo negativo
  594.             $arrayDatos['signo_importe '] = substr($lines361);
  595.             // Importe Total-> 12 bytes
  596.             $arrayDatos['importe_total '] = substr($lines3712);
  597.             // Filler 2-> 109 bytes
  598.             $arrayDatos['filler_2'] = substr($lines49109);
  599.         }
  600.         if ($arrayDatos['tipo_de_ingreso'] == 2) {
  601.             // 3 - Numero De tarjeta ->  16 bytes
  602.             $arrayDatos['numero_de_tarjeta'] = substr($lines316);
  603.             // 4 - Filler ->  7 bytes
  604.             $arrayDatos['filler'] = substr($lines197);
  605.             // 5 - Numero Referencia-> 12 bytes
  606.             $arrayDatos['numero_de_referencia'] = substr($lines2612);
  607.             // 6- Filler -> 6 bytes
  608.             // Se completara con 0
  609.             $arrayDatos['filler_2'] = substr($lines382);
  610.             // 7 - Importe ->  6 bytes
  611.             $arrayDatos['cantidad_de_debitos'] = substr($lines4011);
  612.             // 8 - Cuotas Canceladas  ->  1 bytes
  613.             $arrayDatos['cuotas_canceladas'] = substr($lines513);
  614.             // 9 - Vencimiento de la Tarjeta -> 4 bytes
  615.             // Formato MMAA
  616.             $arrayDatos['vencimiento_total'] = substr($lines544);
  617.             // 10 - Codigo De Rechazo-> 2 bytes
  618.             $arrayDatos['filler_3'] = substr($lines582);
  619.             // 11 - Periodo -> 5 bytes
  620.             // Valor "CRED" ->
  621.             // Valor1 = 3 caracterires de la seccion y Valor 2 = numero de cuotas
  622.             $arrayDatos['periodo'] = substr($lines605);
  623.             // 12 - Fecha Presentacion -> 6 bytes
  624.             $arrayDatos['fecha_presentacion_original'] = substr($lines656);
  625.             // 13 - Datos Auxiliares -> 40 bytes
  626.             $arrayDatos['datos_auxiliares'] = substr($lines7140);
  627.             // 14 - Fecha Clearing -> 40 bytes
  628.             $arrayDatos['fecha_clearing'] = substr($lines1116);
  629.             // 15 - Marca Aplica Dev IVA -> 1 bytes
  630.             $arrayDatos['marca_dev_iva'] = substr($lines1171);
  631.             // 16 - Importe Gravado -> 11 bytes
  632.             $arrayDatos['importe_gravado'] = substr($lines11811);
  633.             // 17 - Numero de Factura -> 20 bytes
  634.             $arrayDatos['numero_factura'] = substr($lines12920);
  635.             // 18 - Importe Devolucion -> 20 bytes
  636.             $arrayDatos['importe_devolucion'] = substr($lines14911);
  637.         }
  638.         return $arrayDatos;
  639.     }
  640.     public function procesarLineaUnica($lines)
  641.     {
  642.         $arrayDatos = array();
  643.         // identificacion de socio longitud -> 9 bytes
  644.         $arrayDatos['id_socio'] = substr($lines09);
  645.         // Numero de Tarjeta longitud -> 16 bytes
  646.         $arrayDatos['id_nro_tarjeta'] = substr($lines916);
  647.         // Importe Del Debito (9 enteros 2 decimales) ->  11 bytes
  648.         $arrayDatos['importe_debito'] = substr($lines2511);
  649.         // longitud Domicilio -> 35 bytes
  650.         $arrayDatos['domicilio'] = substr($lines3635);
  651.         // longitud Libre 1 -> 4 bytes
  652.         $arrayDatos['libre1'] = substr($lines714);
  653.         // Importe De La Localidad  ->  20 bytes
  654.         $arrayDatos['localidad'] = substr($lines7520);
  655.         // longitud Libre 2-> 20 bytes
  656.         $arrayDatos['libre2'] = substr($lines9520);
  657.         // longitud indicativo del rechazo  ->1 bytes
  658.         // A -> Codigo de Identificacion de socio no numerico o cero
  659.         // B -> Cuenta inhabilitada
  660.         // C -> Codigo de moneda Erroneo
  661.         // D -> Debito Duplicado
  662.         // E -> Cuenta Bloqueada Transitoriamente
  663.         // F -> Usuario Extranjero
  664.         // G -> Importe no numerico o cero
  665.         // H -> Fecha de Presentacion mayor a 35 o invalida
  666.         // I -> Tarjeta Inexitente
  667.         // J -> Numero de Cupon  no numerico
  668.         // K -> Codigo de Operacion no numerico
  669.         // L -> Cuenta Sin Disponible
  670.         // M -> Cuenta en situacion irregular
  671.         // N -> Comercio Desactiavo
  672.         // O -> Consulte a la Entidad
  673.         // R -> Stop Debit
  674.         // V -> Tarjeta Vencida
  675.         $arrayDatos['indicativo_rechazo'] = substr($lines1151);
  676.         // longitud indicativo de la nueva tarjeta asiganada  -> 1 bytes
  677.         // 0 -> No Fue Reemplazada
  678.         // 1 -> Fue Reemplazada
  679.         $arrayDatos['indicativo_tarjeta_nueva'] = substr($lines1161);
  680.         // longitud Libre 3 -> 1 bytes
  681.         $arrayDatos['libre3'] = substr($lines1171);
  682.         // longitud de Leyenda -> 25 bytes
  683.         $arrayDatos['leyenda'] = substr($lines11825);
  684.         // longitud Fecha De Presentacion -> 6 bytes
  685.         $arrayDatos['fecha_presentacion'] = substr($lines1436);
  686.         // longitud Nombre del titular -> 25 bytes
  687.         $arrayDatos['nombre_titular'] = substr($lines14925);
  688.         // longitud Ciclo de Facturacion Del Usuario-> 2 bytes
  689.         $arrayDatos['ciclo_facturacion'] = substr($lines1742);
  690.         // longitud Numero De Comercio -> 11 bytes
  691.         $arrayDatos['numero_comercio'] = substr($lines17611);
  692.         // longitud Moneda DEFAULT P -> 1 bytes
  693.         $arrayDatos['moneda'] = substr($lines1871);
  694.         // longitud Vencimiento de Tarjeta (AAMM)-> 4 bytes
  695.         $arrayDatos['venc_tarjeta'] = substr($lines1884);
  696.         // longitud Numero De Tarjeta Nuevo (Si es que se informo que hubo un cambio)-> 16 bytes
  697.         $arrayDatos['num_tarjeta_nuevo'] = substr($lines19216);
  698.         // longitud Signo Del Importe ( ' '=Positivo '-'=Negativo )-> 1 bytes
  699.         $arrayDatos['signo'] = substr($lines2081);
  700.         // longitud Numero Del Tiquet -> 4 bytes
  701.         $arrayDatos['num_ticket'] = substr($lines2094);
  702.         // longitud Numero Componente de la Cuenta('01'=Titular '02 a 09'= Adicional) -> 2 bytes
  703.         $arrayDatos['num_comp_cuenta'] = substr($lines2132);
  704.         // longitud Codigo Postal -> 8 bytes
  705.         $arrayDatos['codigo_postal'] = substr($lines2158);
  706.         // longitud Codigo De Operacion -> 2 bytes
  707.         $arrayDatos['codigo_operacion'] = substr($lines2232);
  708.         // longitud Numero De Contribuyente -> 15 bytes
  709.         $arrayDatos['num_contribuyente'] = substr($lines22515);
  710.         return $arrayDatos;
  711.     }
  712.     public function procesarArchivoObservacion($params)
  713.     {
  714.         $tarjetaId $params['tarjeta']->getId();
  715.         switch ($tarjetaId) {
  716.             case 151// VISA - CREDITO -
  717.                 $this->procesarArchivoImportacionFiservObservacion($params);
  718.                 break;
  719.             case 71// MASTERCARD - CREDITO -
  720.                 $this->procesarArchivoImportacionFiservObservacion($params);
  721.                 break;
  722.             case 141// UNICA - CREDITO -
  723.                 $this->procesarArchivoImportacionUnicaObservacion($params);
  724.                 break;
  725.             default:
  726.                 $this->addFlash('error''¡No se encontró un procesador para la tarjeta seleccionada!');
  727.                 $request $this->requestStack->getCurrentRequest();
  728.                 return $this->redirectToRoute($request->attributes->get('_route'));
  729.         }
  730.     }
  731.     public function procesarArchivoImportacionFiservObservacion($params)
  732.     {
  733.         $em $this->doctrine->getManager();
  734.         // Ruta del archivo txt
  735.         $archivo $params['archivo'];
  736.         $filePath $archivo->getPathname();
  737.         // Verificar si el archivo existe
  738.         $filesystem = new Filesystem();
  739.         if (!$filesystem->exists($filePath)) {
  740.             throw $this->createNotFoundException('El archivo no existe.');
  741.         }
  742.         // Obtener un objeto SplFileObject para leer el archivo
  743.         $file = new FileFile($filePath);
  744.         $fileObject $file->openFile('r');
  745.         // Recorrer el archivo línea por línea
  746.         $arrayDatosGeneral = array();
  747.         $arrayDatos= array();
  748.         while (!$fileObject->eof()) {
  749.             $lines $fileObject->fgets();
  750.             $arrayDatos $this->procesarLineaFiservObservacion($lines);
  751.             $logRechazadosDebitosAutomaticosDet = new LogRechazadosDebitosAutomaticosDet();
  752.             $logRechazadosDebitosAutomaticosDet->setLogArchivos($params['logArchivos']);
  753.             $logRechazadosDebitosAutomaticosDet->setNroRef($arrayDatos['id_socio']);
  754.             $logRechazadosDebitosAutomaticosDet->setNroTarjeta($arrayDatos['nro_tarjeta']);
  755.             $logRechazadosDebitosAutomaticosDet->setNroTarjetaAnterior($arrayDatos['nro_tarjeta_anterior']);
  756.             $logRechazadosDebitosAutomaticosDet->setCuotas($arrayDatos['cuotas']);
  757.             $logRechazadosDebitosAutomaticosDet->setCuotasPlan($arrayDatos['cuotas_frecuencia']);
  758.             $logRechazadosDebitosAutomaticosDet->setCodFrecDebito($arrayDatos['cuotas_plan']);
  759.             $logRechazadosDebitosAutomaticosDet->setImporte($arrayDatos['importe']);
  760.             $logRechazadosDebitosAutomaticosDet->setCodError($arrayDatos['descripcion']);
  761.             $em->persist($logRechazadosDebitosAutomaticosDet);
  762.             $em->flush();
  763.         }
  764.         foreach ($arrayDatosGeneral as $item) {
  765.             $this->grabar;
  766.         }
  767.     }
  768.     public function procesarArchivoImportacionUnicaObservacion($params)
  769.     {
  770.         $em $this->doctrine->getManager();
  771.         // Ruta del archivo txt
  772.         $archivounica $params['archivo'];
  773.         $filePath $archivounica->getPathname();
  774.         // Verificar si el archivo existe
  775.         $filesystem = new Filesystem();
  776.         if (!$filesystem->exists($filePath)) {
  777.             throw $this->createNotFoundException('El archivo no existe.');
  778.         }
  779.         // Obtener un objeto SplFileObject para leer el archivo
  780.         $file = new FileFile($filePath);
  781.         $fileObject $file->openFile('r');
  782.         // Recorrer el archivo línea por línea
  783.         $arrayDatosGeneral = array();
  784.         $arrayDatos= array();
  785.         while (!$fileObject->eof()) {
  786.             $lines $fileObject->fgets();
  787.             if (substr($lines1151) != " ") { // SOLO PROCESAR LOS DEBITOS
  788.                 $arrayDatos =$this->procesarLineaUnicaObservacion($lines);
  789.                 $arrayDatosGeneral[] = $arrayDatos;
  790.             }
  791.         }
  792.         foreach ($arrayDatosGeneral as $item) {
  793.             $logRechazadosDebitosAutomaticosDet = new LogRechazadosDebitosAutomaticosDet();
  794.             $logRechazadosDebitosAutomaticosDet->setLogArchivos($params['logArchivos']);
  795.             $logRechazadosDebitosAutomaticosDet->setNroRef($item['id_socio']);
  796.             $logRechazadosDebitosAutomaticosDet->setNroTarjeta($item['num_tarjeta_nuevo']);
  797.             $logRechazadosDebitosAutomaticosDet->setNroTarjetaAnterior($item['id_nro_tarjeta']);
  798.             $logRechazadosDebitosAutomaticosDet->setCuotasPlan(intval($item['ciclo_facturacion']));
  799.             $logRechazadosDebitosAutomaticosDet->setImporte($item['importe_debito']);
  800.             $logRechazadosDebitosAutomaticosDet->setCodError($item['leyenda']);
  801.             $em->persist($logRechazadosDebitosAutomaticosDet);
  802.             $em->flush();
  803.         }
  804.     }
  805.     public function procesarLineaFiservObservacion($lines)
  806.     {
  807.         $linesArray explode(";"$lines);
  808.         $arrayDatos = array();
  809.         // 1 - Numero de Referencia o ID de socio-> 12 bytes
  810.         $arrayDatos['id_socio'] = $linesArray[0];
  811.         // 2 - Numero de Tarjeta -> 17 bytes
  812.         $arrayDatos['nro_tarjeta'] = $linesArray[1];
  813.         // 3 - Numero de Tarjeta Anterior -> 16 bytes
  814.         $arrayDatos['nro_tarjeta_anterior'] = $linesArray[2];
  815.         // 4 - Cuotas -> 2 bytes
  816.         $arrayDatos['cuotas'] = $linesArray[3];
  817.         // 5 - Cuotas de Frecuencia de Debito -> 2 bytes
  818.         $arrayDatos['cuotas_frecuencia'] = $linesArray[4];
  819.         // 6 - Cuotas de Plan -> 2 bytes
  820.         $arrayDatos['cuotas_plan'] = $linesArray[5];
  821.         // 7 - Importe -> 6 bytes
  822.         $arrayDatos['importe'] = $linesArray[6];
  823.         // 8 - Descripcion -> 85 bytes
  824.         $arrayDatos['descripcion'] = $linesArray[7];
  825.         return $arrayDatos;
  826.     }
  827.     public function procesarLineaUnicaObservacion($lines)
  828.     {
  829.         $arrayDatos = array();
  830.         // identificacion de socio longitud -> 9 bytes
  831.         $arrayDatos['id_socio'] = substr($lines09);
  832.         // Numero de Tarjeta longitud -> 16 bytes
  833.         $arrayDatos['id_nro_tarjeta'] = substr($lines916);
  834.         // Importe Del Debito (9 enteros 2 decimales) ->  11 bytes
  835.         $importeUnica intval(substr($lines2511));
  836.         $parte_entera substr($importeUnica0, -2);
  837.         $parte_decimal substr($importeUnica, -2);
  838.         $arrayDatos['importe_debito']= floatval($parte_entera "." $parte_decimal);
  839.         // longitud Domicilio -> 35 bytes
  840.         $arrayDatos['domicilio'] = substr($lines3635);
  841.         // longitud Libre 1 -> 4 bytes
  842.         $arrayDatos['libre1'] = substr($lines714);
  843.         // Importe De La Localidad  ->  20 bytes
  844.         $arrayDatos['localidad'] = substr($lines7520);
  845.         // longitud Libre 2-> 20 bytes
  846.         $arrayDatos['libre2'] = substr($lines9520);
  847.         // longitud indicativo del rechazo  ->1 bytes
  848.         // A -> Codigo de Identificacion de socio no numerico o cero
  849.         // B -> Cuenta inhabilitada
  850.         // C -> Codigo de moneda Erroneo
  851.         // D -> Debito Duplicado
  852.         // E -> Cuenta Bloqueada Transitoriamente
  853.         // F -> Usuario Extranjero
  854.         // G -> Importe no numerico o cero
  855.         // H -> Fecha de Presentacion mayor a 35 o invalida
  856.         // I -> Tarjeta Inexitente
  857.         // J -> Numero de Cupon  no numerico
  858.         // K -> Codigo de Operacion no numerico
  859.         // L -> Cuenta Sin Disponible
  860.         // M -> Cuenta en situacion irregular
  861.         // N -> Comercio Desactiavo
  862.         // O -> Consulte a la Entidad
  863.         // R -> Stop Debit
  864.         // V -> Tarjeta Vencida
  865.         $arrayDatos['indicativo_rechazo'] = substr($lines1151);
  866.         // longitud indicativo de la nueva tarjeta asiganada  -> 1 bytes
  867.         // 0 -> No Fue Reemplazada
  868.         // 1 -> Fue Reemplazada
  869.         $arrayDatos['indicativo_tarjeta_nueva'] = substr($lines1161);
  870.         // longitud Libre 3 -> 1 bytes
  871.         $arrayDatos['libre3'] = substr($lines1171);
  872.         // longitud de Leyenda -> 25 bytes
  873.         $arrayDatos['leyenda'] = substr($lines11825);
  874.         // longitud Fecha De Presentacion -> 6 bytes
  875.         $arrayDatos['fecha_presentacion'] = substr($lines1436);
  876.         // longitud Nombre del titular -> 25 bytes
  877.         $arrayDatos['nombre_titular'] = substr($lines14925);
  878.         // longitud Ciclo de Facturacion Del Usuario-> 2 bytes
  879.         $arrayDatos['ciclo_facturacion'] = substr($lines1742);
  880.         // longitud Numero De Comercio -> 11 bytes
  881.         $arrayDatos['numero_comercio'] = substr($lines17611);
  882.         // longitud Moneda DEFAULT P -> 1 bytes
  883.         $arrayDatos['moneda'] = substr($lines1871);
  884.         // longitud Vencimiento de Tarjeta (AAMM)-> 4 bytes
  885.         $arrayDatos['venc_tarjeta'] = substr($lines1884);
  886.         // longitud Numero De Tarjeta Nuevo (Si es que se informo que hubo un cambio)-> 16 bytes
  887.         $arrayDatos['num_tarjeta_nuevo'] = substr($lines19216);
  888.         // longitud Signo Del Importe ( ' '=Positivo '-'=Negativo )-> 1 bytes
  889.         $arrayDatos['signo'] = substr($lines2081);
  890.         // longitud Numero Del Tiquet -> 4 bytes
  891.         $arrayDatos['num_ticket'] = substr($lines2094);
  892.         // longitud Numero Componente de la Cuenta('01'=Titular '02 a 09'= Adicional) -> 2 bytes
  893.         $arrayDatos['num_comp_cuenta'] = substr($lines2132);
  894.         // longitud Codigo Postal -> 8 bytes
  895.         $arrayDatos['codigo_postal'] = substr($lines2158);
  896.         // longitud Codigo De Operacion -> 2 bytes
  897.         $arrayDatos['codigo_operacion'] = substr($lines2232);
  898.         // longitud Numero De Contribuyente -> 15 bytes
  899.         $arrayDatos['num_contribuyente'] = substr($lines22515);
  900.         return $arrayDatos;
  901.     }
  902.     public function grabarLogImportacionDetalle($recibo$param$paramsFromLines$mensaje "") {
  903.         $em $this->doctrine->getManager();
  904.         $facturaSeleccionada $paramsFromLines['facturasSeleccionadas'];
  905.         $comprobanteId explode(","$facturaSeleccionada);
  906.         $comprobante $em->getRepository('App\Entity\Comprobantes')->find(intval($comprobanteId[8]));
  907.         $logArchivosImportacionDetalle = new LogArchivosImportacionDetalle();
  908.         if($recibo){
  909.             $mensaje $this->recibosRepository->getMensajeLogImportacion($recibo);
  910.         }
  911.         $logArchivosImportacionDetalle->setLogArchivos($param['logArchivos']);
  912.         $logArchivosImportacionDetalle->setComprobantes($comprobante);
  913.         $logArchivosImportacionDetalle->setMensaje($mensaje);
  914.         $em->persist($logArchivosImportacionDetalle);
  915.         $em->flush();
  916.     }
  917.     private function validacionesFiserv(mixed $item$params$paramsFromLines) : bool
  918.     {
  919.         $em $this->doctrine->getManager();
  920.         $facturaObj $em->getRepository('App\Entity\Comprobantes')->find(intval($item['numero_de_referencia']));
  921.         $mensajeRecibosAsociados $this->validarExistenRecibos($facturaObj);
  922.         if($mensajeRecibosAsociados){
  923.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensajeRecibosAsociados);
  924.             return false;
  925.         }
  926.         // VALIDO LOS IMPORTES
  927.         $immporteSaldoFactura $facturaObj->getSaldo();
  928.         $importeEnArchivoAux intval($item['cantidad_de_debitos']);
  929.         $parte_entera substr($importeEnArchivoAux0, -2);
  930.         $parte_decimal substr($importeEnArchivoAux, -2);
  931.         $importeEnArchivo floatval($parte_entera "." $parte_decimal);
  932.         if ($immporteSaldoFactura $importeEnArchivo) { // EL IMPORTE QUE VIENE EN EL ARCHIVO, ES MAS GRANDE QUE EL DE LA FACTURA
  933.             $mensaje "El importe que viene en el archivo ({$importeEnArchivo}) es mayor al saldo de la factura ({$immporteSaldoFactura}). No se generó el recibo.";
  934.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  935.             return false;
  936.         } else if ($immporteSaldoFactura $importeEnArchivo) { // EL IMPORTE QUE VIENE EN EL ARCHIVO, ES MAS CHICO QUE EL DE LA FACTURA
  937.             $mensaje "El importe que viene en el archivo ({$importeEnArchivo}) es menor al saldo de la factura ({$immporteSaldoFactura}). No se generó el recibo.";
  938.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  939.             return false;
  940.         }
  941.         return true;
  942.     }
  943.     private function validacionesUnica(mixed $item$params$paramsFromLines) : bool
  944.     {
  945.         $em $this->doctrine->getManager();
  946.         $facturaObj $em->getRepository('App\Entity\Comprobantes')->find(intval($item['id_socio']));
  947.         $mensajeRecibosAsociados $this->validarExistenRecibos($facturaObj);
  948.         if($mensajeRecibosAsociados){
  949.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensajeRecibosAsociados);
  950.             return false;
  951.         }
  952.         // VALIDO LOS IMPORTES
  953.         $immporteSaldoFactura $facturaObj->getSaldo();
  954.         $importeEnArchivoAux intval($item['importe_debito']);
  955.         $parte_entera substr($importeEnArchivoAux0, -2);
  956.         $parte_decimal substr($importeEnArchivoAux, -2);
  957.         $importeEnArchivo floatval($parte_entera "." $parte_decimal);
  958.         if ($immporteSaldoFactura $importeEnArchivo) { // EL IMPORTE QUE VIENE EN EL ARCHIVO, ES MAS GRANDE QUE EL DE LA FACTURA
  959.             $mensaje "El importe que viene en el archivo ({$importeEnArchivo}) es mayor al saldo de la factura ({$immporteSaldoFactura}). No se generó el recibo.";
  960.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  961.             return false;
  962.         } else if ($immporteSaldoFactura $importeEnArchivo) { // EL IMPORTE QUE VIENE EN EL ARCHIVO, ES MAS CHICO QUE EL DE LA FACTURA
  963.             $mensaje "El importe que viene en el archivo ({$importeEnArchivo}) es menor al saldo de la factura ({$immporteSaldoFactura}). No se generó el recibo.";
  964.             $this->grabarLogImportacionDetalle(null$params$paramsFromLines$mensaje);
  965.             return false;
  966.         }
  967.         return true;
  968.     }
  969.     private function validarExistenRecibos($factura) {
  970.         $recibosAsociados $this->comprobantesRepository->recibosAsociado($factura);
  971.         if($recibosAsociados) {
  972.             $mensaje "";
  973.             foreach ($recibosAsociados as $item) {
  974.                 $mensaje .= $item['recibo'] . ". ";
  975.             }
  976.             return $mensaje "El comprobante ya tiene recibo/s asociado/s ({$mensaje}). No se generaron nuevos recibos.";
  977.         }
  978.         return false;
  979.     }
  980. }