// 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.textBlockNumPasEntries.DataContext = 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 } }