Exemplo n.º 1
0
 /**
  * Método que realiza el envío del documento al SII
  * @return Track ID del envío o =false si hubo algún problema al enviar el documento
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-14
  */
 public function enviar()
 {
     // generar XML que se enviará
     if (!$this->xml_data) {
         $this->xml_data = $this->generar();
     }
     if (!$this->xml_data) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::DOCUMENTO_ERROR_GENERAR_XML, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::DOCUMENTO_ERROR_GENERAR_XML, substr(get_class($this), strrpos(get_class($this), '\\') + 1)));
         return false;
     }
     // validar schema del documento antes de enviar
     if (!$this->schemaValidate()) {
         return false;
     }
     // solicitar token
     $token = \sasco\LibreDTE\Sii\Autenticacion::getToken($this->Firma);
     if (!$token) {
         return false;
     }
     // enviar DTE
     $envia = $this->caratula['RutEnvia'];
     $emisor = !empty($this->caratula['RutEmisor']) ? $this->caratula['RutEmisor'] : $this->caratula['RutEmisorLibro'];
     $result = \sasco\LibreDTE\Sii::enviar($envia, $emisor, $this->xml_data, $token);
     if ($result === false) {
         return false;
     }
     if (!is_numeric((string) $result->TRACKID)) {
         return false;
     }
     return (int) (string) $result->TRACKID;
 }
Exemplo n.º 2
0
 /**
  * Método que verifica el código de autorización de folios
  * @return =true si está ok el XML cargado
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-10-30
  */
 public function check()
 {
     // validar firma del SII sobre los folios
     $firma = $this->getFirma();
     $idk = $this->getIDK();
     if (!$firma or !$idk) {
         return false;
     }
     $pub_key = \sasco\LibreDTE\Sii::cert($idk);
     if (!$pub_key or openssl_verify($this->xml->getFlattened('/AUTORIZACION/CAF/DA'), base64_decode($firma), $pub_key) !== 1) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::FOLIOS_ERROR_FIRMA, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::FOLIOS_ERROR_FIRMA));
         return false;
     }
     // validar clave privada y pública proporcionada por el SII
     $private_key = $this->getPrivateKey();
     if (!$private_key) {
         return false;
     }
     $plain = md5(date('U'));
     if (!openssl_private_encrypt($plain, $crypt, $private_key)) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::FOLIOS_ERROR_ENCRIPTAR, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::FOLIOS_ERROR_ENCRIPTAR));
         return false;
     }
     $public_key = $this->getPublicKey();
     if (!$public_key) {
         return false;
     }
     if (!openssl_public_decrypt($crypt, $plain_firmado, $public_key)) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::FOLIOS_ERROR_DESENCRIPTAR, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::FOLIOS_ERROR_DESENCRIPTAR));
         return false;
     }
     return $plain === $plain_firmado;
 }
 /**
  * Método principal del comando
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-30
  */
 public function main($ambiente = \sasco\LibreDTE\Sii::PRODUCCION)
 {
     // obtener conexión a la base de datos
     $db =& \sowerphp\core\Model_Datasource_Database::get();
     // obtener firma electrónica
     try {
         $Firma = new \sasco\LibreDTE\FirmaElectronica();
     } catch (\sowerphp\core\Exception $e) {
         $this->out('<error>No fue posible obtener la firma electrónica</error>');
         return 1;
     }
     // obtener contribuyentes de ambiente de producción
     $contribuyentes = \sasco\LibreDTE\Sii::getContribuyentes($Firma, $ambiente);
     if (!$contribuyentes) {
         $this->out('<error>No fue posible obtener los contribuyentes desde el SII</error>');
         return 2;
     }
     // procesar cada uno de los contribuyentes
     $registros = num(count($contribuyentes));
     $procesados = 0;
     foreach ($contribuyentes as $c) {
         // contabilizar contribuyente procesado
         $procesados++;
         if ($this->verbose >= 1) {
             $this->out('Procesando ' . num($procesados) . '/' . $registros . ': contribuyente ' . $c[1]);
         }
         // agregar y/o actualizar datos del contribuyente si no tiene usuario administrador
         list($rut, $dv) = explode('-', $c[0]);
         $Contribuyente = new \website\Dte\Model_Contribuyente($rut);
         if (!$Contribuyente->usuario) {
             $Contribuyente->dv = $dv;
             $Contribuyente->razon_social = substr($c[1], 0, 100);
             if (isset($c[3][9])) {
                 $aux = explode('-', $c[3]);
                 if (isset($aux[2])) {
                     list($d, $m, $Y) = $aux;
                     $Contribuyente->resolucion_fecha = $Y . '-' . $m . '-' . $d;
                 }
             }
             if (is_numeric($c[2])) {
                 $Contribuyente->resolucion_numero = (int) $c[2];
             }
             if (strpos($c[4], '@')) {
                 $Contribuyente->intercambio_user = substr($c[4], 0, 50);
             }
             $Contribuyente->modificado = date('Y-m-d H:i:s');
             try {
                 $Contribuyente->save();
             } catch (\sowerphp\core\Exception_Model_Datasource_Database $e) {
                 if ($this->verbose >= 2) {
                     $this->out('<error>Contribuyente ' . $c[1] . ' no pudo ser guardado en la base de datos</error>');
                 }
             }
         }
     }
     $this->showStats();
     return 0;
 }
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General GNU para obtener
 * una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */
/**
 * @file 024-getContribuyentes.php
 * Ejemplo de obtención de datos archivo CSV con getContribuyentes autorizados
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-30
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// solicitar datos
$datos = \sasco\LibreDTE\Sii::getContribuyentes(new \sasco\LibreDTE\FirmaElectronica($config['firma']), \sasco\LibreDTE\Sii::PRODUCCION);
// si hubo errores se muestran
if (!$datos) {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
// descargar archivo como CSV
array_unshift($datos, ['RUT', 'Razón social', 'Número resolución', 'Fecha resolución', 'Email intercambio', 'URL']);
\sasco\LibreDTE\CSV::generate($datos, 'contribuyentes', ';', '');
 *
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-16
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// caratula del libro
$caratula = ['RutEmisorLibro' => '76192083-9', 'RutEnvia' => '11222333-4', 'PeriodoTributario' => '2000-03', 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoOperacion' => 'COMPRA', 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006];
// EN FACTURA CON IVA USO COMUN CONSIDERE QUE EL FACTOR DE PROPORCIONALIDAD
// DEL IVA ES DE 0.60
$factor_proporcionalidad_iva = 60;
// se divide por 100 al agregar al resumen del período
// set de pruebas compras - número de atención 414177
$detalles = [['TpoDoc' => 30, 'NroDoc' => 234, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-01', 'RUTDoc' => '78885550-8', 'MntNeto' => 53253], ['TpoDoc' => 33, 'NroDoc' => 32, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-01', 'RUTDoc' => '78885550-8', 'MntExe' => 10633, 'MntNeto' => 11473], ['TpoDoc' => 30, 'NroDoc' => 781, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-02', 'RUTDoc' => '78885550-8', 'MntNeto' => 30171, 'FctProp' => $factor_proporcionalidad_iva], ['TpoDoc' => 60, 'NroDoc' => 451, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-03', 'RUTDoc' => '78885550-8', 'MntNeto' => 2928], ['TpoDoc' => 33, 'NroDoc' => 67, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-04', 'RUTDoc' => '78885550-8', 'MntNeto' => 12135, 'IVANoRec' => ['CodIVANoRec' => 4, 'MntIVANoRec' => round(12135 * (\sasco\LibreDTE\Sii::getIVA() / 100))]], ['TpoDoc' => 46, 'NroDoc' => 9, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-05', 'RUTDoc' => '78885550-8', 'MntNeto' => 10632, 'OtrosImp' => ['CodImp' => 15, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'MntImp' => round(10632 * (\sasco\LibreDTE\Sii::getIVA() / 100))]], ['TpoDoc' => 60, 'NroDoc' => 211, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'FchDoc' => $caratula['PeriodoTributario'] . '-06', 'RUTDoc' => '78885550-8', 'MntNeto' => 9053]];
// Objetos de Firma y LibroCompraVenta
$Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']);
$LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta();
// agregar cada uno de los detalles al libro
foreach ($detalles as $detalle) {
    $LibroCompraVenta->agregar($detalle);
}
// enviar libro de compras y mostrar resultado del envío: track id o bien =false si hubo error
$LibroCompraVenta->setCaratula($caratula);
$LibroCompraVenta->generar();
// generar XML sin firma
$LibroCompraVenta->setFirma($Firma);
$track_id = $LibroCompraVenta->enviar();
// enviar XML generado en línea anterior
var_dump($track_id);
Exemplo n.º 6
0
 * modificarlo bajo los términos de la Licencia Pública General GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General GNU para obtener
 * una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */
