// Copyright (c) 2025 - schick Informatik // Description: Display control of formsheet Tab 6. Crew data arrival // using bsmd.database; using ENI2.EditControls; 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 CrewPreArrivalControl.xaml /// public partial class CrewPreArrivalControl : DetailBaseControl { #region Fields private NAME _name; private Message _crewaMessage; private Message _crewdMessage; #endregion #region Construction public CrewPreArrivalControl() { InitializeComponent(); this.Loaded += CrewPreArrivalControl_Loaded; } #endregion #region public override public override void Initialize() { base.Initialize(); foreach (Message aMessage in this.Messages) { if (aMessage.MessageNotificationClass == Message.NotificationClass.NAME) { this._name = aMessage.Elements[0] as NAME; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.CREWA) { this._crewaMessage = aMessage; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.CREWD) { this._crewdMessage = aMessage; this.ControlMessages.Add(aMessage); } } this.textBox_NameMaster.DataContext = _name; #region init CREWA if (this._crewaMessage == null) { this._crewaMessage = this.Core.CreateMessage(Message.NotificationClass.CREWA); this.Messages.Add(this._crewaMessage); } this.dataGridCrewList.Initialize(); this.dataGridCrewList.ItemsSource = this._crewaMessage.Elements; this.dataGridCrewList.AddingNewItem += DataGridCrewList_AddingNewItem; this.dataGridCrewList.EditRequested += DataGridCrewList_EditRequested; this.dataGridCrewList.DeleteRequested += DataGridCrewList_DeleteRequested; this.dataGridCrewList.CreateRequested += DataGridCrewList_CreateRequested; this.dataGridCrewList.RefreshGrid += DataGridCrewList_RefreshGrid; this.dataGridCrewList.MultiEditRequested += DataGridCrewList_MultiEditRequested; if (this._crewaMessage.Elements.Count > 0) { this.checkBoxCrewNotificationSchengen.IsChecked = ((CREW)this._crewaMessage.Elements[0]).NotificationSchengen; this.checkBoxCrewNotificationPAX.IsChecked = ((CREW)this._crewaMessage.Elements[0]).NotificationPAX; } // extra menu copy to CREWD { this.dataGridCrewList.ContextMenu.Items.Add(new Separator()); MenuItem copyCREWAItem = new MenuItem(); copyCREWAItem.Header = Properties.Resources.textCopyToCREWD; copyCREWAItem.Icon = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/documents.png")) }; copyCREWAItem.Click += CopyCREWAItem_Click; this.dataGridCrewList.ContextMenu.Items.Add(copyCREWAItem); } #endregion } public override void SetEnabled(bool enabled) { base.SetEnabled(enabled); this.crewPreArrivalGroupBox.IsEnabled = enabled; } #endregion #region event handler private void CopyCREWAItem_Click(object sender, RoutedEventArgs e) { if (this.dataGridCrewList.SelectedItems != null) { foreach (CREW crewa in this.dataGridCrewList.SelectedItems) { CREWD crewd = new CREWD(); crewd.MessageHeader = this._crewdMessage; crewd.CopyFromCREW(crewa); crewd.IsDeparture = true; crewd.Identifier = DatabaseEntity.GetNewIdentifier(this._crewdMessage.Elements); this._crewdMessage.Elements.Add(crewd); this.SublistElementChanged(Message.NotificationClass.CREWD); } } } private void CrewPreArrivalControl_Loaded(object sender, RoutedEventArgs e) { this.RegisterTextboxChange(this.textBox_NameMaster, Message.NotificationClass.NAME); } private async void buttonDeleteAllCrewA_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show(Properties.Resources.textConfimDeleteAllEntries, Properties.Resources.textConfirmation, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { foreach (CREW crewa in this._crewaMessage.Elements.Cast()) { await DBManagerAsync.DeleteAsync(crewa); } this._crewaMessage.Elements.Clear(); this.dataGridCrewList.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.CREWA); } } private void checkBoxCrewNotificationSchengen_Click(object sender, RoutedEventArgs e) { foreach (CREW crew in _crewaMessage.Elements.Cast()) { crew.NotificationSchengen = checkBoxCrewNotificationSchengen.IsChecked; } this.SublistElementChanged(Message.NotificationClass.CREWA); } private void checkBoxCrewNotificationPAX_Click(object sender, RoutedEventArgs e) { foreach (CREW crew in _crewaMessage.Elements.Cast()) { crew.NotificationPAX = checkBoxCrewNotificationPAX.IsChecked; } this.SublistElementChanged(Message.NotificationClass.CREWA); } private void buttonImportExcelCrew_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 (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream)) { List importCrew = new List(); try { do { while (reader.Read()) { if (reader.FieldCount < 13) { throw new InvalidDataException("Sheet must have 13 columns of data"); } CREW crew = new CREW(); if (reader.IsDBNull(0) && reader.IsDBNull(1)) continue; if (!reader.IsDBNull(0)) crew.CrewMemberLastName = reader.GetString(0).Clean(); if (crew.CrewMemberLastName.Equals("Family Name") || (crew.CrewMemberLastName.Trim().Length == 0)) continue; if (!reader.IsDBNull(1)) crew.CrewMemberFirstName = reader.GetString(1).Clean(); if (!reader.IsDBNull(2)) crew.CrewMemberGender = GlobalStructures.ParseGender(reader.GetString(2)); if (!reader.IsDBNull(3)) crew.CrewMemberDuty = reader.GetString(3).Clean(); if (!reader.IsDBNull(4)) crew.CrewMemberNationality = reader.GetString(4).Substring(0, 2).ToUpper(); if (!reader.IsDBNull(5)) crew.CrewMemberPlaceOfBirth = reader.GetString(5).Clean(); if (!reader.IsDBNull(6)) crew.CrewMemberCountryOfBirth = reader.GetString(6).Substring(0, 2).ToUpper(); if (!reader.IsDBNull(7)) crew.CrewMemberDateOfBirth = reader.GetDateTime(7); if (!reader.IsDBNull(8)) crew.CrewMemberIdentityDocumentType = GlobalStructures.ReadIdentityDocumentType(reader.GetString(8)); if (!reader.IsDBNull(9)) crew.CrewMemberIdentityDocumentId = reader.ReadAsString(9).Clean(); if (!reader.IsDBNull(10)) crew.CrewMemberIdentityDocumentIssuingState = reader.GetString(10).Substring(0, 2).ToUpper(); if (!reader.IsDBNull(11)) crew.CrewMemberIdentityDocumentExpiryDate = reader.GetDateTime(11); if (!reader.IsDBNull(12)) crew.CrewMemberVisaNumber = reader.ReadAsString(12).Clean(); crew.MessageHeader = this._crewaMessage; crew.IsDirty = true; crew.Identifier = CREW.GetNewIdentifier(this._crewaMessage.Elements); this._crewaMessage.Elements.Add(crew); importCrew.Add(crew); } } while (reader.NextResult()); } catch (Exception ex) { MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error); } if (importCrew.Count > 0) { this.dataGridCrewList.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.CREWA); MessageBox.Show(String.Format(Properties.Resources.textCrewImported, importCrew.Count), Properties.Resources.textCaptionInformation, MessageBoxButton.OK, MessageBoxImage.Information); } } stream.Close(); } } #endregion #region crew grid arrival private void DataGridCrewList_CreateRequested() { EditCREWDialog ecd = new EditCREWDialog { CREW = new CREW() }; ecd.CREW.Identifier = CREW.GetNewIdentifier(_crewaMessage.Elements); ecd.CREW.MessageHeader = this._crewaMessage; ecd.AddClicked += () => { ecd.CopyValuesToEntity(); if (!this._crewaMessage.Elements.Contains(ecd.CREW)) { this._crewaMessage.Elements.Add(ecd.CREW); this.CheckCREWA(); } this.dataGridCrewList.Items.Refresh(); ecd.CREW = new CREW { MessageHeader = this._crewaMessage, Identifier = CREW.GetNewIdentifier(_crewaMessage.Elements) }; this.SublistElementChanged(Message.NotificationClass.CREWA); }; if (ecd.ShowDialog() ?? false) { if (!this._crewaMessage.Elements.Contains(ecd.CREW)) { _crewaMessage.Elements.Add(ecd.CREW); this.CheckCREWA(); } this.dataGridCrewList.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.CREWA); } } private void DataGridCrewList_DeleteRequested(DatabaseEntity obj) { if (obj is CREW crew) { // are you sure dialog is in base class _crewaMessage.Elements.Remove(crew); DBManager.Instance.Delete(crew); } } private void DataGridCrewList_RefreshGrid() { DatabaseEntity.ResetIdentifiers(_crewaMessage.Elements); this.SublistElementChanged(Message.NotificationClass.CREWA); this.dataGridCrewList.Items.Refresh(); } private void DataGridCrewList_EditRequested(DatabaseEntity obj) { EditCREWDialog ecd = new EditCREWDialog { CREW = obj as CREW }; ecd.AddClicked += () => { ecd.CopyValuesToEntity(); if (!_crewaMessage.Elements.Contains(ecd.CREW)) { _crewaMessage.Elements.Add(ecd.CREW); this.CheckCREWA(); } this.dataGridCrewList.Items.Refresh(); ecd.CREW = new CREW { Identifier = CREW.GetNewIdentifier(_crewaMessage.Elements), MessageHeader = _crewaMessage }; this.SublistElementChanged(Message.NotificationClass.CREWA); }; if (ecd.ShowDialog() ?? false) { if (!_crewaMessage.Elements.Contains(ecd.CREW)) { _crewaMessage.Elements.Add(ecd.CREW); this.CheckCREWA(); } ecd.CREW.IsDirty = true; this.dataGridCrewList.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.CREWA); } } private void DataGridCrewList_AddingNewItem(object sender, AddingNewItemEventArgs e) { this.DataGridCrewList_CreateRequested(); } private void DataGridCrewList_MultiEditRequested(List databaseEntities) { List crewList = new List(); foreach (CREW acrew in databaseEntities.Cast()) crewList.Add(acrew); // write common values of all CREW entities to template entity CREW crew = CREW.CreateCommon(crewList); EditCREWDialog dialog = new EditCREWDialog(); dialog.CREW = crew; dialog.AddVisible = false; if (dialog.ShowDialog() ?? false) { // write back changed values from crew to all entities and mark them as changed CREW.WriteTemplateToList(crew, crewList); this.SublistElementChanged(Message.NotificationClass.CREWA); this.dataGridCrewList.Items.Refresh(); } } #endregion #region private methods private void CheckCREWA() { if (this._crewaMessage.Elements.Count == 0) return; CREW firstCREW = this._crewaMessage.Elements[0] as CREW; if (this._crewaMessage.Elements.Count == 1) { firstCREW.NotificationSchengen = true; this.checkBoxCrewNotificationSchengen.IsChecked = true; } else { for (int i = 1; i < this._crewaMessage.Elements.Count; i++) { ((CREW)this._crewaMessage.Elements[i]).NotificationSchengen = firstCREW.NotificationSchengen; } } } #endregion } }