/**
  * Gera guia para substituto tributário
  *
  * @param $notas
  * @param $data
  * @return array
  */
 public function gerarGuiaTomador($notas, $data)
 {
     if ($data == '') {
         $data = new DateTime();
     } else {
         $data = parent::stringToDate($data);
     }
     $cpfcnpj = $notas[0]->getT_cnpjcpf();
     $inscricao = $notas[0]->getT_im();
     $ano_comp = $notas[0]->getAno_comp();
     $mes_comp = $notas[0]->getMes_comp();
     $planilha = Contribuinte_Model_GuiaEcidade::gerarPlanilhaRetencao($cpfcnpj, $inscricao, $ano_comp, $mes_comp);
     $array_servicos = array();
     // Vetor que faz cache das descricoes dos servicos
     foreach ($notas as $n) {
         $this->addNota($n->getEntity());
         $cod_serv = $n->getS_dados_cod_tributacao();
         if (!isset($array_servicos[$cod_serv])) {
             $serv = Contribuinte_Model_Servico::getByCodServico($cod_serv);
             $descr_serv = urlencode($serv[0]->attr('desc_item_servico'));
             $array_servicos[$cod_serv] = $descr_serv;
         }
         Contribuinte_Model_GuiaEcidade::lancarPlanilhaRetencao($planilha, $n, $data, $array_servicos[$cod_serv]);
     }
     $guiaWS = Contribuinte_Model_GuiaEcidade::gerarGuiaTomador($planilha);
     $this->setValorCorrigido($guiaWS->valor_corrigido);
     $this->setValorHistorico($guiaWS->valor_historico);
     $this->setCodigoBarras($guiaWS->codigo_barras);
     $this->setLinhaDigitavel($guiaWS->linha_digitavel);
     $this->setJurosMulta($guiaWS->juros_multa);
     $this->setCodigoGuia($guiaWS->codigo_guia);
     $numpre = each($guiaWS->debitos_guia);
     $this->setNumpre($numpre['value']->iNumpre);
     $this->setAnoComp($ano_comp);
     $this->setMesComp($mes_comp);
     $this->setTipo(self::$TOMADOR);
     $this->setSituacao(self::$ABERTA);
     $this->setTipoDocumentoOrigem(self::$DOCUMENTO_ORIGEM_DMS);
     $this->setIm($inscricao);
     $this->setVencimento($data);
     $this->persist();
     return array('objeto' => $this, 'arquivo' => $guiaWS->arquivo_guia);
 }
 /**
  * Action para montar o formulario de requisica de AIDOF
  *
  * @return void
  */
 public function requisicaoAction()
 {
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $oContribuinte = $this->_session->contribuinte;
     $iInscricaoMunicipal = $oContribuinte->getInscricaoMunicipal();
     $aServicos = Contribuinte_Model_Servico::getByIm($iInscricaoMunicipal);
     // Verifica se a empresa é prestadora de serviços
     if ($aServicos == NULL || empty($aServicos)) {
         $this->view->sMensagemBloqueio = $this->translate->_('Empresa não prestadora de serviço.');
         return;
     }
     // Verifica se a empresa é emissora de NFSe
     $iTipoEmissaoNota = Contribuinte_Model_ContribuinteAbstract::TIPO_EMISSAO_NOTA;
     if ($oContribuinte->getTipoEmissao($iInscricaoMunicipal) != $iTipoEmissaoNota) {
         $this->view->sMensagemBloqueio = $this->translate->_('Empresa não emissora de NFS-E.');
         return;
     }
     $oFormRequisicao = new Contribuinte_Form_RequisicaoRps();
     $oFormRequisicao->setAction($oBaseUrlHelper->baseUrl('/contribuinte/rps/gerar-requisicao'));
     $this->view->oFormRequisicao = $oFormRequisicao;
     $this->view->aTipoDocumento = Contribuinte_Model_nota::getTiposNota(Contribuinte_Model_Nota::GRUPO_NOTA_RPS);
     $this->view->aListaRequisicao = Administrativo_Model_RequisicaoAidof::getRequisicoeseAidofs($iInscricaoMunicipal, NULL, Contribuinte_Model_Nota::GRUPO_NOTA_RPS);
 }
 /**
  * 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());
     }
 }
 /**
  * Retorna os dados do serviço
  */
 private function obtemDadosServico()
 {
     if ($this->entity->getS_dados_cod_tributacao()) {
         $servico = Contribuinte_Model_Servico::getByCodServico($this->entity->getS_dados_cod_tributacao());
         $this->descricao_lista_servico = $servico[0]->attr('desc_item_servico');
     } else {
         $this->descricao_lista_servico = 'Serviço/Atividade Não Informado';
     }
 }
 /**
  * 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;
 }
 /**
  * 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;
 }
 /**
  * Popula o combo de serviços
  *
  * @param integer|null $iCodigoServico código do serviço
  * @return $this
  */
 public function setServico($iCodigoServico = NULL)
 {
     $aServicos = Contribuinte_Model_Servico::getByIm($this->oContribuinte->getInscricaoMunicipal());
     $aDados = array('' => '-- Escolha o Serviço --');
     if (is_array($aServicos)) {
         foreach ($aServicos as $oServico) {
             $sAtividade = strtolower($oServico->attr('atividade'));
             $aDados[$oServico->attr('cod_atividade')] = DBSeller_Helper_String_Format::wordsCap($sAtividade);
         }
     }
     $this->getElement('s_servico_prestado')->addMultiOptions($aDados)->setValue($iCodigoServico);
     return $this;
 }
 /**
  * Geração do relatório de valores por atividade / serviço
  */
 public function valoresAtividadeServicoGerarAction()
 {
     parent::noLayout();
     try {
         $aValidacaoFormulario = self::validarFormulario(Fiscal_Form_Relatorio1::TIPO5);
         if (is_array($aValidacaoFormulario)) {
             exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
         }
         $sNomeArquivo = 'evolucao_arrecadacao_ ' . date('YmdHis') . '.pdf';
         $sCaminhoArquivo = APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}";
         $aParametros = $this->getRequest()->getParams();
         $aFiltros = array('atividade_servico' => 'Atividade / Serviço');
         $sOrdenacao = 'Crescente';
         if (strtoupper($aParametros['ordem']) == 'DESC') {
             $sOrdenacao = 'Decrescente';
         }
         $sFiltro = "Competência {$aParametros['data_competencia_inicial']} até {$aParametros['data_competencia_final']}";
         $sOrdem = $aFiltros[$aParametros['ordenacao']] . " ({$sOrdenacao})";
         $oFpdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oFpdf->setLinhaFiltro('Relatório Evolução de Arrecadação por Atividade/Serviço');
         $oFpdf->setLinhaFiltro('');
         $oFpdf->setLinhaFiltro("FILTRO : {$sFiltro}");
         $oFpdf->setLinhaFiltro("ORDEM : {$sOrdem}");
         $oFpdf->Open($sCaminhoArquivo);
         $oFpdf->carregadados();
         $aDataCompetenciaInicial = explode('/', $aParametros['data_competencia_inicial']);
         $aDataCompetenciaFinal = explode('/', $aParametros['data_competencia_final']);
         $sSql = "SELECT SUM(servico_valor_iss) AS valor_imposto,\n                          servico_codigo_cnae,\n                          documento_competencia_ano,\n                          documento_competencia_mes\n                     FROM view_nota_mais_dms\n                    WHERE documento_emite_guia = TRUE\n                     AND (dms_operacao = 's' OR dms_operacao IS NULL)\n                     AND  documento_situacao NOT IN ('c', 'e')\n                     AND  documento_status_cancelamento = FALSE\n                     AND (documento_competencia_ano || LPAD(CAST(documento_competencia_mes AS VARCHAR), 2, '0'))\n                          BETWEEN ? AND ?\n                 GROUP BY servico_codigo_cnae,\n                          documento_competencia_ano,\n                          documento_competencia_mes ";
         $aDadosRelatorio = array();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         $oStatement = $oConexao->prepare($sSql);
         $oStatement->execute(array("{$aDataCompetenciaInicial[1]}{$aDataCompetenciaInicial[0]}", "{$aDataCompetenciaFinal[1]}{$aDataCompetenciaFinal[0]}"));
         if ($oStatement->rowCount() < 1) {
             throw new Exception('Nenhum Registro encontrado.');
         }
         while ($aNota = $oStatement->fetch()) {
             $oServicos = Contribuinte_Model_Servico::getServicoPorCnae($aNota['servico_codigo_cnae']);
             if (!$oServicos) {
                 throw new Exception("Erro: {$aNota['servico_codigo_cnae']}");
             }
             $sIndice = md5($aNota['servico_codigo_cnae'] . $oServicos->attr('atividade'));
             $aDadosRelatorio[$sIndice]['estrutural'] = $oServicos->attr('estrutural');
             $aDadosRelatorio[$sIndice]['descricao'] = DBSeller_Helper_String_Format::wordsCap($oServicos->attr('atividade'));
             if (!isset($aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']])) {
                 $aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']] = 0;
             }
             $aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']] += $aNota['valor_imposto'];
             if (!isset($aDadosRelatorio[$sIndice]['totalAcumulado'])) {
                 $aDadosRelatorio[$sIndice]['totalAcumulado'] = 0;
             }
             $aDadosRelatorio[$sIndice]['totalAcumulado'] += $aNota['valor_imposto'];
         }
         switch ($aParametros['ordenacao']) {
             case 'atividade_servico':
                 $sOrdenacao = 'estrutural';
                 break;
             case 'valor_total':
                 $sOrdenacao = 'totalAcumulado';
                 break;
         }
         $iComprimentoPagina = $oFpdf->w - $oFpdf->rMargin - $oFpdf->lMargin;
         $aDadosRelatorio = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, $sOrdenacao, $aParametros['ordem'], TRUE);
         // Percorre os registros do relatório
         foreach ($aDadosRelatorio as $aRegistro) {
             $sAtividadeServico = "Atividade / Serviço: {$aRegistro['estrutural']} - {$aRegistro['descricao']}";
             $oFpdf->SetFont('Arial', 'B', 8);
             $oFpdf->Cell($iComprimentoPagina, 5, utf8_decode($sAtividadeServico), 0, 1, 'J');
             $oFpdf->SetFont('Arial', '', 8);
             $aMeses = DBSeller_Helper_Date_Date::getMesesArray();
             $iTamanhoMes = $iComprimentoPagina / count($aMeses);
             // Ordena a lista pelo índice
             ksort($aRegistro['totalAnoMes']);
             // Percorre a lista pelo total por ano/mes
             foreach ($aRegistro['totalAnoMes'] as $iAno => $aAnos) {
                 // Percorre os meses para gerar o cabeçalho de meses
                 foreach ($aMeses as $iMes => $sDescricaoMes) {
                     $oFpdf->SetFont('Arial', 'B', 8);
                     $oFpdf->Cell($iTamanhoMes, 5, utf8_decode(substr($aMeses[$iMes], 0, 3)) . '/' . $iAno . '(R$)', 1, 0, 'C');
                 }
                 $oFpdf->ln();
                 // Percorre os meses para gerar os dados por mês
                 foreach ($aMeses as $iMes => $sMes) {
                     $oFpdf->SetFont('Arial', '', 8);
                     if (!empty($aAnos[$iMes])) {
                         $oFpdf->Cell($iTamanhoMes, 5, DBSeller_Helper_Number_Format::toMoney($aAnos[$iMes], 2), 1, 0, 'R');
                     } else {
                         $oFpdf->Cell($iTamanhoMes, 5, 'S / M', 1, 0, 'C');
                     }
                 }
                 $oFpdf->proximaPagina(1);
                 if (!$oFpdf->lQuebrouPagina) {
                     $oFpdf->Ln(6);
                 }
             }
             if (!$oFpdf->lQuebrouPagina) {
                 $oFpdf->Ln(2);
             }
         }
         $oFpdf->Output();
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['url'] = $this->view->baseUrl('tmp/' . $sNomeArquivo);
         $aRetornoJson['success'] = $this->translate->_('Relatório gerado com sucesso.');
     } catch (Exception $oErro) {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = $this->translate->_($oErro->getMessage());
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Metodo para verificar os parametros da empresa
  * testes:
  * 1 - empresa emissora de dms
  * 2 - empresa prestadora de serviços
  *
  * @param integer
  * @return boolean
  */
 private function verificaParametrosEmpresa($iInscricaoMunicipal)
 {
     $oServicos = Contribuinte_Model_Servico::getByIm($iInscricaoMunicipal, FALSE);
     $oRetorno = new stdClass();
     $oRetorno->lStatus = TRUE;
     if ($this->view->contribuinte && ($oServicos == NULL || empty($oServicos))) {
         $oRetorno->sMensagem = 'Empresa não prestadora de serviços.';
         $oRetorno->lStatus = TRUE;
     }
     if (!$this->view->contribuinte) {
         $oRetorno->sMensagem = 'Empresa não emissora de DMS.';
         $oRetorno->lStatus = TRUE;
     }
     return $oRetorno;
 }
 /**
  * Popula o combo de serviços
  *
  * @param integer $iCodigoServico código do serviço
  * @return $this|void
  */
 public function setServico($iCodigoServico = NULL)
 {
     $aServicos = Contribuinte_Model_Servico::getAll();
     $aDados = array('' => '-- Escolha o Serviço --');
     if (is_array($aServicos)) {
         foreach ($aServicos as $oServico) {
             $sAtividade = strtolower($oServico->attr('atividade'));
             $aDados[$oServico->attr('cod_atividade')] = DBSeller_Helper_String_Format::wordsCap($sAtividade);
         }
     }
     $this->s_servico_prestado->addMultiOptions($aDados);
     $this->s_servico_prestado->setValue($iCodigoServico);
 }
 /**
  * Busca os dados do servico [Json]
  */
 public function getServicoAction()
 {
     $iIdServico = $this->getParam('servico');
     try {
         $aServicos = Contribuinte_Model_Servico::getByIm($this->_session->contribuinte->getInscricaoMunicipal(), FALSE);
         $aDados = array();
         foreach ($aServicos as $oServico) {
             if ($oServico->attr('cod_atividade') == $iIdServico) {
                 $aDados = array('item_servico' => $oServico->attr('desc_item_servico'), 'cod_item_servico' => $oServico->attr('cod_item_servico'), 'estrut_cnae' => $oServico->attr('estrut_cnae'), 'desc_cnae' => $oServico->attr('desc_cnae'), 'deducao' => $oServico->attr('deducao'), 'aliq' => $oServico->attr('aliq'), 'tributacao_municipio' => $oServico->attr('tributacao_municipio'));
                 break;
             }
         }
         echo $this->getHelper('json')->sendJson($aDados);
     } catch (Exception $oError) {
         $aRetorno['erro'] = TRUE;
         if ($oError->getCode() == Global_Lib_Model_WebService::CODIGO_ERRO_CONSULTA_WEBSERVICE) {
             $aRetorno['mensagem'] = "E-cidade temporariamente insdisponível. Emissão bloqueada!";
             $aRetorno['servico'] = $iIdServico;
         } else {
             $aRetorno['mensagem'] = $oError->getMessage();
         }
         echo $this->getHelper('json')->sendJson($aRetorno);
     }
 }