Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
        }