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