/** * 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; }