//public async Task<PlaneStantionOnTrip> ByPlanedRouteTrainIdAndStationId(int planedRouteTrainId, int stationId)
        //{
        //    using (var conn = new SqlConnection(AppSettings.ConnectionString))
        //    {
        //        var result =
        //            await conn.QueryFirstOrDefaultAsync<PlaneStantionOnTrip>(
        //                _sql.ByPlanedRouteTrainIdAndStationId(planedRouteTrainId, stationId));
        //        return result;
        //    }
        //}

        public async Task <PlaneStantionOnTrip> Add(PlaneStantionOnTrip input)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var id = await conn.QueryFirstOrDefaultAsync <int>(_sql.Add(input));

                return(await ById(id));
            }
        }
 public string Add(PlaneStantionOnTrip input)
 {
     return($@"
         insert into {Table} 
         ([InTime], [OutTime], [StantionId], [TripId], PlanedRouteTrainId) 
         values
         ('{input.InTime}', '{input.OutTime}', {input.StantionId}, {input.TripId}, {input.PlanedRouteTrainId})
         SELECT SCOPE_IDENTITY()
     ");
 }
 public string Update(PlaneStantionOnTrip input)
 {
     return($@"
         update {Table} set 
         InTime = '{input.InTime}', 
         OutTime = '{input.OutTime}', 
         StantionId = {input.StantionId}, 
         TripId = {input.TripId},
         PlanedRouteTrainId = {input.PlanedRouteTrainId}
         where id = {input.Id}
     ");
 }
        private async Task <List <StantionQq> > GetStationsFromPlanedRouteByIdAndDay(int planedRouteTrainId, DateTime day,
                                                                                     int userId, int?inputStationId = 0)
        {
            var result              = new List <Stantion>();
            var sqlRStations        = new StantionsRepository(_logger);
            var sqlRPlanedStOnTrips = new PlanedStationOnTripsRepository(_logger);
            var sqlRTrip            = new TripsRepository(_logger);

            if (userId == 0)
            {
                throw new ValidationException(Error.NotFilledOptionalField);
            }

            PlaneStantionOnTrip inputSt = null;

            if (inputStationId != 0)
            {
                inputSt = await sqlRPlanedStOnTrips.ById(inputStationId.Value);
            }

            var currentDayPlaneBrigadeTrain = await sqlRPlanedStOnTrips.ByUserIdAndTimeRange(userId,
                                                                                             day.Date.AddHours(3), day.Date.AddDays(1).AddMilliseconds(-1));

            //busyPlanedSt = busyPlanedSt.Where(x => x.PlanedRouteTrainId != planedRouteTrainId).ToList();
            //var curPlanedRoute = await sqlPlanedBr.ByPlannedRouteTrainId(planedRouteTrainId);
            var currentPlanedRSt = await sqlRPlanedStOnTrips.ByPlannedRouteTrainId(planedRouteTrainId);

            currentPlanedRSt = currentPlanedRSt.OrderBy(x => x.OutTime).ToList();

            //var curPlanedRouteBr = await sqlPlanedBr.ByPlannedRouteTrainId(planedRouteTrainId);
            var usedPlaneSt = new List <PlaneStantionOnTrip>();

            if (currentPlanedRSt.Any())
            {
                foreach (var item in currentDayPlaneBrigadeTrain)
                {
                    //все станки маршрута, на который назначена данная запись
                    var planSts = (await sqlRPlanedStOnTrips.ByPlannedRouteTrainId(item.PlanedRouteTrainId))
                                  .OrderBy(x => x.OutTime).ToList();
                    var start = planSts.IndexOf(planSts.First(x => x.Id == item.StantionStartId)) + 1;
                    var end   = planSts.IndexOf(planSts.First(x => x.Id == item.StantionEndId)) + 1;
                    usedPlaneSt.AddRange(planSts.GetRange(start, end - start));
                }
            }

            usedPlaneSt = usedPlaneSt.DistinctBy(x => x.Id).ToList();
            DateTime?minUsedTime = null;
            DateTime?maxUsedTime = null;

            if (usedPlaneSt.Count > 1)
            {
                minUsedTime = usedPlaneSt.First().OutTime;
                maxUsedTime = usedPlaneSt.Last().InTime;
            }
            if (usedPlaneSt.Count == 1)
            {
                minUsedTime = usedPlaneSt.First().OutTime;
                maxUsedTime = usedPlaneSt.First().InTime;
            }

            if (minUsedTime != null && maxUsedTime != null)
            {
                if (inputSt != null)
                {
                    if (inputSt.OutTime <= minUsedTime)
                    {
                        maxUsedTime = ((DateTime)maxUsedTime).AddDays(1);
                    }
                    if (inputSt.OutTime >= maxUsedTime)
                    {
                        minUsedTime = ((DateTime)minUsedTime).AddDays(-1);
                    }
                }
            }

            var res1 = new List <StantionQq>();

            var currentTripId = 0;

            for (var index = 0; index < currentPlanedRSt.Count; index++)
            {
                var item = currentPlanedRSt[index];
                var trip = await sqlRTrip.ById(item.TripId);


                if (minUsedTime != null && maxUsedTime != null)
                {
                    if (item.InTime >= minUsedTime && item.InTime <= maxUsedTime)
                    {
                        continue;
                    }
                    if (item.OutTime >= minUsedTime && item.OutTime <= maxUsedTime)
                    {
                        continue;
                    }
                }

                //foreach (var x in usedPlaneSt)
                //{
                //    if (item.InTime >= x.InTime && item.InTime <= x.OutTime)
                //        isUsed = true;
                //    if (item.OutTime >= x.InTime && item.OutTime <= x.OutTime)
                //        isUsed = true;
                //}
                //if (isUsed)
                //    continue;
                var station = await sqlRStations.ById(item.StantionId);

                station.Id = item.Id;
                //station.Name += $" ({item.InTime.ToStringTimeOnly()})";
                var sqq = _mapper.Map <Stantion, StantionQq>(station);
                sqq.InTime   = item.InTime;
                sqq.TripName = trip.Name;

                var qqStart = item.InTime.ToStringTimeOnly();
                var qqEnd   = item.OutTime.ToStringTimeOnly();
                if (currentTripId == 0 || item.TripId != currentTripId)
                {
                    qqStart = "н/д";
                }
                if (index != currentPlanedRSt.Count - 1)
                {
                    if (currentPlanedRSt[index + 1].TripId != item.TripId && currentTripId != 0)
                    {
                        qqEnd = "н/д";
                    }
                }
                else
                {
                    qqEnd = "н/д";
                }

                var qq1 = $"{station.Name} {qqStart}-{qqEnd} ({trip.Name})";
                sqq.Name += $" ({qq1})";
                res1.Add(sqq);
                currentTripId = item.TripId;
                //result.Add(station);
            }

            return(res1);
        }