From 707b5c9179ca203dacd58dc65a201901a7ad9de5 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 11 Sep 2017 18:59:11 +0000 Subject: [PATCH] ENI-2 Version Work in Progress mit der Validierung, einige kleinere Korrekturen --- ENI-2/ENI2/ENI2/DetailBaseControl.cs | 13 +- ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs | 113 +++++++++++++- ...aritimeHealthDeclarationDetailControl.xaml | 4 +- .../OverViewDetailControl.xaml | 9 +- .../OverViewDetailControl.xaml.cs | 20 ++- ENI-2/ENI2/ENI2/ENI2.csproj | 3 +- .../ENI2/ENI2/EditControls/EditIGCDialog.xaml | 2 +- .../EditPortOfItineraryDialog.xaml | 2 +- .../EditPortOfItineraryDialog.xaml.cs | 6 +- .../ENI2/EditControls/EditSERVDialog.xaml | 6 +- .../ENI2/ENI2/EditControls/EditTOWDialog.xaml | 2 +- ENI-2/ENI2/ENI2/Util/HighlightService.cs | 83 +++++++++- ENI-2/ENI2/ENI2/Util/ValidationContext.cs | 146 ++++++++++++++++++ Stundensheet.xlsx | Bin 33056 -> 34076 bytes nsw/Source/SQL/ErrorViolation.sql | 20 +++ nsw/Source/bsmd.database/IBCPosition.cs | 2 +- nsw/Source/bsmd.database/IMDGPosition.cs | 6 +- nsw/Source/bsmd.database/INFO.cs | 40 +---- nsw/Source/bsmd.database/LADG.cs | 2 +- .../LastTenPortFacilitiesCalled.cs | 2 +- .../bsmd.database/MARPOL_Annex_I_Position.cs | 2 +- nsw/Source/bsmd.database/MDH.cs | 85 +++++++++- nsw/Source/bsmd.database/MessageError.cs | 6 + nsw/Source/bsmd.database/MessageViolation.cs | 6 + nsw/Source/bsmd.database/NOA_NOD.cs | 12 +- nsw/Source/bsmd.database/PAS.cs | 14 +- nsw/Source/bsmd.database/PRE72H.cs | 4 +- .../bsmd.database/PortOfCallLast30Days.cs | 2 +- .../Properties/AssemblyProductInfo.cs | 2 +- .../Properties/AssemblyProjectInfo.cs | 2 +- nsw/Source/bsmd.database/RuleEngine.cs | 76 ++++++--- nsw/Source/bsmd.database/SEC.cs | 4 +- nsw/Source/bsmd.database/STAT.cs | 2 +- ...vitiesDuringLastTenPortFacilitiesCalled.cs | 2 +- .../bsmd.database/ValidationAttribute.cs | 3 +- nsw/Source/bsmd.database/WAS.cs | 23 +-- nsw/Source/bsmd.database/Waste.cs | 4 +- nsw/Source/bsmd.hisnord/Request.cs | 26 ++-- 38 files changed, 593 insertions(+), 163 deletions(-) create mode 100644 ENI-2/ENI2/ENI2/Util/ValidationContext.cs create mode 100644 nsw/Source/SQL/ErrorViolation.sql diff --git a/ENI-2/ENI2/ENI2/DetailBaseControl.cs b/ENI-2/ENI2/ENI2/DetailBaseControl.cs index 94467804..d1ac9dc1 100644 --- a/ENI-2/ENI2/ENI2/DetailBaseControl.cs +++ b/ENI-2/ENI2/ENI2/DetailBaseControl.cs @@ -32,6 +32,7 @@ namespace ENI2 private Dictionary _controlClassDict = new Dictionary(); private Dictionary _typeMessageDict = new Dictionary(); private List _controlMessages = new List(); + #endregion @@ -56,10 +57,15 @@ namespace ENI2 public event Action JumpToListElementRequest; /// - /// Mit diesem Event kann ein Listen-Element einen Reload der gesamten Anmeldung auslösen (ob das so eine tolle Idee ist.) + /// Mit diesem Event kann ein Listen-Element einen Reload der gesamten Anmeldung auslösen /// public event Action RequestReload; + /// + /// Damit kann ein Listenelement eine Validierung der gesamten Anmeldung auslösen (inkl. Highlighting) + /// + public event Action RequestValidate; + /// /// Eine in der Detailansicht enthaltene Meldeklasse hat sich geändert /// @@ -132,6 +138,11 @@ namespace ENI2 this.RequestReload?.Invoke(); } + protected virtual void OnRequestValidate() + { + this.RequestValidate?.Invoke(); + } + protected virtual void OnControlCacheReset(string messageGroupName) { this.ResetControlCache?.Invoke(messageGroupName); diff --git a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs index 9547472f..9abc39a7 100644 --- a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs @@ -26,11 +26,16 @@ namespace ENI2 private MessageCore _core; private List _listBoxList = new List(); private List _messages; - private Dictionary controlCache = new Dictionary(); + private Dictionary controlCache = new Dictionary(); + private Dictionary messageClassControlDict = new Dictionary(); private Guid userId = Guid.NewGuid(); // remove THIS!! private object messageListLock = new object(); private HighlightService highlightService = new HighlightService(); + // Validation + protected List _vErrors = new List(); + protected List _vViolations = new List(); + #endregion #region Properties @@ -128,6 +133,7 @@ namespace ENI2 detailControl.RequestReload += DetailControl_RequestReload; detailControl.NotificationClassChanged += DetailControl_NotificationClassChanged; detailControl.ResetControlCache += DetailControl_ResetControlCache; + detailControl.RequestValidate += DetailControl_RequestValidate; detailControl.Initialize(); detailControl.IsEnabled = !this.LockedByOtherUser; @@ -159,7 +165,7 @@ namespace ENI2 detailView.Children.Add(controlCache[mg.MessageGroupName]); } - } + } private void DetailControl_ResetControlCache(string messageGroupName) { @@ -284,14 +290,115 @@ namespace ENI2 // if the entity has been highlighted (through remote change detection), reset this here this.OnHighlightReset(); - } + } + + private void DetailControl_RequestValidate() + { + this._vErrors.Clear(); + this._vViolations.Clear(); + // TODO: clear highlighting + + RuleEngine ruleEngine = new RuleEngine(); + foreach (Message aMessage in _messages) + { + List errors = new List(); + List violations = new List(); + ruleEngine.ValidateMessage(aMessage, out errors, out violations); + + string messageGroup = this.MessageGroupForMessage(aMessage); + + if (messageGroup != null) + { + foreach (MessageError me in errors) + me.MessageGroupName = messageGroup; + foreach (MessageViolation mv in violations) + mv.MessageGroupName = messageGroup; + } + + this._vErrors.AddRange(errors); + this._vViolations.AddRange(violations); + } + + + foreach (MessageError me in this._vErrors) + { + this.highlightService.HighlightError(me, this.GetContainerForMessageGroupName(me.MessageGroupName)); + } + foreach (MessageViolation mv in this._vViolations) + { + + this.highlightService.HighlightViolation(mv, this.GetContainerForMessageGroupName(mv.MessageGroupName)); + } + } #endregion + #region private / protected methods + protected virtual void OnHighlightReset() { this.HighlightReset?.Invoke(this.Core); } + private DependencyObject GetContainerForMessageGroupName(string messageGroupName) + { + if (controlCache.ContainsKey(messageGroupName)) + return controlCache[messageGroupName]; + return null; + } + + protected string MessageGroupForMessage(Message mh) + { + if (mh == null) return null; + switch(mh.MessageNotificationClass) + { + case Message.NotificationClass.ATA: + case Message.NotificationClass.TIEFA: + case Message.NotificationClass.POBA: + case Message.NotificationClass.BKRA: + return Properties.Resources.textArrivalNotification; + case Message.NotificationClass.BPOL: + case Message.NotificationClass.CREW: + case Message.NotificationClass.CREWD: + case Message.NotificationClass.PAS: + case Message.NotificationClass.PASD: + return Properties.Resources.textBorderPolice; + case Message.NotificationClass.HAZA: + return Properties.Resources.textDGArrival; + case Message.NotificationClass.HAZD: + return Properties.Resources.textDGDeparture; + case Message.NotificationClass.ATD: + case Message.NotificationClass.TIEFD: + case Message.NotificationClass.POBD: + case Message.NotificationClass.BKRD: + return Properties.Resources.textDepartureNotification; + case Message.NotificationClass.MDH: + return Properties.Resources.textMDH; + case Message.NotificationClass.NOA_NOD: + return Properties.Resources.textOverview; + case Message.NotificationClass.AGNT: + return Properties.Resources.textPortCall; + case Message.NotificationClass.NAME: + case Message.NotificationClass.INFO: + case Message.NotificationClass.SERV: + case Message.NotificationClass.LADG: + return Properties.Resources.textPortNotification; + case Message.NotificationClass.PRE72H: + return Properties.Resources.textPSC72h; + case Message.NotificationClass.SEC: + return Properties.Resources.textSecurity; + case Message.NotificationClass.STAT: + return Properties.Resources.textShipData; + case Message.NotificationClass.TOWA: + case Message.NotificationClass.TOWD: + return Properties.Resources.textTowage; + case Message.NotificationClass.WAS: + return Properties.Resources.textWaste; + } + return null; + } + + #endregion + } } diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml index 51dbca63..1eb51447 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml +++ b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml @@ -75,10 +75,10 @@ - + - + diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml b/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml index 8c180716..224aa0ed 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml +++ b/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml @@ -66,7 +66,7 @@