/**
 * @file config-dist.php
 * Archivo de configuración para los ejemplos
 * ESTE ARCHIVO DEBE SER RENOMBRADO A config.php Y SU CONFIGURACIÓN AJUSTADA
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-14
 */
// configuración de la firma
// se puede omitir/comentar el archivo (índice file) y entregar directamente el
// contenido del archivo de la firma (índice data)
$config = ['firma' => ['file' => '/ruta/al/certificado.p12', 'pass' => 'contraseña']];
// trabajar en ambiente de certificación
define('_LibreDTE_CERTIFICACION_', true);
// trabajar con maullin2 en vez de maullin para certificación
\sasco\LibreDTE\Sii::setServidor('maullin2');
 *
 * @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';
// caratula del libro
$caratula = ['RutEmisorLibro' => '76192083-9', 'RutEnvia' => '11222333-4', 'PeriodoTributario' => '1980-03', 'FchResol' => '2006-01-20', 'NroResol' => 102006, 'TipoOperacion' => 'VENTA', 'TipoLibro' => 'ESPECIAL', 'TipoEnvio' => 'TOTAL', 'FolioNotificacion' => 102006];
// datos del emisor
$Emisor = ['RUTEmisor' => '76192083-9', 'RznSoc' => 'SASCO SpA', 'GiroEmis' => 'Servicios integrales de informática', 'Acteco' => 726000, 'DirOrigen' => 'Santiago', 'CmnaOrigen' => 'Santiago'];
// datos de los DTE (cada elemento del arreglo $set_pruebas es un DTE)
// IMPORTANTE: folios deben coincidir con los de los DTEs que fueron aceptados
// en el proceso de certificación del set de pruebas básico
$set_pruebas = [['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => 21], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'Cajón AFECTO', 'QtyItem' => 123, 'PrcItem' => 923], ['NmbItem' => 'Relleno AFECTO', 'QtyItem' => 53, 'PrcItem' => 1473]], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => 21, 'RazonRef' => 'CASO 414175-1']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => 22], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'Pañuelo AFECTO', 'QtyItem' => 235, 'PrcItem' => 1926, 'DescuentoPct' => 4], ['NmbItem' => 'ITEM 2 AFECTO', 'QtyItem' => 161, 'PrcItem' => 990, 'DescuentoPct' => 5]], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => 22, 'RazonRef' => 'CASO 414175-2']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => 23], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'Pintura B&W AFECTO', 'QtyItem' => 24, 'PrcItem' => 1937], ['NmbItem' => 'ITEM 2 AFECTO', 'QtyItem' => 149, 'PrcItem' => 2975], ['IndExe' => 1, 'NmbItem' => 'ITEM 3 SERVICIO EXENTO', 'QtyItem' => 1, 'PrcItem' => 34705]], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => 23, 'RazonRef' => 'CASO 414175-3']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => 24], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'ITEM 1 AFECTO', 'QtyItem' => 81, 'PrcItem' => 1672], ['NmbItem' => 'ITEM 2 AFECTO', 'QtyItem' => 35, 'PrcItem' => 1405], ['IndExe' => 1, 'NmbItem' => 'ITEM 3 SERVICIO EXENTO', 'QtyItem' => 2, 'PrcItem' => 6767]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 6], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => 24, 'RazonRef' => 'CASO 414175-4']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => 13], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Cajón AFECTO']], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => 13, 'RazonRef' => 'CASO 414175-5'], ['TpoDocRef' => 33, 'FolioRef' => 21, 'CodRef' => 2, 'RazonRef' => 'CORRIGE GIRO DEL RECEPTOR']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => 14], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Pañuelo AFECTO', 'QtyItem' => 86, 'PrcItem' => 1926, 'DescuentoPct' => 4], ['NmbItem' => 'ITEM 2 AFECTO', 'QtyItem' => 109, 'PrcItem' => 990, 'DescuentoPct' => 5]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => 14, 'RazonRef' => 'CASO 414175-6'], ['TpoDocRef' => 33, 'FolioRef' => 22, 'CodRef' => 3, 'RazonRef' => 'DEVOLUCION DE MERCADERIAS']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => 15], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntNeto' => 0, 'MntExe' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Pintura B&W AFECTO', 'QtyItem' => 24, 'PrcItem' => 1937], ['NmbItem' => 'ITEM 2 AFECTO', 'QtyItem' => 149, 'PrcItem' => 2975], ['IndExe' => 1, 'NmbItem' => 'ITEM 3 SERVICIO EXENTO', 'QtyItem' => 1, 'PrcItem' => 34705]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => 15, 'RazonRef' => 'CASO 414175-7'], ['TpoDocRef' => 33, 'FolioRef' => 23, 'CodRef' => 1, 'RazonRef' => 'ANULA FACTURA']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 56, 'Folio' => 5], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Cajón AFECTO']], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => 5, 'RazonRef' => 'CASO 414175-8'], ['TpoDocRef' => 61, 'FolioRef' => 13, 'CodRef' => 1, 'RazonRef' => 'ANULA NOTA DE CREDITO ELECTRONICA']]]];
// Objetos de Firma y LibroCompraVenta
$Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']);
$LibroCompraVenta = new \sasco\LibreDTE\Sii\LibroCompraVenta();
// generar cada DTE y agregar su resumen al detalle del libro
foreach ($set_pruebas as $documento) {
    $DTE = new \sasco\LibreDTE\Sii\Dte($documento);
    $LibroCompraVenta->agregar($DTE->getResumen(), false);
    // agregar detalle sin normalizar
}
// enviar libro de ventas y mostrar resultado del envío: track id o bien =false si hubo error
$LibroCompraVenta->setCaratula($caratula);
$LibroCompraVenta->generar(false);
// generar XML sin firma y sin detalle
$LibroCompraVenta->setFirma($Firma);
$track_id = $LibroCompraVenta->enviar();
Exemplo n.º 8
0
 /**
  * Método que obtiene los datos para generar los tags TotalesPeriodo
  * @return Arreglo con los datos para generar los tags TotalesPeriodo
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-14
  */
 private function getResumenPeriodo()
 {
     $resumen = [];
     foreach ($this->detalles as &$d) {
         // si el tipo de boleta no está en el resumen se crea
         if (!isset($resumen[$d['TpoDoc']])) {
             $resumen[$d['TpoDoc']] = ['TpoDoc' => $d['TpoDoc'], 'TotAnulado' => false, 'TotalesServicio' => []];
         }
         // si no existe el tipo de servicio se agrega
         if (!isset($resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']])) {
             $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']] = ['TpoServ' => $d['TpoServ'], 'PeriodoDevengado' => false, 'TotDoc' => false, 'TotMntExe' => false, 'TotMntNeto' => false, 'TasaIVA' => false, 'TotMntIVA' => false, 'TotMntTotal' => false, 'TotMntNoFact' => false, 'TotMntPeriodo' => false, 'TotSaldoAnt' => false, 'TotVlrPagar' => false, 'TotTicket' => false];
         }
         // agregar detalle al resumen
         if (empty($d['Anulado'])) {
             // contabilizar documento
             $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotDoc'] += 1;
             // ir sumando valores
             $vals = ['MntExe' => 'TotMntExe', 'MntTotal' => 'TotMntTotal', 'MntNoFact' => 'TotMntNoFact', 'MntPeriodo' => 'TotMntPeriodo', 'SaldoAnt' => 'TotSaldoAnt', 'VlrPagar' => 'TotVlrPagar', 'TotTicketBoleta' => 'TotTicket'];
             foreach ($vals as $ori => $des) {
                 if ($d[$ori]) {
                     $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']][$des] += $d[$ori];
                 }
             }
             // determinar neto e iva
             $tasa = \sasco\LibreDTE\Sii::getIVA();
             $neto = round(($d['MntTotal'] - $d['MntExe']) / (1 + $tasa / 100));
             if ($neto) {
                 $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntNeto'] += $neto;
                 $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TasaIVA'] = $tasa;
                 // WARNING: problema por aproximaciones al calcular el NETO e IVA a partir del BRUTO
                 //$resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntIVA'] = round($resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntNeto'] * ($tasa/100));
                 $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntIVA'] = $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntTotal'] - $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntExe'] - $resumen[$d['TpoDoc']]['TotalesServicio'][$d['TpoServ']]['TotMntNeto'];
             }
         }
     }
     // armar resumen verdadero
     $ResumenPeriodo = ['TotalesPeriodo' => []];
     foreach ($resumen as $r) {
         $ResumenPeriodo['TotalesPeriodo'][] = $r;
     }
     // entregar resumen
     return $ResumenPeriodo;
 }
