// Copyright (c) 2017-present schick Informatik // Description: Former ReportService, manager class handles creation of a PDF document // from a set of report classes // using System; using System.Text; using System.Collections.Generic; using log4net; using MigraDoc.DocumentObjectModel; using bsmd.database; namespace ENI2.Report { class ReportManager { private readonly ILog _log = LogManager.GetLogger(typeof(ReportManager)); public bool Create(string filePath, MessageCore core, List notificationClasses, out string readMessage) { bool result = false; readMessage = ""; if(notificationClasses.Count == 0) { readMessage = "no classes selected"; return result; } List messages = DBManager.Instance.GetMessagesForCore(core, DBManager.MessageLoad.ALL); List reportMessages = new List(); messages.Sort(new ReportMessageComparer()); StringBuilder sb = new StringBuilder(); foreach (Message aMessage in messages) { if (aMessage.Elements.Count == 0) continue; // don't output empty list classes if (notificationClasses.Contains(aMessage.MessageNotificationClass)) { reportMessages.Add(aMessage); sb.Append(aMessage.MessageNotificationClassDisplay); sb.Append("_"); } } if (sb.Length > 0) sb.Remove(sb.Length - 1, 1); string classes = sb.ToString(); try { string etaDisplay = ""; foreach (Message message in messages) { if(message.MessageNotificationClass == Message.NotificationClass.NOA_NOD) { if (message.Elements[0] is NOA_NOD noa_nod) { if (core.IsTransit && noa_nod.ETAToKielCanal.HasValue) etaDisplay = noa_nod.ETAToKielCanal.Value.ToLocalTime().ToString(); if (!core.IsTransit && noa_nod.ETAToPortOfCall.HasValue) etaDisplay = noa_nod.ETAToPortOfCall.Value.ToLocalTime().ToString(); } } } Dictionary coverInfos = new Dictionary(); coverInfos.Add("Ship", DBManager.Instance.GetShipNameFromCore(core)); coverInfos.Add("ETA", etaDisplay); coverInfos.Add("Port of call", core.Portname); coverInfos.Add("Visit-ID", core.DisplayId); coverInfos.Add("Class", classes); Document migraDocument = ReportDocument.CreateSingleClassDocument(core, coverInfos, classes, ReportingParty.CurrentReportingParty); // print messages to document foreach (Message message in reportMessages) { ReportDocument.AddNSWMessageParagraph(migraDocument, message); } ReportDocument.RenderDocument(migraDocument, filePath); _log.InfoFormat("Created PDF document: {0}", filePath); result = true; } catch (Exception ex) { readMessage += ex.Message; } return result; } internal class ReportMessageComparer : IComparer { public int Compare(Message x, Message y) { return Message.ANSWSortList.IndexOf(x.MessageNotificationClass).CompareTo(Message.ANSWSortList.IndexOf(y.MessageNotificationClass)); } } } }