/// <summary>
        /// Obtem a faixa de datas de acordo com a frequência do relatório
        /// </summary>
        public static DateRange GetDateRange(ReportFrequencyEnum reportFrequency)
        {
            DateTime startDate;
            DateTime endDate = DateTime.Now.Date;

            switch (reportFrequency)
            {
            case ReportFrequencyEnum.Daily:
                startDate = endDate.AddDays(-1);
                break;

            case ReportFrequencyEnum.Weekly:
                startDate = endDate.AddDays(-7);
                break;

            default:
                startDate = endDate.AddMonths(-1);
                break;
            }

            DateRange dateRange = new DateRange(true);

            dateRange.SetRange(startDate, endDate);

            return(dateRange);
        }
Esempio n. 2
0
        /// <summary>
        /// Encapsula a chamada ao gerador de relatórios, decide qual classe de relatório utilizar
        /// </summary>
        private void BuildReport(String reportFilename, ReportTypeEnum reportType, ReportFrequencyEnum reportFrequency)
        {
            FileInfo  reportFile = new FileInfo(reportFilename);
            DateRange dateRange  = ReportContext.GetDateRange(reportFrequency);

            // Usa a classe base dos relatórios para obter o nome completo da classe incluindo dll/assembly
            String qualifiedName = typeof(AbstractReport).AssemblyQualifiedName;

            qualifiedName = qualifiedName.Replace("AbstractReport", reportType.ToString());
            Type reportClass = Type.GetType(qualifiedName);

            // Monta os parâmetros do relatório e cria uma instância da classe de relatório
            ArgumentBuilder argumentBuilder = new ArgumentBuilder();

            argumentBuilder.Add("tenantId", currentTenant.ToString());
            argumentBuilder.Add("startDate", dateRange.GetFirstDay().ToString());
            argumentBuilder.Add("endDate", dateRange.GetLastDay().ToString());
            AbstractReport report = (AbstractReport)Activator.CreateInstance(reportClass, argumentBuilder.GetArguments(reportClass));

            // Caso não seja nenhum dos relatórios implementados aborta
            if ((reportClass == null) || (report == null))
            {
                return;
            }

            // Gera o relatório
            report.InitializeComponents(reportFile, currentReportBuilder, dataAccess.GetConnection());
            report.BuildReport();
        }
        /// <summary>
        /// Obtem o texto associado a frequência de envio do relatório
        /// </summary>
        public static String GetFrequencyCaption(ReportFrequencyEnum reportFrequency)
        {
            String frequency = reportFrequency.ToString();

            frequency = AssociatedText.GetFieldDescription(typeof(ReportFrequencyEnum), frequency);

            return(frequency);
        }
Esempio n. 4
0
        private void ProcessMailing(MailingDAO mailingDAO, Mailing mailing)
        {
            SmtpServerDAO       smtpServerDAO   = new SmtpServerDAO(dataAccess.GetConnection());
            SmtpServer          smtpServer      = smtpServerDAO.GetSmtpServer(currentTenant, mailing.smtpServer);
            ReportFrequencyEnum reportFrequency = (ReportFrequencyEnum)mailing.frequency;
            ReportTypeEnum      reportType      = (ReportTypeEnum)mailing.reportType;
            String   recipients = mailing.recipients;
            DateTime lastSend   = mailing.lastSend;

            // Verifica se está na data de envio, aborta caso não esteja
            if (!ReportContext.IsScheduledTime(reportFrequency, currentPeriodEndDate))
            {
                return;
            }

            // Verifica se o log foi importado
            PrintLogPersistence logPersistence = new PrintLogPersistence(currentTenant, dataAccess.GetConnection(), null, false);
            Boolean             logImported    = logPersistence.FileImported(ReportContext.GetDateRange(reportFrequency));

            // Verifica se o relatório já foi enviado hoje
            Boolean alreadySent = lastSend.Date == DateTime.Now.Date;

            // Caso o log tenha sido importado e se ainda não enviou, gera o relatório e envia
            if ((logImported) && (!alreadySent))
            {
                // Inicia o append no arquivo de log (acrescentando o "startingDelimiter")
                fileLogger.LogInfo("Envio de relatório - Iniciando execução...", true);
                // Informa dados do mailing
                fileLogger.LogInfo("Frequência de envio - reportFrequency = " + reportFrequency.ToString());
                fileLogger.LogInfo("Relatório - reportType = " + reportType.ToString());
                fileLogger.LogInfo("Destinatários - recipients = " + recipients);
                notifications.Clear();

                String reportStamp    = DateTime.Now.Ticks.ToString();
                String reportFilename = FileResource.MapDesktopResource("Report" + reportStamp + currentFormatExtension);
                BuildReport(reportFilename, reportType, reportFrequency);

                String        mailSubject     = "Relatório " + ReportContext.GetFrequencyCaption(reportFrequency);
                List <String> attachmentFiles = new List <String>();
                attachmentFiles.Add(reportFilename);
                MailSender mailSender = new MailSender(smtpServer.CreateSysObject(), this);
                mailSender.SetContents("Email gerado automaticamente, não responder.", attachmentFiles);
                Boolean success = mailSender.SendMail(mailSubject, currentSysSender, recipients);

                ProcessNotifications();
                if (success) // Grava a data de envio de envio no banco
                {
                    mailing.lastSend = DateTime.Now.Date;
                    mailingDAO.SetMailing(mailing);
                    fileLogger.LogInfo("Execução concluída.");
                }
            }

            // Tenta remover arquivos temporários, ignora caso os arquivos estejam em uso
            // tentará novamente nas próximas execuções
            ReportContext.TryRemoveTempFiles();
        }
        /// <summary>
        /// Verifica se o horário corrente (DateTime.Now) bate com o horário agendado (conhecido
        /// pela frequência/periodicidade de envio)
        /// </summary>
        public static Boolean IsScheduledTime(ReportFrequencyEnum reportFrequency, int periodEndDate)
        {
            DateTime now = DateTime.Now;

            switch (reportFrequency)
            {
            // Os relatórios são gerados no inicio do dia ( 01:00 horas )
            // não exatamente a meia noite pois o serviço importador precisa importar
            // os logs primeiro

            case ReportFrequencyEnum.Daily:
                // 01:00 horas (inicio do dia)
                return(now.Hour == 1);

            case ReportFrequencyEnum.Weekly:
                // primeiro dia da semana (domingo)
                return((now.DayOfWeek == DayOfWeek.Sunday) && (now.Hour == 1));

            default:
                // relatório mensal por default, gerado no dia do mês definido por periodEndDate
                return((now.Day == periodEndDate) && (now.Hour == 1));
            }
        }
