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; } } }
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); }