diff --git a/nsw/Source/SQL/Update_2.4.14_To_3.0.sql b/nsw/Source/SQL/Update_2.4.14_To_3.0.sql new file mode 100644 index 00000000..6a5452c5 --- /dev/null +++ b/nsw/Source/SQL/Update_2.4.14_To_3.0.sql @@ -0,0 +1,17 @@ +CREATE TABLE [dbo].[AGNT] ( + [Id] UNIQUEIDENTIFIER CONSTRAINT [DF_AGNT_Id] DEFAULT (newid()) ROWGUIDCOL NOT NULL, + [MessageHeaderId] UNIQUEIDENTIFIER NULL, + [AgentCompanyName] NVARCHAR (100) NULL, + [AgentStreetAndNumber] NVARCHAR (100) NULL, + [AgentPostalCode] NVARCHAR (25) NULL, + [AgentCity] NVARCHAR (100) NULL, + [AgentCountry] NVARCHAR (100) NULL, + [AgentLastName] NVARCHAR (100) NULL, + [AgentFirstName] NVARCHAR (100) NULL, + [AgentPhone] NVARCHAR (100) NULL, + [AgentFax] NVARCHAR (100) NULL, + [AgentEMail] NVARCHAR (100) NULL, + + CONSTRAINT [PK_AGNT] PRIMARY KEY CLUSTERED ([Id] ASC), + CONSTRAINT [FK_AGNT_MessageHeader] FOREIGN KEY ([MessageHeaderId]) REFERENCES [dbo].[MessageHeader] ([Id]) +); \ No newline at end of file diff --git a/nsw/Source/bsmd.ExcelReadService/Util.cs b/nsw/Source/bsmd.ExcelReadService/Util.cs index 8414e01b..9e175f60 100644 --- a/nsw/Source/bsmd.ExcelReadService/Util.cs +++ b/nsw/Source/bsmd.ExcelReadService/Util.cs @@ -36,16 +36,16 @@ namespace bsmd.ExcelReadService if (messageCore.IsTransit) { // scan for transit messages - - // AGNT + + ScanAGNT(messages, messageCore, reader); // NOA_NOD // SEC - // POBA + ScanPOBA(messages, messageCore, reader); - // POBD + ScanPOBD(messages, messageCore, reader); ScanTIEFA(messages, messageCore, reader); @@ -72,7 +72,7 @@ namespace bsmd.ExcelReadService { // scan for visit messages - // AGNT + ScanAGNT(messages, messageCore, reader); // NOA_NOD @@ -82,9 +82,9 @@ namespace bsmd.ExcelReadService // SEC - // POBA + ScanPOBA(messages, messageCore, reader); - // POBD + ScanPOBD(messages, messageCore, reader); ScanNAME(messages, messageCore, reader); @@ -129,19 +129,18 @@ namespace bsmd.ExcelReadService //string sheetVersion = reader.GetCell("Portcall", 2, 1) as string; //messageCore.SietasSheetVersion = sheetVersion; + DBManager.Instance.Save(messageCore); + // save all messages now foreach(Message message in messages) { DBManager.Instance.Save(message); - // TODO: Die abhängigen Listen müssen auch gespeichert werden + message.SaveElements(); } - - - DBManager.Instance.Save(messageCore); - + return true; } @@ -240,6 +239,46 @@ namespace bsmd.ExcelReadService #endregion + #region POBA + + static void ScanPOBA(List messages, MessageCore messageCore, ExcelReader reader) + { + Message pobaMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.POBA); + if(pobaMessage.Elements.Count == 0) + { + POBA newPoba = new POBA(); + newPoba.MessageHeader = pobaMessage; + pobaMessage.Elements.Add(newPoba); + } + + POBA poba = pobaMessage.Elements[0] as POBA; + Util.ScanMessage(poba, reader); + if (((poba.TotalPersonsOnBoardUponArrival ?? 0) == 0) && poba.IsNew) + messages.Remove(pobaMessage); + } + + #endregion + + #region POBD + + static void ScanPOBD(List messages, MessageCore messageCore, ExcelReader reader) + { + Message pobdMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.POBD); + if(pobdMessage.Elements.Count == 0) + { + POBD newPobd = new POBD(); + newPobd.MessageHeader = pobdMessage; + pobdMessage.Elements.Add(newPobd); + } + + POBD pobd = pobdMessage.Elements[0] as POBD; + Util.ScanMessage(pobd, reader); + if (((pobd.TotalPersonsOnBoardUponDeparture ?? 0) == 0) && pobd.IsNew) + messages.Remove(pobdMessage); + } + + #endregion + #region STAT static void ScanSTAT(List messages, MessageCore messageCore, ExcelReader reader) @@ -268,6 +307,88 @@ namespace bsmd.ExcelReadService #endregion + #region AGNT + + static void ScanAGNT(List messages, MessageCore messageCore, ExcelReader reader) + { + Message agntMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.AGNT); + if(agntMessage.Elements.Count == 0) + { + AGNT newAgnt = new AGNT(); + newAgnt.MessageHeader = agntMessage; + agntMessage.Elements.Add(newAgnt); + } + AGNT agnt = agntMessage.Elements[0] as AGNT; + Util.ScanMessage(agnt, reader); + // wird nicht mehr entfernt, egal welche Felder gelesen werden + } + + #endregion + + #region MDH + + static void ScanMDH(List messages, MessageCore messageCore, ExcelReader reader) + { + Message mdhMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.MDH); + if(mdhMessage.Elements.Count == 0) + { + MDH newMDH = new MDH(); + newMDH.MessageHeader = mdhMessage; + mdhMessage.Elements.Add(newMDH); + } + MDH mdh = mdhMessage.Elements[0] as MDH; + Util.ScanMessage(mdh, reader); + + // POC last 30 days + for (int i = 0; i < 15; i++) + { + string portName = string.Format("MDH.PortOfCallLast30DaysPort_{0}", i + 1); + string portCountry = string.Format("MDH.PortOfCallLast30DaysCountry_{0}", i + 1); + string locode = string.Format("MDH.PortOfCallLast30DaysLocode_{0}", i + 1); + string crewJoined = string.Format("MDH.PortOfCallLast30DaysCrewMembersJoined_{0}", i + 1); + string crewName = string.Format("MDH.PortOfCallLast30DaysCrewJoinedShipName_{0}", i + 1); + string depDate = string.Format("MDH.PortOfCallLast30DaysDateOfDeparture_{0}", i + 1); + + PortOfCallLast30Days poc30d = mdh.GetSublistElementWithIdentifier((i + 1).ToString()) as PortOfCallLast30Days; + if (poc30d == null) + { + poc30d = new PortOfCallLast30Days(); + poc30d.Identifier = (i + 1).ToString(); + poc30d.MessageHeader = mdhMessage; + mdh.PortOfCallLast30Days.Add(poc30d); + } + + // TODO! geht nicht weil sich der Index ändert und das Namensattribut konstant ist + + + + // Util.ScanMessage(poc30d, reader); + + // Leer/def. Zeilen entfernen + if (!poc30d.PortOfCallLast30DaysDateOfDeparture.HasValue && (poc30d.PortOfCallLast30DaysLocode == null)) + mdh.PortOfCallLast30Days.Remove(poc30d); + + string crewJoinedText = reader.ReadText(crewName); + if (!crewJoinedText.IsNullOrEmpty()) + { + PortOfCallLast30DaysCrewJoinedShip poc30C = mdh.GetSublistElementWithIdentifier("1") as PortOfCallLast30DaysCrewJoinedShip; + if (poc30C == null) + { + poc30C = new PortOfCallLast30DaysCrewJoinedShip(); + poc30C.PortOfCallLast30Days = poc30d; + poc30d.CrewJoinedShip.Add(poc30C); + } + poc30C.PortOfCallLast30DaysCrewJoinedShipName = crewJoinedText; + } + + } + + + // wird nicht wieder entfernt falls keine Daten vorliegen + } + + #endregion + #region BKRA static void ScanBKRA(List messages, MessageCore messageCore, ExcelReader reader) diff --git a/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs b/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs index 9d2eb229..d4feb872 100644 --- a/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs +++ b/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs @@ -236,12 +236,23 @@ namespace bsmd.ReportGenerator return; } + // Einzelne Seite in Landscape für PAS Meldung + if ((message != null) && (message.MessageNotificationClass == Message.NotificationClass.PAS)) + { + // Landscape! + BSMDDocument.DefineContentSection(document, Orientation.Landscape, false); + + document.LastSection.AddParagraph(messageParagraph.Title, "Heading2"); + document.LastSection.AddParagraph(messageParagraph.Subtitle, "Heading3"); + + BSMDDocument.CreatePassengerTable(document, message); + + BSMDDocument.DefineContentSection(document, Orientation.Portrait, false); + return; + } document.LastSection.AddParagraph(messageParagraph.Title, "Heading2"); - document.LastSection.AddParagraph(messageParagraph.Subtitle, "Heading3"); - - - + document.LastSection.AddParagraph(messageParagraph.Subtitle, "Heading3"); // Spezialbehandlung WAS Meldung if ((message != null) && (message.MessageNotificationClass == Message.NotificationClass.WAS)) @@ -353,6 +364,75 @@ namespace bsmd.ReportGenerator } #endregion + #region PAS + private static void CreatePassengerTable(Document document, Message message) + { + Table table = document.LastSection.AddTable(); + table.Rows.VerticalAlignment = VerticalAlignment.Center; + table.Borders.Visible = true; + + Column column = table.AddColumn(); + column.Width = Unit.FromCentimeter(0.8); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(3); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(3); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(3); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(2); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(2); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(1); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(2); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(3); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(1.8); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(1.5); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(1.5); + column = table.AddColumn(); + column.Width = Unit.FromCentimeter(0.5); + + Row hRow = table.AddRow(); + hRow.Cells[1].AddParagraph("Last name"); + hRow.Cells[2].AddParagraph("First name"); + hRow.Cells[3].AddParagraph("Place of birth"); + hRow.Cells[4].AddParagraph("Date of birth"); + hRow.Cells[5].AddParagraph("Gender"); + hRow.Cells[6].AddParagraph("Nat."); + hRow.Cells[7].AddParagraph("Id doc. type"); + hRow.Cells[8].AddParagraph("Id doc. number"); + hRow.Cells[9].AddParagraph("Visa number"); + hRow.Cells[10].AddParagraph("Emb."); + hRow.Cells[11].AddParagraph("Disemb."); + hRow.Cells[12].AddParagraph("T"); + + for (int i = 0; i < message.Elements.Count; i++) + { + PAS pas = message.Elements[i] as PAS; + Row row = table.AddRow(); + row.Cells[0].AddParagraph((i + 1).ToString()); + row.Cells[1].AddParagraph(pas.PassengerLastName ?? ""); + row.Cells[2].AddParagraph(pas.PassengerFirstName ?? ""); + row.Cells[3].AddParagraph(pas.PassengerPlaceOfBirth ?? ""); + row.Cells[4].AddParagraph(pas.PassengerDateOfBirthDisplay); + row.Cells[5].AddParagraph(pas.PassengerGenderDisplay); + row.Cells[6].AddParagraph(pas.PassengerNationality ?? ""); + row.Cells[7].AddParagraph(pas.PassengerIdentityDocumentTypeDisplay); + row.Cells[8].AddParagraph(pas.PassengerIdentityDocumentId ?? ""); + row.Cells[9].AddParagraph(pas.PassengerVisaNumber ?? ""); + row.Cells[10].AddParagraph(pas.PassengerPortOfEmbarkation ?? ""); + row.Cells[11].AddParagraph(pas.PassengerPortOfDisembarkation ?? ""); + row.Cells[12].AddParagraph(pas.PassengerInTransit ?? false ? "X" : ""); + } + } + #endregion + #region MDH private static void CreatePoCLast30DaysTable(Document document, Message message) diff --git a/nsw/Source/bsmd.database/AGNT.cs b/nsw/Source/bsmd.database/AGNT.cs new file mode 100644 index 00000000..d02c62f1 --- /dev/null +++ b/nsw/Source/bsmd.database/AGNT.cs @@ -0,0 +1,170 @@ +// +// Class: AGNT +// Current CLR: 4.0.30319.42000 +// System: Microsoft Visual Studio 10.0 +// Author: dani +// Created: 1/31/2016 8:08:31 PM +// +// Copyright (c) 2016 Informatikbüro Daniel Schick. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; + +namespace bsmd.database +{ + + /// + /// message class for ship agent, new in NSW 3.0 (March 2016) + /// + public class AGNT : DatabaseEntity + { + + #region Construction + + public AGNT() + { + this.tablename = "[dbo].[AGNT]"; + } + + #endregion + + #region Properties + + [ShowReport] + [Validation2(ValidationCode.NOT_NULL)] + [LookupName("AGNT.AgentCompanyName")] + public string AgentCompanyName { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentStreetAndNumber")] + public string AgentStreetAndNumber { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentPostalCode")] + public string AgentPostalCode { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentCity")] + public string AgentCity { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentCountry")] + public string AgentCountry { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentLastName")] + [Validation2(ValidationCode.NOT_NULL)] + public string AgentLastName { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentFirstName")] + public string AgentFirstName { get; set; } + + [ShowReport] + [Validation2(ValidationCode.NOT_NULL)] + [LookupName("AGNT.AgentPhone")] + public string AgentPhone { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentFax")] + public string AgentFax { get; set; } + + [ShowReport] + [LookupName("AGNT.AgentEMail")] + public string AgentEMail { get; set; } + + #endregion + + #region DatabaseEntity implementation + + public override void PrepareSave(System.Data.IDbCommand cmd) + { + SqlCommand scmd = cmd as SqlCommand; + + scmd.Parameters.AddWithValue("@P1", this.MessageHeader.Id); + if (this.AgentCompanyName != null) scmd.Parameters.AddWithValue("@P2", this.AgentCompanyName); + else scmd.Parameters.AddWithValue("@P2", DBNull.Value); + if (this.AgentStreetAndNumber != null) scmd.Parameters.AddWithValue("@P3", this.AgentStreetAndNumber); + else scmd.Parameters.AddWithValue("@P3", DBNull.Value); + if (this.AgentPostalCode != null) scmd.Parameters.AddWithValue("@P4", this.AgentPostalCode); + else scmd.Parameters.AddWithValue("@P4", DBNull.Value); + if (this.AgentCity != null) scmd.Parameters.AddWithValue("@P5", this.AgentCity); + else scmd.Parameters.AddWithValue("@P5", DBNull.Value); + if (this.AgentCountry != null) scmd.Parameters.AddWithValue("@P6", this.AgentCountry); + else scmd.Parameters.AddWithValue("@P6", DBNull.Value); + if (this.AgentLastName != null) scmd.Parameters.AddWithValue("@P7", this.AgentLastName); + else scmd.Parameters.AddWithValue("@P7", DBNull.Value); + if (this.AgentFirstName != null) scmd.Parameters.AddWithValue("@P8", this.AgentFirstName); + else scmd.Parameters.AddWithValue("@P8", DBNull.Value); + if (this.AgentPhone != null) scmd.Parameters.AddWithValue("@P9", this.AgentPhone); + else scmd.Parameters.AddWithValue("@P9", DBNull.Value); + if (this.AgentFax != null) scmd.Parameters.AddWithValue("@P10", this.AgentFax); + else scmd.Parameters.AddWithValue("@P10", DBNull.Value); + if (this.AgentEMail != null) scmd.Parameters.AddWithValue("@P11", this.AgentEMail); + else scmd.Parameters.AddWithValue("@P11", DBNull.Value); + + if (this.IsNew) + { + cmd.CommandText = string.Format("INSERT INTO {0} (MessageHeaderId, AgentCompanyName, AgentStreetAndNumber, " + + "AgentPostalCode, AgentCity, AgentCountry, AgentLastName, AgentFirstName, AgentPhone, AgentFax, " + + "AgentEMail) VALUES (@P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11)", this.Tablename); + } + else + { + cmd.CommandText = string.Format("UPDATE {0} SET AgentCompanyName = @P2, AgentStreetAndNumber = @P3, AgentPostalCode = @P4, AgentCity = @P5, " + + "AgentCountry = @P6, AgentLastName = @P7, AgentFirstName = @P8, AgentPhone = @P9, AgentFax = @P10, " + + "AgentEMail = @P11 WHERE Id = @ID", this.Tablename); + scmd.Parameters.AddWithValue("@ID", this.Id); + } + } + + public override void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) + { + string query = string.Format("SELECT Id, AgentCompanyName, AgentStreetAndNumber, AgentPostalCode, AgentCity, AgentCountry, " + + "AgentLastName, AgentFirstName, AgentPhone, AgentFax, AgentEMail FROM {0} ", this.Tablename); + + switch (filter) + { + case Message.LoadFilter.MESSAGEHEADER: + query += "WHERE MessageHeaderId = @MHID"; + ((SqlCommand)cmd).Parameters.AddWithValue("@MHID", criteria[0]); + break; + case Message.LoadFilter.ALL: + default: + + break; + } + cmd.CommandText = query; + } + + public override List LoadList(System.Data.IDataReader reader) + { + List result = new List(); + + while(reader.Read()) + { + AGNT agnt = new AGNT(); + agnt.id = reader.GetGuid(0); + if(!reader.IsDBNull(1)) agnt.AgentCompanyName = reader.GetString(1); + if (!reader.IsDBNull(2)) agnt.AgentStreetAndNumber = reader.GetString(2); + if (!reader.IsDBNull(3)) agnt.AgentPostalCode = reader.GetString(3); + if (!reader.IsDBNull(4)) agnt.AgentCity = reader.GetString(4); + if (!reader.IsDBNull(5)) agnt.AgentCountry = reader.GetString(5); + if (!reader.IsDBNull(6)) agnt.AgentLastName = reader.GetString(6); + if (!reader.IsDBNull(7)) agnt.AgentFirstName = reader.GetString(7); + if (!reader.IsDBNull(8)) agnt.AgentPhone = reader.GetString(8); + if (!reader.IsDBNull(9)) agnt.AgentFax = reader.GetString(9); + if (!reader.IsDBNull(10)) agnt.AgentEMail = reader.GetString(10); + + result.Add(agnt); + } + reader.Close(); + return result; + } + + #endregion + + } +} diff --git a/nsw/Source/bsmd.database/BPOL.cs b/nsw/Source/bsmd.database/BPOL.cs index cc3750f4..2997a6b7 100644 --- a/nsw/Source/bsmd.database/BPOL.cs +++ b/nsw/Source/bsmd.database/BPOL.cs @@ -110,6 +110,14 @@ namespace bsmd.database get { return 1; } } + public void SaveElements() + { + foreach (PortOfItinerary poi in this.PortOfItineraries) + { + DBManager.Instance.Save(poi); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index 99607064..86129906 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -444,6 +444,7 @@ namespace bsmd.database case Message.NotificationClass.TOWD: result = new TOWD(); break; case Message.NotificationClass.HAZA: result = new HAZ(); break; case Message.NotificationClass.HAZD: result = new HAZ(); ((HAZ)result).IsDeparture = true; break; + case Message.NotificationClass.AGNT: result = new AGNT(); break; default: break; // VISIT, TRANSIT diff --git a/nsw/Source/bsmd.database/HAZ.cs b/nsw/Source/bsmd.database/HAZ.cs index 66fa6219..55b8c63b 100644 --- a/nsw/Source/bsmd.database/HAZ.cs +++ b/nsw/Source/bsmd.database/HAZ.cs @@ -246,6 +246,21 @@ namespace bsmd.database return null; } + public void SaveElements() + { + foreach (IMDGPosition imdg in this.IMDGPositions) + DBManager.Instance.Save(imdg); + foreach (IMSBCPosition imsbc in this.IMSBCPositions) + DBManager.Instance.Save(imsbc); + foreach (IBCPosition ibc in this.IBCPositions) + DBManager.Instance.Save(ibc); + foreach (IGCPosition igc in this.IGCPositions) + DBManager.Instance.Save(igc); + foreach (MARPOL_Annex_I_Position marpol in this.MARPOLPositions) + DBManager.Instance.Save(marpol); + } + + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/ISublistContainer.cs b/nsw/Source/bsmd.database/ISublistContainer.cs index 441d831c..afb43c04 100644 --- a/nsw/Source/bsmd.database/ISublistContainer.cs +++ b/nsw/Source/bsmd.database/ISublistContainer.cs @@ -23,6 +23,11 @@ namespace bsmd.database /// int NumberOfExcelRows { get; } + /// + /// Ruft die Speicherfunktion für alle untergeordneten Elemente (rekursiv) auf + /// + void SaveElements(); + } /// diff --git a/nsw/Source/bsmd.database/MDH.cs b/nsw/Source/bsmd.database/MDH.cs index 002d459e..133f65d5 100644 --- a/nsw/Source/bsmd.database/MDH.cs +++ b/nsw/Source/bsmd.database/MDH.cs @@ -29,65 +29,89 @@ namespace bsmd.database public List PortOfCallLast30Days { get { return this.portOfCallLast30Days; } } [ShowReport] [Validation1(ValidationCode.NOT_NULL)] + [LookupName("MDH.ValidSanitaryControlExemptionOrCertificateOnBoard")] public bool? MDHSimplification { get; set; } [ShowReport] [Validation1(ValidationCode.LOCODE_GER)] + [LookupName("MDH.PlaceOfIssue")] public string PortOfCallWhereCompleteMDHNotified { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.DateOfIssue")] public bool? NonAccidentalDeathsDuringVoyage { get; set; } [ShowReport] + [LookupName("MDH.NonAccidentialDeathsDuringVoyageCount")] public int? NonAccidentalDeathsDuringVoyageCount { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.SuspisionInfectiousNature")] public bool? SuspisionInfectiousNature { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.NumberOfIllPersonsHigherThanExpected")] public bool? NumberOfIllPersonsHigherThanExpected { get; set; } [ShowReport] + [LookupName("MDH.NumberOfIllPersons")] public int? NumberOfIllPersons { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.SickPersonsOnBoard")] public bool? SickPersonsOnBoard { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.MedicalConsulted")] public bool? MedicalConsulted { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.AwareOfConditionsForFurtherInfections")] public bool? AwareOfFurtherInfections { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.SanitaryMeasuresApplied")] public bool? SanitaryMeasuresApplied { get; set; } [ShowReport] + [LookupName("MDH.SanitaryMeasuresType_1")] // TODO: NSW 3.0: wird ein Array public string SanitaryMeasuresType { get; set; } [ShowReport] + [LookupName("MDH.SanitaryMeasuresLocation_1")] public string SanitaryMeasuresLocation { get; set; } [ShowReport] + [LookupName("MDH.SanitaryMeasuresDate_1")] public DateTime? SanitaryMeasuresDate { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.StowawaysDetected")] public bool? StowawaysDetected { get; set; } [ShowReport] + [LookupName("MDH.StowawaysJoiningLocation_1")] // TODO: NSW 3.0: wird ein Array public string StowawaysJoiningLocation { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.SickAnimalOrPetOnBoard")] public bool? SickAnimalOrPetOnBoard { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.ValidSanitaryControlExemptionOrCertificateOnBoard")] public bool? ValidSanitaryControlExemptionOrCertificateOnBoard { get; set; } [ShowReport] + [LookupName("MDH.PlaceOfIssue")] public string PlaceOfIssue { get; set; } [ShowReport] + [LookupName("MDH.DateOfIssue")] public DateTime? DateOfIssue { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("SanitaryControlReinspectionRequired")] public bool? SanitaryControlReinspectionRequired { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] + [LookupName("MDH.InfectedAreaVisited")] public bool? InfectedAreaVisited { get; set; } [ShowReport] + [LookupName("MDH.InfectedAreaPort_1")] // TODO: NSW 3.0: wird ein Array public string InfectedAreaPort { get; set; } [ShowReport] + [LookupName("MDH.InfectedAreaDate_1")] public DateTime? InfectedAreaDate { get; set; } #endregion @@ -233,6 +257,15 @@ namespace bsmd.database get { return 15; } } + public void SaveElements() + { + foreach(PortOfCallLast30Days poc30d in this.PortOfCallLast30Days) + { + DBManager.Instance.Save(poc30d); + ((ISublistContainer)poc30d).SaveElements(); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index e7390922..524a7e35 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -55,7 +55,8 @@ namespace bsmd.database NotificationClass.HAZD, NotificationClass.WAS, NotificationClass.ATA, - NotificationClass.ATD + NotificationClass.ATD, + NotificationClass.AGNT }); #endregion @@ -93,7 +94,8 @@ namespace bsmd.database TOWA, TOWD, HAZA, // 25 - HAZD + HAZD, + AGNT } public enum MessageStatus @@ -426,6 +428,18 @@ namespace bsmd.database } } + public void SaveElements() + { + foreach (DatabaseEntity dbEntity in this.Elements) + { + DBManager.Instance.Save(dbEntity); + if (dbEntity is ISublistContainer) + { + ((ISublistContainer)dbEntity).SaveElements(); + } + } + } + #endregion #region IMessageParagraph implementation @@ -482,6 +496,7 @@ namespace bsmd.database case NotificationClass.PRE72H: case NotificationClass.SEC: case NotificationClass.STAT: + case NotificationClass.AGNT: case NotificationClass.TIEFA: case NotificationClass.TIEFD: case NotificationClass.WAS: @@ -539,6 +554,7 @@ namespace bsmd.database case NotificationClass.PRE72H: case NotificationClass.SEC: case NotificationClass.STAT: + case NotificationClass.AGNT: case NotificationClass.TIEFA: case NotificationClass.TIEFD: case NotificationClass.WAS: diff --git a/nsw/Source/bsmd.database/NOA_NOD.cs b/nsw/Source/bsmd.database/NOA_NOD.cs index 2d6a4fee..3d662e7a 100644 --- a/nsw/Source/bsmd.database/NOA_NOD.cs +++ b/nsw/Source/bsmd.database/NOA_NOD.cs @@ -145,6 +145,14 @@ namespace bsmd.database get { return 1; } } + public void SaveElements() + { + foreach(CallPurpose cp in this.CallPurposes) + { + DBManager.Instance.Save(cp); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/PAS.cs b/nsw/Source/bsmd.database/PAS.cs index 52651e37..e3d85268 100644 --- a/nsw/Source/bsmd.database/PAS.cs +++ b/nsw/Source/bsmd.database/PAS.cs @@ -80,7 +80,7 @@ namespace bsmd.database [Validation(ValidationCode.NOT_NULL)] public string PassengerPortOfEmbarkation { get; set; } [ShowReport] - [ReportDisplayName("Port od disembarkation")] + [ReportDisplayName("Port of disembarkation")] [Validation(ValidationCode.NOT_NULL)] public string PassengerPortOfDisembarkation { get; set; } [ShowReport] diff --git a/nsw/Source/bsmd.database/POBA.cs b/nsw/Source/bsmd.database/POBA.cs index f1f49893..b23c5b16 100644 --- a/nsw/Source/bsmd.database/POBA.cs +++ b/nsw/Source/bsmd.database/POBA.cs @@ -25,15 +25,19 @@ namespace bsmd.database #region Properties [ShowReport] [Validation(ValidationCode.INT_GT_ZERO)] + [LookupName("POBA.TotalPersonsOnBoardUponArrival")] public int? TotalPersonsOnBoardUponArrival { get; set; } [ShowReport] [Validation(ValidationCode.INT_GT_ZERO)] + [LookupName("POBA.TotalCrewMembersOnBoardUponArrival")] public int? TotalCrewMembersOnBoardUponArrival { get; set; } [ShowReport] [Validation(ValidationCode.NOT_NULL)] + [LookupName("POBA.TotalPassengersOnBoardUponArrival")] public int? TotalPassengersOnBoardUponArrival { get; set; } [ShowReport] [Validation(ValidationCode.NOT_NULL)] + [LookupName("POBA.TotalStowawaysOnBoardUponArrival")] public int? TotalStowawaysOnBoardUponArrival { get; set; } #endregion diff --git a/nsw/Source/bsmd.database/POBD.cs b/nsw/Source/bsmd.database/POBD.cs index f3dba2ec..769b8bd2 100644 --- a/nsw/Source/bsmd.database/POBD.cs +++ b/nsw/Source/bsmd.database/POBD.cs @@ -25,15 +25,19 @@ namespace bsmd.database #region Properties [ShowReport] [Validation(ValidationCode.INT_GT_ZERO)] + [LookupName("POBD.TotalPersonsOnBoardUponDeparture")] public int? TotalPersonsOnBoardUponDeparture { get; set; } [ShowReport] [Validation(ValidationCode.INT_GT_ZERO)] + [LookupName("POBD.TotalCrewMembersOnBoardUponDeparture")] public int? TotalCrewMembersOnBoardUponDeparture { get; set; } [ShowReport] [Validation(ValidationCode.NOT_NULL)] + [LookupName("POBD.TotalPassengersOnBoardUponDeparture")] public int? TotalPassengersOnBoardUponDeparture { get; set; } [ShowReport] [Validation(ValidationCode.NOT_NULL)] + [LookupName("POBD.TotalStowawaysOnBoardUponDeparture")] public int? TotalStowawaysOnBoardUponDeparture { get; set; } public override string Subtitle diff --git a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs index a4e2f729..4cae6533 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs @@ -30,7 +30,7 @@ namespace bsmd.database public List CrewJoinedShip { get { return this.poc30Crew; } } [ShowReport] - [Validation2(ValidationCode.LOCODE)] + [Validation2(ValidationCode.LOCODE)] public string PortOfCallLast30DaysLocode { get; set; } [ShowReport] [Validation2(ValidationCode.NOT_NULL)] @@ -126,6 +126,14 @@ namespace bsmd.database get { return 1; } } + public void SaveElements() + { + foreach (PortOfCallLast30DaysCrewJoinedShip cjs in this.CrewJoinedShip) + { + DBManager.Instance.Save(cjs); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs index d2bc095e..eb32ebc2 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.4.16")] +[assembly: AssemblyInformationalVersion("2.4.18")] [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 dd4f6cf5..452ed2a9 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("2.4.16.*")] +[assembly: AssemblyVersion("2.4.18.*")] diff --git a/nsw/Source/bsmd.database/RuleEngine.cs b/nsw/Source/bsmd.database/RuleEngine.cs index 1aa795a4..20d8889f 100644 --- a/nsw/Source/bsmd.database/RuleEngine.cs +++ b/nsw/Source/bsmd.database/RuleEngine.cs @@ -296,6 +296,7 @@ namespace bsmd.database { // individuelle Fehler nach Nachrichtenklasse prüfen derivedEntity.MessageCore = entity.MessageCore; // some instance we need info from core (NOA / Transit) + if ((derivedEntity is LADG) && entity.MessageCore.IsTransit) continue; // kein error reporting für LADG bei Transit (CH, 1.2.16) RuleEngine.ValidateProperties(derivedEntity, errors); derivedEntity.Validate(errors, violations); diff --git a/nsw/Source/bsmd.database/WAS.cs b/nsw/Source/bsmd.database/WAS.cs index 8b032413..ffa5895a 100644 --- a/nsw/Source/bsmd.database/WAS.cs +++ b/nsw/Source/bsmd.database/WAS.cs @@ -138,6 +138,14 @@ namespace bsmd.database get { return 9; } } + public void SaveElements() + { + foreach(Waste waste in this.Waste) + { + DBManager.Instance.Save(waste); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/bsmd.database.csproj b/nsw/Source/bsmd.database/bsmd.database.csproj index 0dd24212..db21b95f 100644 --- a/nsw/Source/bsmd.database/bsmd.database.csproj +++ b/nsw/Source/bsmd.database/bsmd.database.csproj @@ -54,6 +54,7 @@ + diff --git a/nsw/Source/bsmd.herberg.FormService/Enums.cs b/nsw/Source/bsmd.herberg.FormService/Enums.cs index 2f53ada2..876e975c 100644 --- a/nsw/Source/bsmd.herberg.FormService/Enums.cs +++ b/nsw/Source/bsmd.herberg.FormService/Enums.cs @@ -148,20 +148,20 @@ namespace bsmd.herberg.FormService public static byte? ParseFlashpointInformation(string val) { - if (val.Equals("NF")) return 0; - if (val.Equals("GT60CEL")) return 1; - if (val.Equals("LE60CEL")) return 2; + if (val.Equals("NF", StringComparison.InvariantCultureIgnoreCase)) return 0; + if (val.Equals("GT60CEL", StringComparison.InvariantCultureIgnoreCase)) return 1; + if (val.Equals("LE60CEL", StringComparison.InvariantCultureIgnoreCase)) return 2; return null; } public static byte? ParseGender(string val) { - if (val.Equals("MALE")) return 0; - if (val.Equals("M")) return 0; - if (val.Equals("FEMALE")) return 1; - if (val.Equals("F")) return 1; - if (val.Equals("OTHER")) return 2; - if (val.Equals("O")) return 2; + if (val.Equals("MALE", StringComparison.InvariantCultureIgnoreCase)) return 0; + if (val.Equals("M", StringComparison.InvariantCultureIgnoreCase)) return 0; + if (val.Equals("FEMALE", StringComparison.InvariantCultureIgnoreCase)) return 1; + if (val.Equals("F", StringComparison.InvariantCultureIgnoreCase)) return 1; + if (val.Equals("OTHER", StringComparison.InvariantCultureIgnoreCase)) return 2; + if (val.Equals("O", StringComparison.InvariantCultureIgnoreCase)) return 2; return null; } diff --git a/nsw/Source/bsmd.herberg.FormService/Util.cs b/nsw/Source/bsmd.herberg.FormService/Util.cs index b57f658a..a1fff81c 100644 --- a/nsw/Source/bsmd.herberg.FormService/Util.cs +++ b/nsw/Source/bsmd.herberg.FormService/Util.cs @@ -935,7 +935,7 @@ namespace bsmd.herberg.FormService pas.Identifier = key.ToString(); theMessage.MessageNotificationClass = Message.NotificationClass.PAS; theMessage.Elements.Add(pas); - } + } try { if (pDict.ContainsKey("PassengerLastName")) pas.PassengerLastName = pDict["PassengerLastName"]; @@ -1181,7 +1181,13 @@ namespace bsmd.herberg.FormService _log.WarnFormat("PortFacilityGISISCode invalid: {0}, replacing with 0000", poc.PortFacilityGISISCode); poc.PortFacilityGISISCode = "0000"; if (poc.PortFacilitySecurityMattersToReport.IsNullOrEmpty()) poc.PortFacilitySecurityMattersToReport = string.Format("Remark: Reported GISIS-Code: {0}", sDict["PortFacilityGISISCode"] ?? ""); - else poc.PortFacilitySecurityMattersToReport = string.Format("{0} - Remark: Reported GISIS-Code: {1}", poc.PortFacilitySecurityMattersToReport, sDict["PortFacilityGISISCode"] ?? ""); + else + { + if (!poc.PortFacilitySecurityMattersToReport.Contains("Remark: Reported GISIS-Code:")) + { + poc.PortFacilitySecurityMattersToReport = string.Format("{0} - Remark: Reported GISIS-Code: {1}", poc.PortFacilitySecurityMattersToReport, sDict["PortFacilityGISISCode"] ?? ""); + } + } } } } diff --git a/nsw/Source/bsmd.hisnord/Request.cs b/nsw/Source/bsmd.hisnord/Request.cs index 01d97418..51075ed2 100644 --- a/nsw/Source/bsmd.hisnord/Request.cs +++ b/nsw/Source/bsmd.hisnord/Request.cs @@ -49,8 +49,8 @@ namespace bsmd.hisnord if (messages[0].MessageCore.Customer != null) { - _nsw.conveyance.owner_sender.name_short = messages[0].MessageCore.Customer.Name; - _nsw.conveyance.owner_sender.name_long = messages[0].MessageCore.Customer.Name; + _nsw.conveyance.owner_sender.name_short = @"BSMD"; // messages[0].MessageCore.Customer.Name; + _nsw.conveyance.owner_sender.name_long = @"BSMD"; // messages[0].MessageCore.Customer.Name; _nsw.conveyance.owner_sender.address = new addresstype(); _nsw.conveyance.owner_sender.address.StreetNumber = messages[0].MessageCore.Customer.StreetAndNumber; @@ -597,7 +597,7 @@ namespace bsmd.hisnord lu.CargoCodeNST = ladg.CargoCodeNST; if (ladg.CargoGrossQuantity_TNE.HasValue) lu.CargoGrossQuantity_TNE = (float)ladg.CargoGrossQuantity_TNE.Value; - if (ladg.CargoNumberOfItems.HasValue) + if ((ladg.CargoNumberOfItems ?? 0) > 0) lu.CargoNumberOfItems = ladg.CargoNumberOfItems.Value.ToString(); if (ladg.CargoHandlingType.HasValue) lu.HandlingCode = (handlingcodetype)ladg.CargoHandlingType.Value; @@ -679,19 +679,23 @@ namespace bsmd.hisnord if (mdh.SickAnimalOrPetOnBoard.HasValue) _mdh.SickAnimalOrPetOnBoard = mdh.SickAnimalOrPetOnBoard.Value ? yorntype.Y : yorntype.N; if (mdh.SickPersonsOnBoard.HasValue) - _mdh.SickPersonOnBoard = mdh.SickPersonsOnBoard.Value ? yorntype.Y : yorntype.N; - _mdh.StowawayJoiningLocation = mdh.StowawaysJoiningLocation; - if (mdh.StowawaysDetected.HasValue) - _mdh.StowawaysDetected = mdh.StowawaysDetected.Value ? yorntype.Y : yorntype.N; + _mdh.SickPersonOnBoard = mdh.SickPersonsOnBoard.Value ? yorntype.Y : yorntype.N; + + _mdh.StowawaysDetected = (mdh.StowawaysDetected ?? false) ? yorntype.Y : yorntype.N; + if(_mdh.StowawaysDetected == yorntype.Y) + _mdh.StowawayJoiningLocation = mdh.StowawaysJoiningLocation; + if (mdh.SuspisionInfectiousNature.HasValue) _mdh.SuspisionInfectiousNature = mdh.SuspisionInfectiousNature.Value ? yorntype.Y : yorntype.N; - if (mdh.ValidSanitaryControlExemptionOrCertificateOnBoard.HasValue) - _mdh.ValidSanitaryControlExemptionOrCertificateOnBoard = mdh.ValidSanitaryControlExemptionOrCertificateOnBoard.Value ? yorntype.Y : yorntype.N; - _mdh.ValidSanitaryControlExemptionOrCertificate = new sanitarycertificate(); - if (mdh.DateOfIssue.HasValue) - _mdh.ValidSanitaryControlExemptionOrCertificate.DateOfIssue = mdh.DateOfIssue.Value; - _mdh.ValidSanitaryControlExemptionOrCertificate.PlaceOfIssue = mdh.PlaceOfIssue; - + + _mdh.ValidSanitaryControlExemptionOrCertificateOnBoard = (mdh.ValidSanitaryControlExemptionOrCertificateOnBoard ?? false) ? yorntype.Y : yorntype.N; + if (_mdh.ValidSanitaryControlExemptionOrCertificateOnBoard == yorntype.Y) + { + _mdh.ValidSanitaryControlExemptionOrCertificate = new sanitarycertificate(); + if (mdh.DateOfIssue.HasValue) + _mdh.ValidSanitaryControlExemptionOrCertificate.DateOfIssue = mdh.DateOfIssue.Value; + _mdh.ValidSanitaryControlExemptionOrCertificate.PlaceOfIssue = mdh.PlaceOfIssue; + } _nsw.conveyance.Items3[0] = _mdh; } break; @@ -721,12 +725,14 @@ namespace bsmd.hisnord if (noa_nod.ETDFromLastPort.HasValue) _transit.LastPort.ETD = noa_nod.ETDFromLastPort.Value; _transit.LastPort.ETDSpecified = noa_nod.ETDFromLastPort.HasValue; - _transit.LastPort.Locode = noa_nod.LastPort; + if((noa_nod.LastPort != null) && (noa_nod.LastPort.Trim() != "")) + _transit.LastPort.Locode = noa_nod.LastPort; _transit.NextPort = new nextporthazmat(); if (noa_nod.ETAToNextPort.HasValue) _transit.NextPort.ETA = noa_nod.ETAToNextPort.Value; _transit.NextPort.ETASpecified = noa_nod.ETAToNextPort.HasValue; + if ((noa_nod.NextPort != null) && (noa_nod.NextPort.Trim() != "")) _transit.NextPort.Locode = noa_nod.NextPort; } else if (message.MessageCore.Incoming) // einlaufend @@ -742,13 +748,15 @@ namespace bsmd.hisnord if (noa_nod.ETDFromLastPort.HasValue) _import.LastPort.ETD = noa_nod.ETDFromLastPort.Value; _import.LastPort.ETDSpecified = noa_nod.ETDFromLastPort.HasValue; - _import.LastPort.Locode = noa_nod.LastPort; + if ((noa_nod.LastPort != null) && (noa_nod.LastPort.Trim() != "")) + _import.LastPort.Locode = noa_nod.LastPort; _import.PortOfCall = new portofcallhazmat(); if (noa_nod.ETAToPortOfCall.HasValue) _import.PortOfCall.ETA = noa_nod.ETAToPortOfCall.Value; if (noa_nod.ETDFromPortOfCall.HasValue) _import.PortOfCall.ETD = noa_nod.ETDFromPortOfCall.Value; - _import.PortOfCall.Locode = message.MessageCore.PoC; + if ((message.MessageCore.PoC != null) && (message.MessageCore.PoC.Trim() != "")) + _import.PortOfCall.Locode = message.MessageCore.PoC; } else // auslaufend @@ -764,13 +772,15 @@ namespace bsmd.hisnord if (noa_nod.ETAToNextPort.HasValue) _export.NextPort.ETA = noa_nod.ETAToNextPort.Value; _export.NextPort.ETASpecified = noa_nod.ETAToNextPort.HasValue; - _export.NextPort.Locode = noa_nod.NextPort; + if ((noa_nod.NextPort != null) && (noa_nod.NextPort.Trim() != "")) + _export.NextPort.Locode = noa_nod.NextPort; _export.PortOfCall = new portofcallhazmat(); if (noa_nod.ETAToPortOfCall.HasValue) _export.PortOfCall.ETA = noa_nod.ETAToPortOfCall.Value; if (noa_nod.ETDFromPortOfCall.HasValue) _export.PortOfCall.ETD = noa_nod.ETDFromPortOfCall.Value; - _export.PortOfCall.Locode = message.MessageCore.PoC; + if ((message.MessageCore.PoC != null) && (message.MessageCore.PoC.Trim() != "")) + _export.PortOfCall.Locode = message.MessageCore.PoC; } break;