예제 #1
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();
        }
예제 #2
0
        public void Execute()
        {
            // Verifica se as dependências foram instanciadas (se o método InitializeTaskState foi chamado)
            if (taskParams == null)
            {
                return;
            }
            if (dataAccess == null)
            {
                return;
            }
            if (notifications == null)
            {
                return;
            }
            if (fileLogger == null)
            {
                return;
            }

            dataAccess.OpenConnection();

            TenantDAO     tenantDAO     = new TenantDAO(dataAccess.GetConnection());
            PreferenceDAO preferenceDAO = new PreferenceDAO(dataAccess.GetConnection());
            MailingDAO    mailingDAO    = new MailingDAO(dataAccess.GetConnection());

            List <Object> tenantList = tenantDAO.GetAllTenants();

            foreach (Tenant tenant in tenantList)
            {
                currentTenant = tenant.id;
                Preference senderPreference = preferenceDAO.GetTenantPreference(currentTenant, "sysSender");
                currentSysSender = senderPreference.value;
                Preference exportPreference = preferenceDAO.GetTenantPreference(currentTenant, "exportFormat");
                int        exportFormat     = 0; // o default é eportar para PDF
                if (exportPreference != null)
                {
                    exportFormat = int.Parse(exportPreference.value);
                }
                currentFormatExtension = GetFormatExtension(exportFormat);
                Preference endDatePreference = preferenceDAO.GetTenantPreference(currentTenant, "periodEndDate");
                currentPeriodEndDate = 1; // o default é o periodo entre o dia 1 deste mês e o dia 1 do mês passado
                if (endDatePreference != null)
                {
                    currentPeriodEndDate = int.Parse(endDatePreference.value);
                }
                currentReportBuilder = GetReportBuilder(exportFormat);

                List <Object> mailingList = mailingDAO.GetAllMailings(currentTenant);
                foreach (Mailing mailing in mailingList)
                {
                    ProcessMailing(mailingDAO, mailing);
                }
            }

            dataAccess.CloseConnection();
        }
예제 #3
0
        protected void Page_Load(object sender, EventArgs e)
        {
            settingsMasterPage = (SettingsMasterPage)Page.Master;
            settingsMasterPage.InitializeMasterPageComponents();
            DataAccess dataAccess = settingsMasterPage.dataAccess;

            int     mailingId;
            Boolean isNumeric = int.TryParse(Request.QueryString["mailingId"], out mailingId);

            if (!isNumeric)
            {
                EmbedClientScript.ShowErrorMessage(this, "Os parâmetros passados para a página não estão em um formato válido.", true);
                return;
            }

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

            mailingDAO = new MailingDAO(dataAccess.GetConnection());
            Mailing mailing = mailingDAO.GetMailing(tenant.id, mailingId);

            if (mailing == null)
            {
                mailing          = new Mailing();
                mailing.tenantId = tenant.id;
            }

            SettingsInput settingsInput = new SettingsInput(settingsArea, null);

            settingsInput.AddHidden("txtId", mailing.id.ToString());
            settingsInput.AddHidden("txtTenantId", mailing.tenantId.ToString());
            ListItem[] items = DropDownScaffold.RetrieveStrict("pr_retrieveSmtpServer", dataAccess.GetConnection(), typeof(SmtpServer));
            settingsInput.AddDropDownList("cmbSmtpServer", "Servidor SMTP", mailing.smtpServer, items);
            settingsInput.AddDropDownList("cmbFrequency", "Frequencia de Envio", mailing.frequency, typeof(ReportFrequencyEnum));
            settingsInput.AddDropDownList("cmbReportType", "Relatório", mailing.reportType, typeof(ReportTypeEnum));
            settingsInput.Add("txtRecipients", "Enviar para", mailing.recipients);
            settingsInput.AddHidden("txtLastSend", mailing.lastSend.ToShortDateString());
        }
