Compare commits

..

No commits in common. "d8c3578144541043d53048c39aa49a6457d07f45" and "3cfd642f661905d5937cf8b8bf179e296e700b0d" have entirely different histories.

5 changed files with 38 additions and 84 deletions

View File

@ -837,7 +837,8 @@ namespace ENI2
private ValidationResult ValidateCore(List<Message> messagesSnapshot) private ValidationResult ValidateCore(List<Message> messagesSnapshot)
{ {
List<MessageViolation> vViolations = new List<MessageViolation>(); List<MessageViolation> vViolations = new List<MessageViolation>();
List<MessageError> vErrors = new List<MessageError>(); List<MessageError> vErrors = new List<MessageError>();
Dictionary<Message, MessageValidationCounts> counts = new Dictionary<Message, MessageValidationCounts>();
RuleEngine ruleEngine = new RuleEngine(); RuleEngine ruleEngine = new RuleEngine();
foreach (Message aMessage in messagesSnapshot) foreach (Message aMessage in messagesSnapshot)
@ -846,7 +847,15 @@ namespace ENI2
List<MessageError> errors = new List<MessageError>(); List<MessageError> errors = new List<MessageError>();
List<MessageViolation> violations = new List<MessageViolation>(); List<MessageViolation> violations = new List<MessageViolation>();
ruleEngine.ValidateMessage(aMessage, out errors, out violations); ruleEngine.ValidateMessage(aMessage, out errors, out violations);
MessageValidationCounts messageCounts = new MessageValidationCounts
{
ErrorCount = errors.Count > 0 ? (int?)errors.Count : null,
ViolationCount = violations.Count > 0 ? (int?)violations.Count : null,
PositionViolationCount = violations.Count > 0 ? (int?)violations.Count(v => !v.Identifier.IsNullOrEmpty()) : null
};
counts[aMessage] = messageCounts;
string messageGroup = this.MessageGroupForMessage(aMessage); string messageGroup = this.MessageGroupForMessage(aMessage);
@ -1258,7 +1267,7 @@ namespace ENI2
case 401: case 401:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.5) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.5)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1276,7 +1285,7 @@ namespace ENI2
case 511: case 511:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1285,7 +1294,7 @@ namespace ENI2
case 602: case 602:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.75) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.75)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1306,7 +1315,7 @@ namespace ENI2
case 105: case 105:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1314,7 +1323,7 @@ namespace ENI2
case 401: case 401:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.5) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.5)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1332,7 +1341,7 @@ namespace ENI2
case 511: case 511:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.2) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.2)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1341,7 +1350,7 @@ namespace ENI2
case 602: case 602:
if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25) if (waste.WasteAmountRetained_MTQ > waste.WasteCapacity_MTQ * 0.25)
{ {
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "Waste", waste.Identifier, was.Tablename); MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Acc. to EU Regulation 2022/89 the amount retained on board is noticeably", null, "WAS", waste.Identifier, "WAS");
mv.MessageGroupName = wasMessageGroup; mv.MessageGroupName = wasMessageGroup;
vViolations.Add(mv); vViolations.Add(mv);
} }
@ -1384,70 +1393,9 @@ namespace ENI2
} }
} }
// Recompute per-message counts after all global validations
Dictionary<Message, MessageValidationCounts> counts = new Dictionary<Message, MessageValidationCounts>();
int assignViolationCounter = 0;
int assignErrorCounter = 0;
List<MessageViolation> tmpVList = new List<MessageViolation>(vViolations);
List<MessageError> tmpEList = new List<MessageError>(vErrors);
foreach (Message aMessage in messagesSnapshot)
{
counts[aMessage] = new MessageValidationCounts();
counts[aMessage].ErrorCount = tmpEList.Count(me => me.NotificationClass == aMessage.MessageNotificationClassDisplay); // generic
// special cases
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.WAS_RCPT) && (me.NotificationClass == "WasteReceived"));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IMDGPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IGCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IBCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IMSBCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "MARPOL_Annex_I_Position") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IMDGPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IGCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IBCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IMSBCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "MARPOL_Annex_I_Position") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.WAS) && (me.NotificationClass == "Waste"));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.SEC) && (me.NotificationClass == "LastTenPortFacilitiesCalled"));
counts[aMessage].ErrorCount += tmpEList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.SEC) && (me.NotificationClass == "ShipToShipActivitiesDuringLastTenPortFacilitiesCalled"));
if (counts[aMessage].ErrorCount == 0) counts[aMessage].ErrorCount = null; // set to empty if nothing counted
assignErrorCounter += counts[aMessage].ErrorCount ?? 0;
counts[aMessage].ViolationCount = vViolations.Count(mv => mv.NotificationClass == aMessage.MessageNotificationClassDisplay); // generic
// special cases
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.WAS_RCPT) && (me.NotificationClass == "WasteReceived"));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IMDGPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IGCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IBCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "IMSBCPosition") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZA) && (me.NotificationClass == "MARPOL_Annex_I_Position") && me.MessageGroupName.Contains("arrival", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IMDGPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IGCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IBCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "IMSBCPosition") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) && (me.NotificationClass == "MARPOL_Annex_I_Position") && me.MessageGroupName.Contains("departure", StringComparison.OrdinalIgnoreCase));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.WAS) && (me.NotificationClass == "Waste"));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.SEC) && (me.NotificationClass == "LastTenPortFacilitiesCalled"));
counts[aMessage].ViolationCount += tmpVList.Count(me => (aMessage.MessageNotificationClass == Message.NotificationClass.SEC) && (me.NotificationClass == "ShipToShipActivitiesDuringLastTenPortFacilitiesCalled"));
if (counts[aMessage].ViolationCount == 0) counts[aMessage].ViolationCount = null;
assignViolationCounter += counts[aMessage].ViolationCount ?? 0;
}
Trace.WriteLine(string.Format("Unassigned errors: {0}, unassigned violations: {1}", vErrors.Count - assignErrorCounter, vViolations.Count - assignViolationCounter));
return new ValidationResult(vViolations, vErrors, counts); return new ValidationResult(vViolations, vErrors, counts);
} }
private void ApplyValidationResult(ValidationResult result, bool showMessages) private void ApplyValidationResult(ValidationResult result, bool showMessages)
{ {
// TODO: clear highlighting // TODO: clear highlighting
@ -1456,7 +1404,8 @@ namespace ENI2
Message aMessage = entry.Key; Message aMessage = entry.Key;
MessageValidationCounts messageCounts = entry.Value; MessageValidationCounts messageCounts = entry.Value;
aMessage.ErrorCount = messageCounts.ErrorCount; aMessage.ErrorCount = messageCounts.ErrorCount;
aMessage.ViolationCount = messageCounts.ViolationCount; aMessage.ViolationCount = messageCounts.ViolationCount;
aMessage.PositionViolationCount = messageCounts.PositionViolationCount;
} }
foreach (MessageError me in result.Errors) foreach (MessageError me in result.Errors)

