/**
  * Valida e salva as informações do RPS na base de dados
  * 
  * @throws Exception
  * @return integer|NULL
  */
 public function processarImportacaoRps()
 {
     // Dados da sessão
     $oSessao = new Zend_Session_Namespace('nfse');
     $oDoctrine = Zend_Registry::get('em');
     $oDoctrine->getConnection()->beginTransaction();
     try {
         // Dados da importação
         $oImportacao = new \Contribuinte\ImportacaoArquivo();
         $oImportacao->setData(new DateTime());
         $oImportacao->setHora(new DateTime());
         $oImportacao->setTipo('RPS');
         $oImportacao->setQuantidadeDocumentos($this->oImportacao->lote->quantidade_rps);
         $oImportacao->setVersaoLayout('modelo1');
         $oImportacao->setIdUsuario($this->iUsuarioLogado);
         $oImportacao->setNumeroLote($this->oImportacao->lote->numero);
         // Totalizadores
         $fValorTotalServico = 0;
         $fValorTotalImpostos = 0;
         // Processa a lista de rps
         foreach ($this->oImportacao->rps as $oRps) {
             if ($oRps->servico->valores->valor_iss_retido > 0) {
                 $oRps->servico->valores->valor_iss = $oRps->servico->valores->valor_iss_retido;
                 $oRps->servico->valores->iss_retido = 1;
             }
             $oContribuinte = Contribuinte_Model_Contribuinte::getByCpfCnpj($oRps->prestador->cnpj);
             $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal();
             // Dados dos Usuários
             $aDados['id_contribuinte'] = $oSessao->contribuinte->getIdUsuarioContribuinte();
             $aDados['id_usuario'] = $this->iUsuarioLogado;
             // Dados da RPS
             $aDados['grupo_nota'] = Contribuinte_Model_Nota::GRUPO_NOTA_RPS;
             $aDados['tipo_nota'] = $oRps->tipo;
             $aDados['n_rps'] = $oRps->numero;
             $aDados['data_rps'] = $oRps->data_emissao;
             $aDados['dt_nota'] = $oRps->data_emissao;
             $aDados['hr_nota'] = $oRps->data_emissao;
             $aDados['ano_comp'] = $oRps->data_emissao->format('Y');
             $aDados['mes_comp'] = $oRps->data_emissao->format('m');
             $aDados['natureza_operacao'] = $oRps->natureza_operacao;
             // Dados do Prestador
             $aDados['p_im'] = $iInscricaoMunicipal;
             $aDados['p_cnpjcpf'] = $oRps->prestador->cnpj;
             // Dados do Tomador
             $aDados['t_cnpjcpf'] = $oRps->tomador->cpf_cnpj;
             $aDados['t_razao_social'] = $oRps->tomador->razao_social;
             $aDados['t_cep'] = $oRps->tomador->endereco->cep;
             $aDados['t_endereco'] = $oRps->tomador->endereco->descricao;
             $aDados['t_endereco_numero'] = $oRps->tomador->endereco->numero;
             $aDados['t_endereco_comp'] = $oRps->tomador->endereco->complemento;
             $aDados['t_bairro'] = $oRps->tomador->endereco->bairro;
             $aDados['t_cod_municipio'] = $oRps->tomador->endereco->ibge_municipio;
             $aDados['t_uf'] = $oRps->tomador->endereco->uf;
             $aDados['t_telefone'] = $oRps->tomador->contato->telefone;
             $aDados['t_email'] = $oRps->tomador->contato->email;
             // Dados da construção civil
             $aDados['s_codigo_obra'] = $oRps->construcao_civil->codigo_obra;
             $aDados['s_art'] = $oRps->construcao_civil->art;
             // Dados do Serviço
             $iAtividade = $oRps->servico->atividade;
             $oServico = Contribuinte_Model_Servico::getServicoPorAtividade($iInscricaoMunicipal, $iAtividade);
             if (empty($oServico)) {
                 throw new Exception('O código de atividade do serviço inválido.');
             }
             $aDados['descricao'] = $oRps->servico->discriminacao;
             $aDados['s_dados_cod_tributacao'] = $oServico->attr('cod_atividade');
             $aDados['s_dados_cod_municipio'] = $oRps->servico->ibge_municipio;
             $aDados['s_dados_municipio_incidencia'] = $oRps->servico->ibge_municipio;
             $aDados['s_dados_cod_pais'] = 1058;
             //brasil
             // Verifica se o tomador retem o ISS
             $lTomadorRetemIss = $oRps->servico->valores->iss_retido == 1 ? TRUE : FALSE;
             // Valores do Serviço
             $aDados['s_vl_servicos'] = self::converterValor($oRps->servico->valores->valor_servicos);
             $aDados['s_vl_deducoes'] = self::converterValor($oRps->servico->valores->valor_deducoes);
             $aDados['s_vl_pis'] = self::converterValor($oRps->servico->valores->valor_pis);
             $aDados['s_vl_cofins'] = self::converterValor($oRps->servico->valores->valor_cofins);
             $aDados['s_vl_inss'] = self::converterValor($oRps->servico->valores->valor_inss);
             $aDados['s_vl_ir'] = self::converterValor($oRps->servico->valores->valor_ir);
             $aDados['s_vl_csll'] = self::converterValor($oRps->servico->valores->valor_csll);
             $aDados['s_vl_iss'] = self::converterValor($oRps->servico->valores->valor_iss);
             $aDados['s_dados_iss_retido'] = $lTomadorRetemIss ? 1 : 0;
             $aDados['s_vl_outras_retencoes'] = self::converterValor($oRps->servico->valores->outras_retencoes);
             $aDados['s_vl_bc'] = self::converterValor($oRps->servico->valores->base_calculo);
             $aDados['s_vl_aliquota'] = self::converterValor($oRps->servico->valores->aliquota * 100);
             $aDados['s_vl_liquido'] = self::converterValor($oRps->servico->valores->valor_liquido);
             $aDados['vl_liquido_nfse'] = self::converterValor($oRps->servico->valores->valor_liquido);
             $aDados['s_vl_condicionado'] = self::converterValor($oRps->servico->valores->desconto_condicionado);
             $aDados['s_vl_desc_incondicionado'] = self::converterValor($oRps->servico->valores->desconto_incondicionado);
             // Salva o RPS
             $oNotaRps = new Contribuinte_Model_Nota();
             $oNotaRps->persist($aDados);
             // Adiciona os documento aos dados da importação
             $oImportacaoArquivoDocumento = new \Contribuinte\ImportacaoArquivoDocumento();
             $oImportacaoArquivoDocumento->setImportacaoDms($oImportacao);
             $oImportacaoArquivoDocumento->addNota($oNotaRps->getEntity());
             $oImportacaoArquivoDocumento->setValorImposto($oRps->servico->valores->valor_iss);
             $oImportacaoArquivoDocumento->setValorTotal($oRps->servico->valores->valor_servicos);
             // Vincula o documento aos dados da importação
             $oImportacao->addImportacaoArquivoDocumentos($oImportacaoArquivoDocumento);
             // Incrementa os totalizadores
             $fValorTotalServico += $oRps->servico->valores->valor_servicos;
             $fValorTotalImpostos += $oRps->servico->valores->valor_iss;
         }
         // Completa e salva os dados da importação
         $oImportacao->setValorTotal($fValorTotalServico);
         $oImportacao->setValorImposto($fValorTotalImpostos);
         $oDoctrine->persist($oImportacao);
         $oDoctrine->flush();
         $oDoctrine->getConnection()->commit();
         return $oImportacao;
     } catch (Exception $oErro) {
         $oDoctrine->getConnection()->rollback();
         throw new Exception('Ocorreu um erro ao importar o arquivo: ' . $oErro->getMessage());
     }
 }
 /**
  * Método abstrato para validar o formulário em ambos os relatórios
  *
  * @return array|boolean
  */
 protected function validarFormulario()
 {
     $aDados = $this->getRequest()->getPost();
     $aRetornoErros = array();
     $oForm = new Fiscal_Form_Relatorio6();
     $oForm->render();
     // Verifica se os parâmetros do formulário são válidos
     if ($oForm->isValid($aDados)) {
         // Parâmetros do formulário
         $sCompetenciaInicial = $oForm->getValue('data_competencia_inicial');
         $sCompetenciaFinal = $oForm->getValue('data_competencia_final');
         $sPrestadorCnpj = $oForm->getValue('prestador_cnpj');
         // Valida se é cadastrado e se é prestador de servico
         $oPrestador = Contribuinte_Model_Contribuinte::getByCpfCnpj($sPrestadorCnpj);
         if (!$oPrestador instanceof Contribuinte_Model_Contribuinte) {
             $sMensagemErro = $this->translate->_('Contribuinte não cadastrado no sistema.');
             $aRetornoErros['status'] = FALSE;
             $aRetornoErros['fields'] = array('prestador_cnpj');
             $aRetornoErros['error'][] = $this->translate->_($sMensagemErro);
             return $aRetornoErros;
         } else {
             if (!Contribuinte_Model_Servico::getByIm($oPrestador->getInscricaoMunicipal())) {
                 $sMensagemErro = $this->translate->_('O contribuinte não é prestador de serviços.');
                 $aRetornoErros['status'] = FALSE;
                 $aRetornoErros['fields'] = array('prestador_cnpj');
                 $aRetornoErros['error'][] = $this->translate->_($sMensagemErro);
                 return $aRetornoErros;
             }
         }
         // Objeto para validação das competências inicial e final
         $oValidaCompetencia = new DBSeller_Validator_Competencia();
         $oValidaCompetencia->setCompetenciaInicial($sCompetenciaInicial);
         $oValidaCompetencia->setCompetenciaFinal($sCompetenciaFinal);
         // Valida a competência inicial e final
         if (!$oValidaCompetencia->isValid($sCompetenciaInicial)) {
             $aRetornoErros['status'] = FALSE;
             $aRetornoErros['fields'] = array('data_competencia_inicial', 'data_competencia_final');
             $aMensagensErro = $oValidaCompetencia->getMessages();
             $aIndicesErro = array_keys($aMensagensErro);
             foreach ($aIndicesErro as $sIndiceErro) {
                 if (array_key_exists($sIndiceErro, $aMensagensErro)) {
                     $aRetornoErros['error'][] = $this->translate->_($aMensagensErro[$sIndiceErro]);
                 }
             }
             return $aRetornoErros;
         }
         return TRUE;
     } else {
         $aCamposComErro = array_keys($oForm->getMessages());
         $sMensagemErro = $this->translate->_('Preencha os dados corretamente.');
         if (count($aCamposComErro) > 1) {
             $sMensagemErro = $this->translate->_('Preencha os dados corretamente.');
         } else {
             if (in_array('data_competencia_final', $aCamposComErro)) {
                 $sMensagemErro = $this->translate->_('Informe a Competência Final corretamente.');
             } else {
                 if (in_array('data_competencia_inicial', $aCamposComErro)) {
                     $sMensagemErro = $this->translate->_('Informe a Competência Inicial corretamente.');
                 }
             }
         }
         $aRetornoErros['status'] = FALSE;
         $aRetornoErros['fields'] = array_keys($oForm->getMessages());
         $aRetornoErros['error'][] = $this->translate->_($sMensagemErro);
     }
     return $aRetornoErros;
 }
 /**
  * Valida a importação de arquivo do tipo RPS modelo 1 (ABRASF 1.0)
  */
 public function validaArquivoCarregado()
 {
     $oSessao = new Zend_Session_Namespace('nfse');
     if (empty($this->oDadosPrefeitura)) {
         $aParametrosPrefeitura = Administrativo_Model_ParametroPrefeitura::getAll(0, 1);
         if (count($aParametrosPrefeitura) == 0) {
             throw new Exception('Parâmetros da prefeitura não configurados. Processamento Abortado');
         }
         $this->oDadosPrefeitura = $aParametrosPrefeitura[0];
     }
     if (empty($this->oArquivoXmlRetorno->lote->numero)) {
         $this->setMensagemErro('E88');
     }
     if (empty($this->oArquivoXmlRetorno->lote->cnpj)) {
         $this->setMensagemErro('E46');
     }
     $oContribuinte = Contribuinte_Model_Contribuinte::getByCpfCnpj($this->oArquivoXmlRetorno->lote->cnpj);
     if (empty($oContribuinte)) {
         $this->setMensagemErro('E45', 'Contribuinte: ' . $this->oArquivoXmlRetorno->lote->cnpj);
     } else {
         if ($oContribuinte->getCgcCpf() != $oSessao->contribuinte->getCgcCpf()) {
             $this->setMensagemErro('E156', '', true);
         }
     }
     if ($this->oArquivoXmlRetorno->lote->quantidade_rps != count($this->oArquivoXmlRetorno->rps)) {
         $this->setMensagemErro('E69');
     }
     if (strlen($this->oArquivoXmlRetorno->lote->quantidade_rps) > 4) {
         $this->setMensagemErro('E72');
     }
     $aNumeracaoRPS = array();
     foreach ($this->oArquivoXmlRetorno->rps as $oRps) {
         if ($this->oArquivoXmlRetorno->lote->inscricao_municipal != $oRps->prestador->inscricao_municipal) {
             $this->setMensagemErro('E70', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->numero)) {
             $this->setMensagemErro('E11');
         } else {
             if (is_int($oRps->numero) && strlen($oRps->numero) > 15) {
                 $this->setMensagemErro('E96', 'RPS: ' . $oRps->numero);
             }
             if (in_array($oRps->numero, $aNumeracaoRPS)) {
                 $this->setMensagemErro('E71', 'RPS: ' . $oRps->numero);
             }
             $aNumeracaoRPS[$oRps->numero] = NULL;
         }
         if (strlen($oRps->serie) > 5) {
             $this->setMensagemErro('E97', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->tipo)) {
             $this->setMensagemErro('E12', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->natureza_operacao)) {
             $this->setMensagemErro('E3', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->natureza_operacao, array(1, 2, 3, 4, 5, 6))) {
                 $this->setMensagemErro('E144', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->optante_simples_nacional)) {
             $this->setMensagemErro('E8', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->optante_simples_nacional, array(1, 2))) {
                 $this->setMensagemErro('E146', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->incentivador_cultural)) {
             $this->setMensagemErro('E9', 'RPS: ' . $oRps->numero);
         } else {
             if (!in_array($oRps->incentivador_cultural, array(1, 2))) {
                 $this->setMensagemErro('E147', 'RPS: ' . $oRps->numero);
             }
         }
         if (empty($oRps->data_emissao)) {
             $this->setMensagemErro('E14', 'RPS: ' . $oRps->numero);
         }
         if (!in_array($oRps->status, array(1, 2))) {
             $this->setMensagemErro('E68', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->data_emissao->format('Ymd') > date('Ymd')) {
             $this->setMensagemErro('E16', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->prestador->cnpj == $oRps->tomador->cpf_cnpj) {
             $this->setMensagemErro('E52', 'RPS: ' . $oRps->numero);
         }
         // validação dos valores se float
         $oNumeroFloat = new Zend_Validate_Float();
         if ($oRps->servico->valores->valor_servicos <= 0) {
             $this->setMensagemErro('E18', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_servicos)) {
             $this->setMensagemErro('E100', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_servicos <= 0) {
             $this->setMensagemErro('E18', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_deducoes > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E19', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_deducoes < 0) {
             $this->setMensagemErro('E20', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_deducoes)) {
             $this->setMensagemErro('E101', 'RPS: ' . $oRps->numero);
         }
         $fTotalDesconto = $oRps->servico->valores->desconto_incondicionado + $oRps->servico->valores->desconto_condicionado;
         if ($fTotalDesconto > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E21', 'RPS: ' . $oRps->numero);
         }
         if ($fTotalDesconto < 0) {
             $this->setMensagemErro('E22', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($fTotalDesconto)) {
             $this->setMensagemErro('E102', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_pis < 0) {
             $this->setMensagemErro('E23', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_pis)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_cofins < 0) {
             $this->setMensagemErro('E24', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_cofins)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_inss < 0) {
             $this->setMensagemErro('E25', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_inss)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_ir < 0) {
             $this->setMensagemErro('E26', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_ir)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->valor_csll < 0) {
             $this->setMensagemErro('E27', 'RPS: ' . $oRps->numero);
         }
         if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_csll)) {
             $this->setMensagemErro('E103', 'RPS: ' . $oRps->numero);
         }
         if (!in_array($oRps->servico->valores->iss_retido, array(1, 2))) {
             $this->setMensagemErro('E36', 'RPS: ' . $oRps->numero);
         }
         if ($oRps->servico->valores->iss_retido == 1) {
             if ($oRps->servico->valores->valor_iss_retido <= 0) {
                 $this->setMensagemErro('E40', 'RPS: ' . $oRps->numero);
             }
             if (!$oNumeroFloat->isValid($oRps->servico->valores->valor_iss_retido)) {
                 $this->setMensagemErro('E153', 'RPS: ' . $oRps->numero);
             }
             if (strlen(DBSeller_Helper_Number_Format::unmaskCPF_CNPJ($oRps->tomador->cpf_cnpj)) != 14) {
                 $this->setMensagemErro('E39', 'RPS: ' . $oRps->numero . ". Serviços tomados por pessoa Física não pode reter iss");
             }
         }
         if ($oRps->servico->valores->iss_retido == 1 && $oRps->servico->valores->valor_iss_retido > $oRps->servico->valores->valor_servicos) {
             $this->setMensagemErro('E99', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->servico->discriminacao)) {
             $this->setMensagemErro('E41', 'RPS: ' . $oRps->numero);
         }
         if (!empty($oContribuinte)) {
             $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal();
             $aServicos = Contribuinte_Model_Servico::getByIm($iInscricaoMunicipal);
             // Valida se o prestador de serviço pode atuar no município
             if (empty($aServicos)) {
                 $this->setMensagemErro('E17', 'RPS: ' . $oRps->numero);
             }
             // Valida se o prestador do serviço é emissor de NFSE
             $iTipoEmissaoNfse = Contribuinte_Model_ContribuinteAbstract::TIPO_EMISSAO_NOTA;
             if ($oContribuinte->getTipoEmissao($iInscricaoMunicipal) != $iTipoEmissaoNfse) {
                 $this->setMensagemErro('E138', 'RPS: ' . $oRps->numero);
             }
             // Valida a competência
             $oCompetencia = new Contribuinte_Model_Competencia($oRps->data_emissao->format('Y'), $oRps->data_emissao->format('m'), $oContribuinte);
             if (empty($oCompetencia) || $oCompetencia->existeGuiaEmitida()) {
                 $this->setMensagemErro(null, "A competência da RPS \"{$oRps->numero}\" é inválida, já existe Guia Emitida.");
             }
         }
         // Valida se a data é maior que a atual
         if ($oRps->data_emissao->format('Y-m') > date('Y-m')) {
             $this->setMensagemErro('E2', 'RPS: ' . $oRps->numero);
         }
         // Valida se já existe na base de dados
         $oTipoRps = Administrativo_Model_ParametroPrefeituraRps::getByTipoNfse($oRps->tipo);
         $iTipoRps = 0;
         // Valida o tipo de RPS
         if (is_object($oTipoRps)) {
             $iTipoRps = $oTipoRps->getEntity()->getTipoEcidade($oRps->tipo);
         }
         if ($iTipoRps == 0) {
             $this->setMensagemErro('E13', 'RPS: ' . $oRps->numero);
         }
         // Verifica se a numeração do AIDOF é válida
         $oAidof = new Administrativo_Model_Aidof();
         $lVerificaNumeracaoRps = $oAidof->verificarNumeracaoValidaParaEmissaoDocumento($oSessao->contribuinte->getInscricaoMunicipal(), $oRps->numero, $iTipoRps);
         if ($lVerificaNumeracaoRps === FALSE) {
             $this->setMensagemErro('E90', 'RPS: ' . $oRps->numero);
         }
         $lExisteRps = Contribuinte_Model_Nota::existeRps($oSessao->contribuinte, $oRps->numero, $oRps->tipo);
         if ($lExisteRps) {
             $this->setMensagemErro('E10', 'RPS: ' . $oRps->numero);
         }
         if (empty($oRps->servico->atividade)) {
             $this->setMensagemErro('E31', 'RPS: ' . $oRps->numero);
         } else {
             if (strlen($oRps->servico->atividade) > 5) {
                 $this->setMensagemErro('E104', 'RPS: ' . $oRps->numero);
             }
             // Valida Grupo de Serviço/Atividade
             if (!empty($iInscricaoMunicipal)) {
                 $oServico = Contribuinte_Model_Servico::getServicoPorAtividade($iInscricaoMunicipal, $oRps->servico->atividade);
                 if (!$oServico) {
                     $this->setMensagemErro('E30', 'RPS: ' . $oRps->numero);
                 }
             }
         }
         if (empty($oRps->servico->codigo_cnae)) {
             $this->setMensagemErro('E33', 'RPS: ' . $oRps->numero);
         } else {
             if (strlen($oRps->servico->codigo_cnae) > 7) {
                 $this->setMensagemErro('E105', 'RPS: ' . $oRps->numero);
             }
         }
         if (!empty($oRps->servico->ibge_municipio)) {
             if (strlen($oRps->servico->ibge_municipio) > 7) {
                 $this->setMensagemErro('E108', 'RPS: ' . $oRps->numero);
             }
             // 2 = fora do municipio
             if ($oRps->natureza_operacao == 2 && $oRps->servico->ibge_municipio == $this->oDadosPrefeitura->getIbge()) {
                 $this->setMensagemErro('E110', 'RPS: ' . $oRps->numero);
             }
         }
         // Validar IBGE Prefeitura
         if ($oRps->natureza_operacao == 1 && $this->oDadosPrefeitura->getIbge() !== $oRps->servico->ibge_municipio) {
             $this->setMensagemErro('E42', 'RPS: ' . $oRps->numero);
         }
         if (strlen($oRps->construcao_civil->art) > 15) {
             $this->setMensagemErro('E130', 'RPS: ' . $oRps->numero);
         }
         if (strlen($oRps->construcao_civil->codigo_obra) > 15) {
             $this->setMensagemErro('E129', 'Rps: ' . $oRps->numero);
         }
         if (count($this->aMensagensErroValidacao) >= 50) {
             $this->setMensagemErro('E49', '', TRUE);
         }
     }
     // Se existirem erros executa uma exceção com a lista de erros
     if (count($this->aMensagensErroValidacao) > 0) {
         return FALSE;
     }
     return TRUE;
 }
 /**
  * metodo responsável por gerar as permissoes do usuario
  *
  * @return Administrativo_Model_UsuarioContribuinte
  */
 protected function definePermissoes()
 {
     if ($this->getId() == null) {
         // verifica se o tipo de usuário é Contador e e se for vincula as empresas enviadas pelo e-cidade
         if ($this->getTipo() == Administrativo_Model_TipoUsuario::$CONTADOR) {
             $empresas = Administrativo_Model_Empresa::getByCnpj($this->getCnpj());
             // vincula ações de contribuintes
             $this->vinculaEmpresas($empresas);
         }
         // verifica se o usuário é do tipo Contribuinte para vincular a empresa
         if ($this->getTipo() == Administrativo_Model_TipoUsuario::$CONTRIBUINTE) {
             $oEmpresa = Contribuinte_Model_Contribuinte::getByCpfCnpj($this->getCnpj());
             if (!empty($oEmpresa)) {
                 $uc = new Administrativo_Model_UsuarioContribuinte();
                 $uc->setIm($oEmpresa->getInscricaoMunicipal());
                 $uc->setUsuario($this->entity);
                 $uc->setHabilitado(true);
                 $this->addUsuarioContribuinte($uc);
             }
         }
         // vincula ações administrativas
         $acoes = $this->getPerfil()->getAcoes();
         $acoes_adm = array();
         foreach ($acoes as $a) {
             if (strtolower($a->getControle()->getModulo()->getNome()) == 'administrativo' || $a->getId() == 37) {
                 $acoes_adm[] = $a;
             }
         }
         $this->adicionaAcoes($acoes_adm);
     }
     return $this;
 }
 /**
  * Importacao de arquivo [Json]
  *
  * @throws Exception
  */
 public function processarArquivoAction()
 {
     parent::noLayout();
     $oFormImportacaoDms = new Contribuinte_Form_ImportacaoArquivo();
     $oFormImportacaoDms->renderizaCamposDms();
     $oDoctrine = Zend_Registry::get('em');
     $oDoctrine->getConnection()->beginTransaction();
     try {
         // Id do usuário logado
         $oContador = $this->oUsuario;
         $iCodigoUsuario = $this->usuarioLogado->getId();
         $oContribuinteLogado = $this->oContribuinte;
         $oImportacao = new Contribuinte_Model_ImportacaoDms();
         if (!$oFormImportacaoDms->arquivo->isUploaded()) {
             throw new Exception($this->translate->_('Informe um arquivo válido.'));
         }
         $sArquivoPdfBase64 = base64_encode(file_get_contents($_FILES['arquivo']['tmp_name']));
         $sNomeArquivo = $_FILES['arquivo']['name'];
         // Seta a inscrição municipal do contribuinte, caso seja contador seta nulo
         $oRetorno = Contribuinte_Model_ImportarDmsEcidade::processarArquivo($oContador, $oContribuinteLogado, $sArquivoPdfBase64);
         if ($oRetorno->bStatus == FALSE) {
             throw new Exception($oRetorno->sMensagem);
         }
         if (!is_array($oRetorno->aDados)) {
             $sMensagem = 'Arquivo processado de forma incorreta! Favor entre em contato com o suporte.';
             throw new Exception($this->translate->_($sMensagem));
         }
         // Varre os contadores / escritórios
         $oEscritorio = NULL;
         $aImportacaoNotas = NULL;
         $fValorTotalImportado = NULL;
         $fValorTotalImpostoImportado = NULL;
         $iQuantidadeNotas = NULL;
         foreach ($oRetorno->aDados['contadores'] as $aContadores) {
             // Dados do contador / escritório
             $oEscritorio = isset($aContadores['dados']) ? $aContadores['dados'] : NULL;
             if (!isset($aContadores['contribuintes']) || count($aContadores) < 1) {
                 throw new Exception('Arquivo inconsistente, não foi encontrado contribuintes.');
             }
             // Varre os contribuintes do contador
             foreach ($aContadores['contribuintes'] as $aContribuintes) {
                 // Totalizadores
                 $fValorTotalImpostoImportado = 0;
                 $fValorTotalImportado = 0;
                 $iQuantidadeNotas = 0;
                 $iTotalImportadas = 0;
                 // Dados
                 $aPlanilhas = $aContribuintes['planilha'];
                 // Varre as planilhas do contribuinte
                 foreach ($aPlanilhas as $sOperacao => $oPlanilha) {
                     if (isset($oPlanilha->aNotas) && count($oPlanilha->aNotas) > 0) {
                         $oContribuinte = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($oPlanilha->iInscricao);
                         $oDms = new Contribuinte_Model_Dms();
                         $oDms->setAnoCompetencia($oPlanilha->iAnoCompetencia);
                         $oDms->setMesCompetencia($oPlanilha->iMesCompetencia);
                         $oDms->setDataOperacao(new DateTime($oPlanilha->dtDatausu));
                         $oDms->setStatus('aberto');
                         $oDms->setOperacao($sOperacao);
                         $oDms->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte());
                         $oDms->setIdUsuario($iCodigoUsuario);
                         // Verifica se existe notas para o contribuinte
                         if (isset($aContribuintes['notas'][$sOperacao])) {
                             // Varre as notas do contribuinte
                             foreach ($aContribuintes['notas'][$sOperacao] as $oNota) {
                                 // Dados Nota
                                 $oGrupoDocumento = Contribuinte_Model_Nota::getTipoNota($oNota->iCodigoTipoNota);
                                 $oDmsNota = new Contribuinte_Model_DmsNota();
                                 $oDmsNota->setNotaNumero($oNota->sNumeroNota);
                                 $oDmsNota->setNotaSerie($oNota->sSerie);
                                 $oDmsNota->setNotaData(new DateTime(date('Y-m-d', $oNota->sDataEmissao->iTimeStamp)));
                                 $oDmsNota->setGrupoDocumento($oGrupoDocumento->codigo_grupo);
                                 $oDmsNota->setTipoDocumento($oNota->iCodigoTipoNota);
                                 $oDmsNota->setSituacaoDocumento($oNota->sSituacao);
                                 $oDmsNota->setEmiteGuia($oNota->lEmiteGuia);
                                 // Dados Servico
                                 $bTomadorPagaIss = empty($oNota->bRetido) ? FALSE : TRUE;
                                 // Formatada dados
                                 $dServicoData = new DateTime(date('Y-m-d', $oNota->sDataPrestacao->iTimeStamp));
                                 // Validação dos valores das notas
                                 $oValidacaoValores = Contribuinte_model_dms::emissaoManualCalculaValoresDms($bTomadorPagaIss, DBSeller_Helper_Number_Format::toMoney($oNota->fValorServico), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDeducao), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDescontoCondicional), DBSeller_Helper_Number_Format::toMoney($oNota->fValorDescontoIncondicional), DBSeller_Helper_Number_Format::toMoney($oNota->fValorAliquota));
                                 // Verifica valores do imposto
                                 if (DBSeller_Helper_Number_Format::toMoney($oNota->fValorBaseCalculo) != $oValidacaoValores['s_base_calculo'] || DBSeller_Helper_Number_Format::toMoney($oNota->fValorIssqn) != $oValidacaoValores['s_valor_imposto']) {
                                     $sMensagem = 'Arquivo possui valores inconsistentes!<br>';
                                     $sMensagem .= "Nota: {$oNota->sNumeroNota} Série: {$oNota->sSerie}";
                                     throw new Exception($this->translate->_($sMensagem));
                                 }
                                 // Dados do documento de DMS
                                 $oDmsNota->setServicoData($dServicoData);
                                 $oDmsNota->setServicoImpostoRetido($bTomadorPagaIss);
                                 $oDmsNota->setServicoCodigoServico($oNota->iCodigoAtividade);
                                 $oDmsNota->setDescricaoServico($oNota->sDescricaoServico);
                                 $oDmsNota->setServicoValorPagar($oNota->fValorServico);
                                 $oDmsNota->setServicoValorLiquido($oNota->fValorNota);
                                 $oDmsNota->setServicoValorDeducao($oNota->fValorDeducao);
                                 $oDmsNota->setServicoValorCondicionado($oNota->fValorDescontoCondicional);
                                 $oDmsNota->setServicoDescontoIncondicionado($oNota->fValorDescontoIncondicional);
                                 $oDmsNota->setServicoBaseCalculo($oNota->fValorBaseCalculo);
                                 $oDmsNota->setServicoValorAliquota($oNota->fValorAliquota);
                                 $oDmsNota->setServicoValorImposto($oNota->fValorIssqn);
                                 $oDmsNota->setNumpre(0);
                                 // Campos novos
                                 $oDmsNota->setNaturezaOperacao($oNota->iNaturezaOperacao);
                                 $oDmsNota->setServicoCodigoObra($oNota->sCodigoObra);
                                 $oDmsNota->setServicoArt($oNota->sArt);
                                 $oDmsNota->setServicoInformacoesComplementares($oNota->sInformacoesComplementares);
                                 // Verifica a operação
                                 if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) {
                                     $iInscricaoPrestador = $oPlanilha->iInscricao;
                                     $sCpfCnpjTomador = $oNota->iCpfCnpjTomador;
                                     $oDadosPrestador = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($iInscricaoPrestador);
                                 } else {
                                     $oDadosPrestador = Contribuinte_Model_Contribuinte::getByCpfCnpj($oNota->iCpfCnpjTomador);
                                     $sCpfCnpjTomador = $oContribuinte->getCgcCpf();
                                 }
                                 // Verifica o prestador
                                 if (empty($oDadosPrestador)) {
                                     $sMensagem = 'Arquivo processado de forma incorreta!<br>Existem contribuinte inválidos.';
                                     throw new Exception($this->translate->_($sMensagem));
                                 }
                                 // Serviços prestados
                                 if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) {
                                     $oDmsNota->setPrestadorCpfCnpj($oDadosPrestador->getCgcCpf());
                                     $oDmsNota->setPrestadorInscricaoMunicipal($oDadosPrestador->getInscricaoMunicipal());
                                     $oDmsNota->setPrestadorInscricaoEstadual($oDadosPrestador->getInscricaoEstadual());
                                     $oDmsNota->setPrestadorEnderecoRua($oDadosPrestador->getDescricaoLogradouro());
                                     $oDmsNota->setPrestadorEnderecoNumero($oDadosPrestador->getLogradouroNumero());
                                     $oDmsNota->setPrestadorEnderecoComplemento($oDadosPrestador->getLogradouroComplemento());
                                     $oDmsNota->setPrestadorEnderecoBairro($oDadosPrestador->getLogradouroBairro());
                                     $oDmsNota->setPrestadorEnderecoCodigoMunicipio($oDadosPrestador->getCodigoIbgeMunicipio());
                                     $oDmsNota->setPrestadorEnderecoEstado($oDadosPrestador->getEstado());
                                     $oDmsNota->setPrestadorEnderecoCodigoPais($oDadosPrestador->getCodigoPais());
                                     $oDmsNota->setPrestadorEnderecoCEP($oDadosPrestador->getCep());
                                     $oDmsNota->setPrestadorTelefone($oDadosPrestador->getTelefone());
                                     $oDmsNota->setPrestadorEmail($oDadosPrestador->getEmail());
                                 } else {
                                     // Dados Prestador
                                     $oDadosPrestador = Contribuinte_Model_Empresa::getByCgcCpf($oNota->iCpfCnpjTomador);
                                     // Verifica se é prestador do eCidade e NFSe
                                     if (is_object($oDadosPrestador) && isset($oDadosPrestador->eCidade)) {
                                         $oDadosPrestador = $oDadosPrestador->eCidade[0];
                                         $oDmsNota->setPrestadorCpfCnpj($oNota->iCpfCnpjTomador);
                                         $oDmsNota->setPrestadorRazaoSocial($oDadosPrestador->attr('nome'));
                                         $oDmsNota->setPrestadorNomeFantasia($oDadosPrestador->attr('nome_fanta'));
                                         $oDmsNota->setPrestadorInscricaoMunicipal($oDadosPrestador->attr('inscricao'));
                                         $oDmsNota->setPrestadorInscricaoEstadual($oDadosPrestador->attr('inscr_est'));
                                         $oDmsNota->setPrestadorEnderecoRua($oDadosPrestador->attr('logradouro'));
                                         $oDmsNota->setPrestadorEnderecoNumero($oDadosPrestador->attr('numero'));
                                         $oDmsNota->setPrestadorEnderecoComplemento($oDadosPrestador->attr('complemento'));
                                         $oDmsNota->setPrestadorEnderecoBairro($oDadosPrestador->attr('bairro'));
                                         $oDmsNota->setPrestadorEnderecoCodigoMunicipio($oDadosPrestador->attr('cod_ibge'));
                                         $oDmsNota->setPrestadorEnderecoEstado($oDadosPrestador->attr('uf'));
                                         $oDmsNota->setPrestadorEnderecoCodigoPais($oDadosPrestador->attr('cod_pais'));
                                         $oDmsNota->setPrestadorEnderecoCEP($oDadosPrestador->attr('cep'));
                                         $oDmsNota->setPrestadorTelefone($oDadosPrestador->attr('telefone'));
                                         $oDmsNota->setPrestadorEmail($oDadosPrestador->attr('email'));
                                     } else {
                                         $oDmsNota->setPrestadorCpfCnpj($oNota->iCpfCnpjTomador);
                                         $oDmsNota->setPrestadorRazaoSocial($oNota->sNomeRazaoSocial);
                                         $oDmsNota->setPrestadorNomeFantasia($oNota->sNomeRazaoSocial);
                                     }
                                 }
                                 // Dados Tomador
                                 $oDadosTomador = Contribuinte_Model_Empresa::getByCgcCpf($sCpfCnpjTomador);
                                 // Verifica se é tomador do eCidade e NFSe
                                 if (is_object($oDadosTomador) && isset($oDadosTomador->eCidade)) {
                                     $oDadosTomador = $oDadosTomador->eCidade[0];
                                     $oDmsNota->setTomadorCpfCnpj($oDadosTomador->attr('cpf'));
                                     $oDmsNota->setTomadorRazaoSocial($oDadosTomador->attr('nome'));
                                     $oDmsNota->setTomadorNomeFantasia($oDadosTomador->attr('nome_fanta'));
                                     $oDmsNota->setTomadorInscricaoMunicipal($oDadosTomador->attr('inscricao'));
                                     $oDmsNota->setTomadorInscricaoEstadual($oDadosTomador->attr('inscr_est'));
                                     $oDmsNota->setTomadorEnderecoRua($oDadosTomador->attr('logradouro'));
                                     $oDmsNota->setTomadorEnderecoNumero($oDadosTomador->attr('numero'));
                                     $oDmsNota->setTomadorEnderecoComplemento($oDadosTomador->attr('complemento'));
                                     $oDmsNota->setTomadorEnderecoBairro($oDadosTomador->attr('bairro'));
                                     $oDmsNota->setTomadorEnderecoCodigoMunicipio($oDadosTomador->attr('cod_ibge'));
                                     $oDmsNota->setTomadorEnderecoEstado($oDadosTomador->attr('uf'));
                                     $oDmsNota->setTomadorEnderecoCodigoPais($oDadosTomador->attr('cod_pais'));
                                     $oDmsNota->setTomadorEnderecoCEP($oDadosTomador->attr('cep'));
                                     $oDmsNota->setTomadorTelefone($oDadosTomador->attr('telefone'));
                                     $oDmsNota->setTomadorEmail($oDadosTomador->attr('email'));
                                 } else {
                                     if (!isset($oDadosTomador->eNota)) {
                                         $aDadosTomador['t_cnpjcpf'] = $sCpfCnpjTomador;
                                         $aDadosTomador['t_razao_social'] = $oNota->sNomeRazaoSocial;
                                         $oDadosTomador = new Contribuinte_Model_EmpresaBase();
                                         $oDadosTomador->persist($aDadosTomador);
                                         $oDmsNota->setTomadorCpfCnpj($oNota->iCpfCnpjTomador);
                                         $oDmsNota->setTomadorRazaoSocial($oNota->sNomeRazaoSocial);
                                     }
                                 }
                                 // Dados dos usuário e contribuinte
                                 $oDmsNota->setIdUsuario($iCodigoUsuario);
                                 $oDmsNota->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte());
                                 // Incrementa os valores
                                 $fValorTotalImpostoImportado = $fValorTotalImpostoImportado + $oNota->fValorIssqn;
                                 $fValorTotalImportado = $fValorTotalImportado + $oNota->fValorNota;
                                 $iQuantidadeNotas++;
                                 // Se for serviço prestado, verifica se a quantidade de AIDOFs é suficiente para importação
                                 if (strtolower($sOperacao) == Contribuinte_Model_Dms::SAIDA) {
                                     $iTotalNotasImportadas = count($aContribuintes['notas'][$sOperacao]);
                                     $iTotalImportadas = $iTotalImportadas + 1;
                                     $oAidof = new Administrativo_Model_Aidof();
                                     $iQuantidadeNotasEmissao = $oAidof->getQuantidadesNotasEmissao($oPlanilha->iInscricao, $oNota->iCodigoTipoNota);
                                     $iQuantidadeLiberada = $iQuantidadeNotasEmissao - $iTotalImportadas;
                                     if ($iQuantidadeLiberada <= 0) {
                                         $sMensagem = 'Você não possui AIDOFs liberadas para importar os documentos.';
                                         $sMensagem = sprintf($sMensagem, $iQuantidadeLiberada, $iTotalNotasImportadas);
                                         throw new Exception($this->translate->_($sMensagem));
                                     } else {
                                         if ($iQuantidadeLiberada < $iTotalNotasImportadas) {
                                             $sMensagem = 'Você possui apenas "%s" AIDOFs liberadas para importar "%s" documentos.';
                                             $sMensagem = sprintf($sMensagem, $iQuantidadeLiberada, $iTotalNotasImportadas);
                                             throw new Exception($this->translate->_($sMensagem));
                                         }
                                     }
                                     // Valida se a numeração da nota está no intervalo confere com as AIDOF liberadas
                                     $lNumeracaoNotaConfereComAidofLiberada = $oAidof->verificarNumeracaoValidaParaEmissaoDocumento($oDmsNota->getPrestadorInscricaoMunicipal(), $oDmsNota->getNotaNumero(), $oDmsNota->getTipoDocumento());
                                     if (!$lNumeracaoNotaConfereComAidofLiberada) {
                                         $sMensagem = 'O número do documento "%s" não confere com a numeração permitida pelas AIDOF\'s.';
                                         throw new Exception($this->translate->_(sprintf($sMensagem, $oDmsNota->getNotaNumero())));
                                     }
                                 }
                                 // Verifica se ja existe o documento, ignora e anula a planilha
                                 if ($oDmsNota::checarNotaEmitida($oContribuinte, $oNota->iCodigoTipoNota, $oNota->sNumeroNota, NULL, $sOperacao)) {
                                     $sMensagem = 'O documento nº "%s" já consta na base de dados do sistema.';
                                     throw new Exception($this->translate->_(sprintf($sMensagem, $oNota->sNumeroNota)));
                                 } else {
                                     // Adiciona as notas no DMS
                                     $oDmsNota->setDms($oDms->getEntity());
                                     $oDms->addDmsNotas($oDmsNota->getEntity());
                                 }
                                 // Formata os dados
                                 $sCompetenciaImportacao = $oPlanilha->iMesCompetencia . '-' . $oPlanilha->iAnoCompetencia;
                                 // Adiciona os dados do documento na importação
                                 $oImportacaoNotas = new Contribuinte_Model_ImportacaoDmsNota();
                                 $oImportacaoNotas->setNumeroNota($oNota->sNumeroNota);
                                 $oImportacaoNotas->setTipoNota($oNota->iCodigoTipoNota);
                                 $oImportacaoNotas->setValorTotal($oDmsNota->getServicoValorPagar());
                                 $oImportacaoNotas->setValorImposto($oNota->fValorIssqn);
                                 $oImportacaoNotas->setOperacaoNota($sOperacao);
                                 $oImportacaoNotas->setDataEmissaoNota($oDmsNota->getNotaData());
                                 $oImportacaoNotas->setCompetencia($sCompetenciaImportacao);
                                 $oImportacaoNotas->setIdContribuinte($oContribuinte->getIdUsuarioContribuinte());
                                 // Adiciona os dados na lista da importação
                                 $aImportacaoNotas[] = $oImportacaoNotas;
                             }
                         }
                     } else {
                         $sMensagem = 'Nenhum documento foi encontrado para importar.';
                         throw new Exception($this->translate->_($sMensagem));
                     }
                     // Salva o DMS
                     $aCodigosDms[] = $oDms->persist();
                 }
             }
         }
         // Formata os dados
         $sCodigoEscritorio = isset($oEscritorio->iInscricaoMunicipal) ? $oEscritorio->iInscricaoMunicipal : NULL;
         // Prepara informações da importacao
         $oImportacao->setDataOperacao(new DateTime());
         $oImportacao->setValorTotal($fValorTotalImportado);
         $oImportacao->setValorImposto($fValorTotalImpostoImportado);
         $oImportacao->setNomeArquivo($sNomeArquivo);
         $oImportacao->setQuantidadeNotas($iQuantidadeNotas);
         $oImportacao->setIdUsuario($iCodigoUsuario);
         $oImportacao->setCodigoEscritorio($sCodigoEscritorio);
         if (is_array($aImportacaoNotas)) {
             foreach ($aImportacaoNotas as $oNotaImportada) {
                 $oNotaImportada->setImportacaoDms($oImportacao->getEntity());
                 $oImportacao->addImportacaoNotas($oNotaImportada->getEntity());
             }
         }
         // Salva log de importação
         $iCodigoImportacao = $oImportacao->persist();
         // Retorno em Json
         $aRetornoJson['status'] = $oRetorno->bStatus;
         $aRetornoJson['success'] = $oRetorno->sMensagem;
         $aRetornoJson['url'] = $this->view->baseUrl("/contribuinte/dms/comprovante/id/{$iCodigoImportacao}");
         $oDoctrine->getConnection()->commit();
         echo $this->getHelper('json')->sendJson($aRetornoJson);
     } catch (Exception $oErro) {
         $oDoctrine->getConnection()->rollback();
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = $oErro->getMessage();
         echo $this->getHelper('json')->sendJson($aRetornoJson);
         return;
     }
 }