示例#1
0
        private void onTimeEntryDeleted(long id)
        {
            var viewModel = TimeEntries.Select(c => c.SingleOrDefault(vm => vm.Id == id)).SingleOrDefault(vm => vm != null);

            if (viewModel == null)
            {
                return;
            }

            var collection = TimeEntries.SingleOrDefault(c => c.Date == viewModel.Start.Date);

            if (collection == null)
            {
                return;
            }

            collection.Remove(viewModel);
            var indexToInsert = TimeEntries.IndexOf(collection);

            TimeEntries.Remove(collection);

            if (collection.Count > 0)
            {
                var newCollection = new TimeEntryViewModelCollection(collection.Date.DateTime, collection);
                TimeEntries.Insert(indexToInsert, newCollection);
            }

            RaisePropertyChanged(nameof(IsEmpty));
        }
示例#2
0
        void btn_ok_Click(object sender, EventArgs e)
        {
            ComboBox       cb_project    = (ComboBox)panel_context.Controls["cb_project"];
            DateTimePicker dtp_time      = (DateTimePicker)panel_context.Controls["dtp_time"];
            ComboBox       cb_activity   = (ComboBox)panel_context.Controls["cb_activity"];
            MaskedTextBox  mtb_time      = (MaskedTextBox)panel_context.Controls["mtb_time"];
            TextBox        tb_context    = (TextBox)panel_context.Controls["tb_context"];
            TimeEntries    timet_entries = new TimeEntries();

            timet_entries.project_id  = cb_project.SelectedValue.ToString();
            timet_entries.spent_on    = dtp_time.Text;
            timet_entries.activity_id = cb_activity.SelectedValue.ToString();
            timet_entries.hours       = mtb_time.Text;
            if (".".Equals(timet_entries.hours))
            {
                MessageBox.Show("请填写工时!");
                return;
            }
            else if (timet_entries.hours.EndsWith("."))
            {
                timet_entries.hours = timet_entries.hours.Substring(0, timet_entries.hours.Length - 1);
            }
            timet_entries.comments = tb_context.Text;
            try
            {
                service.timet_entries(timet_entries);
                MessageBox.Show("打卡成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
示例#3
0
        private void onTimeEntryUpdated(EntityUpdate <IThreadSafeTimeEntry> update)
        {
            var timeEntry     = update.Entity;
            var shouldBeAdded = timeEntry != null && !timeEntry.IsRunning() && !timeEntry.IsDeleted;

            var oldCollectionIndex = TimeEntries.IndexOf(c => c.Any(vm => vm.Id == update.Id));
            var collectionIndex    = TimeEntries.IndexOf(vm => vm.Date == timeEntry.Start.LocalDateTime.Date);
            var wasMovedIntoDifferentCollection = oldCollectionIndex >= 0 && oldCollectionIndex != collectionIndex;

            var shouldBeRemoved = shouldBeAdded == false || wasMovedIntoDifferentCollection;

            if (shouldBeRemoved)
            {
                safeRemoveTimeEntry(update.Id);
            }

            if (shouldBeAdded)
            {
                var timeEntryIndex = collectionIndex < 0 ? -1 : TimeEntries[collectionIndex].IndexOf(vm => vm.Id == update.Id);
                var timeEntryExistsInTheCollection = timeEntryIndex >= 0;
                if (timeEntryExistsInTheCollection)
                {
                    var timeEntryViewModel = new TimeEntryViewModel(timeEntry, durationFormat);
                    TimeEntries.ReplaceInChildCollection(collectionIndex, timeEntryIndex, timeEntryViewModel);
                    return;
                }

                safeInsertTimeEntry(timeEntry);
            }
        }
 public ActionResult LogOff()
 {
     // TODO: Clock out...
     TimeEntries.ClockOut(User.Identity.GetUserId());
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
     return(RedirectToAction("Index", "Timesheet"));
 }
示例#5
0
 /// <summary>
 /// Updates all of the time entries provided
 /// </summary>
 /// <param name="val">the time entries you want to update</param>
 public void UpdateTimeEntries(TimeEntries val)
 {
     foreach (TimeEntry entry in val.data)
     {
         UpdateTimeEntry(entry);
     }
 }
示例#6
0
        private void onTimeEntryUpdated(EntityUpdate <IThreadSafeTimeEntry> update)
        {
            var timeEntry = update.Entity;

            if (timeEntry == null)
            {
                return;
            }

            if (timeEntry.IsDeleted || timeEntry.IsRunning())
            {
                onTimeEntryRemoved(timeEntry.Id);
            }
            else
            {
                var timeEntryViewModel = new TimeEntryViewModel(timeEntry, durationFormat);
                if (timeEntry.Id == timeEntryToDelete?.Id)
                {
                    // Ignore this update because the entity is hidden and might be deleted unless the user
                    // undoes the action. In that case bring the time entry but with the updated data.
                    timeEntryToDelete = timeEntryViewModel;
                }
                else
                {
                    TimeEntries.UpdateItem(update.Id, timeEntryViewModel);
                }
            }
        }
示例#7
0
 public List <string> MonthEmployers(DateTime Month)
 {
     return(TimeEntries.Where(entry => entry.Start.Month == Month.Month && entry.Start.Year == Month.Year)
            .Select(entry => entry.Employer)
            .Distinct()
            .ToList());
 }
        private void addTimeEntries(TimeEntryViewModelCollection collection)
        {
            IsWelcome = false;

            TimeEntries.Add(collection);

            RaisePropertyChanged(nameof(IsEmpty));
        }
示例#9
0
        private void onTimeEntryRemoved(long id)
        {
            var index = TimeEntries.IndexOf(id);

            if (index.HasValue)
            {
                TimeEntries.RemoveItemAt(index.Value.Section, index.Value.Row);
            }
        }
示例#10
0
 protected virtual void ClearNavigationProperties()
 {
     Project = null;
     Tag     = null;
     User    = null;
     TimeEntries.Clear();
     Tasks1.Clear();
     Tasks.Clear();
 }
示例#11
0
        private void insertNewTimeEntryGroup(IThreadSafeTimeEntry timeEntry, DateTime indexDate)
        {
            var timeEntryToAdd = new TimeEntryViewModel(timeEntry, durationFormat);
            var newCollection  = new TimeEntryViewModelCollection(indexDate, new[] { timeEntryToAdd }, durationFormat);
            var foundIndex     = TimeEntries.IndexOf(TimeEntries.FirstOrDefault(x => x.Date < indexDate));
            var indexToInsert  = foundIndex == -1 ? TimeEntries.Count : foundIndex;

            TimeEntries.Insert(indexToInsert, newCollection);
        }
示例#12
0
 protected virtual void ClearNavigationProperties()
 {
     InvoiceFiles.Clear();
     InvoiceLines.Clear();
     TimeEntries.Clear();
     User = null;
     CustomerInvoiceGroup = null;
     CreditNote.Clear();
     InvoiceComments.Clear();
 }
示例#13
0
        private void cancelDeleteTimeEntry()
        {
            if (!TimeEntries.IndexOf(timeEntryToDelete.Id).HasValue)
            {
                TimeEntries.InsertItem(timeEntryToDelete);
            }

            timeEntryToDelete = null;
            delayedDeletionDisposable.Dispose();
            showUndoSubject.OnNext(false);
        }
示例#14
0
        public long DurationInSeconds()
        {
            long seconds  = TimeEntries.Sum(timeEntry => timeEntry.DurationInSeconds());
            long duration = seconds + TimeDifference;

            if (duration > 0)
            {
                return(duration);
            }
            return(0);
        }
        public async Task <ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            //

            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, change to shouldLockout: true
            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout : false);

            switch (result)
            {
            case SignInStatus.Success:
                if (returnUrl == null)
                {
                    returnUrl = "~/Timesheet";
                }
                string userId = SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.GetUserId();
                //checking here for soft deletes
                var teacherService = new TeacherService(new HomeworkHotlineEntities());
                var teacher        = teacherService.GetById(userId);
                if (teacher == null)     //teacher is deleted
                {
                    ModelState.AddModelError("", "Invalid login attempt.");
                    LogOff();
                    return(View(model));
                }
                TimeEntry openTimeEntry = TimeEntries.GetOpenTimeEntriesByUser(userId);
                if (openTimeEntry != null && openTimeEntry.EntryDate.Value.Date == DateTime.Today)   //user is still logged in for today, redirect to timesheets without logging in a second time.
                {
                    return(RedirectToLocal(returnUrl));
                }
                if (openTimeEntry != null && openTimeEntry.EntryDate.Value.Date < DateTime.Today)    //user is still logged in for yesterday, log out, back in and redirect to timesheets
                {
                    TimeEntries.ClockOutAtEndOfDay(userId, openTimeEntry);
                }
                TimeEntries.ClockIn(userId);
                return(RedirectToLocal(returnUrl));

            case SignInStatus.LockedOut:
                return(View("Lockout"));

            case SignInStatus.RequiresVerification:
                return(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }));

            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return(View(model));
            }
        }
