/** * Método que permite generar un libro de guías de despacho a partir de un * archivo CSV con el detalle del mismo * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-12-24 */ public function generar_libro_guia() { // si no se viene por post terminar if (!isset($_POST['submit'])) { return; } // verificar campos no estén vacíos $campos = ['RutEmisorLibro', 'PeriodoTributario', 'FchResol', 'NroResol', 'TipoLibro', 'TipoEnvio', 'FolioNotificacion', 'contrasenia']; foreach ($campos as $campo) { if (!isset($_POST[$campo][0])) { \sowerphp\core\Model_Datasource_Session::message($campo . ' no puede estar en blanco', 'error'); return; } } // si no se pasó el archivo error if (!isset($_FILES['archivo']) or $_FILES['archivo']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo CSV con el detalle de las guías a la que deseas generar su XML', 'error'); return; } // si no se pasó la firma error if (!isset($_FILES['firma']) or $_FILES['firma']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo con la firma digital', 'error'); return; } // Objeto de la Firma try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => file_get_contents($_FILES['firma']['tmp_name']), 'pass' => $_POST['contrasenia']]); } catch (\Exception $e) { \sowerphp\core\Model_Datasource_Session::message('No fue posible abrir la firma digital, quizás contraseña incorrecta', 'error'); return; } // generar caratula del libro $caratula = ['RutEmisorLibro' => str_replace('.', '', $_POST['RutEmisorLibro']), 'PeriodoTributario' => $_POST['PeriodoTributario'], 'FchResol' => $_POST['FchResol'], 'NroResol' => $_POST['NroResol'], 'TipoLibro' => $_POST['TipoLibro'], 'TipoEnvio' => $_POST['TipoEnvio'], 'FolioNotificacion' => $_POST['FolioNotificacion']]; // generar libro de guías $LibroGuia = new \sasco\LibreDTE\Sii\LibroGuia(); $LibroGuia->agregarCSV($_FILES['archivo']['tmp_name']); $LibroGuia->setFirma($Firma); $LibroGuia->setCaratula($caratula); $xml = $LibroGuia->generar(); if (!$LibroGuia->schemaValidate()) { \sowerphp\core\Model_Datasource_Session::message(implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error'); return; } // descargar XML $file = TMP . '/' . $LibroGuia->getID() . '.xml'; file_put_contents($file, $xml); \sasco\LibreDTE\File::compress($file, ['format' => 'zip', 'delete' => true]); exit; }
/** * Acción para la etapa de certificación de intercambio de DTEs * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-11 */ public function intercambio() { $this->set(['nav' => $this->nav]); if (!isset($_POST['submit'])) { return; } // verificar que se hayan pasado los datos requeridos if (!isset($_FILES['xml']) or $_FILES['xml']['error']) { \sowerphp\core\Model_Datasource_Session::message('Hubo algún problema al subir el XML EnvioDTE', 'error'); return; } if (empty($_POST['emisor'])) { \sowerphp\core\Model_Datasource_Session::message('RUT emisor esperado no puede estar en blanco', 'error'); return; } if (empty($_POST['receptor'])) { \sowerphp\core\Model_Datasource_Session::message('RUT receptor esperado no puede estar en blanco', 'error'); return; } if (!isset($_FILES['firma']) or $_FILES['firma']['error']) { \sowerphp\core\Model_Datasource_Session::message('Hubo algún problema al subir la firma electrónica', 'error'); return; } // Cargar EnvioDTE y extraer arreglo con datos de carátula y DTEs $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(file_get_contents($_FILES['xml']['tmp_name'])); $Caratula = $EnvioDte->getCaratula(); // objeto firma electrónica try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => file_get_contents($_FILES['firma']['tmp_name']), 'pass' => $_POST['contrasenia']]); } catch (\Exception $e) { \sowerphp\core\Model_Datasource_Session::message('No fue posible abrir la firma digital, quizás contraseña incorrecta', 'error'); return; } // generar XML RecepcionDTE.xml $RecepcionDTE = $this->intercambio_RecepcionDTE($EnvioDte, $_POST['emisor'], $_POST['receptor'], ['RutResponde' => $_POST['receptor'], 'RutRecibe' => $Caratula['RutEmisor'], 'IdRespuesta' => 1, 'NmbContacto' => $Firma->getName(), 'MailContacto' => $Firma->getEmail()], $Firma); if (!$RecepcionDTE) { \sowerphp\core\Model_Datasource_Session::message('No fue posible generar RecepcionDTE.xml', 'error'); return; } // generar XML EnvioRecibos.xml $EnvioRecibos = $this->intercambio_EnvioRecibos($EnvioDte, ['RutResponde' => $_POST['receptor'], 'RutRecibe' => $Caratula['RutEmisor'], 'NmbContacto' => $Firma->getName(), 'MailContacto' => $Firma->getEmail()], $Firma); if (!$EnvioRecibos) { \sowerphp\core\Model_Datasource_Session::message('No fue posible generar EnvioRecibos.xml', 'error'); return; } // generar XML ResultadoDTE.xml $ResultadoDTE = $this->intercambio_ResultadoDTE($EnvioDte, $_POST['emisor'], $_POST['receptor'], ['RutResponde' => $_POST['receptor'], 'RutRecibe' => $Caratula['RutEmisor'], 'IdRespuesta' => 1, 'NmbContacto' => $Firma->getName(), 'MailContacto' => $Firma->getEmail()], $Firma); if (!$ResultadoDTE) { \sowerphp\core\Model_Datasource_Session::message('No fue posible generar ResultadoDTE.xml', 'error'); return; } // aquí se tienen los 3 XML, se guardan en un único directorio $dir = TMP . '/intercambio_' . $Caratula['RutEmisor'] . '_' . date('U'); if (!mkdir($dir)) { \sowerphp\core\Model_Datasource_Session::message('No fue posible generar el archivo comprimido con los XML', 'error'); return; } file_put_contents($dir . '/1_RecepcionDTE.xml', $RecepcionDTE); file_put_contents($dir . '/2_EnvioRecibos.xml', $EnvioRecibos); file_put_contents($dir . '/3_ResultadoDTE.xml', $ResultadoDTE); unset($RecepcionDTE, $EnvioRecibos, $ResultadoDTE); // entregar archivos XML comprimidos al usuario \sasco\LibreDTE\File::compress($dir, ['format' => 'zip', 'delete' => true]); }
// Cargar EnvioDTE y extraer arreglo con datos de carátula y DTEs $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(file_get_contents($archivo)); $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)) { die('No fue posible crear directorio temporal para DTEs'); } // procesar cada DTEs e ir agregándolo al PDF foreach ($Documentos as $DTE) { if (!$DTE->getDatos()) { die('No se pudieron obtener los datos del DTE'); } $pdf = new \sasco\LibreDTE\Sii\PDF\Dte(false); // =false hoja carta, =true papel contínuo (false por defecto si no se pasa) $pdf->setFooterText(); $pdf->setLogo('/home/delaf/www/localhost/dev/pages/sasco/website/webroot/img/logo_mini.png'); // debe ser PNG! $pdf->setResolucion(['FchResol' => $Caratula['FchResol'], 'NroResol' => $Caratula['NroResol']]); //$pdf->setCedible(true); $pdf->agregar($DTE->getDatos(), $DTE->getTED()); $pdf->Output($dir . '/dte_' . $Caratula['RutEmisor'] . '_' . $DTE->getID() . '.pdf', 'F'); } // entregar archivo comprimido que incluirá cada uno de los DTEs \sasco\LibreDTE\File::compress($dir, ['format' => 'zip', 'delete' => true]);
/** * Método que permite generar un libro de Compras o Ventas a partir de un * archivo CSV con el detalle del mismo * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-10-05 */ public function generar_libro() { // si no se viene por post terminar if (!isset($_POST['submit'])) { return; } // verificar campos no estén vacíos $campos = ['TipoOperacion', 'RutEmisorLibro', 'PeriodoTributario', 'FchResol', 'NroResol', 'TipoLibro', 'TipoEnvio', 'FolioNotificacion', 'contrasenia']; foreach ($campos as $campo) { if (empty($_POST[$campo])) { \sowerphp\core\Model_Datasource_Session::message($campo . ' no puede estar en blanco', 'error'); return; } } // si no se pasó el archivo error if (!isset($_FILES['archivo']) or $_FILES['archivo']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo CSV con el detalle de las compras o ventas al que deseas generar su XML', 'error'); return; } // si no se pasó la firma error if (!isset($_FILES['firma']) or $_FILES['firma']['error']) { \sowerphp\core\Model_Datasource_Session::message('Debes enviar el archivo con la firma digital', 'error'); return; } // Objeto de la Firma try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => file_get_contents($_FILES['firma']['tmp_name']), 'pass' => $_POST['contrasenia']]); } catch (\Exception $e) { \sowerphp\core\Model_Datasource_Session::message('No fue posible abrir la firma digital, quizás contraseña incorrecta', 'error'); return; } // generar caratula del libro $caratula = ['RutEmisorLibro' => str_replace('.', '', $_POST['RutEmisorLibro']), 'RutEnvia' => $Firma->getID(), 'PeriodoTributario' => $_POST['PeriodoTributario'], 'FchResol' => $_POST['FchResol'], 'NroResol' => $_POST['NroResol'], 'TipoOperacion' => $_POST['TipoOperacion'], 'TipoLibro' => $_POST['TipoLibro'], 'TipoEnvio' => $_POST['TipoEnvio'], 'FolioNotificacion' => $_POST['FolioNotificacion']]; // definir si es certificacion $caratula_certificacion = ['COMPRA' => ['PeriodoTributario' => 2000, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006], 'VENTA' => ['PeriodoTributario' => 1980, 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006]]; $certificacion = true; foreach ($caratula_certificacion[$caratula['TipoOperacion']] as $attr => $val) { if ($caratula[$attr] != $val or $attr == 'PeriodoTributario' and substr($caratula[$attr], 0, 4) != $val) { $certificacion = false; break; } } // generar libro de compras o venta $LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta(); if ($caratula['TipoOperacion'] === 'COMPRA') { $LibroCompraVenta->agregarComprasCSV($_FILES['archivo']['tmp_name']); } else { $LibroCompraVenta->agregarVentasCSV($_FILES['archivo']['tmp_name']); } $LibroCompraVenta->setCaratula($caratula); if (!$certificacion) { $LibroCompraVenta->setFirma($Firma); } $xml = $LibroCompraVenta->generar($caratula['TipoOperacion'] == 'COMPRA'); if (!$certificacion and !$LibroCompraVenta->schemaValidate()) { \sowerphp\core\Model_Datasource_Session::message(implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error'); return; } // descargar XML $file = TMP . '/' . $LibroCompraVenta->getID() . '.xml'; file_put_contents($file, $xml); \sasco\LibreDTE\File::compress($file, ['format' => 'zip', 'delete' => true]); exit; }
/** * 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]); } }