示例#1
0
        public static ConcurrentDictionary <string, short> GetFinalTeamHrsMins(TeamHours th)
        {
            ConcurrentDictionary <string, short> FinalDictObj = new ConcurrentDictionary <string, short>();

            //For Email Hours
            if (th.Fields.EmailAdjustedHours > 0 || th.Fields.EmailAdjustedMinutes > 0)
            {
                FinalDictObj.TryAdd("FinalEmailHrs", th.Fields.EmailAdjustedHours);
                FinalDictObj.TryAdd("FinalEmailMins", th.Fields.EmailAdjustedMinutes);
            }
            else
            {
                FinalDictObj.TryAdd("FinalEmailHrs", th.Fields.EmailHours);
                FinalDictObj.TryAdd("FinalEmailMins", th.Fields.EmailMinutes);
            }
            //For Meeting Hours
            if (th.Fields.MeetingAdjustedHours > 0 || th.Fields.MeetingAdjustedMinutes > 0)
            {
                FinalDictObj.TryAdd("FinalMeetingHrs", th.Fields.MeetingAdjustedHours);
                FinalDictObj.TryAdd("FinalMeetingMins", th.Fields.MeetingAdjustedMinutes);
            }
            else
            {
                FinalDictObj.TryAdd("FinalMeetingHrs", th.Fields.MeetingHours);
                FinalDictObj.TryAdd("FinalMeetingMins", th.Fields.MeetingMinutes);
            }
            //For Other Hours
            if (th.Fields.OtherAdjustedHours > 0 || th.Fields.OtherAdjustedMinutes > 0)
            {
                FinalDictObj.TryAdd("FinalOtherHrs", th.Fields.OtherAdjustedHours);
                FinalDictObj.TryAdd("FinalOtherMins", th.Fields.OtherAdjustedMinutes);
            }
            else
            {
                FinalDictObj.TryAdd("FinalOtherHrs", th.Fields.OtherHours);
                FinalDictObj.TryAdd("FinalOtherMins", th.Fields.OtherMinutes);
            }

            // Total Calculation
            var Mins      = FinalDictObj["FinalEmailMins"] + FinalDictObj["FinalMeetingMins"] + FinalDictObj["FinalOtherMins"];
            var totalMins = Mins % 60;
            var totalHrs  = FinalDictObj["FinalEmailHrs"] + FinalDictObj["FinalMeetingHrs"] + FinalDictObj["FinalOtherHrs"] + Mins / 60;

            FinalDictObj.TryAdd("FinalTotalHrs", (short)totalHrs);
            FinalDictObj.TryAdd("FinalTotalMins", (short)totalMins);

            return(FinalDictObj);
        }
        private async Task <string> SubmitHoursAsync(IEnumerable <WorkHours> workHoursToSubmit, string userObjectIdentifier, GraphResultItem managerOfUser)
        {
            var completedSubmit = String.Empty;

            if (workHoursToSubmit == null)
            {
                throw new ArgumentNullException(nameof(workHoursToSubmit));
            }
            var workHoursToSubmitList = workHoursToSubmit.ToList();

            if (workHoursToSubmitList?.Count == 0)
            {
                return(completedSubmit);                                   // Nothing to do
            }
            if (String.IsNullOrEmpty(userObjectIdentifier))
            {
                return(completedSubmit);                                            // Nothing to do
            }
            var workHoursListCollectionPage = new ListCollectionPage <WorkHours>();
            var teamHoursSiteList           = new SiteList();

            if (managerOfUser == null)
            {
                // Skip manager by passing report hours identifier as manager identifier and handling that when building the models for the report by setting the manager display name to blank
                managerOfUser = new GraphResultItem
                {
                    Id          = "",
                    DisplayName = ""
                };

                teamHoursSiteList = await _graphSharePointService.GetSiteListAsync("entries", ListSchema.ReportHoursListSchema);
            }

            var managerObjectIdentifier = managerOfUser.Id;

            // Get the SpSiteList, if the list does not exists, it will create one
            var workHoursSiteList = workHoursListCollectionPage.SiteList;

            if (String.IsNullOrEmpty(workHoursSiteList.ListId))
            {
                workHoursSiteList = await _graphSharePointService.GetSiteListAsync(userObjectIdentifier, ListSchema.WorkHoursListSchema);
            }
            if (!String.IsNullOrEmpty(managerObjectIdentifier))
            {
                teamHoursSiteList = await _graphSharePointService.GetSiteListAsync(managerObjectIdentifier, ListSchema.TeamHoursListSchema);
            }

            var teamHoursRow         = new TeamHours();
            var submittedDate        = DateTime.Now;
            var hasRequestedRevision = false;
            var workHoursDate        = DateTime.Now;

            foreach (var workHours in workHoursToSubmit)
            {
                // Only count not submitted and requieres revision
                if (workHours.Fields.ItemState == ItemState.NotSubmitted || workHours.Fields.ItemState == ItemState.RequiresRevision)
                {
                    //Update the workHoursDate so we can assamble the message of the notification
                    workHoursDate = DateTime.ParseExact(workHours.Fields.Date, "yyyyMMdd", CultureInfo.InvariantCulture);

                    // To track if there is an entry that has a requiered revision
                    if (!hasRequestedRevision && workHours.Fields.ItemState == ItemState.RequiresRevision)
                    {
                        hasRequestedRevision = true;
                    }

                    teamHoursRow.Fields.Date             = workHours.Fields.Date;
                    teamHoursRow.Fields.ObjectIdentifier = workHours.Fields.ObjectIdentifier;

                    teamHoursRow.Fields.MeetingHours   += workHours.Fields.MeetingHours;
                    teamHoursRow.Fields.MeetingMinutes += workHours.Fields.MeetingMinutes;

                    if (workHours.Fields.MeetingAdjustedHours != 0 || workHours.Fields.MeetingAdjustedMinutes != 0)
                    {
                        teamHoursRow.Fields.MeetingAdjustedHours   += workHours.Fields.MeetingAdjustedHours;
                        teamHoursRow.Fields.MeetingAdjustedMinutes += workHours.Fields.MeetingAdjustedMinutes;
                    }
                    else
                    {
                        teamHoursRow.Fields.MeetingAdjustedHours   += workHours.Fields.MeetingHours;
                        teamHoursRow.Fields.MeetingAdjustedMinutes += workHours.Fields.MeetingMinutes;
                    }

                    teamHoursRow.Fields.EmailHours   += workHours.Fields.EmailHours;
                    teamHoursRow.Fields.EmailMinutes += workHours.Fields.EmailMinutes;

                    if (workHours.Fields.EmailAdjustedHours != 0 || workHours.Fields.EmailAdjustedMinutes != 0)
                    {
                        teamHoursRow.Fields.EmailAdjustedHours   += workHours.Fields.EmailAdjustedHours;
                        teamHoursRow.Fields.EmailAdjustedMinutes += workHours.Fields.EmailAdjustedMinutes;
                    }
                    else
                    {
                        teamHoursRow.Fields.EmailAdjustedHours   += workHours.Fields.EmailHours;
                        teamHoursRow.Fields.EmailAdjustedMinutes += workHours.Fields.EmailMinutes;
                    }

                    teamHoursRow.Fields.OtherHours   += workHours.Fields.OtherHours;
                    teamHoursRow.Fields.OtherMinutes += workHours.Fields.OtherMinutes;

                    if (workHours.Fields.OtherAdjustedHours != 0 || workHours.Fields.OtherAdjustedMinutes != 0)
                    {
                        teamHoursRow.Fields.OtherAdjustedHours   += workHours.Fields.OtherAdjustedHours;
                        teamHoursRow.Fields.OtherAdjustedMinutes += workHours.Fields.OtherAdjustedMinutes;
                    }
                    else
                    {
                        teamHoursRow.Fields.OtherAdjustedHours   += workHours.Fields.OtherHours;
                        teamHoursRow.Fields.OtherAdjustedMinutes += workHours.Fields.OtherMinutes;
                    }

                    teamHoursRow.Fields.TeamHoursItemState = ItemState.NotSubmitted;
                    teamHoursRow.Fields.ItemState          = ItemState.Submitted;
                    teamHoursRow.Fields.SubmittedDate      = submittedDate;

                    // Create JSON object to update WORK HOURS (aka employee entries) in SharePoint
                    dynamic workHoursFieldsObject = new JObject();
                    if (String.IsNullOrEmpty(managerObjectIdentifier))
                    {
                        // Skip submit to manager and send to HR since user does not has manager
                        workHoursFieldsObject.TeamHoursItemState     = ItemState.Submitted.ToString();
                        workHoursFieldsObject.TeamHoursSubmittedDate = submittedDate;
                    }
                    workHoursFieldsObject.ItemState     = ItemState.Submitted.ToString();
                    workHoursFieldsObject.SubmittedDate = submittedDate;

                    dynamic workHoursRootObject = new JObject();
                    workHoursRootObject.fields = workHoursFieldsObject;

                    // Update List Item in WorkHours List
                    await _graphSharePointService.UpdateSiteListItemAsync(workHoursSiteList, workHours.Id, workHoursRootObject.ToString());
                }
            }

            if (teamHoursRow.Fields.ObjectIdentifier != null)
            {
                // Adjust minutes to hours due the sum (above)
                var timeSpan = new TimeSpan(teamHoursRow.Fields.MeetingHours, teamHoursRow.Fields.MeetingMinutes, 0);
                teamHoursRow.Fields.MeetingHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.MeetingMinutes = Convert.ToInt16(timeSpan.Minutes);

                timeSpan = new TimeSpan(teamHoursRow.Fields.MeetingAdjustedHours, teamHoursRow.Fields.MeetingAdjustedMinutes, 0);
                teamHoursRow.Fields.MeetingAdjustedHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.MeetingAdjustedMinutes = Convert.ToInt16(timeSpan.Minutes);

                timeSpan = new TimeSpan(teamHoursRow.Fields.EmailHours, teamHoursRow.Fields.EmailMinutes, 0);
                teamHoursRow.Fields.EmailHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.EmailMinutes = Convert.ToInt16(timeSpan.Minutes);

                timeSpan = new TimeSpan(teamHoursRow.Fields.EmailAdjustedHours, teamHoursRow.Fields.EmailAdjustedMinutes, 0);
                teamHoursRow.Fields.EmailAdjustedHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.EmailAdjustedMinutes = Convert.ToInt16(timeSpan.Minutes);

                timeSpan = new TimeSpan(teamHoursRow.Fields.OtherHours, teamHoursRow.Fields.OtherMinutes, 0);
                teamHoursRow.Fields.OtherHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.OtherMinutes = Convert.ToInt16(timeSpan.Minutes);

                timeSpan = new TimeSpan(teamHoursRow.Fields.OtherAdjustedHours, teamHoursRow.Fields.OtherAdjustedMinutes, 0);
                teamHoursRow.Fields.OtherAdjustedHours   = Convert.ToInt16(timeSpan.Hours + (timeSpan.Days * 24));
                teamHoursRow.Fields.OtherAdjustedMinutes = Convert.ToInt16(timeSpan.Minutes);


                // Create JSON object to add a new list item in team Hours list in SharePoint
                dynamic teamHoursFieldsObject = new JObject();
                teamHoursFieldsObject.ObjectIdentifier       = teamHoursRow.Fields.ObjectIdentifier;
                teamHoursFieldsObject.Date                   = teamHoursRow.Fields.Date;
                teamHoursFieldsObject.MeetingHours           = teamHoursRow.Fields.MeetingHours;
                teamHoursFieldsObject.MeetingMinutes         = teamHoursRow.Fields.MeetingMinutes;
                teamHoursFieldsObject.MeetingAdjustedHours   = teamHoursRow.Fields.MeetingAdjustedHours;
                teamHoursFieldsObject.MeetingAdjustedMinutes = teamHoursRow.Fields.MeetingAdjustedMinutes;
                teamHoursFieldsObject.EmailHours             = teamHoursRow.Fields.EmailHours;
                teamHoursFieldsObject.EmailMinutes           = teamHoursRow.Fields.EmailMinutes;
                teamHoursFieldsObject.EmailAdjustedHours     = teamHoursRow.Fields.EmailAdjustedHours;
                teamHoursFieldsObject.EmailAdjustedMinutes   = teamHoursRow.Fields.EmailAdjustedMinutes;
                teamHoursFieldsObject.OtherHours             = teamHoursRow.Fields.OtherHours;
                teamHoursFieldsObject.OtherMinutes           = teamHoursRow.Fields.OtherMinutes;
                teamHoursFieldsObject.OtherAdjustedHours     = teamHoursRow.Fields.OtherAdjustedHours;
                teamHoursFieldsObject.OtherAdjustedMinutes   = teamHoursRow.Fields.OtherAdjustedMinutes;
                teamHoursFieldsObject.AdjustedHoursReason    = "" + teamHoursRow.Fields.AdjustedHoursReason;
                if (String.IsNullOrEmpty(managerObjectIdentifier))
                {
                    // Skip submit to manager and send to HR since user does not has manager
                    teamHoursFieldsObject.TeamHoursItemState     = ItemState.Submitted.ToString();
                    teamHoursFieldsObject.TeamHoursSubmittedDate = submittedDate;
                }
                else
                {
                    teamHoursFieldsObject.TeamHoursItemState = teamHoursRow.Fields.TeamHoursItemState.ToString();
                }
                teamHoursFieldsObject.ItemState     = teamHoursRow.Fields.ItemState.ToString();
                teamHoursFieldsObject.SubmittedDate = teamHoursRow.Fields.SubmittedDate;

                dynamic teamHoursRootObject = new JObject();
                teamHoursRootObject.fields = teamHoursFieldsObject;

                // If submit is not due to a request revision, create team hours entry otherwise we only update the existing one
                if (hasRequestedRevision)
                {
                    // Update existing team hours entry (this is the case for requesting revision)
                    List <QueryOption> options = new List <QueryOption>();
                    options.Add(new QueryOption("filter", @"startswith(fields/Date,'" + teamHoursRow.Fields.Date + "') and startswith(fields/ObjectIdentifier,'" + teamHoursRow.Fields.ObjectIdentifier + "')"));

                    var teamHoursResults = await _graphSharePointService.GetSiteListItemsAsync(teamHoursSiteList, options);

                    var updateResults = await _graphSharePointService.UpdateSiteListItemAsync(teamHoursSiteList, teamHoursResults[0].Id, teamHoursRootObject.ToString());
                }
                else
                {
                    // Create List Item in TeamHours list
                    var createResults = await _graphSharePointService.CreateSiteListItemAsync(teamHoursSiteList, teamHoursRootObject.ToString());
                }

                completedSubmit = "OK";


                // Create notification and send email
                //var messageBody = _workflowServiceHelper.ComposeMessageBody(NotificationType.SubmitWorkHours, workHoursDate);
                //await _workflowServiceHelper.SendNotificationAsync(managerOfUser, NotificationType.SubmitWorkHours, messageBody);

                return(completedSubmit);
            }

            return("Nothing to Submit");
        }