/**
  * Método que entrega del intercambio el objeto de la Recepcion del DTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function getIntercambioRecepcion()
 {
     $Recepcion = new Model_DteIntercambioRecepcionDte($this->emisor, $this->dte, $this->folio, $this->certificacion);
     return $Recepcion->exists() ? $Recepcion : false;
 }
 /**
  * Método que guarda el XML de la Recepción de un intercambio
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function saveXML($Emisor, $xml)
 {
     $RespuestaEnvio = new \sasco\LibreDTE\Sii\RespuestaEnvio();
     $RespuestaEnvio->loadXML($xml);
     if (!$RespuestaEnvio->esRecepcionEnvio()) {
         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->estado = $Resultado['RecepcionEnvio']['EstadoRecepEnv'];
     $this->glosa = substr($Resultado['RecepcionEnvio']['RecepEnvGlosa'], 0, 256);
     $this->xml = base64_encode($xml);
     if (!$this->save()) {
         $this->db->rollback();
         return false;
     }
     // procesar cada recepción
     foreach ($RespuestaEnvio->getRecepciones() as $Recepcion) {
         // si el RUT del emisor no corresponde con el del contribuyente el
         // acuse no es para este
         if (explode('-', $Recepcion['RUTEmisor'])[0] != $Emisor->rut) {
             $this->db->rollback();
             return false;
         }
         // buscar DTE emitido en el ambiente del emisor
         $DteEmitido = new Model_DteEmitido($Emisor->rut, $Recepcion['TipoDTE'], $Recepcion['Folio'], $Emisor->certificacion);
         // si no existe o si los datos del DTE emitido no corresponden error
         if (!$DteEmitido->exists() or explode('-', $Recepcion['RUTRecep'])[0] != $DteEmitido->receptor or $Recepcion['FchEmis'] != $DteEmitido->fecha or $Recepcion['MntTotal'] != $DteEmitido->total) {
             $this->db->rollback();
             return false;
         }
         // guardar recibo para el DTE
         $DteIntercambioRecepcionDte = new Model_DteIntercambioRecepcionDte($DteEmitido->emisor, $DteEmitido->dte, $DteEmitido->folio, $DteEmitido->certificacion);
         $DteIntercambioRecepcionDte->responde = $this->responde;
         $DteIntercambioRecepcionDte->codigo = $this->codigo;
         $DteIntercambioRecepcionDte->estado = $Recepcion['EstadoRecepDTE'];
         $DteIntercambioRecepcionDte->glosa = substr($Recepcion['RecepDTEGlosa'], 0, 256);
         if (!$DteIntercambioRecepcionDte->save()) {
             $this->db->rollback();
             return false;
         }
     }
     // aceptar transacción
     $this->db->commit();
     return true;
 }