示例#16
0
        private async Task fetchSectionedTimeEntries()
        {
            var groupedEntries = await interactorFactory.GetAllTimeEntriesVisibleToTheUser().Execute()
                                 .Select(entries => entries
                                         .Where(isNotRunning)
                                         .Where(timeEntry => timeEntry.Id != timeEntryToDelete?.Id)
                                         .Select(te => new TimeEntryViewModel(te, durationFormat))
                                         );

            TimeEntries.ReplaceWith(groupedEntries);
        }
示例#17
0
        private IObservable <Unit> cancelDeleteTimeEntry()
        {
            if (!TimeEntries.IndexOf(timeEntryToDelete.Id).HasValue)
            {
                TimeEntries.InsertItem(timeEntryToDelete);
            }

            timeEntryToDelete = null;
            delayedDeletionDisposable.Dispose();
            showUndoSubject.OnNext(false);
            return(Observable.Return(Unit.Default));
        }
示例#18
0
 private static void Output(TimeEntries entries)
 {
     foreach (TimeEntry entry in entries.data)
     {
         string output = string.Format("Desc: {0} Start: {1} Stop: {2} ID: {3} Duration: {4}",
                                       entry.description,
                                       entry.start,
                                       entry.stop,
                                       entry.id,
                                       entry.duration);
         Console.WriteLine(output);
     }
 }
