Compare commits
11 Commits
release/en
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| d8c3578144 | |||
| 905a3cc636 | |||
| 3cfd642f66 | |||
| a34c5b19ef | |||
| 79ddbf1572 | |||
| 9d4f608383 | |||
| 5932630635 | |||
| a1f6e6c113 | |||
| 77c0491aa1 | |||
| d02cb0d56b | |||
| 782ae3138e |
@ -338,7 +338,8 @@ namespace ENI2.Controls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row
|
||||||
|
|||||||
@ -17,6 +17,7 @@ using ENI2.EditControls;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using ENI2.SheetDisplayControls;
|
using ENI2.SheetDisplayControls;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace ENI2
|
namespace ENI2
|
||||||
{
|
{
|
||||||
@ -34,6 +35,9 @@ namespace ENI2
|
|||||||
// private readonly Dictionary<Message.NotificationClass, string> messageClassControlDict = new Dictionary<Message.NotificationClass, string>();
|
// private readonly Dictionary<Message.NotificationClass, string> messageClassControlDict = new Dictionary<Message.NotificationClass, string>();
|
||||||
private readonly object messageListLock = new object();
|
private readonly object messageListLock = new object();
|
||||||
private readonly HighlightService highlightService = new HighlightService();
|
private readonly HighlightService highlightService = new HighlightService();
|
||||||
|
private readonly object validationLock = new object();
|
||||||
|
private Task<ValidationResult> activeValidationTask = null;
|
||||||
|
private bool pendingShowMessages = false;
|
||||||
|
|
||||||
// Referenzen für Fehler/Violation Dialoge (können, müssen aber nicht offen bleiben)
|
// Referenzen für Fehler/Violation Dialoge (können, müssen aber nicht offen bleiben)
|
||||||
protected ErrorListDialog _errorListDialog = null;
|
protected ErrorListDialog _errorListDialog = null;
|
||||||
@ -703,7 +707,13 @@ namespace ENI2
|
|||||||
|
|
||||||
private void DetailControl_RequestSendValidation()
|
private void DetailControl_RequestSendValidation()
|
||||||
{
|
{
|
||||||
this.Validate(false, out _, out List<MessageError> errorList);
|
DetailControl_RequestSendValidationAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void DetailControl_RequestSendValidationAsync()
|
||||||
|
{
|
||||||
|
ValidationResult result = await ValidateAndApplyAsync(false);
|
||||||
|
List<MessageError> errorList = result.Errors;
|
||||||
|
|
||||||
foreach (Message aMessage in this._messages)
|
foreach (Message aMessage in this._messages)
|
||||||
{
|
{
|
||||||
@ -777,43 +787,66 @@ namespace ENI2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DetailControl_RequestValidate(bool showDialog)
|
private async void DetailControl_RequestValidate(bool showDialog)
|
||||||
{
|
{
|
||||||
this.Validate(showDialog, out _, out _);
|
await ValidateAndApplyAsync(showDialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Validate(bool showMessages, out List<MessageViolation> vViolations, out List<MessageError> vErrors)
|
private async Task<ValidationResult> ValidateAndApplyAsync(bool showMessages)
|
||||||
{
|
{
|
||||||
vViolations = new List<MessageViolation>();
|
Task<ValidationResult> validationTask = null;
|
||||||
vErrors = new List<MessageError>();
|
lock (validationLock)
|
||||||
|
{
|
||||||
|
if (activeValidationTask != null && !activeValidationTask.IsCompleted)
|
||||||
|
{
|
||||||
|
if (showMessages)
|
||||||
|
pendingShowMessages = true;
|
||||||
|
validationTask = activeValidationTask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pendingShowMessages = showMessages;
|
||||||
|
activeValidationTask = ValidateAndApplyCoreAsync();
|
||||||
|
validationTask = activeValidationTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: clear highlighting
|
return await validationTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<ValidationResult> ValidateAndApplyCoreAsync()
|
||||||
|
{
|
||||||
Util.UIHelper.SetBusyState();
|
Util.UIHelper.SetBusyState();
|
||||||
|
ApplyCrewEffectsWarningSuppression();
|
||||||
|
|
||||||
|
List<Message> messagesSnapshot = _messages.ToList();
|
||||||
|
ValidationResult result = await Task.Run(() => ValidateCore(messagesSnapshot));
|
||||||
|
|
||||||
|
bool showMessages;
|
||||||
|
lock (validationLock)
|
||||||
|
{
|
||||||
|
showMessages = pendingShowMessages;
|
||||||
|
pendingShowMessages = false;
|
||||||
|
activeValidationTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyValidationResult(result, showMessages);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ValidationResult ValidateCore(List<Message> messagesSnapshot)
|
||||||
|
{
|
||||||
|
List<MessageViolation> vViolations = new List<MessageViolation>();
|
||||||
|
List<MessageError> vErrors = new List<MessageError>();
|
||||||
|
|
||||||
RuleEngine ruleEngine = new RuleEngine();
|
RuleEngine ruleEngine = new RuleEngine();
|
||||||
foreach (Message aMessage in _messages)
|
foreach (Message aMessage in messagesSnapshot)
|
||||||
{
|
{
|
||||||
if (!aMessage.EvaluateForValidation(this.Core.IsTransit)) continue;
|
if (!aMessage.EvaluateForValidation(this.Core.IsTransit)) continue;
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
if (errors.Count > 0)
|
|
||||||
aMessage.ErrorCount = errors.Count;
|
|
||||||
else
|
|
||||||
aMessage.ErrorCount = null;
|
|
||||||
if (violations.Count > 0)
|
|
||||||
{
|
|
||||||
aMessage.ViolationCount = violations.Count;
|
|
||||||
aMessage.PositionViolationCount = violations.Count(v => !v.Identifier.IsNullOrEmpty());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
aMessage.ViolationCount = null;
|
|
||||||
aMessage.PositionViolationCount = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
string messageGroup = this.MessageGroupForMessage(aMessage);
|
string messageGroup = this.MessageGroupForMessage(aMessage);
|
||||||
|
|
||||||
@ -829,22 +862,22 @@ namespace ENI2
|
|||||||
vViolations.AddRange(violations);
|
vViolations.AddRange(violations);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 12.11.18 / 6.3.21 / 23.5.22 / 26.10.24: globale Plausi-Prüfungen
|
#region 12.11.18 / 6.3.21 / 23.5.22 / 26.10.24 / 27.1.26: globale Plausi-Prüfungen
|
||||||
|
|
||||||
Message crewaMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWA);
|
Message crewaMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWA);
|
||||||
Message crewdMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWD);
|
Message crewdMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWD);
|
||||||
Message pasaMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.PASA);
|
Message pasaMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.PASA);
|
||||||
Message pasdMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.PASD);
|
Message pasdMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.PASD);
|
||||||
Message pobaMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.POBA);
|
Message pobaMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.POBA);
|
||||||
Message pobdMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.POBD);
|
Message pobdMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.POBD);
|
||||||
Message secMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.SEC);
|
Message secMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.SEC);
|
||||||
Message noanodMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.NOA_NOD);
|
Message noanodMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.NOA_NOD);
|
||||||
Message mdhMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.MDH);
|
Message mdhMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.MDH);
|
||||||
Message was_rcptMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.WAS_RCPT);
|
Message was_rcptMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.WAS_RCPT);
|
||||||
Message wasMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.WAS);
|
Message wasMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.WAS);
|
||||||
Message servMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.SERV);
|
Message servMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.SERV);
|
||||||
Message statMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.STAT);
|
Message statMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.STAT);
|
||||||
Message pre72hMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.PRE72H);
|
Message pre72hMessage = messagesSnapshot.Find(message => message.MessageNotificationClass == Message.NotificationClass.PRE72H);
|
||||||
|
|
||||||
#region CREW / PAS Count Plausibility
|
#region CREW / PAS Count Plausibility
|
||||||
|
|
||||||
@ -984,22 +1017,6 @@ namespace ENI2
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 4.1.23 no CREW effects warning for DE
|
|
||||||
if (crewaMessage != null)
|
|
||||||
{
|
|
||||||
MessageViolation mv = crewaMessage.ViolationList.Find((x) => x.PropertyName.Equals("Effects") && (x.ViolationCode == (int)ValidationCode.TRUNCATE));
|
|
||||||
if ((mv != null) && !Core.IsDK)
|
|
||||||
crewaMessage.ViolationList.Remove(mv);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(crewdMessage != null)
|
|
||||||
{
|
|
||||||
MessageViolation mvd = crewdMessage.ViolationList.Find((x) => x.PropertyName.Equals("Effects") && (x.ViolationCode == (int)ValidationCode.TRUNCATE));
|
|
||||||
if ((mvd != null) && !Core.IsDK)
|
|
||||||
crewdMessage.ViolationList.Remove(mvd);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region WAS_RCPT double numbers
|
#region WAS_RCPT double numbers
|
||||||
|
|
||||||
Dictionary<string, string> identDict = new Dictionary<string, string>();
|
Dictionary<string, string> identDict = new Dictionary<string, string>();
|
||||||
@ -1027,35 +1044,37 @@ namespace ENI2
|
|||||||
|
|
||||||
#region Kiel Canal Timing Plausibility
|
#region Kiel Canal Timing Plausibility
|
||||||
|
|
||||||
if (!this.Core.IsTransit && (secMessage?.Elements.Count > 0) && (noanodMessage?.Elements.Count > 0))
|
|
||||||
{
|
{
|
||||||
SEC sec = secMessage.Elements[0] as SEC;
|
if (!this.Core.IsTransit && (secMessage?.Elements.Count > 0) && (noanodMessage?.Elements.Count > 0))
|
||||||
NOA_NOD noa_nod = noanodMessage.Elements[0] as NOA_NOD;
|
|
||||||
|
|
||||||
if (sec.KielCanalPassagePlanned ?? false)
|
|
||||||
{
|
{
|
||||||
// Überprüfung, ob die eingehende NOK-Durchfahrt auch wirklich innerhalb der eingehenden Reise liegt (bei VISIT)
|
SEC sec = secMessage.Elements[0] as SEC;
|
||||||
bool isValidIncoming = (noa_nod.ETDFromLastPort < sec.KielCanalPassagePlannedIncomming) &&
|
NOA_NOD noa_nod = noanodMessage.Elements[0] as NOA_NOD;
|
||||||
(sec.KielCanalPassagePlannedIncomming < noa_nod.ETAToPortOfCall);
|
|
||||||
if (!sec.KielCanalPassagePlannedIncomming.HasValue) isValidIncoming = true;
|
|
||||||
|
|
||||||
if(!isValidIncoming)
|
if (sec.KielCanalPassagePlanned ?? false)
|
||||||
{
|
{
|
||||||
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Kiel Canal incoming implausible (ETD / ETA ports)!", null, "Kiel Canal timing", null, "SEC");
|
// Überprüfung, ob die eingehende NOK-Durchfahrt auch wirklich innerhalb der eingehenden Reise liegt (bei VISIT)
|
||||||
mv.MessageGroupName = Properties.Resources.textOverview;
|
bool isValidIncoming = (noa_nod.ETDFromLastPort < sec.KielCanalPassagePlannedIncomming) &&
|
||||||
vViolations.Add(mv);
|
(sec.KielCanalPassagePlannedIncomming < noa_nod.ETAToPortOfCall);
|
||||||
}
|
if (!sec.KielCanalPassagePlannedIncomming.HasValue) isValidIncoming = true;
|
||||||
|
|
||||||
|
if (!isValidIncoming)
|
||||||
|
{
|
||||||
|
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Kiel Canal incoming implausible (ETD / ETA ports)!", null, "Kiel Canal timing", null, "SEC");
|
||||||
|
mv.MessageGroupName = Properties.Resources.textOverview;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isValidOutgoing = (noa_nod.ETDFromPortOfCall < sec.KielCanalPassagePlannedOutgoing) &&
|
bool isValidOutgoing = (noa_nod.ETDFromPortOfCall < sec.KielCanalPassagePlannedOutgoing) &&
|
||||||
((noa_nod.NextPort == "ZZUKN") || (sec.KielCanalPassagePlannedOutgoing < noa_nod.ETAToNextPort));
|
((noa_nod.NextPort == "ZZUKN") || (sec.KielCanalPassagePlannedOutgoing < noa_nod.ETAToNextPort));
|
||||||
if (!sec.KielCanalPassagePlannedOutgoing.HasValue) isValidOutgoing = true;
|
if (!sec.KielCanalPassagePlannedOutgoing.HasValue) isValidOutgoing = true;
|
||||||
|
|
||||||
if(!isValidOutgoing)
|
if (!isValidOutgoing)
|
||||||
{
|
{
|
||||||
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Kiel Canal outgoing implausible (ETD / ETA ports)!", null, "Kiel Canal timing", null, "SEC");
|
MessageViolation mv = RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Kiel Canal outgoing implausible (ETD / ETA ports)!", null, "Kiel Canal timing", null, "SEC");
|
||||||
mv.MessageGroupName = Properties.Resources.textOverview;
|
mv.MessageGroupName = Properties.Resources.textOverview;
|
||||||
vViolations.Add(mv);
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1212,19 +1231,133 @@ namespace ENI2
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region WAS special max capa rules regarding next port
|
||||||
|
|
||||||
|
{
|
||||||
|
string wasMessageGroup = this.MessageGroupForMessage(wasMessage);
|
||||||
|
|
||||||
|
// see WAS-Regulation.docx in parent projects misc folder
|
||||||
|
if ((noanodMessage?.Elements.Count > 0) && wasMessage?.Elements.Count > 0)
|
||||||
|
{
|
||||||
|
NOA_NOD noa_nod = noanodMessage.Elements[0] as NOA_NOD;
|
||||||
|
WAS was = wasMessage.Elements[0] as WAS;
|
||||||
|
|
||||||
|
bool isSpecialNextPort = RuleEngine.IsSpecialNextPort(noa_nod.NextPort);
|
||||||
|
|
||||||
|
if (isSpecialNextPort)
|
||||||
|
{
|
||||||
|
foreach (Waste waste in was.Waste)
|
||||||
|
{
|
||||||
|
switch (waste.WasteType)
|
||||||
|
{
|
||||||
|
case 101:
|
||||||
|
case 102:
|
||||||
|
case 103:
|
||||||
|
case 104:
|
||||||
|
case 105:
|
||||||
|
case 401:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 501:
|
||||||
|
case 502:
|
||||||
|
case 503:
|
||||||
|
case 504:
|
||||||
|
case 505:
|
||||||
|
case 506:
|
||||||
|
case 507:
|
||||||
|
case 508:
|
||||||
|
case 509:
|
||||||
|
case 510:
|
||||||
|
case 511:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 601:
|
||||||
|
case 602:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (Waste waste in was.Waste)
|
||||||
|
{
|
||||||
|
switch (waste.WasteType)
|
||||||
|
{
|
||||||
|
case 101:
|
||||||
|
case 102:
|
||||||
|
case 103:
|
||||||
|
case 104:
|
||||||
|
case 105:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 401:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 501:
|
||||||
|
case 502:
|
||||||
|
case 503:
|
||||||
|
case 504:
|
||||||
|
case 505:
|
||||||
|
case 506:
|
||||||
|
case 507:
|
||||||
|
case 508:
|
||||||
|
case 509:
|
||||||
|
case 510:
|
||||||
|
case 511:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 601:
|
||||||
|
case 602:
|
||||||
|
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);
|
||||||
|
mv.MessageGroupName = wasMessageGroup;
|
||||||
|
vViolations.Add(mv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
foreach (MessageError me in vErrors)
|
#endregion
|
||||||
{
|
|
||||||
this.highlightService.HighlightError(me, this.GetContainerForMessageGroupName(me.MessageGroupName));
|
|
||||||
}
|
|
||||||
foreach (MessageViolation mv in vViolations)
|
|
||||||
{
|
|
||||||
this.highlightService.HighlightViolation(mv, this.GetContainerForMessageGroupName(mv.MessageGroupName));
|
|
||||||
}
|
|
||||||
|
|
||||||
// "neue" regelbasierte Validierung: Hier werden die einzelnen Regeln geprüft.
|
// "neue" regelbasierte Validierung: Hier werden die einzelnen Regeln geprüft.
|
||||||
bsmd.database.ValidationRule.PrepareNameLookupDict(this.Core, this._messages);
|
bsmd.database.ValidationRule.PrepareNameLookupDict(this.Core, messagesSnapshot);
|
||||||
|
|
||||||
List<bsmd.database.ValidationRule> validationRules = DBManager.Instance.GetValidationRules();
|
List<bsmd.database.ValidationRule> validationRules = DBManager.Instance.GetValidationRules();
|
||||||
|
|
||||||
@ -1251,10 +1384,94 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void ApplyValidationResult(ValidationResult result, bool showMessages)
|
||||||
|
{
|
||||||
|
// TODO: clear highlighting
|
||||||
|
foreach (KeyValuePair<Message, MessageValidationCounts> entry in result.Counts)
|
||||||
|
{
|
||||||
|
Message aMessage = entry.Key;
|
||||||
|
MessageValidationCounts messageCounts = entry.Value;
|
||||||
|
aMessage.ErrorCount = messageCounts.ErrorCount;
|
||||||
|
aMessage.ViolationCount = messageCounts.ViolationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (MessageError me in result.Errors)
|
||||||
|
{
|
||||||
|
this.highlightService.HighlightError(me, this.GetContainerForMessageGroupName(me.MessageGroupName));
|
||||||
|
}
|
||||||
|
foreach (MessageViolation mv in result.Violations)
|
||||||
|
{
|
||||||
|
this.highlightService.HighlightViolation(mv, this.GetContainerForMessageGroupName(mv.MessageGroupName));
|
||||||
|
}
|
||||||
|
|
||||||
if (showMessages)
|
if (showMessages)
|
||||||
{
|
{
|
||||||
// Show error and violation dialog
|
// Show error and violation dialog
|
||||||
if (vErrors.Count > 0)
|
if (result.Errors.Count > 0)
|
||||||
{
|
{
|
||||||
if(this._errorListDialog == null)
|
if(this._errorListDialog == null)
|
||||||
{
|
{
|
||||||
@ -1269,10 +1486,10 @@ namespace ENI2
|
|||||||
{
|
{
|
||||||
this._errorListDialog.BringUp();
|
this._errorListDialog.BringUp();
|
||||||
}
|
}
|
||||||
this._errorListDialog.Errors = vErrors;
|
this._errorListDialog.Errors = result.Errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vViolations.Count > 0)
|
if (result.Violations.Count > 0)
|
||||||
{
|
{
|
||||||
if(this._violationListDialog == null)
|
if(this._violationListDialog == null)
|
||||||
{
|
{
|
||||||
@ -1287,15 +1504,62 @@ namespace ENI2
|
|||||||
{
|
{
|
||||||
this._violationListDialog.BringUp();
|
this._violationListDialog.BringUp();
|
||||||
}
|
}
|
||||||
_violationListDialog.Violations = vViolations;
|
_violationListDialog.Violations = result.Violations;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((vErrors.Count == 0) && (vViolations.Count == 0))
|
if((result.Errors.Count == 0) && (result.Violations.Count == 0))
|
||||||
{
|
{
|
||||||
MessageBox.Show(Properties.Resources.textValidationOK, Properties.Resources.textValidation, MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBox.Show(Properties.Resources.textValidationOK, Properties.Resources.textValidation, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (controlCache.TryGetValue(Properties.Resources.textOverview, out DetailBaseControl overviewControl) &&
|
||||||
|
overviewControl is OverViewDetailControl ovdc)
|
||||||
|
{
|
||||||
|
ovdc.RefreshMessageGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyCrewEffectsWarningSuppression()
|
||||||
|
{
|
||||||
|
// 4.1.23 no CREW effects warning for DE
|
||||||
|
Message crewaMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWA);
|
||||||
|
Message crewdMessage = _messages.Find(message => message.MessageNotificationClass == Message.NotificationClass.CREWD);
|
||||||
|
|
||||||
|
if (crewaMessage != null)
|
||||||
|
{
|
||||||
|
MessageViolation mv = crewaMessage.ViolationList.Find((x) => x.PropertyName.Equals("Effects") && (x.ViolationCode == (int)ValidationCode.TRUNCATE));
|
||||||
|
if ((mv != null) && !Core.IsDK)
|
||||||
|
crewaMessage.ViolationList.Remove(mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(crewdMessage != null)
|
||||||
|
{
|
||||||
|
MessageViolation mvd = crewdMessage.ViolationList.Find((x) => x.PropertyName.Equals("Effects") && (x.ViolationCode == (int)ValidationCode.TRUNCATE));
|
||||||
|
if ((mvd != null) && !Core.IsDK)
|
||||||
|
crewdMessage.ViolationList.Remove(mvd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class ValidationResult
|
||||||
|
{
|
||||||
|
internal ValidationResult(List<MessageViolation> violations, List<MessageError> errors, Dictionary<Message, MessageValidationCounts> counts)
|
||||||
|
{
|
||||||
|
Violations = violations;
|
||||||
|
Errors = errors;
|
||||||
|
Counts = counts;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal List<MessageViolation> Violations { get; }
|
||||||
|
internal List<MessageError> Errors { get; }
|
||||||
|
internal Dictionary<Message, MessageValidationCounts> Counts { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class MessageValidationCounts
|
||||||
|
{
|
||||||
|
internal int? ErrorCount { get; set; }
|
||||||
|
internal int? ViolationCount { get; set; }
|
||||||
|
internal int? PositionViolationCount { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void _errorListDialog_RefreshClicked()
|
private void _errorListDialog_RefreshClicked()
|
||||||
|
|||||||
@ -1051,7 +1051,8 @@ namespace ENI2.DetailViewControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
@ -1121,7 +1122,8 @@ namespace ENI2.DetailViewControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
@ -1192,7 +1194,8 @@ namespace ENI2.DetailViewControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1);
|
var worksheet = workbook.Worksheet(1);
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
@ -1268,7 +1271,8 @@ namespace ENI2.DetailViewControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1);
|
var worksheet = workbook.Worksheet(1);
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
|
|||||||
@ -370,6 +370,11 @@ namespace ENI2.DetailViewControls
|
|||||||
this.Core.IsDirty = false; // ist ja schon gespeichert..
|
this.Core.IsDirty = false; // ist ja schon gespeichert..
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void RefreshMessageGrid()
|
||||||
|
{
|
||||||
|
this.dataGridMessages?.Items?.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region private methods
|
#region private methods
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
using bsmd.database;
|
using bsmd.database;
|
||||||
using ClosedXML.Excel;
|
using ClosedXML.Excel;
|
||||||
using ENI2.EditControls;
|
using ENI2.EditControls;
|
||||||
|
using ENI2.Excel;
|
||||||
using ENI2.Util;
|
using ENI2.Util;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
@ -479,87 +480,14 @@ namespace ENI2.DetailViewControls
|
|||||||
|
|
||||||
private void buttonImportFromExcel_Click(object sender, RoutedEventArgs e)
|
private void buttonImportFromExcel_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
OpenFileDialog ofd = new OpenFileDialog();
|
int importWasteListCnt = ExcelLocalImportHelper.ImportWaste(_was);
|
||||||
ofd.Filter = "Excel Files|*.xls;*.xlsx";
|
|
||||||
if (ofd.ShowDialog() ?? false)
|
if (importWasteListCnt > 0)
|
||||||
{
|
{
|
||||||
try
|
this.dataGridWaste.Items.Refresh();
|
||||||
{
|
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
MessageBox.Show(String.Format(Properties.Resources.textWasteImported, importWasteListCnt), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
{
|
}
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(3); // Skip first three rows
|
|
||||||
|
|
||||||
List<Waste> importWasteList = new List<Waste>();
|
|
||||||
|
|
||||||
int cnt = 0;
|
|
||||||
object o = null;
|
|
||||||
|
|
||||||
// Diese Funktion kann das "alte" Sheet Format nicht mehr einlesen!
|
|
||||||
|
|
||||||
foreach (var row in rows)
|
|
||||||
{
|
|
||||||
if (cnt >= 35) break; // Maximum 35 rows
|
|
||||||
|
|
||||||
if (worksheet.RangeUsed().ColumnCount() < 9)
|
|
||||||
{
|
|
||||||
throw new InvalidDataException("Sheet must have 9 Columns of data");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!row.Cell(2).IsEmpty()) o = row.Cell(2).Value; else o = null;
|
|
||||||
if ((o != null) && Int32.TryParse(o.ToString(), out int wasteType))
|
|
||||||
{
|
|
||||||
Waste waste = _was.GetWasteForType(wasteType);
|
|
||||||
if (waste == null)
|
|
||||||
{
|
|
||||||
waste = new Waste();
|
|
||||||
waste.WasteType = wasteType;
|
|
||||||
waste.WAS = this._was;
|
|
||||||
waste.IsDirty = true;
|
|
||||||
waste.Identifier = Waste.GetNewIdentifier(this._was.Waste);
|
|
||||||
this._was.Waste.Add(waste);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
waste.IsDirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!row.Cell(5).IsEmpty()) waste.WasteDescription = row.Cell(5).GetString();
|
|
||||||
if (waste.WasteDescription.IsNullOrEmpty())
|
|
||||||
waste.WasteDescription = "-";
|
|
||||||
|
|
||||||
if (!row.Cell(6).IsEmpty()) o = row.Cell(6).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteDisposalAmount_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(7).IsEmpty()) o = row.Cell(7).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteCapacity_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(8).IsEmpty()) o = row.Cell(8).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteAmountRetained_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(9).IsEmpty()) waste.WasteDisposalPort = row.Cell(9).GetString().ToUpper();
|
|
||||||
|
|
||||||
if (!row.Cell(10).IsEmpty()) o = row.Cell(10).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteAmountGeneratedTillNextPort_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
importWasteList.Add(waste);
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (importWasteList.Count > 0)
|
|
||||||
{
|
|
||||||
this.dataGridWaste.Items.Refresh();
|
|
||||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
|
||||||
MessageBox.Show(String.Format(Properties.Resources.textWasteImported, importWasteList.Count), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
||||||
<WebPage>publish.html</WebPage>
|
<WebPage>publish.html</WebPage>
|
||||||
<ApplicationRevision>2</ApplicationRevision>
|
<ApplicationRevision>2</ApplicationRevision>
|
||||||
<ApplicationVersion>7.2.13.2</ApplicationVersion>
|
<ApplicationVersion>7.2.14.2</ApplicationVersion>
|
||||||
<UseApplicationTrust>false</UseApplicationTrust>
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
<CreateDesktopShortcut>true</CreateDesktopShortcut>
|
<CreateDesktopShortcut>true</CreateDesktopShortcut>
|
||||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||||
|
|||||||
@ -9,6 +9,7 @@ using System.Globalization;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace ENI2.Excel
|
namespace ENI2.Excel
|
||||||
{
|
{
|
||||||
@ -22,6 +23,7 @@ namespace ENI2.Excel
|
|||||||
protected CountryMode _countryMode = CountryMode.DE;
|
protected CountryMode _countryMode = CountryMode.DE;
|
||||||
|
|
||||||
protected XLWorkbook _workBook;
|
protected XLWorkbook _workBook;
|
||||||
|
protected FileStream _workBookStream;
|
||||||
protected Dictionary<string, IXLDefinedName> _nameDict;
|
protected Dictionary<string, IXLDefinedName> _nameDict;
|
||||||
protected ILog _log;
|
protected ILog _log;
|
||||||
|
|
||||||
@ -101,6 +103,12 @@ namespace ENI2.Excel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void OpenWorkbookReadOnly(string path)
|
||||||
|
{
|
||||||
|
_workBookStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||||
|
_workBook = new XLWorkbook(_workBookStream);
|
||||||
|
}
|
||||||
|
|
||||||
private static double? ParseAnyDouble(string val)
|
private static double? ParseAnyDouble(string val)
|
||||||
{
|
{
|
||||||
double? result = null;
|
double? result = null;
|
||||||
@ -212,6 +220,11 @@ namespace ENI2.Excel
|
|||||||
_workBook.Dispose();
|
_workBook.Dispose();
|
||||||
_workBook = null;
|
_workBook = null;
|
||||||
}
|
}
|
||||||
|
if (_workBookStream != null)
|
||||||
|
{
|
||||||
|
_workBookStream.Dispose();
|
||||||
|
_workBookStream = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -222,4 +235,4 @@ namespace ENI2.Excel
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,7 +53,8 @@ namespace ENI2.Excel
|
|||||||
{
|
{
|
||||||
File.Copy(targetPath, comparisonFileName, true);
|
File.Copy(targetPath, comparisonFileName, true);
|
||||||
|
|
||||||
using (var sourceWorkbook = new XLWorkbook(sourcePath))
|
using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var sourceWorkbook = new XLWorkbook(sourceStream))
|
||||||
using (var comparisonWorkbook = new XLWorkbook(comparisonFileName))
|
using (var comparisonWorkbook = new XLWorkbook(comparisonFileName))
|
||||||
{
|
{
|
||||||
// Es werden Zellen der "used range" miteinander verglichen
|
// Es werden Zellen der "used range" miteinander verglichen
|
||||||
@ -76,6 +77,7 @@ namespace ENI2.Excel
|
|||||||
{
|
{
|
||||||
int maxRows = Math.Max(sourceRows, targetRows);
|
int maxRows = Math.Max(sourceRows, targetRows);
|
||||||
int maxCols = Math.Max(sourceCols, targetCols);
|
int maxCols = Math.Max(sourceCols, targetCols);
|
||||||
|
bool sheetHasDiffs = false;
|
||||||
|
|
||||||
for (int rowidx = 1; rowidx <= maxRows; rowidx++)
|
for (int rowidx = 1; rowidx <= maxRows; rowidx++)
|
||||||
{
|
{
|
||||||
@ -111,6 +113,7 @@ namespace ENI2.Excel
|
|||||||
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
||||||
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
||||||
counter++;
|
counter++;
|
||||||
|
sheetHasDiffs = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (targetText == null)
|
else if (targetText == null)
|
||||||
@ -120,6 +123,7 @@ namespace ENI2.Excel
|
|||||||
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
||||||
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
||||||
counter++;
|
counter++;
|
||||||
|
sheetHasDiffs = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((sourceText != null) && (targetText != null))
|
else if ((sourceText != null) && (targetText != null))
|
||||||
@ -129,10 +133,16 @@ namespace ENI2.Excel
|
|||||||
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
var cellToHighlight = targetSheet.Cell(rowidx, colidx);
|
||||||
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
cellToHighlight.Style.Fill.BackgroundColor = diffColor;
|
||||||
counter++;
|
counter++;
|
||||||
|
sheetHasDiffs = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sheetHasDiffs)
|
||||||
|
{
|
||||||
|
targetSheet.SetTabColor(diffColor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -152,4 +162,4 @@ namespace ENI2.Excel
|
|||||||
return comparisonFileName;
|
return comparisonFileName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ using Microsoft.Win32;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
|
||||||
namespace ENI2.Excel
|
namespace ENI2.Excel
|
||||||
@ -26,7 +27,8 @@ namespace ENI2.Excel
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1);
|
var worksheet = workbook.Worksheet(1);
|
||||||
var rows = worksheet.RangeUsed().RowsUsed();
|
var rows = worksheet.RangeUsed().RowsUsed();
|
||||||
@ -40,7 +42,7 @@ namespace ENI2.Excel
|
|||||||
|
|
||||||
List<LastTenPortFacilitiesCalled> importL10C = new List<LastTenPortFacilitiesCalled>();
|
List<LastTenPortFacilitiesCalled> importL10C = new List<LastTenPortFacilitiesCalled>();
|
||||||
|
|
||||||
|
|
||||||
foreach (var row in rows)
|
foreach (var row in rows)
|
||||||
{
|
{
|
||||||
if (cnt >= 10) break; // Maximum 10 rows
|
if (cnt >= 10) break; // Maximum 10 rows
|
||||||
@ -114,7 +116,7 @@ namespace ENI2.Excel
|
|||||||
{
|
{
|
||||||
throw new InvalidDataException($"Error processing row {row.RowNumber()}: {ex.Message}", ex);
|
throw new InvalidDataException($"Error processing row {row.RowNumber()}: {ex.Message}", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -144,7 +146,8 @@ namespace ENI2.Excel
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1);
|
var worksheet = workbook.Worksheet(1);
|
||||||
var rows = worksheet.RangeUsed().RowsUsed();
|
var rows = worksheet.RangeUsed().RowsUsed();
|
||||||
@ -227,7 +230,7 @@ namespace ENI2.Excel
|
|||||||
poc30.MDH = mdh;
|
poc30.MDH = mdh;
|
||||||
mdh.PortOfCallLast30Days.Add(poc30);
|
mdh.PortOfCallLast30Days.Add(poc30);
|
||||||
importPoC30.Add(poc30);
|
importPoC30.Add(poc30);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -242,5 +245,89 @@ namespace ENI2.Excel
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Waste from Excel
|
||||||
|
|
||||||
|
public static int ImportWaste(WAS was)
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
OpenFileDialog ofd = new OpenFileDialog();
|
||||||
|
ofd.Filter = "Excel Files|*.xls;*.xlsx";
|
||||||
|
if (ofd.ShowDialog() ?? false)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
|
{
|
||||||
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(3); // Skip first three rows
|
||||||
|
|
||||||
|
List<Waste> importWasteList = new List<Waste>();
|
||||||
|
|
||||||
|
object o = null;
|
||||||
|
|
||||||
|
// Diese Funktion kann das "alte" Sheet Format nicht mehr einlesen!
|
||||||
|
|
||||||
|
foreach (var row in rows)
|
||||||
|
{
|
||||||
|
if (cnt >= 35) break; // Maximum 35 rows
|
||||||
|
|
||||||
|
if (worksheet.RangeUsed().ColumnCount() < 9)
|
||||||
|
{
|
||||||
|
throw new InvalidDataException("Sheet must have 9 Columns of data");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!row.Cell(2).IsEmpty()) o = row.Cell(2).Value; else o = null;
|
||||||
|
if ((o != null) && Int32.TryParse(o.ToString(), out int wasteType))
|
||||||
|
{
|
||||||
|
Waste waste = was.GetWasteForType(wasteType);
|
||||||
|
if (waste == null)
|
||||||
|
{
|
||||||
|
waste = new Waste();
|
||||||
|
waste.WasteType = wasteType;
|
||||||
|
waste.WAS = was;
|
||||||
|
waste.IsDirty = true;
|
||||||
|
waste.Identifier = Waste.GetNewIdentifier(was.Waste);
|
||||||
|
was.Waste.Add(waste);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
waste.IsDirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!row.Cell(5).IsEmpty()) waste.WasteDescription = row.Cell(5).GetString();
|
||||||
|
if (waste.WasteDescription.IsNullOrEmpty())
|
||||||
|
waste.WasteDescription = "-";
|
||||||
|
|
||||||
|
if (!row.Cell(6).IsEmpty())
|
||||||
|
waste.WasteDisposalAmount_MTQ = row.Cell(6).GetDouble();
|
||||||
|
|
||||||
|
if (!row.Cell(7).IsEmpty())
|
||||||
|
waste.WasteCapacity_MTQ = row.Cell(7).GetDouble();
|
||||||
|
|
||||||
|
if (!row.Cell(8).IsEmpty()) waste.WasteAmountRetained_MTQ = row.Cell(8).GetDouble();
|
||||||
|
|
||||||
|
if (!row.Cell(9).IsEmpty())
|
||||||
|
waste.WasteDisposalPort = row.Cell(9).GetString().ToUpper();
|
||||||
|
|
||||||
|
if (!row.Cell(10).IsEmpty())
|
||||||
|
waste.WasteAmountGeneratedTillNextPort_MTQ = row.Cell(10).GetDouble();
|
||||||
|
|
||||||
|
importWasteList.Add(waste);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,7 @@ namespace ENI2.Excel
|
|||||||
|
|
||||||
public ExcelReader(string filePath, bool createNameFields = true)
|
public ExcelReader(string filePath, bool createNameFields = true)
|
||||||
{
|
{
|
||||||
this._workBook = new XLWorkbook(filePath);
|
this.OpenWorkbookReadOnly(filePath);
|
||||||
if (createNameFields)
|
if (createNameFields)
|
||||||
this.InitNameFields();
|
this.InitNameFields();
|
||||||
|
|
||||||
@ -793,4 +793,4 @@ namespace ENI2.Excel
|
|||||||
|
|
||||||
#endregion Dakosy-specific functions
|
#endregion Dakosy-specific functions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ namespace ENI2.Excel
|
|||||||
if (isRefSheet) filename = @"Excel\Reference_Sheet_DE.xlsx";
|
if (isRefSheet) filename = @"Excel\Reference_Sheet_DE.xlsx";
|
||||||
|
|
||||||
string refFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename);
|
string refFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename);
|
||||||
this._workBook = new XLWorkbook(refFilePath);
|
this.OpenWorkbookReadOnly(refFilePath);
|
||||||
|
|
||||||
this.InitNameFields();
|
this.InitNameFields();
|
||||||
}
|
}
|
||||||
@ -1426,4 +1426,4 @@ namespace ENI2.Excel
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -128,7 +128,8 @@ namespace ENI2.SheetDisplayControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
|
|||||||
@ -168,7 +168,8 @@ namespace ENI2.SheetDisplayControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
|
|||||||
@ -146,7 +146,8 @@ namespace ENI2.SheetDisplayControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
|
|||||||
@ -128,7 +128,8 @@ namespace ENI2.SheetDisplayControls
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||||
|
using (var workbook = new XLWorkbook(stream))
|
||||||
{
|
{
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
using bsmd.database;
|
using bsmd.database;
|
||||||
using ClosedXML.Excel;
|
using ClosedXML.Excel;
|
||||||
using ENI2.EditControls;
|
using ENI2.EditControls;
|
||||||
|
using ENI2.Excel;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -514,88 +515,14 @@ namespace ENI2.SheetDisplayControls
|
|||||||
|
|
||||||
private void buttonImportFromExcel_Click(object sender, RoutedEventArgs e)
|
private void buttonImportFromExcel_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
OpenFileDialog ofd = new OpenFileDialog();
|
int importWasteListCnt = ExcelLocalImportHelper.ImportWaste(_was);
|
||||||
ofd.Filter = "Excel Files|*.xls;*.xlsx";
|
|
||||||
if (ofd.ShowDialog() ?? false)
|
if (importWasteListCnt > 0)
|
||||||
{
|
{
|
||||||
try
|
this.dataGridWaste.Items.Refresh();
|
||||||
{
|
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||||
using (var workbook = new XLWorkbook(ofd.FileName))
|
MessageBox.Show(String.Format(Properties.Resources.textWasteImported, importWasteListCnt), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
{
|
}
|
||||||
var worksheet = workbook.Worksheet(1); // Get first worksheet
|
|
||||||
var rows = worksheet.RangeUsed().RowsUsed().Skip(3); // Skip first three rows
|
|
||||||
|
|
||||||
List<Waste> importWasteList = new List<Waste>();
|
|
||||||
|
|
||||||
int cnt = 0;
|
|
||||||
|
|
||||||
// Diese Funktion kann das "alte" Sheet Format nicht mehr einlesen!
|
|
||||||
|
|
||||||
foreach (var row in rows)
|
|
||||||
{
|
|
||||||
if (cnt >= 35) break; // Maximum 35 rows
|
|
||||||
|
|
||||||
if (worksheet.RangeUsed().ColumnCount() < 9)
|
|
||||||
{
|
|
||||||
throw new InvalidDataException("Sheet must have 9 Columns of data");
|
|
||||||
}
|
|
||||||
|
|
||||||
object o = null;
|
|
||||||
|
|
||||||
if (!row.Cell(2).IsEmpty()) o = row.Cell(2).Value; else o = null;
|
|
||||||
if ((o != null) && Int32.TryParse(o.ToString(), out int wasteType))
|
|
||||||
{
|
|
||||||
Waste waste = _was.GetWasteForType(wasteType);
|
|
||||||
if (waste == null)
|
|
||||||
{
|
|
||||||
waste = new Waste();
|
|
||||||
waste.WasteType = wasteType;
|
|
||||||
waste.WAS = this._was;
|
|
||||||
waste.IsDirty = true;
|
|
||||||
waste.Identifier = Waste.GetNewIdentifier(this._was.Waste);
|
|
||||||
this._was.Waste.Add(waste);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
waste.IsDirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!row.Cell(5).IsEmpty()) waste.WasteDescription = row.Cell(5).GetString();
|
|
||||||
if (waste.WasteDescription.IsNullOrEmpty())
|
|
||||||
waste.WasteDescription = "-";
|
|
||||||
|
|
||||||
if (!row.Cell(6).IsEmpty()) o = row.Cell(6).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteDisposalAmount_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(7).IsEmpty()) o = row.Cell(7).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteCapacity_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(8).IsEmpty()) o = row.Cell(8).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteAmountRetained_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
if (!row.Cell(9).IsEmpty()) waste.WasteDisposalPort = row.Cell(9).GetString().ToUpper();
|
|
||||||
|
|
||||||
if (!row.Cell(10).IsEmpty()) o = row.Cell(10).Value; else o = null;
|
|
||||||
if (o != null) waste.WasteAmountGeneratedTillNextPort_MTQ = Convert.ToDouble(o);
|
|
||||||
|
|
||||||
importWasteList.Add(waste);
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (importWasteList.Count > 0)
|
|
||||||
{
|
|
||||||
this.dataGridWaste.Items.Refresh();
|
|
||||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
|
||||||
MessageBox.Show(String.Format(Properties.Resources.textWasteImported, importWasteList.Count), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -36,7 +36,23 @@ namespace bsmd.ExcelReadService
|
|||||||
this._excelApp.DisplayAlerts = false;
|
this._excelApp.DisplayAlerts = false;
|
||||||
this._excelWorkbooks = _excelApp.Workbooks;
|
this._excelWorkbooks = _excelApp.Workbooks;
|
||||||
|
|
||||||
this._portcall = _excelWorkbooks.Open(filePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false);
|
this._portcall = _excelWorkbooks.Open(
|
||||||
|
filePath,
|
||||||
|
UpdateLinks: 0,
|
||||||
|
ReadOnly: true,
|
||||||
|
Format: 5,
|
||||||
|
Password: "",
|
||||||
|
WriteResPassword: "",
|
||||||
|
IgnoreReadOnlyRecommended: true,
|
||||||
|
Origin: XlPlatform.xlWindows,
|
||||||
|
Delimiter: "",
|
||||||
|
Editable: false,
|
||||||
|
Notify: false,
|
||||||
|
Converter: 0,
|
||||||
|
AddToMru: false,
|
||||||
|
Local: false,
|
||||||
|
CorruptLoad: false);
|
||||||
|
this._portcall.ChangeFileAccess(XlFileAccess.xlReadOnly);
|
||||||
_nameDict = new Dictionary<string, Name>();
|
_nameDict = new Dictionary<string, Name>();
|
||||||
int bookCnt = 0;
|
int bookCnt = 0;
|
||||||
foreach(Name name in _portcall.Names)
|
foreach(Name name in _portcall.Names)
|
||||||
|
|||||||
@ -431,11 +431,6 @@ 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
|
||||||
|
|||||||
@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
[assembly: AssemblyCompany("schick Informatik")]
|
[assembly: AssemblyCompany("schick Informatik")]
|
||||||
[assembly: AssemblyProduct("BSMD NSW interface")]
|
[assembly: AssemblyProduct("BSMD NSW interface")]
|
||||||
[assembly: AssemblyInformationalVersion("7.2.13")]
|
[assembly: AssemblyInformationalVersion("7.2.14")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2014-2025 schick Informatik")]
|
[assembly: AssemblyCopyright("Copyright © 2014-2025 schick Informatik")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
@ -1,4 +1,4 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("7.2.13.*")]
|
[assembly: AssemblyVersion("7.2.14.*")]
|
||||||
|
|
||||||
|
|||||||
@ -97,6 +97,22 @@ namespace bsmd.database
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region for extra waste validation
|
||||||
|
|
||||||
|
private static readonly HashSet<string> SpecialNextPortPrefixes = new HashSet<string>
|
||||||
|
{
|
||||||
|
"BE", "BG", "DK", "DE", "EE", "FI", "FR", "GR", "IR", "IT",
|
||||||
|
"HR", "LV", "LT", "LU", "MT", "NL", "AT", "PL", "PT", "RO",
|
||||||
|
"SE", "SK", "SL", "ES", "CZ", "HU", "CY", "NO", "IS", "GB", "GI"
|
||||||
|
};
|
||||||
|
|
||||||
|
private static readonly HashSet<string> SpecialNextPortExact = new HashSet<string>
|
||||||
|
{
|
||||||
|
"RUPRI", "RUULU", "RULED", "RUBLT", "RUKGD", "RUVYS"
|
||||||
|
};
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public enum LocodeMode
|
public enum LocodeMode
|
||||||
{
|
{
|
||||||
STANDARD,
|
STANDARD,
|
||||||
@ -131,6 +147,20 @@ namespace bsmd.database
|
|||||||
public static LocodeValidHandler LocodeChecker { get { return _locodeChecker; } }
|
public static LocodeValidHandler LocodeChecker { get { return _locodeChecker; } }
|
||||||
public static NationalityValidHandler NationalityChecker { get { return _nationalityChecker; } }
|
public static NationalityValidHandler NationalityChecker { get { return _nationalityChecker; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to test for special next port values for waste messages
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nextPort">a locode</param>
|
||||||
|
/// <returns>true if the next port is a special waste port</returns>
|
||||||
|
public static bool IsSpecialNextPort(string nextPort)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(nextPort) || nextPort.Length < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return SpecialNextPortExact.Contains(nextPort) ||
|
||||||
|
SpecialNextPortPrefixes.Contains(nextPort.Substring(0, 2));
|
||||||
|
}
|
||||||
|
|
||||||
#region public static property validation
|
#region public static property validation
|
||||||
|
|
||||||
public static void RegisterLocodeChecker(LocodeValidHandler handler) { _locodeChecker = handler; }
|
public static void RegisterLocodeChecker(LocodeValidHandler handler) { _locodeChecker = handler; }
|
||||||
|
|||||||
@ -266,11 +266,13 @@ namespace bsmd.database
|
|||||||
if (this.WasteAmountGeneratedTillNextPort_MTQ >= 10000)
|
if (this.WasteAmountGeneratedTillNextPort_MTQ >= 10000)
|
||||||
errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, "Waste generated till next port too high", null, this.Title, this.Identifier, this.Tablename));
|
errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, "Waste generated till next port too high", null, this.Title, this.Identifier, this.Tablename));
|
||||||
|
|
||||||
if(this.WasteDisposalAmount_MTQ > this.WasteCapacity_MTQ)
|
// Removed this for version 7.2.14 (new rules depending on next port implemented in ENI / DetailRootControl.cs)
|
||||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Disposal greater than capacity!", null, this.Title, this.Identifier, this.Tablename));
|
|
||||||
|
|
||||||
if((this.WasteAmountGeneratedTillNextPort_MTQ + this.WasteAmountRetained_MTQ) > this.WasteCapacity_MTQ)
|
// if(this.WasteDisposalAmount_MTQ > this.WasteCapacity_MTQ)
|
||||||
violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Waste generated+retained greater than capacity!", null, this.Title, this.Identifier, this.Tablename));
|
// violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Disposal greater than capacity!", null, this.Title, this.Identifier, this.Tablename));
|
||||||
|
|
||||||
|
// if((this.WasteAmountGeneratedTillNextPort_MTQ + this.WasteAmountRetained_MTQ) > this.WasteCapacity_MTQ)
|
||||||
|
// violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Waste generated+retained greater than capacity!", null, this.Title, this.Identifier, this.Tablename));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
BIN
misc/WAS-Regulation.docx
Normal file
BIN
misc/WAS-Regulation.docx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user