git_bsmd/ENI2/Report/ReportManager.cs

103 lines
3.9 KiB
C#

// 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<Message.NotificationClass> notificationClasses, out string readMessage)
{
bool result = false;
readMessage = "";
if(notificationClasses.Count == 0)
{
readMessage = "no classes selected";
return result;
}
List<Message> messages = DBManager.Instance.GetMessagesForCore(core, DBManager.MessageLoad.ALL);
List<Message> reportMessages = new List<Message>();
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 reportMessages)
{
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<string, string> coverInfos = new Dictionary<string, string>();
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<bsmd.database.Message>
{
public int Compare(Message x, Message y)
{
return Message.ANSWSortList.IndexOf(x.MessageNotificationClass).CompareTo(Message.ANSWSortList.IndexOf(y.MessageNotificationClass));
}
}
}
}