//
// Class: XtraSendLogic
// Current CLR: 4.0.30319.42000
// System: Microsoft Visual Studio 10.0
// Author: dani
// Created: 11/30/2015 7:48:46 AM
//
// Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved.
using System;
using System.Collections.Generic;
namespace bsmd.database
{
public class XtraSendLogic
{
///
/// Diese Methode entscheidet, ob die Nachrichtenklasse versendet werden soll oder nicht
/// Darin sind einige spezielle Festlegungen implementiert, die aus der Integrationsphase
/// kommen
///
/// true falls Nachricht versendet werden soll
public static bool ShouldSendMessage(Message message)
{
// zurückgestellte Nachrichten werden ignoriert
if (message.InternalStatus == Message.BSMDStatus.SUSPENDED) return false;
if (message.InternalStatus == Message.BSMDStatus.UNDEFINED) return false;
// Wenn das ein Transit ist, werden nicht erforderliche Meldeklassen übersprungen
if (message.MessageCore.IsTransit)
{
if ((message.MessageNotificationClass == Message.NotificationClass.BKRD) ||
(message.MessageNotificationClass == Message.NotificationClass.PRE72H) ||
(message.MessageNotificationClass == Message.NotificationClass.TIEFD) ||
(message.MessageNotificationClass == Message.NotificationClass.NAME) ||
(message.MessageNotificationClass == Message.NotificationClass.INFO) ||
(message.MessageNotificationClass == Message.NotificationClass.ATA) ||
(message.MessageNotificationClass == Message.NotificationClass.ATD) ||
(message.MessageNotificationClass == Message.NotificationClass.LADG) ||
(message.MessageNotificationClass == Message.NotificationClass.SERV) ||
(message.MessageNotificationClass == Message.NotificationClass.WAS) ||
(message.MessageNotificationClass == Message.NotificationClass.TOWD) ||
(message.MessageNotificationClass == Message.NotificationClass.HAZD) || // hinzugefügt nach Trello Karte 26.6.18
(message.MessageNotificationClass == Message.NotificationClass.STO))
{
message.StatusInfo = "Meldeklasse bei Transitmeldung nicht versandt";
return false;
}
}
// Wenn kein Gefahrgut gemeldet ist soll die Meldeklasse gar nicht gesendet werden
if ((message.MessageNotificationClass == Message.NotificationClass.HAZA) ||
(message.MessageNotificationClass == Message.NotificationClass.HAZD))
{
if (message.Elements.Count > 0)
{
HAZ haz = message.Elements[0] as HAZ;
if (haz != null)
{
if (!haz.HasPositions) // 15.11.17: "Im Grunde müsste nicht das Feld NoDPG der Auslöser für Suspend sein, sondern wenn keine Position in einer der Tabellen enthalten ist."
{
message.StatusInfo = "Meldeklasse nicht versandt: Kein Gefahrgut deklariert";
return false;
}
// Diese Einstellung wird im EU-NOAD Tool gemacht, muss bei anderen Quellen überarbeitet werden!
// if (haz.TransmissionType != "EU-NOAD") return false;
// Schiffe nach Hamburg keine Gefahrgutmeldung, geht über GEGIS (26.11.2015)
// Nach Rückmeldung vom Test ENI-2 wieder entfernt (16.8.2017)
// if (message.MessageCore.PoC.Equals("DEHAM")) return false;
}
}
}
// ATD wird nur gesendet, wenn weniger als 60 Minuten in der Zukunft
// und auch nicht älter als eine Woche
if (message.MessageNotificationClass == Message.NotificationClass.ATD)
{
if (message.Elements.Count > 0)
{
bsmd.database.ATD atd = message.Elements[0] as bsmd.database.ATD;
if (!atd.ATDPortOfCall.HasValue)
{
message.StatusInfo = "ATD ohne Zeitpunkt wird nicht versandt";
return false;
}
if ((atd.ATDPortOfCall.Value - DateTime.UtcNow).TotalMinutes > 60)
{
message.StatusInfo = "ATD mehr als 60 Minuten in der Zukunft!";
return false;
}
/* RM Christin entfernt 17.8.17
if ((DateTime.UtcNow - atd.ATDPortOfCall.Value).TotalDays > 7)
{
message.StatusInfo = "ATD älter als eine Woche!";
return false;
}
*/
}
}
// ATA älter als eine Woche wird auch nicht versendet
if (message.MessageNotificationClass == Message.NotificationClass.ATA)
{
if (message.Elements.Count > 0)
{
bsmd.database.ATA ata = message.Elements[0] as bsmd.database.ATA;
if (!ata.ATAPortOfCall.HasValue)
{
message.StatusInfo = "ATA ohne Zeitpunkt wird nicht versandt";
return false;
}
/* RM Christin entfernt 17.8.17
if ((DateTime.UtcNow - ata.ATAPortOfCall.Value).TotalDays > 7)
{
message.StatusInfo = "ATA älter als eine Woche!";
return false;
}
*/
}
}
if (message.MessageNotificationClass == Message.NotificationClass.TIEFA)
{
if (message.Elements.Count > 0)
{
bsmd.database.TIEFA tiefa = message.Elements[0] as bsmd.database.TIEFA;
if (!tiefa.DraughtUponArrival_DMT.HasValue)
{
message.StatusInfo = "TIEFA without value";
return false;
}
}
}
if (message.MessageNotificationClass == Message.NotificationClass.TIEFD)
{
if (message.Elements.Count > 0)
{
bsmd.database.TIEFD tiefd = message.Elements[0] as bsmd.database.TIEFD;
if (!tiefd.DraughtUponDeparture_DMT.HasValue)
{
message.StatusInfo = "TIEFD without value";
return false;
}
}
}
if (Message.IsListClass(message.MessageNotificationClass) && (message.Elements.Count == 0) && (!message.Reset))
{
message.StatusInfo = "empty list message type";
return false;
}
return true;
}
}
}