Esempio n. 6
0
        protected void Page_Load(object sender, EventArgs e)
        {
            accountingMasterPage = (AccountingMasterPage)Page.Master;
            accountingMasterPage.InitializeMasterPageComponents();
            dataAccess = accountingMasterPage.dataAccess;


            // action:
            //    null -  Sem ação, apenas lista os mailings
            //    0    -  Excluir mailing, lista os restantes
            //    1    -  Teste execução do mailing
            int?action    = null;
            int?mailingId = null;

            try
            {
                if (!String.IsNullOrEmpty(Request.QueryString["action"]))
                {
                    action = int.Parse(Request.QueryString["action"]);
                }

                if (!String.IsNullOrEmpty(Request.QueryString["mailingId"]))
                {
                    mailingId = int.Parse(Request.QueryString["mailingId"]);
                }
            }
            catch (System.FormatException)
            {
                // Remove todos os controles da página
                configurationArea.Controls.Clear();
                controlArea.Controls.Clear();

                // Mostra aviso de inconsistência nos parâmetros
                WarningMessage.Show(controlArea, ArgumentBuilder.GetWarning());
                return;
            }

            Tenant tenant = (Tenant)Session["tenant"];

            mailingDAO = new MailingDAO(dataAccess.GetConnection());

            if (mailingId != null)
            {
                switch (action)
                {
                case 0:
                    mailingDAO.RemoveMailing(mailingId.Value);
                    Response.Redirect("ConfigMailing.aspx");     // Limpa a QueryString para evitar erros
                    break;

                case 1:
                    Mailing mailing = mailingDAO.GetMailing(tenant.id, mailingId);
                    TestMailing(mailing);
                    break;

                default:
                    break;
                }
            }

            List <Object> mailingList = mailingDAO.GetAllMailings(tenant.id);

            String[] columnNames = new String[] { "Frequência de envio", "Relatório", "Destinatários" };
            //String testScript = "window.location='ConfigMailing.aspx?action=1&mailingId=' + {0};";
            String alterScript  = "window.open('MailingSettings.aspx?mailingId=' + {0}, 'Settings', 'width=540,height=600');";
            String removeScript = "var confirmed = confirm('Deseja realmente excluir este item?'); if (confirmed) window.location='ConfigMailing.aspx?action=0&mailingId=' + {0};";

            EditableListButton[] buttons = new EditableListButton[]
            {
                // Botões que devem aparecer para os items da lista
                //new EditableListButton("Testar", testScript, ButtonTypeEnum.Execute),
                new EditableListButton("Editar", alterScript, ButtonTypeEnum.Edit),
                new EditableListButton("Excluir", removeScript, ButtonTypeEnum.Remove)
            };
            EditableList editableList = new EditableList(configurationArea, columnNames, buttons);

            foreach (Mailing mailing in mailingList)
            {
                ReportFrequencyEnum frequency  = (ReportFrequencyEnum)mailing.frequency;
                ReportTypeEnum      reportType = (ReportTypeEnum)mailing.reportType;

                String[] mailingProperties = new String[]
                {
                    AssociatedText.GetFieldDescription(typeof(ReportFrequencyEnum), frequency.ToString()),
                    AssociatedText.GetFieldDescription(typeof(ReportTypeEnum), reportType.ToString()),
                    mailing.recipients
                };
                // A lista de mailings não possui item default, isDefaultItem é sempre "false"
                editableList.InsertItem(mailing.id, false, mailingProperties);
            }
            editableList.DrawList();

            // O clique do botão chama o script de alteração passando "id = 0", a tela de alteração
            // interpreta "id = 0" como "criar um novo", o id é então gerado no banco de dados.
            btnNovo.Attributes.Add("onClick", String.Format(alterScript, 0));
        }