small error fixes and additions
This commit is contained in:
parent
1e0dbb8c8c
commit
c3b839635b
@ -155,6 +155,13 @@
|
||||
</MultiDataTrigger.Conditions>
|
||||
<Setter Property="Background" Value="Yellow" />
|
||||
</MultiDataTrigger>
|
||||
<MultiDataTrigger>
|
||||
<MultiDataTrigger.Conditions>
|
||||
<Condition Binding="{Binding Path=Elements, Converter={util:CutoffConverter}, ConverterParameter=0}" Value="True" />
|
||||
<Condition Binding="{Binding Path=MessageNotificationClass}" Value="{x:Static data:Message+NotificationClass.PASD}" />
|
||||
</MultiDataTrigger.Conditions>
|
||||
<Setter Property="Background" Value="Yellow" />
|
||||
</MultiDataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</DataGrid.RowStyle>
|
||||
|
||||
@ -273,6 +273,8 @@ namespace bsmd.database
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string Title => "CREWA";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Validation
|
||||
|
||||
@ -312,6 +312,8 @@ namespace bsmd.database
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string Title => "PASA";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Validation
|
||||
|
||||
@ -137,7 +137,7 @@ namespace bsmd.database
|
||||
public static void RegisterNationalityChecker(NationalityValidHandler handler) { _nationalityChecker = handler; }
|
||||
|
||||
/// <summary>
|
||||
/// Test function checks decorated properties on an entity for errors (only errors, violations cannot
|
||||
/// Test function checks decorated properties on an entity for errors (only errors, violations cannot
|
||||
/// happen here)
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
@ -208,7 +208,7 @@ namespace bsmd.database
|
||||
if(((value.Length >= 90) && isStandardML) || ((mla.MaxLength == value.Length) && (value.Length > 20) && !isStandardML))
|
||||
{
|
||||
// put out a warning this might be truncated
|
||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.TRUNCATE, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.TRUNCATE, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
|
||||
@ -216,11 +216,11 @@ namespace bsmd.database
|
||||
if (Attribute.IsDefined(property, typeof(MaxWordLengthAttribute)))
|
||||
{
|
||||
MaxWordLengthAttribute mwla = Attribute.GetCustomAttribute(property, typeof(MaxWordLengthAttribute)) as MaxWordLengthAttribute;
|
||||
|
||||
|
||||
if (value.MaxLenNoWS() > mwla.MaxWordLength)
|
||||
{
|
||||
// put out a warning this might be overflowing in the report
|
||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.WORDOVERFLOW, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.WORDOVERFLOW, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,68 +229,68 @@ namespace bsmd.database
|
||||
switch (validationCode)
|
||||
{
|
||||
case ValidationCode.NOT_NULL:
|
||||
if (value.Length == 0) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (value.Length == 0) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
break;
|
||||
case ValidationCode.LOCODE:
|
||||
{
|
||||
Regex rgx = new Regex("^[A-Z]{2}[A-Z0-9]{3}$");
|
||||
if (!rgx.IsMatch(value))
|
||||
{
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
else if (_locodeChecker != null)
|
||||
{
|
||||
if (!_locodeChecker(value, LocodeMode.STANDARD))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ValidationCode.LOCODE_NOPORT:
|
||||
{
|
||||
Regex rgx = new Regex("^[A-Z]{2}[A-Z0-9]{3}$");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
if (_locodeChecker != null)
|
||||
if (!_locodeChecker(value, LocodeMode.NO_PORT_FLAG))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.LOCODE_SSN:
|
||||
{
|
||||
Regex rgx = new Regex("^[A-Z]{2}[A-Z0-9]{3}$");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
if (_locodeChecker != null)
|
||||
if (!_locodeChecker(value, LocodeMode.SSN))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.LOCODE_GER:
|
||||
{
|
||||
if(!RuleEngine.gerLocodeList.Contains(value))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if(!RuleEngine.gerLocodeList.Contains(value))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.INT_GT_ZERO:
|
||||
{
|
||||
if (!Int32.TryParse(value, out int intVal) || intVal <= 0)
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.DOUBLE_GT_ZERO:
|
||||
{
|
||||
if (!Double.TryParse(value, out double dVal) || dVal <= 0)
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.GISIS:
|
||||
{
|
||||
Regex rgx = new Regex("[0-9]{4}");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.FLAG_CODE:
|
||||
{
|
||||
{
|
||||
if(!RuleEngine.NationalityChecker(value))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.OPTIONAL_FLAG_CODE:
|
||||
@ -298,14 +298,14 @@ namespace bsmd.database
|
||||
if(!value.IsNullOrEmpty())
|
||||
{
|
||||
if (!RuleEngine.NationalityChecker(value))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ValidationCode.TWO_DIGIT:
|
||||
{
|
||||
Regex rgx = new Regex("[0-9]{2}");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.STRING_EXACT_LEN:
|
||||
@ -313,54 +313,54 @@ namespace bsmd.database
|
||||
if (!value.IsNullOrEmpty())
|
||||
{
|
||||
if (value.Length != maxlen)
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ValidationCode.STRING_MAXLEN:
|
||||
{
|
||||
if (value.Length > maxlen)
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.STRING_IMOCLASS:
|
||||
{
|
||||
Regex rgx = new Regex(@"[1-9]{1}(\.[1-9]{1})?");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.STRING_UNNUMBER:
|
||||
{
|
||||
Regex rgx = new Regex("[0-9]{4}");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.DRAUGHT_IMPLAUSIBLE:
|
||||
{
|
||||
if (!Double.TryParse(value, out double dVal) || dVal <= 0)
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.DOUBLE_GT_ZERO, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.DOUBLE_GT_ZERO, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
else
|
||||
if ((dVal < 20) || (dVal > 150))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
case ValidationCode.TIME_IMPLAUSIBLE:
|
||||
{
|
||||
if (value.Length == 0) errors.Add(RuleEngine.CreateError(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (value.Length == 0) errors.Add(RuleEngine.CreateError(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
if (DateTime.TryParse(value, out DateTime aTime))
|
||||
{
|
||||
if ((aTime - DateTime.UtcNow).Minutes > 15)
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ValidationCode.PAST_DATE:
|
||||
{
|
||||
if (value.Length == 0) violations.Add(RuleEngine.CreateViolation(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (value.Length == 0) violations.Add(RuleEngine.CreateViolation(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
if (DateTime.TryParse(value, out DateTime aTime))
|
||||
{
|
||||
if (aTime < DateTime.UtcNow)
|
||||
violations.Add(RuleEngine.CreateViolation(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
violations.Add(RuleEngine.CreateViolation(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -368,11 +368,11 @@ namespace bsmd.database
|
||||
{
|
||||
if(!value.IsNullOrEmpty() && (value.Contains(",")))
|
||||
{
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
if(!value.IsNullOrEmpty() && !value.Trim().Any(char.IsDigit)) // falls "-" oder keine Zahl enthalten, Fehler!
|
||||
{
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -380,25 +380,25 @@ namespace bsmd.database
|
||||
{
|
||||
if((value.Length == 0) || (STAT.VesselTypeDict?.ContainsKey(value) == false))
|
||||
{
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(ValidationCode.NOT_NULL, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ValidationCode.NOT_NULL_MAX_LEN:
|
||||
if ((value.Length > maxlen) || (value.Length == 0))
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
break;
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
break;
|
||||
case ValidationCode.FRZ:
|
||||
{
|
||||
{
|
||||
Regex rgx = new Regex("^[A-Z,a-z,0-9]{4,7}$");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
|
||||
break;
|
||||
}
|
||||
case ValidationCode.MMSI:
|
||||
{
|
||||
Regex rgx = new Regex("^[0-9]{9}$");
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
if (!rgx.IsMatch(value)) errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
break;
|
||||
}
|
||||
case ValidationCode.INVALID_NUMBER_CHARS:
|
||||
@ -409,7 +409,7 @@ namespace bsmd.database
|
||||
{
|
||||
if((elems[i].Length > 50) || (elems[i].IndexOfAny(invalidChars) >= 0))
|
||||
{
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Tablename));
|
||||
errors.Add(RuleEngine.CreateError(validationCode, property.Name, value, entity.Title, identifier, entity.Title));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -437,7 +437,7 @@ namespace bsmd.database
|
||||
// individuelle Fehler nach Nachrichtenklasse prüfen
|
||||
derivedEntity.MessageCore = aMessage.MessageCore; // some instance we need info from core (NOA / Transit)
|
||||
if ((derivedEntity is LADG) && aMessage.MessageCore.IsTransit) continue; // kein error reporting für LADG bei Transit (CH, 1.2.16)
|
||||
// if ((derivedEntity is SEC) && aMessage.MessageCore.IsSmallShip) continue; // keine SEC Validierung für kleine Schiffe (CH, 1.11.18) // Ausnahme wieder entfernt 18.5.22
|
||||
// if ((derivedEntity is SEC) && aMessage.MessageCore.IsSmallShip) continue; // keine SEC Validierung für kleine Schiffe (CH, 1.11.18) // Ausnahme wieder entfernt 18.5.22
|
||||
RuleEngine.ValidateProperties(derivedEntity, errors, violations);
|
||||
derivedEntity.Validate(errors, violations);
|
||||
}
|
||||
@ -448,7 +448,7 @@ namespace bsmd.database
|
||||
/// <summary>
|
||||
/// Diese Funktion wird für Nachrichtenklassen (MDH, SEC,.. usw.) aufgerufen. Error in eingebetteten
|
||||
/// Klassen werden dann der Nachrichtenklasse zugeordnet (können dann logischerweise mehrfach auftreten)
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public void Validate(DatabaseEntity entity)
|
||||
{
|
||||
if (!(entity is Message)) return;
|
||||
@ -463,7 +463,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)
|
||||
// if ((derivedEntity is SEC) && entity.MessageCore.IsSmallShip) continue; // keine STAT Validierung für kleine Schiffe (CH, 1.11.18) // Ausnahme wieder entfernt 18.5.22
|
||||
// if ((derivedEntity is SEC) && entity.MessageCore.IsSmallShip) continue; // keine STAT Validierung für kleine Schiffe (CH, 1.11.18) // Ausnahme wieder entfernt 18.5.22
|
||||
ValidateProperties(derivedEntity, errors, violations);
|
||||
derivedEntity.Validate(errors, violations);
|
||||
}
|
||||
@ -505,21 +505,21 @@ namespace bsmd.database
|
||||
|
||||
#region private helper
|
||||
|
||||
public static MessageError CreateError(ValidationCode validationCode, string p, string value, string entityName,
|
||||
public static MessageError CreateError(ValidationCode validationCode, string property, string value, string entityName,
|
||||
string identifier = "", string notificationClass = "")
|
||||
{
|
||||
|
||||
|
||||
MessageError error = new MessageError();
|
||||
|
||||
if (identifier.IsNullOrEmpty())
|
||||
error.FullName = string.Format("{0}.{1}", entityName, p);
|
||||
error.FullName = string.Format("{0}.{1}", entityName, property);
|
||||
else
|
||||
error.FullName = string.Format("{0}.{1}_{2}", entityName, p, identifier);
|
||||
error.FullName = string.Format("{0}.{1}_{2}", entityName, property, identifier);
|
||||
|
||||
error.ErrorCode = (int)validationCode;
|
||||
error.Identifier = identifier;
|
||||
error.PropertyName = p;
|
||||
|
||||
error.Identifier = identifier;
|
||||
error.PropertyName = property;
|
||||
|
||||
var match = Regex.Match(notificationClass, @"\[*\]\.\[(.*)\]");
|
||||
if (match.Success)
|
||||
error.NotificationClass = match.Groups[1].Value;
|
||||
@ -527,22 +527,22 @@ namespace bsmd.database
|
||||
error.NotificationClass = notificationClass;
|
||||
|
||||
if (errorTextList.ContainsKey((int)validationCode))
|
||||
{
|
||||
error.ErrorText = string.Format(errorTextList[(int)validationCode], p, value);
|
||||
{
|
||||
error.ErrorText = string.Format(errorTextList[(int)validationCode], property, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
error.ErrorText = p;
|
||||
error.ErrorText = property;
|
||||
if (value != null)
|
||||
error.ErrorText += " - " + value;
|
||||
error.ErrorText += " - " + value;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
public static MessageViolation CreateViolation(ValidationCode validationCode, string p,
|
||||
public static MessageViolation CreateViolation(ValidationCode validationCode, string p,
|
||||
string value, string entityName, string identifier = "", string notificationClass = "")
|
||||
{
|
||||
|
||||
|
||||
MessageViolation violation = new MessageViolation();
|
||||
|
||||
if (identifier.IsNullOrEmpty())
|
||||
@ -551,7 +551,7 @@ namespace bsmd.database
|
||||
violation.FullName = string.Format("{0}.{1}_{2}", entityName, p, identifier);
|
||||
|
||||
violation.ViolationCode = (int)validationCode;
|
||||
violation.Identifier = identifier;
|
||||
violation.Identifier = identifier;
|
||||
violation.PropertyName = p;
|
||||
|
||||
var match = Regex.Match(notificationClass, @"\[*\]\.\[(.*)\]");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user