| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- using GreenTree.Nachtragsmanagement.Core.Plugins;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using GreenTree.Nachtragsmanagement.Core.Domain.Misc;
- using GreenTree.Nachtragsmanagement.Services.User;
- using GreenTree.Nachtragsmanagement.Services.Configuration;
- using GreenTree.Nachtragsmanagement.Services.Appendix;
- using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
- using System.Net.Mail;
- using System.Net;
- using System.Globalization;
- using GreenTree.Nachtragsmanagement.Services.Deviation;
- using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
- using Quartz;
- using GreenTree.Nachtragsmanagement.Services.Logging;
- namespace GreenTree.Nachtragsmanagement.Web.Implementations
- {
- public class DeviationNotificationPlugin : INotificationPlugin, IJob
- {
- #region Services
- private readonly IUserService _userService;
- private readonly IConfigurationService _configurationService;
- private readonly IDeviationService _deviationService;
- private readonly IServiceLogger _logger;
- #endregion
- #region Properties
- /// <summary>
- /// Id
- /// </summary>
- public Guid Id
- {
- get
- {
- return Guid.Parse("77D662E0-F621-4567-9030-2A106533FE06");
- }
- }
- /// <summary>
- /// System name
- /// </summary>
- public string SystemName
- {
- get
- {
- return "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin";
- }
- }
- /// <summary>
- /// List of available notification jobs
- /// </summary>
- public List<NotificationJob> AvailableNotificationJobs
- {
- get
- {
- return new List<NotificationJob>
- {
- new NotificationJob
- (
- Guid.Parse("144DFF97-4EE4-4B32-967C-C0375D133DCF"),
- "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt",
- "Eingangsdatum überprüfen",
- "Erstellt automatisch Benachrichtigungen für Vertragsabweichungen, die 40 Tagen, bzw. 60 Tagen nach " +
- "Einreichung noch keinem Nachtrag zugeordnet sind."
- )
- };
- }
- }
- /// <summary>
- /// Displayed name
- /// </summary>
- public string Name
- {
- get
- {
- return "Vertragsabweichungsbenachrichtigung";
- }
- }
- /// <summary>
- /// Further description on how this plugin works
- /// </summary>
- public string Description
- {
- get
- {
- return
- "Erstellt automatisch Benachrichtigungen für Vertragsabweichungen, die 40 Tagen (Stufe 1), bzw. 60 Tagen (Stufe 2)" +
- "nach Einreichung noch keinem Nachtrag zugeordnet sind.";
- }
- }
- #endregion
- /// <summary>
- /// Initializes a new instance of the DeviationNotificationPlugin class
- /// </summary>
- public DeviationNotificationPlugin() { }
- /// <summary>
- /// Initializes a new instance of the DeviationNotificationPlugin class
- /// </summary>
- public DeviationNotificationPlugin(
- IUserService userService,
- IConfigurationService configurationService,
- IDeviationService deviationService,
- IServiceLogger logger)
- {
- _userService = userService;
- _configurationService = configurationService;
- _deviationService = deviationService;
- _logger = logger;
- }
- #region Quartz implmentation
- /// <summary>
- /// Executes the current job
- /// </summary>
- /// <param name="context"></param>
- public void Execute(IJobExecutionContext context)
- {
- if (!context.JobDetail.JobDataMap.ContainsKey("MailNotifications"))
- return;
- var mailNotifications = context.JobDetail.JobDataMap.Get("MailNotifications") as IEnumerable<MailNotification>;
- ProcessNotifications(mailNotifications);
- }
- #endregion
- #region Processing
- /// <summary>
- /// Process all mail notifications registered for that plugin
- /// </summary>
- /// <param name="mailNotifications">The notifications which shall be generated.</param>
- public void ProcessNotifications(IEnumerable<MailNotification> mailNotifications)
- {
- if (mailNotifications == null || (mailNotifications != null && !mailNotifications.Any())) return;
- _logger.Information(
- String.Format(
- "Starte Verarbeitung Mail-Benachrichtigung in \"{0}\" für \"{1} ...",
- SystemName, mailNotifications.First().NotificationJobSystemName));
- foreach (var notification in mailNotifications)
- {
- try
- {
- switch (notification.NotificationJobSystemName)
- {
- case "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt":
- {
- ProcessDeviationReceiptNotification(notification);
- }
- break;
- default:
- continue;
- }
- }
- catch (Exception ex)
- {
- _logger.Error(
- String.Format(
- "Fehler bei Mail-Benachrichtigung in \"{0}\" für \"{1}", SystemName, notification.NotificationJobSystemName), ex);
- }
- }
- _logger.Information(
- String.Format(
- "Verarbeitung Mail-Benachrichtigung in \"{0}\" für \"{1} erfolgreich abgeschlossen!",
- SystemName, mailNotifications.First().NotificationJobSystemName));
- }
- /// <summary>
- /// Notifies the corresponding recipients about all deviations whose receipt date is older than N days in two different groups
- /// </summary>
- /// <param name="mailNotification">The notification which shall be generated.</param>
- private void ProcessDeviationReceiptNotification(MailNotification mailNotification)
- {
- var ageDaysLevel1 = _configurationService.TryGetConfigItemValue<int>(
- "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel1", 40);
- var ageDaysLevel2 = _configurationService.TryGetConfigItemValue<int>(
- "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel2", 60);
- var deviationsLevel1 = _deviationService.GetAllDeviations()
- .Where(d => !d.AppendixId.HasValue &&
- (DateTime.Now - d.ReceiptDate).Value.Days >= ageDaysLevel1 &&
- (DateTime.Now - d.ReceiptDate).Value.Days < ageDaysLevel2)
- .ToList();
- var deviationsLevel2 = _deviationService.GetAllDeviations()
- .Where(d => !d.AppendixId.HasValue &&
- (DateTime.Now - d.ReceiptDate).Value.Days >= ageDaysLevel2)
- .ToList();
- if (deviationsLevel1.Any() || deviationsLevel2.Any())
- {
- var mailBody = GenerateDeviationReceiptMailBody(deviationsLevel1, deviationsLevel2);
- SendNotification(mailNotification, "Autom. Übersicht nicht zugewiesene Vertragsabweichungen", mailBody);
- }
- }
- #endregion
- #region Mail body generation
- /// <summary>
- /// Generates a mail body with a list of all deviations whose receipt date is older than N days in two different groups
- /// </summary>
- /// <param name="deviationsLevel1">All deviations matching the level 1 criteria.</param>
- /// <param name="deviationsLevel2">All deviations matching the level 2 criteria.</param>
- public string GenerateDeviationReceiptMailBody(IEnumerable<Deviation> deviationsLevel1, IEnumerable<Deviation> deviationsLevel2)
- {
- var ageDaysLevel1 = _configurationService.TryGetConfigItemValue<int>(
- "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel1", 40);
- var ageDaysLevel2 = _configurationService.TryGetConfigItemValue<int>(
- "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel2", 60);
- var template =
- "<html>" +
- " <body>" +
- " {0}" +
- " {1}" +
- " </body>" +
- "</html>";
- var templateLevel1 =
- "<h3>Übersicht \"Offene Vertragsabweichungen älter als {0} Tage\"</h3>" +
- "<p>Folgende Vertragsabweichungen haben ein Einreichdatum älter als {0} Tage, sind aber noch keinen Nachtrag zugeordnet:</p>" +
- "<ul>" +
- " {1}" +
- "</ul>";
- var templateLevel1List = String.Empty;
- if (deviationsLevel1.Any())
- {
- foreach (var deviation in deviationsLevel1)
- {
- templateLevel1List += String.Format(
- "<li>Baustelle <b>\"{1}\"</b> - " +
- "Vertragsabweichung <b>\"{0}\"</b> - " +
- "Einreichdatum: <b>{2:dd.MM.yyyy} ({3} Tage)</b></i>",
- deviation.Site == null
- ? String.Empty
- : deviation.Site.CustomNumber,
- deviation.CustomNumber,
- deviation.ReceiptDate,
- (DateTime.Now - deviation.ReceiptDate).Value.Days);
- }
- }
- var resultLevel1List = String.Format(templateLevel1, ageDaysLevel1, templateLevel1List);
- var templateLevel2 =
- "<h3>Übersicht \"Offene Vertragsabweichungen älter als {0} Tage\"</h3>" +
- "<p>Folgende Vertragsabweichungen haben ein Einreichdatum älter als {0} Tage, sind aber noch keinen Nachtrag zugeordnet:</p>" +
- "<ul>" +
- " {1}" +
- "</ul>";
- var templateLevel2List = String.Empty;
- if (deviationsLevel2.Any())
- {
- foreach (var deviation in deviationsLevel2)
- {
- templateLevel2List += String.Format(
- "<li>Vertragsabweichung <b>\"{0}\"</b> " +
- "in Baustelle <b>\"{1}\"</b> - " +
- "Einreichdatum: <b>{2:dd.MM.yyyy} ({3} Tage)</b>",
- deviation.CustomNumber,
- deviation.Site == null
- ? String.Empty
- : deviation.Site.CustomNumber,
- deviation.ReceiptDate,
- (DateTime.Now - deviation.ReceiptDate).Value.Days);
- }
- }
- var resultLevel2List = String.Format(templateLevel2, ageDaysLevel2, templateLevel2List);
- return String.Format(template, resultLevel1List, resultLevel2List);
- }
- #endregion
- #region Mail sending
- /// <summary>
- /// Sends a generated mail body to the specified recipients in the mail notification
- /// </summary>
- /// <param name="mailNotification">The mail notification.</param>
- /// <param name="subject">The mail subject.</param>
- /// <param name="body">The mail body.</param>
- public void SendNotification(MailNotification mailNotification, string subject, string body)
- {
- if (mailNotification == null) return;
- var mailServerConfig = _configurationService.GetCurrentConfiguration().MailServerElement;
- var smptClient = new SmtpClient(mailServerConfig.SmtpServer, mailServerConfig.Port)
- {
- EnableSsl = mailServerConfig.UseSsl,
- Credentials = new NetworkCredential(
- mailServerConfig.Username,
- mailServerConfig.Password,
- mailServerConfig.Domain)
- };
- var recipients =
- mailNotification.Users
- .Select(u => u.MailAddress);
- var mailMessage = new MailMessage
- {
- IsBodyHtml = true,
- Subject = subject,
- Body = body,
- From = new MailAddress("Nachtragsbenachrichtigung@schweerbau.de")
- };
- foreach (var recipient in recipients)
- mailMessage.To.Add(recipient);
- smptClient.Send(mailMessage);
- }
- #endregion
- }
- }
|