private async Task <bool> CompareDaysFromTurnover(TripOnRouteWithStationsDto input)
        {
            var sqlRRoute = new RoutesRepository(_logger);
            var route     = await sqlRRoute.ById(input.RouteId);

            if (route.TurnoverId == null)
            {
                throw new ValidationException("У данного маршрута отсутсвует цикловой график");
            }
            var sqlRTurnover = new TurnoversRepoisitory(_logger);
            var turnover     = await sqlRTurnover.ById((int)route.TurnoverId);

            var sqlRDaysOnRoute         = new DayOfRoutesRepoisitory(_logger);
            var daysOfRouteFromTurnover = await sqlRDaysOnRoute.DaysByTurnoverId(turnover.Id);

            var daysFromTurnover = daysOfRouteFromTurnover.Select(x => x.Day).ToList();

            daysFromTurnover.Sort();
            input.Days.Sort();

            var isgoodTrip = true;

            foreach (var d in daysFromTurnover)
            {
                if (!input.Days.Any(x => x.Equals(d)))
                {
                    isgoodTrip = false;
                }
            }
            if (isgoodTrip)
            {
                return(true);
            }
            return(false);
        }
        /// <summary>
        /// Отдает маршруты с временными промежутками то и рейсов для ебучего расписания
        /// </summary>
        public async Task <RoutesWithTimelinePaging> GetRoutesWithTimeline(int turnoverId, int skip, int limit, int?routeId = null)
        {
            RoutesWithTripsAndToPaging data;

            if (routeId != null)
            {
                data = await GetRoutesWithTripsAndToByTurnoverId(turnoverId, skip, limit, routeId);
            }
            else
            {
                data = await GetRoutesWithTripsAndToByTurnoverId(turnoverId, skip, limit);
            }

            var result = new RoutesWithTimelinePaging {
                Total = data.Total, Data = new List <ScheduleRouteTripsTo>()
            };

            foreach (var item in data.Data.OrderBy(x => int.Parse("0" + Regex.Match(x.Name, "(\\d+)").Value)))
            {
                var toAdd = new ScheduleRouteTripsTo();
                toAdd.RouteId   = item.Id;
                toAdd.Mileage   = item.Mileage;
                toAdd.RouteName = item.Name;
                toAdd.TimeLines = await TimelineFromTrips(item.Trips);

                var timelineFromInspectionRoutes = TimelineFromInspectionRoutes(item.InspectionRoutes);
                if (timelineFromInspectionRoutes.Count > 0)
                {
                    toAdd.TimeLines.AddRange(timelineFromInspectionRoutes);
                }
                result.Data.Add(toAdd);
            }

            var sqlRTurnover    = new TurnoversRepoisitory(_logger);
            var sqlRDirection   = new DirectionsRepository(_logger);
            var sqlRDayOfRoutes = new DayOfRoutesRepoisitory(_logger);

            var turnover = await sqlRTurnover.ById(turnoverId);

            result.TurnoverName = turnover.Name;
            var direction = await sqlRDirection.ById(turnover.DirectionId);

            result.DirectionName = direction?.Name;

            var turnoversDays = await sqlRDayOfRoutes.DaysByTurnoverId(turnoverId);

            result.Days = turnoversDays.Select(x => x.Day).ToList();

            return(result);
        }
        public async Task DeleteTurnoverWithDays(int id)
        {
            ////Начинаем блядь КВН
            using (var transaction = new TransactionScope(asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled))
            {
                var sqlRTurnovers = new TurnoversRepoisitory(_logger);
                var sqlRDays      = new DayOfRoutesRepoisitory(_logger);
                var currentDays   = await sqlRDays.DaysByTurnoverId(id);

                foreach (var currentDay in currentDays)
                {
                    await sqlRDays.Delete(currentDay.Id);
                }
                await sqlRTurnovers.Delete(id);

                transaction.Complete();
            }
        }
        /// <summary>
        /// Добавить тарновера с днями в цикловой график
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <TurnoverWithDays> AddTurnoverWithDays(TurnoverWithDays input)
        {
            //Начинаем блядь КВН
            using (var transaction = new TransactionScope(asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled))
            {
                var sqlRTurnovers = new TurnoversRepoisitory(_logger);
                var sqlRDays      = new DayOfRoutesRepoisitory(_logger);

                var turnover = await sqlRTurnovers.Add(_mapper.Map <TurnoverWithDays, Turnover>(input));

                var result = _mapper.Map <Turnover, TurnoverWithDays>(turnover);
                result.Days = new List <DayOfWeek>();
                foreach (var inputDay in input.Days)
                {
                    var day = await sqlRDays.Add(new DayOfRoute { TurnoverId = result.Id, Day = inputDay });

                    result.Days.Add(day.Day);
                }
                transaction.Complete();
                return(result);
            }
        }
        public async Task <TurnoverWithDays> UpdateTurnoverWithDays(TurnoverWithDays input)
        {
            //Начинаем блядь КВН
            using (var transaction = new TransactionScope(asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled))
            {
                var sqlRTurnovers = new TurnoversRepoisitory(_logger);
                var sqlRDays      = new DayOfRoutesRepoisitory(_logger);

                var turnover = await sqlRTurnovers.Update(_mapper.Map <TurnoverWithDays, Turnover>(input));

                var result      = _mapper.Map <Turnover, TurnoverWithDays>(turnover);
                var currentDays = await sqlRDays.DaysByTurnoverId(input.Id);

                result.Days = new List <DayOfWeek>();
                foreach (var inputDay in input.Days)
                {
                    if (currentDays.Any(x => x.Day.Equals(inputDay)))
                    {
                        result.Days.Add(inputDay);
                        continue;
                    }
                    var day = await sqlRDays.Add(new DayOfRoute { TurnoverId = input.Id, Day = inputDay });

                    result.Days.Add(day.Day);
                }

                foreach (var currentDay in currentDays)
                {
                    if (!input.Days.Any(x => x.Equals(currentDay.Day)))
                    {
                        await sqlRDays.Delete(currentDay.Id);
                    }
                }

                transaction.Complete();
                return(result);
            }
        }
        public async Task <TurnoversWithDaysPaging> GetTurnoversWithDays(int skip, int limit)
        {
            var sqlR      = new TurnoversRepoisitory(_logger);
            var turnovers = await sqlR.GetAll(skip, limit, null);

            var result = new TurnoversWithDaysPaging {
                Data = new List <TurnoverWithDays>(), Total = turnovers.Data.Count
            };
            var sqlRDays = new DayOfRoutesRepoisitory(_logger);

            foreach (var turnover in turnovers.Data)
            {
                result.Data.Add(new TurnoverWithDays
                {
                    Name        = turnover.Name,
                    DirectionId = turnover.DirectionId,
                    Id          = turnover.Id,
                    Days        = (await sqlRDays.DaysByTurnoverId(turnover.Id)).Select(x => x.Day).ToList()
                });
            }

            return(result);
        }
        public async Task <List <PlanedRouteTrainDto> > PlanedRouteTrainsTable(DateTime startTime, DateTime EndTime)
        {
            var sqlRPlanedRouteTrains    = new PlanedRouteTrainsRepository(_logger);
            var sqlRRoutes               = new RoutesRepository(_logger);
            var sqlRTrains               = new TrainRepository(_logger);
            var sqlRUsers                = new UserRepository(_logger);
            var sqlRDayOfROutes          = new DayOfRoutesRepoisitory(_logger);
            var sqlRStations             = new StantionsRepository(_logger);
            var sqlRPlaneStationsOnTrips = new PlanedStationOnTripsRepository(_logger);
            var sqlRPlaneBrigadeTrains   = new PlaneBrigadeTrainsRepository(_logger);
            var planedRouteTrains        = await sqlRPlanedRouteTrains.GetAll();

            planedRouteTrains = planedRouteTrains.Where(x => x.Date >= startTime && x.Date < EndTime).ToList();
            //var result = new List<PlanedRouteTrainDto>();

            var dictionary = new Dictionary <int, PlanedRouteTrainDto>();
            //var routeDictionary = planedRouteTrains.ToDictionary(e => e.RouteId);

            //Собственно надо набить словарик доступными роутами
            var routes = await sqlRRoutes.GetAll(0, Int32.MaxValue, null);

            routes.Data = routes.Data.Where(x => x.TurnoverId != null).ToList();

            foreach (var route in routes.Data)
            {
                var planedRouteTrainDto = new PlanedRouteTrainDto
                {
                    Route     = route,
                    RouteDays = new List <DayOfWeek>(),
                    DaysData  = new List <DayData>()
                };


                if (route.TurnoverId != null)
                {
                    var daysOfRoutes = await sqlRDayOfROutes.DaysByTurnoverId((int)route.TurnoverId);

                    var days = daysOfRoutes.Select(x => x.Day);
                    planedRouteTrainDto.RouteDays.AddRange(days);
                    var proccesDate = startTime;

                    while (proccesDate <= EndTime)
                    {
                        var currentDay = proccesDate.DayOfWeek;
                        if (days.Contains(currentDay))
                        {
                            planedRouteTrainDto.DaysData.Add(new DayData
                            {
                                Date = proccesDate.Date, DateString = proccesDate.Date.ToString()
                            });
                        }
                        proccesDate = proccesDate.AddDays(1);
                    }
                }

                if (dictionary.ContainsKey(route.Id))
                {
                    dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                }
                else
                {
                    dictionary.Add(route.Id, planedRouteTrainDto);
                }
            }

            foreach (var planedRouteTrain in planedRouteTrains)
            {
                //достаем роут
                var route = await sqlRRoutes.ById(planedRouteTrain.RouteId);

                //var currentRouteItems = planedRouteTrains.Where(e => e.RouteId == route.Id);
                var planedRouteTrainDto = new PlanedRouteTrainDto
                {
                    Route    = route,
                    DaysData = new List <DayData>()
                };

                var toAdd = new DayData
                {
                    Train = await sqlRTrains.ById(planedRouteTrain.TrainId),
                    PlanedRouteTrainId = planedRouteTrain.Id,
                    Date = planedRouteTrain.Date
                };
                toAdd.DateString = toAdd.Date.ToString("yyyy-MM-ddTHH:mm:ssZ");
                var planeBrigadeTrains = await sqlRPlaneBrigadeTrains.ByPlanedRouteTrainId(planedRouteTrain.Id);

                toAdd.Users = new List <DaysUser>();
                foreach (var planeBrigadeTrain in planeBrigadeTrains)
                {
                    var user = await sqlRUsers.ById(planeBrigadeTrain.UserId);

                    var userToAdd = new DaysUser
                    {
                        UserId = user.Id, Name = user.Name, PlaneBrigadeTrainsId = planeBrigadeTrain.Id
                    };
                    userToAdd.UserStations = new UserStations();
                    var planedStationInput = await sqlRPlaneStationsOnTrips.ById(planeBrigadeTrain.StantionStartId);

                    userToAdd.UserStations.InputTime = planedStationInput.OutTime;
                    userToAdd.UserStations.InputName = (await sqlRStations.ById(planedStationInput.StantionId)).Name;

                    var planedStationOutput = await sqlRPlaneStationsOnTrips.ById(planeBrigadeTrain.StantionEndId);

                    userToAdd.UserStations.OutputTime = planedStationOutput.InTime;
                    userToAdd.UserStations.OutputName = (await sqlRStations.ById(planedStationOutput.StantionId)).Name;
                    //userToAdd.UserStations.InputName = (await sqlRStations.ById(planeBrigadeTrain.StantionStartId)).Name;
                    //userToAdd.UserStations.OutputName = (await sqlRStations.ById(planeBrigadeTrain.StantionEndId)).Name;
                    toAdd.Users.Add(userToAdd);
                }

                planedRouteTrainDto.DaysData.Add(toAdd);


                if (dictionary.ContainsKey(route.Id))
                {
                    //надо взять текущие деньки роута и проверить что такого еще нет. кстати если его нет надо нахуй послать, а если есть заменить.
                    var currentDays = dictionary[route.Id].DaysData;
                    var day         = currentDays.FirstOrDefault(x =>
                                                                 x.Date.Date.Equals(planedRouteTrainDto.DaysData.First().Date.Date));
                    if (day == null)
                    {
                        dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                        continue;
                    }

                    //throw new ValidationException("На этот день нельзя добавить поезд");
                    var index = dictionary[route.Id].DaysData.IndexOf(day);
                    dictionary[route.Id].DaysData[index] = planedRouteTrainDto.DaysData.First();
                    //dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                }
                else
                {
                    dictionary.Add(route.Id, planedRouteTrainDto);
                }
            }


            //var train = await sqlRTrains.ByIdWithStations(planedRouteTrain.TrainId);

            var result = new List <PlanedRouteTrainDto>();

            result.AddRange(dictionary.Values);

            return(result);
        }
        public async Task <List <TripWithStartEndTimeAndDays> > GetTripsByTurnoverIdAndDays(int turnoverId, int routeId)
        {
            var sqlRTripOnRoute    = new TripsOnRouteRepository(_logger);
            var sqlRRoute          = new RoutesRepository(_logger);
            var sqlRDaysOfRoutes   = new DayOfRoutesRepoisitory(_logger);
            var sqlRTrips          = new TripsRepository(_logger);
            var sqlRStationOnTrips = new StantionOnTripsRepository(_logger);
            var sqlRStation        = new StantionsRepository(_logger);
            var sqlRDayOfTrips     = new DayOfTripsRepoisitory(_logger);
            //Получаем дни циклового графика
            var daysTurnoverObj = await sqlRDaysOfRoutes.DaysByTurnoverId(turnoverId);

            var daysTurnover = daysTurnoverObj.Select(x => x.Day).ToList();

            daysTurnover.Sort();
            //Надо найти трипсы с аналогичными днями.
            var trips = await sqlRTrips.GetAll();

            var result = new List <TripWithStartEndTimeAndDays>();


            var route = await sqlRRoute.ById(routeId);

            foreach (var trip in trips)
            {
                if (await sqlRTripOnRoute.ByRouteIdAndTripId(route.Id, trip.Id) != null)
                {
                    continue;
                }

                var currentTripDaysObj = await sqlRDayOfTrips.DaysByTripId(trip.Id);

                var currentTripDays = currentTripDaysObj.Select(x => x.Day).ToList();
                currentTripDays.Sort();

                var isGoodTrip = true;
                foreach (var d in daysTurnover)
                {
                    if (!currentTripDays.Any(x => x.Equals(d)))
                    {
                        isGoodTrip = false;
                    }
                }
                if (!isGoodTrip)
                {
                    continue;
                }
                {
                    string days = null;
                    foreach (var day in currentTripDays)
                    {
                        if (days == null)
                        {
                            days = GetStringDayOfWeekShort(day);
                        }
                        else
                        {
                            days = days + ", " + GetStringDayOfWeekShort(day);
                        }
                    }
                    var tripStations = await sqlRStationOnTrips.ByTripId(trip.Id);

                    tripStations = tripStations.OrderBy(x => x.OutTime).ToList();
                    var startStation = tripStations.First();
                    var endStation   = tripStations.Last();

                    var tripExtended = _mapper.Map <Trip, TripWithStartEndTimeAndDays>(trip);
                    tripExtended.Days             = currentTripDays;
                    tripExtended.StartTime        = startStation.OutTime.ToStringTimeOnly();
                    tripExtended.EndTime          = endStation.InTime.ToStringTimeOnly();
                    tripExtended.StartStationName = (await sqlRStation.ById(startStation.StantionId)).Name;
                    tripExtended.EndStationName   = (await sqlRStation.ById(endStation.StantionId)).Name;
                    result.Add(tripExtended);
                }
            }

            return(result);
        }