Ejemplo n.º 1
0
 /**
  * Método que entrega del intercambio el objeto del Resultado del DTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function getIntercambioResultado()
 {
     $Resultado = new Model_DteIntercambioResultadoDte($this->emisor, $this->dte, $this->folio, $this->certificacion);
     return $Resultado->exists() ? $Resultado : false;
 }
 /**
  * Método que guarda el XML del Resultado de un intercambio
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function saveXML($Emisor, $xml)
 {
     // crear respuesta
     $RespuestaEnvio = new \sasco\LibreDTE\Sii\RespuestaEnvio();
     $RespuestaEnvio->loadXML($xml);
     if (!$RespuestaEnvio->esResultadoDTE()) {
         return null;
     }
     $Resultado = $RespuestaEnvio->toArray()['RespuestaDTE']['Resultado'];
     if (explode('-', $Resultado['Caratula']['RutRecibe'])[0] != $Emisor->rut) {
         return false;
     }
     // guardar recepción
     $this->db->beginTransaction();
     $this->responde = explode('-', $Resultado['Caratula']['RutResponde'])[0];
     $this->recibe = $Emisor->rut;
     $this->codigo = md5($xml);
     $this->contacto = !empty($Resultado['Caratula']['NmbContacto']) ? substr($Resultado['Caratula']['NmbContacto'], 0, 40) : null;
     $this->telefono = !empty($Resultado['Caratula']['FonoContacto']) ? substr($Resultado['Caratula']['FonoContacto'], 0, 40) : null;
     $this->email = !empty($Resultado['Caratula']['MailContacto']) ? substr($Resultado['Caratula']['MailContacto'], 0, 80) : null;
     $this->fecha_hora = str_replace('T', ' ', $Resultado['Caratula']['TmstFirmaResp']);
     $this->xml = base64_encode($xml);
     if (!$this->save()) {
         $this->db->rollback();
         return false;
     }
     // procesar cada resultado
     foreach ($RespuestaEnvio->getResultados() as $Resultado) {
         // si el RUT del emisor no corresponde con el del contribuyente el
         // acuse no es para este
         if (explode('-', $Resultado['RUTEmisor'])[0] != $Emisor->rut) {
             $this->db->rollback();
             return false;
         }
         // buscar DTE emitido en el ambiente del emisor
         $DteEmitido = new Model_DteEmitido($Emisor->rut, $Resultado['TipoDTE'], $Resultado['Folio'], $Emisor->certificacion);
         // si no existe o si los datos del DTE emitido no corresponden error
         if (!$DteEmitido->exists() or explode('-', $Resultado['RUTRecep'])[0] != $DteEmitido->receptor or $Resultado['FchEmis'] != $DteEmitido->fecha or $Resultado['MntTotal'] != $DteEmitido->total) {
             $this->db->rollback();
             return false;
         }
         // guardar recibo para el DTE
         $DteIntercambioResultadoDte = new Model_DteIntercambioResultadoDte($DteEmitido->emisor, $DteEmitido->dte, $DteEmitido->folio, $DteEmitido->certificacion);
         $DteIntercambioResultadoDte->responde = $this->responde;
         $DteIntercambioResultadoDte->codigo = $this->codigo;
         $DteIntercambioResultadoDte->estado = $Resultado['EstadoDTE'];
         $DteIntercambioResultadoDte->glosa = substr($Resultado['EstadoDTEGlosa'], 0, 256);
         if (!$DteIntercambioResultadoDte->save()) {
             $this->db->rollback();
             return false;
         }
     }
     // aceptar transacción
     $this->db->commit();
     return true;
 }