public static void ImprimeDANFe(NotaFiscal oNotaProc, Parametro oParam, ClientEnvironment manager)
        {
            var stVersao = "_v2.00";

            if (oNotaProc.versao == VersaoXML.NFe_v310)
            {
                stVersao = "_v3.10";
            }

            String nomeArquivo         = oNotaProc.nProt + stVersao + "-procNFe.xml";
            string nomeArquivoProcesso = oParam.pastaSaida + nomeArquivo;

            NFeUtils.GeraArquivoProcNFe(oNotaProc, nomeArquivoProcesso, oParam.versaoDados);

            if (!File.Exists(nomeArquivoProcesso))
            {
                throw new Exception("Não foi possível localizar o arquivo de processo : " + oParam.pastaSaida + nomeArquivo);
            }

            File.Copy(nomeArquivoProcesso, oParam.pastaImpressao + nomeArquivo, true);

            oNotaProc.codigoSituacao    = TipoSituacaoNota.Impressa;// 15;//impressa
            oNotaProc.descricaoSituacao = "Nota Impressa";
            oNotaProc.dataSituacao      = DateTime.Now;

            oNotaProc.Save(manager);

            //integracao
            try
            {
                MMCustom.MMUtils.ImprimeDanfe(oNotaProc.chaveNota,
                                              (int)oNotaProc.codigoSituacao,
                                              oNotaProc.descricaoSituacao,
                                              oNotaProc.cStat,
                                              oNotaProc.xMotivo,
                                              oNotaProc.nProt,
                                              nomeArquivoProcesso);
            }
            catch { }
        }
        public static void ThreadMasterExecution(Object oThreadIdetificada)
        {
            ThreadIdetificada oTh     = (ThreadIdetificada)oThreadIdetificada;
            String            ConAux  = (String)oTh.args[0];
            String            empresa = (String)oTh.args[1];
            bool enviarErro           = false;

            if (oTh.args.Length > 2)
            {
                enviarErro = (bool)oTh.args[2];
            }

            ClientEnvironment manager = null;
            FuncaoAutomacao   oFuncao = null;

            try
            {
                oTh.executando = true;
                oTh.DoOnStart(null, new StatusEventArgs()
                {
                    empresa = empresa
                });

                manager = Conexao.CreateManager(ConAux);
                oFuncao = new FuncaoAutomacao(empresa, manager, enviarErro);

                oFuncao.CriaLog(998, "Serviço de monitoramento inicializado com sucesso.");


                DateTime dataUltimaExecucao    = DateTime.Now;
                Int32    totalMilliSecondsTime = 1000;

                while (!oTh.finalizar)
                {
                    TimeSpan elapsed = DateTime.Now.Subtract(dataUltimaExecucao);
                    if (elapsed.TotalMilliseconds < totalMilliSecondsTime)
                    {
                        Double delay = totalMilliSecondsTime - elapsed.TotalMilliseconds;

                        try
                        {
                            Thread.Sleep((int)delay);
                        }
                        catch { }
                    }
                    else
                    {
                        //verificar estado da conexao
                        if (manager.connection.State != System.Data.ConnectionState.Open)
                        {
                            //conexao não esta aberta
                            manager = Conexao.CreateManager(ConAux);
                            oFuncao.UpdateManager(manager);
                        }

                        dataUltimaExecucao = DateTime.Now;

                        NFeUtils.GeraHeartBeat(true, empresa);

                        oFuncao.DoOnLoop(false, "");
                    }
                }

                oTh.executando = false;
                oTh.DoOnStop(null, new StatusEventArgs()
                {
                    empresa = empresa
                });
                oFuncao.CriaLog(997, "Serviço de monitoramento paralizado com sucesso.");
            }
            catch (Exception ex)
            {
                ExceptionEventArgs ev = new ExceptionEventArgs();
                ev.error = ex;
                oTh.DoOnError(null, ev);
            }
            finally
            {
                oFuncao        = null;
                oTh.executando = false;
                oTh.finalizado = true;
                Conexao.DisposeManager(manager);
            }
        }