示例#19
0
        private void ExcludeTimeEntry(TimeEntryListItemViewModel timeEntry)
        {
            if (timeEntry.TimeEntry.IsStopped)
            {
                return;
            }

            _dataService.ExcludeTimeEntry(timeEntry.TimeEntry);

            TimeEntries.Remove(timeEntry);
            InternalCommands.GenerateInvoiceLines.Execute(null);
            //_invoiceService.RecalculateInvoice(SelectedInvoice.Invoice);
        }
示例#20
0
 protected virtual void ClearNavigationProperties()
 {
     Customers.Clear();
     Invoices.Clear();
     Projects.Clear();
     Tasks.Clear();
     TimeEntries.Clear();
     TimeEntries1.Clear();
     UsersCustomers.Clear();
     Projects1.Clear();
     Customers_1.Clear();
     InvoiceComments.Clear();
 }
示例#21
0
        public TimeEntriesViewModel(
            ITogglDataSource dataSource,
            IInteractorFactory interactorFactory,
            IAnalyticsService analyticsService,
            ISchedulerProvider schedulerProvider,
            IRxActionFactory rxActionFactory,
            ITimeService timeService)
        {
            Ensure.Argument.IsNotNull(dataSource, nameof(dataSource));
            Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory));
            Ensure.Argument.IsNotNull(analyticsService, nameof(analyticsService));
            Ensure.Argument.IsNotNull(schedulerProvider, nameof(schedulerProvider));
            Ensure.Argument.IsNotNull(rxActionFactory, nameof(rxActionFactory));
            Ensure.Argument.IsNotNull(timeService, nameof(timeService));

            this.interactorFactory = interactorFactory;
            this.analyticsService  = analyticsService;
            this.schedulerProvider = schedulerProvider;

            DelayDeleteTimeEntries = rxActionFactory.FromAction <long[]>(delayDeleteTimeEntries);
            ToggleGroupExpansion   = rxActionFactory.FromAction <GroupId>(toggleGroupExpansion);
            CancelDeleteTimeEntry  = rxActionFactory.FromAction(cancelDeleteTimeEntry);

            groupsFlatteningStrategy = new TimeEntriesGroupsFlattening(timeService);

            var deletingOrPressingUndo = timeEntriesPendingDeletionSubject.SelectUnit();
            var collapsingOrExpanding  = ToggleGroupExpansion.Elements;

            var visibleTimeEntries = interactorFactory.ObserveAllTimeEntriesVisibleToTheUser().Execute()
                                     .Select(timeEntries => timeEntries.Where(isNotRunning))
                                     .ReemitWhen(deletingOrPressingUndo)
                                     .Select(timeEntries => timeEntries.Where(isNotDeleted))
                                     .Select(group)
                                     .ReemitWhen(collapsingOrExpanding);

            TimeEntries = Observable.CombineLatest(
                visibleTimeEntries,
                dataSource.Preferences.Current,
                groupsFlatteningStrategy.Flatten)
                          .AsDriver(schedulerProvider);

            Empty = TimeEntries
                    .Select(groups => groups.None())
                    .AsDriver(schedulerProvider);

            Count = TimeEntries
                    .Select(log => log.Sum(day => day.Items.Count))
                    .AsDriver(schedulerProvider);

            TimeEntriesPendingDeletion = timeEntriesPendingDeletionSubject.AsObservable().AsDriver(schedulerProvider);
        }
