/**
  * Método responsável pela inserção dos dados no Banco de Dados
  * @throws Exception
  */
 public function processarArquivo()
 {
     if ($this->validacao()) {
         $oDoctrine = Zend_Registry::get('em');
         try {
             $oDoctrine->getConnection()->beginTransaction();
             $oDataSistema = new DateTime();
             $oImportacaoDesif = new Contribuinte_Model_ImportacaoDesif();
             $oImportacaoDesif->setContribuinte($this->oContribuinte->getEntity());
             $oImportacaoDesif->setDataImportacao($oDataSistema);
             $oImportacaoDesif->setCompetenciaInicial($this->oDadosDesif->sCompetenciaInicial);
             $oImportacaoDesif->setCompetenciaFinal($this->oDadosDesif->sCompetenciaFinal);
             $oImportacaoDesif->setVersao($this->oDadosDesif->sVersao);
             $oImportacaoDesif->setNomeArquivo($this->oDadosDesif->sNomeArquivo);
             $oImportacaoDesif->persist();
             //Retornar o id para gerar o protocolo de sucesso
             $iImportacaoDesifId = $oImportacaoDesif->getId();
             // Grava as contas que ainda não estão salvas no plano de contas do DESIF
             foreach ($this->aDadosDesifContas as $oDadosConta) {
                 $aDesifConta = Contribuinte_Model_ImportacaoDesifConta::getByAttributes(array('conta' => $oDadosConta->sConta, 'contribuinte' => $this->oContribuinte->getEntity()));
                 $oDesifConta = array_shift($aDesifConta);
                 if (empty($oDesifConta)) {
                     $oPlanoContaAbrasf = Contribuinte_Model_PlanoContaAbrasf::getByAttribute('conta_abrasf', $oDadosConta->sContaCosif);
                     //Verifica se existe conta no plano abrasf para fazer o vínculo
                     if (empty($oPlanoContaAbrasf)) {
                         throw new Exception('Conta informada ' . $oDadosConta->sContaCosif . ' inexistente no plano de conta da ABRASF.', self::EXCEPTION_CONTA_INEXISTENTE_NO_PLANO_ABRASF);
                     }
                     $oImportacaoDesifConta = new Contribuinte_Model_ImportacaoDesifConta();
                     $oImportacaoDesifConta->setConta($oDadosConta->sConta);
                     $oImportacaoDesifConta->setNome($oDadosConta->sNome);
                     $oImportacaoDesifConta->setDescricaoConta($oDadosConta->sDescricaoConta);
                     $oImportacaoDesifConta->setPlanoContaAbrasf($oPlanoContaAbrasf->getEntity());
                     $oImportacaoDesifConta->setContribuinte($this->oContribuinte->getEntity());
                     if (!empty($oDadosConta->sContaPai)) {
                         $aContaPai = Contribuinte_Model_ImportacaoDesifConta::getByAttributes(array('conta' => $oDadosConta->sContaPai, 'contribuinte' => $this->oContribuinte->getEntity()));
                         $oContaPai = array_shift($aContaPai);
                         $oImportacaoDesifConta->setImportacaoDesifConta($oContaPai->getEntity());
                     }
                     $oImportacaoDesifConta->persist();
                 }
             }
             // Adiciona os dados das tarifas do banco
             foreach ($this->aDadosDesifTarifas as $oDesifTarifa) {
                 $aImportacaoDesifConta = Contribuinte_Model_ImportacaoDesifConta::getByAttributes(array('conta' => $oDesifTarifa->sConta, 'contribuinte' => $this->oContribuinte->getEntity()));
                 $oImportacaoDesifConta = array_shift($aImportacaoDesifConta);
                 if (!empty($oImportacaoDesifConta)) {
                     $oImportacaoDesifTarifa = new Contribuinte_Model_ImportacaoDesifTarifa();
                     $oImportacaoDesifTarifa->setImportacaoDesif($oImportacaoDesif->getEntity());
                     $oImportacaoDesifTarifa->setImportacaoDesifConta($oImportacaoDesifConta->getEntity());
                     $oImportacaoDesifTarifa->setTarifaBanco($oDesifTarifa->sTarifaConta);
                     $oImportacaoDesifTarifa->setDescricao($oDesifTarifa->sDescricao);
                     $oImportacaoDesifTarifa->persist();
                 }
             }
             // Adiciona os dados das receitas informadas
             foreach ($this->aDadosDesifReceitas as $oReceita) {
                 $aImportacaoDesifConta = Contribuinte_Model_ImportacaoDesifConta::getByAttributes(array('conta' => $oReceita->sConta, 'contribuinte' => $this->oContribuinte->getEntity()));
                 $oImportacaoDesifConta = array_shift($aImportacaoDesifConta);
                 if (empty($oImportacaoDesifConta)) {
                     throw new Exception("Conta {$oReceita->sConta} é inválida!");
                 }
                 $oImportacaoDesifReceita = new Contribuinte_Model_ImportacaoDesifReceita();
                 $oImportacaoDesifReceita->setImportacaoDesif($oImportacaoDesif->getEntity());
                 $oImportacaoDesifReceita->setImportacaoDesifConta($oImportacaoDesifConta->getEntity());
                 $oImportacaoDesifReceita->setSubTitu($oReceita->sConta);
                 $oImportacaoDesifReceita->setCodTribDesif($oReceita->sCodTribDesif);
                 $oImportacaoDesifReceita->setValrCredMens($oReceita->fValrCredMens);
                 $oImportacaoDesifReceita->setValrDebtMens($oReceita->fValrDebtMens);
                 $oImportacaoDesifReceita->setReceDecl($oReceita->fReceDecl);
                 $oImportacaoDesifReceita->setDeduReceDecl($oReceita->fDeduReceDecl);
                 $oImportacaoDesifReceita->setDescDedu($oReceita->fDescDedu);
                 $oImportacaoDesifReceita->setBaseCalc($oReceita->fBaseCalc);
                 $oImportacaoDesifReceita->setAliqIssqn($oReceita->fAliqIssqn);
                 $oImportacaoDesifReceita->setInctFisc($oReceita->fInctFisc);
                 $oImportacaoDesifReceita->persist();
             }
             $oDoctrine->getConnection()->commit();
             return $iImportacaoDesifId;
         } catch (Exception $oErro) {
             $oDoctrine->getConnection()->rollback();
             if ($oErro->getCode() == self::EXCEPTION_CONTA_INEXISTENTE_NO_PLANO_ABRASF) {
                 throw $oErro;
             }
             throw new Exception('Erro ao processar os arquivos da DES-IF!');
         }
     }
 }