/**
  * Recurso de la API que genera el PDF de los DTEs contenidos en un EnvioDTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2016-01-15
  */
 public function _api_generar_pdf_POST()
 {
     // verificar si se pasaron credenciales de un usuario
     $User = $this->Api->getAuthUser();
     if (is_string($User)) {
         $this->Api->send($User, 401);
     }
     // si hubo problemas al subir el archivo error
     if (!isset($this->Api->data['xml']) and (!isset($_FILES['xml']) or $_FILES['xml']['error'])) {
         $this->Api->send('Hubo algún problema al recibir el archivo XML con el EnvioDTE', 500);
     }
     // recuperar contenido del archivo xml
     if (isset($this->Api->data['xml'])) {
         $xml = base64_decode($this->Api->data['xml']);
     } else {
         $xml = file_get_contents($_FILES['xml']['tmp_name']);
     }
     // recuperar contenido del logo (si existe)
     if (isset($this->Api->data['logo'])) {
         $logo = base64_decode($this->Api->data['logo']);
     } else {
         if (isset($_FILES['logo']) and !$_FILES['logo']['error']) {
             $logo = file_get_contents($_FILES['logo']['tmp_name']);
         }
     }
     // crear flag cedible
     $cedible = !empty($this->Api->data['cedible']) ? $this->Api->data['cedible'] : false;
     // crear flag papel continuo
     $papelContinuo = !empty($this->Api->data['papelContinuo']) ? $this->Api->data['papelContinuo'] : false;
     // crear opción para web de verificación
     $webVerificacion = !empty($this->Api->data['webVerificacion']) ? $this->Api->data['webVerificacion'] : false;
     // sin límite de tiempo para generar documentos
     set_time_limit(0);
     // Cargar EnvioDTE y extraer arreglo con datos de carátula y DTEs
     $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte();
     $EnvioDte->loadXML($xml);
     $Caratula = $EnvioDte->getCaratula();
     $Documentos = $EnvioDte->getDocumentos();
     // directorio temporal para guardar los PDF
     $dir = sys_get_temp_dir() . '/dte_' . $Caratula['RutEmisor'] . '_' . $Caratula['RutReceptor'] . '_' . str_replace(['-', ':', 'T'], '', $Caratula['TmstFirmaEnv']);
     if (is_dir($dir)) {
         \sasco\LibreDTE\File::rmdir($dir);
     }
     if (!mkdir($dir)) {
         $this->Api->send('No fue posible crear directorio temporal para DTEs', 500);
     }
     // procesar cada DTEs e ir agregándolo al PDF
     foreach ($Documentos as $DTE) {
         if (!$DTE->getDatos()) {
             $this->Api->send('No se pudieron obtener los datos de un DTE', 500);
         }
         // generar PDF
         $pdf = new \sasco\LibreDTE\Sii\PDF\Dte($papelContinuo);
         $pdf->setFooterText();
         if (isset($logo)) {
             $pdf->setLogo('@' . $logo);
         }
         $pdf->setResolucion(['FchResol' => $Caratula['FchResol'], 'NroResol' => $Caratula['NroResol']]);
         if ($webVerificacion) {
             $pdf->setWebVerificacion($webVerificacion);
         }
         $pdf->agregar($DTE->getDatos(), $DTE->getTED());
         if ($cedible and $DTE->esCedible()) {
             $pdf->setCedible(true);
             $pdf->agregar($DTE->getDatos(), $DTE->getTED());
         }
         $file = $dir . '/dte_' . $Caratula['RutEmisor'] . '_' . $DTE->getID() . '.pdf';
         $pdf->Output($file, 'F');
     }
     // si solo es un archivo y se pidió no comprimir se entrega directamente
     if (isset($this->Api->data['compress']) and !$this->Api->data['compress'] and !isset($Documentos[1])) {
         $this->response->sendFile($file, ['disposition' => 'attachement', 'exit' => false]);
         \sowerphp\general\Utility_File::rmdir($dir);
         exit(0);
     } else {
         \sasco\LibreDTE\File::compress($dir, ['format' => 'zip', 'delete' => true]);
     }
 }
 /**
  * Acción que entrega los XML del resultado de la revisión del intercambio
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-28
  */
 public function resultados_xml($codigo)
 {
     $Emisor = $this->getContribuyente();
     // obtener DTE emitido
     $DteIntercambio = new Model_DteIntercambio($Emisor->rut, $codigo, (int) $Emisor->certificacion);
     if (!$DteIntercambio->exists()) {
         \sowerphp\core\Model_Datasource_Session::message('No existe el intercambio solicitado', 'error');
         $this->redirect('/dte/dte_intercambios');
     }
     // si no hay XML error
     if (!$DteIntercambio->recepcion_xml and !$DteIntercambio->recibos_xml and !$DteIntercambio->resultado_xml) {
         \sowerphp\core\Model_Datasource_Session::message('No existen archivos de resultado generados, no se ha procesado aun el intercambio', 'error');
         $this->redirect(str_replace('resultados_xml', 'ver', $this->request->request));
     }
     // agregar a archivo comprimido y entregar
     $dir = TMP . '/resultado_intercambio_' . $Emisor->rut . '-' . $Emisor->dv . '_' . $DteIntercambio->codigo;
     if (is_dir($dir)) {
         \sowerphp\general\Utility_File::rmdir($dir);
     }
     if (!mkdir($dir)) {
         \sowerphp\core\Model_Datasource_Session::message('No fue posible crear el directorio temporal para los XML', 'error');
         $this->redirect(str_replace('resultados_xml', 'ver', $this->request->request));
     }
     if ($DteIntercambio->recepcion_xml) {
         file_put_contents($dir . '/RecepcionDTE.xml', base64_decode($DteIntercambio->recepcion_xml));
     }
     if ($DteIntercambio->recibos_xml) {
         file_put_contents($dir . '/EnvioRecibos.xml', base64_decode($DteIntercambio->recibos_xml));
     }
     if ($DteIntercambio->resultado_xml) {
         file_put_contents($dir . '/ResultadoDTE.xml', base64_decode($DteIntercambio->resultado_xml));
     }
     \sowerphp\general\Utility_File::compress($dir, ['format' => 'zip', 'delete' => true]);
     exit;
 }