示例#22
0
        private async Task reset()
        {
            TimeEntries.Clear();

            var timeEntries = await dataSource.TimeEntries.GetAll();

            timeEntries
            .Where(isNotRunning)
            .OrderByDescending(te => te.Start)
            .Select(te => new TimeEntryViewModel(te))
            .GroupBy(te => te.Start.LocalDateTime.Date)
            .Select(grouping => new TimeEntryViewModelCollection(grouping.Key, grouping))
            .ForEach(addTimeEntries);
        }
示例#23
0
        private void safeRemoveTimeEntry(long id)
        {
            var collectionIndex = TimeEntries.IndexOf(c => c.Any(vm => vm.Id == id));

            if (collectionIndex < 0)
            {
                return;
            }

            var item = TimeEntries[collectionIndex].First(vm => vm.Id == id);

            TimeEntries.RemoveFromChildCollection(collectionIndex, item);
            RaisePropertyChanged(nameof(IsEmpty));
        }
示例#24
0
        public static async void Logout()
        {
            await RestApi.Logout();

            RestApi               = new RestApi();
            UserData              = new UserDataToggl();
            UserPresentationData  = new UserPresentationData();
            ActualRunningTaskData = new TaskPresentationLayout();
            Workspaces            = new List <WorkspaceToggl>();
            Projects              = new List <ProjectToggl>();
            TimeEntries           = new List <TimeEntries>();
            RunningTask           = new TimeEntries();
            History               = new List <HistoryRowPresentationData>();
        }
示例#25
0
        public long DurationInSeconds(DateTime date)
        {
            long seconds =
                TimeEntries
                .Where(timeEntry => timeEntry.Start.Date.Equals(date.Date) || timeEntry.Stop.Date.Equals(date.Date))
                .Sum(timeEntry => timeEntry.DurationInSeconds());
            long duration = seconds + TimeDifference;

            if (duration > 0)
            {
                return(duration);
            }
            return(0);
        }
