// Copyright (c) 2025 - schick Informatik
// Description: Display control of formsheet Tab 8. Pas data arrival
//
//
using bsmd.database;
using ENI2.EditControls;
using ENI2.Locode;
using ENI2.Util;
using ExcelDataReader;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace ENI2.SheetDisplayControls
{
///
/// Interaction logic for PassengerPreArrivalControl.xaml
///
public partial class PassengerPreArrivalControl : DetailBaseControl
{
#region Fields
private Message _pasMessage;
private Message _pasdMessage;
#endregion
#region Construction
public PassengerPreArrivalControl()
{
InitializeComponent();
}
#endregion
#region public overrides
public override void Initialize()
{
base.Initialize();
foreach (Message aMessage in this.Messages)
{
if (aMessage.MessageNotificationClass == Message.NotificationClass.PASA) { this._pasMessage = aMessage; this.ControlMessages.Add(aMessage); }
if (aMessage.MessageNotificationClass == Message.NotificationClass.PASD) { this._pasdMessage = aMessage; this.ControlMessages.Add(aMessage); }
}
#region init PASA
if (this._pasMessage == null)
{
this._pasMessage = this.Core.CreateMessage(Message.NotificationClass.PASA);
this.Messages.Add(this._pasMessage);
}
this.dataGridPassengerList.Initialize();
this.dataGridPassengerList.ItemsSource = this._pasMessage.Elements;
this.dataGridPassengerList.AddingNewItem += DataGridPassengerList_AddingNewItem;
this.dataGridPassengerList.EditRequested += DataGridPassengerList_EditRequested;
this.dataGridPassengerList.DeleteRequested += DataGridPassengerList_DeleteRequested;
this.dataGridPassengerList.CreateRequested += DataGridPassengerList_CreateRequested;
this.dataGridPassengerList.RefreshGrid += DataGridPassengerList_RefreshGrid;
this.dataGridPassengerList.MultiEditRequested += DataGridPassengerList_MultiEditRequested;
if (this._pasMessage.Elements.Count > 0)
{
this.checkBoxPasNotificationSchengen.IsChecked = ((PAS)this._pasMessage.Elements[0]).NotificationSchengen;
this.checkBoxPasNotificationPAX.IsChecked = ((PAS)this._pasMessage.Elements[0]).NotificationPAX;
}
// extra menu copy to PASD
{
this.dataGridPassengerList.ContextMenu.Items.Add(new Separator());
MenuItem copyPASAItem = new MenuItem();
copyPASAItem.Header = Properties.Resources.textCopyToPASD;
copyPASAItem.Icon = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/documents.png")) };
copyPASAItem.Click += CopyPASAItem_Click; ;
this.dataGridPassengerList.ContextMenu.Items.Add(copyPASAItem);
}
#endregion
}
public override void SetEnabled(bool enabled)
{
base.SetEnabled(enabled);
this.passengerArrivalGroupBox.IsEnabled = enabled;
}
#endregion
#region event handler
private void CopyPASAItem_Click(object sender, RoutedEventArgs e)
{
if (this.dataGridPassengerList.SelectedItems != null)
{
foreach (PAS pasa in this.dataGridPassengerList.SelectedItems)
{
PASD pasd = new PASD();
pasd.MessageHeader = this._pasdMessage;
pasd.CopyFromPAS(pasa);
pasd.IsDeparture = true;
pasd.Identifier = DatabaseEntity.GetNewIdentifier(this._pasdMessage.Elements);
this._pasdMessage.Elements.Add(pasd);
this.SublistElementChanged(Message.NotificationClass.PASD);
}
}
}
private void buttonImportExcelPassenger_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);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
List importPassenger = new List();
try
{
do
{
while (reader.Read())
{
if (((IExcelDataReader)reader).FieldCount < 17)
{
throw new InvalidDataException("Sheet must have 17 columns of data");
}
PAS pas = new PAS();
if (reader.IsDBNull(0) && reader.IsDBNull(1)) continue;
if (!reader.IsDBNull(0)) pas.PassengerLastName = reader.GetValue(0).ToString().Clean();
if (pas.PassengerLastName.Equals("Family Name") || (pas.PassengerLastName.Trim().Length == 0)) continue;
if (!reader.IsDBNull(1)) pas.PassengerFirstName = reader.GetValue(1).ToString().Clean();
if (!reader.IsDBNull(2)) pas.PassengerGender = GlobalStructures.ParseGender(reader.GetString(2));
if (!reader.IsDBNull(3)) pas.PassengerPortOfEmbarkation = reader.GetString(3).Clean();
if (LocodeDB.PortNameFromLocode(pas.PassengerPortOfEmbarkation) == null)
pas.PassengerPortOfEmbarkation = null;
if (!reader.IsDBNull(4)) pas.PassengerPortOfDisembarkation = reader.GetString(4).Clean();
if (LocodeDB.PortNameFromLocode(pas.PassengerPortOfDisembarkation) == null)
pas.PassengerPortOfDisembarkation = null;
if (!reader.IsDBNull(5)) pas.PassengerInTransit = GlobalStructures.ReadBoolean(reader.GetString(5));
if (!reader.IsDBNull(6)) pas.PassengerNationality = reader.GetString(6).Substring(0, 2).ToUpper();
if (!reader.IsDBNull(7)) pas.PassengerPlaceOfBirth = reader.GetString(7).Clean();
if (!reader.IsDBNull(8)) pas.PassengerCountryOfBirth = reader.GetString(8).Substring(0, 2).ToUpper().Clean();
if (!reader.IsDBNull(9)) pas.PassengerDateOfBirth = reader.GetDateTime(9);
if (!reader.IsDBNull(10)) pas.PassengerIdentityDocumentType = GlobalStructures.ReadIdentityDocumentType(reader.GetString(10));
if (!reader.IsDBNull(11)) pas.PassengerIdentityDocumentId = reader.ReadAsString(11).Clean();
if (!reader.IsDBNull(12)) pas.PassengerIdentityDocumentIssuingState = reader.GetString(12).Substring(0, 2).ToUpper();
if (!reader.IsDBNull(13)) pas.PassengerIdentityDocumentExpiryDate = reader.GetDateTime(13);
if (!reader.IsDBNull(14)) pas.PassengerVisaNumber = reader.ReadAsString(14).Clean();
if (!reader.IsDBNull(15)) pas.EmergencyCare = reader.GetString(15).Clean();
if (!reader.IsDBNull(16)) pas.EmergencyContactNumber = reader.ReadAsString(16).Clean();
pas.MessageHeader = this._pasMessage;
pas.IsDirty = true;
pas.Identifier = PAS.GetNewIdentifier(this._pasMessage.Elements);
this._pasMessage.Elements.Add(pas);
importPassenger.Add(pas);
}
} while (reader.NextResult());
}
catch (Exception ex)
{
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
}
if (importPassenger.Count > 0)
{
this.dataGridPassengerList.Items.Refresh();
this.SublistElementChanged(Message.NotificationClass.PASA);
MessageBox.Show(String.Format(Properties.Resources.textPassengerImported, importPassenger.Count), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
stream.Close();
}
}
private void checkBoxPasNotificationSchengen_Click(object sender, RoutedEventArgs e)
{
foreach (PAS pas in _pasMessage.Elements.Cast())
{
pas.NotificationSchengen = checkBoxPasNotificationSchengen.IsChecked;
}
this.SublistElementChanged(Message.NotificationClass.PASA);
}
private void checkBoxPasNotificationPAX_Click(object sender, RoutedEventArgs e)
{
foreach (PAS pas in _pasMessage.Elements.Cast())
{
pas.NotificationPAX = checkBoxPasNotificationPAX.IsChecked;
}
this.SublistElementChanged(Message.NotificationClass.PASA);
}
private async void buttonDeleteAllPasA_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show(Properties.Resources.textConfimDeleteAllEntries, Properties.Resources.textConfirmation, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes)
{
foreach (PAS pasa in this._pasMessage.Elements.Cast())
{
await DBManagerAsync.DeleteAsync(pasa);
}
this._pasMessage.Elements.Clear();
this.dataGridPassengerList.Items.Refresh();
this.SublistElementChanged(Message.NotificationClass.PASA);
}
}
#endregion
#region passenger grid arrival
private void DataGridPassengerList_CreateRequested()
{
EditPASDialog epd = new EditPASDialog
{
PAS = new PAS()
};
epd.PAS.Identifier = PAS.GetNewIdentifier(_pasMessage.Elements);
epd.PAS.MessageHeader = this._pasMessage;
epd.AddClicked += () =>
{
epd.CopyValuesToEntity();
if (!this._pasMessage.Elements.Contains(epd.PAS))
{
this._pasMessage.Elements.Add(epd.PAS);
this.CheckPASA();
}
this.dataGridPassengerList.Items.Refresh();
epd.PAS = new PAS
{
MessageHeader = this._pasMessage,
Identifier = PAS.GetNewIdentifier(_pasMessage.Elements)
};
this.SublistElementChanged(Message.NotificationClass.PASA);
};
if (epd.ShowDialog() ?? false)
{
if (!this._pasMessage.Elements.Contains(epd.PAS))
{
_pasMessage.Elements.Add(epd.PAS);
this.CheckPASA();
}
this.dataGridPassengerList.Items.Refresh();
this.SublistElementChanged(Message.NotificationClass.PASA);
}
}
private void DataGridPassengerList_DeleteRequested(DatabaseEntity obj)
{
if (obj is PAS pas)
{
// are you sure dialog is in base class
_pasMessage.Elements.Remove(pas);
DBManager.Instance.Delete(pas);
}
}
private void DataGridPassengerList_RefreshGrid()
{
DatabaseEntity.ResetIdentifiers(_pasMessage.Elements);
this.SublistElementChanged(Message.NotificationClass.PASA);
this.dataGridPassengerList.Items.Refresh();
}
private void DataGridPassengerList_EditRequested(DatabaseEntity obj)
{
EditPASDialog epd = new EditPASDialog
{
PAS = obj as PAS
};
epd.AddClicked += () =>
{
epd.CopyValuesToEntity();
if (!_pasMessage.Elements.Contains(epd.PAS))
{
_pasMessage.Elements.Add(epd.PAS);
this.CheckPASA();
}
this.dataGridPassengerList.Items.Refresh();
epd.PAS = new PAS
{
Identifier = PAS.GetNewIdentifier(_pasMessage.Elements),
MessageHeader = _pasMessage
};
this.SublistElementChanged(Message.NotificationClass.PASA);
};
if (epd.ShowDialog() ?? false)
{
if (!_pasMessage.Elements.Contains(epd.PAS))
{
_pasMessage.Elements.Add(epd.PAS);
this.CheckPASA();
}
epd.PAS.IsDirty = true;
this.dataGridPassengerList.Items.Refresh();
this.SublistElementChanged(Message.NotificationClass.PASA);
}
}
private void DataGridPassengerList_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
this.DataGridPassengerList_CreateRequested();
}
private void DataGridPassengerList_MultiEditRequested(List databaseEntities)
{
List pasList = new List();
foreach (PAS apas in databaseEntities.Cast())
pasList.Add(apas);
// write common values of all PAS entities to template entity
PAS pas = PAS.CreateCommon(pasList);
EditPASDialog dialog = new EditPASDialog();
dialog.PAS = pas;
dialog.AddVisible = false;
if (dialog.ShowDialog() ?? false)
{
// write back changed values from pas to all entities and mark them as changed
PAS.WriteTemplateToList(pas, pasList);
this.SublistElementChanged(Message.NotificationClass.PASA);
this.dataGridPassengerList.Items.Refresh();
}
}
#endregion
#region private methods
private void CheckPASA()
{
if (this._pasMessage.Elements.Count == 0) return;
PAS firstPAS = this._pasMessage.Elements[0] as PAS;
if (this._pasMessage.Elements.Count == 1)
{
firstPAS.NotificationSchengen = true;
this.checkBoxPasNotificationSchengen.IsChecked = true;
}
else
{
for (int i = 1; i < this._pasMessage.Elements.Count; i++)
{
((PAS)this._pasMessage.Elements[i]).NotificationSchengen = firstPAS.NotificationSchengen;
}
}
}
#endregion
}
}