src/Utils/Xml.php line 395

Open in your IDE?
  1. <?php
  2. namespace App\Utils;
  3. use App\Entity\Cabecera;
  4. class Xml
  5. {
  6.   /**
  7.    * Genera un archivo XML basado en los datos de una cabecera y otros parámetros.
  8.    *
  9.    * Esta función toma una instancia de Cabecera y otros datos relevantes para
  10.    * construir un archivo XML estructurado. El XML generado incluye información
  11.    * detallada de la cabecera y puede ser utilizado para diversas finalidades,
  12.    * como la exportación de datos o la generación de informes.
  13.    *
  14.    * @param Cabecera $cab Instancia de la clase Cabecera con los datos del documento.
  15.    * @param array $datetime Array asociativo que contiene las claves 'fecha' y 'hora'.
  16.    * @param int $numlineas Número total de líneas o elementos a incluir en el XML.
  17.    * @param string $filename Nombre del archivo que se generará (sin extensión .xml).
  18.    * @return string Una cadena de texto que representa el contenido del archivo XML.
  19.    */
  20.   public function generarXml(Cabecera $cab, array $datetimeint $numlineasstring $filename)
  21.   {
  22.     $cabecera $this->addCabecera($cab$datetime$filename);
  23.     $cabeceraLineas $this->addCabeceraLineas($numlineas$filename);
  24.     $lineas $this->addLineas($cab->getLineas());
  25.     $totales $this->addTotales($cab);
  26.     $propina $cab->getPropinatotal() ?? 0;
  27.     if ($propina 0) {
  28.       $addPropina $this->addPropina($cab);
  29.     } else {
  30.       $addPropina '';
  31.     }
  32.     return <<<XML
  33. <?xml version="1.0"?>
  34. <minuta>
  35.   <cabecera>
  36. $cabecera
  37.   </cabecera>
  38.   <lineas>
  39. $cabeceraLineas
  40. $lineas$addPropina
  41.   </lineas>
  42. $totales
  43. </minuta>
  44. XML;
  45.   }
  46.   /**
  47.    * Genera la cabecera del xml
  48.    */
  49.   private function addCabecera($cab$datetime$filename)
  50.   {
  51.     // $nombrecliente = $this->TildesHtml($cab->getNombrecliente());
  52.     // $direccioncliente = $this->TildesHtml($cab->getDireccioncliente()) . ' ' . $this->TildesHtml($cab->getDireccion2cliente());
  53.     // $observaciones = $this->TildesHtml($cab->getComentario());
  54.     // $fecha = $datetime['fecha'];
  55.     // $hora = $datetime['hora'];
  56.     $cabeceraData $this->cabeceraData($cab$datetime$filename);
  57.     $datosdeenvio $this->addDatosdeenvio($cab);
  58.     if (isset($cabeceraData['coddireccionenvio'])) {
  59.       $coddireccionEnvio "<coddireccionenvio>{$cabeceraData['coddireccionenvio']}</coddireccionenvio>";
  60.     } else {
  61.       $coddireccionEnvio '';
  62.     }
  63.     // $tipodeservicio = '';
  64.     // if ($cab->getTipodeservicio() == 16) {
  65.     //   $fechareserva = $cab->getFechareserva()->format('dmY');
  66.     //   $horareserva = $cab->getFechareserva()->format('His');
  67.     //   $tipodeservicio .= "<fechareserva>{$fechareserva}</fechareserva>
  68.     // <horareserva>{$horareserva}</horareserva>";
  69.     // } else {
  70.     //   $tipodeservicio .= "<fechareserva></fechareserva>
  71.     // <horareserva></horareserva>";
  72.     // }
  73.     // <aliascliente>{$cabeceraData['aliascliente']}</aliascliente>
  74.     return <<<CABECERA
  75.     <codvendedor>{$cabeceraData['codvendedor']}</codvendedor>
  76.     <tiposervicio>{$cabeceraData['tiposervicio']}</tiposervicio>
  77.     <fechaminuta>{$cabeceraData['fechaminuta']}</fechaminuta>
  78.     <horaminuta>{$cabeceraData['horaminuta']}</horaminuta>
  79.     <codcliente>{$cabeceraData['codcliente']}</codcliente>
  80.     <tipoidentcliente>{$cabeceraData['tipoidentcliente']}</tipoidentcliente>
  81.     <nifcliente>{$cabeceraData['nifcliente']}</nifcliente>
  82.     <nombre1cliente>{$cabeceraData['nombre1cliente']}</nombre1cliente>
  83.     <apellido1cliente>{$cabeceraData['apellido1cliente']}</apellido1cliente>
  84.     <nombrecliente>{$cabeceraData['nombrecliente']}</nombrecliente>
  85.     <direccioncliente>{$cabeceraData['direccioncliente']}</direccioncliente>
  86.     <direccionfiscalcliente>{$cabeceraData['direccionfiscalcliente']}</direccionfiscalcliente>
  87.     $coddireccionEnvio
  88.     <paiscliente>{$cabeceraData['paiscliente']}</paiscliente>
  89.     <movilcliente>{$cabeceraData['movilcliente']}</movilcliente>
  90.     <telefonocliente>{$cabeceraData['movilcliente']}</telefonocliente>
  91.     <emailcliente>{$cabeceraData['emailcliente']}</emailcliente>
  92.     <codmonedaminuta>1</codmonedaminuta>
  93.     <tipopersonacliente>{$cabeceraData['tipopersonacliente']}</tipopersonacliente>
  94.     <responsabilidadescliente>{$cabeceraData['responsabilidadescliente']}</responsabilidadescliente>
  95.     <detalletributariocliente>{$cabeceraData['detalletributariocliente']}</detalletributariocliente>
  96.     <fechareserva>{$cabeceraData['fechareserva']}</fechareserva>
  97.     <horareserva>{$cabeceraData['horareserva']}</horareserva>
  98.     <ivaincluido>{$cabeceraData['ivaincluido']}</ivaincluido>
  99.     <referenciapedido>{$cabeceraData['referenciapedido']}</referenciapedido>
  100.     <comensales>1</comensales>
  101.     $datosdeenvio
  102. CABECERA;
  103.   }
  104.   /**
  105.    *
  106.    */
  107.   private function cabeceraData($cab$datetime$filename)
  108.   {
  109.     $direccionEnvio $this->TildesHtml($cab->getDireccioncliente()) . ', ' $this->TildesHtml($cab->getDireccion2cliente());
  110.     $fechareserva $cab->getFechareserva() ? $cab->getFechareserva()->format('dmY') : '';
  111.     $horareserva $cab->getFechareserva() ? $cab->getFechareserva()->format('His') : '';
  112.     $data = [
  113.       'codcliente' => $cab->getCodcliente(),
  114.       'nifcliente' => $cab->getNifcliente(),
  115.       'nombre1cliente' => $this->TildesHtml($cab->getNombres()),
  116.       'apellido1cliente' => $this->TildesHtml($cab->getApellidos()),
  117.       'nombrecliente' => $this->TildesHtml($cab->getNombreCliente()),
  118.       'direccioncliente' => $direccionEnvio,
  119.       // 'direccionfiscalcliente' => $direccionEnvio,
  120.       'direccionfiscalcliente' => $this->TildesHtml($cab->getDireccioncliente()),
  121.       'movilcliente' => $cab->getMovilcliente() ?? $cab->getTelefonocliente(),
  122.       'telefonocliente' => $cab->getMovilcliente() ?? $cab->getTelefonocliente(),
  123.       'emailcliente' => $cab->getEmailcliente(),
  124.       'responsabilidadescliente' => $cab->getFeResponsabilidades(),
  125.       'detalletributariocliente' => $cab->getFeDetTributario(),
  126.     ];
  127.     if ($cab->getFacturaelectronica()) {
  128.       if ($cab->getTipopersona() === '2 Persona Natural') {
  129.         $data['tipoidentcliente'] = '13 Cedula de Ciudadania';
  130.         $data['tipopersonacliente'] = '2 Persona Natural';
  131.         $data['detalletributariocliente'] = 'ZZ Otros tributos';
  132.         $data['responsabilidadescliente'] = 'R-99-PN';
  133.       } else {
  134.         $data['nombre1cliente'] = $this->TildesHtml($cab->getNombreCliente());
  135.         $data['apellido1cliente'] = '.';
  136.         $data['tipoidentcliente'] = '31 NIT';
  137.         $data['tipopersonacliente'] = '1 Persona Juridica';
  138.         $data['detalletributariocliente'] = '01 IVA';
  139.         $data['responsabilidadescliente'] = 'R-99-PN';
  140.       }
  141.       $data['aliascliente'] = 1;
  142.       $data['coddireccionenvio'] = 2;
  143.     } else {
  144.       $data = [
  145.         'codcliente' => 11984,
  146.         'tipoidentcliente' => '13 Cedula de Ciudadania',
  147.         'nifcliente' => 222222222222,
  148.         'nombre1cliente' => $this->TildesHtml($cab->getNombres()),
  149.         'apellido1cliente' => $this->TildesHtml($cab->getApellidos()),
  150.         'nombrecliente' => 'CONSUMIDOR FINAL',
  151.         'direccioncliente' => 'CARRERA 43A 25A85',
  152.         // 'direccionfiscalcliente' => $direccionEnvio,
  153.         'direccionfiscalcliente' => $this->TildesHtml($cab->getDireccioncliente()),
  154.         'coddireccionenvio' => '2',
  155.         'aliascliente' => 0,
  156.         'movilcliente' => 6043496810,
  157.         'telefonocliente' => 6043496810,
  158.         'emailcliente' => 'clientes.fe.medellin@crepesywaffles.com',
  159.         'tipopersonacliente' => '2 Persona Natural',
  160.         'responsabilidadescliente' => 'R-99-PN',
  161.         'detalletributariocliente' => 'ZZ Otros tributos',
  162.       ];
  163.     }
  164.     // Otros datos
  165.     $otraData = [
  166.       'codvendedor' => $cab->getUser()->getCodvendedor(),
  167.       // 'aliascliente' => 1,
  168.       'tiposervicio' => $cab->getTipodeservicio(),
  169.       'fechaminuta' => $datetime['fecha'],
  170.       'horaminuta' => $datetime['hora'],
  171.       'paiscliente' => 'CO',
  172.       'codmonedaminuta' => 1,
  173.       'fechareserva' => $fechareserva,
  174.       'horareserva' => $horareserva,
  175.       'ivaincluido' => 1,
  176.       'observacionescliente' => $this->TildesHtml($cab->getComentario()),
  177.       'referenciapedido' => 'Callcenter ' $filename,
  178.       'comensales' => 1,
  179.     ];
  180.     return array_merge($data$otraData);
  181.   }
  182.   /**
  183.    * Genera los datos de envío
  184.    */
  185.   private function addDatosdeenvio($cab)
  186.   {
  187.     $resultado '<observacionescliente>';
  188.     $resultado .= $this->TildesHtml($cab->getDireccion2cliente());
  189.     if (!empty($cab->getNombreReceptor())) {
  190.       $resultado .= $this->TildesHtml('|Recibe:' $cab->getNombreReceptor() . '|');
  191.     }
  192.     if (!empty($cab->getTelefonoReceptor())) {
  193.       $resultado .= $this->TildesHtml($cab->getTelefonoReceptor());
  194.     }
  195.     // if (!empty($cab->getObservacionesReceptor())) {
  196.     //   $resultado .= $this->TildesHtml($cab->getObservacionesReceptor());
  197.     // }
  198.     return $resultado "</observacionescliente>";
  199.   }
  200.   /**
  201.    * Genera la cabecera de las líneas
  202.    *
  203.    */
  204.   private function addCabeceraLineas($numlineas$filename)
  205.   {
  206.     return <<<CABECERA_LINEAS
  207.     <numlineas>{$numlineas}</numlineas>
  208.     <linea>
  209.       <codarticulo>1799</codarticulo>
  210.       <descripcion>Callcenter {$filename}</descripcion>
  211.       <codformato>0</codformato>
  212.       <hora/>
  213.       <unidades>1</unidades>
  214.       <precio>0</precio>
  215.       <precioiva>0</precioiva>
  216.       <codimpuesto>5</codimpuesto>
  217.       <esmenu>0</esmenu>
  218.       <dto>0</dto>
  219.       <esmodif>0</esmodif>
  220.       <numlineasmodif>0</numlineasmodif>
  221.     </linea>
  222. CABECERA_LINEAS;
  223.   }
  224.   /**
  225.    * Genera de la línea parent
  226.    *
  227.    * @param Linea $cab Instancia de la clase Linea.
  228.    */
  229.   private function addLineaParent($linea)
  230.   {
  231.     $descripcion $this->TildesHtml($linea->getDescripcion());
  232.     $numlineasmodif $linea->getNumlineasmodif() ?? 0;
  233.     $esmodif $numlineasmodif === 1;
  234.     $precio $linea->getPreciototal() / $linea->getUnidades();
  235.     // <precioiva>{$linea->getPreciototal()}</precioiva>
  236.     return <<<LINEA_PARENT
  237.         <codarticulo>{$linea->getCodarticulo()}</codarticulo>
  238.         <descripcion>{$descripcion}</descripcion>
  239.         <codFavorito>{$linea->getCodFavoritos()}</codFavorito>
  240.         <hora/>
  241.         <unidades>{$linea->getUnidades()}</unidades>
  242.         <precio>0</precio>
  243.         <precioiva>{$precio}</precioiva>
  244.         <codimpuesto>{$linea->getCodImpuesto()}</codimpuesto>
  245.         <servido>0</servido>
  246.         <impreso>0</impreso>
  247.         <esmodif>{$esmodif}</esmodif>
  248.         <numlineasmodif>{$numlineasmodif}</numlineasmodif>
  249.         <dto>0</dto>
  250.   LINEA_PARENT;
  251.   }
  252.   /**
  253.    * Genera la línea child
  254.    *
  255.    */
  256.   private function addLineaChild($linea)
  257.   {
  258.     $incprecio $linea->getPrecio() / $linea->getUnidades();
  259.     $descripcion $this->TildesHtml($linea->getDescripcion());
  260.     return <<<LINEA_CHILD
  261.         <lineamodif>
  262.           <esarticulo>1</esarticulo>
  263.           <codFavorito></codFavorito>
  264.           <codarticulo>{$linea->getCodarticulo()}</codarticulo>
  265.           <descripcion>{$descripcion}</descripcion>
  266.           <division></division>
  267.           <anulado></anulado>
  268.           <incprecio>{$incprecio}</incprecio>
  269.         </lineamodif>
  270. LINEA_CHILD;
  271.   }
  272.   /**
  273.    * Genera la estructura de las líneas
  274.    *
  275.    */
  276.   private function addlineas($lineas)
  277.   {
  278.     $xmlLineas "";
  279.     foreach ($lineas as $linea) {
  280.       // Es padre
  281.       if ($linea->getParent() == null) {
  282.         $n 0;
  283.         $nm $linea->getNumlineasmodif();
  284.         $parent $this->addLineaParent($linea);
  285.         $xmlLineas .= "    <linea>\n$parentPHP_EOL;
  286.         if ($nm 0) {
  287.           $xmlLineas .= "      <lineasmodif>" PHP_EOL;
  288.         } else {
  289.           $xmlLineas .= "    </linea>" PHP_EOL// Cerrar línea si no hay hijos
  290.         }
  291.       }
  292.       // Es hijo
  293.       if ($linea->getParent() != null) {
  294.         $n++;
  295.         $child $this->addLineaChild($linea);
  296.         $xmlLineas .= $child PHP_EOL;
  297.         if ($n === $nm) {
  298.           $xmlLineas .= "      </lineasmodif>\n    </linea>" PHP_EOL// Cerrar línea y lineasmodif
  299.           $n 0// Resetear para el próximo padre
  300.         }
  301.       }
  302.     }
  303.     return $xmlLineas;
  304.   }
  305.   /**
  306.    * Genera la línea de la propina
  307.    */
  308.   private function addPropina($cab)
  309.   {
  310.     return <<<PROPINA
  311.     <linea>
  312.       <codarticulo>1964</codarticulo>
  313.       <descripcion>APORTE VOLUNTARIO</descripcion>
  314.       <codformato>0</codformato>
  315.       <hora/>
  316.       <unidades>1</unidades>
  317.       <precio>0</precio>
  318.       <precioiva>{$cab->getPropinatotal()}</precioiva>
  319.       <codimpuesto>5</codimpuesto>
  320.       <esmenu>0</esmenu>
  321.       <dto>0</dto>
  322.       <esmodif>0</esmodif>
  323.       <numlineasmodif>0</numlineasmodif>
  324.     </linea>
  325. PROPINA;
  326.   }
  327.   /**
  328.    *
  329.    * Genera los totales
  330.    */
  331.   private function addTotales($cab)
  332.   {
  333.     $propina $cab->getPropinatotal() ?? 0;
  334.     $totalneto $cab->getTotal() + $propina;
  335.     return <<<TOTALES
  336.     <totales>
  337.       <totalneto>{$totalneto}</totalneto>
  338.     </totales>
  339.     <formasdepago>
  340.       <numformasdepago>1</numformasdepago>
  341.       <linea>
  342.         <codformapago>{$cab->getMetododepago()}</codformapago>
  343.         <codmonedaformapago>1</codmonedaformapago>
  344.         <importeformapago>{$totalneto}</importeformapago>
  345.       </linea>
  346.     </formasdepago>
  347.   TOTALES;
  348.   }
  349.   /**
  350.    * Convierte las tildes de un texto a sus entidades HTML.
  351.    *
  352.    * @param string $cadena Cadena a modificar.
  353.    * @return string Cadena de texto con codigos html.
  354.    */
  355.   public static function TildesHtml($cadena)
  356.   {
  357.     // return str_replace(array("á","é","í","ó","ú","ñ","Á","É","Í","Ó","Ú","Ñ","<",">","&"),
  358.     //                   array("&#xE1;","&#xE9;","&#xED;","&#xF3;","&#xFA;","&#xF1;",
  359.     //                   "&#xC1;","&#xC9;","&#xCD;","&#xD3;","&#xDA;","&#xD1;",
  360.     //                   "&#x3C;","&#x3E;","&#x26;"),
  361.     //                   $cadena);
  362.     return str_replace(
  363.       array("á""é""í""ó""ú""ñ""Á""É""Í""Ó""Ú""Ñ""<"">""&"),
  364.       array(
  365.         "a""e""i;""o""u""n",
  366.         "A""E""I""O""U""N",
  367.         "&#x3C;""&#x3E;""&#x26;"
  368.       ),
  369.       $cadena
  370.     );
  371.   }
  372. }