From af0852f60dd17a74568b268121aef4a636c2690f Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 6 May 2019 14:44:41 +0000 Subject: [PATCH] =?UTF-8?q?MessageHistory=20Speichern=20fertig=20implement?= =?UTF-8?q?iert=20f=C3=BCr=20Version=205.1.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI-2/ENI2/ENI2/App.config | 2 +- ENI-2/ENI2/ENI2/MainWindow.xaml.cs | 1 + Stundensheet.xlsx | Bin 40626 -> 40665 bytes nsw/Source/bsmd.database/CallPurpose.cs | 3 + nsw/Source/bsmd.database/DBManager.cs | 89 ++++++++++++++++-- nsw/Source/bsmd.database/DatabaseEntity.cs | 54 ++++------- nsw/Source/bsmd.database/IBCPosition.cs | 6 ++ nsw/Source/bsmd.database/IDatabaseEntity.cs | 25 +++++ nsw/Source/bsmd.database/IGCPosition.cs | 3 + nsw/Source/bsmd.database/IMDGPosition.cs | 21 +++-- nsw/Source/bsmd.database/IMSBCPosition.cs | 3 + nsw/Source/bsmd.database/InfectedArea.cs | 3 + .../LastTenPortFacilitiesCalled.cs | 5 +- .../bsmd.database/MARPOL_Annex_I_Position.cs | 9 +- nsw/Source/bsmd.database/Message.cs | 76 +++++++-------- nsw/Source/bsmd.database/MessageHistory.cs | 75 +++++++++++++-- nsw/Source/bsmd.database/PortArea.cs | 6 +- .../bsmd.database/PortOfCallLast30Days.cs | 11 ++- .../PortOfCallLast30DaysCrewJoinedShip.cs | 3 + nsw/Source/bsmd.database/PortOfItinerary.cs | 3 + nsw/Source/bsmd.database/ReportingParty.cs | 20 ++-- .../bsmd.database/SanitaryMeasuresDetail.cs | 3 + ...vitiesDuringLastTenPortFacilitiesCalled.cs | 3 + .../bsmd.database/StowawaysJoiningLocation.cs | 3 + nsw/Source/bsmd.database/SubsidiaryRisks.cs | 3 + nsw/Source/bsmd.database/Waste.cs | 7 ++ .../WasteDisposalServiceProvider.cs | 4 + nsw/Source/bsmd.database/bsmd.database.csproj | 4 + nsw/Source/bsmd.database/packages.config | 1 + 29 files changed, 329 insertions(+), 117 deletions(-) create mode 100644 nsw/Source/bsmd.database/IDatabaseEntity.cs diff --git a/ENI-2/ENI2/ENI2/App.config b/ENI-2/ENI2/ENI2/App.config index 59d78db3..1d027849 100644 --- a/ENI-2/ENI2/ENI2/App.config +++ b/ENI-2/ENI2/ENI2/App.config @@ -31,7 +31,7 @@ - Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=nsw;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False + Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=E:\DATA\DB\NSW.MDF;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False diff --git a/ENI-2/ENI2/ENI2/MainWindow.xaml.cs b/ENI-2/ENI2/ENI2/MainWindow.xaml.cs index 24edc984..584c83c5 100644 --- a/ENI-2/ENI2/ENI2/MainWindow.xaml.cs +++ b/ENI-2/ENI2/ENI2/MainWindow.xaml.cs @@ -510,6 +510,7 @@ namespace ENI2 this.busyIndicator.IsBusy = false; this.labelStatusBar.Text = string.Format("Rep.Party: {0} {1} [{2}]", this.userEntity.FirstName, this.userEntity.LastName, this.userEntity.Logon); App.UserId = this.userEntity.Id; + ReportingParty.CurrentReportingParty = this.userEntity; if (this.userEntity.IsAdmin) { this.buttonUserAdmin.Visibility = Visibility.Visible; diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 0fb6375aa2505f5f637cb0949be9a80898c527c2..9b6fc73d653d61489119ffcf5787e4884c321dd8 100644 GIT binary patch delta 31275 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

HUtMPc%=5mxf?G;R7WkC07rS!Q*Bf% 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 F{{gMFtIq%c delta 31334 zcmXt9b9kN2(~fQ1Zk#l>%_a>R+fEujNnB~qo|lM+Y0|FO0}*kSQW3%2Q%`dFJX_y=&b8f$6lwt-Suo>wxg9O(|hu_ zIW9l-2!|GJ)TE^kdjS+Dcj0t;lwX@JN>L)ul

rOzeyxz~jaC_sOX7^Ft}?K{%Pe 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

0XEng2QNs8LsFRx1BsJm8(phU)S~v+|?R5@r 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∓&de`+vpblQ0?i2}TB#z&{xwQ^wXFYL$_z9WSJ_;G54GcbpZnLztwWW|I zVvm@PGBYY)9pr78q0))$1eAs{uBE!OfQ0tRs`5dF%UAZWuu!xqHmNNM<2QYaN3=2m zL;c?_AYB^W=W~Qv4V8WiJ@)A`uYI4>cvU|1y*ma)iU}bA;)u!ex0TA@cb1g+Ja2(d zYgz67`HTdlnNa9;skBnHSiBW4e=pO&%h=LWnJ?{_51ZLvamhqmMJVXL9h9{SOAsX}Zz_h!T zMDn!(C8eSptlM@tazZZrbJtxx>f?LsRp%v0hbDgvi1^!lr3JCVgSe{Mx@1fu9o1pDf~pnK$Nf zPK-BcQ7$XT8fzOp(9C2-&Q((G2GVf4)X;{NVb#Sy!cl7QidcsUM8@eZryO`4DM zlM_pym^BxFBu$jXY`Am_&-+1kHY0Y!iD}OLK1m7${;RT$RDJpfbSbwk{rsUY{orfu zld$?KD>!ZHgCsApl14J7{mR+RxL83ZlM&sRj_Rgqmfc0!#G5zKfq40LbgyV<8EtSB z%LZ^EDrYiCxT&pn>|tAMKq(b>^hX;pPvS3n`0dc?iI_x6c|LdcOUS&OyH|2=pRmsi zE)oyeHP=^BUe7fMzO(dBoGI(u5v}7WQfzD5UX7y5*I-V;pg;h5)qR58%}2|n1u4>* z8Tlg-2i5rL`z&60`stZqGjZP;`;j%SBDGa$UV@*= zy?x=2!mmO3Cco~zlJpMtvOfPZ@?C_#so{x2&w)*618Pf#csb_kPb#vYLlR{Y!4x`x z14XiT&XEP|l4smS5EwM7w2Xtgz~%lzL24=eH)$BTXCpVzZSL5;)Z4-Jjmu|462F$< zU^-q9Xv%rwog#2TgDVldklqFrnp!!Inm&J)!=WBR#5P0Bm7`17ZM970 zFy49#TKWFbAIpnB(!BWyaWANuG)ncm5Un&vc5+%vz|flsZ_|+pJFWt+1K#)G;d0Q+ zvdF5cg*6acP74Cai&z=#vE>tBMJp2yFonE+@GN>U z9-o~iIjV9=N$+9vykpP|cAlf!B1FK?gvV~XyU%5ZDw&HoD82;4C>2Sh<@K(I3i;%^ zg!gVlGHB>h%)LvGU`xMj)(3WXHr$v=@OHfa@d)rdMG3^<%9w-aO5b;H2_9INQSe`?LFg}WHocwRrrwWaLj>fNny+! zBKS6#{j2qei;LoMq=fC(t_r_^bPsrR6TPQ+j(DTU?ND+&Ef^j_g?JcqDoITus&;ON zklcgHB8c;NIpVN_E(|B@?=SrT?5Urt!Om=im-^N&%faA24nxAW8=Tf`4udaB*KhBK z)A4w4YnM@=w9bDbFk6GjMvu#VGB1y@nK#jnuzIQ z60x~mV?V&24+^#5#u3 zs5mKtKXA&RG~*|GqLEpMw_mRQ+9G)Nv~J&5s2 z_B$3HSTiJz+cfRYElhxG)bQD_G)0h8S=*K8_ZtWh`jeJr6yWb5#(((ukgiOIy{AlE zO$~~ttf2ICCABPfdNTz65W>8}^JO2BYcL?Ca+P;B47nilp^Go6|B)kl=38BgF5H>G zyYo$SoWNM}$LDYtBtfy^q+8>vjVjLAB}sR4saz@q^ z?EiFRZnDc(1%>vi|e%{{!+hp-cb( diff --git a/nsw/Source/bsmd.database/CallPurpose.cs b/nsw/Source/bsmd.database/CallPurpose.cs index e5bf4918..d92bbeee 100644 --- a/nsw/Source/bsmd.database/CallPurpose.cs +++ b/nsw/Source/bsmd.database/CallPurpose.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public NOA_NOD NOA_NOD { get; set; } [ShowReport] @@ -38,6 +40,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "callpurpose"; } } #endregion diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index f9980963..435a6a4f 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -12,7 +12,9 @@ using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; +using Newtonsoft.Json; using log4net; +using System.Reflection; namespace bsmd.database { @@ -29,6 +31,7 @@ namespace bsmd.database private readonly object _lock = new object(); private bool _closeConnectionAfterUse = false; private readonly List truncatedFieldCollection = new List(); + private Dictionary messageHistoryTypeDict; #endregion @@ -44,6 +47,15 @@ namespace bsmd.database #endregion + #region Construction + + public DBManager() + { + this.InitializeMessageHistoryTypes(); + } + + #endregion + #region Properties public static DBManager Instance @@ -329,8 +341,7 @@ namespace bsmd.database { result = (Message) messages[0]; // es kann nur eine sein result.MessageCore = core; - List lm = new List(); - lm.Add(result); + List lm = new List { result }; this.LoadMessageDependencies(lm); } @@ -711,18 +722,80 @@ namespace bsmd.database } } + #region MessageHistory + + ///

+ /// Diskussion: Es wäre besser, wenn man hier nur Message serialisieren würde. Allerdings wird der "Inhalt" bei + /// einer Neuanlage erst nach der Message gespeichert und wäre dann hier nicht vorhanden. Es muss daher ein Switch über alle Element + /// Typen durchgeführt werden. + /// + /// private void CreateEntityHistoryEntry(DatabaseEntity entity) { - // switch(entity.) + // sehr schöner Ansatz, den ich doch nicht verwendet habe; + //var @switch = new Dictionary { + // { typeof(Type1), () => ... }, + // { typeof(Type2), () => ... }, + // { typeof(Type3), () => ... }, + //}; + + //@switch[typeof(MyType)](); + + Type entityType = entity.GetType(); // 1. prüfen ob für das Objekt ein Historieneintrag angelegt werden soll + if (this.messageHistoryTypeDict.ContainsKey(entityType)) { - // 2. falls ja Objekt serialisieren - - // 3. MessageHistory Element speichern - // (das könnte auch in einem Background Thread passieren, da der Wert erst irgendwann gelesen wird und aktuell nicht relevant ist) - + // 2. falls ja Objekt serialisieren + MessageHistory mh = new MessageHistory(); + mh.EntityId = entity.MessageHeader.Id.Value; + mh.EntityName = entityType.Name; + mh.EntityType = entityType.ToString(); + mh.EntityValues = JsonConvert.SerializeObject(entity); + if (ReportingParty.CurrentReportingParty != null) + mh.ReportingPartyId = ReportingParty.CurrentReportingParty.Id.Value; + + // 3. MessageHistory Element speichern + // TODO: das könnte auch in einem Background Thread passieren, da der Wert erst irgendwann gelesen wird und aktuell nicht relevant ist + SqlCommand cmd = new SqlCommand(); + mh.PrepareSave(cmd); + int queryResult = this.PerformNonQuery(cmd); + this.LogNonQueryResult(cmd.CommandText, queryResult); + } } + private void InitializeMessageHistoryTypes() + { + this.messageHistoryTypeDict = new Dictionary + { + { typeof(AGNT), typeof(AGNT).Name }, + { typeof(ATA), typeof(ATA).Name }, + { typeof(ATD), typeof(ATD).Name }, + { typeof(BRKA), typeof(BRKA).Name }, + { typeof(BRKD), typeof(BRKD).Name }, + { typeof(CREW), typeof(CREW).Name }, + { typeof(HAZ), typeof(HAZ).Name }, + { typeof(INFO), typeof(INFO).Name }, + { typeof(LADG), typeof(LADG).Name }, + { typeof(MDH), typeof(MDH).Name }, + { typeof(NAME), typeof(NAME).Name }, + { typeof(NOA_NOD), typeof(NOA_NOD).Name }, + { typeof(PAS), typeof(PAS).Name }, + { typeof(POBA), typeof(POBA).Name }, + { typeof(POBD), typeof(POBD).Name }, + { typeof(PRE72H), typeof(PRE72H).Name }, + { typeof(SEC), typeof(SEC).Name }, + { typeof(SERV), typeof(SERV).Name }, + { typeof(STAT), typeof(STAT).Name }, + { typeof(STO), typeof(STO).Name }, + { typeof(TIEFA), typeof(TIEFA).Name }, + { typeof(TIEFD), typeof(TIEFD).Name }, + { typeof(TOWA), typeof(TOWA).Name }, + { typeof(TOWD), typeof(TOWD).Name }, + { typeof(WAS), typeof(WAS).Name } + }; + } + + #endregion #region CreateMessage() diff --git a/nsw/Source/bsmd.database/DatabaseEntity.cs b/nsw/Source/bsmd.database/DatabaseEntity.cs index c9c050fc..bfc94d46 100644 --- a/nsw/Source/bsmd.database/DatabaseEntity.cs +++ b/nsw/Source/bsmd.database/DatabaseEntity.cs @@ -16,6 +16,7 @@ using System.Reflection; using System.Text.RegularExpressions; using System.Xml.Serialization; using System.IO; +using Newtonsoft.Json; using log4net; namespace bsmd.database @@ -24,7 +25,7 @@ namespace bsmd.database [XmlInclude(typeof(Message))] [XmlInclude(typeof(MessageCore))] [XmlInclude(typeof(AGNT))] - public abstract class DatabaseEntity : IMessageParagraph, IEquatable, ICloneable + public abstract class DatabaseEntity : IDatabaseEntity, IMessageParagraph, IEquatable, ICloneable { protected Guid? id; protected string tablename; @@ -53,8 +54,10 @@ namespace bsmd.database /// /// Nachrichtentyp der abgeleiteten Meldeklassen /// + [JsonIgnore] public Message.NotificationClass MessageNotificationClass { get; set; } + [JsonIgnore] public string MessageNotificationClassDisplay { get @@ -66,16 +69,19 @@ namespace bsmd.database /// /// Referenz zur eigentlichen Schiffankunft /// + [JsonIgnore] public MessageCore MessageCore { get; set; } /// /// gemeinschaftliche Daten /// - public Message MessageHeader { get; set; } + [JsonIgnore] + public Message MessageHeader { get; set; } /// /// SQL Table name to construct queries /// + [JsonIgnore] public virtual string Tablename { get { return this.tablename; } } /// @@ -86,11 +92,13 @@ namespace bsmd.database /// /// IsNew Flag /// + [JsonIgnore] public bool IsNew { get { return !this.id.HasValue; } } /// /// Flag zeigt an ob das Objekt geändert wurde /// + [JsonIgnore] public bool IsDirty { get; set; } #endregion @@ -114,6 +122,7 @@ namespace bsmd.database /// /// Ergebnismenge begrenzen: NULL = kein Limit. Abgeleitete Klassen *können* diesen Parameter berücksichtigen /// + [JsonIgnore] public int? ResultLimit { get; set; } public abstract void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria); @@ -174,7 +183,7 @@ namespace bsmd.database public virtual ValidationBlock GetValidationBlock() { return ValidationBlock.BLOCK1; - } + } #endregion @@ -271,6 +280,7 @@ namespace bsmd.database #region IMessageParagraph implementation + [JsonIgnore] public virtual string Title { get @@ -280,11 +290,13 @@ namespace bsmd.database } } + [JsonIgnore] public virtual string Subtitle { get { return string.Empty; } } + [JsonIgnore] public virtual bool ShowChildrenAsTable { get { return false; } @@ -293,6 +305,7 @@ namespace bsmd.database /// /// must be overridden if it must make sense /// + [JsonIgnore] public virtual List> MessageText { get { @@ -321,8 +334,8 @@ namespace bsmd.database public virtual string GetDisplayValue(PropertyInfo property) { - bool isDouble = (property.PropertyType == typeof(Nullable)); - bool isDateTime = (property.PropertyType == typeof(Nullable)); + bool isDouble = (property.PropertyType == typeof(double?)); + bool isDateTime = (property.PropertyType == typeof(DateTime?)); object propValue = property.GetValue(this, null); if (propValue == null) return ""; @@ -352,6 +365,7 @@ namespace bsmd.database return value; } + [JsonIgnore] public virtual List ChildParagraphs { get { return null; } } #endregion @@ -365,35 +379,7 @@ namespace bsmd.database return entity; } - #endregion - - #region Serialization - - public static DatabaseEntity Deserialize(string serializedClass) - { - - return null; - } - - public string Serialize() - { - using (StringWriter sw = new StringWriter()) - { - try - { - XmlSerializer serializer = new XmlSerializer(this.GetType()); - serializer.Serialize(sw, this); - return sw.ToString(); - } - catch (Exception ex) - { - _log.ErrorFormat("Serialization failed: {0}", ex.Message); - } - } - return null; - } - - #endregion + #endregion } } diff --git a/nsw/Source/bsmd.database/IBCPosition.cs b/nsw/Source/bsmd.database/IBCPosition.cs index 2792f4f3..ab2626ca 100644 --- a/nsw/Source/bsmd.database/IBCPosition.cs +++ b/nsw/Source/bsmd.database/IBCPosition.cs @@ -13,6 +13,7 @@ using System.Data; using System.Data.SqlClient; using System.Reflection; using System.Text.RegularExpressions; +using Newtonsoft.Json; namespace bsmd.database { @@ -56,6 +57,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public HAZ HAZ { get; set; } [ShowReport] @@ -71,6 +73,7 @@ namespace bsmd.database [ShowReport] [ReportDisplayName("PollutionCategory")] + [JsonIgnore] public string PollutionCategoryDisplay { get @@ -86,6 +89,7 @@ namespace bsmd.database [ShowReport] [ReportDisplayName("Hazards")] + [JsonIgnore] public string HazardsDisplay { get @@ -102,6 +106,7 @@ namespace bsmd.database [ShowReport] [ReportDisplayName("FlashpointInformation")] + [JsonIgnore] public string FlashpointInformationDisplay { get @@ -152,6 +157,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "ibc"; } } #endregion diff --git a/nsw/Source/bsmd.database/IDatabaseEntity.cs b/nsw/Source/bsmd.database/IDatabaseEntity.cs new file mode 100644 index 00000000..865fa820 --- /dev/null +++ b/nsw/Source/bsmd.database/IDatabaseEntity.cs @@ -0,0 +1,25 @@ +// Copyright (c) 2015-2017 schick Informatik +// Description: Interface für DB Objekte, die nicht von DatabaseEntity erben + +using System; +using System.Data; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace bsmd.database +{ + public interface IDatabaseEntity + { + + string Tablename { get; } + + void PrepareSave(IDbCommand cmd); + + void PrepareDelete(IDbCommand cmd); + + List LoadList(IDataReader reader); + + } +} diff --git a/nsw/Source/bsmd.database/IGCPosition.cs b/nsw/Source/bsmd.database/IGCPosition.cs index 9d9e9c34..5f14edc7 100644 --- a/nsw/Source/bsmd.database/IGCPosition.cs +++ b/nsw/Source/bsmd.database/IGCPosition.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public HAZ HAZ { get; set; } [ShowReport] @@ -72,6 +74,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "igc"; } } #endregion diff --git a/nsw/Source/bsmd.database/IMDGPosition.cs b/nsw/Source/bsmd.database/IMDGPosition.cs index ed94d2a9..5be004bd 100644 --- a/nsw/Source/bsmd.database/IMDGPosition.cs +++ b/nsw/Source/bsmd.database/IMDGPosition.cs @@ -13,14 +13,12 @@ using System.Data; using System.Data.SqlClient; using System.Text; using System.Text.RegularExpressions; +using Newtonsoft.Json; namespace bsmd.database { public class IMDGPosition : DatabaseEntity, ISublistElement { - - private List subsidiaryRisksList = new List(); - public IMDGPosition() { this.tablename = "[dbo].[IMDGPosition]"; @@ -28,6 +26,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public HAZ HAZ { get; set; } [ShowReport] @@ -189,23 +188,24 @@ namespace bsmd.database [MaxLength(255)] [ENI2Validation] public string Remarks { get; set; } - - public List SubsidiaryRiskList { get { return this.subsidiaryRisksList; } } + + public List SubsidiaryRiskList { get; private set; } = new List(); /// /// Hilfsproperty, um subsidiary risks als kommaseparierte Liste anzuzeigen (ENI-2) /// [ENI2Validation] + [JsonIgnore] public string SubsidiaryRiskText { get { StringBuilder sb = new StringBuilder(); - for (int i = 0; i < this.subsidiaryRisksList.Count; i++) + for (int i = 0; i < this.SubsidiaryRiskList.Count; i++) { if (i > 0) sb.Append(", "); - sb.Append(this.subsidiaryRisksList[i].SubsidiaryRisk); + sb.Append(this.SubsidiaryRiskList[i].SubsidiaryRisk); } return sb.ToString(); } @@ -254,15 +254,16 @@ namespace bsmd.database // remove remaining risk (no longer valid) foreach (SubsidiaryRisks remainingRisk in this.SubsidiaryRiskList) DBManager.Instance.Delete(remainingRisk); - this.subsidiaryRisksList.Clear(); + this.SubsidiaryRiskList.Clear(); // add existing and new risk - this.subsidiaryRisksList.AddRange(foundList); + this.SubsidiaryRiskList.AddRange(foundList); } } } public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "imdg"; } } #endregion @@ -523,7 +524,7 @@ namespace bsmd.database { IMDGPosition imdg = this.MemberwiseClone() as IMDGPosition; imdg.id = null; - imdg.subsidiaryRisksList = new List(); + imdg.SubsidiaryRiskList = new List(); foreach (SubsidiaryRisks sr in this.SubsidiaryRiskList) { diff --git a/nsw/Source/bsmd.database/IMSBCPosition.cs b/nsw/Source/bsmd.database/IMSBCPosition.cs index fed50128..8ae483bd 100644 --- a/nsw/Source/bsmd.database/IMSBCPosition.cs +++ b/nsw/Source/bsmd.database/IMSBCPosition.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public HAZ HAZ { get; set; } [ShowReport] @@ -77,6 +79,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "imsbc"; } } #endregion diff --git a/nsw/Source/bsmd.database/InfectedArea.cs b/nsw/Source/bsmd.database/InfectedArea.cs index 936c4bc8..ce3c491b 100644 --- a/nsw/Source/bsmd.database/InfectedArea.cs +++ b/nsw/Source/bsmd.database/InfectedArea.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public MDH MDH { get; set; } [ShowReport] @@ -37,6 +39,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "infectedarea"; } } #endregion diff --git a/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs b/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs index bd85661c..ecaa4903 100644 --- a/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs +++ b/nsw/Source/bsmd.database/LastTenPortFacilitiesCalled.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public SEC SEC { get; set; } [ShowReport] @@ -76,6 +78,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "l10pfc"; } } #endregion @@ -110,7 +113,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET PortFacilityPortName = @P2, PortFacilityPortCountry = @P3, " + "PortFacilityPortLoCode = @P4, PortFacilityDateOfArrival = @P5, PortFacilityDateOfDeparture = @P6," + "PortFacilityShipSecurityLevel = @P7, PortFacilitySecurityMattersToReport = @P8, PortFacilityGISISCode = @P9, " + diff --git a/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs b/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs index 9d801caa..f1108a3d 100644 --- a/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs +++ b/nsw/Source/bsmd.database/MARPOL_Annex_I_Position.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text.RegularExpressions; +using Newtonsoft.Json; namespace bsmd.database { @@ -25,6 +26,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public HAZ HAZ { get; set; } [ShowReport] @@ -85,6 +87,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "marpol"; } } #endregion @@ -116,7 +119,7 @@ namespace bsmd.database } else { - scmd.Parameters.AddWithValue(@"ID", this.Id); + scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET Name = @P2, FlashpointInformation= @P3, Flashpoint_CEL = @P4, " + "Quantity_KGM = @P5, StowagePosition = @P6, PortOfLoading = @P7, PortOfDischarge = @P8, Remarks = @P9, " + "Identifier = @P10 WHERE Id = @ID", this.Tablename); @@ -183,8 +186,8 @@ namespace bsmd.database this.HAZ.IsDeparture ? "HAZD" : "HAZA")); if (!this.Flashpoint_CEL.IsNullOrEmpty()) - { - string pattern = @"^[<>]?\-?[0-9]+(\.[0-9]+)?$"; + { + const string pattern = @"^[<>]?\-?[0-9]+(\.[0-9]+)?$"; Regex regex = new Regex(pattern); if (!regex.IsMatch(this.Flashpoint_CEL)) diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index 39a73a90..71c58767 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -13,17 +13,8 @@ namespace bsmd.database public class Message : DatabaseEntity, ISublistContainer, IComparable { - #region Fields - - private Guid? messageCoreId; - private Guid? reportingPartyId; +#region Fields private ReportingParty reportingParty; - private DateTime? created; - private DateTime? changed; - private List errorList = new List(); - private List violationList = new List(); - private List systemErrorList = new List(); - private ObservableCollection elements = new ObservableCollection(); #endregion @@ -172,14 +163,20 @@ namespace bsmd.database { [Description("Unspecified")] UNDEFINED, + DBH, + DAKOSY, + [Description("HIS-Nord")] DUDR, + [Description("DBH Testsystem")] DBH_TEST, + [Description("Dakosy Testsystem")] DAKOSY_TEST, + [Description("HIS-Nord Testsystem")] DUDR_TEST } @@ -204,7 +201,7 @@ namespace bsmd.database public Guid? MessageId { get; set; } - public Guid? MessageCoreId { get { return this.messageCoreId; } set { this.messageCoreId = value; } } + public Guid? MessageCoreId { get; set; } public DateTime? SentAt { get; set; } @@ -221,7 +218,7 @@ namespace bsmd.database public MessageStatus? Status { get; set; } [ShowReport] - public DateTime? Created { get { return this.created; } } + public DateTime? Created { get; private set; } /// /// Vorwärts-Referenzen auf die von diesem Header-Element abhängigen speziellen Nachrichten-Datensätzen @@ -229,7 +226,7 @@ namespace bsmd.database /// BRKA, BRKD, LADG, CREW, PAS, SERV, TOWA, TOWD, STO, CREWD, PASD /// sonst hat die Liste immer ein Element /// - public ObservableCollection Elements { get { return this.elements; } } + public ObservableCollection Elements { get; } = new ObservableCollection(); /// /// Der Meldende @@ -241,11 +238,11 @@ namespace bsmd.database { if (value == null) { - this.reportingPartyId = null; + this.ReportingPartyId = null; } else { - this.reportingPartyId = value.Id; + this.ReportingPartyId = value.Id; } this.reportingParty = value; } @@ -274,22 +271,22 @@ namespace bsmd.database /// /// Fehlerliste (Rückgabe vom NSW) /// - public List ErrorList { get { return this.errorList; } } + public List ErrorList { get; } = new List(); /// /// Violation-Liste (Rückgabe vom NSW) /// - public List ViolationList { get { return this.violationList; } } + public List ViolationList { get; } = new List(); /// /// Liste mit "System"-Errors (HIS-Nord) /// - public List SystemErrorList { get { return this.systemErrorList; } } + public List SystemErrorList { get; } = new List(); /// /// Property to overwrite reporting party in certain circumstances (other melder meldet) /// - public Guid? ReportingPartyId { get { return this.reportingPartyId; } set { this.reportingPartyId = value; } } + public Guid? ReportingPartyId { get; set; } /// /// Urheber der Nachricht (Excel oder HE) @@ -304,7 +301,7 @@ namespace bsmd.database /// /// Database last "Changed" date display /// - public DateTime? Changed { get { return this.changed; } } + public DateTime? Changed { get; private set; } /// /// ENI-2 detail group text @@ -357,7 +354,7 @@ namespace bsmd.database this.ViolationList.IsNullOrEmpty() && this.ErrorList.IsNullOrEmpty() && this.Status.HasValue && - !(this.Reset) && + !this.Reset && (this.Status.Value == MessageStatus.ACCEPTED); } } @@ -374,9 +371,9 @@ namespace bsmd.database #region IDatabaseEntity implementation - public override void PrepareSave(IDbCommand cmdParam) + public override void PrepareSave(IDbCommand dbCommand) { - SqlCommand cmd = cmdParam as SqlCommand; + SqlCommand cmd = dbCommand as SqlCommand; if (this.ClientRequestId != null) cmd.Parameters.AddWithValue("@CLIENTREQUESTID", Guid.Parse(this.ClientRequestId)); @@ -407,7 +404,7 @@ namespace bsmd.database else cmd.Parameters.AddWithValue("@STATUS", DBNull.Value); - cmd.Parameters.AddWithNullableValue("@REPORTINGPARTYID", this.reportingPartyId); + cmd.Parameters.AddWithNullableValue("@REPORTINGPARTYID", this.ReportingPartyId); cmd.Parameters.AddWithValue("@BSMDSTATUS", this.InternalStatus); cmd.Parameters.AddWithNullableValue("@LASTSTATUS", this.LastStatus); cmd.Parameters.AddWithValue("@HIS", this.HIS); @@ -508,7 +505,7 @@ namespace bsmd.database Message msg = new Message(); msg.id = reader.GetGuid(0); if (!reader.IsDBNull(1)) msg.ClientRequestId = reader.GetGuid(1).ToString(); - msg.messageCoreId = reader.GetGuid(2); + msg.MessageCoreId = reader.GetGuid(2); if(!reader.IsDBNull(3)) msg.MessageId = reader.GetGuid(3); if (!reader.IsDBNull(4)) msg.SentAt = reader.GetDateTime(4); if (!reader.IsDBNull(5)) msg.ReceivedAt = reader.GetDateTime(5); @@ -517,14 +514,14 @@ namespace bsmd.database if (!reader.IsDBNull(8)) msg.Reset = reader.GetBoolean(8); if (!reader.IsDBNull(9)) msg.Cancel = reader.GetBoolean(9); if (!reader.IsDBNull(10)) msg.Status = (MessageStatus)Enum.ToObject(typeof(MessageStatus), reader.GetByte(10)); - if (!reader.IsDBNull(11)) msg.reportingPartyId = reader.GetGuid(11); + if (!reader.IsDBNull(11)) msg.ReportingPartyId = reader.GetGuid(11); if (!reader.IsDBNull(12)) msg.InternalStatus = (BSMDStatus)Enum.ToObject(typeof(BSMDStatus), reader.GetByte(12)); if (!reader.IsDBNull(13)) msg.LastStatus = (BSMDStatus)Enum.ToObject(typeof(BSMDStatus), reader.GetByte(13)); if (!reader.IsDBNull(14)) msg.HIS = (NSWProvider)Enum.ToObject(typeof(NSWProvider), reader.GetByte(14)); - if (!reader.IsDBNull(15)) msg.created = reader.GetDateTime(15); + if (!reader.IsDBNull(15)) msg.Created = reader.GetDateTime(15); if (!reader.IsDBNull(16)) msg.CreatedBy = reader.GetString(16); if (!reader.IsDBNull(17)) msg.ChangedBy = reader.GetString(17); - if (!reader.IsDBNull(18)) msg.changed = reader.GetDateTime(18); + if (!reader.IsDBNull(18)) msg.Changed = reader.GetDateTime(18); if (!reader.IsDBNull(19)) msg.StatusInfo = reader.GetString(19); if (!reader.IsDBNull(20)) msg.SendSuccess = reader.GetBoolean(20); if (!reader.IsDBNull(21)) msg.SentBy = reader.GetString(21); @@ -542,8 +539,8 @@ namespace bsmd.database { foreach (Message message in messages) { - if (message.reportingPartyId.HasValue && reportingParties.ContainsKey(message.reportingPartyId.Value)) - message.reportingParty = reportingParties[message.reportingPartyId.Value]; + if (message.ReportingPartyId.HasValue && reportingParties.ContainsKey(message.ReportingPartyId.Value)) + message.reportingParty = reportingParties[message.ReportingPartyId.Value]; } } @@ -551,14 +548,13 @@ namespace bsmd.database { foreach (Message message in messages) { - if (message.messageCoreId.HasValue && messageCores.ContainsKey(message.messageCoreId.Value)) - message.MessageCore = messageCores[message.messageCoreId.Value]; + if (message.MessageCoreId.HasValue && messageCores.ContainsKey(message.MessageCoreId.Value)) + message.MessageCore = messageCores[message.MessageCoreId.Value]; } } public static bool IsListClass(NotificationClass notificationClass) - { - bool result = false; + { switch(notificationClass) { @@ -576,7 +572,7 @@ namespace bsmd.database return true; } - return result; + return false; } @@ -624,7 +620,7 @@ namespace bsmd.database foreach (DatabaseEntity entity in this.Elements) { ISublistElement sublistElement = entity as ISublistElement; - if ((sublistElement != null ) && (sublistElement.Identifier != null)) + if (sublistElement?.Identifier != null) { if (((ISublistElement)entity).Identifier.Equals(identifier)) return entity as ISublistElement; @@ -661,9 +657,9 @@ namespace bsmd.database foreach (DatabaseEntity dbEntity in this.Elements) { DBManager.Instance.Save(dbEntity); - if (dbEntity is ISublistContainer) + if (dbEntity is ISublistContainer sublistContainer) { - ((ISublistContainer)dbEntity).SaveElements(); + (sublistContainer).SaveElements(); } } } @@ -672,9 +668,9 @@ namespace bsmd.database { foreach (DatabaseEntity dbEntity in this.Elements) { - if (dbEntity is ISublistContainer) + if (dbEntity is ISublistContainer sublistContainer) { - ((ISublistContainer)dbEntity).DeleteElements(); + (sublistContainer).DeleteElements(); } DBManager.Instance.Delete(dbEntity); } diff --git a/nsw/Source/bsmd.database/MessageHistory.cs b/nsw/Source/bsmd.database/MessageHistory.cs index ec27cc9b..1c37624b 100644 --- a/nsw/Source/bsmd.database/MessageHistory.cs +++ b/nsw/Source/bsmd.database/MessageHistory.cs @@ -3,31 +3,94 @@ using System; using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; using System.Linq; using System.Text; namespace bsmd.database { - public class MessageHistory + public class MessageHistory : IDatabaseEntity { + private const string tableName = "[MessageHistory]"; + #region Properties + public string Tablename { get { return tableName; } } + + public Guid? Id { get; set; } + public Guid? ReportingPartyId { get; set; } - ReportingParty CreatedBy { get; set; } + public ReportingParty CreatedBy { get; set; } - public Guid EntityId { get; private set; } + public Guid EntityId { get; internal set; } - public string EntityType { get; private set; } + public string EntityType { get; internal set; } - public string EntityName { get; private set; } + public string EntityName { get; internal set; } - public string EntityValues { get; private set; } + public string EntityValues { get; internal set; } public DateTime Created { get; private set; } #endregion + #region IDatabaseEntity implementation + + public void PrepareSave(IDbCommand cmd) + { + SqlCommand scmd = cmd as SqlCommand; + + // es gibt nur insert + this.Id = Guid.NewGuid(); + scmd.Parameters.AddWithValue("@ID", this.Id); + scmd.Parameters.AddWithNullableValue("@P1", this.ReportingPartyId); + scmd.Parameters.AddWithValue("@P2", this.EntityId); + scmd.Parameters.AddWithValue("@P3", this.EntityType); + scmd.Parameters.AddWithValue("@P4", this.EntityName); + scmd.Parameters.AddWithValue("@P5", this.EntityValues); + scmd.Parameters.AddWithValue("@P6", DateTime.Now); + + cmd.CommandText = string.Format("INSERT INTO {0} (Id, ReportingPartyId, EntityId, EntityType, " + + "EntityName, EntityValues, Timestamp) VALUES (@ID, @P1, @P2, @P3, @P4, @P5, @P6)", this.Tablename); + } + + public void PrepareDelete(IDbCommand cmd) + { + SqlCommand scmd = cmd as SqlCommand; + scmd.CommandText = string.Format("DELETE FROM {0} WHERE Id = @ID", Tablename); + scmd.Parameters.AddWithValue("@ID", this.Id); + } + + public List LoadList(IDataReader reader) + { + List result = new List(); + + while (reader.Read()) + { + MessageHistory mh = new MessageHistory(); + mh.Id = reader.GetGuid(0); + if (!reader.IsDBNull(1)) mh.ReportingPartyId = reader.GetGuid(1); + if (!reader.IsDBNull(2)) mh.EntityId = reader.GetGuid(2); + if (!reader.IsDBNull(3)) mh.EntityType = reader.GetString(3); + if (!reader.IsDBNull(4)) mh.EntityName = reader.GetString(4); + if (!reader.IsDBNull(5)) mh.EntityValues = reader.GetString(5); + if (!reader.IsDBNull(6)) mh.Created = reader.GetDateTime(6); + + result.Add(mh); + } + reader.Close(); + return result; + } + + List IDatabaseEntity.LoadList(IDataReader reader) + { + throw new NotImplementedException(); + } + + #endregion + } } diff --git a/nsw/Source/bsmd.database/PortArea.cs b/nsw/Source/bsmd.database/PortArea.cs index c7f8449c..4a2d6305 100644 --- a/nsw/Source/bsmd.database/PortArea.cs +++ b/nsw/Source/bsmd.database/PortArea.cs @@ -1,6 +1,10 @@ -using System; +// Copyright (c) 2015-2017 schick Informatik +// Description: + +using System; using System.Collections.Generic; using System.Data; +using Newtonsoft.Json; namespace bsmd.database { diff --git a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs index 36ffcf7c..fb735d5e 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs @@ -12,14 +12,12 @@ using System.Data; using System.Text; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { public class PortOfCallLast30Days : DatabaseEntity, ISublistElement, ISublistContainer { - - private List poc30Crew = new List(); - public PortOfCallLast30Days() { this.tablename = "[dbo].[PortOfCallLast30Days]"; @@ -27,9 +25,10 @@ namespace bsmd.database #region Properties + [JsonIgnore] public MDH MDH { get; set; } - public List CrewJoinedShip { get { return this.poc30Crew; } } + public List CrewJoinedShip { get; private set; } = new List(); [ShowReport] [Validation2(ValidationCode.LOCODE)] [MaxLength(5)] @@ -48,11 +47,13 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "pocl30d"; } } /// /// Hilfsproperty, um eine kommaseparierte Liste von Crew (analog ANSW) im ENI-2 anzuzeigen, /// + [JsonIgnore] [ENI2Validation] public string CrewMembersJoinedText { @@ -272,7 +273,7 @@ namespace bsmd.database { PortOfCallLast30Days p30 = this.MemberwiseClone() as PortOfCallLast30Days; p30.id = null; - p30.poc30Crew = new List(); + p30.CrewJoinedShip = new List(); foreach (PortOfCallLast30DaysCrewJoinedShip p30Crew in this.CrewJoinedShip) { diff --git a/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs b/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs index 4ffc224b..c2d384d8 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public PortOfCallLast30Days PortOfCallLast30Days { get; set; } [ShowReport] @@ -34,6 +36,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "pocl30dcjs"; } } #endregion diff --git a/nsw/Source/bsmd.database/PortOfItinerary.cs b/nsw/Source/bsmd.database/PortOfItinerary.cs index f82630f2..aa9ff25e 100644 --- a/nsw/Source/bsmd.database/PortOfItinerary.cs +++ b/nsw/Source/bsmd.database/PortOfItinerary.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public BPOL BPOL { get; set; } [ShowReport] @@ -43,6 +45,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "poi"; } } #endregion diff --git a/nsw/Source/bsmd.database/ReportingParty.cs b/nsw/Source/bsmd.database/ReportingParty.cs index 417c2083..c2d6bf5b 100644 --- a/nsw/Source/bsmd.database/ReportingParty.cs +++ b/nsw/Source/bsmd.database/ReportingParty.cs @@ -11,16 +11,15 @@ namespace bsmd.database { public class ReportingParty : DatabaseEntity { - private DateTime? _created, _changed; + + #region Enums public enum LogonResult { OK, FAILED, USERUKN - } - - #region enumerations + } public enum ReportingPartyTypeEnum { MASTER, SHIPOWNER, CHARTERER, AGENT, PORT_AUTHORITY, CARRIER, OTHERS } @@ -99,6 +98,11 @@ namespace bsmd.database public ReportingPartyTypeEnum? ReportingPartyType { get; set; } + /// + /// Reference to current user (for data history) + /// + public static ReportingParty CurrentReportingParty { get; set; } + #endregion #region ENI Logon User Properties @@ -124,9 +128,9 @@ namespace bsmd.database /// public string Salt { get; set; } - public DateTime? Created { get { return _created; } } + public DateTime? Created { get; private set; } - public DateTime? Changed { get { return _changed; } } + public DateTime? Changed { get; private set; } public int Flags { get; set; } @@ -249,8 +253,8 @@ namespace bsmd.database if (!reader.IsDBNull(11)) rp.Logon = reader.GetString(11); if (!reader.IsDBNull(12)) rp.PasswordHash = reader.GetString(12); if (!reader.IsDBNull(13)) rp.Salt = reader.GetGuid(13).ToString(); - if (!reader.IsDBNull(14)) rp._created = reader.GetDateTime(14); - if (!reader.IsDBNull(15)) rp._changed = reader.GetDateTime(15); + if (!reader.IsDBNull(14)) rp.Created = reader.GetDateTime(14); + if (!reader.IsDBNull(15)) rp.Changed = reader.GetDateTime(15); if (!reader.IsDBNull(16)) rp.Flags = reader.GetInt32(16); if (!reader.IsDBNull(17)) rp.Deleted = reader.GetInt32(17); if (!reader.IsDBNull(18)) rp.UserEMail = reader.GetString(18); diff --git a/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs b/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs index 3bf163d1..d65e11f8 100644 --- a/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs +++ b/nsw/Source/bsmd.database/SanitaryMeasuresDetail.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; +using Newtonsoft.Json; namespace bsmd.database { @@ -25,6 +26,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public MDH MDH { get; set; } [ShowReport] @@ -45,6 +47,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "smd"; } } #endregion diff --git a/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs b/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs index 67959bb3..2ce4267e 100644 --- a/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs +++ b/nsw/Source/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public SEC SEC { get; set; } [ShowReport] @@ -71,6 +73,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "s2s"; } } #endregion diff --git a/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs b/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs index 2ed3dd2a..8accc63f 100644 --- a/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs +++ b/nsw/Source/bsmd.database/StowawaysJoiningLocation.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; +using Newtonsoft.Json; namespace bsmd.database { @@ -25,6 +26,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public MDH MDH { get; set; } [ShowReport] @@ -35,6 +37,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "stowaways"; } } #endregion diff --git a/nsw/Source/bsmd.database/SubsidiaryRisks.cs b/nsw/Source/bsmd.database/SubsidiaryRisks.cs index 06b58d97..8f0463e5 100644 --- a/nsw/Source/bsmd.database/SubsidiaryRisks.cs +++ b/nsw/Source/bsmd.database/SubsidiaryRisks.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public IMDGPosition IMDGPosition { get; set; } [ShowReport] @@ -33,6 +35,7 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "subsidiaryrisks"; } } #endregion diff --git a/nsw/Source/bsmd.database/Waste.cs b/nsw/Source/bsmd.database/Waste.cs index f711ff0e..1618c6f5 100644 --- a/nsw/Source/bsmd.database/Waste.cs +++ b/nsw/Source/bsmd.database/Waste.cs @@ -9,6 +9,7 @@ using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -22,8 +23,10 @@ namespace bsmd.database #region Properties + [JsonIgnore] public WAS WAS { get; set; } + [JsonIgnore] [ShowReport] public string WasteTypeDisplay { @@ -47,6 +50,7 @@ namespace bsmd.database } [ShowReport] + [JsonIgnore] public string WasteTypeDisplayV4 { get @@ -75,6 +79,7 @@ namespace bsmd.database } } + [JsonIgnore] public string WasteTypeDisplayGrid { get @@ -122,8 +127,10 @@ namespace bsmd.database public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "waste"; } } + [JsonIgnore] public bool HasValidWasteCode { get diff --git a/nsw/Source/bsmd.database/WasteDisposalServiceProvider.cs b/nsw/Source/bsmd.database/WasteDisposalServiceProvider.cs index 2aa008a0..3bbdb06f 100644 --- a/nsw/Source/bsmd.database/WasteDisposalServiceProvider.cs +++ b/nsw/Source/bsmd.database/WasteDisposalServiceProvider.cs @@ -11,6 +11,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; +using Newtonsoft.Json; namespace bsmd.database { @@ -24,6 +25,7 @@ namespace bsmd.database #region Properties + [JsonIgnore] public WAS WAS { get; set; } [ShowReport] @@ -33,10 +35,12 @@ namespace bsmd.database public string WasteDisposalServiceProviderName { get; set; } [Obsolete] + [JsonIgnore] public byte? WasteDisposalDelivery { get; set; } public string Identifier { get; set; } + [JsonIgnore] public string SublistCollectionKey { get { return "wdsp"; } } #endregion diff --git a/nsw/Source/bsmd.database/bsmd.database.csproj b/nsw/Source/bsmd.database/bsmd.database.csproj index 7db99649..d4f21d48 100644 --- a/nsw/Source/bsmd.database/bsmd.database.csproj +++ b/nsw/Source/bsmd.database/bsmd.database.csproj @@ -44,6 +44,9 @@ ..\..\..\ENI-2\ENI2\ENI2\packages\log4net.2.0.8\lib\net45-full\log4net.dll True + + ..\..\..\ENI-2\ENI2\ENI2\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + @@ -65,6 +68,7 @@ + diff --git a/nsw/Source/bsmd.database/packages.config b/nsw/Source/bsmd.database/packages.config index 9a0551c5..82cbcac8 100644 --- a/nsw/Source/bsmd.database/packages.config +++ b/nsw/Source/bsmd.database/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file