/**
  * @param Contribuinte_Model_Contribuinte $oContribuinte
  * @param                                 $iAno
  * @param                                 $iMes
  * @param null                            $fAliquota
  * @return object
  */
 public static function getTotalReceitasCompetencia(Contribuinte_Model_Contribuinte $oContribuinte, $iAno, $iMes, $fAliquota = NULL)
 {
     $aReceitasGuia = array();
     $aParametros = array('contribuinte' => $oContribuinte->getContribuintes(), 'competencia_inicial' => "{$iAno}{$iMes}");
     $aImportacaoDesif = Contribuinte_Model_ImportacaoDesif::getByAttributes($aParametros);
     /**
      * Verifica se retornou uma importacao desif
      */
     if (isset($aImportacaoDesif[0])) {
         $oImportacaoDesif = $aImportacaoDesif[0]->getEntity();
         $aReceitasGuia = Contribuinte_Model_ImportacaoDesif::getTotalReceitasGuia($oImportacaoDesif->getId(), TRUE, $fAliquota);
     }
     return (object) $aReceitasGuia;
 }
 /**
  * Gera o documento do livro fiscal e retorna o nome do arquivo gerado
  *
  * @param Contribuinte_Model_Contribuinte $oContribuinte
  * @return null|string
  * @throws Exception
  */
 private function livroFiscalGerarDocumento(Contribuinte_Model_Contribuinte $oContribuinte)
 {
     $oDadosPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
     $sDataHoraGeracao = date('YmdHis');
     $sArquivoPdf = "livro_fiscal_{$sDataHoraGeracao}.pdf";
     try {
         // Parâmetros do formulário
         $sCompetenciaInicial = $this->getRequest()->getParam('data_competencia_inicial');
         $sCompetenciaFinal = $this->getRequest()->getParam('data_competencia_final');
         // Separa os meses e anos
         $iCompetenciaInicialMes = substr($sCompetenciaInicial, 0, 2);
         $iCompetenciaFinalMes = substr($sCompetenciaFinal, 0, 2);
         $iCompetenciaInicialAno = substr($sCompetenciaInicial, -4);
         $iCompetenciaFinalAno = substr($sCompetenciaFinal, -4);
         // Dados do gerenciador de entidade e conexão (Doctrine)
         $oEntityManager = Zend_Registry::get('em');
         $oConexao = $oEntityManager->getConnection();
         // Inicia o processo de geração do PDF
         $oPdf = new DBSeller_Helper_Pdf_LivroFiscal('l');
         $oPdf->setNomeArquivo($sArquivoPdf);
         $oPdf->setAmbiente(getenv('APPLICATION_ENV'));
         $oPdf->openPdf();
         $sCodigosContribuintes = NULL;
         // Une todos os ID's referentes ao contribuinte
         foreach ($oContribuinte->getContribuintes() as $iIdContribuinte) {
             if ($sCodigosContribuintes == NULL) {
                 $sCodigosContribuintes = $iIdContribuinte;
             } else {
                 $sCodigosContribuintes .= ',' . $iIdContribuinte;
             }
         }
         // Varre os anos para geração do relatório
         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;
                 }
                 // Monta os dados da prefeitura
                 $oPdf->setDadosPrefeitura($oDadosPrefeitura);
                 // Monta os dados do contribuinte
                 $oPdf->setDadosContribuinte($oContribuinte, $iMesLoop, $iAnoLoop);
                 // Parametros consulta documentos
                 $aParametrosDocumentos = array();
                 $aParametrosDocumentos['iAno'] = $iAnoLoop;
                 $aParametrosDocumentos['iMes'] = $iMesLoop;
                 // Documentos validos
                 $oStatementValidos = $oConexao->prepare("\n            SELECT   *\n            FROM     view_nota_mais_dms WHERE\n                     servico_iss_retido          = false                        AND\n                    (dms_operacao                = 's' OR dms_operacao IS NULL) AND\n                     documento_competencia_ano   = :iAno                        AND\n                     documento_competencia_mes   = :iMes                        AND\n                     documento_id_contribuinte IN ({$sCodigosContribuintes})\n            ORDER BY documento_data,\n                     documento_numero,\n                     documento_tipo\n          ");
                 // Monta a lista dos documentos validos do contribuinte
                 $oPdf->setDadosDocumentosValidos($oStatementValidos, $aParametrosDocumentos);
                 $oPdf->Ln(10);
                 // Documentos Substituídos
                 $oStatementSubstituitos = $oConexao->prepare("\n            SELECT   *\n            FROM     view_nota_mais_dms WHERE\n                     servico_iss_retido          = true                         AND\n                    (dms_operacao                = 's' OR dms_operacao IS NULL) AND\n                     documento_competencia_ano   = :iAno                        AND\n                     documento_competencia_mes   = :iMes                        AND\n                     documento_id_contribuinte in ({$sCodigosContribuintes})\n            ORDER BY documento_data,\n                     documento_numero,\n                     documento_tipo\n          ");
                 // Monta a lista dos documentos substituídos do contribuinte
                 $oPdf->setDadosDocumentosSubstituidos($oStatementSubstituitos, $aParametrosDocumentos);
             }
             // Parametros termo de abertura/fechamento
             $oParametrosAberturaFechamento = new stdClass();
             $oParametrosAberturaFechamento->oContribuinte = $oContribuinte;
             $oParametrosAberturaFechamento->iAno = $iAnoLoop;
             $oParametrosAberturaFechamento->iCompetenciaInicialMes = $iCompetenciaInicialMes;
             $oParametrosAberturaFechamento->iCompetenciaInicialAno = $iCompetenciaInicialAno;
             $oParametrosAberturaFechamento->iCompetenciaFinalMes = $iCompetenciaFinalMes;
             $oParametrosAberturaFechamento->iCompetenciaFinalAno = $iCompetenciaFinalAno;
             // Gera os termos de abertura e fechamento
             $oPdf->setDadosAberturaFechamento($oParametrosAberturaFechamento);
             $oParametrosAberturaFechamento->lFechamento = TRUE;
             $oPdf->setDadosAberturaFechamento($oParametrosAberturaFechamento);
             $oPdf->setNumeroPagina(1);
         }
         // Gera o arquivo no diretório "/public/tmp/"
         $oPdf->Output();
         // Retorna o nome do arquivo gerado
         return $sArquivoPdf;
     } catch (Exception $oErro) {
         throw new Exception("Erro ao gerar o relatório: {$oErro->getMessage()}");
     }
 }