Exemplo n.º 9
0
 /**
  * Método que normaliza los datos de una factura electrónica
  * @param datos Arreglo con los datos del documento que se desean normalizar
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-20
  */
 private function normalizar_33(array &$datos)
 {
     // completar con nodos por defecto
     $datos = \sasco\LibreDTE\Arreglo::mergeRecursiveDistinct(['Encabezado' => ['IdDoc' => false, 'Emisor' => false, 'Receptor' => false, 'Totales' => ['MntNeto' => 0, 'MntExe' => false, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]]], $datos);
     // normalizar datos
     $this->normalizar_detalle($datos);
     $this->normalizar_aplicar_descuentos_recargos($datos, ['MntNeto', 'MntExe']);
     $this->normalizar_agregar_IVA_MntTotal($datos);
 }
Exemplo n.º 10
0
 *
 * Ejemplo que genera y envía el libro electrónico de guías de despachos.
 *
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-10-02
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// caratula del libro
$caratula = ['RutEmisorLibro' => '76192083-9', 'FchResol' => '2014-12-05', 'NroResol' => 0, 'FolioNotificacion' => 1];
// receptor de las guías
$receptor = '55666777-8';
// set de pruebas guías - número de atención 414177
$detalles = [['Folio' => 4, 'TpoOper' => 5, 'RUTDoc' => $caratula['RutEmisorLibro'], 'TasaImp' => \sasco\LibreDTE\Sii::getIVA()], ['Folio' => 5, 'TpoOper' => 1, 'RUTDoc' => $receptor, 'MntNeto' => 1375761, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA(), 'TpoDocRef' => 33, 'FolioDocRef' => 69, 'FchDocRef' => date('Y-m-d')], ['Folio' => 6, 'Anulado' => 2, 'TpoOper' => 1, 'RUTDoc' => $receptor, 'MntNeto' => 1050032, 'TasaImp' => \sasco\LibreDTE\Sii::getIVA()]];
// Objetos de Firma y LibroGuia
$Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']);
$LibroGuia = new \sasco\LibreDTE\Sii\LibroGuia();
// agregar cada uno de los detalles al libro
foreach ($detalles as $detalle) {
    $LibroGuia->agregar($detalle);
}
// enviar libro de guías y mostrar resultado del envío: track id o bien =false si hubo error
$LibroGuia->setFirma($Firma);
$LibroGuia->setCaratula($caratula);
$LibroGuia->generar();
$track_id = $LibroGuia->enviar();
// enviar XML generado en línea anterior
var_dump($track_id);
// si hubo errores mostrar
Exemplo n.º 11
0
 /**
  * Recurso de la API que permite validar el TED (timbre electrónico)
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-19
  */
 public function _api_verificar_ted_POST()
 {
     // verificar si se pasaron credenciales de un usuario
     $User = $this->Api->getAuthUser();
     if (is_string($User)) {
         $this->Api->send($User, 401);
     }
     // obtener TED
     $TED = base64_decode($this->Api->data);
     if (strpos($TED, '<?xml') !== 0) {
         $TED = '<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . $TED;
     }
     // crear xml con el ted y obtener datos en arreglo
     $xml = new \sasco\LibreDTE\XML();
     $xml->loadXML($TED);
     $datos = $xml->toArray();
     // verificar firma del ted
     $DD = $xml->getFlattened('/TED/DD');
     $FRMT = $datos['TED']['FRMT'];
     $pub_key = \sasco\LibreDTE\FirmaElectronica::getFromModulusExponent($datos['TED']['DD']['CAF']['DA']['RSAPK']['M'], $datos['TED']['DD']['CAF']['DA']['RSAPK']['E']);
     if (openssl_verify($DD, base64_decode($FRMT), $pub_key, OPENSSL_ALGO_SHA1) !== 1) {
         $this->Api->send('Firma del timbre incorrecta', 500);
     }
     // verificar que datos del timbre correspondan con datos del CAF
     if ($datos['TED']['DD']['RE'] != $datos['TED']['DD']['CAF']['DA']['RE']) {
         $this->Api->send('RUT del timbre no corresponde con RUT del CAF', 500);
     }
     if ($datos['TED']['DD']['TD'] != $datos['TED']['DD']['CAF']['DA']['TD']) {
         $this->Api->send('Tipo de DTE del timbre no corresponde con tipo de DTE del CAF', 500);
     }
     if ($datos['TED']['DD']['F'] < $datos['TED']['DD']['CAF']['DA']['RNG']['D'] or $datos['TED']['DD']['F'] > $datos['TED']['DD']['CAF']['DA']['RNG']['H']) {
         $this->Api->send('Folio del DTE del timbre fuera del rango del CAF', 500);
     }
     // definir si se consultará en certificación o producción
     define('_LibreDTE_CERTIFICACION_', $datos['TED']['DD']['CAF']['DA']['IDK'] == 100);
     // crear objeto firma
     $Firma = new \sasco\LibreDTE\FirmaElectronica();
     // obtener token
     $token = \sasco\LibreDTE\Sii\Autenticacion::getToken($Firma);
     if (!$token) {
         return $this->Api->send(\sasco\LibreDTE\Log::readAll(), 500);
     }
     // verificar estado del DTE con el SII
     list($RutConsultante, $DvConsultante) = explode('-', $Firma->getID());
     list($RutCompania, $DvCompania) = explode('-', $datos['TED']['DD']['RE']);
     list($RutReceptor, $DvReceptor) = explode('-', $datos['TED']['DD']['RR']);
     list($a, $m, $d) = explode('-', $datos['TED']['DD']['FE']);
     $xml = \sasco\LibreDTE\Sii::request('QueryEstDte', 'getEstDte', ['RutConsultante' => $RutConsultante, 'DvConsultante' => $DvConsultante, 'RutCompania' => $RutCompania, 'DvCompania' => $DvCompania, 'RutReceptor' => $RutReceptor, 'DvReceptor' => $DvReceptor, 'TipoDte' => $datos['TED']['DD']['TD'], 'FolioDte' => $datos['TED']['DD']['F'], 'FechaEmisionDte' => $d . $m . $a, 'MontoDte' => $datos['TED']['DD']['MNT'], 'token' => $token]);
     if ($xml === false) {
         return $this->Api->send(\sasco\LibreDTE\Log::readAll(), 500);
     }
     return (array) $xml->xpath('/SII:RESPUESTA/SII:RESP_HDR')[0];
 }
