/// <summary>
        /// retrieves embarkation statistics asynchronous
        /// </summary>
        /// <param name="shipId">shipId attribute</param>
        /// <param name="shipDate">shipDate attribute</param>
        /// <param name="voyageIds">voyageId attribute</param>
        /// <param name="flowDirection">The flow direction.</param>
        /// <returns>
        /// embarkation statistics
        /// </returns>
        public async Task<Entity.EmbarkationStatistics> GetByIdAsync(string shipId, string shipDate, string voyageIds, string flowDirection = null)
        {
            var embarkationStatistics = new Entity.EmbarkationStatistics();
            var embarkationStatisticsResponse = await this.embarkationStatisticsClient.RetrieveEmbarkationStatisticsAsync(shipId: shipId, itineraryDate: shipDate, voyageIds: voyageIds);
            var embarkationStatisticsData = embarkationStatisticsResponse != null ? JsonConvert.DeserializeObject<Entities.EmbarkationStatistics>(embarkationStatisticsResponse) : default(Entities.EmbarkationStatistics);

            if (embarkationStatisticsData != null)
            {
                var boardingEmbarkStats = new Collection<BoardingEmbarkStats>
            {
                new BoardingEmbarkStats { BoardingCheckedInCount = 100, BoardingExpectedCount = 200, BoardingNumber = 500, BoardingOnboardCount = 200 },
                new BoardingEmbarkStats { BoardingCheckedInCount = 200, BoardingExpectedCount = 230, BoardingNumber = 550, BoardingOnboardCount = 300 },
            };
                embarkationStatistics.GuestEmbarkation = GuestEmbarkStatsMapper.Map(embarkationStatisticsData.GuestEmbarkations);
                embarkationStatistics.CrewEmbarkation = CrewEmbarkStatsMapper.Map(embarkationStatisticsData.CrewEmbarkations);
                embarkationStatistics.VisitorEmbarkation = VisitorEmbarkStatsMapper.Map(embarkationStatisticsData.VisitorEmbarkations);

                embarkationStatistics.CurrentBoardingNumber = CurrentBoardingNumberConstant;
                var filterCountryId = embarkationStatisticsData.GuestEmbarkations.Select(x => new { Id = x.CountryId, Count = x.CheckedIn + x.NotCheckedIn + x.Onboard }).OrderByDescending(y => y.Count).DistinctBy(a => a.Id).Select(c => c.Id).ToList();

                embarkationStatistics.AssignEmbarkationCountryStats(filterCountryId);
                embarkationStatistics.AssignBoardingEmbarkStats(boardingEmbarkStats);

                if (!string.IsNullOrEmpty(flowDirection) && flowDirection.Equals(FlowDirectionConstant, StringComparison.OrdinalIgnoreCase))
                {
                    var personNotification = DIContainer.Instance.Resolve<PersonAlertClientRepository>();
                    var alerts = await personNotification.RetrieveAlerts(IsCBPClearanceId, shipDate, string.Empty);
                    var alertIds = alerts.Items != null && alerts.Items.Count > 0 ? alerts.Items.DistinctBy(a => a.AlertId).ToList().RetrieveIds(a => a.AlertId) : null;
                    if (alertIds != null)
                    {
                        var personAlerts = await personNotification.RetrievePersonAlerts(DIContainer.Instance.Resolve<ApplicationSetting>().ApplicationSettingId, AlertStatusIds, null, alertIds);
                        if (personAlerts.Items.Count > 0)
                        {
                            var alertStats = new AlertStats { AlertType = CBPHoldConstant };
                            alertStats.OpenCount = personAlerts.Items.Count(a => a.StatusId.Equals(OpenStatusId, StringComparison.OrdinalIgnoreCase));
                            alertStats.CloseCount = personAlerts.Items.Count(a => a.StatusId.Equals(CloseStatusId, StringComparison.OrdinalIgnoreCase));
                            embarkationStatistics.AlertStats.Add(alertStats);
                        }
                    }
                }
            }

            return embarkationStatistics;
        }
        /// <summary>
        /// retrieves embarkation statistics asynchronous
        /// </summary>
        /// <param name="shipId">shipId attribute</param>
        /// <param name="shipDate">shipDate attribute</param>
        /// <param name="voyageIds">voyageId attribute</param>
        /// <returns>
        /// embarkation statistics
        /// </returns>
        public async Task<EmbarkationStatistics> GetEmbarkDataByShipIdAsync(string shipId, string shipDate, string voyageIds)
        {
            var embarkationStatistics = new Entity.EmbarkationStatistics();
            var embarkationStatisticsResponse = await this.embarkationStatisticsClient.RetrieveEmbarkationStatisticsAsync(shipId: shipId, itineraryDate: shipDate, voyageIds: voyageIds);
            var embarkationStatisticsData = embarkationStatisticsResponse != null ? JsonConvert.DeserializeObject<Entities.EmbarkationStatistics>(embarkationStatisticsResponse) : default(Entities.EmbarkationStatistics);
            if (embarkationStatisticsData != null)
            {
                embarkationStatistics.GuestEmbarkation = EmbarkStatsMapper.MapGuestEmbarkData(embarkationStatisticsData.GuestEmbarkations);
                embarkationStatistics.CrewEmbarkation = EmbarkStatsMapper.MapCrewEmbarkData(embarkationStatisticsData.CrewEmbarkations);
                embarkationStatistics.VisitorEmbarkation = EmbarkStatsMapper.MapVisitorEmbarkData(embarkationStatisticsData.VisitorEmbarkations);
            }

            return embarkationStatistics;
        }