/**
  * 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);
 }