// 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();
// enviar XML generado en línea anterior
var_dump($track_id);
// si hubo errores mostrar
foreach (\sasco\LibreDTE\Log::readAll() as $error) {
    echo $error, "\n";
}
Ejemplo n.º 2
0
 /**
  * Acción para generar y mostrar previsualización de emisión de DTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl)
  * @version 2016-01-02
  */
 public function previsualizacion()
 {
     $Emisor = $this->getContribuyente();
     // si no se viene por POST redirigir
     if (!isset($_POST['submit'])) {
         \sowerphp\core\Model_Datasource_Session::message('No puede acceder de forma directa a la previsualización', 'error');
         $this->redirect('/dte/documentos/emitir');
     }
     // si no está autorizado a emitir el tipo de documento redirigir
     if (!$Emisor->documentoAutorizado($_POST['TpoDoc'])) {
         \sowerphp\core\Model_Datasource_Session::message('No está autorizado a emitir el tipo de documento ' . $_POST['TpoDoc'], 'error');
         $this->redirect('/dte/documentos/emitir');
     }
     // revisar datos mínimos
     $datos_minimos = ['TpoDoc', 'FchEmis', 'GiroEmis', 'Acteco', 'DirOrigen', 'CmnaOrigen', 'RUTRecep', 'RznSocRecep', 'GiroRecep', 'DirRecep', 'CmnaRecep', 'NmbItem'];
     foreach ($datos_minimos as $attr) {
         if (empty($_POST[$attr])) {
             \sowerphp\core\Model_Datasource_Session::message('Error al recibir campos mínimos, falta: ' . $attr);
             $this->redirect('/dte/documentos/emitir');
         }
     }
     // copiar datos del emisor
     $Emisor->giro = $_POST['GiroEmis'];
     $Emisor->actividad_economica = $_POST['Acteco'];
     $Emisor->direccion = $_POST['DirOrigen'];
     $Emisor->comuna = $_POST['CmnaOrigen'];
     // crear receptor
     list($rut, $dv) = explode('-', str_replace('.', '', $_POST['RUTRecep']));
     $Receptor = new Model_Contribuyente($rut);
     $Receptor->dv = $dv;
     $Receptor->razon_social = $_POST['RznSocRecep'];
     $Receptor->giro = substr($_POST['GiroRecep'], 0, 40);
     $Receptor->telefono = $_POST['Contacto'];
     $Receptor->email = $_POST['CorreoRecep'];
     $Receptor->direccion = $_POST['DirRecep'];
     $Receptor->comuna = $_POST['CmnaRecep'];
     // guardar receptor si no tiene usuario asociado
     if (!$Receptor->usuario) {
         $Receptor->modificado = date('Y-m-d H:i:s');
         try {
             $Receptor->save();
         } catch (\sowerphp\core\Exception_Model_Datasource_Database $e) {
             \sowerphp\core\Model_Datasource_Session::message('No fue posible guardar el receptor: ' . $e->getMessage());
             $this->redirect('/dte/documentos/emitir');
         }
     }
     // generar datos del encabezado para el dte
     $dte = ['Encabezado' => ['IdDoc' => ['TipoDTE' => $_POST['TpoDoc'], 'Folio' => 0, 'FchEmis' => $_POST['FchEmis']], 'Emisor' => ['RUTEmisor' => $Emisor->rut . '-' . $Emisor->dv, 'RznSoc' => $Emisor->razon_social, 'GiroEmis' => $Emisor->giro, 'Telefono' => $Emisor->telefono ? $Emisor->telefono : false, 'CorreoEmisor' => $Emisor->email ? $Emisor->email : false, 'Acteco' => $Emisor->actividad_economica, 'CdgSIISucur' => $Emisor->sucursal_sii ? $Emisor->sucursal_sii : false, 'DirOrigen' => $Emisor->direccion, 'CmnaOrigen' => $Emisor->getComuna()->comuna], 'Receptor' => ['RUTRecep' => $Receptor->rut . '-' . $Receptor->dv, 'RznSocRecep' => $Receptor->razon_social, 'GiroRecep' => $Receptor->giro, 'Contacto' => $Receptor->telefono ? $Receptor->telefono : false, 'CorreoRecep' => $Receptor->email ? $Receptor->email : false, 'DirRecep' => $Receptor->direccion, 'CmnaRecep' => $Receptor->getComuna()->comuna]]];
     // agregar datos de traslado si es guía de despacho
     if ($dte['Encabezado']['IdDoc']['TipoDTE'] == 52) {
         $dte['Encabezado']['IdDoc']['IndTraslado'] = $_POST['IndTraslado'];
         if (!empty($_POST['Patente']) or !empty($_POST['RUTTrans']) or !empty($_POST['RUTChofer']) and !empty($_POST['NombreChofer']) or !empty($_POST['DirDest']) or !empty($_POST['CmnaDest'])) {
             $dte['Encabezado']['Transporte'] = ['Patente' => !empty($_POST['Patente']) ? $_POST['Patente'] : false, 'RUTTrans' => !empty($_POST['RUTTrans']) ? str_replace('.', '', $_POST['RUTTrans']) : false, 'Chofer' => (!empty($_POST['RUTChofer']) and !empty($_POST['NombreChofer'])) ? ['RUTChofer' => str_replace('.', '', $_POST['RUTChofer']), 'NombreChofer' => $_POST['NombreChofer']] : false, 'DirDest' => !empty($_POST['DirDest']) ? $_POST['DirDest'] : false, 'CmnaDest' => !empty($_POST['CmnaDest']) ? (new \sowerphp\app\Sistema\General\DivisionGeopolitica\Model_Comuna($_POST['CmnaDest']))->comuna : false];
         }
     }
     // agregar detalle a los datos
     $n_detalles = count($_POST['NmbItem']);
     $dte['Detalle'] = [];
     $n_itemAfecto = 0;
     $n_itemExento = 0;
     for ($i = 0; $i < $n_detalles; $i++) {
         $detalle = [];
         // código del item
         if (!empty($_POST['VlrCodigo'][$i])) {
             $detalle['CdgItem'] = ['TpoCodigo' => !empty($_POST['TpoCodigo'][$i]) ? $_POST['TpoCodigo'][$i] : 'INT1', 'VlrCodigo' => $_POST['VlrCodigo'][$i]];
         }
         // otros datos
         $datos = ['IndExe', 'NmbItem', 'DscItem', 'QtyItem', 'UnmdItem', 'PrcItem'];
         foreach ($datos as $d) {
             if (!empty($_POST[$d][$i])) {
                 $detalle[$d] = $_POST[$d][$i];
             }
         }
         // descuento
         if (!empty($_POST['ValorDR'][$i]) and !empty($_POST['TpoValor'][$i])) {
             if ($_POST['TpoValor'][$i] == '%') {
                 $detalle['DescuentoPct'] = $_POST['ValorDR'][$i];
             } else {
                 $detalle['DescuentoMonto'] = $_POST['ValorDR'][$i];
             }
         }
         // agregar detalle al listado
         $dte['Detalle'][] = $detalle;
         // contabilizar item afecto o exento
         if (empty($detalle['IndExe'])) {
             $n_itemAfecto++;
         } else {
             $n_itemExento++;
         }
     }
     // agregar descuento globales
     if (!empty($_POST['ValorDR_global']) and !empty($_POST['TpoValor_global'])) {
         $dte['DscRcgGlobal'] = [];
         if ($n_itemAfecto) {
             $dte['DscRcgGlobal'][] = ['TpoMov' => 'D', 'TpoValor' => $_POST['TpoValor_global'], 'ValorDR' => $_POST['ValorDR_global']];
         }
         if ($n_itemExento) {
             $dte['DscRcgGlobal'][] = ['TpoMov' => 'D', 'TpoValor' => $_POST['TpoValor_global'], 'ValorDR' => $_POST['ValorDR_global'], 'IndExeDR' => 1];
         }
     }
     // agregar referencias
     if (isset($_POST['TpoDocRef'][0])) {
         $n_referencias = count($_POST['TpoDocRef']);
         $dte['Referencia'] = [];
         for ($i = 0; $i < $n_referencias; $i++) {
             $dte['Referencia'][] = ['TpoDocRef' => $_POST['TpoDocRef'][$i], 'FolioRef' => $_POST['FolioRef'][$i], 'FchRef' => $_POST['FchRef'][$i], 'CodRef' => !empty($_POST['CodRef'][$i]) ? $_POST['CodRef'][$i] : false, 'RazonRef' => !empty($_POST['RazonRef'][$i]) ? $_POST['RazonRef'][$i] : false];
         }
     }
     // crear objeto Dte y asignar variables para la vista
     $Dte = new \sasco\LibreDTE\Sii\Dte($dte);
     $resumen = $Dte->getResumen();
     $DteTmp = new Model_DteTmp();
     $DteTmp->datos = json_encode($Dte->getDatos());
     $DteTmp->emisor = $Emisor->rut;
     $DteTmp->receptor = $Receptor->rut;
     $DteTmp->dte = $resumen['TpoDoc'];
     $DteTmp->codigo = md5($DteTmp->datos);
     $DteTmp->fecha = $resumen['FchDoc'];
     $DteTmp->total = $resumen['MntTotal'];
     try {
         $DteTmp->save();
     } catch (\sowerphp\core\Exception_Model_Datasource_Database $e) {
         \sowerphp\core\Model_Datasource_Session::message('No fue posible guardar el DTE temporal: ' . $e->getMessage());
         $this->redirect('/dte/documentos/emitir');
     }
     $this->set(['resumen' => $resumen, 'DteTmp' => $DteTmp]);
 }