private static void SetDurationsOfActivities(DriverDailyActivityDto dayActivity)
 {
     foreach (var dayActivityActivity in dayActivity.Activities.OrderBy(x => x.StartUtc))
     {
         //Console.WriteLine("start: " + dayActivityActivity.StartUtc + " end: " + dayActivityActivity.EndUtc);
         dayActivityActivity.Duration = (dayActivityActivity.EndUtc - dayActivityActivity.StartUtc).TotalSeconds;
     }
 }
        private static void CountTotalServices(ActivityDto activity, DriverDailyActivityDto DriverPeriodActivities)
        {
            switch (activity.ActivityType)
            {
            case DriverActivityType.Work:
                DriverPeriodActivities.TotalWork    += activity.EndUtc - activity.StartUtc;
                DriverPeriodActivities.TotalService += activity.EndUtc - activity.StartUtc;
                break;

            case DriverActivityType.Driving:
                DriverPeriodActivities.TotalDrive   += activity.EndUtc - activity.StartUtc;
                DriverPeriodActivities.TotalService += activity.EndUtc - activity.StartUtc;
                break;

            case DriverActivityType.Available:
                DriverPeriodActivities.TotalAvailability += activity.EndUtc - activity.StartUtc;
                DriverPeriodActivities.TotalService      += activity.EndUtc - activity.StartUtc;
                break;

            case DriverActivityType.Break:
                DriverPeriodActivities.TotalBreakRest += activity.EndUtc - activity.StartUtc;
                break;
            }
            // before 6H
            if (activity.StartUtc.ToLocalTime().TimeOfDay < new TimeSpan(6, 0, 0) && activity.ActivityType > 0 && (short)activity.ActivityType != 9)
            {
                if (activity.EndUtc.ToLocalTime().TimeOfDay > new TimeSpan(6, 0, 0))
                {
                    DriverPeriodActivities.TotalNightHour += new TimeSpan(6, 0, 0) - activity.StartUtc.ToLocalTime().TimeOfDay;
                }
                else
                {
                    DriverPeriodActivities.TotalNightHour += activity.EndUtc.ToLocalTime().TimeOfDay - activity.StartUtc.ToLocalTime().TimeOfDay;
                }
            }
            // after 21H
            if (activity.EndUtc.ToLocalTime().TimeOfDay > new TimeSpan(21, 0, 0) && activity.ActivityType > 0 && (short)activity.ActivityType != 9)
            {
                if (activity.StartUtc.ToLocalTime().TimeOfDay < new TimeSpan(21, 0, 0))
                {
                    DriverPeriodActivities.TotalNightHour += activity.EndUtc.ToLocalTime().TimeOfDay - new TimeSpan(21, 0, 0);
                }
                else
                {
                    DriverPeriodActivities.TotalNightHour += activity.EndUtc.ToLocalTime().TimeOfDay - activity.StartUtc.ToLocalTime().TimeOfDay;
                }
            }
        }
