예제 #1
0
파일: Dte.php 프로젝트: jenniev89/LibreDTE
 /**
  * Método que realiza el timbrado del DTE
  * @param Folios Objeto de los Folios con los que se desea timbrar
  * @return =true si se pudo timbrar o =false en caso de error
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-09-17
  */
 public function timbrar(Folios $Folios)
 {
     // verificar que el folio que se está usando para el DTE esté dentro
     // del rango de folios autorizados que se usarán para timbrar
     // Esta validación NO verifica si el folio ya fue usado, sólo si está
     // dentro del CAF que se está usando
     $folio = $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/IdDoc/Folio')->item(0)->nodeValue;
     if ($folio < $Folios->getDesde() or $folio > $Folios->getHasta()) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::DTE_ERROR_RANGO_FOLIO, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::DTE_ERROR_RANGO_FOLIO, $this->getID()));
         return false;
     }
     // verificar que existan datos para el timbre
     if (!$this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/IdDoc/FchEmis')->item(0)) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::DTE_FALTA_FCHEMIS, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::DTE_FALTA_FCHEMIS, $this->getID()));
         \sasco\LibreDTE\Log::write('Falta FchEmis del DTE ' . $this->getID());
         return false;
     }
     if (!$this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/Totales/MntTotal')->item(0)) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::DTE_FALTA_MNTTOTAL, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::DTE_FALTA_MNTTOTAL, $this->getID()));
         return false;
     }
     // timbrar
     $TED = new \sasco\LibreDTE\XML();
     $TED->generate(['TED' => ['@attributes' => ['version' => '1.0'], 'DD' => ['RE' => $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/Emisor/RUTEmisor')->item(0)->nodeValue, 'TD' => $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/IdDoc/TipoDTE')->item(0)->nodeValue, 'F' => $folio, 'FE' => $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/IdDoc/FchEmis')->item(0)->nodeValue, 'RR' => $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/Receptor/RUTRecep')->item(0)->nodeValue, 'RSR' => substr($this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/Receptor/RznSocRecep')->item(0)->nodeValue, 0, 40), 'MNT' => $this->xml->xpath('/DTE/' . $this->tipo_general . '/Encabezado/Totales/MntTotal')->item(0)->nodeValue, 'IT1' => substr($this->xml->xpath('/DTE/' . $this->tipo_general . '/Detalle')->item(0)->getElementsByTagName('NmbItem')->item(0)->nodeValue, 0, 40), 'CAF' => $Folios->getCaf(), 'TSTED' => $this->timestamp], 'FRMT' => ['@attributes' => ['algoritmo' => 'SHA1withRSA']]]]);
     $DD = $TED->getFlattened('/TED/DD');
     if (openssl_sign($DD, $timbre, $Folios->getPrivateKey(), OPENSSL_ALGO_SHA1) == false) {
         \sasco\LibreDTE\Log::write(\sasco\LibreDTE\Estado::DTE_ERROR_TIMBRE, \sasco\LibreDTE\Estado::get(\sasco\LibreDTE\Estado::DTE_ERROR_TIMBRE, $this->getID()));
         return false;
     }
     $TED->getElementsByTagName('FRMT')->item(0)->nodeValue = base64_encode($timbre);
     $xml = str_replace('<TED/>', trim(str_replace('<?xml version="1.0" encoding="ISO-8859-1"?>', '', $TED->saveXML())), $this->saveXML());
     $this->loadXML($xml);
     return true;
 }