예제 #4
0
        private static void ProcessMailingList()
        {
            DataConnector dataConnector = new DataConnector();

            dataConnector.OpenConnection();

            primaryServer   = dataConnector.GetServer("Primary");
            secondaryServer = dataConnector.GetServer("Secondary");

            // Busca o servidor de envio que trabalha na porta 587 ( porta que o NET Smtp Client aceita )
            SmtpServerDAO        smtpServerDAO = new SmtpServerDAO(dataConnector.MySqlConnection);
            List <SmtpServerDTO> serverList    = smtpServerDAO.GetServers("porta=587");
            SmtpServerDTO        smtpServer    = null;

            if (serverList.Count == 1)
            {
                smtpServer = serverList[0];
            }

            String            listaEnvio  = "";
            MailingDAO        mailingDAO  = new MailingDAO(dataConnector.MySqlConnection);
            List <MailingDTO> mailingList = mailingDAO.GetMailings(null);

            foreach (MailingDTO mailing in mailingList)
            {
                // Verifica se hoje é o dia do faturamento
                Boolean isBillingTime  = false;
                int     diaFaturamento = mailing.diaFaturamento;
                if (diaFaturamento < 1)
                {
                    diaFaturamento = 1;                     // Consiste o dia para casos onde o usuário entrou um número negativo ou zero
                }
                int daysInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
                if (diaFaturamento > daysInMonth)
                {
                    diaFaturamento = daysInMonth;                               // Consiste o dia para casos onde exceda a quantidade de dias do mês
                }
                isBillingTime = (diaFaturamento == DateTime.Now.Day);

                // Verifica se já foi enviado hoje
                Boolean alreadySent = mailing.ultimoEnvio.Date == DateTime.Now.Date;

                if ((isBillingTime) && (!alreadySent) && (smtpServer != null))
                {
                    Boolean active = AreContractsActive(dataConnector, mailing);
                    if (active)
                    {
                        SendMailing(dataConnector, mailing, smtpServer);
                        listaEnvio += " Cliente: " + mailing.businessPartnerCode + " - " + mailing.businessPartnerName + " Enviado para: " + mailing.destinatarios + Environment.NewLine;
                    }
                }
            }
            if (String.IsNullOrEmpty(listaEnvio))
            {
                listaEnvio = "Vazia";
            }
            if (EventLog.SourceExists("Billing Mailer"))
            {
                EventLog.WriteEntry("Billing Mailer", "Lista de envio -> " + Environment.NewLine + listaEnvio);
            }

            dataConnector.CloseConnection();
        }
예제 #5
0
        private static void SendMailing(DataConnector connector, MailingDTO mailing, SmtpServerDTO server)
        {
            MailMessage mailMessage = null;

            if (mailing.codigoContrato == 0)
            {
                mailMessage = MountBusinessPartnerBilling(connector, mailing.businessPartnerCode, mailing.enviarDemonstrativo);
            }
            else
            {
                mailMessage = MountContractBilling(connector, mailing.codigoContrato, mailing.codigoSubContrato, mailing.enviarDemonstrativo);
            }

            List <String> reportFiles = null;

            if (mailing.enviarDemonstrativo && mailMessage.Attachments.Count > 0)
            {
                reportFiles = new List <String>();
                foreach (Attachment mailAttachment in mailMessage.Attachments)
                {
                    reportFiles.Add(mailAttachment.Name);
                }
            }

            // TODO:  Consertar o envio através do .NET,  utilizar algum componente que funcione, o SmtpClient
            //        da Microsoft não suporta SSL implicito
            SmtpServer smtpServer = SmtpServer.ImportFromDTO(server);
            MailSender mailSender = new MailSender(smtpServer, new TraceHandler());

            mailSender.SetContents(mailMessage.Body, reportFiles);
            Boolean success = mailSender.SendMail("Faturamento de contrato", server.usuario, mailing.destinatarios);

            if (!success)
            {
                // caso não tenha tido sucesso ao enviar através do SmtpClient do .NET tenta enviar pelo PHP
                String mailerUrl       = "http://" + primaryServer + "/Contratos/AjaxCalls/SendEmail.php";
                String mailerParams    = "subject=Faturamento%20de%20contrato&mailBody=" + mailMessage.Body + "&recipients=" + mailing.destinatarios;
                String aditionalParams = "&fileCount=0";
                if (reportFiles != null)
                {
                    aditionalParams = "&fileCount=" + reportFiles.Count;
                    int fileIndex = 0;
                    foreach (String filename in reportFiles)
                    {
                        aditionalParams += "&filename" + fileIndex + "=" + reportFiles[fileIndex];
                        aditionalParams += "&path" + fileIndex + "=" + Environment.CurrentDirectory + @"\" + reportFiles[fileIndex];
                        fileIndex++;
                    }
                }

                RequestHandler mailerRequest = new RequestHandler(mailerUrl, new TraceHandler());
                mailerRequest.StartRequest(mailerParams + aditionalParams, null);
                String mailerResponse = (String)mailerRequest.ParseResponse(typeof(System.String));

                if (mailerResponse == "Email enviado com sucesso!")
                {
                    success = true;
                }
                if (!success)
                {
                    EventLog.WriteEntry("Billing Mailer", mailerResponse);
                }
            }

            if (success) // e-mail enviado com sucesso, grava no banco de dados a data
            {
                MailingDAO mailingDAO = new MailingDAO(connector.MySqlConnection);
                mailing.ultimoEnvio = DateTime.Now;
                mailingDAO.SetMailing(mailing);
            }
        }
예제 #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));
        }