// // Class: HAZ // Current CLR: 4.0.30319.34209 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 5/26/2015 8:13:35 PM // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. using Newtonsoft.Json; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data.SqlClient; namespace bsmd.database { [TypeConverter(typeof(MessageClassConverter))] [JsonConverter(typeof(NoTypeConverterJsonConverter))] public class HAZ : DatabaseEntity, ISublistContainer { public HAZ() { } #region Properties [Validation(ValidationCode.NOT_NULL)] [ENI2Validation] public bool? NoDPGOnBoardOnArrival { get; set; } [ShowReport] [ENI2Validation] public bool? DPGManifestOnBoardOnArrival { get; set; } [ShowReport] [ENI2Validation] public byte? INFShipClass { get; set; } [ShowReport] [ENI2Validation] public bool? MOUBaltic { get; set; } [ENI2Validation] public bool? DPGClassificationIMDG { get; set; } [ENI2Validation] public bool? DPGClassificationIGC { get; set; } [ENI2Validation] public bool? DPGClassificationIBC { get; set; } [ENI2Validation] public bool? DPGClassificationIMSBC { get; set; } [ENI2Validation] public bool? DPGClassificationMARPOL_ANNEX_I { get; set; } // DK [ENI2Validation] [MaxLength(128)] public string DPGContactFamilyName { get; set; } // DK [ENI2Validation] [MaxLength(64)] public string DPGContactPhone { get; set; } public ObservableCollection IMDGPositions { get; private set; } = new ObservableCollection(); public ObservableCollection IBCPositions { get; private set; } = new ObservableCollection(); public ObservableCollection IGCPositions { get; private set; } = new ObservableCollection(); public ObservableCollection IMSBCPositions { get; private set; } = new ObservableCollection(); public ObservableCollection MARPOLPositions { get; private set; } = new ObservableCollection(); // selektor HAZA / HAZD [ENI2Validation] public bool IsDeparture { get; set; } /// /// No NSW field! Set to determine whether HAZ info should be reported to the NSW /// [ENI2Validation] public string TransmissionType { get; set; } [Browsable(false)] [JsonIgnore] public bool HasPositions { get { if (this.IMDGPositions.Count > 0) return true; if (this.IBCPositions.Count > 0) return true; if (this.IGCPositions.Count > 0) return true; if (this.IMSBCPositions.Count > 0) return true; if (this.MARPOLPositions.Count > 0) return true; return false; } } /// /// Hilfsstruktur für Packagetype Darstellung (IMDG) im ENI-2 /// [JsonIgnore] [Browsable(false)] public static Dictionary PackageTypes { get; set; } #endregion #region DatabaseEntity implementation public override string Tablename { get { if (this.IsDeparture) return "[dbo].[HAZD]"; else return "[dbo].[HAZA]"; } } public override void PrepareSave(System.Data.IDbCommand cmd) { SqlCommand scmd = cmd as SqlCommand; scmd.Parameters.AddWithValue("@P1", this.MessageHeader.Id); scmd.Parameters.AddWithNullableValue("@P2", this.NoDPGOnBoardOnArrival); scmd.Parameters.AddWithNullableValue("@P3", this.DPGManifestOnBoardOnArrival); scmd.Parameters.AddWithNullableValue("@P4", this.INFShipClass); scmd.Parameters.AddWithNullableValue("@P5", this.DPGClassificationIMDG); scmd.Parameters.AddWithNullableValue("@P6", this.DPGClassificationIGC); scmd.Parameters.AddWithNullableValue("@P7", this.DPGClassificationIBC); scmd.Parameters.AddWithNullableValue("@P8", this.DPGClassificationIMSBC); scmd.Parameters.AddWithNullableValue("@P9", this.DPGClassificationMARPOL_ANNEX_I); scmd.Parameters.AddWithNullableValue("@P10", this.TransmissionType); scmd.Parameters.AddWithNullableValue("@P11", this.MOUBaltic); scmd.Parameters.AddWithNullableValue("@P12", this.DPGContactFamilyName); scmd.Parameters.AddWithNullableValue("@P13", this.DPGContactPhone); if (this.IsNew) { this.CreateId(); scmd.Parameters.AddWithValue("@ID", this.Id); if (IsDeparture) { scmd.CommandText = string.Format("INSERT INTO {0} (Id, MessageHeaderId, NoDPGOnBoardOnDeparture, DPGManifestOnBoardOnDeparture, " + "INFShipClass, DPGClassificationIMDG, DPGClassificationIGC, DPGClassificationIBC, DPGClassificationIMSBC, " + "DPGClassificationMARPOL_ANNEX_I, TransmissionType, MOUBaltic, DPGContactFamilyName, DPGContactPhone) VALUES (@ID, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13)", this.Tablename); } else { scmd.CommandText = string.Format("INSERT INTO {0} (Id, MessageHeaderId, NoDPGOnBoardOnArrival, DPGManifestOnBoardOnArrival, " + "INFShipClass, DPGClassificationIMDG, DPGClassificationIGC, DPGClassificationIBC, DPGClassificationIMSBC, " + "DPGClassificationMARPOL_ANNEX_I, TransmissionType, MOUBaltic, DPGContactFamilyName, DPGContactPhone) VALUES (@ID, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13)", this.Tablename); } } else { scmd.Parameters.AddWithValue("@ID", this.Id); if (IsDeparture) { scmd.CommandText = string.Format("UPDATE {0} SET NODPGOnBoardOnDeparture = @P2, DPGManifestOnBoardOnDeparture = @P3, " + "INFShipClass = @P4, DPGClassificationIMDG = @P5, DPGClassificationIGC = @P6, DPGClassificationIBC = @P7, " + "DPGClassificationIMSBC = @P8, DPGClassificationMARPOL_ANNEX_I = @P9, TransmissionType = @P10, MOUBaltic = @P11, DPGContactFamilyName = @P12, DPGContactPhone = @P13 WHERE Id = @ID", this.Tablename); } else { scmd.CommandText = string.Format("UPDATE {0} SET NODPGOnBoardOnArrival = @P2, DPGManifestOnBoardOnArrival = @P3, " + "INFShipClass = @P4, DPGClassificationIMDG = @P5, DPGClassificationIGC = @P6, DPGClassificationIBC = @P7, " + "DPGClassificationIMSBC = @P8, DPGClassificationMARPOL_ANNEX_I = @P9, TransmissionType = @P10, MOUBaltic = @P11, DPGContactFamilyName = @P12, DPGContactPhone = @P13 WHERE Id = @ID", this.Tablename); } } } public override void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) { string query = string.Format("SELECT Id, NoDPGOnBoardOnArrival, DPGManifestOnBoardOnArrival, INFShipClass, " + "DPGClassificationIMDG, DPGClassificationIGC, DPGClassificationIBC, DPGClassificationIMSBC, " + "DPGClassificationMARPOL_ANNEX_I, TransmissionType, MOUBaltic, DPGContactFamilyName, DPGContactPhone FROM {0} ", this.Tablename); if (this.IsDeparture) { query = string.Format("SELECT Id, NoDPGOnBoardOnDeparture, DPGManifestOnBoardOnDeparture, INFShipClass, " + "DPGClassificationIMDG, DPGClassificationIGC, DPGClassificationIBC, DPGClassificationIMSBC, " + "DPGClassificationMARPOL_ANNEX_I, TransmissionType, MOUBaltic, DPGContactFamilyName, DPGContactPhone 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()) { HAZ haz = new HAZ(); haz.id = reader.GetGuid(0); if (!reader.IsDBNull(1)) haz.NoDPGOnBoardOnArrival = reader.GetBoolean(1); if (!reader.IsDBNull(2)) haz.DPGManifestOnBoardOnArrival = reader.GetBoolean(2); if (!reader.IsDBNull(3)) haz.INFShipClass = reader.GetByte(3); if (!reader.IsDBNull(4)) haz.DPGClassificationIMDG = reader.GetBoolean(4); if (!reader.IsDBNull(5)) haz.DPGClassificationIGC = reader.GetBoolean(5); if (!reader.IsDBNull(6)) haz.DPGClassificationIBC = reader.GetBoolean(6); if (!reader.IsDBNull(7)) haz.DPGClassificationIMSBC = reader.GetBoolean(7); if (!reader.IsDBNull(8)) haz.DPGClassificationMARPOL_ANNEX_I = reader.GetBoolean(8); if (!reader.IsDBNull(9)) haz.TransmissionType = reader.GetString(9); if (!reader.IsDBNull(10)) haz.MOUBaltic = reader.GetBoolean(10); if (!reader.IsDBNull(11)) haz.DPGContactFamilyName = reader.GetString(11); if (!reader.IsDBNull(12)) haz.DPGContactPhone = reader.GetString(12); result.Add(haz); } reader.Close(); return result; } #endregion #region Overrides public override void OverwriteWith(DatabaseEntity otherEntity) { if (otherEntity is HAZ otherHAZ) { base.OverwriteWith(otherEntity); // overwrite IMGD foreach (IMDGPosition imdg in this.IMDGPositions) DBManager.Instance.Delete(imdg); this.IMDGPositions.Clear(); foreach (IMDGPosition imdg in otherHAZ.IMDGPositions) { IMDGPosition newIMDG = imdg.Clone() as IMDGPosition; newIMDG.HAZ = this; DBManager.Instance.Save(newIMDG); this.IMDGPositions.Add(newIMDG); } // overwrite IBC foreach (IBCPosition ibc in this.IBCPositions) DBManager.Instance.Delete(ibc); this.IBCPositions.Clear(); foreach (IBCPosition ibc in otherHAZ.IBCPositions) { IBCPosition newIBC = ibc.Clone() as IBCPosition; newIBC.HAZ = this; DBManager.Instance.Save(newIBC); this.IBCPositions.Add(newIBC); } // overwrite IGC foreach (IGCPosition igc in this.IGCPositions) DBManager.Instance.Delete(igc); this.IGCPositions.Clear(); foreach (IGCPosition igc in otherHAZ.IGCPositions) { IGCPosition newIGC = igc.Clone() as IGCPosition; newIGC.HAZ = this; DBManager.Instance.Save(newIGC); this.IGCPositions.Add(newIGC); } // IMSBC foreach (IMSBCPosition imsbc in this.IMSBCPositions) DBManager.Instance.Delete(imsbc); this.IMSBCPositions.Clear(); foreach (IMSBCPosition imsbc in otherHAZ.IMSBCPositions) { IMSBCPosition newIMSBC = imsbc.Clone() as IMSBCPosition; newIMSBC.HAZ = this; DBManager.Instance.Save(newIMSBC); this.IMSBCPositions.Add(newIMSBC); } // Marpol foreach (MARPOL_Annex_I_Position marpol in this.MARPOLPositions) DBManager.Instance.Delete(marpol); this.MARPOLPositions.Clear(); foreach (MARPOL_Annex_I_Position marpol in otherHAZ.MARPOLPositions) { MARPOL_Annex_I_Position newMarpol = marpol.Clone() as MARPOL_Annex_I_Position; newMarpol.HAZ = this; DBManager.Instance.Save(newMarpol); this.MARPOLPositions.Add(newMarpol); } } } #endregion #region ISublistContainer implementation public ISublistElement GetSublistElementWithIdentifier(string identifier) { foreach (ISublistElement sublist in this.IMDGPositions) { if (sublist.Identifier.Equals(identifier)) return sublist; } return null; } [Browsable(false)] [JsonIgnore] public int NumberOfExcelRows { get { return 0; } } public IGCPosition GetIGCPositionWithIdentifier(string identifier) { foreach (IGCPosition igcPosition in this.IGCPositions) if (igcPosition.Identifier.Equals(identifier)) return igcPosition; return null; } public IMDGPosition GetIMDGPositionWithIdentifier(string identifier) { foreach (IMDGPosition imdgPosition in this.IMDGPositions) if (imdgPosition.Identifier.Equals(identifier)) return imdgPosition; return null; } public IBCPosition GetIBCPositionWithIdentifier(string identifier) { foreach (IBCPosition ibcPosition in this.IBCPositions) if (ibcPosition.Identifier.Equals(identifier)) return ibcPosition; return null; } public IMSBCPosition GetIMSBCPositionWithIdentifier(string identifier) { foreach (IMSBCPosition imsbcPosition in this.IMSBCPositions) if (imsbcPosition.Identifier.Equals(identifier)) return imsbcPosition; return null; } public MARPOL_Annex_I_Position GetMARPOLPositionWithIdentifier(string identifier) { foreach (MARPOL_Annex_I_Position marpolPosition in this.MARPOLPositions) if (marpolPosition.Identifier.Equals(identifier)) return marpolPosition; 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); } public void DeleteElements() { foreach (IMDGPosition imdg in this.IMDGPositions) DBManager.Instance.Delete(imdg); this.IMDGPositions.Clear(); foreach (IMSBCPosition imsbc in this.IMSBCPositions) DBManager.Instance.Delete(imsbc); this.IMSBCPositions.Clear(); foreach (IBCPosition ibc in this.IBCPositions) DBManager.Instance.Delete(ibc); this.IBCPositions.Clear(); foreach (IGCPosition igc in this.IGCPositions) DBManager.Instance.Delete(igc); this.IBCPositions.Clear(); foreach (MARPOL_Annex_I_Position marpol in this.MARPOLPositions) DBManager.Instance.Delete(marpol); this.MARPOLPositions.Clear(); } #endregion #region IMessageParagraph implementation public override string Title { get { return this.IsDeparture ? "HAZD" : "HAZA"; } } public override string Subtitle { get { return this.IsDeparture ? "Hazardous items on departure" : "Hazardous items on arrival"; } } public override List ChildParagraphs { get { List allChildParagraphs = new List(); if(this.IMDGPositions.Count > 0) { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IMDGPositions"; //List sublist = new List(); foreach (IMessageParagraph imp in this.IMDGPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); } if(this.IBCPositions.Count > 0) { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IBCPositions"; //List sublist = new List(); foreach (IMessageParagraph imp in this.IBCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); } if(this.IGCPositions.Count > 0) { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IGCPositions"; //List sublist = new List(); foreach (IMessageParagraph imp in this.IGCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); } if(this.IMSBCPositions.Count > 0) { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "IMSBCPositions"; //List sublist = new List(); foreach (IMessageParagraph imp in this.IMSBCPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); } if(this.MARPOLPositions.Count > 0) { MessageParagraph containerParagraph = new MessageParagraph(); containerParagraph.Title = "MARPOLPositions"; //List sublist = new List(); foreach (IMessageParagraph imp in this.MARPOLPositions) containerParagraph.ChildParagraphs.Add(imp); allChildParagraphs.Add(containerParagraph); } return allChildParagraphs; } } #endregion #region Validation public override DatabaseEntity.ValidationBlock GetValidationBlock() { return (this.NoDPGOnBoardOnArrival ?? false) ? ValidationBlock.BLOCK1 : ValidationBlock.BLOCK2; } public override void Validate(List errors, List violations) { if ((this.NoDPGOnBoardOnArrival ?? false) && this.MessageHeader.InternalStatus == Message.BSMDStatus.TOSEND) { violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "No DPG on board set!", null, this.Title, null, this.Tablename)); } if((NoDPGOnBoardOnArrival ?? false) && this.HasPositions) { violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "HAZ Positions but Dangerous Goods on Board NOT set!", null, this.Title, null, this.Tablename)); } if (this.GetValidationBlock() == ValidationBlock.BLOCK2) { /* if ((this.IMDGPositions.Count == 0) && (this.IBCPositions.Count == 0) && (this.IGCPositions.Count == 0) && (this.IMSBCPositions.Count == 0) && (this.MARPOLPositions.Count == 0)) violations.Add(RuleEngine.CreateViolation(ValidationCode.V805, "At least one DPG item has to be provided!", null)); */ foreach (IMDGPosition imdg in this.IMDGPositions) { RuleEngine.ValidateProperties(imdg, errors, violations); imdg.Validate(errors, violations); } foreach(IBCPosition ibc in this.IBCPositions) { RuleEngine.ValidateProperties(ibc, errors, violations); ibc.Validate(errors, violations); } foreach(IGCPosition igc in this.IGCPositions) { RuleEngine.ValidateProperties(igc, errors, violations); } foreach(IMSBCPosition imsbc in this.IMSBCPositions) { RuleEngine.ValidateProperties(imsbc, errors, violations); imsbc.Validate(errors, violations); } foreach(MARPOL_Annex_I_Position marpol in this.MARPOLPositions) { RuleEngine.ValidateProperties(marpol, errors, violations); marpol.Validate(errors, violations); } } } #endregion #region IClone implementation public override object Clone() { HAZ haz = this.MemberwiseClone() as HAZ; haz.id = null; haz.IMDGPositions = new ObservableCollection(); haz.IBCPositions = new ObservableCollection(); haz.IGCPositions = new ObservableCollection(); haz.IMSBCPositions = new ObservableCollection(); haz.MARPOLPositions = new ObservableCollection(); foreach (IMDGPosition imdgPosition in this.IMDGPositions) { IMDGPosition clonedIMDG = imdgPosition.Clone() as IMDGPosition; clonedIMDG.HAZ = haz; haz.IMDGPositions.Add(clonedIMDG); } foreach (IGCPosition igcPosition in this.IGCPositions) { IGCPosition clonedIGC = igcPosition.Clone() as IGCPosition; clonedIGC.HAZ = haz; haz.IGCPositions.Add(clonedIGC); } foreach (IBCPosition ibcPosition in this.IBCPositions) { IBCPosition clonedIBC = ibcPosition.Clone() as IBCPosition; clonedIBC.HAZ = haz; haz.IBCPositions.Add(clonedIBC); } foreach (IMSBCPosition imsbcPosition in this.IMSBCPositions) { IMSBCPosition clonedIMSBC = imsbcPosition.Clone() as IMSBCPosition; clonedIMSBC.HAZ = haz; haz.IMSBCPositions.Add(clonedIMSBC); } foreach (MARPOL_Annex_I_Position marpolPosition in this.MARPOLPositions) { MARPOL_Annex_I_Position clonedMARPOL = marpolPosition.Clone() as MARPOL_Annex_I_Position; clonedMARPOL.HAZ = haz; haz.MARPOLPositions.Add(clonedMARPOL); } return haz; } #endregion } }