/**
  * Método que entrega del intercambio el objeto del Recibo del DTE
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function getIntercambioRecibo()
 {
     $Recibo = new Model_DteIntercambioReciboDte($this->emisor, $this->dte, $this->folio, $this->certificacion);
     return $Recibo->exists() ? $Recibo : false;
 }
 /**
  * Método que guarda el XML del Recibo de un intercambio
  * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl)
  * @version 2015-12-23
  */
 public function saveXML($Emisor, $xml)
 {
     // crear recibo
     $EnvioRecibos = new \sasco\LibreDTE\Sii\EnvioRecibos();
     $EnvioRecibos->loadXML($xml);
     if (!$EnvioRecibos->getID()) {
         return null;
     }
     $Caratula = $EnvioRecibos->toArray()['EnvioRecibos']['SetRecibos']['Caratula'];
     if (explode('-', $Caratula['RutRecibe'])[0] != $Emisor->rut) {
         return false;
     }
     // guardar recibo
     $this->db->beginTransaction();
     $this->responde = explode('-', $Caratula['RutResponde'])[0];
     $this->recibe = $Emisor->rut;
     $this->codigo = md5($xml);
     $this->contacto = !empty($Caratula['NmbContacto']) ? substr($Caratula['NmbContacto'], 0, 40) : null;
     $this->telefono = !empty($Caratula['FonoContacto']) ? substr($Caratula['FonoContacto'], 0, 40) : null;
     $this->email = !empty($Caratula['MailContacto']) ? substr($Caratula['MailContacto'], 0, 80) : null;
     $this->fecha_hora = str_replace('T', ' ', $Caratula['TmstFirmaEnv']);
     $this->xml = base64_encode($xml);
     if (!$this->save()) {
         $this->db->rollback();
         return false;
     }
     // procesar cada recibo
     foreach ($EnvioRecibos->getRecibos() as $Recibo) {
         // si el RUT del emisor no corresponde con el del contribuyente el
         // acuse no es para este
         if (explode('-', $Recibo['DocumentoRecibo']['RUTEmisor'])[0] != $Emisor->rut) {
             $this->db->rollback();
             return false;
         }
         // buscar DTE emitido en el ambiente del emisor
         $DteEmitido = new Model_DteEmitido($Emisor->rut, $Recibo['DocumentoRecibo']['TipoDoc'], $Recibo['DocumentoRecibo']['Folio'], $Emisor->certificacion);
         // si no existe o si los datos del DTE emitido no corresponden error
         if (!$DteEmitido->exists() or explode('-', $Recibo['DocumentoRecibo']['RUTRecep'])[0] != $DteEmitido->receptor or $Recibo['DocumentoRecibo']['FchEmis'] != $DteEmitido->fecha or $Recibo['DocumentoRecibo']['MntTotal'] != $DteEmitido->total) {
             $this->db->rollback();
             return false;
         }
         // guardar recibo para el DTE
         $DteIntercambioReciboDte = new Model_DteIntercambioReciboDte($DteEmitido->emisor, $DteEmitido->dte, $DteEmitido->folio, $DteEmitido->certificacion);
         $DteIntercambioReciboDte->responde = $this->responde;
         $DteIntercambioReciboDte->codigo = $this->codigo;
         $DteIntercambioReciboDte->recinto = substr($Recibo['DocumentoRecibo']['Recinto'], 0, 80);
         $DteIntercambioReciboDte->firma = substr($Recibo['DocumentoRecibo']['RutFirma'], 0, 10);
         $DteIntercambioReciboDte->fecha_hora = str_replace('T', ' ', $Recibo['DocumentoRecibo']['TmstFirmaRecibo']);
         if (!$DteIntercambioReciboDte->save()) {
             $this->db->rollback();
             return false;
         }
     }
     // aceptar transacción
     $this->db->commit();
     return true;
 }