private void TaskSaved(object obj) { var unsyncedTimeEntries = _timeEntryRepository.GetUnsyncedTimeEntries(); if (unsyncedTimeEntries.Any(x => x.HasSyncError)) { ErrorMessage = "There were timeentries that could not be saved!"; HasErrors = true; PlaceHolderActivated = true; var historyFeedRowViewModels = unsyncedTimeEntries.Where(x => x.HasSyncError).Select(te => new HistoryFeedRowViewModel(te)).ToList(); var notificationViewModelItem = new HistoryFeedRowViewModel( DateTime.MaxValue, "[PlaceHolder]"); historyFeedRowViewModels.Add(notificationViewModelItem); TimeEntries = new ObservableCollection <HistoryFeedRowViewModel>(historyFeedRowViewModels.OrderByDescending(te => te.Date)); } else { var feedRows = _userSession.UserStatistics.LastXDaysTimeEntries.Select(te => new HistoryFeedRowViewModel(te)).ToList(); feedRows.AddRange(unsyncedTimeEntries.Where(x => !x.HasSyncError).Select(te => new HistoryFeedRowViewModel(te))); TimeEntries = new ObservableCollection <HistoryFeedRowViewModel>(feedRows.OrderByDescending(te => te.Date)); } }
public async Task SaveNewTimeEntries(DateTime lastSyncDate) { var unsyncedTasks = _timeEntryRepository.GetUnsyncedTimeEntries(); var unsyncedTasksCount = unsyncedTasks.Count; if (unsyncedTasksCount == 0) { return; } var user = new UserDto { UserId = _userSession.CurrentUser.Id, UserName = _userSession.CurrentUser.UserName, FullName = _userSession.CurrentUser.Name }; var serviceEntries = new List <Common.DataTransferObjects.TimeEntryDto>(); foreach (var timeEntry in unsyncedTasks) { var timeEntryDto = new Common.DataTransferObjects.TimeEntryDto(); timeEntryDto.Description = timeEntry.Description; timeEntryDto.Guid = timeEntry.Guid; timeEntryDto.BillableTime = timeEntry.BillableTime.TotalHours; timeEntryDto.Billable = timeEntry.Billable; timeEntryDto.TimeSpent = timeEntry.TimeSpent.TotalHours; timeEntryDto.TimeEntryTypeId = timeEntry.TimeEntryType.Id; timeEntryDto.StartTime = timeEntry.StartTime; timeEntryDto.EndTime = timeEntry.EndTime; timeEntryDto.TaskId = timeEntry.Task.Id; timeEntryDto.TaskGuid = timeEntry.Task.Guid; timeEntryDto.PricePrHour = timeEntry.PricePrHour; timeEntryDto.CreateDate = timeEntry.CreateDate; timeEntryDto.ClientSourceId = timeEntry.ClientSourceId; serviceEntries.Add(timeEntryDto); } try { var response = await _serviceStackClient.PostAsync(new SaveOrUpdateTimeEntriesRequest { TimeEntries = serviceEntries.ToList(), UserId = user.UserId }); foreach (var responseTimeEntryStatus in response.TimeEntryStatus) { var unsyncedTask = unsyncedTasks.SingleOrDefault(x => x.Guid == responseTimeEntryStatus.Guid); if (unsyncedTask != null) { unsyncedTask.IsSynced = responseTimeEntryStatus.IsOK; unsyncedTask.SyncResponse = responseTimeEntryStatus.ReasonText; } } _timeEntryRepository.AddOrUpdateRange(unsyncedTasks); } catch (CommunicationException ex) { throw new ServiceAccessException("Error when uploading timeentries", ex); } }
private async void DoSync() { if (!_connectivityService.IsOnline) { ApplicationCommands.SyncCompleted.Execute(null); return; } if (SyncInProgress || !_connectivityService.IsOnline) { return; } SyncInProgress = true; ApplicationCommands.SyncStarted.Execute(ShouldDisplayProgress); try { if (ForceResync) { _busyService.ShowBusy(_syncKey); await Task.Run(() => { SyncProgressChanged(20, "Synchronizing companies"); SynchronizeCompanies().Wait(); SyncProgressChanged(30, "Synchronizing projects"); SynchronizeProjects().Wait(); SyncProgressChanged(20, "Synchronizing tasks"); SynchronizeTasks().Wait(); SyncProgressChanged(5, "Synchronizing time entry types"); SynchronizeTimeEntryTypes().Wait(); SyncProgressChanged(10, "Synchronizing local time entries"); SynchronizeTimeEntries().Wait(); SyncProgressChanged(20, "Synchronizing user statistics"); UserSession.UserStatistics = UserService.GetPerformanceInfo(UserSession); AppSettings.MinTimeEntryDate = UserService.GetTimeEntryMinStartDate(UserSession); }); } else { SyncProgressChanged(20, "Synchronizing companies"); await SynchronizeCompanies(); SyncProgressChanged(30, "Synchronizing projects"); await SynchronizeProjects(); SyncProgressChanged(20, "Synchronizing tasks"); await SynchronizeTasks(); SyncProgressChanged(5, "Synchronizing time entry types"); await SynchronizeTimeEntryTypes(); SyncProgressChanged(10, "Synchronizing local time entries"); await SynchronizeTimeEntries(); SyncProgressChanged(20, "Synchronizing user statistics"); UserSession.UserStatistics = UserService.GetPerformanceInfo(UserSession); AppSettings.MinTimeEntryDate = UserService.GetTimeEntryMinStartDate(UserSession); } SyncProgressChanged(10, "Synchronizing history list"); var numOfDaysBack = UserSession.UserPreferences.StatisticsNumOfDaysBack; var startTime = DateTime.Now.Date.AddDays(-numOfDaysBack); var endTime = DateTime.Now; var lastXDaysTimeEntries = await TimeEntryService.GetTimeEntriesByDate(startTime, endTime); var unsyncedTimeEntries = _timeEntryRepository.GetUnsyncedTimeEntries(); lastXDaysTimeEntries.AddRange(unsyncedTimeEntries.Where(x => !x.HasSyncError)); UserSession.UserStatistics.LastXDaysTimeEntries = lastXDaysTimeEntries; AppSettings.LastSyncDate = DateTime.Now; AppSettings.Save(); SyncProgressChanged(0, "Synchronization complete"); SyncInProgress = false; ForceResync = false; ApplicationCommands.SyncCompleted.Execute(null); } catch (NotFoundByGuidException notFoundByGuidException) { Logger.Error(notFoundByGuidException); SyncInProgress = false; _resyncCommand.Execute(null); } catch (MissingHieracleDataException missingHieracleDataException) { Logger.Error(missingHieracleDataException); if (!ForceResync) { SyncInProgress = false; _resyncCommand.Execute(null); } else { OnSyncFailed("Unknown Synchronization failure. Contact support"); } } catch (Exception ex) { if (ex is AggregateException) { var aggregateException = ex as AggregateException; foreach (var e in aggregateException.Flatten().InnerExceptions) { HandleSyncError(e); } } else { HandleSyncError(ex); } OnSyncFailed("Synchronization failed due to a connectivity error. The application will retry in " + AppSettings.SyncInterval.Minutes + " minutes."); } _busyService.HideBusy(_syncKey); }