/**
  * Popula o combo tipo_documento com dados do e-Cidade
  *
  * @param integer $iTipoDocumento
  * @return $this|void
  */
 public function setTipoDocumento($iTipoDocumento = NULL)
 {
     $oNota = new Contribuinte_Model_Nota();
     $aTiposDocumentos = $oNota->getTiposNota($oNota::GRUPO_NOTA_ALL);
     $this->getElement('tipo_documento')->addMultiOptions($aTiposDocumentos)->setValue($iTipoDocumento);
     return $this;
 }
 /**
  * Busca os dados necessários para preencher o relatório
  */
 public function consultarAction()
 {
     parent::noLayout();
     $oForm = new Fiscal_Form_RelatorioNfsePeriodo();
     $this->view->form = $oForm;
     try {
         $aParametros = $this->getRequest()->getParams();
         if (!$oForm->isValid($aParametros)) {
             throw new Exception('Informe um período válido!');
         }
         $oNotaModel = new Contribuinte_Model_Nota();
         $aNotas = $oNotaModel->getNotaPorPeriodo($aParametros);
         if (count($aNotas) == 0) {
             throw new Exception('Nenhum registro encontrado!');
         }
         $oArquivoPDF = $this->gerarPdf($aNotas);
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['url'] = $this->view->baseUrl("/fiscal/relatorio-nfse-periodo/download/arquivo/{$oArquivoPDF->filename}");
         $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);
 }
 /**
  * Carrega os tipos que equivalem ao tipo da abrasf no elemento
  * 
  * @param Zend_Form_Element_Select $oElemento
  * @param string $iValor
  * @return Administrativo_Form_ParametroPrefeituraRps
  */
 public function setTiposEcidade(Zend_Form_Element_Select $oElemento, $iValor = '')
 {
     $aTiposNota = Contribuinte_Model_Nota::getTiposNota(Contribuinte_Model_Nota::GRUPO_NOTA_RPS);
     $tipoArrayBIzonho = array('' => 'Escolha') + $aTiposNota;
     $oElemento->addMultiOptions($tipoArrayBIzonho);
     $oElemento->setValue($iValor);
     return $this;
 }
 /**
  * Método que retorna as quantidades de notas pendentes do contribuinte
  *
  * @params integer $iInscricaoMunicipal
  * @params integer $iTipoNota
  * @params string $sGrupoNota
  * @return integer $iQuantidadeNotasEmissao
  */
 public static function getQuantidadeNotasPendentes($iInscricaoMunicipal, $iTipoNota = NULL, $sGrupoNota = NULL)
 {
     $iQuantidadeNotas = Contribuinte_Model_Nota::getNotasEmitidas($iInscricaoMunicipal, 7);
     $iQuantidadeNotasLiberadas = Administrativo_Model_Aidof::getQuantidadesNotasEmissao($iInscricaoMunicipal, $iTipoNota, $sGrupoNota);
     $iQuantidadeNotasEmissao = $iQuantidadeNotasLiberadas - $iQuantidadeNotas;
     $iQuantidadeNotasEmissao = $iQuantidadeNotasEmissao > 0 ? $iQuantidadeNotasEmissao : 0;
     return $iQuantidadeNotasEmissao;
 }
 public function init()
 {
     parent::init();
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $this->setAction($oBaseUrlHelper->baseUrl('/contribuinte/rps/requisicao'));
     // Tipos de Nota do Grupo RPS
     $aTiposDocumento = Contribuinte_Model_Nota::getTiposNota(Contribuinte_Model_Nota::GRUPO_NOTA_RPS);
     // Popula o select com os tipos de nota
     if (is_object($this->tipo_documento) && is_array($aTiposDocumento)) {
         $this->tipo_documento->setMultiOptions($aTiposDocumento);
     }
     return $this;
 }
 public function init()
 {
     parent::init();
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $this->setAction($oBaseUrlHelper->baseUrl('/contribuinte/dms/requisicao'));
     // Tipos de Nota do Grupo DMS
     $aTiposDocumento = Contribuinte_Model_Nota::getTiposNota(Contribuinte_Model_Nota::GRUPO_NOTA_DMS);
     // Popula o select com os tipos de nota
     if (is_object($this->tipo_documento) && is_array($aTiposDocumento)) {
         $this->tipo_documento->setMultiOptions($aTiposDocumento);
     }
     // Alterando a descrição do label
     if (is_object($this->quantidade)) {
         $this->quantidade->setLabel('Quantidade de NF');
     }
     return $this;
 }
 /**
  * Processa a autenticação de NFSe
  */
 public function autenticarPostAction()
 {
     $aDadosRequest = $this->getRequest()->getParams();
     $aRetornoJson['status'] = FALSE;
     $oForm = new Auth_Form_nfse_FormAutenticacao();
     $oForm->populate($aDadosRequest);
     // Valida o "codigo de verificação" ou "número da RPS" está preenchido
     if (!$oForm->getElement('codigo_verificacao')->getValue() && !$oForm->getElement('numero_rps')->getValue()) {
         $aRetornoJson['fields'] = array('codigo_verificacao', 'numero_rps');
         $aRetornoJson['error'][] = $this->translate->_('Informe o Número do RPS ou o Código de Verificação.');
         echo $this->getHelper('json')->sendJson($aRetornoJson);
     }
     // Valida o restante do formulário
     if ($oForm->isValid($aDadosRequest)) {
         $sPrestadorCnpj = $oForm->getElement('prestador_cnpjcpf')->getValue();
         $sNumeroRps = $oForm->getElement('numero_rps')->getValue();
         $sCodigoVerificacao = $oForm->getElement('codigo_verificacao')->getValue();
         if ($sCodigoVerificacao) {
             $uNota = Contribuinte_Model_Nota::getByPrestadorAndCodigoVerificacao($sPrestadorCnpj, $sCodigoVerificacao);
         } else {
             $uNota = Contribuinte_Model_Nota::getByPrestadorAndNumeroRps($sPrestadorCnpj, $sNumeroRps);
         }
         if (is_object($uNota) || is_array($uNota)) {
             // Url criptografada
             $aUrlVerificacao = DBSeller_Helper_Url_Encrypt::encrypt(array('module' => 'default', 'controller' => 'index', 'action' => 'autentica', 'url' => $aDadosRequest));
             $aRetornoJson['status'] = TRUE;
             $aRetornoJson['url'] = $aUrlVerificacao;
         } else {
             $sMensagemErro = 'Nenhum registro foi encontrado, verifique os dados informados e tente novamente.';
             $aRetornoJson['error'][] = $this->translate->_($sMensagemErro);
         }
     } else {
         $aRetornoJson['fields'] = array_keys($oForm->getMessages());
         $aRetornoJson['error'][] = $this->translate->_('Preencha os dados corretamente.');
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Retorna as notas do mes
  *
  * @return array|Contribuinte_Model_Nota[]
  */
 public function getNotas()
 {
     if (count($this->aNotas) == 0) {
         $this->aNotas = Contribuinte_Model_Nota::getNotasRetidasNaCompetenciaDoContribuinte($this->iAnoCompetencia, $this->iMesCompetencia, $this->oContribuinte);
     }
     return $this->aNotas;
 }
 /**
  * Popula o Tipo de Documento
  *
  * @param integer $iTipoDocumento
  * @return $this
  */
 public function setTiposDocumento($iTipoDocumento = NULL)
 {
     $aTipoDocumento = Contribuinte_Model_Nota::getTiposNota(Contribuinte_Model_Nota::GRUPO_NOTA_RPS);
     if (is_object($this->getElement('tipo_nota'))) {
         $this->getElement('tipo_nota')->addMultiOptions($aTipoDocumento)->setValue($iTipoDocumento);
     }
     return $this;
 }
 /**
  * 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;
 }
 /**
  * Prepara os dados para o cancelamento da nota
  * @param string $sParametroArquivo
  */
 public function preparaDados($sParametroArquivo)
 {
     $this->oDadosXML = $this->validaXML($sParametroArquivo);
     /**
      * Verifica se existe inconsistencias
      */
     if (count($this->aInconsistencias) == 0) {
         $sCnpj = (string) $this->oDadosXML->IdentificacaoNfse->Cnpj;
         $sNumero = (string) $this->oDadosXML->IdentificacaoNfse->Numero;
         $iInscricaoMunicipal = (string) $this->oDadosXML->IdentificacaoNfse->InscricaoMunicipal;
         $iNumero = (int) substr($sNumero, 4, 11);
         $aAtributosContriobuinte = array("cnpj_cpf" => $sCnpj, "im" => $iInscricaoMunicipal);
         $sAmbiente = Zend_Controller_Front::getInstance()->getRequest()->getActionName();
         if (DBSeller_Plugin_Auth::checkPermissionWebservice($sCnpj, "webservice/{$sAmbiente}/recepcionar-lote-rps")) {
             $aContribuinte = Administrativo_Model_UsuarioContribuinte::getByAttributes($aAtributosContriobuinte);
             foreach ($aContribuinte as $oContribuinte) {
                 $this->oContribuinte = $oContribuinte;
             }
             /**
              * Verifica se existe contribuinte com o CNPJ e Inscrição Municipal informado
              */
             if (empty($this->oContribuinte)) {
                 $this->adicionarInconsistencia('E44');
                 $this->adicionarInconsistencia('E50');
             } else {
                 $iIdContribuinte = $this->oContribuinte->getId();
                 $aAtributosNota = array("id_contribuinte" => $iIdContribuinte, "nota" => $iNumero);
                 /**
                  * Retornar a entidade do array de notas
                  */
                 $aNotas = Contribuinte_Model_Nota::getByAttributes($aAtributosNota);
                 foreach ($aNotas as $oNota) {
                     $this->oNota = $oNota;
                 }
                 /**
                  * Verifica se existe nota
                  */
                 if (empty($this->oNota)) {
                     $this->adicionarInconsistencia('E78');
                 } else {
                     $bNotaCancelada = $this->oNota->getCancelada();
                     /**
                      * Verifica se a nota já está cancelada
                      */
                     if ($bNotaCancelada) {
                         $this->adicionarInconsistencia('E79');
                     }
                 }
             }
         } else {
             $this->adicionarInconsistencia('E157');
             $this->adicionarInconsistencia('Usuário sem permissão!');
         }
     }
 }
 /**
  * Geração do relatório de retenções
  */
 public function comparativoRetencoesGerarAction()
 {
     parent::noLayout();
     // Parâmetros do formulário
     $sOrdenacaoCampo = $this->getRequest()->getParam('ordenacao');
     $sOrdenacaoDirecao = $this->getRequest()->getParam('ordem');
     $sTipoRelatorio = $this->getRequest()->getParam('tipo_relatorio');
     $sCompetencia = $this->getRequest()->getParam('data_competencia_inicial');
     // Valida formulário
     $aValidacaoFormulario = self::validarFormulario($sTipoRelatorio);
     if (is_array($aValidacaoFormulario)) {
         exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
     }
     try {
         // Separa os meses e anos
         $iCompetenciaMes = intval(substr($sCompetencia, 0, 2));
         $iCompetenciaAno = intval(substr($sCompetencia, -4));
         $sNomeArquivo = 'comparativo_retencoes_' . date('YmdHis') . '.pdf';
         $aDescricaoFiltros = array('cabecalho_contribuinte_cnpjcpf' => 'CNPJ/CPF', 'cabecalho_contribuinte_razao_social' => 'Nome/Razão', 'asc' => 'Crescente', 'desc' => 'Decrescente');
         $aDescricaoRelatorio[Fiscal_Form_Relatorio4::TIPO9] = array('titulo' => 'Documentos Não retidos pelo Tomador e retidos pelo Prestador', 'descricao_cabecalho' => 'Tomador', 'descricao_lista' => 'Prestador');
         $aDescricaoRelatorio[Fiscal_Form_Relatorio4::TIPO10] = array('titulo' => 'Documentos Não retidos pelo Prestador e retidos pelo Tomador', 'descricao_cabecalho' => 'Prestador', 'descricao_lista' => 'Tomador');
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório Comparativo de Retenções');
         $oPdf->setLinhaFiltro($aDescricaoRelatorio[$sTipoRelatorio]['titulo']);
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro("FILTRO: Competência {$sCompetencia}");
         $oPdf->setLinhaFiltro("ORDEM: {$aDescricaoFiltros[$sOrdenacaoCampo]} ({$aDescricaoFiltros[$sOrdenacaoDirecao]})");
         $oPdf->carregaDados();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         try {
             $sSql = self::getSqlRelatorio($sTipoRelatorio);
             $oStatement = $oConexao->prepare($sSql);
             $oStatement->execute(array($iCompetenciaMes, $iCompetenciaAno));
             if ($oStatement->rowCount() < 1) {
                 throw new Exception($this->translate->_('Nenhum registro encontrado.'));
             }
             $aRelatorio = NULL;
             // Varre os registros do relatório
             do {
                 $aRelatorio = $oStatement->fetch();
                 if (empty($aRelatorio)) {
                     continue;
                 }
                 $sContribuinteCnpj = $aRelatorio['cabecalho_contribuinte_cnpjcpf'];
                 $oTipoNota = Contribuinte_Model_Nota::getTipoNota($aRelatorio['lista_documento_tipo']);
                 $aDadosRelatorio[$sContribuinteCnpj]['cabecalho_contribuinte_cnpjcpf'] = $sContribuinteCnpj;
                 $aDadosRelatorio[$sContribuinteCnpj]['cabecalho_contribuinte_razao_social'] = DBSeller_Helper_String_Format::wordsCap($aRelatorio['cabecalho_contribuinte_razao_social']);
                 $aDadosRelatorio[$sContribuinteCnpj]['documentos'][] = array('lista_documento_numero' => $aRelatorio['lista_documento_numero'], 'lista_documento_tipo' => DBSeller_Helper_String_Format::wordsCap($oTipoNota->descricao), 'lista_contribuinte_cnpjcpf' => DBSeller_Helper_Number_Format::maskCPF_CNPJ($aRelatorio['lista_contribuinte_cnpjcpf']), 'lista_contribuinte_razao_social' => DBSeller_Helper_String_Format::wordsCap($aRelatorio['lista_contribuinte_razao_social']), 'lista_contribuinte_contato_telefone' => DBSeller_Helper_Number_Format::maskPhoneNumber($aRelatorio['lista_contribuinte_contato_telefone']), 'lista_servico_valor_servicos' => DBSeller_Helper_Number_Format::toMoney($aRelatorio['lista_servico_valor_servicos'], 2));
             } while ($aRelatorio);
             // Dados do relatorio na ordem informada
             if (isset($aDadosRelatorio) && is_array($aDadosRelatorio)) {
                 $aDadosRelatorioOrdenado = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, $sOrdenacaoCampo, $sOrdenacaoDirecao, FALSE);
             } else {
                 throw new Exception($this->translate->_('Erro ao gerar o relatório.'));
             }
             // Percorre os dados do relatório
             foreach ($aDadosRelatorioOrdenado as $aRelatorioOrdenado) {
                 $sContribuinteCnpj = DBSeller_Helper_Number_Format::maskCPF_CNPJ($aRelatorioOrdenado['cabecalho_contribuinte_cnpjcpf']);
                 $sContribuinteRazao = $aRelatorioOrdenado['cabecalho_contribuinte_razao_social'];
                 $sDescricaoCabecalho = $aDescricaoRelatorio[$sTipoRelatorio]['descricao_cabecalho'];
                 // Divisor com as informações do tomador
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(30, 5, utf8_decode("CPNJ/CPF {$sDescricaoCabecalho}:"));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell(30, 5, utf8_decode($sContribuinteCnpj));
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(33, 5, utf8_decode("Razão Social {$sDescricaoCabecalho}:"));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell(0, 5, utf8_decode($sContribuinteRazao));
                 $oPdf->Ln();
                 if (count($aRelatorioOrdenado['documentos']) > 0) {
                     $sDescricaoLista = $aDescricaoRelatorio[$sTipoRelatorio]['descricao_lista'];
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(28, 5, utf8_decode('Nº do Documento'), 1, 0, 'C');
                     $oPdf->Cell(50, 5, utf8_decode('Tipo de Documento'), 1, 0, 'L');
                     $oPdf->Cell(35, 5, utf8_decode("CNPJ/CPF do {$sDescricaoLista}"), 1, 0, 'L');
                     $oPdf->Cell(110, 5, utf8_decode("Razão Social do {$sDescricaoLista}"), 1, 0, 'L');
                     $oPdf->Cell(30, 5, utf8_decode('Telefone'), 1, 0, 'L');
                     $oPdf->Cell(24, 5, utf8_decode('Valor (R$)'), 1, 0, 'R');
                     $oPdf->Ln(5);
                     foreach ($aRelatorioOrdenado['documentos'] as $aRelatorioDocumento) {
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell(28, 5, utf8_decode($aRelatorioDocumento['lista_documento_numero']), 1, 0, 'C');
                         $oPdf->Cell(50, 5, utf8_decode($aRelatorioDocumento['lista_documento_tipo']), 1, 0, 'L');
                         $oPdf->Cell(35, 5, utf8_decode($aRelatorioDocumento['lista_contribuinte_cnpjcpf']), 1, 0, 'L');
                         $oPdf->Cell(110, 5, utf8_decode($aRelatorioDocumento['lista_contribuinte_razao_social']), 1, 0, 'L');
                         $oPdf->Cell(30, 5, utf8_decode($aRelatorioDocumento['lista_contribuinte_contato_telefone']), 1, 0, 'L');
                         $oPdf->Cell(24, 5, utf8_decode($aRelatorioDocumento['lista_servico_valor_servicos']), 1, 0, 'R');
                         $oPdf->Ln(5);
                     }
                     $oPdf->Ln();
                 }
             }
         } catch (Exception $oErro) {
             throw new Exception($oErro->getMessage());
         }
         $oPdf->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'][] = $oErro->getMessage();
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 protected function formatarNumeroNota(Contribuinte_Model_Nota $oNota)
 {
     return $oNota->getCompetenciaAno() . str_pad($oNota->getNotaNumero(), 11, '0', STR_PAD_LEFT);
 }
 /**
  * Geração do relatório de NFSe's
  */
 public function nfseGerarAction()
 {
     parent::noLayout();
     $aValidacaoFormulario = self::validarFormulario();
     if (is_array($aValidacaoFormulario)) {
         exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
     }
     try {
         // Parâmetros do formulário
         $sCompetenciaInicial = $this->getRequest()->getParam('data_competencia_inicial');
         $sCompetenciaFinal = $this->getRequest()->getParam('data_competencia_final');
         $sPrestadorCnpj = $this->getRequest()->getParam('prestador_cnpj');
         $lGuiaEmitida = $this->getRequest()->getParam('guia_emitida') == 1 ? TRUE : FALSE;
         $sGuiaEmitida = $lGuiaEmitida ? 'Sim' : 'Não';
         // Prestador
         $oPrestador = Contribuinte_Model_Contribuinte::getByCpfCnpj($sPrestadorCnpj);
         // Separa os meses e anos
         $iCompetenciaInicialMes = intval(substr($sCompetenciaInicial, 0, 2));
         $iCompetenciaFinalMes = intval(substr($sCompetenciaFinal, 0, 2));
         $iCompetenciaInicialAno = intval(substr($sCompetenciaInicial, -4));
         $iCompetenciaFinalAno = intval(substr($sCompetenciaFinal, -4));
         $sNomeArquivo = 'relatorio_nfse_' . date('YmdHis') . '.pdf';
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('P');
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório de NFSe');
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro('FILTROS:');
         $oPdf->setLinhaFiltro("  CNPJ Prestador {$sPrestadorCnpj}");
         $oPdf->setLinhaFiltro("  Competência de {$sCompetenciaInicial} à {$sCompetenciaFinal}");
         $oPdf->setLinhaFiltro("  Guia Emitida? {$sGuiaEmitida}");
         $oPdf->carregaDados();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         try {
             $lExistemRegistros = FALSE;
             // Prepara a consulta na base de dados
             $sSql = self::getSqlRelatorio2($lGuiaEmitida);
             $oStatement = $oConexao->prepare($sSql);
             // Limpa as máscaras do CNPJ
             $sPrestadorCnpj = DBSeller_Helper_Number_Format::getNumbers($sPrestadorCnpj);
             // Varre os anos
             for ($iAno = 0; $iAno <= $iCompetenciaFinalAno - $iCompetenciaInicialAno; $iAno++) {
                 $iAnoLoop = intval($iCompetenciaInicialAno) + $iAno;
                 // Varre os meses
                 for ($iMesLoop = 1; $iMesLoop <= 12; $iMesLoop++) {
                     // Ignora os meses anteriores e seguintes aos meses inicial e final
                     if ($iAnoLoop == $iCompetenciaInicialAno && $iMesLoop < $iCompetenciaInicialMes || $iAnoLoop == $iCompetenciaFinalAno && $iMesLoop > $iCompetenciaFinalMes) {
                         continue;
                     }
                     // Executa a consulta na base de dados com os parâmetros: cnpj, mês e ano da competência
                     $oStatement->execute(array($iMesLoop, $iAnoLoop, $sPrestadorCnpj, $iMesLoop, $iAnoLoop, $sPrestadorCnpj));
                     // Ignora loop caso não possua registros
                     if ($oStatement->rowCount() < 1) {
                         continue;
                     }
                     $lExistemRegistros = TRUE;
                     // Zera os dados
                     $aRelatorio = NULL;
                     $aDadosRelatorio = NULL;
                     // Monta os dados do relatório com o índice para ordenação
                     do {
                         // Busca os dados na base de dados
                         $aRelatorio = $oStatement->fetch();
                         // Ignora a busca caso não existam resultados
                         if (empty($aRelatorio)) {
                             continue;
                         }
                         // Dados do Prestador
                         $sPrestadorCnpjCpf = $aRelatorio['prestador_cnpjcpf'];
                         $sPrestadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($sPrestadorCnpjCpf);
                         $sPrestadorInscricaoMunicipal = $aRelatorio['prestador_inscricao_municipal'];
                         $sPrestadorRazaoSocial = $aRelatorio['prestador_razao_social'];
                         $sPrestadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($sPrestadorRazaoSocial);
                         $sPrestadorMunicipioUf = $aRelatorio['prestador_endereco_municipio'];
                         $sPrestadorMunicipioUf = DBSeller_Helper_String_Format::wordsCap($sPrestadorMunicipioUf);
                         $sPrestadorMunicipioUf = "{$sPrestadorMunicipioUf}/{$aRelatorio['prestador_endereco_uf']}";
                         $sPrestadorTelefone = $aRelatorio['prestador_contato_telefone'];
                         $sPrestadorTelefone = DBSeller_Helper_Number_Format::maskPhoneNumber($sPrestadorTelefone);
                         $sPrestadorDocumentoNumero = $aRelatorio['prestador_documento_numero'];
                         $oPrestadorDocumentoData = new DateTime($aRelatorio['prestador_documento_data']);
                         $sPrestadorDocumentoTipo = $aRelatorio['prestador_documento_tipo'];
                         $sPrestadorDocumentoValor = $aRelatorio['prestador_valor_servico'];
                         $sPrestadorDocumentoValor = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoValor, 2);
                         $sPrestadorDocumentoAliquota = $aRelatorio['prestador_valor_aliquota'];
                         $sPrestadorDocumentoAliquota = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoAliquota, 2);
                         $sPrestadorDocumentoIss = $aRelatorio['prestador_valor_iss'];
                         $sPrestadorDocumentoIss = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoIss, 2);
                         $sPrestadorDocumentoIssRetido = $aRelatorio['prestador_iss_retido'] ? 'Não' : 'Sim';
                         // Dados Tomador
                         $sTomadorCnpjCpf = $aRelatorio['tomador_cnpjcpf'];
                         $sTomadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($sTomadorCnpjCpf);
                         $sTomadorInscricaoMunicipal = $aRelatorio['tomador_inscricao_municipal'];
                         $sTomadorRazaoSocial = $aRelatorio['tomador_razao_social'];
                         $sTomadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($sTomadorRazaoSocial);
                         $sTomadorMunicipioUf = $aRelatorio['tomador_endereco_municipio'];
                         $sTomadorMunicipioUf = DBSeller_Helper_String_Format::wordsCap($sTomadorMunicipioUf);
                         $sTomadorMunicipioUf = "{$sTomadorMunicipioUf}/{$aRelatorio['tomador_endereco_uf']}";
                         $sTomadorTelefone = $aRelatorio['tomador_contato_telefone'];
                         $sTomadorTelefone = DBSeller_Helper_Number_Format::maskPhoneNumber($sTomadorTelefone);
                         $sTomadorDocumentoNumero = $aRelatorio['tomador_documento_numero'];
                         $oTomadorDocumentoData = new DateTime($aRelatorio['tomador_documento_data']);
                         $sTomadorDocumentoTipo = $aRelatorio['tomador_documento_tipo'];
                         $sTomadorDocumentoValor = $aRelatorio['tomador_valor_servico'];
                         $sTomadorDocumentoValor = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoValor, 2);
                         $sTomadorDocumentoAliquota = $aRelatorio['tomador_valor_aliquota'];
                         $sTomadorDocumentoAliquota = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoAliquota, 2);
                         $sTomadorDocumentoIss = $aRelatorio['tomador_valor_iss'];
                         $sTomadorDocumentoIss = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoIss, 2);
                         $sTomadorDocumentoIssRetido = $aRelatorio['tomador_iss_retido'] ? 'Sim' : 'Não';
                         // Descrição do tipo de documento
                         $oPrestadorDocumentoTipo = Contribuinte_Model_Nota::getTipoNota($sPrestadorDocumentoTipo);
                         $sPrestadorDocumentoTipo = DBSeller_Helper_String_Format::wordsCap($oPrestadorDocumentoTipo->descricao);
                         $oTomadorDocumentoTipo = Contribuinte_Model_Nota::getTipoNota($sTomadorDocumentoTipo);
                         $sTomadorDocumentoTipo = DBSeller_Helper_String_Format::wordsCap($oTomadorDocumentoTipo->descricao);
                         // Indice para evitar a repetição do cabeçalho por prestador+tomador
                         $sIndiceRelatorio = "{$aRelatorio['prestador_cnpjcpf']}_{$aRelatorio['tomador_cnpjcpf']}";
                         // Dados do relatório
                         $aDadosRelatorio[$sIndiceRelatorio]['prestador_cnpjcpf'] = $sPrestadorCnpjCpf;
                         $aDadosRelatorio[$sIndiceRelatorio]['prestador_inscricao_municipal'] = $sPrestadorInscricaoMunicipal;
                         $aDadosRelatorio[$sIndiceRelatorio]['prestador_razao_social'] = utf8_decode($sPrestadorRazaoSocial);
                         $aDadosRelatorio[$sIndiceRelatorio]['prestador_municipio_uf'] = utf8_decode($sPrestadorMunicipioUf);
                         $aDadosRelatorio[$sIndiceRelatorio]['prestador_telefone'] = $sPrestadorTelefone;
                         $aDadosRelatorio[$sIndiceRelatorio]['tomador_cnpjcpf'] = $sTomadorCnpjCpf;
                         $aDadosRelatorio[$sIndiceRelatorio]['tomador_inscricao_municipal'] = $sTomadorInscricaoMunicipal;
                         $aDadosRelatorio[$sIndiceRelatorio]['tomador_razao_social'] = utf8_decode($sTomadorRazaoSocial);
                         $aDadosRelatorio[$sIndiceRelatorio]['tomador_municipio_uf'] = utf8_decode($sTomadorMunicipioUf);
                         $aDadosRelatorio[$sIndiceRelatorio]['tomador_telefone'] = $sTomadorTelefone;
                         $aDadosRelatorio[$sIndiceRelatorio]['documentos'][] = array('prestador_doc_numero' => utf8_decode($sPrestadorDocumentoNumero), 'prestador_doc_data' => $oPrestadorDocumentoData, 'prestador_doc_tipo' => utf8_decode($sPrestadorDocumentoTipo), 'prestador_doc_valor_servico' => utf8_decode($sPrestadorDocumentoValor), 'prestador_doc_valor_aliquota' => utf8_decode($sPrestadorDocumentoAliquota), 'prestador_doc_valor_iss' => utf8_decode($sPrestadorDocumentoIss), 'prestador_doc_iss_retido' => utf8_decode($sPrestadorDocumentoIssRetido), 'tomador_doc_numero' => utf8_decode($sTomadorDocumentoNumero), 'tomador_doc_data' => $oTomadorDocumentoData, 'tomador_doc_tipo' => utf8_decode($sTomadorDocumentoTipo), 'tomador_doc_valor_servico' => utf8_decode($sTomadorDocumentoValor), 'tomador_doc_valor_aliquota' => utf8_decode($sTomadorDocumentoAliquota), 'tomador_doc_valor_iss' => utf8_decode($sTomadorDocumentoIss), 'tomador_doc_iss_retido' => utf8_decode($sTomadorDocumentoIssRetido));
                     } while ($aRelatorio);
                     // Ordena a lista de documentos por número
                     $aDocumentosOrdenados = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio[$sIndiceRelatorio]['documentos'], 'prestador_doc_numero');
                     $aDadosRelatorio[$sIndiceRelatorio]['documentos'] = $aDocumentosOrdenados;
                     // Ordena os dados do relatorio
                     if (isset($aDadosRelatorio) && is_array($aDadosRelatorio)) {
                         $aDadosRelatorio = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, 'prestador_cnpjcpf');
                     } else {
                         throw new Exception($this->translate->_('Erro ao gerar o relatório.'));
                     }
                     // Calcula a metade da página
                     $iMeiaPaginaX = $oPdf->w / 2 - $oPdf->lMargin;
                     // Percorre os dados do relatório
                     foreach ($aDadosRelatorio as $aRelatorioOrdenado) {
                         // Formata o texto da competência
                         $sCompetencia = str_pad($iMesLoop, 2, 0, STR_PAD_LEFT) . "/{$iAnoLoop}";
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(20, 5, utf8_decode('Competência: '));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell(22, 5, $sCompetencia);
                         // Dados da guia do prestador
                         if ($lGuiaEmitida) {
                             $oGuiaPrestador = Contribuinte_Model_Guia::getByCompetenciaAndContribuinte($iAnoLoop, $iMesLoop, $oPrestador, Contribuinte_Model_Guia::$PRESTADOR);
                             if (is_array($oGuiaPrestador) && count($oGuiaPrestador) > 0 && $oGuiaPrestador[0] instanceof Contribuinte_Model_Guia) {
                                 $oGuiaPrestador = reset($oGuiaPrestador);
                                 $oPdf->SetFont('Arial', 'B', 8);
                                 $oPdf->Cell(13, 5, utf8_decode('Numpre: '));
                                 $oPdf->SetFont('Arial', '', 8);
                                 $oPdf->Cell(20, 5, $oGuiaPrestador->getNumpre());
                             }
                         }
                         $oPdf->Ln();
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell($iMeiaPaginaX, 5, 'PRESTADOR', 1, 0, 'L', 1);
                         $oPdf->Cell($iMeiaPaginaX, 5, 'TOMADOR', 1, 0, 'L', 1);
                         $oPdf->Ln();
                         $oPdf->Rect($oPdf->GetX(), $oPdf->GetY(), $iMeiaPaginaX, 25);
                         $oPdf->Rect($iMeiaPaginaX + $oPdf->lMargin, $oPdf->GetY(), $iMeiaPaginaX, 25);
                         $oPdf->Ln(2);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(28, 4, utf8_decode('Inscrição Municipal:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 28, 4, $aRelatorioOrdenado['prestador_inscricao_municipal']);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(28, 4, utf8_decode('Inscrição Municipal:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 28, 4, $aRelatorioOrdenado['tomador_inscricao_municipal']);
                         $oPdf->Ln();
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(16, 4, 'CPNJ/CPF:');
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 16, 4, $aRelatorioOrdenado['prestador_cnpjcpf']);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(16, 4, 'CPNJ/CPF:');
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 16, 4, $aRelatorioOrdenado['tomador_cnpjcpf']);
                         $oPdf->Ln();
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(20, 4, utf8_decode('Razão Social:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['prestador_razao_social']);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(20, 4, utf8_decode('Razão Social:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['tomador_razao_social']);
                         $oPdf->Ln();
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(20, 4, utf8_decode('Município/UF:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['prestador_municipio_uf']);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(20, 4, utf8_decode('Município/UF:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['tomador_municipio_uf']);
                         $oPdf->Ln(5);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(14, 4, utf8_decode('Telefone:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 14, 4, $aRelatorioOrdenado['prestador_telefone']);
                         $oPdf->SetFont('Arial', 'B', 8);
                         $oPdf->Cell(14, 4, utf8_decode('Telefone:'));
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell($iMeiaPaginaX - 14, 4, $aRelatorioOrdenado['tomador_telefone']);
                         $oPdf->Ln(5);
                         if (count($aRelatorioOrdenado['documentos']) > 0) {
                             $aLarguraColuna = array(25, 14, 16, 51, 26, 18, 27, 13);
                             $oPdf->SetFont('Arial', 'B', 8);
                             $oPdf->Cell($aLarguraColuna[0], 5, utf8_decode('Nº do Documento'), 1, 0, 'C', 1);
                             $oPdf->Cell($aLarguraColuna[1], 5, utf8_decode('Origem'), 1, 0, 'L', 1);
                             $oPdf->Cell($aLarguraColuna[2], 5, utf8_decode('Data'), 1, 0, 'L', 1);
                             $oPdf->Cell($aLarguraColuna[3], 5, utf8_decode('Tipo de Documento'), 1, 0, 'L', 1);
                             $oPdf->Cell($aLarguraColuna[4], 5, utf8_decode('Valor Serviço (R$)'), 1, 0, 'R', 1);
                             $oPdf->Cell($aLarguraColuna[5], 5, utf8_decode('Alíquota (%)'), 1, 0, 'R', 1);
                             $oPdf->Cell($aLarguraColuna[6], 5, utf8_decode('Valor Imposto (R$)'), 1, 0, 'R', 1);
                             $oPdf->Cell($aLarguraColuna[7], 5, utf8_decode('Retido'), 1, 0, 'L', 1);
                             $oPdf->Ln(5);
                             // Flag para exibir a cor de fundo nas células
                             $iFundoLinha = 0;
                             // Percorre a lista de documentos
                             foreach ($aRelatorioOrdenado['documentos'] as $aDocumento) {
                                 $lFundoLinha = $iFundoLinha++ % 2 == 0 ? 0 : 1;
                                 // Cor de fundo das linhas (zebra)
                                 $oPdf->SetFont('Arial', '', 8);
                                 $oPdf->MultiCell($aLarguraColuna[0], 10, $aDocumento['prestador_doc_numero'], 1, 'C', $lFundoLinha);
                                 $oPdf->SetY($oPdf->getY() - 10);
                                 $oPdf->SetX($oPdf->getX() + $aLarguraColuna[0]);
                                 $oPdf->Cell($aLarguraColuna[1], 5, 'Prestador', 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[2], 5, $aDocumento['prestador_doc_data']->format('d/m/Y'), 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[3], 5, $aDocumento['prestador_doc_tipo'], 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[4], 5, $aDocumento['prestador_doc_valor_servico'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[5], 5, $aDocumento['prestador_doc_valor_aliquota'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[6], 5, $aDocumento['prestador_doc_valor_iss'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[7], 5, $aDocumento['prestador_doc_iss_retido'], 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Ln(5);
                                 $oPdf->Cell($aLarguraColuna[0], 5, '');
                                 $oPdf->Cell($aLarguraColuna[1], 5, 'Tomador', 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[2], 5, $aDocumento['tomador_doc_data']->format('d/m/Y'), 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[3], 5, $aDocumento['tomador_doc_tipo'], 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[4], 5, $aDocumento['tomador_doc_valor_servico'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[5], 5, $aDocumento['tomador_doc_valor_aliquota'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[6], 5, $aDocumento['tomador_doc_valor_iss'], 1, 0, 'R', $lFundoLinha);
                                 $oPdf->Cell($aLarguraColuna[7], 5, $aDocumento['tomador_doc_iss_retido'], 1, 0, 'L', $lFundoLinha);
                                 $oPdf->Ln(5);
                             }
                             $oPdf->Ln();
                         }
                     }
                 }
             }
         } catch (Exception $oErro) {
             throw new Exception($oErro->getMessage());
         }
         // Verifica se existem registro para gerar o relatório
         if ($lExistemRegistros) {
             $oPdf->Output();
         } else {
             throw new Exception($this->translate->_('Nenhum registro encontrado.'));
         }
         $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'][] = $oErro->getMessage();
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Remove os Meses que existe movimentacao ou foi declarado sem movimento
  *
  * @return $this
  */
 public function removerMesesComMovimentacaoDeNotas()
 {
     $oSession = new Zend_Session_Namespace('nfse');
     $iMesCompetencia = (int) date('m') - 1;
     $iAnoCompetencia = (int) ((int) date('m') == 1 ? date('Y') - 1 : date('Y'));
     $oContribuinte = $oSession->contribuinte;
     $oCompetencia = new Contribuinte_Model_Competencia($iAnoCompetencia, $iMesCompetencia, $oContribuinte);
     $aMeses = DBSeller_Helper_Date_Date::getMesesAnterioresArray($iMesCompetencia);
     $aDeclaracaoSemMovimento = $oCompetencia->getDeclaracaoSemMovimento();
     // Remove os meses que já tem declaracao sem movimento
     if (count($aDeclaracaoSemMovimento) > 0) {
         foreach ($aDeclaracaoSemMovimento as $oDeclaracaoSemMovimento) {
             unset($aMeses[$oDeclaracaoSemMovimento->mes]);
         }
     }
     // Verifica se existem notas lancadas no NFSE
     if (count($aMeses) > 0) {
         foreach ($aMeses as $iMes => $sMes) {
             $aResultadoDms = Contribuinte_Model_Dms::getDadosPorCompetencia($oContribuinte->getContribuintes(), $iAnoCompetencia, $iMes, Contribuinte_Model_Dms::SAIDA);
             // Verifica se tem NFSe lancadas na competência
             $oParametros = new stdClass();
             $oParametros->iMes = $iMes;
             $oParametros->iAno = $iAnoCompetencia;
             $aResultadoNota = Contribuinte_Model_Nota::getByContribuinteAndCompetencia($oContribuinte->getContribuintes(), $oParametros);
             // Limpa os meses
             if (count($aResultadoDms) > 0 || count($aResultadoNota) > 0) {
                 unset($aMeses[$iMes]);
             }
         }
     }
     // Desabilita geração quando não possuir meses válidos
     if (count($aMeses) == 0) {
         $this->getElement('mes_competencia')->setAttrib('disabled', TRUE);
         $this->getElement('btn_competencia')->setAttrib('disabled', TRUE);
     }
     $this->getElement('mes_competencia')->setMultiOptions($aMeses);
     return $this;
 }
 /**
  * Formulário NFSE
  *
  * @param string $sCodigoVerificacao
  * @param string $oContribuinte
  * @return Contribuinte_Form_Nota
  */
 private function formNota($sCodigoVerificacao, $oContribuinte = NULL)
 {
     $oContribuinte = $oContribuinte ?: $this->_session->contribuinte;
     $iMaxNota = 0;
     $iMaxGuia = 0;
     // Calcula quantos dias no passado a nota pode ser emitida
     $oParametrosPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
     $iDiasRetroativosEmissaoNota = $oParametrosPrefeitura->getNotaRetroativa();
     $oDataCorrente = new DateTime();
     $oUltimaGuia = Contribuinte_Model_Guia::getUltimaGuiaNota($oContribuinte);
     $uDataUltimaNota = Contribuinte_Model_Nota::getUltimaNotaEmitidaByContribuinte($oContribuinte->getContribuintes());
     if ($uDataUltimaNota != NULL) {
         $oDiff = $oDataCorrente->diff(new DateTime($uDataUltimaNota), TRUE);
         $iMaxNota = $oDiff->days < $iDiasRetroativosEmissaoNota ? $oDiff->days : $iDiasRetroativosEmissaoNota;
     }
     if (!empty($oUltimaGuia)) {
         $iMes = $oUltimaGuia->getMesComp();
         $iAno = $oUltimaGuia->getAnoComp();
         if ($oUltimaGuia->getMesComp() + 1 > 12) {
             $iMes = 1;
         }
         $iMes = str_pad($iMes, 2, '0', STR_PAD_LEFT);
         $uDataUltimoDiaCompetencia = new Zend_Date("01/{$iMes}/{$iAno}");
         $uDataUltimoDiaCompetencia->sub(-1, Zend_date::MONTH);
         $oDiff = $oDataCorrente->diff(new DateTime($uDataUltimoDiaCompetencia->get('Y-M-d')), TRUE);
         $iMaxGuia = $oDiff->days < $iDiasRetroativosEmissaoNota ? $oDiff->days : $iDiasRetroativosEmissaoNota;
     }
     if ($iMaxNota > $iMaxGuia && $iMaxGuia > 0) {
         $iDiasRetroativosEmissaoNota = $iMaxGuia;
     } else {
         if ($iMaxNota > 0) {
             $iDiasRetroativosEmissaoNota = $iMaxNota;
         } else {
             if (!$iDiasRetroativosEmissaoNota || $iMaxNota == 0) {
                 $iDiasRetroativosEmissaoNota = 0;
             }
         }
     }
     $oDataCorrente = new DateTime();
     $oDataCorrente = $oDataCorrente->sub(date_interval_create_from_date_string("{$iDiasRetroativosEmissaoNota} days"));
     $oForm = new Contribuinte_Form_Nota($sCodigoVerificacao, $oDataCorrente);
     if ($oContribuinte !== NULL) {
         $oParametros = Contribuinte_Model_ParametroContribuinte::getById($oContribuinte->getIdUsuarioContribuinte());
         if ($oParametros instanceof Contribuinte_Model_ParametroContribuinte) {
             $oForm->preencheParametros($oParametros);
         }
     }
     return $oForm;
 }
 /**
  * Página para autenticação de notas
  */
 public function autenticaAction()
 {
     // Desabilita o layout do sistema
     parent::noLayout();
     $sPrestadorCnpjCpf = parent::getParam('prestador_cnpjcpf');
     $sNumeroRps = parent::getParam('numero_rps');
     $sCodigoVerificacao = parent::getParam('codigo_verificacao');
     $sCodVer = parent::getParam('cod_ver');
     $sCpfCnpj = parent::getParam('cpfcnpj');
     if (!empty($sCodigoVerificacao) && !empty($sPrestadorCnpjCpf)) {
         $oNota = Contribuinte_Model_Nota::getByPrestadorAndCodigoVerificacao($sPrestadorCnpjCpf, $sCodigoVerificacao);
     } else {
         if (!empty($sCodVer) && !empty($sCpfCnpj)) {
             $oNota = Contribuinte_Model_Nota::getByPrestadorAndCodigoVerificacao($sCodVer, $sCpfCnpj);
         } else {
             $oNota = Contribuinte_Model_Nota::getByPrestadorAndNumeroRps($sPrestadorCnpjCpf, $sNumeroRps);
         }
     }
     $oPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
     $this->view->aDadosNota = Contribuinte_Model_Nota::getDadosEmissao($sCodigoVerificacao, $oNota, $oPrefeitura);
     $this->view->setBasePath(APPLICATION_PATH . '/modules/contribuinte/views/');
     $sHtml = $this->view->render("pdf/nota_modelo_{$oPrefeitura->getModeloImpressaoNfse()}.phtml");
     echo $sHtml;
 }
 /**
  * Geração do relatório de declarações sem movimento
  */
 public function comparativoDeclaracoesGerarAction()
 {
     parent::noLayout();
     $aValidacaoFormulario = self::validarFormulario();
     if (is_array($aValidacaoFormulario)) {
         exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
     }
     try {
         // Parâmetros do formulário
         $sOrdenacaoCampo = $this->getRequest()->getParam('ordenacao');
         $sOrdenacaoDirecao = $this->getRequest()->getParam('ordem');
         $sCompetencia = $this->getRequest()->getParam('data_competencia_inicial');
         // Separa os meses e anos
         $iCompetenciaMes = intval(substr($sCompetencia, 0, 2));
         $iCompetenciaAno = intval(substr($sCompetencia, -4));
         $sNomeArquivo = 'relatorio_comparativo_declaracoes_' . date('YmdHis') . '.pdf';
         $aDescricaoFiltros = array('tomador_cnpjcpf' => 'CPF/CNPJ', 'tomador_razao_social' => 'Nome/Razão Social Tomador', 'asc' => 'Crescente', 'desc' => 'Decrescente');
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório Comparativo de Declarações');
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro("FILTRO: Competência {$sCompetencia}");
         $oPdf->setLinhaFiltro("ORDEM: {$aDescricaoFiltros[$sOrdenacaoCampo]} ({$aDescricaoFiltros[$sOrdenacaoDirecao]})");
         $oPdf->carregaDados();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         try {
             $sSql = self::getSqlRelatorio();
             $oStatement = $oConexao->prepare($sSql);
             $oStatement->execute(array(Contribuinte_Model_Dms::ENTRADA, $iCompetenciaMes, $iCompetenciaAno));
             if ($oStatement->rowCount() < 1) {
                 throw new Exception('Nenhum registro encontrado.');
             }
             $aRelatorio = NULL;
             // Monta o array com o registros formatados
             do {
                 $aRelatorio = $oStatement->fetch();
                 if (empty($aRelatorio)) {
                     continue;
                 }
                 // Tipo de documento
                 $oDocumentoTipo = Contribuinte_Model_Nota::getTipoNota($aRelatorio['documento_tipo']);
                 $sDocumentoTipo = DBSeller_Helper_String_Format::wordsCap($oDocumentoTipo->descricao);
                 // Formata os dados
                 $iTomadorCnpj = $aRelatorio['tomador_cnpjcpf'];
                 $sTomadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($aRelatorio['tomador_razao_social']);
                 $sPrestadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($aRelatorio['prestador_cnpjcpf']);
                 $sPrestadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($aRelatorio['prestador_razao_social']);
                 $sPrestadorTelefone = $aRelatorio['prestador_contato_telefone'];
                 $sPrestadorTelefone = DBSeller_Helper_Number_Format::maskPhoneNumber($sPrestadorTelefone);
                 $sValorServico = DBSeller_Helper_Number_Format::toMoney($aRelatorio['servico_valor_servicos'], 2);
                 // Dados do relatorio organizado por índice
                 $aDadosRelatorio[$iTomadorCnpj]['tomador_cnpjcpf'] = $iTomadorCnpj;
                 $aDadosRelatorio[$iTomadorCnpj]['tomador_razao_social'] = $sTomadorRazaoSocial;
                 $aDadosRelatorio[$iTomadorCnpj]['documentos'][] = array('documento_numero' => $aRelatorio['documento_numero'], 'documento_tipo' => $sDocumentoTipo, 'prestador_cnpjcpf' => $sPrestadorCnpjCpf, 'prestador_razao_social' => $sPrestadorRazaoSocial, 'prestador_contato_telefone' => $sPrestadorTelefone, 'servico_valor_servicos' => $sValorServico);
             } while ($aRelatorio);
             // Dados do relatorio na ordem informada
             $aDadosRelatorioOrdenado = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, $sOrdenacaoCampo, $sOrdenacaoDirecao, FALSE);
             // Percorre os dados do relatório, já ordenado
             foreach ($aDadosRelatorioOrdenado as $aRelatorioOrdenado) {
                 $sCpfCnpjTomador = DBSeller_Helper_Number_Format::maskCPF_CNPJ($aRelatorioOrdenado['tomador_cnpjcpf']);
                 $sRazaoTomador = $aRelatorioOrdenado['tomador_razao_social'];
                 // Divisor com as informações do tomador
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(29, 5, utf8_decode('CPNJ/CPF Tomador:'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell(30, 5, utf8_decode($sCpfCnpjTomador));
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(32, 5, utf8_decode('Razão Social Tomador:'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell(0, 5, utf8_decode($sRazaoTomador));
                 $oPdf->Ln();
                 // Cabeçalho com a lista de documentos do tomador
                 if (count($aRelatorioOrdenado['documentos']) > 0) {
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(28, 5, utf8_decode('Nº do Documento'), 1, 0, 'C');
                     $oPdf->Cell(50, 5, utf8_decode('Tipo de Documento'), 1, 0, 'L');
                     $oPdf->Cell(35, 5, utf8_decode('CNPJ/CPF do Prestador'), 1, 0, 'L');
                     $oPdf->Cell(110, 5, utf8_decode('Razão Social do Prestador'), 1, 0, 'L');
                     $oPdf->Cell(30, 5, utf8_decode('Telefone'), 1, 0, 'L');
                     $oPdf->Cell(24, 5, utf8_decode('Valor (R$)'), 1, 0, 'R');
                     $oPdf->Ln(5);
                     // Percorre os documentos do tomador
                     foreach ($aRelatorioOrdenado['documentos'] as $aRelatorioDocumento) {
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->Cell(28, 5, utf8_decode($aRelatorioDocumento['documento_numero']), 1, 0, 'C');
                         $oPdf->Cell(50, 5, utf8_decode($aRelatorioDocumento['documento_tipo']), 1, 0, 'L');
                         $oPdf->Cell(35, 5, utf8_decode($aRelatorioDocumento['prestador_cnpjcpf']), 1, 0, 'L');
                         $oPdf->Cell(110, 5, utf8_decode($aRelatorioDocumento['prestador_razao_social']), 1, 0, 'L');
                         $oPdf->Cell(30, 5, utf8_decode($aRelatorioDocumento['prestador_contato_telefone']), 1, 0, 'L');
                         $oPdf->Cell(24, 5, utf8_decode($aRelatorioDocumento['servico_valor_servicos']), 1, 0, 'R');
                         $oPdf->Ln(5);
                     }
                     $oPdf->Ln();
                 }
             }
         } catch (Exception $oErro) {
             throw new Exception($oErro->getMessage());
         }
         // Renderiza o arquivo PDF
         $oPdf->Output();
         // Mensagem de retorno com o link do arquivo PDF
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['url'] = $this->view->baseUrl("tmp/{$sNomeArquivo}");
         $aRetornoJson['success'] = $this->translate->_('Arquivo importado com sucesso.');
     } catch (Exception $oErro) {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = $oErro->getMessage();
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Método para rejeitar a solicitação de cancelamento de NFSE
  */
 public function rejeitarAction()
 {
     parent::noTemplate();
     $aDados = $this->getRequest()->getParams();
     $oForm = new Fiscal_Form_CancelamentoRejeitar();
     $this->view->solicitacao = $aDados;
     $oForm->populate(array('id' => $aDados['id']));
     $this->view->form = $oForm;
     if ($this->getRequest()->isPost()) {
         parent::noLayout();
         try {
             $aDados = $this->getRequest()->getParams();
             $oSolicitacao = Contribuinte_Model_SolicitacaoCancelamento::getById($aDados['id']);
             $oNota = Contribuinte_Model_Nota::getById($oSolicitacao->getNota()->getId());
             $sRetornoEmail = $this->enviarEmailRejeicao($oNota, $oSolicitacao, $aDados['justificativa_fiscal']);
             $sMensagemRetorno = 'Solicitação rejeitada com sucesso!';
             $sMensagemRetorno = is_null($sRetornoEmail) ? $sMensagemRetorno : $sRetornoEmail;
             $oSolicitacao->destroy();
             $aRetornoJson['status'] = TRUE;
             $aRetornoJson['success'] = $sMensagemRetorno;
         } catch (Exception $oError) {
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $oError->getMessage();
         }
         echo $this->getHelper('json')->sendJson($aRetornoJson);
     }
 }
 /**
  * Define os dados dos documentos substituídos
  *
  * @param \Doctrine\DBAL\Statement $oStatement
  * @param array                    $aParametros
  * @throws Exception
  */
 public function setDadosDocumentosSubstituidos(Doctrine\DBAL\Statement $oStatement, array $aParametros)
 {
     $this->SetFont('Arial', 'B', 8);
     $this->SetFillColor(201, 201, 201);
     $this->Cell(0, 5, utf8_decode('LANÇAMENTOS RETIDOS'), 1, 1, 'C', TRUE);
     $this->Ln(1);
     $aLarguraCelulas = array(6, 13, 10, 50, 25, 9, 12, 20, 20, 27, 85);
     $this->SetFillColor(230, 230, 230);
     $this->Cell($aLarguraCelulas[0], 5, utf8_decode('Dia'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[1], 5, utf8_decode('Número'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[2], 5, utf8_decode('Série'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[3], 5, utf8_decode('Tipo'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[4], 5, utf8_decode('Situação'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[5], 5, utf8_decode('Cod.'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[6], 5, utf8_decode('Aliq.(%)'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[7], 5, utf8_decode('Base(R$)'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[8], 5, utf8_decode('ISS(R$)'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[9], 5, utf8_decode('CNPJ Tomador'), 1, NULL, NULL, TRUE);
     $this->Cell($aLarguraCelulas[10], 5, utf8_decode('Razão Tomador'), 1, NULL, NULL, TRUE);
     $this->SetFont('Arial', NULL, 8);
     try {
         // Processa o query
         $oStatement->execute($aParametros);
         if ($oStatement->rowCount() > 0) {
             $fTotalBase = 0;
             $fTotalIss = 0;
             // Varre a lista de documentos
             while ($aNota = $oStatement->fetch()) {
                 // Define o dia da emissão do documento
                 $sDiaEmissaoDocumento = substr($aNota['documento_data'], -2);
                 $this->Ln();
                 $this->Cell($aLarguraCelulas[0], 5, $sDiaEmissaoDocumento, 1, 0, 'C');
                 $this->Cell($aLarguraCelulas[1], 5, $aNota['documento_numero'], 1, 0, 'R');
                 $this->Cell($aLarguraCelulas[2], 5, $aNota['documento_serie'], 1, 0, 'R');
                 // Tipo de documento
                 if ($aNota['documento_classe'] == 'nfse') {
                     $sTipoNota = 'NFSe';
                     if ($aNota['documento_tipo']) {
                         $aTipoNota = Contribuinte_Model_Nota::getDescricaoTipoNota($aNota['documento_tipo']);
                         $sTipoNota = $aTipoNota[$aNota['documento_tipo']];
                     }
                     $this->Cell($aLarguraCelulas[3], 5, $sTipoNota, 1);
                 } else {
                     if ($aNota['documento_classe'] == 'dms' && $aNota['documento_tipo']) {
                         if ($aNota['documento_tipo_descricao']) {
                             $sTipoNota = $aNota['documento_tipo_descricao'];
                         } else {
                             $aTipoNota = Contribuinte_Model_Nota::getDescricaoTipoNota($aNota['documento_tipo']);
                             $sTipoNota = $aTipoNota[$aNota['documento_tipo']];
                         }
                         $this->Cell($aLarguraCelulas[3], 5, $sTipoNota, 1);
                     } else {
                         $this->Cell($aLarguraCelulas[3], 5, '-', 1);
                     }
                 }
                 // Formata dados
                 $sServicoValorAliquota = DBSeller_Helper_Number_Format::toMoney($aNota['servico_valor_aliquota']);
                 $sServicoValorBaseCalculo = DBSeller_Helper_Number_Format::toMoney($aNota['servico_valor_base_calculo']);
                 $sServicoValorIss = DBSeller_Helper_Number_Format::toMoney($aNota['servico_valor_iss']);
                 $sTomadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($aNota['tomador_cnpjcpf']);
                 $sTomadorRazaoSocial = utf8_decode($aNota['tomador_razao_social']);
                 $sTomadorRazaoSocial = substr($sTomadorRazaoSocial, 0, 50);
                 // Trata a situação do documento
                 switch (strtoupper($aNota['documento_situacao'])) {
                     case 'T':
                         $sSituacaoDocumento = utf8_decode('Tributado');
                         break;
                     case 'R':
                         $sSituacaoDocumento = utf8_decode('Retido');
                         break;
                     case 'IS':
                         $sSituacaoDocumento = utf8_decode('Isento');
                         break;
                     case 'E':
                         $sSituacaoDocumento = utf8_decode('Extraviado');
                         break;
                     default:
                         $sSituacaoDocumento = '-';
                 }
                 // ALtera a situação do documento quando a natureza for fora do município
                 if ($aNota['documento_natureza_operacao'] == 2) {
                     $sSituacaoDocumento = utf8_decode('Fora do Município');
                 }
                 // Nota cancelada
                 if ($aNota['documento_status_cancelamento'] == 't' || $aNota['documento_situacao'] == 'c') {
                     $sSituacaoDocumento = utf8_decode('Cancelado');
                 }
                 // Nota substituida
                 if (!empty($aNota['documento_id_nota_substituta'])) {
                     $sSituacaoDocumento = utf8_decode('Substituida');
                 }
                 // Verifica se a nota foi substituida ou cancelada não soma os valores totais
                 if ($aNota['documento_status_cancelamento'] != 't' && empty($aNota['documento_id_nota_substituta'])) {
                     $fTotalBase += $aNota['servico_valor_base_calculo'];
                     $fTotalIss += $aNota['servico_valor_iss'];
                 }
                 $this->Cell($aLarguraCelulas[4], 5, $sSituacaoDocumento, 1, 0, 'L', NULL);
                 $this->Cell($aLarguraCelulas[5], 5, $aNota['servico_item_lista_servico'], 1, 0, 'L', NULL);
                 $this->Cell($aLarguraCelulas[6], 5, $sServicoValorAliquota, 1, 0, 'R', NULL);
                 $this->Cell($aLarguraCelulas[7], 5, $sServicoValorBaseCalculo, 1, 0, 'R', NULL);
                 $this->Cell($aLarguraCelulas[8], 5, $sServicoValorIss, 1, 0, 'R', NULL);
                 $this->Cell($aLarguraCelulas[9], 5, $sTomadorCnpjCpf, 1, 0, 'L', NULL);
                 $this->Cell($aLarguraCelulas[10], 5, $sTomadorRazaoSocial, 1, 0, 'L', NULL);
             }
             $this->SetFont('Arial', 'B', 8);
             $this->Ln();
             $this->Cell(113);
             $this->Cell($aLarguraCelulas[6], 5, 'Total:', 1);
             $this->Cell($aLarguraCelulas[7], 5, DBSeller_Helper_Number_Format::toMoney($fTotalBase), 1, 0, 'R');
             $this->Cell($aLarguraCelulas[8], 5, DBSeller_Helper_Number_Format::toMoney($fTotalIss), 1, 0, 'R');
         } else {
             $this->Ln();
             $this->Cell(0, 5, utf8_decode('Sem Lançamentos no Período'), 1, NULL, 'C');
         }
         $oStatement->closeCursor();
     } catch (Exception $oErro) {
         throw new Exception($oErro->getMessage());
     }
 }
 /**
  * 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());
     }
 }
 /**
  * Exporta os dados para XML
  */
 public function rpsExportarAction()
 {
     parent::noLayout();
     $aParametros = $this->getRequest()->getParams();
     /**
      * Parametros de retorno do AJAX
      */
     $aRetornoJson = array('success' => FALSE, 'message' => NULL);
     /**
      * Verifica se foi informado mês e ano da competência
      */
     if (!empty($aParametros['mes_competencia']) && !empty($aParametros['ano_competencia'])) {
         $oContribuinte = $this->_session->contribuinte;
         $oCompetencia = new StdClass();
         $oCompetencia->iMes = $aParametros['mes_competencia'];
         $oCompetencia->iAno = $aParametros['ano_competencia'];
         $iNumeroRps = !empty($aParametros['numero_rps']) ? $aParametros['numero_rps'] : NULL;
         $aNotas = Contribuinte_Model_Nota::getByContribuinteAndCompetencia($oContribuinte->getContribuintes(), $oCompetencia, $iNumeroRps);
         /**
          * Verifica se existe alguma NFSe para a competência informada
          */
         if (count($aNotas) > 0) {
             $oXml = new DOMDocument("1.0", "UTF-8");
             $oXml->formatOutput = TRUE;
             $oXmlConsultaRPSCompetencia = $oXml->createElement("ii:ConsultaRPSCompetencia");
             $oXmlConsultaRPSCompetencia->setAttribute("xmlns:ii", "urn:DBSeller");
             $oMes = $oXml->createElement("ii:Mes", $oCompetencia->iMes);
             $oAno = $oXml->createElement("ii:Ano", $oCompetencia->iAno);
             $oNoListaNfse = $oXml->createElement('ii:ListaNfse');
             foreach ($aNotas as $oNota) {
                 $oNotaAbrasf = new WebService_Model_NotaAbrasf($oNota);
                 $oNoListaNfse->appendChild($oXml->importNode($oNotaAbrasf->getNota(), true));
             }
             $oXmlConsultaRPSCompetencia->appendChild($oMes);
             $oXmlConsultaRPSCompetencia->appendChild($oAno);
             $oXmlConsultaRPSCompetencia->appendChild($oNoListaNfse);
             $oXml->appendChild($oXmlConsultaRPSCompetencia);
             /**
              * Path do arquivo
              */
             $sNomeArquivo = "lista_rps_{$oCompetencia->iMes}_{$oCompetencia->iAno}.xml";
             $sCaminhoArquivo = TEMP_PATH . "/{$sNomeArquivo}";
             if (file_exists($sCaminhoArquivo)) {
                 unlink($sCaminhoArquivo);
             }
             /**
              * Escreve os dados no arquivo
              */
             $aArquivo = fopen($sCaminhoArquivo, 'w');
             fputs($aArquivo, print_r($oXml->saveXML(), TRUE));
             fclose($aArquivo);
             $aRetornoJson['success'] = TRUE;
             $aRetornoJson['filename'] = $sNomeArquivo;
             $aRetornoJson['message'] = 'Notas exportadas com sucesso.';
         } else {
             $aRetornoJson['message'] = 'Nenhum registro encontrado.';
         }
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Consulta todas as notas de acordo parâmetros informados anteriormente no processaDados
  * @return string
  */
 public function processar()
 {
     try {
         /**
          * Cancela uma nota caso não tiver inconsistencias no processo
          */
         if (count($this->aInconsistencias) == 0) {
             /**
              * Retornar a entidade do array de notas
              */
             if (count($this->aFiltrosConsulta > 0)) {
                 $this->aNotas = Contribuinte_Model_Nota::getNotaByConsultaNfse($this->aFiltrosConsulta);
             }
         }
     } catch (Exception $e) {
         $this->adicionarInconsistencia('E160');
     }
     return $this->retornoWebservice();
 }
 /**
  * Documentação para importação de arquivos
  */
 public function importacaoDocumentacaoAction()
 {
     parent::noTemplate();
     $sFormato = $this->getRequest()->getParam('formato', 'html');
     $oTiposDocumento = new Contribuinte_Model_Nota();
     $this->view->aTiposDocumento = $oTiposDocumento->getDescricaoTipoNota($oTiposDocumento::GRUPO_NOTA_DMS);
     // Ordena por código os tipos de documento
     asort($this->view->aTiposDocumento);
     // Gera o pdf
     if ($sFormato == 'pdf') {
         $sHtml = $this->view->render('dms/importacao-documentacao.phtml');
         $this->renderPdf($sHtml, 'Documentação para Importação de DMS', array('format' => 'A4'));
     }
 }
 /**
  * Método para ver se a nota pode ser cancelada ou não
  * @param object $oContribuinte Model do contribuinte
  * @return boolean
  */
 public function podeCancelar($oContribuinte)
 {
     $oNota = $this->getEntity();
     $lExisteGuia = Contribuinte_Model_Guia::existeGuia($oContribuinte, $oNota->getMes_comp(), $oNota->getAno_comp(), Contribuinte_Model_Guia::$DOCUMENTO_ORIGEM_NFSE);
     $oSolicitacaoCancelamento = Contribuinte_Model_SolicitacaoCancelamento::getByAttribute('nota', $oNota);
     $uDataUltimaNota = Contribuinte_Model_Nota::getUltimaNotaEmitidaByContribuinte($oContribuinte->getContribuintes());
     $oDataUltimaNota = new DateTime($uDataUltimaNota);
     $oCompetencia = new Contribuinte_Model_Competencia($oNota->getAno_comp(), $oNota->getMes_comp(), $oContribuinte);
     $aCompetenciaSemMovimento = $oCompetencia->getDeclaracaoSemMovimento();
     if ($oNota->getAno_comp() < $oDataUltimaNota->format('Y')) {
         return FALSE;
     } else {
         if ($oNota->getAno_comp() == $oDataUltimaNota->format('Y') && $oNota->getMes_comp() < $oDataUltimaNota->format('m')) {
             return FALSE;
         } else {
             if ($oNota->getCancelada() || $lExisteGuia || $oNota->getImportada() || !empty($oSolicitacaoCancelamento)) {
                 return FALSE;
             } else {
                 if (isset($aCompetenciaSemMovimento[0]) && $oNota->getAno_comp() < $aCompetenciaSemMovimento[0]->ano) {
                     return FALSE;
                 } else {
                     if (isset($aCompetenciaSemMovimento[0]) && $oNota->getAno_comp() == $aCompetenciaSemMovimento[0]->ano && $oNota->getMes_comp() <= $aCompetenciaSemMovimento[0]->mes) {
                         return FALSE;
                     }
                 }
             }
         }
     }
     return TRUE;
 }
 /**
  * Action para listagem das guias com substituição tributária
  */
 public function substitutoAction()
 {
     $oGuia = new Contribuinte_Model_Guia();
     $this->view->notas_retidas = Contribuinte_Model_Nota::getNotasRetidasSemGuia($this->_session->im);
     $this->view->guias = $oGuia->getSubstituto($this->_session->im);
 }
 /**
  * Instancia o formulario de emissão de RPS
  *
  * @param string                                  $sCodigoVerificacao Código de Verificação
  * @param Contribuinte_Model_ContribuinteAbstract $oContribuinte      Dados do contribuinte
  * @return Contribuinte_Form_Nota
  */
 private function formNota($sCodigoVerificacao, Contribuinte_Model_ContribuinteAbstract $oContribuinte = NULL)
 {
     // Seta o contribuinte da sessão se não for enviado por parâmetro
     $oContribuinte = $oContribuinte ? $oContribuinte : $this->_session->contribuinte;
     $iIdContribuinte = $oContribuinte->getIdUsuarioContribuinte();
     $maxNota = 0;
     $maxGuia = 0;
     $aListaIdContribuinte = $oContribuinte->getContribuintes();
     // Calcula quantos dias no passado a nota pode ser emtidida
     $oParametrosPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
     $max = $oParametrosPrefeitura->getNotaRetroativa();
     $oUltimaGuia = Contribuinte_Model_Guia::getUltimaGuiaNota($oContribuinte);
     $uDataUltimaNota = Contribuinte_Model_Nota::getUltimaNotaEmitidaByContribuinte($aListaIdContribuinte);
     $dia = new DateTime();
     if ($oUltimaGuia != NULL) {
         if ($oUltimaGuia->getMesComp() + 1 > 12) {
             $iMes = 1;
         } else {
             $iMes = $oUltimaGuia->getMesComp();
         }
         $uDataUltimoDiaCompetencia = new Zend_Date("01/{$iMes}/{$oUltimaGuia->getAnoComp()}");
         $uDataUltimoDiaCompetencia->sub(1, Zend_date::DAY);
         $diff = $dia->diff(new DateTime($uDataUltimoDiaCompetencia->get('YYYY-MM-dd')), TRUE);
         $maxGuia = $diff->d < $max ? $diff->d : $max;
     }
     if ($uDataUltimaNota != NULL) {
         $diff = $dia->diff(new DateTime($uDataUltimaNota), TRUE);
         $maxNota = $diff->d < $max ? $diff->d : $max;
     }
     if ($maxNota - $maxGuia < $maxGuia) {
         $max = $maxGuia - 1;
     } else {
         if ($maxNota > 0) {
             $max = $maxNota;
         } else {
             $max = 0;
         }
     }
     $dia = $dia->sub(new DateInterval('P' . $max . 'D'));
     $oForm = new Contribuinte_Form_Nota($sCodigoVerificacao, $dia, '/contribuinte/rps/index', TRUE);
     if ($oContribuinte !== NULL) {
         $oParametros = Contribuinte_Model_ParametroContribuinte::getById($iIdContribuinte);
         $oForm->preencheParametros($oParametros);
     }
     return $oForm;
 }
 /**
  * Geração do relatório de insconstências nas declarações
  */
 public function inconsistenciasDeclaracoesGerarAction()
 {
     parent::noLayout();
     $aValidacaoFormulario = self::validarFormulario();
     if (is_array($aValidacaoFormulario)) {
         exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
     }
     try {
         // Parâmetros do formulário
         $sCompetencia = $this->getRequest()->getParam('data_competencia_inicial');
         // Separa os meses e anos
         $iCompetenciaMes = intval(substr($sCompetencia, 0, 2));
         $iCompetenciaAno = intval(substr($sCompetencia, -4));
         $sNomeArquivo = 'relatorio_inconsistencias_declaracoes_' . date('YmdHis') . '.pdf';
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('P');
         $oPdf->SetFillColor(220, 220, 220);
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório de Inconsistências nas Declarações');
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro("FILTRO: Competência {$sCompetencia}");
         $oPdf->carregaDados();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         try {
             $sSql = self::getSqlRelatorio();
             $oStatement = $oConexao->prepare($sSql);
             $oStatement->execute(array($iCompetenciaMes, $iCompetenciaAno));
             if ($oStatement->rowCount() < 1) {
                 throw new Exception($this->translate->_('Nenhum registro encontrado.'));
             }
             $aRelatorio = NULL;
             // Monta os dados do relatório com o índice para ordenação
             do {
                 $aRelatorio = $oStatement->fetch();
                 if (empty($aRelatorio)) {
                     continue;
                 }
                 // Dados do Prestador
                 $sPrestadorCnpjCpf = $aRelatorio['prestador_cnpjcpf'];
                 $sPrestadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($sPrestadorCnpjCpf);
                 $sPrestadorRazaoSocial = $aRelatorio['prestador_razao_social'];
                 $sPrestadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($sPrestadorRazaoSocial);
                 $sPrestadorMunicipioUf = $aRelatorio['prestador_endereco_municipio'];
                 $sPrestadorMunicipioUf = DBSeller_Helper_String_Format::wordsCap($sPrestadorMunicipioUf);
                 $sPrestadorMunicipioUf = "{$sPrestadorMunicipioUf}/{$aRelatorio['prestador_endereco_uf']}";
                 $sPrestadorTelefone = $aRelatorio['prestador_contato_telefone'];
                 $sPrestadorTelefone = DBSeller_Helper_Number_Format::maskPhoneNumber($sPrestadorTelefone);
                 $sPrestadorDocumentoNumero = $aRelatorio['prestador_documento_numero'];
                 $sPrestadorDocumentoTipo = $aRelatorio['prestador_documento_tipo'];
                 $sPrestadorDocumentoValor = $aRelatorio['prestador_valor_servico'];
                 $sPrestadorDocumentoValor = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoValor, 2);
                 $sPrestadorDocumentoAliquota = $aRelatorio['prestador_valor_aliquota'];
                 $sPrestadorDocumentoAliquota = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoAliquota, 2);
                 $sPrestadorDocumentoIss = $aRelatorio['prestador_valor_iss'];
                 $sPrestadorDocumentoIss = DBSeller_Helper_Number_Format::toMoney($sPrestadorDocumentoIss, 2);
                 $sPrestadorDocumentoIssRetido = $aRelatorio['prestador_iss_retido'] ? 'Sim' : 'Não';
                 // Dados Tomador
                 $sTomadorCnpjCpf = $aRelatorio['tomador_cnpjcpf'];
                 $sTomadorCnpjCpf = DBSeller_Helper_Number_Format::maskCPF_CNPJ($sTomadorCnpjCpf);
                 $sTomadorRazaoSocial = $aRelatorio['tomador_razao_social'];
                 $sTomadorRazaoSocial = DBSeller_Helper_String_Format::wordsCap($sTomadorRazaoSocial);
                 $sTomadorMunicipioUf = $aRelatorio['tomador_endereco_municipio'];
                 $sTomadorMunicipioUf = DBSeller_Helper_String_Format::wordsCap($sTomadorMunicipioUf);
                 $sTomadorMunicipioUf = "{$sTomadorMunicipioUf}/{$aRelatorio['tomador_endereco_uf']}";
                 $sTomadorTelefone = $aRelatorio['tomador_contato_telefone'];
                 $sTomadorTelefone = DBSeller_Helper_Number_Format::maskPhoneNumber($sTomadorTelefone);
                 $sTomadorDocumentoNumero = $aRelatorio['tomador_documento_numero'];
                 $sTomadorDocumentoTipo = $aRelatorio['tomador_documento_tipo'];
                 $sTomadorDocumentoValor = $aRelatorio['tomador_valor_servico'];
                 $sTomadorDocumentoValor = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoValor, 2);
                 $sTomadorDocumentoAliquota = $aRelatorio['tomador_valor_aliquota'];
                 $sTomadorDocumentoAliquota = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoAliquota, 2);
                 $sTomadorDocumentoIss = $aRelatorio['tomador_valor_iss'];
                 $sTomadorDocumentoIss = DBSeller_Helper_Number_Format::toMoney($sTomadorDocumentoIss, 2);
                 $sTomadorDocumentoIssRetido = $aRelatorio['tomador_iss_retido'] ? 'Sim' : 'Não';
                 // Pega a descrição do documento tomado, pois NFSE não tem tipo definido
                 $sPrestadorDocumentoTipo = $sPrestadorDocumentoTipo ?: $sTomadorDocumentoTipo;
                 // Descrição do tipo de documento
                 $oPrestadorDocumentoTipo = Contribuinte_Model_Nota::getTipoNota($sPrestadorDocumentoTipo);
                 $sPrestadorDocumentoTipo = DBSeller_Helper_String_Format::wordsCap($oPrestadorDocumentoTipo->descricao);
                 $oTomadorDocumentoTipo = Contribuinte_Model_Nota::getTipoNota($sTomadorDocumentoTipo);
                 $sTomadorDocumentoTipo = DBSeller_Helper_String_Format::wordsCap($oTomadorDocumentoTipo->descricao);
                 // Indice para evitar a repetição do cabeçalho por prestador+tomador
                 $sIndiceRelatorio = "{$aRelatorio['prestador_cnpjcpf']}_{$aRelatorio['tomador_cnpjcpf']}";
                 // Dados do relatório
                 $aDadosRelatorio[$sIndiceRelatorio]['prestador_cnpjcpf'] = utf8_decode($sPrestadorCnpjCpf);
                 $aDadosRelatorio[$sIndiceRelatorio]['prestador_razao_social'] = utf8_decode($sPrestadorRazaoSocial);
                 $aDadosRelatorio[$sIndiceRelatorio]['prestador_municipio_uf'] = utf8_decode($sPrestadorMunicipioUf);
                 $aDadosRelatorio[$sIndiceRelatorio]['prestador_telefone'] = utf8_decode($sPrestadorTelefone);
                 $aDadosRelatorio[$sIndiceRelatorio]['tomador_cnpjcpf'] = utf8_decode($sTomadorCnpjCpf);
                 $aDadosRelatorio[$sIndiceRelatorio]['tomador_razao_social'] = utf8_decode($sTomadorRazaoSocial);
                 $aDadosRelatorio[$sIndiceRelatorio]['tomador_municipio_uf'] = utf8_decode($sTomadorMunicipioUf);
                 $aDadosRelatorio[$sIndiceRelatorio]['tomador_telefone'] = utf8_decode($sTomadorTelefone);
                 $aDadosRelatorio[$sIndiceRelatorio]['documentos'][] = array('prestador_doc_numero' => utf8_decode($sPrestadorDocumentoNumero), 'prestador_doc_tipo' => utf8_decode($sPrestadorDocumentoTipo), 'prestador_doc_valor_servico' => utf8_decode($sPrestadorDocumentoValor), 'prestador_doc_valor_aliquota' => utf8_decode($sPrestadorDocumentoAliquota), 'prestador_doc_valor_iss' => utf8_decode($sPrestadorDocumentoIss), 'prestador_doc_iss_retido' => utf8_decode($sPrestadorDocumentoIssRetido), 'tomador_doc_numero' => utf8_decode($sTomadorDocumentoNumero), 'tomador_doc_tipo' => utf8_decode($sTomadorDocumentoTipo), 'tomador_doc_valor_servico' => utf8_decode($sTomadorDocumentoValor), 'tomador_doc_valor_aliquota' => utf8_decode($sTomadorDocumentoAliquota), 'tomador_doc_valor_iss' => utf8_decode($sTomadorDocumentoIss), 'tomador_doc_iss_retido' => utf8_decode($sTomadorDocumentoIssRetido));
             } while ($aRelatorio);
             // Ordena os dados do relatorio
             if (isset($aDadosRelatorio) && is_array($aDadosRelatorio)) {
                 $aDadosRelatorio = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, 'prestador_cnpjcpf');
             } else {
                 throw new Exception($this->translate->_('Erro ao gerar o relatório.'));
             }
             $iMeiaPaginaX = $oPdf->w / 2 - $oPdf->lMargin;
             // Percorre os dados do relatório
             foreach ($aDadosRelatorio as $aRelatorioOrdenado) {
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell($iMeiaPaginaX, 5, 'PRESTADOR');
                 $oPdf->Cell($iMeiaPaginaX, 5, 'TOMADOR');
                 $oPdf->Ln();
                 $oPdf->Rect($oPdf->GetX(), $oPdf->GetY(), $iMeiaPaginaX, 15);
                 $oPdf->Rect($iMeiaPaginaX + $oPdf->lMargin, $oPdf->GetY(), $iMeiaPaginaX, 15);
                 $oPdf->Ln(2);
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, 'CPNJ/CPF:');
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['prestador_cnpjcpf']);
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, 'CPNJ/CPF:');
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['tomador_cnpjcpf']);
                 $oPdf->Ln();
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, utf8_decode('Razão Social'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['prestador_razao_social']);
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, utf8_decode('Razão Social'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['tomador_razao_social']);
                 $oPdf->Ln();
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, utf8_decode('Município/UF:'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['prestador_municipio_uf']);
                 $oPdf->SetFont('Arial', 'B', 8);
                 $oPdf->Cell(20, 4, utf8_decode('Município/UF:'));
                 $oPdf->SetFont('Arial', '', 8);
                 $oPdf->Cell($iMeiaPaginaX - 20, 4, $aRelatorioOrdenado['tomador_municipio_uf']);
                 $oPdf->Ln(5);
                 if (count($aRelatorioOrdenado['documentos']) > 0) {
                     $aLarguraColuna = array(28, 15, 64, 26, 19, 27, 11);
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell($aLarguraColuna[0], 5, utf8_decode('Nº do Documento'), 1, 0, 'C', 1);
                     $oPdf->Cell($aLarguraColuna[1], 5, utf8_decode('Origem'), 1, 0, 'L', 1);
                     $oPdf->Cell($aLarguraColuna[2], 5, utf8_decode('Tipo de Documento'), 1, 0, 'L', 1);
                     $oPdf->Cell($aLarguraColuna[3], 5, utf8_decode('Valor Serviço (R$)'), 1, 0, 'R', 1);
                     $oPdf->Cell($aLarguraColuna[4], 5, utf8_decode('Alíquota (%)'), 1, 0, 'R', 1);
                     $oPdf->Cell($aLarguraColuna[5], 5, utf8_decode('Valor Imposto (R$)'), 1, 0, 'R', 1);
                     $oPdf->Cell($aLarguraColuna[6], 5, utf8_decode('Subst.'), 1, 0, 'L', 1);
                     $oPdf->Ln(5);
                     $iFundo = 0;
                     // Alterador do fundo da linha (Zebra)
                     // Percorre os documentos do relatório
                     foreach ($aRelatorioOrdenado['documentos'] as $aDocumento) {
                         $lFundoLinha = $iFundo++ % 2 == 0 ? 0 : 1;
                         $oPdf->SetFont('Arial', '', 8);
                         $oPdf->MultiCell($aLarguraColuna[0], 10, $aDocumento['prestador_doc_numero'], 1, 'C', $lFundoLinha);
                         $oPdf->SetY($oPdf->getY() - 10);
                         $oPdf->SetX($oPdf->getX() + $aLarguraColuna[0]);
                         $oPdf->Cell($aLarguraColuna[1], 5, 'Prestador', 1, 0, 'L', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[2], 5, $aDocumento['prestador_doc_tipo'], 1, 0, 'L', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[3], 5, $aDocumento['prestador_doc_valor_servico'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[4], 5, $aDocumento['prestador_doc_valor_aliquota'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[5], 5, $aDocumento['prestador_doc_valor_iss'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[6], 5, $aDocumento['prestador_doc_iss_retido'], 1, 0, 'L', $lFundoLinha);
                         $oPdf->Ln(5);
                         $oPdf->Cell($aLarguraColuna[0], 5, '');
                         $oPdf->Cell($aLarguraColuna[1], 5, 'Tomador', 1, 0, 'L', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[2], 5, $aDocumento['tomador_doc_tipo'], 1, 0, 'L', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[3], 5, $aDocumento['tomador_doc_valor_servico'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[4], 5, $aDocumento['tomador_doc_valor_aliquota'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[5], 5, $aDocumento['tomador_doc_valor_iss'], 1, 0, 'R', $lFundoLinha);
                         $oPdf->Cell($aLarguraColuna[6], 5, $aDocumento['tomador_doc_iss_retido'], 1, 0, 'L', $lFundoLinha);
                         $oPdf->Ln(5);
                     }
                     $oPdf->Ln();
                 }
             }
         } catch (Exception $oErro) {
             throw new Exception($oErro->getMessage());
         }
         $oPdf->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'][] = $oErro->getMessage();
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }