Example #1
0
        public void Edit()
        {
            var timeEntry = TimeEntryService.Add(new TimeEntry()
            {
                IsBillable  = true,
                CreatedWith = "TogglAPI.Net",
                Duration    = 900,
                Start       = DateTime.Now.ToIsoDateStr(),
                WorkspaceId = DefaultWorkspaceId
            });

            Assert.IsNotNull(timeEntry);

            var loadedTimeEntry = TimeEntryService.Get(timeEntry.Id.Value);

            Assert.IsNotNull(loadedTimeEntry);

            loadedTimeEntry.Duration = 1200;
            var editedTimeEntry = TimeEntryService.Edit(loadedTimeEntry);

            Assert.AreEqual(timeEntry.Id, editedTimeEntry.Id);
            Assert.AreEqual(timeEntry.IsBillable, editedTimeEntry.IsBillable);
            Assert.AreEqual(timeEntry.CreatedWith, editedTimeEntry.CreatedWith);
            Assert.AreEqual(loadedTimeEntry.Duration, editedTimeEntry.Duration);
            Assert.AreEqual(timeEntry.WorkspaceId, editedTimeEntry.WorkspaceId);
        }
Example #2
0
        private async Task <bool> GetData()
        {
            List <TimeSheetInfo> result = await TimeSheetService.GetRecentTimeSheetInformation();

            viewModel.PastPeriods = new ObservableCollection <TimeSheetPeriod>();
            var settings = await TimeEntryService.Get();

            bool UseHoursMinutes = false;

            if (settings != null)
            {
                UseHoursMinutes = settings.UseHoursMinutesInput;
            }
            if (result != null && result.Count > 0)
            {
                lstAllPeriod.Children.Clear();

                for (int i = 0; i <= result.Count - 1; i++)
                {
                    var item = result[i];
                    if (i == 0)
                    {
                        viewModel.CurrentPeriod.StartDate           = item.StartDate;
                        viewModel.CurrentPeriod.EndDate             = item.EndDate;
                        viewModel.CurrentPeriod.ActualHours         = (item.ActualHoursNotOnTimeSheet ?? 0);
                        viewModel.CurrentPeriod.ActualHoursFormated = string.IsNullOrEmpty(item.ActualHoursNotOnTimeSheetFormattedString) ? (UseHoursMinutes ? "00:00" : "0") : item.ActualHoursNotOnTimeSheetFormattedString;
                        viewModel.CurrentPeriod.Status           = 0;
                        viewModel.CurrentPeriod.TimeEntries      = item.TimeSheet != null ? item.TimeSheet.TimeEntries : null;
                        viewModel.CurrentPeriod.ShowSubmitButton = true;
                        //viewModel.CurrentPeriod.Name = "";
                        if (item.AllTimeSheetsForPeriod != null && item.AllTimeSheetsForPeriod.Count > 0)
                        {
                            foreach (var ts in item.AllTimeSheetsForPeriod)
                            {
                                AddTimeSheet(ts);
                            }
                        }
                    }
                    else
                    {
                        AddPreviousTimeSheets(item);
                    }
                }


                if (viewModel.PastPeriods == null || viewModel.PastPeriods.Count() == 0)
                {
                    lblNoPreviousRecords.IsVisible = true;
                }
                else
                {
                    lblNoPreviousRecords.IsVisible = false;
                }

                int count = 0;
                foreach (var item in viewModel.PastPeriods)
                {
                    count++;

                    if (count == viewModel.PastPeriods.Count)
                    {
                        PreviousPeriods_GeneratedRows(item, true);
                    }
                    else
                    {
                        PreviousPeriods_GeneratedRows(item);
                    }
                }
            }
            return(true);
        }
        public void GetTimeEntryByID(int id)
        {
            var entry = timeEntrySrv.Get(id);

            Assert.IsTrue(entry.Id == id);
        }
        private async void LoadData()
        {
            viewModel.VisibleLoad = true;

            viewModel.CurrentPeriod = tsp;
            if (IsCurrent)
            {
                List <TimeSheetInfo> result = await TimeSheetService.GetRecentTimeSheetInformation();

                var settings = await TimeEntryService.Get();

                bool UseHoursMinutes = false;
                if (settings != null)
                {
                    UseHoursMinutes = settings.UseHoursMinutesInput;
                }
                if (result != null && result.Count > 0)
                {
                    lstAllPeriod.Children.Clear();
                    viewModel.CurrentPeriod = new TimeSheetPeriod();
                    for (int i = 0; i <= result.Count - 1; i++)
                    {
                        var item = result[i];
                        if (i == 0)
                        {
                            viewModel.CurrentPeriod.StartDate           = item.StartDate;
                            viewModel.CurrentPeriod.EndDate             = item.EndDate;
                            viewModel.CurrentPeriod.ActualHours         = (item.ActualHoursNotOnTimeSheet ?? 0);
                            viewModel.CurrentPeriod.ActualHoursFormated = string.IsNullOrEmpty(item.ActualHoursNotOnTimeSheetFormattedString) ? (UseHoursMinutes ? "00:00" : "0") : item.ActualHoursNotOnTimeSheetFormattedString;
                            viewModel.CurrentPeriod.Status           = 0;
                            viewModel.CurrentPeriod.TimeEntries      = item.TimeSheet != null ? item.TimeSheet.TimeEntries : null;
                            viewModel.CurrentPeriod.ShowSubmitButton = true;

                            viewModel.CurrentPeriod.RequiresApprovalFromCurrentUser = false;
                            var timeEntries = TimeEntryService.client.GetByUserUnsubmittedForDateRange(viewModel.CurrentPeriod.StartDate, viewModel.CurrentPeriod.EndDate, modelProperties: new ProjectInsight.Models.Base.ModelProperties("default,Name,Task_Id,ToDo_Id,Issue_Id,Company_Id"));
                            viewModel.TimeEntries = timeEntries;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            else
            {
                if (viewModel.CurrentPeriod != null)
                {
                    if (viewModel.CurrentPeriod.TimeSheetId.HasValue)
                    {
                        try
                        {
                            var ts = await TimeSheetService.client.GetAsync(viewModel.CurrentPeriod.TimeSheetId.Value, new ProjectInsight.Models.Base.ModelProperties(
                                                                                "default,UserApprover,ApprovalStatusDescription,RequiresApprovalFromCurrentUser,User,TimeEntries;TimeEntry:default,Name,Task_Id,ToDo_Id,Issue_Id,Company_Id;User:default,Photo,PhotoUrl,PhotoMediumUrl,PhotoThumbnailUrl,AvatarHtml"));

                            viewModel.TimeEntries        = ts.TimeEntries;
                            viewModel.CurrentPeriod.Name = ts.User.FirstName + " " + ts.User.LastName;
                            viewModel.CurrentPeriod.RequiresApprovalFromCurrentUser = ts.RequiresApprovalFromCurrentUser ?? false;
                            viewModel.CurrentPeriod.ActualHoursFormated             = ts.ActualHoursFormattedString;
                            viewModel.timeSheet = ts;

                            viewModel.ShowStatus = true;
                            int status = ts.ApprovalStatus ?? 0;
                            //----------------------
                            if (status == 5)
                            {
                                statusIcon.Source = "approved"; // "timesheet_approved.png";
                            }
                            else if (status == 6)
                            {
                                statusIcon.Source = "rejected";//"timesheet_rejected.png";
                            }
                            else
                            {
                                statusIcon.Source = "pending"; //"timesheet_pending.png";
                            }
                            slAvatar.Children.Clear();
                            if (string.IsNullOrEmpty(ts.UserApprover.PhotoUrl))
                            {
                                if (!string.IsNullOrEmpty(ts.UserApprover.AvatarHtml))
                                {
                                    string userHTML = ts.UserApprover.AvatarHtml;
                                    //"<div class=\"user-avatar\" title=\"Gjoko Veljanoski\" style=\"background-color:#00bfff\">GV</div>"
                                    //<img class="user-avatar" src="/ProjectInsight.WebApp/Sites/Files/a222e57233a14e15ab67d25e6dbab95e/UserPhotos/6fcc5602c49043c3a2d8d39175040e68/tn_avatar.png" alt="Gjoko Veljanoski" title="Gjoko Veljanoski" />
                                    string       myDiv = ts.UserApprover.AvatarHtml;
                                    HtmlDocument doc   = new HtmlDocument();
                                    doc.LoadHtml(myDiv);
                                    HtmlNode node           = doc.DocumentNode.SelectSingleNode("div");
                                    string   AvatarInitials = "US";
                                    string   AvatarColor    = "#fff";
                                    string   PhotoURL       = string.Empty;

                                    if (node != null)
                                    {
                                        AvatarInitials = (node.ChildNodes[0]).OuterHtml;
                                        foreach (HtmlAttribute attr in node.Attributes)
                                        {
                                            if (attr.Name.ToLower() == "style")
                                            {
                                                string[] parts = attr.Value.Split('#');
                                                if (parts != null && parts.Length > 1)
                                                {
                                                    AvatarColor = parts[1];
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        HtmlNode node2 = doc.DocumentNode.SelectSingleNode("img");
                                        if (node2 != null)
                                        {
                                            foreach (HtmlAttribute attr in node2.Attributes)
                                            {
                                                if (attr.Name.ToLower() == "src")
                                                {
                                                    string imageUrl = attr.Value.Replace("/ProjectInsight.WebApp", "");
                                                    PhotoURL = Common.CurrentWorkspace.WorkspaceURL + imageUrl;
                                                }
                                            }
                                        }
                                    }

                                    if (string.IsNullOrEmpty(PhotoURL))
                                    {
                                        slAvatar.BackgroundColor = Color.FromHex(AvatarColor);

                                        Label lbInitials = new Label();
                                        lbInitials.HeightRequest           = 50;
                                        lbInitials.WidthRequest            = 50;
                                        lbInitials.HorizontalOptions       = LayoutOptions.CenterAndExpand;
                                        lbInitials.VerticalOptions         = LayoutOptions.CenterAndExpand;
                                        lbInitials.HorizontalTextAlignment = TextAlignment.Center;
                                        lbInitials.VerticalTextAlignment   = TextAlignment.Center;
                                        lbInitials.TextColor = Color.White;
                                        lbInitials.Text      = AvatarInitials;
                                        lbInitials.FontSize  = 26;
                                        if (Device.RuntimePlatform.ToLower() == "android")
                                        {
                                            lbInitials.FontFamily = "OpenSans-SemiBold.ttf#Open Sans";
                                        }
                                        else
                                        {
                                            lbInitials.FontFamily = "OpenSans-SemiBold";
                                        }
                                        slAvatar.Children.Add(lbInitials);
                                    }
                                    else
                                    {
                                        Image photo = new Image();
                                        photo.Source            = ImageSource.FromUri(new Uri(Common.CurrentWorkspace.WorkspaceURL + ts.UserApprover.PhotoUrl));
                                        photo.HeightRequest     = 50;
                                        photo.WidthRequest      = 50;
                                        photo.HorizontalOptions = LayoutOptions.CenterAndExpand;
                                        photo.VerticalOptions   = LayoutOptions.CenterAndExpand;
                                        slAvatar.Children.Add(photo);
                                    }
                                    slStatus.Children.Add(slAvatar);
                                }
                            }
                            else
                            {
                                Image photo = new Image();
                                photo.Source        = ImageSource.FromUri(new Uri(Common.CurrentWorkspace.WorkspaceURL + ts.UserApprover.PhotoUrl));
                                photo.HeightRequest = 50;
                                photo.WidthRequest  = 50;
                                //photo.HorizontalOptions = LayoutOptions.CenterAndExpand;
                                photo.VerticalOptions = LayoutOptions.CenterAndExpand;
                                slAvatar.Children.Add(photo);
                            }
                            //----------------------
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                    else
                    {
                        try
                        {
                            viewModel.CurrentPeriod.RequiresApprovalFromCurrentUser = false;
                            var timeEntries = TimeEntryService.client.GetByUserUnsubmittedForDateRange(viewModel.CurrentPeriod.StartDate, viewModel.CurrentPeriod.EndDate, modelProperties: new ProjectInsight.Models.Base.ModelProperties("default,Name,Task_Id,ToDo_Id,Issue_Id,Company_Id"));
                            viewModel.TimeEntries = timeEntries;
                            //viewModel.CurrentPeriod.ShowSubmitButton = true;
                            slCreateTimeEntry.IsVisible = false;
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
                else
                {
                    if (tId != null)
                    {
                        viewModel.CurrentPeriod = new TimeSheetPeriod();
                        var ts = TimeSheetService.client.Get(tId, new ProjectInsight.Models.Base.ModelProperties("default,RequiresApprovalFromCurrentUser,User,TimeEntries;TimeEntry:default,Name,Task_Id,ToDo_Id,Issue_Id,Company_Id;User:FirstName,LastName;"));
                        viewModel.CurrentPeriod.Name = ts.User.FirstName + " " + ts.User.LastName;
                        viewModel.CurrentPeriod.RequiresApprovalFromCurrentUser = ts.RequiresApprovalFromCurrentUser ?? false;
                        viewModel.CurrentPeriod.TimeSheetId         = ts.Id;
                        viewModel.CurrentPeriod.StartDate           = ts.StartDate.Value;
                        viewModel.CurrentPeriod.EndDate             = ts.EndDate.Value;
                        viewModel.CurrentPeriod.ActualHours         = ts.ActualHours;
                        viewModel.CurrentPeriod.ActualHoursFormated = ts.ActualHoursFormattedString;
                        viewModel.CurrentPeriod.Status      = ts.ApprovalStatus;
                        viewModel.CurrentPeriod.TimeEntries = ts.TimeEntries;
                        viewModel.CurrentPeriod.User_Id     = ts.User_Id;
                        viewModel.timeSheet   = ts;
                        viewModel.TimeEntries = ts.TimeEntries;

                        if (viewModel.CurrentPeriod.ShowPendingApprovalIcon && viewModel.CurrentPeriod.User_Id == Common.CurrentWorkspace.UserID)
                        {
                            ToolbarItems.Add(new ToolbarItem()
                            {
                                Text = "", Icon = "unsubmit_icon.png", Command = new Command(this.btnDeleteTimesheet_Clicked)
                            });
                        }
                    }
                }
            }
            if (viewModel.TimeEntries != null && viewModel.TimeEntries.Count > 0)
            {
                GenerateTimeEntryGrid();
            }

            viewModel.VisibleLoad = false;
        }
        async void Project_OnSelectionChanged(object sender, EventArgs e)
        {
            if (viewModel.SelectedProject == null || viewModel.SelectedProject.Name.Equals(TAG_NO_SELECTION))
            {
                rowTask.IsVisible = false;
            }
            else
            {
                viewModel.CompanyError = false;
                viewModel.ProjectError = false;
                rowTask.IsVisible      = true;
            }
            if (selTask != null || viewModel.ProjectInitialBinding || viewModel.SelectedProject == null || viewModel.SelectedProject.Name.Equals(TAG_NO_SELECTION))

            {
                viewModel.ProjectInitialBinding = false;
                return;
            }

            try
            {
                viewModel.TaskInitialBinding = true;

                viewModel.VisibleLoad    = true;
                viewModel.LoadingMessage = "";

                // viewModel.SelectedTask = null;
                viewModel.SelectedExpenseCode = null;



                if (viewModel.SelectedProject == null || viewModel.SelectedProject.Name.Equals(TAG_NO_SELECTION))
                {
                    inputSettings = await TimeEntryService.Get(selectedProjectId : null);
                }
                else
                {
                    inputSettings = await TimeEntryService.Get(selectedProjectId : viewModel.SelectedProject.Id);
                }



                setModelsByTimeEntryService(2);
                //viewModel.Tasks =  new ObservableCollection<ProjectInsight.Models.Tasks.Task>(inputSettings.TaskList);


                viewModel.SelectedTask = viewModel.Tasks.Where(x => x.Id == inputSettings.SelectedTaskId).FirstOrDefault();
                if (!inputSettings.SelectedTaskId.HasValue)
                {
                    viewModel.TaskInitialBinding = false;
                }


                viewModel.SelectedExpenseCode = viewModel.ExpenseCodes.Where(x => x.Id == inputSettings.SelectedTimeEntryExpenseCodeId).FirstOrDefault();

                viewModel.ShowTimeInHours    = inputSettings.UseHoursMinutesInput;
                viewModel.ShowTimeInDecimals = !inputSettings.UseHoursMinutesInput;

                //if (inputSettings.SelectedProjectTimeEntryInputSettings != null)
                //    viewModel.ShowBillableCheckboxInput = inputSettings.SelectedProjectTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                if (inputSettings.SelectedTaskId.HasValue)
                {
                    if (inputSettings.SelectedTaskTimeEntryInputSettings != null && inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                    {
                        viewModel.ShowBillableCheckboxInput = inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                    }
                }
                else
                {
                    if (inputSettings.SelectedProjectId.HasValue)
                    {
                        if (inputSettings.SelectedProjectTimeEntryInputSettings != null && inputSettings.SelectedProjectTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                        {
                            viewModel.ShowBillableCheckboxInput = inputSettings.SelectedProjectTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                        }
                    }
                    else
                    {
                        if (inputSettings.SelectedCompanyId.HasValue)
                        {
                            if (inputSettings.SelectedCompanyTimeEntryInputSettings != null && inputSettings.SelectedCompanyTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                            {
                                viewModel.ShowBillableCheckboxInput = inputSettings.SelectedCompanyTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                            }
                        }
                    }
                }

                viewModel.VisibleLoad = false;
            }
            catch (Exception ex)
            {
            }
        }
        private async Task <bool> GetSettings()
        {
            try
            {
                inputSettings = await TimeEntryService.Get(
                    selectedCompanyId : viewModel.SelectedCompany != null?viewModel.SelectedCompany.Id : null,
                    selectedProjectId : viewModel.SelectedProject != null?viewModel.SelectedProject.Id : null);



                if (inputSettings.EnableTimeEntry == false)
                {
                    viewModel.VisibleLoad = false;
                    //    Common.Instance.ShowToastMessage("Time entry is not enabled!", DoubleResources.DangerSnackBar);
                    return(false);
                }

                if (selTask == null)
                {
                    //set Default Value
                    setModelsByTimeEntryService();


                    if (inputSettings.SelectedCompanyId.HasValue)
                    {
                        viewModel.SelectedCompany = viewModel.Companies.Where(x => x.Id == inputSettings.SelectedCompanyId).FirstOrDefault();
                    }

                    if (inputSettings.SelectedProjectId.HasValue)
                    {
                        viewModel.SelectedProject = viewModel.Projects.Where(x => x.Id == inputSettings.SelectedProjectId).FirstOrDefault();
                        rowTask.IsVisible         = true;
                    }
                    else
                    {
                        rowTask.IsVisible = false;
                    }

                    if (inputSettings.SelectedTaskId.HasValue)
                    {
                        viewModel.SelectedTask = viewModel.Tasks.Where(x => x.Id == inputSettings.SelectedTaskId).FirstOrDefault();

                        if (inputSettings.SelectedTaskTimeEntryInputSettings != null && inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                        {
                            viewModel.ShowBillableCheckboxInput = inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                            viewModel.IsBillable = inputSettings.SelectedTaskTimeEntryInputSettings.IsBillableDefaultOn.Value;
                            //viewModel.ShowBillableCheckboxInput = false;
                        }
                    }
                    else
                    {
                        if (inputSettings.SelectedProjectId.HasValue)
                        {
                            if (inputSettings.SelectedProjectTimeEntryInputSettings != null && inputSettings.SelectedProjectTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                            {
                                viewModel.ShowBillableCheckboxInput = inputSettings.SelectedProjectTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                                viewModel.IsBillable = inputSettings.SelectedProjectTimeEntryInputSettings.IsBillableDefaultOn.Value;
                            }
                        }
                        else
                        {
                            if (inputSettings.SelectedCompanyId.HasValue)
                            {
                                if (inputSettings.SelectedCompanyTimeEntryInputSettings != null && inputSettings.SelectedCompanyTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                                {
                                    viewModel.ShowBillableCheckboxInput = inputSettings.SelectedCompanyTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                                    viewModel.IsBillable = inputSettings.SelectedCompanyTimeEntryInputSettings.IsBillableDefaultOn.Value;
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (inputSettings.SelectedTaskTimeEntryInputSettings != null && inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.HasValue)
                    {
                        viewModel.ShowBillableCheckboxInput = inputSettings.SelectedTaskTimeEntryInputSettings.ShowBillableCheckboxInput.Value;
                        viewModel.IsBillable = inputSettings.SelectedTaskTimeEntryInputSettings.IsBillableDefaultOn.Value;
                    }
                }

                List <ProjectInsight.Models.ReferenceData.ExpenseCode> expenseCodes = await ExpenseCodeService.GetActive();

                viewModel.ExpenseCodes = new ObservableCollection <ProjectInsight.Models.ReferenceData.ExpenseCode>(expenseCodes);
                //viewModel.ExpenseCodes = new ObservableCollection<ProjectInsight.Models.ReferenceData.ExpenseCode>();
                //foreach (var item in expenseCodes)
                //    viewModel.ExpenseCodes.Add(item);

                viewModel.SelectedExpenseCode = viewModel.ExpenseCodes.Where(x => x.Id == inputSettings.SelectedTimeEntryExpenseCodeId).FirstOrDefault();

                viewModel.ShowTimeInHours    = inputSettings.UseHoursMinutesInput;
                viewModel.ShowTimeInDecimals = !inputSettings.UseHoursMinutesInput;
            }
            catch (Exception ex)
            {
                return(false);
            }
            return(true);
        }