public InformationAfterComingIntoZoneDto ComeInToZone(ZoneEntry zoneEntry)
        {
            InformationAfterComingIntoZoneDto result = new InformationAfterComingIntoZoneDto()
            {
                Status  = "Something went wrong.",
                Success = false
            };

            try
            {
                bool   success       = false;
                string status        = "";
                double currentHour   = DateTime.Now.Hour;
                double currentMinute = DateTime.Now.Minute;
                if (currentMinute > 0)
                {
                    currentHour += 1;
                }
                currentHour %= 24;

                if (Security.Security.UserTokens.Any(i => i.Value == zoneEntry.UserToken) || zoneEntry.UserToken == string.Empty || zoneEntry.UserToken == "a")
                {
                    List <Position> positionsAvailableForZone = new List <Position>();
                    int             userId = -1;
                    if (zoneEntry.UserToken != string.Empty && zoneEntry.UserToken != "a")
                    {
                        userId = Security.Security.UserTokens.FirstOrDefault(i => i.Value == zoneEntry.UserToken).Key;
                        var user = _dbContext.Users.FirstOrDefault(i => i.Id == userId);
                        if (user == null)
                        {
                            throw new UserNotFoundException("There is no user with given data.");
                        }

                        positionsAvailableForZone = _dbContext.Orders.Where(i => i.User.Id == userId).SelectMany(i =>
                                                                                                                 i.Positions.Where(j => j.Ticket.Zone.Id == zoneEntry.ZoneId && j.CanBeUsed &&
                                                                                                                                   j.Ticket.StartHour <= currentHour &&
                                                                                                                                   j.Ticket.EndHour >= currentHour)).ToList();
                    }
                    else
                    {
                        positionsAvailableForZone = _dbContext.Orders.Where(i => i.UserData.Email == zoneEntry.Email)
                                                    .SelectMany(
                            i => i.Positions.Where(j => j.Ticket.Zone.Id == zoneEntry.ZoneId && j.CanBeUsed &&
                                                   j.Ticket.StartHour <= currentHour && j.Ticket.EndHour >= currentHour))
                                                    .ToList();
                    }


                    if (positionsAvailableForZone.Any(i =>
                                                      _dbContext.ZoneHistories.Count(j => j.FinishTime == null && j.Id == i.Id) > 0))
                    {
                        throw new Exception("This operation is not allowed. You are already in different zone!");
                    }
                    else if (positionsAvailableForZone.Count == 0)
                    {
                        throw new Exception("You don't have required ticket.");
                    }

                    Position position    = positionsAvailableForZone.FirstOrDefault();
                    Zone     zoneToEnter = _dbContext.Zones.FirstOrDefault(i => i.Id == zoneEntry.ZoneId);
                    _dbContext.ZoneHistories.Add(new ZoneHistory()
                    {
                        Position  = position,
                        StartTime = DateTime.Now,
                        Zone      = zoneToEnter
                    });
                    position.CanBeUsed = false;

                    _dbContext.SaveChanges();
                    status            = zoneToEnter.Name;
                    success           = true;
                    result.Success    = success;
                    result.Status     = status;
                    result.ZoneId     = zoneToEnter.Id;
                    result.PositionId = position.Id;
                }
                else
                {
                    throw new Exception("User identification failed.");
                }
            }
            catch (Exception ex)
            {
                result.Status = ex.Message;
            }

            return(result);
        }
        public void ComeInToAttraction(AttractionEntry attractionEntry)
        {
            InformationAfterComingIntoZoneDto result = new InformationAfterComingIntoZoneDto()
            {
                Status  = "Something went wrong.",
                Success = false
            };

            try
            {
                bool   success       = false;
                string status        = "";
                double currentHour   = DateTime.Now.Hour;
                double currentMinute = DateTime.Now.Minute;
                if (currentMinute > 0)
                {
                    currentHour += 1;
                }
                currentHour %= 24;

                if (Security.Security.UserTokens.Any(i => i.Value == attractionEntry.UserToken) ||
                    attractionEntry.UserToken == string.Empty || attractionEntry.UserToken == "a")
                {
                    List <Position> positionsAvailableForZone = new List <Position>();
                    int             userId = -1;
                    if (attractionEntry.UserToken != string.Empty && attractionEntry.UserToken != "a")
                    {
                        userId = Security.Security.UserTokens.FirstOrDefault(i => i.Value == attractionEntry.UserToken).Key;
                        var user = _dbContext.Users.FirstOrDefault(i => i.Id == userId);
                        if (user == null)
                        {
                            throw new UserNotFoundException("There is no user with given data.");
                        }

                        //positionsAvailableForZone = _dbContext.Orders.Where(i => i.User.Id == userId).SelectMany(i =>
                        //    i.Positions.Where(j => j.Ticket.Zone.Id == attractionEntry.ZoneEntry.ZoneId && !j.CanBeUsed &&
                        //                           j.Ticket.StartHour <= currentHour &&
                        //                           j.Ticket.EndHour >= currentHour)).ToList();
                    }
                    else
                    {
                        //positionsAvailableForZone = _dbContext.Orders.Where(i => i.UserData.Email == attractionEntry.ZoneEntry.Email)
                        //    .SelectMany(
                        //        i => i.Positions.Where(j => j.Ticket.Zone.Id == attractionEntry.ZoneEntry.ZoneId && !j.CanBeUsed &&
                        //                                    j.Ticket.StartHour <= currentHour && j.Ticket.EndHour >= currentHour))
                        //    .ToList();
                    }

                    AttractionHistory attractionHistory = new AttractionHistory()
                    {
                        Position   = _dbContext.Positions.FirstOrDefault(i => i.Id == attractionEntry.PositionId),
                        Attraction = _dbContext.Attractions.Include(i => i.Zone).FirstOrDefault(i => i.Id == attractionEntry.AttractionId),
                        StartTime  = DateTime.Now
                    };
                    _dbContext.AttractionHistories.Add(attractionHistory);
                    _dbContext.SaveChanges();

                    status            = attractionHistory.Attraction.Name;
                    success           = true;
                    result.Success    = success;
                    result.Status     = status;
                    result.ZoneId     = attractionHistory.Attraction.Zone.Id;
                    result.PositionId = attractionHistory.Position.Id;
                }
                else
                {
                    throw new Exception("User identification failed.");
                }
            }
            catch (Exception ex)
            {
                result.Status = ex.Message;
            }
        }