Exemplo n.º 12
0
 /**
  * Método que obtiene el estado del DTE
  * @param Firma objeto que representa la Firma Electrónca
  * @return Arreglo con el estado del DTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-27
  */
 public function getEstado(\sasco\LibreDTE\FirmaElectronica $Firma)
 {
     // solicitar token
     $token = \sasco\LibreDTE\Sii\Autenticacion::getToken($Firma);
     if (!$token) {
         return false;
     }
     // consultar estado dte
     list($RutConsultante, $DvConsultante) = explode('-', $Firma->getID());
     list($RutCompania, $DvCompania) = explode('-', $this->getEmisor());
     list($RutReceptor, $DvReceptor) = explode('-', $this->getReceptor());
     list($Y, $m, $d) = explode('-', $this->getFechaEmision());
     $xml = \sasco\LibreDTE\Sii::request('QueryEstDte', 'getEstDte', ['RutConsultante' => $RutConsultante, 'DvConsultante' => $DvConsultante, 'RutCompania' => $RutCompania, 'DvCompania' => $DvCompania, 'RutReceptor' => $RutReceptor, 'DvReceptor' => $DvReceptor, 'TipoDte' => $this->getTipo(), 'FolioDte' => $this->getFolio(), 'FechaEmisionDte' => $d . $m . $Y, 'MontoDte' => $this->getMontoTotal(), 'token' => $token]);
     // si el estado se pudo recuperar se muestra
     if ($xml === false) {
         return false;
     }
     // entregar estado
     return (array) $xml->xpath('/SII:RESPUESTA/SII:RESP_HDR')[0];
 }
Exemplo n.º 13
0
 * @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';
