/**
  * (non-PHPdoc)
  * @see Zend_Form::init()
  */
 public function init()
 {
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $this->setName('form-exportacao-arquivo');
     $this->setMethod(Zend_form::METHOD_POST);
     $this->setAction($oBaseUrlHelper->baseUrl('/contribuinte/exportacao-arquivo/rps-consultar/'));
     $aMeses = DBSeller_Helper_Date_Date::getMesesArray();
     $aAnos = array(date('Y') - 0 => date('Y') - 0, date('Y') - 1 => date('Y') - 1, date('Y') - 2 => date('Y') - 2, date('Y') - 3 => date('Y') - 3, date('Y') - 4 => date('Y') - 4);
     $oElm = $this->createElement('select', 'mes_competencia', array('divspan' => '4', 'multiOptions' => $aMeses));
     $oElm->setLabel('Mês:');
     $oElm->setAttrib('class', 'span2');
     $oElm->setValue(date('m'));
     $this->addElement($oElm);
     $oElm = $this->createElement('select', 'ano_competencia', array('divspan' => '6', 'multiOptions' => $aAnos));
     $oElm->setLabel('Ano:');
     $oElm->setAttrib('class', 'span2');
     $this->addElement($oElm);
     $oElm = $this->createElement('text', 'numero_rps', array('divspan' => '10'));
     $oElm->setLabel('Número da NFS-e:');
     $oElm->setAttrib('class', 'span2');
     $this->addElement($oElm);
     $this->addElement('button', 'btn_consultar', array('divspan' => 4, 'label' => 'Consultar', 'class' => 'input-medium btn', 'buttonType' => Twitter_Bootstrap_Form_Element_Button::BUTTON_PRIMARY));
     $this->addElement('button', 'btn_exportar', array('divspan' => 6, 'label' => 'Exportar', 'class' => 'input-medium btn', 'disabled' => TRUE, 'buttonType' => Twitter_Bootstrap_Form_Element_Button::BUTTON_SUCCESS));
     $this->addDisplayGroup(array('mes_competencia', 'ano_competencia', 'numero_rps', 'btn_consultar', 'btn_exportar'), 'dados_consulta', array('legend' => 'Parâmetros'));
     return $this;
 }
 /**
  * Verifica se deve emitir a guia considerando: 
  * 1 - as características do contribuinte no alvará
  * 2 - tributação dentro ou fora do municipio
  * 
  * 
  * @param stdClass $oParametro
  *   $oParametro->inscricao_municipal
  *   $oParametro->data
  * @throws Exception
  * @return boolean
  * 
  * @tutorial: Abaixo constam as regras para emissão de guia
  * 
  * Regime(4)/Exigibilidade(5) |Exigível(23)|Não Incide(24)|Isento(25)|Export.(26)|Imune(27)|Susp.Judic(28)|Susp.Adm(29)
  * ------------------------------------------------------------------------------------------------------------------
  * (--)Optante Simples        |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (14)Normal                 |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (15)Cooperativa            |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (16)EPP                    |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (17)Estimativa             |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (18)Fixado                 |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (19)ME municipal           |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (20)MEI                    |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (21)ME                     |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (22)Sociedade profissional |Não         |Não         |Não       |Não        |Não      |Não           |Não 
  */
 public static function checarEmissaoGuia($oParametro = NULL)
 {
     $oValidaData = new Zend_Validate_Date();
     if (!is_object($oParametro)) {
         throw new Exception('O parâmetro informado deve ser um objeto.');
     } else {
         if (!isset($oParametro->data) || !isset($oParametro->inscricao_municipal)) {
             throw new Exception('Verifique os parâmetros informados.');
         } else {
             if (!$oValidaData->isValid($oParametro->data)) {
                 throw new Exception('Parâmetro "data" inválido.');
             }
         }
     }
     // Busca os dados do contribuinte da sessão
     $oContribuinte = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($oParametro->inscricao_municipal);
     if (!is_object($oContribuinte)) {
         throw new Exception('Nenhum contribuinte foi encontrado.');
     }
     // Optante pelo simples no período pesquisado, não emite guia
     $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($oParametro->data));
     if ($oContribuinte->isOptanteSimples($oDataSimples)) {
         return FALSE;
     }
     // Verifica se deve emitir a guia conforme as regras de emissão
     $iRegimeTributario = $oContribuinte->getRegimeTributario();
     $iExigibilidade = $oContribuinte->getExigibilidade();
     switch ("{$iRegimeTributario}-{$iExigibilidade}") {
         case '14-23':
         case '14-26':
         case '15-23':
         case '15-26':
         case '16-23':
         case '16-26':
         case '17-23':
         case '17-26':
         case '19-23':
         case '19-26':
         case '21-23':
         case '21-26':
             return TRUE;
             break;
         default:
             return FALSE;
     }
     return FALSE;
 }
 /**
  * Método construtor
  *
  * (non-PHPdoc)
  * @see Zend_Form::init()
  */
 public function init()
 {
     $oBaseUrlHelper = new Zend_View_Helper_BaseUrl();
     $this->setName('form-guias-geracao-utomatica');
     $this->setMethod(Zend_form::METHOD_POST);
     $this->setAction($oBaseUrlHelper->baseUrl('/fiscal/guias/consultar/'));
     $aMeses = DBSeller_Helper_Date_Date::getMesesArray();
     $oElm = $this->createElement('select', 'mes_competencia', array('divspan' => '3', 'multiOptions' => $aMeses));
     $oElm->setLabel('Mês:');
     $oElm->setAttrib('class', 'span2');
     $oElm->setValue(date('m'));
     $this->addElement($oElm);
     $aAnos = array(date('Y') - 0 => date('Y') - 0, date('Y') - 1 => date('Y') - 1, date('Y') - 2 => date('Y') - 2, date('Y') - 3 => date('Y') - 3, date('Y') - 4 => date('Y') - 4);
     $oElm = $this->createElement('select', 'ano_competencia', array('divspan' => '3', 'multiOptions' => $aAnos));
     $oElm->setLabel('Ano:');
     $oElm->setAttrib('class', 'span2');
     $this->addElement($oElm);
     $this->addElement('button', 'btn_consultar', array('divspan' => 3, 'label' => 'Consultar', 'class' => 'span2', 'buttonType' => Twitter_Bootstrap_Form_Element_Button::BUTTON_PRIMARY));
     $this->addElement('button', 'btn_gerar', array('divspan' => 2, 'label' => 'Gerar', 'class' => 'span2', 'disabled' => TRUE, 'buttonType' => Twitter_Bootstrap_Form_Element_Submit::BUTTON_SUCCESS));
     $this->addDisplayGroup(array('mes_competencia', 'ano_competencia', 'btn_consultar', 'btn_gerar'), 'group_guias_geracao', array('legend' => 'Consultar por Data'));
 }
 /**
  * Emite e gera as guias conforme a receita e aliquota informadas
  */
 public function emitirGuiaAction()
 {
     parent::noTemplate();
     $aParametros = $this->getAllParams();
     try {
         $iIdImportacao = $aParametros['id'];
         $fAliquota = $aParametros['aliq_issqn'] ? $aParametros['aliq_issqn'] : NULL;
         $oContribuinte = $this->_session->contribuinte;
         $aReceitaDesif = Contribuinte_Model_ImportacaoDesif::getTotalReceitaGuiaDesif($oContribuinte, $iIdImportacao, $fAliquota);
         $sTotalReceita = DBSeller_Helper_Number_Format::toMoney($aReceitaDesif->total_receita, 2, 'R$ ');
         $sTotalIss = DBSeller_Helper_Number_Format::toMoney($aReceitaDesif->total_iss, 2, 'R$ ');
         $oFormEmitirGuia = new Contribuinte_Form_GuiaCompetencia();
         $oFormEmitirGuia->setName('form-emitir-guia');
         $oFormEmitirGuia->setAction('/contribuinte/guia-desif/emitir-guia');
         $oFormEmitirGuia->getElement('ano')->setValue($aReceitaDesif->ano_competencia);
         $oFormEmitirGuia->getElement('mes')->setValue($aReceitaDesif->mes_competencia);
         $oFormEmitirGuia->getElement('aliq_issqn')->setValue($fAliquota);
         $oFormEmitirGuia->getElement('total_servico')->setValue($sTotalReceita);
         $oFormEmitirGuia->getElement('total_iss')->setValue($sTotalIss);
         $oFormEmitirGuia->getElement('data_guia')->setValue(date('d/m/Y'));
         $this->view->form = $oFormEmitirGuia;
         // Verifica se for enviado os dados via $_POST
         if ($this->getRequest()->isPost()) {
             // Formata a data de pagamento da guia
             $sDataInvertida = DBSeller_Helper_Date_Date::invertDate($this->getRequest()->getParam('data_guia'));
             $oDataPagamento = new DateTime($sDataInvertida);
             // Gera a guia e emite o PDF da geração
             $oGuia = Contribuinte_Model_GuiaEcidade::gerarGuiaDesif($oContribuinte, $aParametros['ano'], $aParametros['mes'], $oDataPagamento, $fAliquota, true);
             $this->view->arquivo = $oGuia->arquivo_guia;
         }
     } catch (Exception $oErro) {
         $this->view->mensagem_erro = $oErro->getMessage();
     }
 }
 /**
  * Geração do relatório de empresas omissas
  */
 public function empresasOmissasGerarAction()
 {
     parent::noLayout();
     $aValidacaoFormulario = self::validarFormulario(Fiscal_Form_Relatorio2::TIPO6);
     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');
         $sCompetenciaInicial = $this->getRequest()->getParam('data_competencia_inicial');
         $sCompetenciaFinal = $this->getRequest()->getParam('data_competencia_final');
         // 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_empresas_omissas_' . date('YmdHis') . '.pdf';
         $aDescricaoFiltros = array('inscricao_municipal' => 'Inscrição Municipal', 'nome' => 'Nome', 'asc' => 'Crescente', 'desc' => 'Decrescente');
         $oPdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oPdf->Open(APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}");
         $oPdf->setLinhaFiltro('Relatório de Empresas Omissas');
         $oPdf->setLinhaFiltro('');
         $oPdf->setLinhaFiltro("FILTRO: Competência de {$sCompetenciaInicial} até {$sCompetenciaFinal}");
         $oPdf->setLinhaFiltro("ORDEM: {$aDescricaoFiltros[$sOrdenacaoCampo]} ({$aDescricaoFiltros[$sOrdenacaoDirecao]})");
         $oPdf->carregaDados();
         $aUsuarioContribuintes = Administrativo_Model_UsuarioContribuinte::getPrestadores();
         $aInscricoesMunicipaisContribuintes = array();
         // Verifica se existem usuários contribuinte cadastrados
         if (count($aUsuarioContribuintes) == 0) {
             throw new Exception($this->translate->_('Não existem contribuintes cadastrados no sistema.'));
         }
         $aDeclaracaoIsentoValidos = array();
         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;
                 }
                 // Varre a lista de usuários contribuintes, verificando quem tem movimentações
                 foreach ($aUsuarioContribuintes as $oContribuinte) {
                     // Verifica se tem movimentação
                     $sSql = "SELECT 1 AS existe_movimento\n                     FROM   view_nota_mais_dms\n                      WHERE (dms_operacao     = 's' OR dms_operacao IS NULL)   AND\n                            prestador_cnpjcpf = '{$oContribuinte->getCnpjCpf()}' AND\n                            documento_competencia_ano = {$iAnoLoop} AND\n                            documento_competencia_mes = {$iMesLoop}";
                     $oStatement = $this->oConexao->prepare($sSql);
                     $oStatement->execute();
                     // Adiciona na lista somente os contribuinte sem movimentação no sistema
                     if ($oStatement->rowCount() == 0) {
                         // Informações complementares do contribuinte
                         $oDadosContribuinteComplemento = Administrativo_Model_UsuarioContribuinteComplemento::getById($oContribuinte->getCnpjCpf());
                         // Variaveis do contribuinte
                         $iInscricaoMunicipal = $oContribuinte->getIm();
                         $sRazaoSocial = $oDadosContribuinteComplemento->getRazaoSocial();
                         $sEndereco = $oDadosContribuinteComplemento->getEnderecoDescricao();
                         if (strlen(trim($iInscricaoMunicipal)) > 0) {
                             // Dados dos contribuintes
                             $aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop][$iInscricaoMunicipal] = array('inscricao_municipal' => $iInscricaoMunicipal, 'nome' => DBSeller_Helper_String_Format::wordsCap($sRazaoSocial), 'endereco' => DBSeller_Helper_String_Format::wordsCap($sEndereco), 'telefone' => $oDadosContribuinteComplemento->getContatoTelefone(), 'competencia_ano' => $iAnoLoop, 'competencia_mes' => $iMesLoop);
                         }
                         // Lista para consulta no webservice
                         $aInscricoesMunicipaisContribuintes[$iInscricaoMunicipal] = $iInscricaoMunicipal;
                     }
                 }
             }
         }
         // Mosta a lista de inscrições do contribuintes para verificação no webservice (separados por vírgula)
         $sInscricoesMunicipaisContribuintes = implode("','", $aInscricoesMunicipaisContribuintes);
         // Retorna apenas os contribuintes com declaração de insento
         $aDeclaracaoIsento = Contribuinte_Model_Competencia::getDeclaracaoSemMovimentoPorContribuintes($sInscricoesMunicipaisContribuintes);
         // Limpa as inscricoes com declaração de isenção
         foreach ($aDeclaracaoIsento as $oDeclaracaoIsento) {
             unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes][$oDeclaracaoIsento->inscricao_municipal]);
             // Limpa dados do mes, caso não possua registros
             if (isset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]) && count($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]) == 0) {
                 unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano][$oDeclaracaoIsento->mes]);
             }
             // Limpa dados do ano, caso não possua registros
             if (isset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]) && count($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]) == 0) {
                 unset($aDeclaracaoIsentoValidos[$oDeclaracaoIsento->ano]);
             }
         }
         if (count($aDeclaracaoIsentoValidos) == 0) {
             $sMensagemErro = 'Nenhuma informação foi encontrada neste período para geração do relatório.';
             throw new Exception($this->translate->_($sMensagemErro));
         }
         // 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;
                 }
                 // Ordena o array pelo índice informado
                 if (isset($aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop])) {
                     // Formata para mês por extenso
                     $sMesExtenso = DBSeller_Helper_Date_Date::mesExtenso($iMesLoop);
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(20, 5, utf8_decode('Competência:'));
                     $oPdf->SetFont('Arial', NULL, 8);
                     $oPdf->Cell(0, 5, utf8_decode("{$sMesExtenso}/{$iAnoLoop}"));
                     $oPdf->Ln(5);
                     $oPdf->SetFont('Arial', 'B', 8);
                     $oPdf->Cell(28, 5, utf8_decode('Inscrição Municipal'), 1);
                     $oPdf->Cell(100, 5, utf8_decode('Nome'), 1);
                     $oPdf->Cell(117, 5, utf8_decode('Endereço'), 1);
                     $oPdf->Cell(32, 5, utf8_decode('Telefone'), 1);
                     $oPdf->Ln(5);
                     $aDeclaracaoIsentoOrdenado = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDeclaracaoIsentoValidos[$iAnoLoop][$iMesLoop], $sOrdenacaoCampo, $sOrdenacaoDirecao, TRUE);
                     $oPdf->SetFont('Arial', NULL, 8);
                     foreach ($aDeclaracaoIsentoOrdenado as $oDeclaracaoIsentoOrdenado) {
                         $oPdf->Cell(28, 5, utf8_decode($oDeclaracaoIsentoOrdenado['inscricao_municipal']), 1);
                         $oPdf->Cell(100, 5, utf8_decode($oDeclaracaoIsentoOrdenado['nome']), 1);
                         $oPdf->Cell(117, 5, utf8_decode($oDeclaracaoIsentoOrdenado['endereco']), 1);
                         $oPdf->Cell(32, 5, utf8_decode($oDeclaracaoIsentoOrdenado['telefone']), 1);
                         $oPdf->Ln(5);
                     }
                     $oPdf->Ln(5);
                     $oPdf->proximaPagina(10);
                 }
             }
         }
         $oPdf->Output();
         $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);
 }
 /**
  * Reemite a guia de pagamento das Guias de DMS
  */
 public function reemitirDmsGuiaAction()
 {
     parent::noTemplate();
     $iIdGuia = $this->getRequest()->getParam('guia', NULL);
     $sDataGuia = $this->getRequest()->getParam('data_guia', NULL);
     $oGuia = Contribuinte_Model_Guia::getById($iIdGuia);
     $oDadosGuia = $oGuia->getEntity();
     if ($this->getRequest()->isPost()) {
         $oValidaDatas = new Zend_Validate_Date();
         $sDataValidacao = DBSeller_Helper_Date_Date::invertDate($sDataGuia, '');
         if ($sDataValidacao < date('Ymd')) {
             $this->view->message = $this->translate->_('Informe uma data posterior a data atual.');
         } else {
             if (!$oValidaDatas->isValid($sDataGuia)) {
                 $this->view->message = $this->translate->_('Informe uma data para pagamento válida.');
             } else {
                 $aNovaGuia = $oGuia->reemitir($sDataGuia);
                 $this->view->arquivo = $aNovaGuia['arquivo'];
                 $this->view->guia = $aNovaGuia['objeto'];
             }
         }
     }
     $oFormCompetencia = new Contribuinte_Form_GuiaCompetencia();
     $oFormCompetencia->setAction('/contribuinte/guia/reemitir-dms-guia');
     $oFormCompetencia->removeElement('total_iss');
     $oFormCompetencia->removeElement('total_servico');
     $oFormCompetencia->getElement('data_guia')->setValue(date('d/m/Y'));
     $oFormCompetencia->preencheDms($oDadosGuia);
     $this->view->form = $oFormCompetencia;
 }
 /**
  * Geração do relatório de valores por atividade / serviço
  */
 public function valoresAtividadeServicoGerarAction()
 {
     parent::noLayout();
     try {
         $aValidacaoFormulario = self::validarFormulario(Fiscal_Form_Relatorio1::TIPO5);
         if (is_array($aValidacaoFormulario)) {
             exit($this->getHelper('json')->sendJson($aValidacaoFormulario));
         }
         $sNomeArquivo = 'evolucao_arrecadacao_ ' . date('YmdHis') . '.pdf';
         $sCaminhoArquivo = APPLICATION_PATH . "/../public/tmp/{$sNomeArquivo}";
         $aParametros = $this->getRequest()->getParams();
         $aFiltros = array('atividade_servico' => 'Atividade / Serviço');
         $sOrdenacao = 'Crescente';
         if (strtoupper($aParametros['ordem']) == 'DESC') {
             $sOrdenacao = 'Decrescente';
         }
         $sFiltro = "Competência {$aParametros['data_competencia_inicial']} até {$aParametros['data_competencia_final']}";
         $sOrdem = $aFiltros[$aParametros['ordenacao']] . " ({$sOrdenacao})";
         $oFpdf = new Fiscal_Model_Relatoriopdfmodelo1('L');
         $oFpdf->setLinhaFiltro('Relatório Evolução de Arrecadação por Atividade/Serviço');
         $oFpdf->setLinhaFiltro('');
         $oFpdf->setLinhaFiltro("FILTRO : {$sFiltro}");
         $oFpdf->setLinhaFiltro("ORDEM : {$sOrdem}");
         $oFpdf->Open($sCaminhoArquivo);
         $oFpdf->carregadados();
         $aDataCompetenciaInicial = explode('/', $aParametros['data_competencia_inicial']);
         $aDataCompetenciaFinal = explode('/', $aParametros['data_competencia_final']);
         $sSql = "SELECT SUM(servico_valor_iss) AS valor_imposto,\n                          servico_codigo_cnae,\n                          documento_competencia_ano,\n                          documento_competencia_mes\n                     FROM view_nota_mais_dms\n                    WHERE documento_emite_guia = TRUE\n                     AND (dms_operacao = 's' OR dms_operacao IS NULL)\n                     AND  documento_situacao NOT IN ('c', 'e')\n                     AND  documento_status_cancelamento = FALSE\n                     AND (documento_competencia_ano || LPAD(CAST(documento_competencia_mes AS VARCHAR), 2, '0'))\n                          BETWEEN ? AND ?\n                 GROUP BY servico_codigo_cnae,\n                          documento_competencia_ano,\n                          documento_competencia_mes ";
         $aDadosRelatorio = array();
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         $oStatement = $oConexao->prepare($sSql);
         $oStatement->execute(array("{$aDataCompetenciaInicial[1]}{$aDataCompetenciaInicial[0]}", "{$aDataCompetenciaFinal[1]}{$aDataCompetenciaFinal[0]}"));
         if ($oStatement->rowCount() < 1) {
             throw new Exception('Nenhum Registro encontrado.');
         }
         while ($aNota = $oStatement->fetch()) {
             $oServicos = Contribuinte_Model_Servico::getServicoPorCnae($aNota['servico_codigo_cnae']);
             if (!$oServicos) {
                 throw new Exception("Erro: {$aNota['servico_codigo_cnae']}");
             }
             $sIndice = md5($aNota['servico_codigo_cnae'] . $oServicos->attr('atividade'));
             $aDadosRelatorio[$sIndice]['estrutural'] = $oServicos->attr('estrutural');
             $aDadosRelatorio[$sIndice]['descricao'] = DBSeller_Helper_String_Format::wordsCap($oServicos->attr('atividade'));
             if (!isset($aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']])) {
                 $aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']] = 0;
             }
             $aDadosRelatorio[$sIndice]['totalAnoMes'][$aNota['documento_competencia_ano']][$aNota['documento_competencia_mes']] += $aNota['valor_imposto'];
             if (!isset($aDadosRelatorio[$sIndice]['totalAcumulado'])) {
                 $aDadosRelatorio[$sIndice]['totalAcumulado'] = 0;
             }
             $aDadosRelatorio[$sIndice]['totalAcumulado'] += $aNota['valor_imposto'];
         }
         switch ($aParametros['ordenacao']) {
             case 'atividade_servico':
                 $sOrdenacao = 'estrutural';
                 break;
             case 'valor_total':
                 $sOrdenacao = 'totalAcumulado';
                 break;
         }
         $iComprimentoPagina = $oFpdf->w - $oFpdf->rMargin - $oFpdf->lMargin;
         $aDadosRelatorio = DBSeller_Helper_Array_Abstract::ordenarPorIndice($aDadosRelatorio, $sOrdenacao, $aParametros['ordem'], TRUE);
         // Percorre os registros do relatório
         foreach ($aDadosRelatorio as $aRegistro) {
             $sAtividadeServico = "Atividade / Serviço: {$aRegistro['estrutural']} - {$aRegistro['descricao']}";
             $oFpdf->SetFont('Arial', 'B', 8);
             $oFpdf->Cell($iComprimentoPagina, 5, utf8_decode($sAtividadeServico), 0, 1, 'J');
             $oFpdf->SetFont('Arial', '', 8);
             $aMeses = DBSeller_Helper_Date_Date::getMesesArray();
             $iTamanhoMes = $iComprimentoPagina / count($aMeses);
             // Ordena a lista pelo índice
             ksort($aRegistro['totalAnoMes']);
             // Percorre a lista pelo total por ano/mes
             foreach ($aRegistro['totalAnoMes'] as $iAno => $aAnos) {
                 // Percorre os meses para gerar o cabeçalho de meses
                 foreach ($aMeses as $iMes => $sDescricaoMes) {
                     $oFpdf->SetFont('Arial', 'B', 8);
                     $oFpdf->Cell($iTamanhoMes, 5, utf8_decode(substr($aMeses[$iMes], 0, 3)) . '/' . $iAno . '(R$)', 1, 0, 'C');
                 }
                 $oFpdf->ln();
                 // Percorre os meses para gerar os dados por mês
                 foreach ($aMeses as $iMes => $sMes) {
                     $oFpdf->SetFont('Arial', '', 8);
                     if (!empty($aAnos[$iMes])) {
                         $oFpdf->Cell($iTamanhoMes, 5, DBSeller_Helper_Number_Format::toMoney($aAnos[$iMes], 2), 1, 0, 'R');
                     } else {
                         $oFpdf->Cell($iTamanhoMes, 5, 'S / M', 1, 0, 'C');
                     }
                 }
                 $oFpdf->proximaPagina(1);
                 if (!$oFpdf->lQuebrouPagina) {
                     $oFpdf->Ln(6);
                 }
             }
             if (!$oFpdf->lQuebrouPagina) {
                 $oFpdf->Ln(2);
             }
         }
         $oFpdf->Output();
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['url'] = $this->view->baseUrl('tmp/' . $sNomeArquivo);
         $aRetornoJson['success'] = $this->translate->_('Relatório gerado com sucesso.');
     } catch (Exception $oErro) {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['error'][] = $this->translate->_($oErro->getMessage());
     }
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Verifica se o contribuinte é optante pelo simples na data especificada
  * Utiliza o mesmo método utilizado no DMS
  *
  * @see Contribuinte_Lib_Controller_AbstractController::verificarContribuinteOptanteSimplesAction()
  * @throws Exception
  */
 public function verificarContribuinteOptanteSimplesAction()
 {
     try {
         $sData = $this->getRequest()->getParam('data');
         if (!$sData) {
             throw new Exception('Informe a data para verificar.');
         }
         $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($sData, '-'));
         if (!$oDataSimples instanceof DateTime) {
             throw new Exception('Data inválida');
         }
         $oContribuinte = $this->_session->contribuinte;
         $aRetorno['status'] = $oContribuinte->isOptanteSimples($oDataSimples) ? TRUE : FALSE;
         echo $this->getHelper('json')->sendJson($aRetorno);
     } catch (Exception $e) {
         $aRetorno['erro'] = TRUE;
         if ($e->getCode() == Global_Lib_Model_WebService::CODIGO_ERRO_CONSULTA_WEBSERVICE) {
             $aRetorno['mensagem'] = "E-cidade temporariamente insdisponível. Emissão bloqueada!";
         } else {
             $aRetorno['mensagem'] = $e->getMessage();
         }
         echo $this->getHelper('json')->sendJson($aRetorno);
     }
 }
 /**
  * Define os dados do contribuinte
  *
  * @param Contribuinte_Model_Contribuinte $oContribuinte
  * @param                                 $iMesCompetencia
  * @param                                 $iAnoCompetencia
  * @param bool                            $lLivroFiscal
  */
 public function setDadosContribuinte(Contribuinte_Model_Contribuinte $oContribuinte, $iMesCompetencia, $iAnoCompetencia, $lLivroFiscal = TRUE)
 {
     if (!$lLivroFiscal) {
         $this->AddPage();
     }
     // Mês e ano da competnência por extenso
     $sCompetencia = DBSeller_Helper_Date_Date::mesExtenso($iMesCompetencia) . "/{$iAnoCompetencia}";
     $sCompetencia = utf8_decode($sCompetencia);
     // Mostra os campos referentes à guia somente para contribuintes NFSe
     if ($oContribuinte->getTipoEmissao() == Contribuinte_Model_Contribuinte::TIPO_EMISSAO_NOTA || !$lLivroFiscal) {
         // Situação da Guia
         $sDataFechamentoGuia = '-';
         $sSituacaoGuia = 'Em aberto';
         $oGuia = new Contribuinte_Model_Guia();
         $aGuia = $oGuia->getByCompetenciaAndContribuinte($iAnoCompetencia, $iMesCompetencia, $oContribuinte, Contribuinte_Model_Guia::$PRESTADOR);
         if (count($aGuia) > 0) {
             $oGuia = $aGuia[0]->getEntity();
             $sDataFechamentoGuia = $oGuia->getDataFechamento()->format('d/m/Y');
             $sSituacaoGuia = Contribuinte_Model_Guia::$SITUACAO[$oGuia->getSituacao()];
         }
         $aLarguraCelulas = array(57, 55, 55, 55, 55, 45, 50);
         $this->SetFont('Arial', 'B', 8);
         if ($lLivroFiscal) {
             // Mostra CGM ou Inscrição Municipal
             if ($oContribuinte->getCgm()) {
                 $this->Cell($aLarguraCelulas[0], 5, utf8_decode('CGM / Inscrição Municipal:'), 1);
             } else {
                 $this->Cell($aLarguraCelulas[0], 5, utf8_decode('Inscrição Municipal:'), 1);
             }
             $this->Cell($aLarguraCelulas[1], 5, utf8_decode('CPF / CNPJ:'), 1);
             $this->Cell($aLarguraCelulas[2], 5, utf8_decode('Mês Referência:'), 1);
             $this->Cell($aLarguraCelulas[3], 5, utf8_decode('Situação:'), 1);
             $this->Cell($aLarguraCelulas[4], 5, utf8_decode('Encerramento:'), 1);
             $this->Ln();
             $this->SetFont('Arial', NULL, 8);
             // Mostra CGM ou Inscrição Municipal
             if ($oContribuinte->getCgm()) {
                 $this->Cell($aLarguraCelulas[0], 5, $oContribuinte->getCgm(), 1);
             } else {
                 $this->Cell($aLarguraCelulas[0], 5, $oContribuinte->getInscricaoMunicipal(), 1);
             }
             $sCpfCnpjContribuinte = DBSeller_Helper_Number_Format::maskCPF_CNPJ($oContribuinte->getCgcCpf());
             $this->Cell($aLarguraCelulas[1], 5, $sCpfCnpjContribuinte, 1);
             $this->Cell($aLarguraCelulas[2], 5, $sCompetencia, 1);
             $this->Cell($aLarguraCelulas[3], 5, $sSituacaoGuia, 1);
             $this->Cell($aLarguraCelulas[4], 5, $sDataFechamentoGuia, 1);
             $this->Ln(6);
         } else {
             // Mostra CGM ou Inscrição Municipal
             if ($oContribuinte->getCgm()) {
                 $this->Cell($aLarguraCelulas[1], 5, utf8_decode('CGM / Inscrição Municipal:'), 1);
             } else {
                 $this->Cell($aLarguraCelulas[1], 5, utf8_decode('Inscrição Municipal:'), 1);
             }
             $this->Cell($aLarguraCelulas[6], 5, utf8_decode('CPF / CNPJ:'), 1);
             $this->Cell($aLarguraCelulas[5], 5, utf8_decode('Competencia Inicial:'), 1);
             $this->Cell($aLarguraCelulas[5], 5, utf8_decode('Competencia Final:'), 1);
             $this->Cell($aLarguraCelulas[5], 5, utf8_decode('Situação:'), 1);
             $this->Cell(0, 5, utf8_decode('Encerramento:'), 1);
             $this->Ln();
             $this->SetFont('Arial', NULL, 8);
             // Mostra CGM ou Inscrição Municipal
             if ($oContribuinte->getCgm()) {
                 $this->Cell($aLarguraCelulas[1], 5, $oContribuinte->getCgm(), 1);
             } else {
                 $this->Cell($aLarguraCelulas[1], 5, $oContribuinte->getInscricaoMunicipal(), 1);
             }
             $sCpfCnpjContribuinte = DBSeller_Helper_Number_Format::maskCPF_CNPJ($oContribuinte->getCgcCpf());
             $sCompetenciaInicial = $iMesCompetencia['inicial'] . '/' . $iAnoCompetencia['inicial'];
             $sCompetenciaFinal = $iMesCompetencia['final'] . '/' . $iAnoCompetencia['final'];
             $this->Cell($aLarguraCelulas[6], 5, $sCpfCnpjContribuinte, 1);
             $this->Cell($aLarguraCelulas[5], 5, $sCompetenciaInicial, 1);
             $this->Cell($aLarguraCelulas[5], 5, $sCompetenciaFinal, 1);
             $this->Cell($aLarguraCelulas[5], 5, $sSituacaoGuia, 1);
             $this->Cell(0, 5, $sDataFechamentoGuia, 1);
             $this->Ln(6);
         }
     } else {
         $aLarguraCelulas = array(93, 92, 92);
         $this->SetFont('Arial', 'B', 8);
         // Mostra CGM ou Inscrição Municipal
         if ($oContribuinte->getCgm()) {
             $this->Cell($aLarguraCelulas[0], 5, utf8_decode('CGM / Inscrição Municipal:'), 1);
         } else {
             $this->Cell($aLarguraCelulas[0], 5, utf8_decode('Inscrição Municipal:'), 1);
         }
         $this->Cell($aLarguraCelulas[1], 5, utf8_decode('CPF / CNPJ:'), 1);
         $this->Cell($aLarguraCelulas[2], 5, utf8_decode('Mês Referência:'), 1);
         $this->Ln();
         $this->SetFont('Arial', NULL, 8);
         // Mostra CGM ou Inscrição Municipal
         if ($oContribuinte->getCgm()) {
             $this->Cell($aLarguraCelulas[0], 5, $oContribuinte->getCgm(), 1);
         } else {
             $this->Cell($aLarguraCelulas[0], 5, $oContribuinte->getInscricaoMunicipal(), 1);
         }
         $this->Cell($aLarguraCelulas[1], 5, DBSeller_Helper_Number_Format::maskCPF_CNPJ($oContribuinte->getCgcCpf()), 1);
         $this->Cell($aLarguraCelulas[2], 5, $sCompetencia, 1);
         $this->Ln(6);
     }
     $this->SetFont('Arial', 'B', 8);
     $this->Cell(0, 5, utf8_decode('Razão Social:'), 1);
     $this->Ln();
     $this->SetFont('Arial', NULL, 8);
     $this->Cell(0, 5, utf8_decode($oContribuinte->getNome()), 1);
     $this->Ln(6);
     $this->SetFont('Arial', 'B', 8);
     $this->Cell(242, 5, utf8_decode('Endereço:'), 1);
     $this->Cell(35, 5, utf8_decode('Número:'), 1);
     $this->Ln();
     $this->SetFont('Arial', NULL, 8);
     $this->Cell(242, 5, utf8_decode($oContribuinte->getDescricaoLogradouro()), 1);
     $this->Cell(35, 5, utf8_decode($oContribuinte->getLogradouroNumero()), 1);
     $this->Ln(6);
     $this->SetFont('Arial', 'B', 8);
     $this->Cell(90, 5, utf8_decode('Complemento:'), 1);
     $this->Cell(80, 5, utf8_decode('Bairro:'), 1);
     $this->Cell(72, 5, utf8_decode('Cidade:'), 1);
     $this->Cell(35, 5, utf8_decode('Estado:'), 1);
     $this->Ln();
     $this->SetFont('Arial', NULL, 8);
     $this->Cell(90, 5, utf8_decode($oContribuinte->getLogradouroComplemento()), 1);
     $this->Cell(80, 5, utf8_decode($oContribuinte->getLogradouroBairro()), 1);
     $this->Cell(72, 5, utf8_decode($oContribuinte->getDescricaoMunicipio()), 1);
     $this->Cell(35, 5, utf8_decode($oContribuinte->getEstado()), 1);
     $this->Ln(6);
     $oDataAtual = new DateTime();
     $sEnderecoIp = $_SERVER['REMOTE_ADDR'];
     $this->SetFont('Arial', 'B', 8);
     $this->Cell(139, 5, utf8_decode("Endereço IP: {$sEnderecoIp}"), 1);
     $this->Cell(138, 5, utf8_decode("Data da impressão: {$oDataAtual->format('d/m/Y H:i:s')}"), 1);
     $this->Ln(7);
 }
 /**
  * Verifica se a competencia é corrente
  *
  * @return boolean
  */
 public function isCorrente()
 {
     $oDataAtual = new DateTime();
     $oDataCompetencia = new DateTime(DBSeller_Helper_Date_Date::invertDate('01/' . $this->getCompetencia(), '/'));
     $sCompetenciaAtual = $oDataAtual->format('Ym');
     $sCompetencia = $oDataCompetencia->format('Ym');
     return $sCompetencia === $sCompetenciaAtual;
 }
 /**
  * Prepara os dados da guia a ser gerada
  *
  * @param  Administrativo_Model_UsuarioContribuinte $oContribuinte
  * @param  int                                      $iAnoCompetencia
  * @param  int                                      $iMesCompetencia
  * @param  array                                    $aNotas
  * @param  int                                      $iIdGuia
  * @return object                                   $oGuiaGerar
  */
 public static function montaDadosGuia(Administrativo_Model_UsuarioContribuinte $oContribuinte, $iAnoCompetencia, $iMesCompetencia, $aNotas, $sDataPagamento, $iIdGuia)
 {
     $sData = DBSeller_Helper_Date_Date::invertDate($sDataPagamento);
     $oData = new DateTime($sData);
     $oGuiaGerar = new StdClass();
     $oGuiaGerar->inscricao_municipal = $oContribuinte->getIm();
     $oGuiaGerar->cpf_cnpj = $oContribuinte->getCnpjCpf();
     $oGuiaGerar->numcgm = $oContribuinte->getCgm();
     $oGuiaGerar->mes_competencia = $iMesCompetencia;
     $oGuiaGerar->ano_competencia = $iAnoCompetencia;
     $oGuiaGerar->codigo_guia = $iIdGuia;
     $aListaNotas = array();
     foreach ($aNotas as $oDocumentoNota) {
         $oNota = new stdClass();
         $oNota->numero_nota_fiscal = $oDocumentoNota->getNotaNumero();
         $oNota->codigo_documento = $oDocumentoNota->getId();
         $oNota->data_nota_fiscal = $oDocumentoNota->getNotaData()->format('Y-m-d');
         $oNota->serie_nota_fiscal = $oDocumentoNota->getNotaSerie();
         $oNota->valor_base_calculo = $oDocumentoNota->getServicoBaseCalculo();
         $oNota->valor_deducao = $oDocumentoNota->getServicoValorDeducao();
         $oNota->valor_imposto_retido = $oDocumentoNota->getServicoValorImposto();
         $oNota->valor_servico_prestado = $oDocumentoNota->getServicoValorPagar();
         $oNota->aliquota = $oDocumentoNota->getServicoAliquota();
         $oNota->data_pagamento = $oData->format('Y-m-d');
         $oNota->retido = $oDocumentoNota->getServicoImpostoRetido();
         $oNota->situacao = $oDocumentoNota->getSituacaoDocumento() == 'N' ? '0' : '1';
         $oNota->status = 1;
         $oNota->servico_prestado = urlencode($oDocumentoNota->getDescricaoServico());
         // Serviços prestados
         if ($oDocumentoNota->getOperacao() == self::SERVICO_PRESTADO) {
             $oNota->cnpj_prestador = $oDocumentoNota->getPrestadorCpfCnpj();
             $oNota->inscricao_prestador = $oDocumentoNota->getPrestadorInscricaoMunicipal();
             $oNota->nome = urlencode($oDocumentoNota->getPrestadorRazaoSocial());
             $oNota->operacao = 2;
         } else {
             $oNota->cnpj_prestador = $oDocumentoNota->getTomadorCpfCnpj();
             $oNota->inscricao_prestador = $oDocumentoNota->getTomadorInscricaoMunicipal();
             $oNota->nome = $oDocumentoNota->getTomadorRazaoSocial();
             $oNota->operacao = 1;
         }
         // Limita para o tamanho do campo no ecidade
         if (strlen($oNota->nome) > 60) {
             $oNota->nome = substr($oNota->nome, 57) . '...';
         }
         // Adiciona a nota na lista
         $aListaNotas[] = $oNota;
     }
     $oGuiaGerar->notas = $aListaNotas;
     return $oGuiaGerar;
 }
 /**
  * Verifica se o contribuinte é optante pelo simples na data especificada
  * Utiliza o mesmo método utilizado no DMS
  *
  * @see Contribuinte_Lib_Controller_AbstractController::verificarContribuinteOptanteSimplesAction()
  * @throws Exception
  */
 public function verificarContribuinteOptanteSimplesAction()
 {
     try {
         $sData = $this->getRequest()->getParam('data');
         if (!$sData) {
             throw new Exception('Informe a data para verificar.');
         }
         $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($sData, '-'));
         if (!$oDataSimples instanceof DateTime) {
             throw new Exception('Data inválida');
         }
         $oContribuinte = $this->_session->contribuinte;
         $oParametros = Contribuinte_Model_ParametroContribuinte::getById($oContribuinte->getIdUsuarioContribuinte());
         $aRetorno['optante_simples_nacional'] = $oContribuinte->isOptanteSimples($oDataSimples) ? TRUE : FALSE;
         $aRetorno['optante_simples_categoria'] = $oContribuinte->getOptanteSimplesCategoria();
         if ($oParametros instanceof Contribuinte_Model_ParametroContribuinte) {
             $fAliquota = $oParametros->getEntity()->getValorIssFixo();
             $aRetorno['valor_iss_fixo'] = DBSeller_Helper_Number_Format::toMoney($fAliquota);
         }
         echo $this->getHelper('json')->sendJson($aRetorno);
     } catch (Exception $oError) {
         $aRetorno['erro'] = TRUE;
         $aRetorno['mensagem'] = $oError->getMessage();
         echo $this->getHelper('json')->sendJson($aRetorno);
     }
 }
 /**
  * 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;
 }