View File

@ -341,8 +341,8 @@ namespace ENI2.DetailViewControls
} }
} }
public void UpdateCore() public void UpdateCore()
{ {
this.UnregisterTextboxChange(this.textBoxDisplayId); this.UnregisterTextboxChange(this.textBoxDisplayId);
this.textBoxDisplayId.DataContext = null; this.textBoxDisplayId.DataContext = null;
@ -367,13 +367,13 @@ namespace ENI2.DetailViewControls
//}; //};
//sid.UpdateId(this.Core.DisplayId); //sid.UpdateId(this.Core.DisplayId);
//sid.Show(); //sid.Show();
this.Core.IsDirty = false; // ist ja schon gespeichert.. this.Core.IsDirty = false; // ist ja schon gespeichert..
} }
internal void RefreshMessageGrid() internal void RefreshMessageGrid()
{ {
this.dataGridMessages?.Items?.Refresh(); this.dataGridMessages?.Items?.Refresh();
} }
#endregion #endregion

View File

@ -36,8 +36,8 @@
<MinimumRequiredVersion>5.4.0.0</MinimumRequiredVersion> <MinimumRequiredVersion>5.4.0.0</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish> <CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.html</WebPage> <WebPage>publish.html</WebPage>
<ApplicationRevision>2</ApplicationRevision> <ApplicationRevision>1</ApplicationRevision>
<ApplicationVersion>7.2.14.2</ApplicationVersion> <ApplicationVersion>7.2.14.1</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut> <CreateDesktopShortcut>true</CreateDesktopShortcut>
<PublishWizardCompleted>true</PublishWizardCompleted> <PublishWizardCompleted>true</PublishWizardCompleted>

View File

@ -431,6 +431,11 @@ namespace bsmd.database
/// </summary> /// </summary>
public int? ViolationCount { get; set; } public int? ViolationCount { get; set; }
/// <summary>
/// Number of violations during last validation that have the "identifier" set and are thus detected violations
/// from underlying list elements
/// </summary>
public int? PositionViolationCount { get; set; }
/// <summary> /// <summary>
/// Number of errors during last validation /// Number of errors during last validation

View File

@ -76,7 +76,7 @@ namespace bsmd.database
wasteReceived.id = reader.GetGuid(0); wasteReceived.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) wasteReceived.WasteCode = reader.GetString(1); if (!reader.IsDBNull(1)) wasteReceived.WasteCode = reader.GetString(1);
if (!reader.IsDBNull(2)) wasteReceived.WasteDescription = reader.GetString(2); if (!reader.IsDBNull(2)) wasteReceived.WasteDescription = reader.GetString(2);
if (!reader.IsDBNull(3)) wasteReceived.AmountWasteReceived_MTQ = (float)reader.GetDouble(3); if (!reader.IsDBNull(3)) wasteReceived.AmountWasteReceived_MTQ = (float)reader.GetDouble(3);
if (!reader.IsDBNull(4)) wasteReceived.Identifier = reader.GetString(4); if (!reader.IsDBNull(4)) wasteReceived.Identifier = reader.GetString(4);
result.Add(wasteReceived); result.Add(wasteReceived);
} }
@ -111,7 +111,7 @@ namespace bsmd.database
scmd.Parameters.AddWithValue("@P1", this.WAS_RCPT.Id); scmd.Parameters.AddWithValue("@P1", this.WAS_RCPT.Id);
scmd.Parameters.AddWithNullableValue("@P2", this.WasteCode); scmd.Parameters.AddWithNullableValue("@P2", this.WasteCode);
scmd.Parameters.AddWithNullableValue("@P3", this.WasteDescription); scmd.Parameters.AddWithNullableValue("@P3", this.WasteDescription);
scmd.Parameters.AddWithNullableValue("@P4", this.AmountWasteReceived_MTQ); scmd.Parameters.AddWithNullableValue("@P4", this.AmountWasteReceived_MTQ);
scmd.Parameters.AddWithNullableValue("@P5", this.Identifier); scmd.Parameters.AddWithNullableValue("@P5", this.Identifier);
if (this.IsNew) if (this.IsNew)