// primer folio a usar para envío de documentos de simulación
$folios = [33 => 47, 34 => 39, 56 => 23, 61 => 45];
// caratula para el envío de los dte
$caratula = ['RutEnvia' => '11222333-4', 'RutReceptor' => '60803000-K', 'FchResol' => '2014-12-05', 'NroResol' => 0];
// datos del emisor
$Emisor = ['RUTEmisor' => '76192083-9', 'RznSoc' => 'SASCO SpA', 'GiroEmis' => 'Servicios integrales de informática', 'Acteco' => 726000, 'DirOrigen' => 'Santiago', 'CmnaOrigen' => 'Santiago'];
// datos del receptor
$Receptor = ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'];
// datos de los DTE (cada elemento del arreglo $documentos es un DTE)
$documentos = [['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33]], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Antena ranurada 16 dBi', 'QtyItem' => 1, 'PrcItem' => 70000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 1], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Punto de acceso WAP54G', 'QtyItem' => 1, 'PrcItem' => 35000], ['NmbItem' => 'Pigtail LMR-195', 'QtyItem' => 1, 'PrcItem' => 10000], ['NmbItem' => 'Antena omnidireccional 14 dBi', 'QtyItem' => 1, 'PrcItem' => 25000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 2], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M5', 'QtyItem' => 2, 'PrcItem' => 35000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 3], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 2, 'PrcItem' => 35000, 'DescuentoPct' => 10]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 4], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 2, 'PrcItem' => 35000]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 6]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 5], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 2, 'PrcItem' => 35000]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '$', 'ValorDR' => 5000]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 6], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 10, 'PrcItem' => 35000, 'DescuentoPct' => 10]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '$', 'ValorDR' => 5000]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 7], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 10, 'PrcItem' => 35000, 'DescuentoPct' => 10]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 7]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 8], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Punto de acceso WAP54G', 'QtyItem' => 1, 'PrcItem' => 35000], ['NmbItem' => 'Pigtail LMR-195', 'QtyItem' => 1, 'PrcItem' => 10000], ['NmbItem' => 'Antena omnidireccional 14 dBi', 'QtyItem' => 1, 'PrcItem' => 25000]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 6]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 9], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Punto de acceso WAP54G', 'QtyItem' => 1, 'PrcItem' => 35000], ['NmbItem' => 'Pigtail LMR-195', 'QtyItem' => 1, 'PrcItem' => 10000, 'DescuentoPct' => 50], ['NmbItem' => 'Antena omnidireccional 14 dBi', 'QtyItem' => 1, 'PrcItem' => 25000]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 6]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61]], 'Emisor' => $Emisor, 'Receptor' => $Receptor, 'Totales' => ['MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Antena ranurada 16 dBi']], 'Referencia' => ['TpoDocRef' => 33, 'FolioRef' => $folios[33], 'CodRef' => 2, 'RazonRef' => 'Corrige dirección del receptor']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 1], 'Emisor' => $Emisor, 'Receptor' => $Receptor, 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 2, 'PrcItem' => 35000, 'DescuentoPct' => 10]], 'Referencia' => ['TpoDocRef' => 33, 'FolioRef' => $folios[33] + 3, 'CodRef' => 1, 'RazonRef' => 'Anula factura']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 2], 'Emisor' => $Emisor, 'Receptor' => $Receptor, 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M5', 'QtyItem' => 1, 'PrcItem' => 35000]], 'Referencia' => ['TpoDocRef' => 33, 'FolioRef' => $folios[33] + 2, 'CodRef' => 3, 'RazonRef' => 'Devolución mercadería']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 56, 'Folio' => $folios[56]], 'Emisor' => $Emisor, 'Receptor' => $Receptor, 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'Ubiquiti Loco M2', 'QtyItem' => 1, 'PrcItem' => 35000]], 'Referencia' => ['TpoDocRef' => 61, 'FolioRef' => $folios[61] + 2, 'CodRef' => 1, 'RazonRef' => 'Anula nota de crédito electrónica']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 33, 'Folio' => $folios[33] + 10], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Punto de acceso WAP54G', 'QtyItem' => 1, 'PrcItem' => 35000], ['IndExe' => 1, 'NmbItem' => 'Asesoría en instalación de AP', 'QtyItem' => 1, 'PrcItem' => 15000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34]], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Desarrollo y mantención webapp agosto', 'QtyItem' => 1, 'PrcItem' => 950000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 1], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Desarrollo y mantención webapp agosto', 'QtyItem' => 1, 'PrcItem' => 950000], ['NmbItem' => 'Configuración en terreno de servidor web', 'QtyItem' => 1, 'PrcItem' => 80000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 2], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Capacitación aplicación web', 'QtyItem' => 8, 'UnmdItem' => 'Hora', 'PrcItem' => 25000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 3], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Desarrollo nueva funcionalidad', 'QtyItem' => 16, 'UnmdItem' => 'Hora', 'PrcItem' => 14000], ['NmbItem' => 'Capacitación nueva funcionalidad', 'QtyItem' => 2, 'UnmdItem' => 'Hora', 'PrcItem' => 25000]]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 4], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Certificación facturación electrónica', 'QtyItem' => 1, 'PrcItem' => 599000]], 'DscRcgGlobal' => ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => 50]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 5], 'Emisor' => $Emisor, 'Receptor' => $Receptor], 'Detalle' => [['NmbItem' => 'Desarrolo interfaces para API LibreDTE', 'QtyItem' => 40, 'UnmdItem' => 'Hora', 'PrcItem' => 14000], ['NmbItem' => 'Capacitación API facturación electrónica', 'QtyItem' => 4, 'UnmdItem' => 'Hora', 'PrcItem' => 25000], ['NmbItem' => 'Certificación facturación electrónica', 'QtyItem' => 1, 'PrcItem' => 599000, 'DescuentoPct' => 50]]]];
// Objetos de Firma, Folios y EnvioDTE
$Firma = new \sasco\LibreDTE\FirmaElectronica($config['firma']);
$Folios = [];
foreach ($folios as $tipo => $cantidad) {
    $Folios[$tipo] = new \sasco\LibreDTE\Sii\Folios(file_get_contents('xml/folios/' . $tipo . '.xml'));
}
$EnvioDTE = new \sasco\LibreDTE\Sii\EnvioDTE();
// generar cada DTE, timbrar, firmar y agregar al sobre de EnvioDTE
foreach ($documentos as $documento) {
    $DTE = new \sasco\LibreDTE\Sii\Dte($documento);
    if (!$DTE->timbrar($Folios[$DTE->getTipo()])) {
        break;
    }
    if (!$DTE->firmar($Firma)) {
        break;
Exemplo n.º 14
0
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// datos del envío
$xml = file_get_contents('dte_33.xml');
$RutEnvia = '99888777-6';
$RutEmisor = '55444333-2';
// solicitar token
$token = \sasco\LibreDTE\Sii\Autenticacion::getToken($config['firma']);
if (!$token) {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
// enviar DTE
$result = \sasco\LibreDTE\Sii::enviar($RutEnvia, $RutEmisor, $xml, $token);
// si hubo algún error al enviar al servidor mostrar
if ($result === false) {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
// Mostrar resultado del envío
if ($result->STATUS != '0') {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
echo 'DTE envíado. Track ID ' . $result->TRACKID, "\n";
Exemplo n.º 15
0
 /**
  * Método que procesa el arreglo con los datos del set de pruebas y crea el
  * arreglo json con los documentos listos para ser pasados a la clase Dte
  * @param archivo Contenido del archivo del set de set de pruebas
  * @param separador usado en el archivo para los casos (son los "=" debajo del título del caso)
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-10-02
  */
 public static function getJSON($archivo, array $folios = [], $separador = '==============')
 {
     $documentos = [];
     $casos = self::parse($archivo, $separador);
     $referencias = [];
     foreach ($casos as $caso) {
         // determinar tipo documento y folio
         $TipoDTE = self::$tipos[$caso['documento']];
         if (!isset($folios[$TipoDTE])) {
             $folios[$TipoDTE] = 1;
         }
         $Folio = $folios[$TipoDTE];
         // crear encabezado del documento
         $documento = ['Encabezado' => ['IdDoc' => ['TipoDTE' => $TipoDTE, 'Folio' => $Folio]]];
         // si es guía de despacho se agrega indicador de traslado
         if ($TipoDTE == 52) {
             if (isset($caso['traslado_por'])) {
                 $documento['Encabezado']['IdDoc']['TipoDespacho'] = self::$TipoDespachos[$caso['traslado_por']];
             }
             if (isset($caso['motivo'])) {
                 $documento['Encabezado']['IdDoc']['IndTraslado'] = self::$IndTraslados[$caso['motivo']];
             }
         }
         // agregar detalle del documento si fue pasado explícitamente
         if (isset($caso['detalle'])) {
             $documento['Detalle'] = [];
             foreach ($caso['detalle'] as $item) {
                 // generar detalle del item
                 $detalle = [];
                 foreach ($item as $col => $val) {
                     $col = self::$item_cols[$col];
                     // procesar cada valor de acuerdo al nombre de la columna
                     if ($col == 'DescuentoPct') {
                         $detalle[$col] = substr($val, 0, -1);
                     } else {
                         $detalle[$col] = utf8_encode($val);
                     }
                     // se convierte de ISO-8859-1 a UTF-8
                 }
                 // si el item es EXENTO se agrega campo que lo indica
                 if (strpos($detalle['NmbItem'], 'EXENTO')) {
                     $detalle['IndExe'] = 1;
                 }
                 // si hay una referencia se completa con los campos del
                 // detalle de la referencia que no estén en este detalle
                 if (!empty($caso['referencia'])) {
                     // buscar el caso y copiar sus columnas que no estén
                     $detalle_r = $documentos[$caso['referencia']['caso']]['Detalle'];
                     $n_detalle_r = count($detalle_r);
                     for ($i = 0; $i < $n_detalle_r; $i++) {
                         if ($detalle_r[$i]['NmbItem'] == $detalle['NmbItem']) {
                             foreach ($detalle_r[$i] as $attr => $val) {
                                 if (!isset($detalle[$attr])) {
                                     $detalle[$attr] = $val;
                                 }
                             }
                         }
                     }
                     // si la referencia es a una factura exenta y existe un
                     // precio entonces se marca como exento el item
                     if ($documentos[$caso['referencia']['caso']]['Encabezado']['IdDoc']['TipoDTE'] == 34 and isset($detalle['PrcItem'])) {
                         $detalle['IndExe'] = 1;
                     }
                 }
                 // agregar detalle del item a los detalles
                 $documento['Detalle'][] = $detalle;
             }
         } else {
             if (!empty($caso['referencia'])) {
                 $referencia = self::getReferencia($caso['referencia']['razon']);
                 // copiar todos los detalles
                 if ($referencia['detalle'] == 1) {
                     $documento['Detalle'] = $documentos[$caso['referencia']['caso']]['Detalle'];
                 } else {
                     if ($referencia['detalle'] == 2) {
                         $documento['Detalle'] = [['NmbItem' => $documentos[$caso['referencia']['caso']]['Detalle'][0]['NmbItem']]];
                     }
                 }
             }
         }
         // agregar descuento del documento
         if (!empty($caso['descuento'])) {
             $documento['DscRcgGlobal'] = ['TpoMov' => 'D', 'TpoValor' => '%', 'ValorDR' => substr($caso['descuento'], 0, -1)];
         } else {
             if (!empty($caso['referencia']) and isset($documentos[$caso['referencia']['caso']]['DscRcgGlobal'])) {
                 $documento['DscRcgGlobal'] = $documentos[$caso['referencia']['caso']]['DscRcgGlobal'];
             }
         }
         // agregar referencia obligatoria
         $documento['Referencia'] = [];
         $documento['Referencia'][] = ['TpoDocRef' => 'SET', 'FolioRef' => $folios[$TipoDTE], 'RazonRef' => 'CASO ' . $caso['caso']];
         // agregar referencias del caso
         if (!empty($caso['referencia'])) {
             $referencia = self::getReferencia($caso['referencia']['razon']);
             // agregar referencia
             $documento['Referencia'][] = ['TpoDocRef' => $documentos[$caso['referencia']['caso']]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $documentos[$caso['referencia']['caso']]['Encabezado']['IdDoc']['Folio'], 'CodRef' => $referencia['codigo'], 'RazonRef' => $caso['referencia']['razon']];
             // agregar totales
             $documento['Encabezado']['Totales'] = $referencia['Totales'];
             // agregar tasa de IVA si corresponde
             if (isset($documento['Encabezado']['Totales']['TasaIVA'])) {
                 $documento['Encabezado']['Totales']['TasaIVA'] = \sasco\LibreDTE\Sii::getIVA();
             }
             // si el documento referenciado es factura exenta y hay MntExe
             if (isset($documento['Encabezado']['Totales']['MntExe'])) {
                 if ($documentos[$caso['referencia']['caso']]['Encabezado']['IdDoc']['TipoDTE'] == 34) {
                     $documento['Encabezado']['Totales']['MntExe'] = 0;
                 } else {
                     unset($documento['Encabezado']['Totales']['MntExe']);
                 }
             }
         }
         // si hay Totales pero no hay valores en los detalles entonces se cambia a sólo Totales de MntTotal = 0
         if (isset($documento['Encabezado']['Totales'])) {
             $hayValor = false;
             foreach ($documento['Detalle'] as $d) {
                 if (!empty($d['PrcItem'])) {
                     $hayValor = true;
                 }
             }
             if (!$hayValor) {
                 if (isset($documento['Encabezado']['Totales']['MntExe'])) {
                     $documento['Encabezado']['Totales'] = ['MntExe' => 0];
                 } else {
                     $documento['Encabezado']['Totales'] = [];
                 }
                 $documento['Encabezado']['Totales']['MntTotal'] = 0;
             }
         }
         // agregar documento a los documentos
         $documentos[$caso['caso']] = $documento;
         // pasar al siguiente folio de este tipo;
         $folios[$TipoDTE]++;
     }
     // pasar de índice "número de caso" a índice numérico, o sea
     // pasar de diccionario o hash a arreglo antes convertir a JSON
     $aux = $documentos;
     $documentos = [];
     foreach ($aux as $d) {
         $documentos[] = $d;
     }
     // retornar documentos
     return json_encode($documentos, JSON_PRETTY_PRINT);
 }
Exemplo n.º 16
0
 /**
  * Método que consulta al estado al SII del dte recibido
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-28
  */
 public function getEstado(\sasco\LibreDTE\FirmaElectronica $Firma)
 {
     // obtener token
     $token = \sasco\LibreDTE\Sii\Autenticacion::getToken($Firma);
     if (!$token) {
         return false;
     }
     // consultar estado
     list($RutConsultante, $DvConsultante) = explode('-', $Firma->getID());
     list($Y, $m, $d) = explode('-', $this->fecha);
     $xml = \sasco\LibreDTE\Sii::request('QueryEstDte', 'getEstDte', ['RutConsultante' => $RutConsultante, 'DvConsultante' => $DvConsultante, 'RutCompania' => $this->getEmisor()->rut, 'DvCompania' => $this->getEmisor()->dv, 'RutReceptor' => $this->getReceptor()->rut, 'DvReceptor' => $this->getReceptor()->dv, 'TipoDte' => $this->dte, 'FolioDte' => $this->folio, 'FechaEmisionDte' => $d . $m . $Y, 'MontoDte' => $this->total, 'token' => $token]);
     // si hubo error con el estado se muestra que no se pudo obtener
     if ($xml === false) {
         return false;
     }
     $estado = (array) $xml->xpath('/SII:RESPUESTA/SII:RESP_HDR')[0];
     return $estado['ESTADO'] == 'DOK' ? true : $estado['GLOSA_ERR'];
 }
Exemplo n.º 17
0
 /**
  * Método que realiza el envío del sobre con el o los DTEs al SII
  * @return Track ID del envío o =false si hubo algún problema al enviar el documento
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-17
  */
 public function enviar()
 {
     // generar XML que se enviará
     if (!$this->xml_data) {
         $this->xml_data = $this->generar();
     }
     if (!$this->xml_data) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::ENVIODTE_FALTA_XML, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::ENVIODTE_FALTA_XML));
         return false;
     }
     // validar schema del documento antes de enviar
     if (!$this->schemaValidate()) {
         return false;
     }
     // solicitar token
     $token = Autenticacion::getToken($this->Firma);
     if (!$token) {
         return false;
     }
     // enviar DTE
     $result = \sasco\LibreDTE\Sii::enviar($this->caratula['RutEnvia'], $this->caratula['RutEmisor'], $this->xml_data, $token);
     if ($result === false) {
         return false;
     }
     if (!is_numeric((string) $result->TRACKID)) {
         return false;
     }
     return (int) (string) $result->TRACKID;
 }
Exemplo n.º 18
0
 /**
  * Método que realiza el envío del libro IECV al SII
  * @return Track ID del envío o =false si hubo algún problema al enviar el documento
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-17
  */
 public function enviar()
 {
     // generar XML que se enviará
     if (!$this->xml_data) {
         $this->xml_data = $this->generar();
     }
     if (!$this->xml_data) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::LIBROCOMPRAVENTA_ERROR_GENERAR_XML, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::LIBROCOMPRAVENTA_ERROR_GENERAR_XML));
         return false;
     }
     // validar schema del documento antes de enviar (sólo en producción, ya
     // que en certificación el libro no se firma y daría error de schema)
     if (\sasco\LibreDTE\Sii::getAmbiente() == \sasco\LibreDTE\Sii::PRODUCCION and !$this->schemaValidate()) {
         return false;
     }
     // solicitar token
     $token = Autenticacion::getToken($this->Firma);
     if (!$token) {
         return false;
     }
     // enviar DTE
     $result = \sasco\LibreDTE\Sii::enviar($this->caratula['RutEnvia'], $this->caratula['RutEmisorLibro'], $this->xml_data, $token);
     if ($result === false) {
         return false;
     }
     if (!is_numeric((string) $result->TRACKID)) {
         return false;
     }
     return (int) (string) $result->TRACKID;
 }