示例#26
0
        public virtual void RemoveTimeEntry(int timeEntryId)
        {
            var timeEntry = TimeEntries.Single(te => te.Id == timeEntryId);

            if (timeEntry == null)
            {
                throw new EntityDeleteException("Timeentry not found in task: " + timeEntryId);
            }

            if (timeEntry.Invoice != null)
            {
                throw new EntityDeleteException("Timeentry cannot be deleted when billed: Id:" + timeEntry.Id);
            }

            TimeEntries.Remove(timeEntry);
        }
示例#27
0
        private void safeInsertTimeEntry(IThreadSafeTimeEntry timeEntry)
        {
            var indexDate       = timeEntry.Start.LocalDateTime.Date;
            var collectionIndex = TimeEntries.IndexOf(x => x.Date.LocalDateTime == indexDate);
            var groupExists     = collectionIndex >= 0;

            if (groupExists)
            {
                insertTimeEntryInGroup(timeEntry, collectionIndex);
            }
            else
            {
                insertNewTimeEntryGroup(timeEntry, indexDate);
            }

            RaisePropertyChanged(nameof(IsEmpty));
        }
示例#28
0
        public TimeSpan GetWorkedTime()
        {
            long totalTicksWorked = 0;
            var  orderedTimes     = TimeEntries.OrderBy(time => time.DateHourPointed).ToList();

            if (orderedTimes.Count > 0)
            {
                int lastIndex = orderedTimes.Count % 2 == 0 ? orderedTimes.Count : orderedTimes.Count - 1;

                for (int index = 0; index < lastIndex; index += 2)
                {
                    totalTicksWorked += orderedTimes[index + 1].DateHourPointed.Ticks - orderedTimes[index].DateHourPointed.Ticks;
                }
            }

            return(TimeSpan.FromTicks(totalTicksWorked));
        }
示例#29
0
        private void ExecuteGetInvoicesFromMany(ObservableCollection <CustomersInvoiceView> t)
        {
            try
            {
                var tmp = new ObservableCollection <int>();
                foreach (var customerInvoiceView in t)
                {
                    tmp.Add(customerInvoiceView.CustomerID);
                }

                _dataService.GetInvoicesByCustomerId(tmp).Subscribe(i =>
                {
                    if (i != null)
                    {
                        Invoices = SeeAll == true ? TakeAll(i) : TakeOnlyNoneClosed(i);

                        if (_lastInvoiceSelectedId != null &&
                            Invoices.Select(id => id.Id).Contains(_lastInvoiceSelectedId))
                        {
                            SelectedInvoice = Invoices.First(x => x.Id == _lastInvoiceSelectedId);
                        }

                        if (SelectedInvoice != null && _lastInvoiceSelectedId != null)
                        {
                            LoadInvoiceLines(SelectedInvoice);
                            LoadTimeEntries(SelectedInvoice);
                        }
                        else
                        {
                            TimeEntries.Clear();
                            InvoiceLines.Clear();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Something went wrong in a call on the server", "Error", MessageBoxButton.OK);
                    }
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                throw;
            }
        }
示例#30
0
        private async Task fetchSectionedTimeEntries()
        {
            var timeEntries = await interactorFactory.GetAllNonDeletedTimeEntries().Execute();

            if (timeEntries == null)
            {
                TimeEntries.Clear();
                return;
            }

            var groupedEntries = timeEntries
                                 .Where(isNotRunning)
                                 .OrderByDescending(te => te.Start)
                                 .Select(te => new TimeEntryViewModel(te, durationFormat))
                                 .GroupBy(te => te.StartTime.LocalDateTime.Date)
                                 .Select(grouping => new TimeEntryViewModelCollection(grouping.Key, grouping, durationFormat));

            TimeEntries.ReplaceWith(groupedEntries);
        }