diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 681bd137..3ea144ac 100644 Binary files a/Stundensheet.xlsx and b/Stundensheet.xlsx differ diff --git a/nsw/GISIS_Codes_DE-Häfen_150915.xls b/nsw/GISIS_Codes_DE-Häfen_150915.xls new file mode 100644 index 00000000..856c7763 Binary files /dev/null and b/nsw/GISIS_Codes_DE-Häfen_150915.xls differ diff --git a/nsw/SLA NSW-Kernsystem und HIS.pdf b/nsw/SLA NSW-Kernsystem und HIS.pdf index a76dbac6..169ea5bb 100644 Binary files a/nsw/SLA NSW-Kernsystem und HIS.pdf and b/nsw/SLA NSW-Kernsystem und HIS.pdf differ diff --git a/nsw/SLA NSW-Kernsystem und Organisation.pdf b/nsw/SLA NSW-Kernsystem und Organisation.pdf index 9f942208..2a419d1e 100644 Binary files a/nsw/SLA NSW-Kernsystem und Organisation.pdf and b/nsw/SLA NSW-Kernsystem und Organisation.pdf differ diff --git a/nsw/Source/SendNSWMessageService/NSWSendService.cs b/nsw/Source/SendNSWMessageService/NSWSendService.cs index fc82ae6b..ff21b76a 100644 --- a/nsw/Source/SendNSWMessageService/NSWSendService.cs +++ b/nsw/Source/SendNSWMessageService/NSWSendService.cs @@ -36,6 +36,7 @@ namespace SendNSWMessageService this.EventLog.Log = "Application"; this.Init(args); this.EventLog.WriteEntry("NSW Send Service started.", EventLogEntryType.Information); + _log.Info("NSW Send Service started"); this.DoOnce(); } @@ -100,6 +101,7 @@ namespace SendNSWMessageService (message.InternalStatus == Message.BSMDStatus.PREPARE) || (message.InternalStatus == Message.BSMDStatus.TOSEND)) { + _log.Debug("Visit/Transit not found, SENDING VISIT/TRANSIT message"); if (message.HIS == Message.NSWProvider.UNDEFINED) message.HIS = core.InitialHIS; toSendMessageList.Add(message); @@ -109,14 +111,18 @@ namespace SendNSWMessageService } else // eine VISIT/TRANSIT Id ist vorhanden, die Daten können gesendet werden { - // versendet werden nur die Nachrichten, die den Status "UNDEFINED", "PREPARE" und "TOSEND" haben - // diese wurden entweder von EU-NOAD angelegt oder durch den Melder bearbeitet - // Wichtig ist eine erfolgreich versendete Meldung nicht erneut zu versenden + // Änderung Sept 15: versendet werden alle Nachrichten, die *nicht* bestätigt sind + // also auch alles was auf in bearbeitung / Korrektur etc steht + // Einzig bleibt die Frage offen, was mit Nachrichten passiert, die über das UI + // nachträglich geändert werden. Ich denke hier muss in dashface ggf. der Status + // wieder auf PREPARE gesetzt werden + _log.Debug("Visit/Transit found, SENDING DATA messages"); foreach (Message message in messages) { - if ((message.InternalStatus == Message.BSMDStatus.UNDEFINED) || - (message.InternalStatus == Message.BSMDStatus.PREPARE) || - (message.InternalStatus == Message.BSMDStatus.TOSEND)) + // T + if (message.InternalStatus != Message.BSMDStatus.CONFIRMED) + //(message.InternalStatus == Message.BSMDStatus.PREPARE) || + //(message.InternalStatus == Message.BSMDStatus.TOSEND)) { if (message.HIS == Message.NSWProvider.UNDEFINED) message.HIS = core.InitialHIS; @@ -177,6 +183,12 @@ namespace SendNSWMessageService _log.ErrorFormat("SENDING message {0}: {1}", message.Id.ToString(), ex.Message); } } + if (toSendMessageList.Count > 0) + { + core.BSMDStatusInternal = MessageCore.BSMDStatus.SENT; + DBManager.Instance.Save(core); + } + } } @@ -213,7 +225,8 @@ namespace SendNSWMessageService protected override void OnStop() { this._timer.Enabled = false; - this.EventLog.WriteEntry("NSW Send Service stopped.", EventLogEntryType.Information); + this.EventLog.WriteEntry("NSW Send Service stopped.", EventLogEntryType.Information); + _log.Info("NSW Send Service stopped"); } } } diff --git a/nsw/Source/bsmd.dakosy.ResponseService/Program.cs b/nsw/Source/bsmd.dakosy.ResponseService/Program.cs index 390bb900..eb25f72f 100644 --- a/nsw/Source/bsmd.dakosy.ResponseService/Program.cs +++ b/nsw/Source/bsmd.dakosy.ResponseService/Program.cs @@ -21,6 +21,8 @@ namespace bsmd.dakosy.ResponseService new SFTPService() }; + log4net.Config.XmlConfigurator.Configure(); + if (Debugger.IsAttached) { ((SFTPService)ServicesToRun[0]).Init(null); diff --git a/nsw/Source/bsmd.dakosy.ResponseService/bsmd.dakosy.ResponseService.csproj b/nsw/Source/bsmd.dakosy.ResponseService/bsmd.dakosy.ResponseService.csproj index 33a50e22..200283b1 100644 --- a/nsw/Source/bsmd.dakosy.ResponseService/bsmd.dakosy.ResponseService.csproj +++ b/nsw/Source/bsmd.dakosy.ResponseService/bsmd.dakosy.ResponseService.csproj @@ -85,7 +85,6 @@ - SettingsSingleFileGenerator diff --git a/nsw/Source/bsmd.database/ATA.cs b/nsw/Source/bsmd.database/ATA.cs index b6f2fa47..1e5e855c 100644 --- a/nsw/Source/bsmd.database/ATA.cs +++ b/nsw/Source/bsmd.database/ATA.cs @@ -25,7 +25,7 @@ namespace bsmd.database #region Properties [ShowReport] - [Validation(ValidationCode.DOUBLE_GT_ZERO)] + [Validation(ValidationCode.NOT_NULL)] public DateTime? ATAPortOfCall { get; set; } #endregion @@ -88,7 +88,7 @@ namespace bsmd.database ATA ata = new ATA(); ata.id = reader.GetGuid(0); - if (!reader.IsDBNull(1)) ata.ATAPortOfCall = reader.GetDateTime(1); + if (!reader.IsDBNull(1)) ata.ATAPortOfCall = DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc); result.Add(ata); } reader.Close(); diff --git a/nsw/Source/bsmd.database/ATD.cs b/nsw/Source/bsmd.database/ATD.cs index 26b307c7..173b40be 100644 --- a/nsw/Source/bsmd.database/ATD.cs +++ b/nsw/Source/bsmd.database/ATD.cs @@ -25,7 +25,7 @@ namespace bsmd.database #region Properties [ShowReport] - [Validation(ValidationCode.DOUBLE_GT_ZERO)] + [Validation(ValidationCode.NOT_NULL)] public DateTime? ATDPortOfCall { get; set; } #endregion @@ -88,7 +88,7 @@ namespace bsmd.database ATD atd = new ATD(); atd.id = reader.GetGuid(0); - if (!reader.IsDBNull(1)) atd.ATDPortOfCall = reader.GetDateTime(1); + if (!reader.IsDBNull(1)) atd.ATDPortOfCall = DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc); result.Add(atd); } reader.Close(); diff --git a/nsw/Source/bsmd.database/Extensions.cs b/nsw/Source/bsmd.database/Extensions.cs index fbf9bcb9..d462fbcf 100644 --- a/nsw/Source/bsmd.database/Extensions.cs +++ b/nsw/Source/bsmd.database/Extensions.cs @@ -65,7 +65,7 @@ namespace bsmd.database public static DateTime? TryParseDateTime(string text) { DateTime date; - if(DateTime.TryParse(text, DateTimeFormatInfo.InvariantInfo,DateTimeStyles.AssumeUniversal, out date)) + if(DateTime.TryParse(text, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal, out date)) { return date; } diff --git a/nsw/Source/bsmd.database/HAZ.cs b/nsw/Source/bsmd.database/HAZ.cs index e7378c79..a7e76ebf 100644 --- a/nsw/Source/bsmd.database/HAZ.cs +++ b/nsw/Source/bsmd.database/HAZ.cs @@ -52,7 +52,7 @@ namespace bsmd.database public bool? DPGClassificationIMSBC { get; set; } [ShowReport] - public bool DPGClassificationMARPOL_ANNEX_I { get; set; } + public bool? DPGClassificationMARPOL_ANNEX_I { get; set; } public List IMDGPositions { get { return this.imdgPositions; } } diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index f0267fee..43c3de3b 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -12,7 +12,7 @@ namespace bsmd.database /// /// Basisklasse aller Nachrichtentypen, zentrale Klasse für die NSW App /// - public class Message : DatabaseEntity, ISublistContainer + public class Message : DatabaseEntity, ISublistContainer, IComparable { #region Fields @@ -514,5 +514,17 @@ namespace bsmd.database #endregion + #region IComparable implementation + + /// + /// Sort messages by notification class + /// + public int CompareTo(Message other) + { + return this.MessageNotificationClass.CompareTo(other.MessageNotificationClass); + } + + #endregion + } } diff --git a/nsw/Source/bsmd.database/NOA_NOD.cs b/nsw/Source/bsmd.database/NOA_NOD.cs index 3222fb8a..2aa01fb7 100644 --- a/nsw/Source/bsmd.database/NOA_NOD.cs +++ b/nsw/Source/bsmd.database/NOA_NOD.cs @@ -82,14 +82,14 @@ namespace bsmd.database { NOA_NOD nn = new NOA_NOD(); nn.id = reader.GetGuid(0); - if (!reader.IsDBNull(1)) nn.ETAToPortOfCall = reader.GetDateTime(1); - if (!reader.IsDBNull(2)) nn.ETDFromPortOfCall = reader.GetDateTime(2); - if (!reader.IsDBNull(3)) nn.ETAToKielCanal = reader.GetDateTime(3); - if (!reader.IsDBNull(4)) nn.ETDFromKielCanal = reader.GetDateTime(4); + if (!reader.IsDBNull(1)) nn.ETAToPortOfCall = DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc); + if (!reader.IsDBNull(2)) nn.ETDFromPortOfCall = DateTime.SpecifyKind(reader.GetDateTime(2), DateTimeKind.Utc); + if (!reader.IsDBNull(3)) nn.ETAToKielCanal = DateTime.SpecifyKind(reader.GetDateTime(3), DateTimeKind.Utc); + if (!reader.IsDBNull(4)) nn.ETDFromKielCanal = DateTime.SpecifyKind(reader.GetDateTime(4), DateTimeKind.Utc); if (!reader.IsDBNull(5)) nn.LastPort = reader.GetString(5); - if (!reader.IsDBNull(6)) nn.ETDFromLastPort = reader.GetDateTime(6); + if (!reader.IsDBNull(6)) nn.ETDFromLastPort = DateTime.SpecifyKind(reader.GetDateTime(6), DateTimeKind.Utc); if (!reader.IsDBNull(7)) nn.NextPort = reader.GetString(7); - if (!reader.IsDBNull(8)) nn.ETAToNextPort = reader.GetDateTime(8); + if (!reader.IsDBNull(8)) nn.ETAToNextPort = DateTime.SpecifyKind(reader.GetDateTime(8), DateTimeKind.Utc); result.Add(nn); } reader.Close(); @@ -182,14 +182,14 @@ namespace bsmd.database errors.Add(RuleEngine.CreateError(ValidationCode.E123, "Departure time before arrival time!", null)); } - if(!this.LastPort.Equals("ZZUKN") && !this.ETDFromLastPort.HasValue) + if((this.LastPort != null) && !this.LastPort.Equals("ZZUKN") && !this.ETDFromLastPort.HasValue) errors.Add(RuleEngine.CreateError(ValidationCode.E125, "ETD last port must be set!", null)); if (this.ETDFromPortOfCall.HasValue && this.ETAToNextPort.HasValue && this.ETAToNextPort < ETDFromPortOfCall) errors.Add(RuleEngine.CreateError(ValidationCode.E122, "ETD PoC must be before ETA next port!", null)); - if (!this.NextPort.Equals("ZZUKN") && !this.ETAToNextPort.HasValue) + if ((this.NextPort != null) && !this.NextPort.Equals("ZZUKN") && !this.ETAToNextPort.HasValue) errors.Add(RuleEngine.CreateError(ValidationCode.E124, "ETA next port must be set!", null)); } diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs index eeaed8ea..96e3c726 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs @@ -2,6 +2,6 @@ [assembly: AssemblyCompany("Informatikbüro Daniel Schick")] [assembly: AssemblyProduct("BSMD NSW interface")] -[assembly: AssemblyInformationalVersion("2.2.0")] +[assembly: AssemblyInformationalVersion("2.3.0")] [assembly: AssemblyCopyright("Copyright © 2014-2015 Informatikbüro Daniel Schick. All rights reserved.")] [assembly: AssemblyTrademark("")] \ No newline at end of file diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs index f82e0dd5..27000242 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -4,6 +4,6 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.*")] +[assembly: AssemblyVersion("2.3.0.*")] // wenn das nicht auskommentiert wird erhalten wir eine Warnung // [assembly: AssemblyFileVersion("1.0.0.*")] diff --git a/nsw/Source/bsmd.database/RuleEngine.cs b/nsw/Source/bsmd.database/RuleEngine.cs index 4567ea48..76c47401 100644 --- a/nsw/Source/bsmd.database/RuleEngine.cs +++ b/nsw/Source/bsmd.database/RuleEngine.cs @@ -20,13 +20,91 @@ namespace bsmd.database { public class RuleEngine { + + #region german LOCODE's static definition + + private static List gerLocodeList = new List() { + "DE001", + "DEAND", + "DEBDF", + "DEBZR", + "DEBMK", + "DEBKE", + "DEBRE", + "DEBRV", + "DEBRB", + "DE651", + "DEBUM", + "DEBUZ", + "DECUX", + "DEDMG", + "DEDTM", + "DEDUI", + "DEDUS", + "DEECK", + "DEELS", + "DEEME", + "DEEMM", + "DEFLF", + "DEGEK", + "DEGLU", + "DEGRD", + "DEHAM", + "DEHHF", + "DEHGL", + "DEHUS", + "DEITZ", + "DEKEL", + "DE136", + "DEKCH", + "DEKLE", + "DECGN", + "DEKRE", + "DE241", + "DELEE", + "DELEW", + "DELIS", + "DELBC", + "DELBM", + "DE002", + "DEMHG", + "DEMOZ", + "DEMUK", + "DEMUH", + "DENSS", + "DENHO", + "DENHA", + "DEOLO", + "DETRD", + "DEPAP", + "DEPEF", + "DEPUT", + "DEREC", + "DEREN", + "DERHB", + "DERSK", + "DESAS", + "DESTL", + "DEUCK", + "DE585", + "DEVRD", + "DEWED", + "DEWVN", + "DEWIS", + "DE003", + "DEWOL", + "DEWYK" + }; + + #endregion + private static ILog log = LogManager.GetLogger(typeof(RuleEngine)); private static Dictionary errorTextList = null; private static Dictionary violationTextList = null; private Dictionary> errorDict = new Dictionary>(); - private Dictionary> violationDict = new Dictionary>(); - + private Dictionary> violationDict = new Dictionary>(); + public RuleEngine() { if (RuleEngine.errorTextList == null) @@ -67,6 +145,8 @@ namespace bsmd.database object propValue = property.GetValue(entity, null); string value = (propValue == null) ? string.Empty : propValue.ToString(); ValidationCode validationCode = ValidationCode.NONE; + int maxlen = 0; + if (Attribute.IsDefined(property, attribType)) { if (entity.GetValidationBlock() == DatabaseEntity.ValidationBlock.BLOCK1) @@ -89,6 +169,7 @@ namespace bsmd.database ValidationAttribute validationAttribute = Attribute.GetCustomAttribute(property, typeof(ValidationAttribute)) as ValidationAttribute; validationCode = validationAttribute.Code; + maxlen = validationAttribute.MaxLen; } } @@ -107,9 +188,8 @@ namespace bsmd.database break; case ValidationCode.LOCODE_GER: { - // TODO: Jan nach der Liste anhauen - Regex rgx = new Regex("[A-Z]{2}[A-Z0-9]{3}"); - if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value)); + if(!RuleEngine.gerLocodeList.Contains(value)) + errors.Add(RuleEngine.CreateError(validationCode, property.Name, value)); } break; case ValidationCode.INT_GT_ZERO: @@ -144,6 +224,18 @@ namespace bsmd.database if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value)); } break; + case ValidationCode.STRING_EXACT_LEN: + { + if (value.Length != maxlen) + errors.Add(RuleEngine.CreateError(validationCode, property.Name, value)); + } + break; + case ValidationCode.STRING_MAXLEN: + { + if (value.Length > maxlen) + errors.Add(RuleEngine.CreateError(validationCode, property.Name, value)); + } + break; default: break; } @@ -191,6 +283,17 @@ namespace bsmd.database log.InfoFormat("Msg Id {0} Type {1} has {2} errors and {3} violations", entity.Id, entity.MessageNotificationClass, errors.Count, violations.Count); + if (errors.Count > 0) + { + ((Message)entity).InternalStatus = Message.BSMDStatus.ERROR; + DBManager.Instance.Save(entity); + } + else if (violations.Count > 0) + { + ((Message)entity).InternalStatus = Message.BSMDStatus.VIOLATION; + DBManager.Instance.Save(entity); + } + } #endregion diff --git a/nsw/Source/bsmd.database/STAT.cs b/nsw/Source/bsmd.database/STAT.cs index b68ed05a..e1a10865 100644 --- a/nsw/Source/bsmd.database/STAT.cs +++ b/nsw/Source/bsmd.database/STAT.cs @@ -67,6 +67,7 @@ namespace bsmd.database public string ISMCompanyName { get; set; } [ShowReport] + [Validation(ValidationCode.STRING_EXACT_LEN, 7)] public string ISMCompanyId { get; set; } [ShowReport] diff --git a/nsw/Source/bsmd.database/ValidationAttribute.cs b/nsw/Source/bsmd.database/ValidationAttribute.cs index 27faccb4..2e93da25 100644 --- a/nsw/Source/bsmd.database/ValidationAttribute.cs +++ b/nsw/Source/bsmd.database/ValidationAttribute.cs @@ -27,6 +27,8 @@ namespace bsmd.database DOUBLE_GT_ZERO, FLAG_CODE, TWO_DIGIT, + STRING_MAXLEN, + STRING_EXACT_LEN, E121 = 121, E122 = 122, E123 = 123, @@ -68,12 +70,25 @@ namespace bsmd.database public class ValidationAttribute : Attribute { private ValidationCode validationCode; + private int maxlen; public ValidationAttribute(ValidationCode code) { this.validationCode = code; } + public ValidationAttribute(ValidationCode code, int maxlen) + { + this.maxlen = maxlen; + this.validationCode = code; + } + + public int MaxLen + { + get { return this.maxlen; } + set { this.maxlen = value; } + } + public ValidationCode Code { get { return this.validationCode; } diff --git a/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.Designer.cs b/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.Designer.cs new file mode 100644 index 00000000..9935daa8 --- /dev/null +++ b/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.Designer.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace bsmd.dbh.ResponseService.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("replace me!")] + public string DBConnectionString { + get { + return ((string)(this["DBConnectionString"])); + } + } + } +} diff --git a/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.settings b/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.settings new file mode 100644 index 00000000..25bf8c4c --- /dev/null +++ b/nsw/Source/bsmd.dbh.ResponseService/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + replace me! + + + \ No newline at end of file diff --git a/nsw/Source/bsmd.herberg.FormService/Util.cs b/nsw/Source/bsmd.herberg.FormService/Util.cs index fdb7c1ae..9c9baae1 100644 --- a/nsw/Source/bsmd.herberg.FormService/Util.cs +++ b/nsw/Source/bsmd.herberg.FormService/Util.cs @@ -79,8 +79,11 @@ namespace bsmd.herberg.FormService aMessageCore.HerbergReportType = formData.value; if (aMessageCore.HerbergReportType.Equals("Pre-Departure Notification Update") || - aMessageCore.HerbergReportType.Equals("Departure Notification Update")) - isDeparture = true; + aMessageCore.HerbergReportType.Equals("Departure Notification Update")) + isDeparture = true; + + aMessageCore.Incoming = !isDeparture; + break; case "EmailContactReportingVessel": aMessageCore.HerbergEmailContactReportingVessel = formData.value; @@ -301,19 +304,22 @@ namespace bsmd.herberg.FormService foreach (int key in nDict.Keys) { Dictionary subvDict = nDict[key]; - CallPurpose cp = noa_nod.GetSublistElementWithIdentifier(key.ToString()) as CallPurpose; - if (cp == null) + if (subvDict.Count > 0) { - cp = new CallPurpose(); - cp.Identifier = key.ToString(); - cp.NOA_NOD = noa_nod; - noa_nod.CallPurposes.Add(cp); + CallPurpose cp = noa_nod.GetSublistElementWithIdentifier(key.ToString()) as CallPurpose; + if (cp == null) + { + cp = new CallPurpose(); + cp.Identifier = key.ToString(); + cp.NOA_NOD = noa_nod; + noa_nod.CallPurposes.Add(cp); + } + + if (subvDict.ContainsKey("CallPurposeCode")) cp.CallPurposeCode = Int32.Parse(subvDict["CallPurposeCode"]); + if (subvDict.ContainsKey("CallPurposeDescription")) cp.CallPurposeDescription = subvDict["CallPurposeDescription"]; + + saveMessages.Add(cp); } - - if (subvDict.ContainsKey("CallPurposeCode")) cp.CallPurposeCode = Int32.Parse(subvDict["CallPurposeCode"]); - if (subvDict.ContainsKey("CallPurposeDescription")) cp.CallPurposeDescription = subvDict["CallPurposeDescription"]; - - saveMessages.Add(cp); } } @@ -415,45 +421,51 @@ namespace bsmd.herberg.FormService if (vDict.ContainsKey("InfectedAreaDate")) mdh.InfectedAreaDate = Extensions.TryParseDateTime(vDict["InfectedAreaDate"]); // sublisten - foreach (int key in nDict.Keys) + if (!mdh.MDHSimplification ?? true) { - Dictionary pDict = nDict[key]; - PortOfCallLast30Days poc30 = mdh.GetSublistElementWithIdentifier(key.ToString()) as PortOfCallLast30Days; - if (poc30 == null) + foreach (int key in nDict.Keys) { - poc30 = new PortOfCallLast30Days(); - poc30.Identifier = key.ToString(); - mdh.PortOfCallLast30Days.Add(poc30); - poc30.MDH = mdh; - } - - if (pDict.ContainsKey("PortOfCallLast30DaysDateOfDeparture")) poc30.PortOfCallLast30DaysDateOfDeparture = Extensions.TryParseDateTime(pDict["PortOfCallLast30DaysDateOfDeparture"]); - if (pDict.ContainsKey("PortOfCallLast30DaysCrewMembersJoined")) poc30.PortOfCallLast30DaysCrewMembersJoined = pDict["PortOfCallLast30DaysCrewMembersJoined"].Equals("Y"); - if (pDict.ContainsKey("PortOfCallLast30DaysPortCode") && pDict.ContainsKey("PortOfCallLast30DaysCountryCode")) - poc30.PortOfCallLast30DaysLocode = pDict["PortOfCallLast30DaysCountryCode"] + pDict["PortOfCallLast30DaysPortCode"]; - - - - saveMessages.Add(poc30); - - // lookup / crew members (Identifier hier der Name! (vereinfachung, ich habe keine rowid)) - if (pDict.ContainsKey("PortOfCallLast30DaysCrewMemberNamesJoined")) - { - string[] names = pDict["PortOfCallLast30DaysCrewMemberNamesJoined"].Split(','); - for (int k = 0; k < names.Length; k++) + Dictionary pDict = nDict[key]; + if (pDict.Count > 0) { - string crewname = names[k].Trim(); - PortOfCallLast30DaysCrewJoinedShip poc30Crew = poc30.GetSublistElementWithIdentifier(crewname) as PortOfCallLast30DaysCrewJoinedShip; - if (poc30Crew == null) + PortOfCallLast30Days poc30 = mdh.GetSublistElementWithIdentifier(key.ToString()) as PortOfCallLast30Days; + if (poc30 == null) { - poc30Crew = new PortOfCallLast30DaysCrewJoinedShip(); - poc30Crew.Identifier = crewname; - poc30Crew.PortOfCallLast30Days = poc30; - poc30Crew.PortOfCallLast30DaysCrewJoinedShipName = crewname; - poc30.CrewJoinedShip.Add(poc30Crew); - saveMessages.Add(poc30Crew); + poc30 = new PortOfCallLast30Days(); + poc30.Identifier = key.ToString(); + mdh.PortOfCallLast30Days.Add(poc30); + poc30.MDH = mdh; } - } + + if (pDict.ContainsKey("PortOfCallLast30DaysDateOfDeparture")) poc30.PortOfCallLast30DaysDateOfDeparture = Extensions.TryParseDateTime(pDict["PortOfCallLast30DaysDateOfDeparture"]); + if (pDict.ContainsKey("PortOfCallLast30DaysCrewMembersJoined")) poc30.PortOfCallLast30DaysCrewMembersJoined = pDict["PortOfCallLast30DaysCrewMembersJoined"].Equals("Y"); + if (pDict.ContainsKey("PortOfCallLast30DaysPortCode") && pDict.ContainsKey("PortOfCallLast30DaysCountryCode")) + poc30.PortOfCallLast30DaysLocode = pDict["PortOfCallLast30DaysCountryCode"] + pDict["PortOfCallLast30DaysPortCode"]; + + + + saveMessages.Add(poc30); + + // lookup / crew members (Identifier hier der Name! (vereinfachung, ich habe keine rowid)) + if (pDict.ContainsKey("PortOfCallLast30DaysCrewMemberNamesJoined")) + { + string[] names = pDict["PortOfCallLast30DaysCrewMemberNamesJoined"].Split(','); + for (int k = 0; k < names.Length; k++) + { + string crewname = names[k].Trim(); + PortOfCallLast30DaysCrewJoinedShip poc30Crew = poc30.GetSublistElementWithIdentifier(crewname) as PortOfCallLast30DaysCrewJoinedShip; + if (poc30Crew == null) + { + poc30Crew = new PortOfCallLast30DaysCrewJoinedShip(); + poc30Crew.Identifier = crewname; + poc30Crew.PortOfCallLast30Days = poc30; + poc30Crew.PortOfCallLast30DaysCrewJoinedShipName = crewname; + poc30.CrewJoinedShip.Add(poc30Crew); + saveMessages.Add(poc30Crew); + } + } + } + } } } } @@ -542,23 +554,26 @@ namespace bsmd.herberg.FormService { try { - if (vDict.ContainsKey("StowawayOnBoard")) bpol.StowawaysOnBoard = vDict["StowawayOnBoard"].Equals("Y"); + if (vDict.ContainsKey("StowawayOnBoard")) bpol.StowawaysOnBoard = vDict["StowawayOnBoard"].Equals("Y"); foreach (int key in nDict.Keys) { PortOfItinerary poi = bpol.GetSublistElementWithIdentifier(key.ToString()) as PortOfItinerary; Dictionary ppDict = nDict[key]; - if (poi == null) + if (ppDict.Count > 0) { - poi = new PortOfItinerary(); - poi.Identifier = key.ToString(); - poi.BPOL = bpol; - bpol.PortOfItineraries.Add(poi); + if (poi == null) + { + poi = new PortOfItinerary(); + poi.Identifier = key.ToString(); + poi.BPOL = bpol; + bpol.PortOfItineraries.Add(poi); + } + + if (ppDict.ContainsKey("PortOfItineraryName")) poi.PortOfItineraryName = ppDict["PortOfItineraryName"]; + if (ppDict.ContainsKey("PortOfItineraryETA")) poi.PortOfItineraryETA = Extensions.TryParseDateTime(ppDict["PortOfItineraryETA"]); + + saveMessages.Add(poi); } - - if (ppDict.ContainsKey("PortOfItineraryName")) poi.PortOfItineraryName = ppDict["PortOfItineraryName"]; - if (ppDict.ContainsKey("PortOfItineraryETA")) poi.PortOfItineraryETA = Extensions.TryParseDateTime(ppDict["PortOfItineraryETA"]); - - saveMessages.Add(poi); } } catch (Exception ex) @@ -954,60 +969,63 @@ namespace bsmd.herberg.FormService foreach (int key in nDict.Keys) { Dictionary sDict = nDict[key]; - bool changedPfC = false; - bool changedStS = false; - - ShipToShipActivitiesDuringLastTenPortFacilitiesCalled sts = sec.GetShipToShipWithIdentifier(key.ToString()); - if(sts == null) + if (sDict.Count > 0) { - sts = new ShipToShipActivitiesDuringLastTenPortFacilitiesCalled(); - sts.SEC = sec; - sts.Identifier = key.ToString(); - sec.ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.Add(sts); - } + bool changedPfC = false; + bool changedStS = false; - LastTenPortFacilitiesCalled poc = sec.GetPortFacilityWithIdentifier(key.ToString()); - if (poc == null) - { - poc = new LastTenPortFacilitiesCalled(); - poc.SEC = sec; - poc.Identifier = key.ToString(); - sec.LastTenPortFacilitesCalled.Add(poc); - } + ShipToShipActivitiesDuringLastTenPortFacilitiesCalled sts = sec.GetShipToShipWithIdentifier(key.ToString()); + if (sts == null) + { + sts = new ShipToShipActivitiesDuringLastTenPortFacilitiesCalled(); + sts.SEC = sec; + sts.Identifier = key.ToString(); + sec.ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.Add(sts); + } - if (sDict.ContainsKey("PortFacilityPortName")) { poc.PortFacilityPortName = sDict["PortFacilityPortName"]; changedPfC = true; } - if (sDict.ContainsKey("PortFacilityPortCountry")) { poc.PortFacilityPortCountry = sDict["PortFacilityPortCountry"]; changedPfC = true; } - if (sDict.ContainsKey("PortFacilityPortLoCode") && sDict.ContainsKey("PortFacilityPortCountryCode") && (sDict["PortFacilityPortLoCode"].Length < 4)) - { - poc.PortFacilityPortLoCode = sDict["PortFacilityPortCountryCode"] + sDict["PortFacilityPortLoCode"]; - changedPfC = true; - } - if (sDict.ContainsKey("PortFacilityDateOfArrival")) { poc.PortFacilityDateOfArrival = Extensions.TryParseDateTime(sDict["PortFacilityDateOfArrival"]); changedPfC = true; } - if (sDict.ContainsKey("PortFacilityDateOfDeparture")) { poc.PortFacilityDateOfDeparture = Extensions.TryParseDateTime(sDict["PortFacilityDateOfDeparture"]); changedPfC = true; } - if (sDict.ContainsKey("PortFacilityShipSecurityLevel")) { poc.PortFacilityShipSecurityLevel = Byte.Parse(sDict["PortFacilityShipSecurityLevel"]); changedPfC = true; } - if (sDict.ContainsKey("PortFacilitySecurityMattersToReport")) { poc.PortFacilitySecurityMattersToReport = sDict["PortFacilitySecurityMattersToReport"]; changedPfC = true; } - if (sDict.ContainsKey("PortFacilityGISISCode")) - { - poc.PortFacilityGISISCode = sDict["PortFacilityGISISCode"]; changedPfC = true; - if (poc.PortFacilityGISISCode.Length > 4) - poc.PortFacilityGISISCode = poc.PortFacilityGISISCode.Substring(0, 4); - } + LastTenPortFacilitiesCalled poc = sec.GetPortFacilityWithIdentifier(key.ToString()); + if (poc == null) + { + poc = new LastTenPortFacilitiesCalled(); + poc.SEC = sec; + poc.Identifier = key.ToString(); + sec.LastTenPortFacilitesCalled.Add(poc); + } - if (sDict.ContainsKey("ShipToShipActivityLocationName")) { sts.ShipToShipActivityLocationName = sDict["ShipToShipActivityLocationName"]; changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivityLocationLoCode") && sDict.ContainsKey("ShipToShipActivityCountryCode") && (sDict["ShipToShipActivityLocationLoCode"].Length < 4)) - { - sts.ShipToShipActivityLocationLoCode = sDict["ShipToShipActivityCountryCode"] + sDict["ShipToShipActivityLocationLoCode"]; - changedStS = true; - } - if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLatitude")) { sts.ShipToShipActivityLocationCoordinatesLatitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLatitude"]); changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLongitude")) { sts.ShipToShipActivityLocationCoordinatesLongitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLongitude"]); changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivityDateFrom")) { sts.ShipToShipActivityDateFrom = Extensions.TryParseDateTime(sDict["ShipToShipActivityDateFrom"]); changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivityDateTo")) { sts.ShipToShipActivityDateTo = Extensions.TryParseDateTime(sDict["ShipToShipActivityDateTo"]); changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivityType")) { sts.ShipToShipActivityType = sDict["ShipToShipActivityType"]; changedStS = true; } - if (sDict.ContainsKey("ShipToShipActivitySecurityMattersToReport")) { sts.ShipToShipActivitySecurityMattersToReport = sDict["ShipToShipActivitySecurityMattersToReport"]; changedStS = true; } + if (sDict.ContainsKey("PortFacilityPortName")) { poc.PortFacilityPortName = sDict["PortFacilityPortName"]; changedPfC = true; } + if (sDict.ContainsKey("PortFacilityPortCountry")) { poc.PortFacilityPortCountry = sDict["PortFacilityPortCountry"]; changedPfC = true; } + if (sDict.ContainsKey("PortFacilityPortLoCode") && sDict.ContainsKey("PortFacilityPortCountryCode") && (sDict["PortFacilityPortLoCode"].Length < 4)) + { + poc.PortFacilityPortLoCode = sDict["PortFacilityPortCountryCode"] + sDict["PortFacilityPortLoCode"]; + changedPfC = true; + } + if (sDict.ContainsKey("PortFacilityDateOfArrival")) { poc.PortFacilityDateOfArrival = Extensions.TryParseDateTime(sDict["PortFacilityDateOfArrival"]); changedPfC = true; } + if (sDict.ContainsKey("PortFacilityDateOfDeparture")) { poc.PortFacilityDateOfDeparture = Extensions.TryParseDateTime(sDict["PortFacilityDateOfDeparture"]); changedPfC = true; } + if (sDict.ContainsKey("PortFacilityShipSecurityLevel")) { poc.PortFacilityShipSecurityLevel = Byte.Parse(sDict["PortFacilityShipSecurityLevel"]); changedPfC = true; } + if (sDict.ContainsKey("PortFacilitySecurityMattersToReport")) { poc.PortFacilitySecurityMattersToReport = sDict["PortFacilitySecurityMattersToReport"]; changedPfC = true; } + if (sDict.ContainsKey("PortFacilityGISISCode")) + { + poc.PortFacilityGISISCode = sDict["PortFacilityGISISCode"]; changedPfC = true; + if (poc.PortFacilityGISISCode.Length > 4) + poc.PortFacilityGISISCode = poc.PortFacilityGISISCode.Substring(0, 4); + } - if (changedPfC) saveMessages.Add(poc); - if (changedStS) saveMessages.Add(sts); + if (sDict.ContainsKey("ShipToShipActivityLocationName")) { sts.ShipToShipActivityLocationName = sDict["ShipToShipActivityLocationName"]; changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivityLocationLoCode") && sDict.ContainsKey("ShipToShipActivityCountryCode") && (sDict["ShipToShipActivityLocationLoCode"].Length < 4)) + { + sts.ShipToShipActivityLocationLoCode = sDict["ShipToShipActivityCountryCode"] + sDict["ShipToShipActivityLocationLoCode"]; + changedStS = true; + } + if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLatitude")) { sts.ShipToShipActivityLocationCoordinatesLatitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLatitude"]); changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLongitude")) { sts.ShipToShipActivityLocationCoordinatesLongitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLongitude"]); changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivityDateFrom")) { sts.ShipToShipActivityDateFrom = Extensions.TryParseDateTime(sDict["ShipToShipActivityDateFrom"]); changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivityDateTo")) { sts.ShipToShipActivityDateTo = Extensions.TryParseDateTime(sDict["ShipToShipActivityDateTo"]); changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivityType")) { sts.ShipToShipActivityType = sDict["ShipToShipActivityType"]; changedStS = true; } + if (sDict.ContainsKey("ShipToShipActivitySecurityMattersToReport")) { sts.ShipToShipActivitySecurityMattersToReport = sDict["ShipToShipActivitySecurityMattersToReport"]; changedStS = true; } + + if (changedPfC) saveMessages.Add(poc); + if (changedStS) saveMessages.Add(sts); + } } } catch (Exception ex) @@ -1209,67 +1227,69 @@ namespace bsmd.herberg.FormService foreach (int key in subDict.Keys) { Dictionary aDict = subDict[key]; - IMDGPosition imdgPosition = haz.GetIMDGPositionWithIdentifier(key.ToString()); - if (imdgPosition == null) + if (aDict.Count > 0) { - imdgPosition = new IMDGPosition(); - imdgPosition.Identifier = key.ToString(); - haz.IMDGPositions.Add(imdgPosition); - imdgPosition.HAZ = haz; - } - - saveMessages.Add(imdgPosition); - - if (aDict.ContainsKey("UNNumber")) imdgPosition.UNNumber = aDict["UNNumber"]; - if (aDict.ContainsKey("PackingGroup")) imdgPosition.PackingGroup = (byte)Enum.Parse(typeof(Enums.PackingGroup), aDict["PackingGroup"], true); - if (aDict.ContainsKey("ProperShippingName")) imdgPosition.ProperShippingName = aDict["ProperShippingName"]; - if (aDict.ContainsKey("IMOClass")) imdgPosition.IMOClass = aDict["IMOClass"]; - if (aDict.ContainsKey("CompatibilityGroup")) imdgPosition.CompatibilityGroup = aDict["CompatibilityGroup"]; - if (aDict.ContainsKey("TechnicalName")) imdgPosition.TechnicalName = aDict["TechnicalName"]; - if (aDict.ContainsKey("NetExplosiveMass_KGM")) imdgPosition.NetExplosiveMass_KGM = Extensions.TryParseDouble(aDict["NetExplosiveMass_KGM"]); - if (aDict.ContainsKey("Flashpoint_CEL")) imdgPosition.Flashpoint_CEL = aDict["Flashpoint_CEL"]; - if (aDict.ContainsKey("Class7NuclideName")) imdgPosition.Class7NuclideName = aDict["Class7NuclideName"]; - if (aDict.ContainsKey("Class7MaxActivity_BQL")) imdgPosition.Class7MaxActivity_BQL = Extensions.TryParseDouble(aDict["Class7MaxActivity_BQL"]); - if (aDict.ContainsKey("Class7Category")) imdgPosition.Class7Category = Int32.Parse(aDict["Class7Category"], NumberFormatInfo.InvariantInfo); - if (aDict.ContainsKey("Class7TransportIndex")) imdgPosition.Class7TransportIndex = Extensions.TryParseDouble(aDict["Class7TransportIndex"]); - if (aDict.ContainsKey("Class7CSI")) imdgPosition.Class7CSI = Int32.Parse(aDict["Class7CSI"]); - if (aDict.ContainsKey("ControlTemperature_CEL")) imdgPosition.ControlTemperature_CEL = Extensions.TryParseDouble(aDict["ControlTemperature_CEL"]); - if (aDict.ContainsKey("EmergencyTemperature_CEL")) imdgPosition.EmergencyTemperature_CEL = Extensions.TryParseDouble(aDict["EmergencyTemperature_CEL"]); - if (aDict.ContainsKey("SubsidiaryRisk")) - { - if (imdgPosition.SubsidiaryRiskList.Count == 0) + IMDGPosition imdgPosition = haz.GetIMDGPositionWithIdentifier(key.ToString()); + if (imdgPosition == null) { - SubsidiaryRisks newSRisk = new SubsidiaryRisks(); - newSRisk.IMDGPosition = imdgPosition; - imdgPosition.SubsidiaryRiskList.Add(newSRisk); + imdgPosition = new IMDGPosition(); + imdgPosition.Identifier = key.ToString(); + haz.IMDGPositions.Add(imdgPosition); + imdgPosition.HAZ = haz; + } + + saveMessages.Add(imdgPosition); + + if (aDict.ContainsKey("UNNumber")) imdgPosition.UNNumber = aDict["UNNumber"]; + if (aDict.ContainsKey("PackingGroup")) imdgPosition.PackingGroup = (byte)Enum.Parse(typeof(Enums.PackingGroup), aDict["PackingGroup"], true); + if (aDict.ContainsKey("ProperShippingName")) imdgPosition.ProperShippingName = aDict["ProperShippingName"]; + if (aDict.ContainsKey("IMOClass")) imdgPosition.IMOClass = aDict["IMOClass"]; + if (aDict.ContainsKey("CompatibilityGroup")) imdgPosition.CompatibilityGroup = aDict["CompatibilityGroup"]; + if (aDict.ContainsKey("TechnicalName")) imdgPosition.TechnicalName = aDict["TechnicalName"]; + if (aDict.ContainsKey("NetExplosiveMass_KGM")) imdgPosition.NetExplosiveMass_KGM = Extensions.TryParseDouble(aDict["NetExplosiveMass_KGM"]); + if (aDict.ContainsKey("Flashpoint_CEL")) imdgPosition.Flashpoint_CEL = aDict["Flashpoint_CEL"]; + if (aDict.ContainsKey("Class7NuclideName")) imdgPosition.Class7NuclideName = aDict["Class7NuclideName"]; + if (aDict.ContainsKey("Class7MaxActivity_BQL")) imdgPosition.Class7MaxActivity_BQL = Extensions.TryParseDouble(aDict["Class7MaxActivity_BQL"]); + if (aDict.ContainsKey("Class7Category")) imdgPosition.Class7Category = Int32.Parse(aDict["Class7Category"], NumberFormatInfo.InvariantInfo); + if (aDict.ContainsKey("Class7TransportIndex")) imdgPosition.Class7TransportIndex = Extensions.TryParseDouble(aDict["Class7TransportIndex"]); + if (aDict.ContainsKey("Class7CSI")) imdgPosition.Class7CSI = Int32.Parse(aDict["Class7CSI"]); + if (aDict.ContainsKey("ControlTemperature_CEL")) imdgPosition.ControlTemperature_CEL = Extensions.TryParseDouble(aDict["ControlTemperature_CEL"]); + if (aDict.ContainsKey("EmergencyTemperature_CEL")) imdgPosition.EmergencyTemperature_CEL = Extensions.TryParseDouble(aDict["EmergencyTemperature_CEL"]); + if (aDict.ContainsKey("SubsidiaryRisk")) + { + if (imdgPosition.SubsidiaryRiskList.Count == 0) + { + SubsidiaryRisks newSRisk = new SubsidiaryRisks(); + newSRisk.IMDGPosition = imdgPosition; + imdgPosition.SubsidiaryRiskList.Add(newSRisk); + } + SubsidiaryRisks sRisks = imdgPosition.SubsidiaryRiskList[0]; + sRisks.SubsidiaryRisk = aDict["SubsidiaryRisk"]; + saveMessages.Add(sRisks); + } + if (aDict.ContainsKey("MarinePollutant")) imdgPosition.MarinePollutant = aDict["MarinePollutant"].Equals("Y"); + if (aDict.ContainsKey("NumberOfPackages")) imdgPosition.NumberOfPackages = Int32.Parse(aDict["NumberOfPackages"]); + if (aDict.ContainsKey("PackageType")) imdgPosition.PackageType = aDict["PackageType"]; + if (aDict.ContainsKey("LimitedQuantities")) imdgPosition.LimitedQuantities = aDict["LimitedQuantities"].Equals("Y"); + if (aDict.ContainsKey("ExceptedQuantities")) imdgPosition.ExceptedQuantities = aDict["ExceptedQuantities"].Equals("Y"); + if (aDict.ContainsKey("NetQuantity_KGM")) imdgPosition.NetQuantity_KGM = Extensions.TryParseDouble(aDict["NetQuantity_KGM"]); + if (aDict.ContainsKey("GrossQuantity_KGM")) imdgPosition.GrossQuantity_KGM = Extensions.TryParseDouble(aDict["GrossQuantity_KGM"]); + if (aDict.ContainsKey("Volume_MTQ")) imdgPosition.Volume_MTQ = Extensions.TryParseDouble(aDict["Volume_MTQ"]); + if (aDict.ContainsKey("GeneralCargoIBC")) imdgPosition.GeneralCargoIBC = aDict["GeneralCargoIBC"].Equals("Y"); + if (aDict.ContainsKey("ContainerNumber")) imdgPosition.ContainerNumber = aDict["ContainerNumber"]; + if (aDict.ContainsKey("VehicleLicenseNumber")) imdgPosition.VehicleLicenseNumber = aDict["VehicleLicenseNumber"]; + if (aDict.ContainsKey("StowagePosition")) imdgPosition.StowagePosition = aDict["StowagePosition"]; + if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) + imdgPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; + if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) + imdgPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; + if (aDict.ContainsKey("Remarks")) imdgPosition.Remarks = aDict["Remarks"]; + if (aDict.ContainsKey("Identifier")) + { + _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", + aDict["Identifier"], key); } - SubsidiaryRisks sRisks = imdgPosition.SubsidiaryRiskList[0]; - sRisks.SubsidiaryRisk = aDict["SubsidiaryRisk"]; - saveMessages.Add(sRisks); } - if (aDict.ContainsKey("MarinePollutant")) imdgPosition.MarinePollutant = aDict["MarinePollutant"].Equals("Y"); - if (aDict.ContainsKey("NumberOfPackages")) imdgPosition.NumberOfPackages = Int32.Parse(aDict["NumberOfPackages"]); - if (aDict.ContainsKey("PackageType")) imdgPosition.PackageType = aDict["PackageType"]; - if (aDict.ContainsKey("LimitedQuantities")) imdgPosition.LimitedQuantities = aDict["LimitedQuantities"].Equals("Y"); - if (aDict.ContainsKey("ExceptedQuantities")) imdgPosition.ExceptedQuantities = aDict["ExceptedQuantities"].Equals("Y"); - if (aDict.ContainsKey("NetQuantity_KGM")) imdgPosition.NetQuantity_KGM = Extensions.TryParseDouble(aDict["NetQuantity_KGM"]); - if (aDict.ContainsKey("GrossQuantity_KGM")) imdgPosition.GrossQuantity_KGM = Extensions.TryParseDouble(aDict["GrossQuantity_KGM"]); - if (aDict.ContainsKey("Volume_MTQ")) imdgPosition.Volume_MTQ = Extensions.TryParseDouble(aDict["Volume_MTQ"]); - if (aDict.ContainsKey("GeneralCargoIBC")) imdgPosition.GeneralCargoIBC = aDict["GeneralCargoIBC"].Equals("Y"); - if (aDict.ContainsKey("ContainerNumber")) imdgPosition.ContainerNumber = aDict["ContainerNumber"]; - if (aDict.ContainsKey("VehicleLicenseNumber")) imdgPosition.VehicleLicenseNumber = aDict["VehicleLicenseNumber"]; - if (aDict.ContainsKey("StowagePosition")) imdgPosition.StowagePosition = aDict["StowagePosition"]; - if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) - imdgPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; - if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) - imdgPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; - if (aDict.ContainsKey("Remarks")) imdgPosition.Remarks = aDict["Remarks"]; - if (aDict.ContainsKey("Identifier")) - { - _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", - aDict["Identifier"], key); - } - } } @@ -1279,33 +1299,36 @@ namespace bsmd.herberg.FormService foreach (int key in subDict.Keys) { Dictionary aDict = subDict[key]; - IBCPosition ibcPosition = haz.GetIBCPositionWithIdentifier(key.ToString()); - if (ibcPosition == null) + if (aDict.Count > 0) { - ibcPosition = new IBCPosition(); - ibcPosition.Identifier = key.ToString(); - haz.IBCPositions.Add(ibcPosition); - ibcPosition.HAZ = haz; - } + IBCPosition ibcPosition = haz.GetIBCPositionWithIdentifier(key.ToString()); + if (ibcPosition == null) + { + ibcPosition = new IBCPosition(); + ibcPosition.Identifier = key.ToString(); + haz.IBCPositions.Add(ibcPosition); + ibcPosition.HAZ = haz; + } - if (aDict.ContainsKey("ProductName")) ibcPosition.ProductName = aDict["ProductName"]; - if (aDict.ContainsKey("PollutionCategory")) ibcPosition.PollutionCategory = (byte)Enum.Parse(typeof(Enums.PollutionCategory), aDict["PollutionCategory"], true); - if (aDict.ContainsKey("Hazards")) ibcPosition.Hazards = Enums.ParseHazardType(aDict["Hazards"]); - if (aDict.ContainsKey("FlashpointInformation")) ibcPosition.FlashpointInformation = Enums.ParseFlashpointInformation(aDict["FlashpointInformation"]); - if (aDict.ContainsKey("Quantity_KGM")) ibcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); - if (aDict.ContainsKey("StowagePosition")) ibcPosition.StowagePosition = aDict["StowagePosition"]; - if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) - ibcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; - if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) - ibcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; - if (aDict.ContainsKey("Remarks")) ibcPosition.Remarks = aDict["Remarks"]; - if (aDict.ContainsKey("Identifier")) - { - _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", - aDict["Identifier"], key); - } + if (aDict.ContainsKey("ProductName")) ibcPosition.ProductName = aDict["ProductName"]; + if (aDict.ContainsKey("PollutionCategory")) ibcPosition.PollutionCategory = (byte)Enum.Parse(typeof(Enums.PollutionCategory), aDict["PollutionCategory"], true); + if (aDict.ContainsKey("Hazards")) ibcPosition.Hazards = Enums.ParseHazardType(aDict["Hazards"]); + if (aDict.ContainsKey("FlashpointInformation")) ibcPosition.FlashpointInformation = Enums.ParseFlashpointInformation(aDict["FlashpointInformation"]); + if (aDict.ContainsKey("Quantity_KGM")) ibcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); + if (aDict.ContainsKey("StowagePosition")) ibcPosition.StowagePosition = aDict["StowagePosition"]; + if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) + ibcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; + if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) + ibcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; + if (aDict.ContainsKey("Remarks")) ibcPosition.Remarks = aDict["Remarks"]; + if (aDict.ContainsKey("Identifier")) + { + _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", + aDict["Identifier"], key); + } - saveMessages.Add(ibcPosition); + saveMessages.Add(ibcPosition); + } } } @@ -1315,33 +1338,36 @@ namespace bsmd.herberg.FormService foreach (int key in subDict.Keys) { Dictionary aDict = subDict[key]; - - IGCPosition igcPosition = haz.GetIGCPositionWithIdentifier(key.ToString()); - if(igcPosition == null) { - igcPosition = new IGCPosition(); - igcPosition.Identifier = key.ToString(); - haz.IGCPositions.Add(igcPosition); - igcPosition.HAZ = haz; - } - - if (aDict.ContainsKey("UNNumber")) igcPosition.UNNumber = aDict["UNNumber"]; - if (aDict.ContainsKey("IMOClass")) igcPosition.IMOClass = aDict["IMOClass"]; - if (aDict.ContainsKey("ProductName")) igcPosition.ProductName = aDict["ProductName"]; - if (aDict.ContainsKey("Quantity_KGM")) igcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); - if (aDict.ContainsKey("StowagePosition")) igcPosition.StowagePosition = aDict["StowagePosition"]; - if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) - igcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; - if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) - igcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; - if (aDict.ContainsKey("Remarks")) igcPosition.Remarks = aDict["Remarks"]; - if (aDict.ContainsKey("Identifier")) + if (aDict.Count > 0) { - _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", - aDict["Identifier"], key); + IGCPosition igcPosition = haz.GetIGCPositionWithIdentifier(key.ToString()); + if (igcPosition == null) + { + igcPosition = new IGCPosition(); + igcPosition.Identifier = key.ToString(); + haz.IGCPositions.Add(igcPosition); + igcPosition.HAZ = haz; + } + + if (aDict.ContainsKey("UNNumber")) igcPosition.UNNumber = aDict["UNNumber"]; + if (aDict.ContainsKey("IMOClass")) igcPosition.IMOClass = aDict["IMOClass"]; + if (aDict.ContainsKey("ProductName")) igcPosition.ProductName = aDict["ProductName"]; + if (aDict.ContainsKey("Quantity_KGM")) igcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); + if (aDict.ContainsKey("StowagePosition")) igcPosition.StowagePosition = aDict["StowagePosition"]; + if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) + igcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; + if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) + igcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; + if (aDict.ContainsKey("Remarks")) igcPosition.Remarks = aDict["Remarks"]; + if (aDict.ContainsKey("Identifier")) + { + _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", + aDict["Identifier"], key); + } + + saveMessages.Add(igcPosition); + } - - - saveMessages.Add(igcPosition); } } @@ -1351,33 +1377,36 @@ namespace bsmd.herberg.FormService foreach (int key in subDict.Keys) { Dictionary aDict = subDict[key]; - IMSBCPosition imsbcPosition = haz.GetIMSBCPositionWithIdentifier(key.ToString()); - if (imsbcPosition == null) + if (aDict.Count > 0) { - imsbcPosition = new IMSBCPosition(); - imsbcPosition.Identifier = key.ToString(); - imsbcPosition.HAZ = haz; - haz.IMSBCPositions.Add(imsbcPosition); - } + IMSBCPosition imsbcPosition = haz.GetIMSBCPositionWithIdentifier(key.ToString()); + if (imsbcPosition == null) + { + imsbcPosition = new IMSBCPosition(); + imsbcPosition.Identifier = key.ToString(); + imsbcPosition.HAZ = haz; + haz.IMSBCPositions.Add(imsbcPosition); + } - if (aDict.ContainsKey("BulkCargoShippingName")) imsbcPosition.BulkCargoShippingName = aDict["BulkCargoShippingName"]; - if (aDict.ContainsKey("MHB")) imsbcPosition.MHB = aDict["MHB"].Equals("Y"); - if (aDict.ContainsKey("UNNumber")) imsbcPosition.UNNumber = aDict["UNNumber"]; - if (aDict.ContainsKey("IMOClass")) imsbcPosition.IMOClass = aDict["IMOClass"]; - if (aDict.ContainsKey("Quantity_KGM")) imsbcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); - if (aDict.ContainsKey("StowagePosition")) imsbcPosition.StowagePosition = aDict["StowagePosition"]; - if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) - imsbcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; - if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) - imsbcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; - if (aDict.ContainsKey("Remarks")) imsbcPosition.Remarks = aDict["Remarks"]; - if (aDict.ContainsKey("Identifier")) - { - _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", - aDict["Identifier"], key); - } + if (aDict.ContainsKey("BulkCargoShippingName")) imsbcPosition.BulkCargoShippingName = aDict["BulkCargoShippingName"]; + if (aDict.ContainsKey("MHB")) imsbcPosition.MHB = aDict["MHB"].Equals("Y"); + if (aDict.ContainsKey("UNNumber")) imsbcPosition.UNNumber = aDict["UNNumber"]; + if (aDict.ContainsKey("IMOClass")) imsbcPosition.IMOClass = aDict["IMOClass"]; + if (aDict.ContainsKey("Quantity_KGM")) imsbcPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); + if (aDict.ContainsKey("StowagePosition")) imsbcPosition.StowagePosition = aDict["StowagePosition"]; + if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) + imsbcPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; + if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) + imsbcPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; + if (aDict.ContainsKey("Remarks")) imsbcPosition.Remarks = aDict["Remarks"]; + if (aDict.ContainsKey("Identifier")) + { + _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", + aDict["Identifier"], key); + } - saveMessages.Add(imsbcPosition); + saveMessages.Add(imsbcPosition); + } } } @@ -1387,33 +1416,35 @@ namespace bsmd.herberg.FormService foreach (int key in subDict.Keys) { Dictionary aDict = subDict[key]; - MARPOL_Annex_I_Position marpolPosition = haz.GetMARPOLPositionWithIdentifier(key.ToString()); - if (marpolPosition == null) + if (aDict.Count > 0) { - marpolPosition = new MARPOL_Annex_I_Position(); - marpolPosition.Identifier = key.ToString(); - marpolPosition.HAZ = haz; - haz.MARPOLPositions.Add(marpolPosition); + MARPOL_Annex_I_Position marpolPosition = haz.GetMARPOLPositionWithIdentifier(key.ToString()); + if (marpolPosition == null) + { + marpolPosition = new MARPOL_Annex_I_Position(); + marpolPosition.Identifier = key.ToString(); + marpolPosition.HAZ = haz; + haz.MARPOLPositions.Add(marpolPosition); + } + + if (aDict.ContainsKey("Name")) marpolPosition.Name = aDict["Name"]; + if (aDict.ContainsKey("FlashpointInformation")) marpolPosition.FlashpointInformation = Enums.ParseFlashpointInformation(aDict["FlashpointInformation"]); + if (aDict.ContainsKey("Flashpoint_CEL")) marpolPosition.Flashpoint_CEL = aDict["Flashpoint_CEL"]; + if (aDict.ContainsKey("Quantity_KGM")) marpolPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); + if (aDict.ContainsKey("StowagePosition")) marpolPosition.StowagePosition = aDict["StowagePosition"]; + if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) + marpolPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; + if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) + marpolPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; + if (aDict.ContainsKey("Remarks")) marpolPosition.Remarks = aDict["Remarks"]; + if (aDict.ContainsKey("Identifier")) + { + _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", + aDict["Identifier"], key); + } + + saveMessages.Add(marpolPosition); } - - if (aDict.ContainsKey("Name")) marpolPosition.Name = aDict["Name"]; - if (aDict.ContainsKey("FlashpointInformation")) marpolPosition.FlashpointInformation = Enums.ParseFlashpointInformation(aDict["FlashpointInformation"]); - if (aDict.ContainsKey("Flashpoint_CEL")) marpolPosition.Flashpoint_CEL = aDict["Flashpoint_CEL"]; - if (aDict.ContainsKey("Quantity_KGM")) marpolPosition.Quantity_KGM = Extensions.TryParseDouble(aDict["Quantity_KGM"]); - if (aDict.ContainsKey("StowagePosition")) marpolPosition.StowagePosition = aDict["StowagePosition"]; - if (aDict.ContainsKey("PortCodeOfLoading") && aDict.ContainsKey("CountryCodeOfLoading")) - marpolPosition.PortOfLoading = aDict["CountryCodeOfLoading"] + aDict["PortCodeOfLoading"]; - if (aDict.ContainsKey("PortCodeOfDischarge") && aDict.ContainsKey("CountryCodeOfDischarge")) - marpolPosition.PortOfDischarge = aDict["CountryCodeOfDischarge"] + aDict["PortCodeOfDischarge"]; - if (aDict.ContainsKey("Remarks")) marpolPosition.Remarks = aDict["Remarks"]; - if (aDict.ContainsKey("Identifier")) - { - _log.InfoFormat("Igoring IMDGPosition identifer {0}, using row number {1} instead", - aDict["Identifier"], key); - } - - - saveMessages.Add(marpolPosition); } } } diff --git a/nsw/Source/bsmd.hisnord/Request.cs b/nsw/Source/bsmd.hisnord/Request.cs index d36b2bb5..e58f0de0 100644 --- a/nsw/Source/bsmd.hisnord/Request.cs +++ b/nsw/Source/bsmd.hisnord/Request.cs @@ -25,6 +25,8 @@ namespace bsmd.hisnord { bool retval = true; + messages.Sort(); + try { nsw _nsw = new nsw(); @@ -257,10 +259,301 @@ namespace bsmd.hisnord #endregion case Message.NotificationClass.HAZA: - // abh. von LADG! - break; case Message.NotificationClass.HAZD: // abh. von LADG! + { + HAZ haz = message.Elements[0] as HAZ; + + #region HAZ header area + + List flagItems = new List(); + if (haz.NoDPGOnBoardOnArrival ?? false) + { + flagItems.Add(ytype.Y); + } + else + { + if(haz.DPGManifestOnBoardOnArrival ?? false) + flagItems.Add(yorntype.Y); + else + flagItems.Add(yorntype.N); + if (haz.INFShipClass.HasValue) + { + flagItems.Add((infclasstype)haz.INFShipClass.Value); + } + + dgcodes _dgCodes = new dgcodes(); + List _dgCodeTypes = new List(); + if (haz.DPGClassificationIBC ?? false) + _dgCodeTypes.Add(dgcodetype.IBC); + if (haz.DPGClassificationIGC ?? false) + _dgCodeTypes.Add(dgcodetype.IGC); + if (haz.DPGClassificationIMDG ?? false) + _dgCodeTypes.Add(dgcodetype.IMDG); + // was ist das? dgcodetype.IMDG_MoU + if (haz.DPGClassificationIMSBC ?? false) + _dgCodeTypes.Add(dgcodetype.IMSBC); + if (haz.DPGClassificationMARPOL_ANNEX_I ?? false) + _dgCodeTypes.Add(dgcodetype.MARPOL_ANNEX_I); + _dgCodes.DGCode = _dgCodeTypes.ToArray(); + + flagItems.Add(_dgCodes); + + } + + _nsw.conveyance.Items1 = flagItems.ToArray(); + + #endregion + + // Durch Sortierung nach NotificationClass kommt LADG vor HAZ, daher sollte das Feld + // GeneralCargo nicht leer sein + if (_nsw.conveyance.GeneralCargo == null) + { + _log.Warn("LADG (conveyance.GeneralCargo) is empty. Cannot add HAZ information!"); + } + else + { + List dgList = new List(); + + #region IMDGPositions + + if (haz.IMDGPositions.Count > 0) + { + positionimdg[] imdgPositions = new positionimdg[haz.IMDGPositions.Count]; + for (int i = 0; i < haz.IMDGPositions.Count; i++) + { + IMDGPosition imdgPosition = haz.IMDGPositions[i]; + positionimdg pi = new positionimdg(); + + pi.UNNumber = imdgPosition.UNNumber; + if(imdgPosition.PackingGroup.HasValue) + pi.PackingGroup = (packinggrouptype)imdgPosition.PackingGroup; + pi.ProperShippingName = imdgPosition.ProperShippingName; + pi.IMOClass = imdgPosition.IMOClass; + pi.CompatibilityGroup = imdgPosition.CompatibilityGroup; + pi.TechnicalName = imdgPosition.TechnicalName; + pi.NetMassKGMSpecified = imdgPosition.NetExplosiveMass_KGM.HasValue; + if (imdgPosition.NetExplosiveMass_KGM.HasValue) + pi.NetMassKGM = (float) imdgPosition.NetExplosiveMass_KGM.Value; + pi.FlashpointCEL = imdgPosition.Flashpoint_CEL; + pi.Class7NuclideName = imdgPosition.Class7NuclideName; + pi.Class7MaxActivityBQLSpecified = imdgPosition.Class7MaxActivity_BQL.HasValue; + if (imdgPosition.Class7MaxActivity_BQL.HasValue) + pi.Class7MaxActivityBQL = (float)imdgPosition.Class7MaxActivity_BQL.Value; + pi.Class7CategorySpecified = imdgPosition.Class7Category.HasValue; + if (imdgPosition.Class7Category.HasValue) + pi.Class7Category = (class7cattype)imdgPosition.Class7Category.Value; + pi.Class7TISpecified = imdgPosition.Class7TransportIndex.HasValue; + if (imdgPosition.Class7TransportIndex.HasValue) + pi.Class7TI = (float)imdgPosition.Class7TransportIndex.Value; + pi.Class7CSI = imdgPosition.Class7CSI.HasValue ? imdgPosition.Class7CSI.Value.ToString() : ""; + pi.ControlTempCELSpecified = imdgPosition.ControlTemperature_CEL.HasValue; + if (imdgPosition.ControlTemperature_CEL.HasValue) + pi.ControlTempCEL = (float)imdgPosition.ControlTemperature_CEL.Value; + pi.EmergencyTempCELSpecified = imdgPosition.EmergencyTemperature_CEL.HasValue; + if (imdgPosition.EmergencyTemperature_CEL.HasValue) + pi.EmergencyTempCEL = (float)imdgPosition.EmergencyTemperature_CEL.Value; + if (imdgPosition.SubsidiaryRiskList.Count > 0) + { + pi.SubsidiaryRisks = new string[imdgPosition.SubsidiaryRiskList.Count]; + for (int j = 0; j < imdgPosition.SubsidiaryRiskList.Count; j++) + { + pi.SubsidiaryRisks[j] = imdgPosition.SubsidiaryRiskList[j].SubsidiaryRisk; + } + } + pi.MarinePollutant = (imdgPosition.MarinePollutant ?? false) ? yorntype.Y : yorntype.N; + pi.NumberOfPackages = imdgPosition.NumberOfPackages.HasValue ? imdgPosition.NumberOfPackages.Value.ToString() : ""; + // pi.PackageType = ?? feld nicht vorhanden + pi.LimitedQuantities = (imdgPosition.LimitedQuantities ?? false) ? yorntype.Y : yorntype.N; + pi.ExceptedQuantities = (imdgPosition.ExceptedQuantities ?? false) ? yorntype.Y : yorntype.N; + // pi.NetQuantity ?? feld nicht vorhanden odér ist das NetMassKGM ? + pi.GrossMassKGMSpecified = imdgPosition.GrossQuantity_KGM.HasValue; + if (imdgPosition.GrossQuantity_KGM.HasValue) + pi.GrossMassKGM = (float)imdgPosition.GrossQuantity_KGM.Value; + // pi.Volume_MTQ ?? feld nicht vorhanden + pi.GeneralCargoIBCSpecified = imdgPosition.GeneralCargoIBC.HasValue; + if (imdgPosition.GeneralCargoIBC.HasValue) + pi.GeneralCargoIBC = (imdgPosition.GeneralCargoIBC.Value) ? yorntype.Y : yorntype.N; + pi.ContainerNumber = imdgPosition.ContainerNumber; + pi.VehicleLicenseNumber = imdgPosition.VehicleLicenseNumber; + pi.Remarks = imdgPosition.Remarks; + + // hier fehlt auch StowagePosition, PortOfLoading, PortOfDischarge + // das ist eine Ebene höher und damit ist die Zuordnung falsch, weil es nicht 1:n ist sondern nachfolgende + // abweichende Einträge hier eine Überschreibung verursachen + + if(!imdgPosition.StowagePosition.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].LocationOnBoard = imdgPosition.StowagePosition; + if (!imdgPosition.PortOfLoading.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfLoadingLocode = imdgPosition.PortOfLoading; + if (!imdgPosition.PortOfDischarge.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfDischargeLocode = imdgPosition.PortOfDischarge; + + pi.Index = imdgPosition.Identifier; + + imdgPositions[i] = pi; + } + dgList.Add(imdgPositions); + } + + #endregion + + #region IBCPositions + + if (haz.IBCPositions.Count > 0) + { + positionibc[] ibcPositions = new positionibc[haz.IBCPositions.Count]; + + for (int i = 0; i < haz.IBCPositions.Count;i++) + { + positionibc pi = new positionibc(); + IBCPosition ibcPosition = haz.IBCPositions[i]; + pi.Name = ibcPosition.ProductName; + if(ibcPosition.PollutionCategory.HasValue) + pi.PollutionCategory = (polcattype)ibcPosition.PollutionCategory.Value; + pi.HazardsSpecified = ibcPosition.Hazards.HasValue; + if (ibcPosition.Hazards.HasValue) + pi.Hazards = (hazardtype)ibcPosition.Hazards.Value; + if (ibcPosition.FlashpointInformation.HasValue) + pi.FlashpointInfo = (flashpointinfotype)ibcPosition.FlashpointInformation.Value; + pi.FlashpointCEL = ibcPosition.Flashpoint_CEL; + if (ibcPosition.Quantity_KGM.HasValue) + pi.NetMassKGM = (float)ibcPosition.Quantity_KGM.Value; + pi.SpecRef15_19Specified = ibcPosition.SpecRef15_19.HasValue; + if (ibcPosition.SpecRef15_19.HasValue) + pi.SpecRef15_19 = ibcPosition.SpecRef15_19.Value ? yorntype.Y : yorntype.N; + pi.Remarks = ibcPosition.Remarks; + + if (!ibcPosition.StowagePosition.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].LocationOnBoard = ibcPosition.StowagePosition; + if (!ibcPosition.PortOfLoading.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfLoadingLocode = ibcPosition.PortOfLoading; + if (!ibcPosition.PortOfDischarge.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfDischargeLocode = ibcPosition.PortOfDischarge; + + pi.Index = ibcPosition.Identifier; + + ibcPositions[i] = pi; + } + + dgList.Add(ibcPositions); + } + + #endregion + + #region IGCPositions + + if (haz.IGCPositions.Count > 0) + { + positionigc[] igcPositions = new positionigc[haz.IGCPositions.Count]; + + for (int i = 0; i < haz.IGCPositions.Count; i++) + { + positionigc pi = new positionigc(); + IGCPosition igcPosition = haz.IGCPositions[i]; + + pi.UNNumber = igcPosition.UNNumber; + pi.IMOClass = igcPosition.IMOClass; + pi.Name = igcPosition.ProductName; + if (igcPosition.Quantity_KGM.HasValue) + pi.NetMassKGM = (float)igcPosition.Quantity_KGM.Value; + pi.Remarks = igcPosition.Remarks; + + if (!igcPosition.StowagePosition.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].LocationOnBoard = igcPosition.StowagePosition; + if (!igcPosition.PortOfLoading.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfLoadingLocode = igcPosition.PortOfLoading; + if (!igcPosition.PortOfDischarge.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfDischargeLocode = igcPosition.PortOfDischarge; + + pi.Index = igcPosition.Identifier; + + igcPositions[i] = pi; + } + + dgList.Add(igcPositions); + } + + #endregion + + #region IMSBCPositions + + if (haz.IMSBCPositions.Count > 0) + { + positionimsbc[] imsbcPositions = new positionimsbc[haz.IMSBCPositions.Count]; + + for (int i = 0; i < haz.IMSBCPositions.Count;i++ ) + { + positionimsbc pi = new positionimsbc(); + IMSBCPosition imsbcPosition = haz.IMSBCPositions[i]; + + pi.Name = imsbcPosition.BulkCargoShippingName; + pi.MHB = (imsbcPosition.MHB ?? false) ? yorntype.Y : yorntype.N; + pi.UNNumber = imsbcPosition.UNNumber; + pi.IMOClass = imsbcPosition.IMOClass; + if (imsbcPosition.Quantity_KGM.HasValue) + pi.NetMassKGM = (float)imsbcPosition.Quantity_KGM.Value; + pi.Remarks = imsbcPosition.Remarks; + + if (!imsbcPosition.StowagePosition.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].LocationOnBoard = imsbcPosition.StowagePosition; + if (!imsbcPosition.PortOfLoading.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfLoadingLocode = imsbcPosition.PortOfLoading; + if (!imsbcPosition.PortOfDischarge.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfDischargeLocode = imsbcPosition.PortOfDischarge; + + pi.Index = imsbcPosition.Identifier; + + imsbcPositions[i] = pi; + } + + dgList.Add(imsbcPositions); + } + + #endregion + + #region IMDGPositions + + if (haz.MARPOLPositions.Count > 0) + { + positionmarpol[] marpolPositions = new positionmarpol[haz.MARPOLPositions.Count]; + + for (int i = 0; i < haz.MARPOLPositions.Count;i++) + { + positionmarpol pi = new positionmarpol(); + MARPOL_Annex_I_Position marpolPosition = haz.MARPOLPositions[i]; + + pi.Name = marpolPosition.Name; + if (marpolPosition.FlashpointInformation.HasValue) + pi.FlashpointInformation = (flashpointinfotype) marpolPosition.FlashpointInformation.Value; + pi.Flashpoint_CEL = marpolPosition.Flashpoint_CEL; + if (marpolPosition.Quantity_KGM.HasValue) + pi.NetMassKGM = (float)marpolPosition.Quantity_KGM.Value; + pi.Remarks = marpolPosition.Remarks; + + if (!marpolPosition.StowagePosition.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].LocationOnBoard = marpolPosition.StowagePosition; + if (!marpolPosition.PortOfLoading.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfLoadingLocode = marpolPosition.PortOfLoading; + if (!marpolPosition.PortOfDischarge.IsNullOrEmpty()) + _nsw.conveyance.GeneralCargo[0].PortOfDischargeLocode = marpolPosition.PortOfDischarge; + + pi.Index = marpolPosition.Identifier; + + marpolPositions[i] = pi; + } + + dgList.Add(marpolPositions); + } + + #endregion + + // HACK! Die erste "vorhandene" Liste. Dieses Format hier setzt voraus dass man immer nur einen Listentyp + // haben kann, das steht aber nirgends im NSW + // alles andere wird bis zur Klärung hier erst einmal ignoriert + _nsw.conveyance.GeneralCargo[0].DGList = (object[]) dgList[0]; //.ToArray(); + } + } break; #region INFO @@ -399,6 +692,11 @@ namespace bsmd.hisnord if (message.MessageCore.IsTransit) { transit _transit = _nsw.conveyance.Item as transit; + if (_transit == null) + { + _transit = new transit(); + _nsw.conveyance.Item = _transit; + } _transit.LastPort = new lastport(); if (noa_nod.ETDFromLastPort.HasValue) @@ -415,6 +713,12 @@ namespace bsmd.hisnord else if (message.MessageCore.Incoming) // einlaufend { import _import = _nsw.conveyance.Item as import; + if (_import == null) + { + _import = new import(); + _nsw.conveyance.Item = _import; + } + _import.LastPort = new lastport(); if (noa_nod.ETDFromLastPort.HasValue) _import.LastPort.ETD = noa_nod.ETDFromLastPort.Value; @@ -431,6 +735,12 @@ namespace bsmd.hisnord else // auslaufend { export _export = _nsw.conveyance.Item as export; + if (_export == null) + { + _export = new export(); + _nsw.conveyance.Item = _export; + } + _export.NextPort = new nextporthazmat(); if (noa_nod.ETAToNextPort.HasValue) _export.NextPort.ETA = noa_nod.ETAToNextPort.Value; diff --git a/nsw/Source/bsmd.hisnord/VisitId.cs b/nsw/Source/bsmd.hisnord/VisitId.cs new file mode 100644 index 00000000..55c938fc --- /dev/null +++ b/nsw/Source/bsmd.hisnord/VisitId.cs @@ -0,0 +1,94 @@ +// +// Class: VisitId +// Current CLR: 4.0.30319.34209 +// System: Microsoft Visual Studio 10.0 +// Author: dani +// Created: 8/12/2015 8:27:03 AM +// +// Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using log4net; + +namespace bsmd.hisnord +{ + [Serializable] + public class VisitId + { + private string _visitId = null; + private static ILog _log = LogManager.GetLogger(typeof(bsmd.hisnord.VisitId)); + + #region Construction + + public VisitId(string visitId) + { + this._visitId = visitId; + } + + public VisitId() { } + + #endregion + + #region Properties + + [XmlAttribute] + public string ConveyanceCode { get; set; } + + [XmlText] + public string Value { get; set; } + + /// + /// Extract Guid aus ConveyanceCode + /// + public Guid? MessageCoreId + { + get + { + Guid? result = null; + if (this.ConveyanceCode != null) + { + int startIndex = this.ConveyanceCode.IndexOf('-'); + if (startIndex > 0) + { + Guid tmpGuid; + if (Guid.TryParse(this.ConveyanceCode.Substring(startIndex + 1), out tmpGuid)) + result = tmpGuid; + } + } + return result; + } + } + #endregion + + #region Deserialization + + public static VisitId ReadVisitId(string filename) + { + VisitId aVisitId = null; + try + { + XmlSerializer serializer = new XmlSerializer(typeof(bsmd.hisnord.VisitId)); + using (FileStream fs = new FileStream(filename, FileMode.Open)) + { + aVisitId = (VisitId)serializer.Deserialize(fs); + } + } + catch (Exception ex) + { + _log.ErrorFormat("Exception occurred during deserialization: {0}", ex.Message); + + } + return aVisitId; + } + + #endregion + + } + +} diff --git a/nsw/Source/bsmd.hisnord/transmitter.cs b/nsw/Source/bsmd.hisnord/transmitter.cs index 937ff917..e856b938 100644 --- a/nsw/Source/bsmd.hisnord/transmitter.cs +++ b/nsw/Source/bsmd.hisnord/transmitter.cs @@ -31,6 +31,7 @@ namespace bsmd.hisnord process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = false; + process.StartInfo.UseShellExecute = false; // der Transmitter schickt alles was im Ausgabe-Verzeichnis ist // damit das gut geht schicken wir die Nachrichten einzeln und arbeiten jeweils das // Ergebnis ab