Exemplo n.º 19
0
 /**
  * Método que realiza el envío del libro IECV al SII
  * @return Track ID del envío o =false si hubo algún problema al enviar el documento
  * @warning No se está validano schema
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-10-30
  */
 public function enviar()
 {
     // generar XML que se enviará
     if (!$this->xml_data) {
         $this->xml_data = $this->generar();
     }
     if (!$this->xml_data) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::LIBROCOMPRAVENTA_ERROR_GENERAR_XML, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::LIBROCOMPRAVENTA_ERROR_GENERAR_XML));
         return false;
     }
     // validar schema del documento antes de enviar
     // WARNING: tanto en certificación como en producción si el libro se
     // firma da error al subirlo, pero si va sin firma da error de schema,
     // por esta razón no se valida el schema, para que pueda ser enviado al
     // sii sin firmar ¿?
     /*if (\sasco\LibreDTE\Sii::getAmbiente()==\sasco\LibreDTE\Sii::PRODUCCION and !$this->schemaValidate())
       return false;*/
     // solicitar token
     $token = Autenticacion::getToken($this->Firma);
     if (!$token) {
         return false;
     }
     // enviar DTE
     $result = \sasco\LibreDTE\Sii::enviar($this->caratula['RutEnvia'], $this->caratula['RutEmisorLibro'], $this->xml_data, $token);
     if ($result === false) {
         return false;
     }
     if (!is_numeric((string) $result->TRACKID)) {
         return false;
     }
     return (int) (string) $result->TRACKID;
 }
