/// <summary>
        /// Function to retrieve audible alert to play.
        /// </summary>
        /// <param name="person">Person information</param>
        /// <param name="boardingStatusChangeState">Boarding status change information</param>
        /// <returns>Audible alert information</returns>
        private static AudibleAlert RetrieveAudibleAlert(PersonBase person, BoardingStatusChangeState boardingStatusChangeState)
        {
            switch (boardingStatusChangeState)
            {
                case BoardingStatusChangeState.AlreadyAshore:
                    return AudibleAlert.Rejected;
                case BoardingStatusChangeState.AlreadyOnboard:
                    return AudibleAlert.Rejected;
                case BoardingStatusChangeState.DeniedAshore:
                    return AudibleAlert.DeniedAshore;
                case BoardingStatusChangeState.DeniedAshoreWithoutAuthorizedPerson:
                    return AudibleAlert.DeniedAshore;
                case BoardingStatusChangeState.DeniedBoard:
                    return AudibleAlert.DeniedBoarding;
                case BoardingStatusChangeState.NotCheckedIn:
                    return AudibleAlert.DeniedBoarding;
                case BoardingStatusChangeState.PersonIsOnHold:
                    return AudibleAlert.PersonOnHold;
                case BoardingStatusChangeState.Rejected:
                    return AudibleAlert.Rejected;
                default:
                    if (person.IsOnboard)
                    {
                        return AudibleAlert.OnboardPerson;
                    }

                    return AudibleAlert.OffboardPerson;
            }
        }
        /// <summary>
        /// Function to execute rules.
        /// </summary>
        /// <returns>Boarding status change state</returns>
        public BoardingStatusChangeState Execute()
        {
            this.CheckParentalAuthorization();

            // Checks all alerts.
            if (this.person.Alerts.RetrieveAshoreAlerts().Count > 0)
            {
                CreateEventService.CreateEvent(this.person, GangwayEventType.DeniedAshore, null, null, null);
                Messenger.Instance.Notify(MessengerMessage.OpenPersonAlert, Tuple.Create<PersonBase, bool?, bool, bool>(this.person, false, this.person.Alerts.Any(s => s.IsSoundEnable), true));

                AlertCollection ashoreAlerts = this.person.Alerts.RetrieveAshoreAlerts();

                if (ashoreAlerts.Count > 0 && this.person.Alerts.Any(a => a.IsParentalAuthorizationAlert))
                {
                    this.boardingStatusChangeState = BoardingStatusChangeState.DeniedAshoreWithoutAuthorizedPerson;
                }
                else if (ashoreAlerts.Count > 0)
                {
                    this.boardingStatusChangeState = BoardingStatusChangeState.Rejected;
                }

                this.RemoveCustomAlerts();
            }

            return this.boardingStatusChangeState;
        }
        /// <summary>
        /// Function to execute rules.
        /// </summary>
        /// <returns>Boarding status change state</returns>
        public BoardingStatusChangeState Execute()
        {
            // Checks all alerts.
            if (this.person.Alerts.RetrieveOnboardAlerts().Count > 0)
            {
                CreateEventService.CreateEvent(this.person, GangwayEventType.DeniedBoard, null, null, null);
                Messenger.Instance.Notify(MessengerMessage.OpenPersonAlert, Tuple.Create<PersonBase, bool?, bool, bool>(this.person, true, this.person.Alerts.Any(s => s.IsSoundEnable), true));

                AlertCollection onboardAlerts = this.person.Alerts.RetrieveOnboardAlerts();
                if (onboardAlerts.Count > 0)
                {
                    this.boardingStatusChangeState = BoardingStatusChangeState.Rejected;
                }
            }

            return this.boardingStatusChangeState;
        }
        /// <summary>
        /// Function to handle boarding status change state.
        /// </summary>
        /// <param name="person">Instance of Person</param>
        /// <param name="boardingStatusChangeState">Boarding status change state information</param>
        private static void HandleBoardingStatusChange(PersonBase person, BoardingStatusChangeState boardingStatusChangeState)
        {
            AudibleAlertManager.PlayBell(person, boardingStatusChangeState);

            // Todo: remove following fix. This is for UI notification.
            person.IsOnboard = !person.IsOnboard;
            person.IsOnboard = !person.IsOnboard;

            person.NotifyPropertyChange(IsOnboardPropertyName);
            person.NotifyPropertyChange(LastEventPropertyName);
            person.NotifyPropertyChange(LastDateTimePropertyName);

            person.HasAlert = person.Alerts.Count > 0;
            person.NotifyPropertyChange(HasAlertProperty);
        }
 /// <summary>
 /// Function to play bell.
 /// </summary>
 /// <param name="person">Person information</param>
 /// <param name="boardingStatusChangeState">Boarding status change information</param>
 public static void PlayBell(PersonBase person, BoardingStatusChangeState boardingStatusChangeState)
 {
     Messenger.Instance.Notify(MessengerMessage.PlaySound, RetrieveAudibleAlert(person, boardingStatusChangeState));
 }
 /// <summary>
 /// Initializes a new instance of the PersonOnboardRules class.
 /// </summary>
 /// <param name="person">Instance of PersonBase</param>
 public PersonOnboardRules(PersonBase person)
 {
     this.person = person;
     this.boardingStatusChangeState = BoardingStatusChangeState.Successful;
 }
        /// <summary>
        /// Function to process after change boarding status.
        /// </summary>
        /// <param name="person">Instance of PersonBase</param>
        /// <param name="boardingStatusChangeState">BoardingStatusChange State</param>
        private void OnChangeBoardingStatus(PersonBase person, BoardingStatusChangeState boardingStatusChangeState)
        {
            ApplicationDispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => this.NotifyUI(person)));

            if (this.IsHistoryTabClicked)
            {
                ApplicationDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)(() => Messenger.Instance.Notify(MessengerMessage.UpdateHistory)));
            }

            if (boardingStatusChangeState != BoardingStatusChangeState.Successful)
            {
                Messenger.Instance.Notify(MessengerMessage.ShowSpinWheel, false);
            }

            AudibleAlertManager.PlayBell(person, boardingStatusChangeState);
        }