635 lines
27 KiB
C#
635 lines
27 KiB
C#
// Copyright (c) 2017 / 2023 schick Informatik
|
|
// Description: Request dbh ids for Maersk data lists
|
|
//
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using Microsoft.Win32;
|
|
|
|
using bsmd.database;
|
|
using ExcelDataReader;
|
|
using System.Collections.ObjectModel;
|
|
using ENI2.Excel;
|
|
using ENI2.Locode;
|
|
using ENI2.Util;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace ENI2.Controls
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for MaerskListControl.xaml
|
|
/// </summary>
|
|
public partial class MaerskListControl : UserControl
|
|
{
|
|
|
|
#region Fields
|
|
|
|
private readonly ObservableCollection<MaerskData> maerskDataList = new ObservableCollection<MaerskData>();
|
|
private readonly DatabaseEntityWatchdog _dbWatchDog;
|
|
|
|
#endregion
|
|
|
|
#region Construction
|
|
|
|
public MaerskListControl()
|
|
{
|
|
InitializeComponent();
|
|
Loaded += POList_Loaded;
|
|
this.dateTimePickerFrom.SelectedDate = DateTime.Today.AddDays(-14);
|
|
this.dateTimePickerTo.SelectedDate = DateTime.Today.AddDays(14);
|
|
this._dbWatchDog = new DatabaseEntityWatchdog();
|
|
this._dbWatchDog.DatabaseEntityChanged += _dbWatchDog_DatabaseEntityChanged;
|
|
this._dbWatchDog.VisitTransitIdUpdated += _dbWatchDog_VisitTransitIdUpdated;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Events
|
|
|
|
public delegate void DateChanged(DateTime date);
|
|
|
|
public event DateChanged FromDateChanged;
|
|
|
|
public event DateChanged ToDateChanged;
|
|
|
|
#endregion
|
|
|
|
#region DB Watchdog
|
|
|
|
private async void _dbWatchDog_VisitTransitIdUpdated(DatabaseEntity entity)
|
|
{
|
|
if (entity is MessageCore core)
|
|
{
|
|
foreach (MaerskData md in this.maerskDataList)
|
|
{
|
|
if ((md.MessageCore != null) && (md.MessageCore.Id == core.Id))
|
|
{
|
|
md.MessageCore = core;
|
|
md.Status = MaerskData.MDStatus.ID;
|
|
md.ColM = core.VisitId;
|
|
if (core.PoC.Equals("DEBRE") && md.ColJ.Equals("MSK"))
|
|
core.Flags = 1;
|
|
if (core.PoC.Equals("DEWVN") && md.ColJ.Equals("MSK"))
|
|
core.Flags = 1;
|
|
if (core.PoC.Equals("DEBRE") && md.ColJ.Equals("SGL"))
|
|
core.Flags = 2;
|
|
if (core.PoC.Equals("DEWVN") && md.ColJ.Equals("SGL"))
|
|
core.Flags = 3;
|
|
await DBManagerAsync.SaveAsync(core);
|
|
await DBManagerAsync.SaveAsync(md);
|
|
_dbWatchDog.UnRegister(core);
|
|
this.Dispatcher.Invoke(() =>
|
|
{
|
|
this.dataGridPOCores.Items.Refresh();
|
|
if(_dbWatchDog.Idle)
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.NEUTRAL;
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void _dbWatchDog_DatabaseEntityChanged(DatabaseEntity entity)
|
|
{
|
|
if (entity is MessageCore core)
|
|
System.Diagnostics.Trace.WriteLine($"Core state changed to {core.BSMDStatusInternal}");
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
/// <summary>
|
|
/// Locode of the port that is concerned by this import list. Is to be set in the surrounding container:
|
|
/// </summary>
|
|
public string PortLocode { get; set; }
|
|
|
|
/// <summary>
|
|
/// synchronize selection props
|
|
/// </summary>
|
|
public DateTime? FromDate {
|
|
get { return this.dateTimePickerFrom.SelectedDate; }
|
|
set { this.dateTimePickerFrom.SelectedDate = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// synchronize selection props
|
|
/// </summary>
|
|
public DateTime? ToDate
|
|
{
|
|
get { return this.dateTimePickerTo.SelectedDate; }
|
|
set { this.dateTimePickerTo.SelectedDate = value; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region events
|
|
|
|
public event MessageCore.MessageCoreSelectedHandler MessageCoreSelected;
|
|
|
|
#endregion
|
|
|
|
#region control event handler
|
|
|
|
private void POList_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
dataGridPOCores.ItemsSource = maerskDataList;
|
|
}
|
|
|
|
private async void dataGridPOCores_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
|
|
{
|
|
|
|
if (e.EditAction == DataGridEditAction.Commit)
|
|
{
|
|
if (e.Column == gridColumnRemark)
|
|
{
|
|
MaerskData maerskData = this.maerskDataList[e.Row.GetIndex()];
|
|
|
|
var el = e.EditingElement as System.Windows.Controls.TextBox;
|
|
if (el.Text.Length > 100)
|
|
{
|
|
el.Text = el.Text.Trim().Substring(0, 100);
|
|
}
|
|
maerskData.Remark = el.Text;
|
|
|
|
if (maerskData.MessageCore != null)
|
|
await DBManagerAsync.SaveAsync(maerskData);
|
|
}
|
|
/*
|
|
if(e.Column == gridColumnGroup)
|
|
{
|
|
var el = e.EditingElement as ComboBox;
|
|
DictionaryEntry selectedItem = (DictionaryEntry) el.SelectedItem;
|
|
MessageCore.CoreFlags coreFlag = (MessageCore.CoreFlags) Enum.Parse(typeof(MessageCore.CoreFlags), selectedItem.Value.ToString());
|
|
MessageCore editedCore = this.filteredResult[e.Row.GetIndex()];
|
|
// clear all first
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.MAERSK_BHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_BHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_WHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.HOEGH);
|
|
if (coreFlag != MessageCore.CoreFlags.NONE)
|
|
{
|
|
editedCore.SetFlag(true, coreFlag);
|
|
}
|
|
// buttonSaveChanges.IsEnabled = true;
|
|
editedCore.IsDirty = true;
|
|
}
|
|
if(e.Column == gridColumnATA)
|
|
{
|
|
var el = e.EditingElement as System.Windows.Controls.TextBox;
|
|
if(DateTime.TryParse(el.Text, out DateTime localATA))
|
|
{
|
|
MessageCore editedCore = this.filteredResult[e.Row.GetIndex()];
|
|
editedCore.ATA = DateTime.SpecifyKind(localATA, DateTimeKind.Local).ToUniversalTime();
|
|
// buttonSaveChanges.IsEnabled = true;
|
|
editedCore.IsDirty = true;
|
|
}
|
|
else
|
|
{
|
|
el.Text = string.Empty;
|
|
e.Cancel = true;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region private methods
|
|
|
|
/// <summary>
|
|
/// "Status" of a Maersk Data element is a momentary evaluation that is relevant for display purposes only
|
|
/// It is not saved
|
|
/// </summary>
|
|
private void UpdateStatus(MaerskData md)
|
|
{
|
|
// here we set the following: NO_ID, NO_ID_AND_DUE, ID, NO_ETA and DONE
|
|
// the other status are set during active processing
|
|
if(md.ETA.HasValue)
|
|
{
|
|
if((md.ETA.Value - DateTime.Now).TotalSeconds > 0) // future
|
|
{
|
|
if(!md.ColM.IsNullOrEmpty() || ((md.MessageCore != null) && (!md.MessageCore.VisitId.IsNullOrEmpty())))
|
|
{
|
|
md.Status = MaerskData.MDStatus.ID;
|
|
}
|
|
else
|
|
{
|
|
if(md.ETA.Value.IsNextXDays(4))
|
|
{
|
|
md.Status = MaerskData.MDStatus.NO_ID_AND_DUE;
|
|
}
|
|
else
|
|
{
|
|
md.Status = MaerskData.MDStatus.NO_ID;
|
|
}
|
|
}
|
|
|
|
}
|
|
else // past
|
|
{
|
|
md.Status = MaerskData.MDStatus.DONE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// no ETA means done
|
|
md.Status = MaerskData.MDStatus.NO_ETA;
|
|
}
|
|
|
|
// if there is an declaration and it has been cancelled.. override the state to CANCELLED
|
|
if (md.MessageCore != null && (md.MessageCore.Cancelled ?? false))
|
|
md.Status = MaerskData.MDStatus.CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
private async void PerformSearch()
|
|
{
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.BUSY;
|
|
Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>();
|
|
|
|
// Die Suche findet in dem eingestellten Intervall statt
|
|
uint from = this.dateTimePickerFrom.SelectedDate.Value.ToUniversalTime().ToUnixTimeStamp();
|
|
DateTime toDate = this.dateTimePickerTo.SelectedDate.Value.ToUniversalTime().Add(new TimeSpan(23, 59, 59));
|
|
uint to = toDate.ToUnixTimeStamp();
|
|
filterDict.Add(MessageCore.SearchFilterType.FILTER_ETA, string.Format("{0}:{1}", from.ToString() ?? "", to.ToString() ?? ""));
|
|
|
|
// suche auslösen
|
|
List<MessageCore> searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict);
|
|
|
|
// alle anderen Häfen weg
|
|
searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals(PortLocode)));
|
|
|
|
// alles entfernen was keine Maersk Xtra-Data hat (=noch nicht schon einmal importiert wurde)
|
|
foreach(MessageCore core in searchResult)
|
|
{
|
|
MaerskData md = await DBManagerAsync.LoadMaerskDataForCoreAsync(core.Id.Value);
|
|
if(md != null)
|
|
{
|
|
md.MessageCore = core;
|
|
md.MessageCoreId = core.Id.Value;
|
|
this.UpdateStatus(md);
|
|
if (!maerskDataList.Contains(md)) // DatabaseEntity implements IEquatable
|
|
{
|
|
this.maerskDataList.Add(md);
|
|
if(!core.VisitId.IsNullOrEmpty() && md.ColM.IsNullOrEmpty())
|
|
{
|
|
md.ColM = core.VisitId; // this can happen if client is closed before an Id has been returned, so we have to manually set it here
|
|
Task<int> saveResult = DBManagerAsync.SaveAsync(md); // actually we do not need to await this
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.TimeFilterItemSource();
|
|
|
|
this.dataGridPOCores.SelectedItem = null;
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.NEUTRAL;
|
|
}
|
|
|
|
private void TimeFilterItemSource()
|
|
{
|
|
List<MaerskData> removeList = new List<MaerskData>();
|
|
foreach (MaerskData md in this.maerskDataList)
|
|
{
|
|
if (md.ETA.HasValue)
|
|
{
|
|
if (this.dateTimePickerFrom.SelectedDate.HasValue && (md.ETA.Value < this.dateTimePickerFrom.SelectedDate.Value))
|
|
removeList.Add(md);
|
|
|
|
if (this.dateTimePickerTo.SelectedDate.HasValue) {
|
|
|
|
DateTime toDate = this.dateTimePickerTo.SelectedDate.Value.ToUniversalTime().Add(new TimeSpan(23, 59, 59));
|
|
if(md.ETA.Value > toDate)
|
|
removeList.Add(md);
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (MaerskData md in removeList)
|
|
this.maerskDataList.Remove(md);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region button event handler
|
|
|
|
private void buttonLoad_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Util.UIHelper.SetBusyState();
|
|
this.PerformSearch();
|
|
}
|
|
|
|
private async void buttonImport_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
OpenFileDialog ofd = new OpenFileDialog
|
|
{
|
|
Filter = "Excel Files|*.xls;*.xlsx"
|
|
};
|
|
if (ofd.ShowDialog() ?? false)
|
|
{
|
|
FileStream stream;
|
|
try
|
|
{
|
|
stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
return;
|
|
}
|
|
|
|
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
|
|
{
|
|
List<MaerskData> importData = new List<MaerskData>();
|
|
|
|
bool isFirstRow = true;
|
|
int currentRow = 0;
|
|
bool imosAreOkay = true;
|
|
|
|
try
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
currentRow++;
|
|
|
|
if (isFirstRow)
|
|
{
|
|
isFirstRow = false; // this must be a header row, skip
|
|
continue;
|
|
}
|
|
|
|
if (reader.FieldCount < 13)
|
|
{
|
|
throw new InvalidDataException("Sheet must have 13 columns of data");
|
|
}
|
|
|
|
MaerskData md = new MaerskData();
|
|
if (!reader.IsDBNull(0))
|
|
{
|
|
if (reader.GetFieldType(0) == typeof(DateTime))
|
|
{
|
|
md.ETA = reader.GetDateTime(0);
|
|
md.ColA = md.ETA.ToString();
|
|
}
|
|
else
|
|
{
|
|
md.ColA = reader.GetString(0);
|
|
if (DateTime.TryParse(md.ColA, out DateTime aDateTime))
|
|
md.ETA = aDateTime;
|
|
}
|
|
}
|
|
if (!reader.IsDBNull(1)) md.ColB = reader.ReadAsString(1);
|
|
if (!reader.IsDBNull(2)) md.ColC = reader.ReadAsString(2);
|
|
if (!reader.IsDBNull(3)) md.ColD = reader.ReadAsString(3);
|
|
if (!reader.IsDBNull(4)) md.ColE = reader.ReadAsString(4);
|
|
if (!reader.IsDBNull(5)) md.ColF = reader.ReadAsString(5);
|
|
if (!reader.IsDBNull(6)) md.ColG = reader.ReadAsString(6);
|
|
if (!reader.IsDBNull(7)) md.ColH = reader.ReadAsString(7);
|
|
if (!reader.IsDBNull(8)) md.ColI = reader.ReadAsString(8);
|
|
if (md.ColI != null)
|
|
{
|
|
if ((md.ColI.Contains("bremerhaven", StringComparison.OrdinalIgnoreCase) && this.PortLocode.Equals("DEWVN")) ||
|
|
(md.ColI.Contains("eurogate", StringComparison.OrdinalIgnoreCase) && this.PortLocode.Equals("DEBRV")))
|
|
throw new InvalidOperationException($"{md.ColI} found in import to {PortLocode}, this is probably an error. Aborting import");
|
|
}
|
|
if (!reader.IsDBNull(9)) md.ColJ = reader.ReadAsString(9);
|
|
if (md.ColJ == null) continue;
|
|
if (!(md.ColJ.Equals("msk", StringComparison.OrdinalIgnoreCase) || md.ColJ.Equals("sgl", StringComparison.OrdinalIgnoreCase))) continue; // skip operator we are not interested in
|
|
if (!reader.IsDBNull(10)) md.ColK = reader.ReadAsString(10);
|
|
if (!reader.IsDBNull(11)) md.ColL = reader.ReadAsString(11);
|
|
if (!reader.IsDBNull(12)) md.ColM = reader.ReadAsString(12);
|
|
if (!reader.IsDBNull(13)) md.Remark = reader.ReadAsString(13);
|
|
|
|
if(!md.ColF.IsNullOrEmpty())
|
|
{
|
|
if (Int32.TryParse(md.ColF, out int imo))
|
|
{
|
|
if ((imo < 1000000) || (imo > 9999999))
|
|
{
|
|
imosAreOkay = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
imosAreOkay = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
imosAreOkay = false;
|
|
}
|
|
|
|
if (!imosAreOkay)
|
|
{
|
|
MessageBox.Show($"Invalid IMO in row {currentRow}, aborting import", Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
break;
|
|
}
|
|
|
|
importData.Add(md);
|
|
|
|
if (isFirstRow) isFirstRow = false;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
|
|
if (imosAreOkay && importData.Count > 0)
|
|
{
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.BUSY;
|
|
|
|
foreach (MaerskData md in importData)
|
|
{
|
|
if (this.maerskDataList.Contains(md))
|
|
{
|
|
// update record with imported record
|
|
MaerskData foundData = this.maerskDataList.First((m) => (m.ColF != null) ? m.ColF.Equals(md.ColF) : (md.ColF == null) &&
|
|
(m.ColG != null) ? m.ColG.Equals(md.ColG) : (md.ColG == null) &&
|
|
(m.ColH != null) ? m.ColH.Equals(md.ColH) : (md.ColH == null));
|
|
|
|
if ((foundData.MessageCore == null) || !(foundData.MessageCore.Cancelled ?? false))
|
|
{
|
|
if (foundData.ETA.HasValue && ((foundData.ETA.Value - DateTime.Now).TotalSeconds > 0) && foundData.Update(md))
|
|
foundData.Status = MaerskData.MDStatus.UPDATED;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!md.ColM.IsNullOrEmpty())
|
|
{
|
|
md.MessageCore = await DBManagerAsync.LoadCoreByVisitIdAsync(md.ColM);
|
|
if (md.MessageCore != null)
|
|
{
|
|
MaerskData existingMD = await DBManagerAsync.LoadMaerskDataForCoreAsync(md.MessageCore.Id.Value);
|
|
if(existingMD == null)
|
|
{
|
|
// we have a core but no MarskData for this import -> save it
|
|
md.MessageCoreId = (Guid) md.MessageCore.Id;
|
|
_ = DBManagerAsync.SaveAsync(md);
|
|
}
|
|
else
|
|
{
|
|
existingMD.Update(md);
|
|
_ = DBManagerAsync.SaveAsync(existingMD);
|
|
this.UpdateStatus(existingMD);
|
|
maerskDataList.Add(existingMD);
|
|
continue; // add existing instead of new one
|
|
}
|
|
}
|
|
}
|
|
|
|
this.UpdateStatus(md);
|
|
maerskDataList.Add(md);
|
|
}
|
|
}
|
|
this.TimeFilterItemSource();
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.NEUTRAL;
|
|
|
|
this.dataGridPOCores.Items.Refresh();
|
|
}
|
|
}
|
|
|
|
stream.Close();
|
|
}
|
|
}
|
|
|
|
private void buttonExport_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
// Export of the current collection
|
|
string predefFilename = string.Format("{0}_{1}.xlsx", this.PortLocode, DateTime.Today.ToString("yyyyMMdd"));
|
|
SaveFileDialog sfd = new SaveFileDialog()
|
|
{
|
|
Filter = "Excel Files|*.xlsx;*.xls",
|
|
FileName = predefFilename
|
|
};
|
|
if(sfd.ShowDialog() ?? false)
|
|
{
|
|
Util.UIHelper.SetBusyState();
|
|
ExcelManager em = new ExcelManager();
|
|
try
|
|
{
|
|
List<MaerskData> exportList = new List<MaerskData>(this.maerskDataList);
|
|
em.ExportMaersk(exportList, sfd.FileName);
|
|
Process.Start(sfd.FileName);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Export failed", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
private async void buttonRequestIds_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
// find all entries from now until 4 days into the future and track parallel requests
|
|
List<MaerskData> requestList = new List<MaerskData>();
|
|
if (sender == this.buttonRequestIds)
|
|
{
|
|
foreach (MaerskData md in this.dataGridPOCores.SelectedItems)
|
|
{
|
|
if (md.MessageCore?.VisitId.IsNullOrEmpty() == false) continue; // already requested
|
|
if (md.ColM?.IsNullOrEmpty() == false) continue; // already something there
|
|
requestList.Add(md);
|
|
}
|
|
}
|
|
if(sender == this.buttonRequestPlus3)
|
|
{
|
|
foreach(MaerskData md in this.maerskDataList)
|
|
{
|
|
if(((md.MessageCore == null) && md.ColM.IsNullOrEmpty()) ||
|
|
((md.MessageCore != null) && md.MessageCore.VisitId.IsNullOrEmpty()))
|
|
{
|
|
if (md.ETA.HasValue && md.ETA.Value.IsNextXDays(4))
|
|
requestList.Add(md);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(requestList.Count == 0)
|
|
{
|
|
MessageBox.Show("No valid rows selected", "Warning", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|
}
|
|
else
|
|
{
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.BUSY;
|
|
|
|
foreach (MaerskData md in requestList)
|
|
{
|
|
md.Status = MaerskData.MDStatus.REQUESTING_ID;
|
|
|
|
// create MessageCore and message classes
|
|
md.MessageCore = new MessageCore();
|
|
md.MessageCore.InitialHIS = Message.NSWProvider.DBH_MAERSK;
|
|
md.MessageCore.IMO = md.ColF;
|
|
md.MessageCore.ETA = md.ETA;
|
|
md.MessageCore.IsTransit = false;
|
|
md.MessageCore.PoC = this.PortLocode;
|
|
md.MessageCore.Portname = LocodeDB.PortNameFromLocode(md.MessageCore.PoC);
|
|
md.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.TOSEND;
|
|
md.MessageCore.Incoming = true;
|
|
md.MessageCore.DefaultReportingPartyId = App.UserId.Value;
|
|
await DBManagerAsync.SaveAsync(md.MessageCore);
|
|
md.MessageCoreId = md.MessageCore.Id.Value;
|
|
await DBManagerAsync.SaveAsync(md);
|
|
|
|
// Meldeklassen für neuen Anlauf erzeugen
|
|
// TODO: pre-set certain fields taken from Maersk data
|
|
await bsmd.database.Util.CreateMessagesForCoreAsync(md.MessageCore, null);
|
|
|
|
// watchdog registrieren
|
|
this._dbWatchDog.Register(md.MessageCore);
|
|
}
|
|
}
|
|
this.dataGridPOCores.Items.Refresh();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region grid event handler
|
|
|
|
private void dataGridPOCores_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
|
|
{
|
|
if (sender != null)
|
|
{
|
|
DataGrid grid = sender as DataGrid;
|
|
if (grid?.SelectedItems?.Count == 1)
|
|
{
|
|
MaerskData md = grid.SelectedItem as MaerskData;
|
|
if(md.MessageCore != null) {
|
|
Util.UIHelper.SetBusyState();
|
|
this.MessageCoreSelected?.Invoke(md.MessageCore, DBManager.Instance.GetReportingPartyDict()[App.UserId.Value].ShipcallDisplayMode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DateTime picker event handler
|
|
|
|
private void dateTimePickerFrom_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
|
|
if (sender == dateTimePickerFrom)
|
|
this.FromDateChanged?.Invoke(dateTimePickerFrom.SelectedDate.Value);
|
|
|
|
if (sender == dateTimePickerTo)
|
|
this.ToDateChanged?.Invoke(dateTimePickerTo.SelectedDate.Value);
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|