Exemplo n.º 20
0
        break;
    }
    $EnvioDTE->agregar($DTE);
}
$EnvioDTE->setFirma($Firma);
$EnvioDTE->setCaratula($caratula);
$EnvioDTE->generar();
if ($EnvioDTE->schemaValidate()) {
    if (is_writable('xml/EnvioBOLETA.xml')) {
        file_put_contents('xml/EnvioBOLETA.xml', $EnvioDTE->generar());
    }
    // guardar XML en sistema de archivos
    echo $EnvioDTE->generar();
}
// crear notas de crédito para el set de prueba
$notas_credito = [\sasco\LibreDTE\Arreglo::mergeRecursiveDistinct($set_pruebas[0], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61], 'MntBruto' => 1], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Referencia' => ['TpoDocRef' => $set_pruebas[0]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $set_pruebas[0]['Encabezado']['IdDoc']['Folio'], 'CodRef' => 1, 'RazonRef' => 'ANULA BOLETA']]), \sasco\LibreDTE\Arreglo::mergeRecursiveDistinct($set_pruebas[2], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 1, 'MntBruto' => 1], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Referencia' => ['TpoDocRef' => $set_pruebas[2]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $set_pruebas[2]['Encabezado']['IdDoc']['Folio'], 'CodRef' => 1, 'RazonRef' => 'ANULA BOLETA']]), \sasco\LibreDTE\Arreglo::mergeRecursiveDistinct($set_pruebas[4], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 2, 'MntBruto' => 1], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Referencia' => ['TpoDocRef' => $set_pruebas[4]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $set_pruebas[4]['Encabezado']['IdDoc']['Folio'], 'CodRef' => 1, 'RazonRef' => 'ANULA BOLETA']]), \sasco\LibreDTE\Arreglo::mergeRecursiveDistinct($set_pruebas[6], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 3, 'MntBruto' => 1], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['QtyItem' => $set_pruebas[6]['Detalle'][0]['QtyItem'] * 0.4]], 'Referencia' => ['TpoDocRef' => $set_pruebas[6]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $set_pruebas[6]['Encabezado']['IdDoc']['Folio'], 'CodRef' => 3, 'RazonRef' => 'SE REBAJA EN UN 40%']]), \sasco\LibreDTE\Arreglo::mergeRecursiveDistinct($set_pruebas[9], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 4, 'MntBruto' => 1], 'Totales' => ['MntNeto' => 0, 'TasaIVA' => \sasco\LibreDTE\Sii::getIVA(), 'IVA' => 0, 'MntTotal' => 0]], 'Detalle' => [['QtyItem' => $set_pruebas[9]['Detalle'][0]['QtyItem'] * 0.4]], 'Referencia' => ['TpoDocRef' => $set_pruebas[9]['Encabezado']['IdDoc']['TipoDTE'], 'FolioRef' => $set_pruebas[9]['Encabezado']['IdDoc']['Folio'], 'CodRef' => 3, 'RazonRef' => 'SE REBAJA EN UN 40%']])];
// generar cada DTE, timbrar, firmar y agregar al sobre de EnvioDTE
$EnvioDTE = new \sasco\LibreDTE\Sii\EnvioDte();
foreach ($notas_credito as $documento) {
    $DTE = new \sasco\LibreDTE\Sii\Dte($documento);
    if (!$DTE->timbrar($Folios[$DTE->getTipo()])) {
        break;
    }
    if (!$DTE->firmar($Firma)) {
        break;
    }
    $EnvioDTE->agregar($DTE);
}
$EnvioDTE->setFirma($Firma);
$EnvioDTE->setCaratula($caratula);
$EnvioDTE->generar();
Exemplo n.º 21
0
 /**
  * Método para obtener el token de la sesión a través de una semilla
  * previamente firmada
  *
  * WSDL producción: https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
  * WSDL certificación: https://maullin.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL
  *
  * @param Firma objeto de la Firma electrónica o arreglo con configuración de la misma
  * @return Token para autenticación en SII o =false si no se pudo obtener
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-17
  */
 public static function getToken($Firma = [])
 {
     $semilla = self::getSeed();
     if (!$semilla) {
         return false;
     }
     $requestFirmado = self::getTokenRequest($semilla, $Firma);
     if (!$requestFirmado) {
         return false;
     }
     $xml = \sasco\LibreDTE\Sii::request('GetTokenFromSeed', 'getToken', $requestFirmado);
     if ($xml === false or (string) $xml->xpath('/SII:RESPUESTA/SII:RESP_HDR/ESTADO')[0] !== '00') {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::AUTH_ERROR_TOKEN, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::AUTH_ERROR_TOKEN));
         return false;
     }
     return (string) $xml->xpath('/SII:RESPUESTA/SII:RESP_BODY/TOKEN')[0];
 }
