/** * Método principal del comando * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-12-15 */ public function main() { // cargar XML y extraer arreglo con datos de carátula y DTEs $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(file_get_contents($this->args['xml'])); $Caratula = $EnvioDte->getCaratula(); $Documentos = $EnvioDte->getDocumentos(); // procesar cada DTEs e ir creando los archivos PDF foreach ($Documentos as $DTE) { if (!$DTE->getDatos()) { $this->error('No se pudieron obtener los datos de uno de los DTE del XML'); } $this->out('Generando PDF para DTE ' . $DTE->getID()); $pdf = new \sasco\LibreDTE\Sii\PDF\Dte($this->args['papel']); $pdf->setFooterText(); if ($this->args['logo']) { $pdf->setLogo($this->args['logo']); } $pdf->setResolucion(['FchResol' => $Caratula['FchResol'], 'NroResol' => $Caratula['NroResol']]); $pdf->setWebVerificacion($this->args['web']); $pdf->agregar($DTE->getDatos(), $DTE->getTED()); if (isset($this->args['cedible'])) { $pdf->setCedible(true); $pdf->agregar($DTE->getDatos(), $DTE->getTED()); } $pdf->Output($this->args['dir'] . '/dte_' . $Caratula['RutEmisor'] . '_' . $DTE->getID() . '.pdf', 'F'); } return 0; }
* @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-16 */ // respuesta en texto plano header('Content-type: text/plain; charset=ISO-8859-1'); // incluir archivos php de la biblioteca y configuraciones include 'inc.php'; // datos para validar $archivo_recibido = 'xml/intercambio/ENVIO_DTE_420328.xml'; $RutReceptor_esperado = '76192083-9'; $RutEmisor_esperado = '88888888-8'; // Cargar EnvioDTE y extraer arreglo con datos de carátula y DTEs $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(file_get_contents($archivo_recibido)); $Caratula = $EnvioDte->getCaratula(); $Documentos = $EnvioDte->getDocumentos(); // caratula $caratula = ['RutResponde' => $RutReceptor_esperado, 'RutRecibe' => $Caratula['RutEmisor'], 'IdRespuesta' => 1]; // objeto para la respuesta $RespuestaEnvio = new \sasco\LibreDTE\Sii\RespuestaEnvio(); // procesar cada DTE $i = 1; foreach ($Documentos as $DTE) { $estado = !$DTE->getEstadoValidacion(['RUTEmisor' => $RutEmisor_esperado, 'RUTRecep' => $RutReceptor_esperado]) ? 0 : 2; $RespuestaEnvio->agregarRespuestaDocumento(['TipoDTE' => $DTE->getTipo(), 'Folio' => $DTE->getFolio(), 'FchEmis' => $DTE->getFechaEmision(), 'RUTEmisor' => $DTE->getEmisor(), 'RUTRecep' => $DTE->getReceptor(), 'MntTotal' => $DTE->getMontoTotal(), 'CodEnvio' => $i++, 'EstadoDTE' => $estado, 'EstadoDTEGlosa' => \sasco\LibreDTE\Sii\RespuestaEnvio::$estados['respuesta_documento'][$estado]]); } // asignar carátula y Firma $RespuestaEnvio->setCaratula($caratula); $RespuestaEnvio->setFirma(new \sasco\LibreDTE\FirmaElectronica($config['firma'])); // generar XML $xml = $RespuestaEnvio->generar();
/** * Acción que genera el libro de ventas a partir del XML de EnvioDTE creado * para la certificación * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-12-16 */ public function set_pruebas_ventas() { // 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 XML del EnvioDTE al que quieres generar su Libro de Ventas', 'error'); $this->redirect('/certificacion/set_pruebas#ventas'); } // obtener documentos $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(file_get_contents($_FILES['archivo']['tmp_name'])); $Caratula = $EnvioDte->getCaratula(); $Documentos = $EnvioDte->getDocumentos(); // amar caratula $caratula = ['RutEmisorLibro' => $Caratula['RutEmisor'], 'RutEnvia' => $Caratula['RutEnvia'], 'PeriodoTributario' => $_POST['PeriodoTributario'], 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoOperacion' => 'VENTA', 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006]; // armar libro de ventas $LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta(true); // libro simplificado foreach ($Documentos as $DTE) { $LibroCompraVenta->agregar($DTE->getResumen(), false); // agregar detalle sin normalizar } // generar XML con el libro de ventas $LibroCompraVenta->setCaratula($caratula); $xml = $LibroCompraVenta->generar(false); // generar XML sin firma y sin detalle // verificar problemas de esquema /*if (!$LibroCompraVenta->schemaValidate()) { \sowerphp\core\Model_Datasource_Session::message( implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error' ); $this->redirect('/certificacion/set_pruebas#ventas'); }*/ // descargar XML $file = TMP . '/' . $LibroCompraVenta->getID() . '.xml'; file_put_contents($file, $xml); \sasco\LibreDTE\File::compress($file, ['format' => 'zip', 'delete' => true]); exit; }
/** * Método que entrega el arreglo con los datos que se usaron para generar el * XML del DTE * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-24 */ public function getDatos() { if (!$this->datos) { $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDte->loadXML(base64_decode($this->xml)); $datos = $EnvioDte->getDocumentos()[0]->getDatos(); } return $datos; }
/** * 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]); } }
$boletas = 'xml/EnvioBOLETA.xml'; $notas_credito = 'xml/EnvioDTE.xml'; // cargar XML boletas y notas $EnvioBOLETA = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioBOLETA->loadXML(file_get_contents($boletas)); $EnvioDTE = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioDTE->loadXML(file_get_contents($notas_credito)); // crear objeto para consumo de folios $ConsumoFolio = new \sasco\LibreDTE\Sii\ConsumoFolio(); $ConsumoFolio->setFirma(new \sasco\LibreDTE\FirmaElectronica($config['firma'])); // agregar detalle de boletas foreach ($EnvioBOLETA->getDocumentos() as $Dte) { $ConsumoFolio->agregar($Dte->getResumen()); } // agregar detalle de notas de crédito foreach ($EnvioDTE->getDocumentos() as $Dte) { $ConsumoFolio->agregar($Dte->getResumen()); } // crear carátula para el envío (se hace después de agregar los detalles ya que // así se obtiene automáticamente la fecha inicial y final de los documentos) $CaratulaEnvioBOLETA = $EnvioBOLETA->getCaratula(); $ConsumoFolio->setCaratula(['RutEmisor' => $CaratulaEnvioBOLETA['RutEmisor'], 'FchResol' => $CaratulaEnvioBOLETA['FchResol'], 'NroResol' => $CaratulaEnvioBOLETA['NroResol']]); // generar, validar schema y mostrar XML $ConsumoFolio->generar(); if ($ConsumoFolio->schemaValidate()) { //echo $ConsumoFolio->generar(); $track_id = $ConsumoFolio->enviar(); var_dump($track_id); } // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) {
* @version 2015-12-14 */ // respuesta en texto plano header('Content-type: text/plain; charset=ISO-8859-1'); // incluir archivos php de la biblioteca y configuraciones include 'inc.php'; // archivos $boletas = 'xml/EnvioBOLETA.xml'; // cargar XML boletas y notas $EnvioBOLETA = new \sasco\LibreDTE\Sii\EnvioDte(); $EnvioBOLETA->loadXML(file_get_contents($boletas)); // crear objeto para libro de boletas $LibroBoleta = new \sasco\LibreDTE\Sii\LibroBoleta(); $LibroBoleta->setFirma(new \sasco\LibreDTE\FirmaElectronica($config['firma'])); // agregar detalle de boletas foreach ($EnvioBOLETA->getDocumentos() as $Dte) { $r = $Dte->getResumen(); $LibroBoleta->agregar(['TpoDoc' => $r['TpoDoc'], 'FolioDoc' => $r['NroDoc'], 'Anulado' => in_array($r['NroDoc'], [1, 3, 5]) ? 'A' : false, 'FchEmiDoc' => $r['FchDoc'], 'RUTCliente' => $r['RUTDoc'], 'MntExe' => $r['MntExe'] ? $r['MntExe'] : false, 'MntTotal' => $r['MntTotal']]); } // crear carátula para el libro $CaratulaEnvioBOLETA = $EnvioBOLETA->getCaratula(); $LibroBoleta->setCaratula(['RutEmisorLibro' => $CaratulaEnvioBOLETA['RutEmisor'], 'FchResol' => $CaratulaEnvioBOLETA['FchResol'], 'NroResol' => $CaratulaEnvioBOLETA['NroResol'], 'FolioNotificacion' => 1]); // generar, validar schema y mostrar XML $LibroBoleta->generar(); if ($LibroBoleta->schemaValidate()) { echo $LibroBoleta->generar(); } // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) { echo $error, "\n"; }