$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 de los DTE (cada elemento del arreglo $set_pruebas es un DTE) $set_pruebas = [['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34]], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'HORAS PROGRAMADOR', 'QtyItem' => 12, 'UnmdItem' => 'Hora', 'PrcItem' => 6991]], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => $folios[34], 'RazonRef' => 'CASO 414178-1']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61]], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntExe' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'HORAS PROGRAMADOR', 'IndExe' => 1, 'QtyItem' => 12, 'UnmdItem' => 'Hora', 'PrcItem' => 874]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[61], 'RazonRef' => 'CASO 414178-2'], ['TpoDocRef' => 34, 'FolioRef' => $folios[34], 'CodRef' => 3, 'RazonRef' => 'MODIFICA MONTO']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 1], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'SERV CONSULTORIA FACT ELECTRONICA', 'QtyItem' => 1, 'PrcItem' => 360368], ['NmbItem' => 'SERV CONSULTORIA GUIA DESPACHO ELECT', 'QtyItem' => 1, 'PrcItem' => 262001]], 'Referencia' => ['TpoDocRef' => 'SET', 'FolioRef' => $folios[34] + 1, 'RazonRef' => 'CASO 414178-3']], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 1], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntExe' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'SERV CONSULTORIA FACT ELECTRONICA']], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[61] + 1, 'RazonRef' => 'CASO 414178-4'], ['TpoDocRef' => 34, 'FolioRef' => $folios[34] + 1, 'CodRef' => 2, 'RazonRef' => 'CORRIGE GIRO']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 56, 'Folio' => $folios[56]], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntExe' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'SERV CONSULTORIA FACT ELECTRONICA']], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[56], 'RazonRef' => 'CASO 414178-5'], ['TpoDocRef' => 61, 'FolioRef' => $folios[61] + 1, 'CodRef' => 1, 'RazonRef' => 'ANULA NOTA DE CREDITO ELECTRONICA']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 34, 'Folio' => $folios[34] + 2], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago']], 'Detalle' => [['NmbItem' => 'CAPACITACION USO CIGUEÑALES', 'QtyItem' => 1, 'PrcItem' => 350414], ['NmbItem' => 'CAPACITACION USO PLC\'s CNC', 'QtyItem' => 1, 'PrcItem' => 239579]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[34] + 2, 'RazonRef' => 'CASO 414178-6']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 61, 'Folio' => $folios[61] + 2], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntExe' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'CAPACITACION USO CIGUEÑALES', 'IndExe' => 1, 'QtyItem' => 1, 'PrcItem' => 175207]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[61] + 2, 'RazonRef' => 'CASO 414178-7'], ['TpoDocRef' => 34, 'FolioRef' => $folios[34] + 2, 'CodRef' => 3, 'RazonRef' => 'MODIFICA MONTO']]], ['Encabezado' => ['IdDoc' => ['TipoDTE' => 56, 'Folio' => $folios[56] + 1], 'Emisor' => $Emisor, 'Receptor' => ['RUTRecep' => '55666777-8', 'RznSocRecep' => 'Empresa S.A.', 'GiroRecep' => 'Servicios jurídicos', 'DirRecep' => 'Santiago', 'CmnaRecep' => 'Santiago'], 'Totales' => ['MntExe' => 0, 'MntTotal' => 0]], 'Detalle' => [['NmbItem' => 'CAPACITACION USO PLC\'s CNC', 'IndExe' => 1, 'QtyItem' => 1, 'PrcItem' => 47916]], 'Referencia' => [['TpoDocRef' => 'SET', 'FolioRef' => $folios[56] + 1, 'RazonRef' => 'CASO 414178-8'], ['TpoDocRef' => 34, 'FolioRef' => $folios[34] + 2, 'CodRef' => 3, 'RazonRef' => 'MODIFICA MONTO']]]]; // 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 ($set_pruebas as $documento) { $DTE = new \sasco\LibreDTE\Sii\Dte($documento); if (!$DTE->timbrar($Folios[$DTE->getTipo()])) { break; } if (!$DTE->firmar($Firma)) { break; } $EnvioDTE->agregar($DTE); } // enviar dtes y mostrar resultado del envío: track id o bien =false si hubo error $EnvioDTE->setCaratula($caratula); $EnvioDTE->setFirma($Firma); //file_put_contents('xml/EnvioDTE.xml', $EnvioDTE->generar()); // guardar XML en sistema de archivos $track_id = $EnvioDTE->enviar(); var_dump($track_id); // si hubo errores mostrar foreach (\sasco\LibreDTE\Log::readAll() as $error) {
/** * Recurso de la API que genera el XML de los DTEs solicitados * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-11-21 */ public function _api_generar_xml_POST() { // verificar si se pasaron credenciales de un usuario $User = $this->Api->getAuthUser(); if (is_string($User)) { $this->Api->send($User, 401); } // verificar que se hayan pasado los índices básicos foreach (['Emisor', 'Receptor', 'documentos', 'folios', 'firma'] as $key) { if (!isset($this->Api->data[$key])) { $this->Api->send('Falta índice/variable ' . $key . ' por POST', 500); } } // recuperar folios y definir ambiente $folios = []; $certificacion = false; foreach ($this->Api->data['folios'] as $folio) { $Folios = new \sasco\LibreDTE\Sii\Folios(base64_decode($folio)); $folios[$Folios->getTipo()] = $Folios; if ($Folios->getCertificacion()) { $certificacion = true; } } // normalizar datos emisor $this->Api->data['Emisor']['RUTEmisor'] = str_replace('.', '', $this->Api->data['Emisor']['RUTEmisor']); // normalizar datos receptor $this->Api->data['Receptor']['RUTRecep'] = str_replace('.', '', $this->Api->data['Receptor']['RUTRecep']); // objeto de la firma try { $Firma = new \sasco\LibreDTE\FirmaElectronica(['data' => base64_decode($this->Api->data['firma']['data']), 'pass' => $this->Api->data['firma']['pass']]); } catch (\Exception $e) { $this->Api->send('No fue posible abrir la firma digital, quizás contraseña incorrecta', 500); } // normalizar dte? $normalizar_dte = isset($this->Api->data['normalizar_dte']) ? $this->Api->data['normalizar_dte'] : true; // armar documentos y guardar en un arreglo $Documentos = []; foreach ($this->Api->data['documentos'] as $d) { // crear documento $d['Encabezado']['Emisor'] = $this->Api->data['Emisor']; $d['Encabezado']['Receptor'] = $this->Api->data['Receptor']; $DTE = new \sasco\LibreDTE\Sii\Dte($d, $normalizar_dte); // timbrar, firmar y validar el documento if (!isset($folios[$DTE->getTipo()])) { return $this->Api->send('Falta el CAF para el tipo de DTE ' . $DTE->getTipo(), 500); } if (!$DTE->timbrar($folios[$DTE->getTipo()]) or !$DTE->firmar($Firma) or !$DTE->schemaValidate()) { return $this->Api->send(implode("\n", \sasco\LibreDTE\Log::readAll()), 500); } // agregar el DTE al listado $Documentos[] = $DTE; } // armar EnvioDTE si se pasó fecha de resolución y número de resolución if (isset($this->Api->data['resolucion']) and !empty($this->Api->data['resolucion']['FchResol']) and isset($this->Api->data['resolucion']['NroResol'])) { $EnvioDte = new \sasco\LibreDTE\Sii\EnvioDte(); foreach ($Documentos as $DTE) { $EnvioDte->agregar($DTE); } $EnvioDte->setCaratula(['RutEnvia' => $Firma->getID(), 'RutReceptor' => $certificacion ? '60803000-K' : $this->Api->data['Receptor']['RUTRecep'], 'FchResol' => $this->Api->data['resolucion']['FchResol'], 'NroResol' => (int) $this->Api->data['resolucion']['NroResol']]); $EnvioDte->setFirma($Firma); // generar $xml = $EnvioDte->generar(); // validar schema del DTE if (!$EnvioDte->schemaValidate()) { return $this->Api->send(implode("\n", \sasco\LibreDTE\Log::readAll()), 500); } $dir = sys_get_temp_dir() . '/EnvioDTE_' . $this->Api->data['Emisor']['RUTEmisor'] . '_' . $this->Api->data['Receptor']['RUTRecep'] . '_' . date('U') . '.xml'; file_put_contents($dir, $xml); } else { // directorio temporal para guardar los XML $dir = sys_get_temp_dir() . '/DTE_' . $this->Api->data['Emisor']['RUTEmisor'] . '_' . $this->Api->data['Receptor']['RUTRecep'] . '_' . date('U'); 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 directorio que se comprimirá foreach ($Documentos as $DTE) { // guardar XML file_put_contents($dir . '/dte_' . $this->Api->data['Emisor']['RUTEmisor'] . '_' . $DTE->getID() . '.xml', $DTE->saveXML()); } } // guardar datos de emisor, receptor y estadísticas if (isset($this->Api->data['resolucion'])) { $resolucion = []; if (!empty($this->Api->data['resolucion']['FchResol'])) { $resolucion['FchResol'] = $this->Api->data['resolucion']['FchResol']; } if (isset($this->Api->data['resolucion']['NroResol'])) { $resolucion['NroResol'] = $this->Api->data['resolucion']['NroResol']; } $this->guardarEmisor($this->Api->data['Emisor'], $resolucion); } else { $this->guardarEmisor($this->Api->data['Emisor']); } $this->guardarReceptor($this->Api->data['Receptor']); list($emisor, $dv) = explode('-', $this->Api->data['Emisor']['RUTEmisor']); list($receptor, $dv) = explode('-', $this->Api->data['Receptor']['RUTRecep']); // entregar archivo comprimido que incluirá cada uno de los DTEs \sasco\LibreDTE\File::compress($dir, ['format' => 'zip', 'delete' => true]); }