Exemplo n.º 22
0
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */
/**
 * @file 003-estadoDte.php
 * Ejemplo de consulta del estado de un DTE
 * Referencia: http://www.sii.cl/factura_electronica/factura_mercado/estado_dte.pdf
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-16
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// solicitar token
$token = \sasco\LibreDTE\Sii\Autenticacion::getToken($config['firma']);
if (!$token) {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
// consultar estado dte
$xml = \sasco\LibreDTE\Sii::request('QueryEstDte', 'getEstDte', ['RutConsultante' => '', 'DvConsultante' => '', 'RutCompania' => '', 'DvCompania' => '', 'RutReceptor' => '', 'DvReceptor' => '', 'TipoDte' => '', 'FolioDte' => '', 'FechaEmisionDte' => '', 'MontoDte' => '', 'token' => $token]);
// si el estado se pudo recuperar se muestra
if ($xml !== false) {
    print_r((array) $xml->xpath('/SII:RESPUESTA/SII:RESP_HDR')[0]);
}
// si hubo errores se muestran
foreach (\sasco\LibreDTE\Log::readAll() as $error) {
    echo $error, "\n";
}
Exemplo n.º 23
0
// EnvioDTE::enviar() que envía el XML que se genera, ver ejemplo 010-set_pruebas.php
$EnvioDTE = new \sasco\LibreDTE\Sii\EnvioDTE();
$EnvioDTE->agregar($DTE);
$EnvioDTE->setCaratula($caratula);
$EnvioDTE->setFirma($Firma);
$xml = $EnvioDTE->generar();
// solicitar token
$token = \sasco\LibreDTE\Sii\Autenticacion::getToken($Firma);
if (!$token) {
    foreach (\sasco\LibreDTE\Log::readAll() as $log) {
        echo $log, "\n";
    }
    exit;
}
// enviar DTE
$result = \sasco\LibreDTE\Sii::enviar($caratula['RutEnvia'], $factura['Encabezado']['Emisor']['RUTEmisor'], $xml, $token);
// si hubo algún error al enviar al servidor mostrar
if ($result === false) {
    foreach (\sasco\LibreDTE\Log::readAll() as $log) {
        echo $log, "\n";
    }
    exit;
}
// Mostrar resultado del envío
if ($result->STATUS != '0') {
    foreach (\sasco\LibreDTE\Log::readAll() as $log) {
        echo $log, "\n";
    }
    exit;
}
echo 'DTE enviado. Track ID ' . $result->TRACKID, "\n";
Exemplo n.º 24
0
 /**
  * Acción que solicita se envíe una nueva revisión del DTE al email
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-25
  */
 public function solicitar_revision($dte, $folio)
 {
     $Emisor = $this->getContribuyente();
     // obtener DTE emitido
     $DteEmitido = new Model_DteEmitido($Emisor->rut, $dte, $folio, (int) $Emisor->certificacion);
     if (!$DteEmitido->exists()) {
         \sowerphp\core\Model_Datasource_Session::message('No existe el DTE solicitado', 'error');
         $this->redirect('/dte/dte_emitidos/listar');
     }
     // si no tiene track id error
     if (!$DteEmitido->track_id) {
         \sowerphp\core\Model_Datasource_Session::message('DTE no tiene Track ID, primero debe enviarlo al SII', 'error');
         $this->redirect(str_replace('solicitar_revision', 'ver', $this->request->request));
     }
     // obtener firma
     $Firma = $Emisor->getFirma($this->Auth->User->id);
     if (!$Firma) {
         \sowerphp\core\Model_Datasource_Session::message('No hay firma electrónica asociada a la empresa (o bien no se pudo cargar), debe agregar su firma antes de generar DTE', 'error');
         $this->redirect('/dte/admin/firma_electronicas');
     }
     // obtener token
     $token = \sasco\LibreDTE\Sii\Autenticacion::getToken($Firma);
     if (!$token) {
         \sowerphp\core\Model_Datasource_Session::message('No fue posible obtener el token para el SII<br/>' . implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error');
         $this->redirect(str_replace('solicitar_revision', 'ver', $this->request->request));
     }
     // solicitar envío de nueva revisión
     $estado = \sasco\LibreDTE\Sii::request('wsDTECorreo', 'reenvioCorreo', [$token, $Emisor->rut, $Emisor->dv, $DteEmitido->track_id]);
     if ($estado === false) {
         \sowerphp\core\Model_Datasource_Session::message('No fue posible solicitar una nueva revisión del DTE.<br/>' . implode('<br/>', \sasco\LibreDTE\Log::readAll()), 'error');
     } else {
         if ((int) $estado->xpath('/SII:RESPUESTA/SII:RESP_HDR/SII:ESTADO')[0]) {
             \sowerphp\core\Model_Datasource_Session::message('No fue posible solicitar una nueva revisión del DTE: ' . $estado->xpath('/SII:RESPUESTA/SII:RESP_HDR/SII:GLOSA')[0], 'error');
         } else {
             \sowerphp\core\Model_Datasource_Session::message('Se solicitó nueva revisión del DTE, verificar estado en unos segundos', 'ok');
         }
     }
     // redireccionar
     $this->redirect(str_replace('solicitar_revision', 'ver', $this->request->request));
 }
 */
/**
 * @file 005-estado_envio_dte.php
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-09-16
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca y configuraciones
include 'inc.php';
// solicitar token
$token = \sasco\LibreDTE\Sii\Autenticacion::getToken($config['firma']);
if (!$token) {
    foreach (\sasco\LibreDTE\Log::readAll() as $error) {
        echo $error, "\n";
    }
    exit;
}
// consultar estado enviado
$rut = '';
$dv = '';
$trackID = '';
$estado = \sasco\LibreDTE\Sii::request('QueryEstUp', 'getEstUp', [$rut, $dv, $trackID, $token]);
// si el estado se pudo recuperar se muestra estado y glosa
if ($estado !== false) {
    print_r(['codigo' => (string) $estado->xpath('/SII:RESPUESTA/SII:RESP_HDR/ESTADO')[0], 'glosa' => (string) $estado->xpath('/SII:RESPUESTA/SII:RESP_HDR/GLOSA')[0]]);
}
// mostrar error si hubo
foreach (\sasco\LibreDTE\Log::readAll() as $error) {
    echo $error, "\n";
}
Exemplo n.º 26
0
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */
/**
 * @file 001-wsdl.php
 * Ejemplo de obtención de WSDL según ambiente que se esté utilizando
 * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
 * @version 2015-08-31
 */
// respuesta en texto plano
header('Content-type: text/plain');
// incluir archivos php de la biblioteca
include 'inc.php';
// si esta definido el ambiente en config.php avisar
if (defined('_LibreDTE_CERTIFICACION_')) {
    die('Comentar _LibreDTE_CERTIFICACION_ en config.php para probar este ejemplo');
}
// solicitar ambiente producción
echo \sasco\LibreDTE\Sii::wsdl('CrSeed'), "\n";
// solicitar ambiente desarrollo con parámetro
echo \sasco\LibreDTE\Sii::wsdl('CrSeed', \sasco\LibreDTE\Sii::CERTIFICACION), "\n";
// solicitar ambiente desarrollo con constante
define('_LibreDTE_CERTIFICACION_', true);
echo \sasco\LibreDTE\Sii::wsdl('CrSeed'), "\n";
echo \sasco\LibreDTE\Sii::wsdl('GetTokenFromSeed'), "\n";
// a pesar de estar en ambiente de desarrollo (por la constante antes definida)
// se puede forzar producción usando el segundo parámetro. Al estar definido el
// segundo parámetro no se considerará la existencia ni valor de la constante
// _LibreDTE_CERTIFICACION_
echo \sasco\LibreDTE\Sii::wsdl('CrSeed', \sasco\LibreDTE\Sii::PRODUCCION), "\n";
echo \sasco\LibreDTE\Sii::wsdl('GetTokenFromSeed', \sasco\LibreDTE\Sii::PRODUCCION), "\n";