Ejemplo n.º 3
0
        public DriverDailyActivityVViewModel(DriverDailyActivityDto report)
        {
            Id         = report.Id.ToString();
            Activities = report.Activities;
            WeekNumber = $"Week  { DateHelper.GetWeekNumberOfMonth(report.Date)} of {CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(report.Date.Month)} {report.Date.Year}";
            Activities.ForEach(x =>
            {
                x.EndUtc   = x.EndUtc.ToLocalTime();
                x.StartUtc = x.StartUtc.ToLocalTime();
            });

            Date          = report.Date;
            TotalDistance = report.TotalDistance;
            TotalService  =
                $"{report.TotalService.Days * 24 + report.TotalService.Hours}H{report.TotalService.Minutes:00}";
            TotalAvailability =
                $"{report.TotalAvailability.Days * 24 + report.TotalAvailability.Hours}H{report.TotalAvailability.Minutes:00}";
            TotalWork      = $"{report.TotalWork.Days * 24 + report.TotalWork.Hours}H{report.TotalWork.Minutes:00}";
            TotalDrive     = $"{report.TotalDrive.Days * 24 + report.TotalDrive.Hours}H{report.TotalDrive.Minutes:00}";
            TotalNightHour =
                $"{report.TotalNightHour.Days * 24 + report.TotalNightHour.Hours}H{report.TotalNightHour.Minutes:00}";
        }
        public async Task <DriverPeriodActivitiesDto> GetDriverCardReportFromByPeriodAsync(Guid driverId, DateTime start,
                                                                                           DateTime end)
        {
            var startPeriod     = start.ToUniversalTime();
            var endPeriod       = end.ToUniversalTime();
            var dailyActivities = await DailyActivities(driverId, startPeriod, endPeriod).ConfigureAwait(false);

            var lastActivity = dailyActivities.FirstOrDefault();

            if (lastActivity != null)
            {
                var previousAct = await GetPreviousActivityAsync(driverId, startPeriod, lastActivity.CardNumber)
                                  .ConfigureAwait(false);

                if (previousAct != null)
                {
                    dailyActivities.Add(previousAct);
                }
            }

            await mediator.Publish(new ProgressNotification { Value = 50 }).ConfigureAwait(false);

            var activitiesDates = dailyActivities
                                  .Select(x => x.Date)
                                  .Distinct()
                                  .OrderBy(x => x.Date)
                                  .ToList();

            DriverPeriodActivities = new DriverPeriodActivitiesDto();
            DriverPeriodActivities.TotalService      = new TimeSpan();
            DriverPeriodActivities.TotalWork         = new TimeSpan();
            DriverPeriodActivities.TotalAvailability = new TimeSpan();
            DriverPeriodActivities.TotalDrive        = new TimeSpan();
            foreach (var activitiesDate in activitiesDates)
            {
                var activities  = dailyActivities.Where(x => x.Date == activitiesDate).ToList();
                var dayActivity = new DriverDailyActivityDto();
                foreach (var activity in activities.OrderBy(x => x.ActivityUtc))
                {
                    var index  = activities.IndexOf(activity);
                    var actDto = new ActivityDto();
                    actDto.StartUtc = activity.ActivityUtc;
                    if (activity.CardPresent)
                    {
                        actDto.CardNumber = activity.CardNumber;
                        actDto.DriverName = activity.Name;
                    }

                    actDto.ActivityType       = activity.DriverActivityType;
                    dayActivity.TotalDistance = activity.TotalDistance;
                    dayActivity.Activities.Add(actDto);
                }

                dayActivity.Date = activitiesDate;


                dayActivity.Activities = dayActivity.Activities.OrderBy(x => x.StartUtc).ToList();
                for (int i = 0; i < dayActivity.Activities.Count; i++)
                {
                    if (i + 1 < dayActivity.Activities.Count)
                    {
                        dayActivity.Activities[i].EndUtc = dayActivity.Activities[i + 1].StartUtc;
                    }
                }


                var lastAct = dayActivity.Activities.LastOrDefault();
                if (lastAct != null)
                {
                    var index = dayActivity.Activities.IndexOf(lastAct);
                    lastAct.EndUtc = activitiesDate.Date.AddDays(1).ToUniversalTime();
                    dayActivity.Activities[index] = lastAct;
                }

                SetDurationsOfActivities(dayActivity);
                if (dayActivity.Activities.Any())
                {
                    DriverPeriodActivities.DailyActivities.Add(dayActivity);
                }
            }

            var firstItem = dailyActivities.FirstOrDefault(x => !string.IsNullOrEmpty(x.Name));

            if (firstItem != null)
            {
                DriverPeriodActivities.FullName = firstItem.Name;
            }
            DriverPeriodActivities.StartPeriod = startPeriod;
            DriverPeriodActivities.EndPeriod   = endPeriod;
            await mediator.Publish(new ProgressNotification { Value = 80 }).ConfigureAwait(false);

            CalculateCumulServices(DriverPeriodActivities);
            var detectionService = new DetectionOfDriverService();

            DriverPeriodActivities.DriverServices = detectionService.DetectionOfDriverServices(DriverPeriodActivities.DailyActivities);
            DetectionOfindemnities indemnities = new DetectionOfindemnities();

            indemnities.DriverPeriodActivities = DriverPeriodActivities;
            indemnities.DetectIndemnities();
            await mediator.Publish(new ProgressNotification { Value = 100 }).ConfigureAwait(false);

            return(DriverPeriodActivities);
        }