Example #1
0
        internal static JobRun GetJobRun(CustomJob job, bool isRetry, IOrganizationService service,
                                         IOrganizationServiceFactory factory, CrmLog log)
        {
            try
            {
                log.LogFunctionStart();

                if (IsRecurrent(job, log))
                {
                    return(new RecurrentRunJob(job, service, log));
                }

                log.Log("Single run job.");

                JobTarget target;

                if (IsSingleOrNoTarget(job, log))
                {
                    target = new SingleTargetJob(job, service, factory, log);
                }
                else if (IsPaging(job, log))
                {
                    if (isRetry)
                    {
                        target = new PagingRetryJob(job, service, factory, log);
                    }
                    else
                    {
                        target = new PagingNormalJob(job, service, factory, log);
                    }
                }
                else
                {
                    if (isRetry)
                    {
                        target = new NoPagingRetryJob(job, service, factory, log);
                    }
                    else
                    {
                        target = new NoPagingNormalJob(job, service, factory, log);
                    }
                }

                return(new SingleRunJob(job, target, service, log));
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }
Example #2
0
        private static bool IsRecurrent(CustomJob job, CrmLog log)
        {
            try
            {
                log.LogFunctionStart();

                var isRecurrent = job.RecurrentJob == true;
                log.Log($"{isRecurrent}");
                return(isRecurrent);
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }
Example #3
0
        private static bool IsPaging(CustomJob job, CrmLog log)
        {
            try
            {
                log.LogFunctionStart();

                var isPaging = job.RecordsPerPage > 0;
                log.Log($"{isPaging}");
                return(isPaging);
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }
Example #4
0
        private static bool IsSingleOrNoTarget(CustomJob job, CrmLog log)
        {
            try
            {
                log.LogFunctionStart();

                var isSingleOrNoTarget = string.IsNullOrWhiteSpace(job.TargetLogicalName) ||
                                         job.TargetID?.Split(',').Length <= 1;
                log.Log($"{isSingleOrNoTarget}");
                return(isSingleOrNoTarget);
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }
        internal EntityReference RouteToRole(EntityReference recordRef, Guid?roleId, Entity record,
                                             Guid?defaultRoutingUser = null, bool isPickRegarding = true, bool isLeastLoadedRouting = false)
        {
            try
            {
                log.LogFunctionStart();

                if (roleId == null)
                {
                    throw new InvalidPluginExecutionException("Role in stage configuration is not set.");
                }

                var role = service.Retrieve(RoleConfiguration.EntityLogicalName, roleId.Value,
                                            new ColumnSet(RoleConfiguration.Fields.Type, RoleConfiguration.Fields.Queue,
                                                          RoleConfiguration.Fields.Team, RoleConfiguration.Fields.User)).ToEntity <RoleConfiguration>();

                log.Log("Retrieved role.", LogLevel.Debug);

                if (role.Type == null)
                {
                    throw new InvalidPluginExecutionException("Role type is not specified.");
                }

                log.LogLine();

                var owner = (EntityReference)record["ownerid"];

                switch (role.Type)
                {
                case RoleConfiguration.TypeEnum.Queue:
                    if (role.Queue == null)
                    {
                        throw new InvalidPluginExecutionException("Queue role is not set in role configuration.");
                    }

                    log.LogLine();

                    if (defaultRoutingUser.HasValue)
                    {
                        owner = new EntityReference(User.EntityLogicalName, defaultRoutingUser.Value);
                        AssignRecord(recordRef, owner);
                        log.Log($"Assigned record to default user: {defaultRoutingUser}");
                    }

                    AddToQueue(recordRef, role.Queue.Value);
                    log.Log($"Assigned to queue: {role.QueueName}");

                    // if 'pick record' is set in role config, then set it in task to assign the record to same user as task when picking
                    if (recordRef.LogicalName == Task.EntityLogicalName && isPickRegarding)
                    {
                        service.Update(new Task
                        {
                            Id         = recordRef.Id,
                            PickRecord = true
                        });
                        log.Log("Set 'pick record' flag to 'true'.");
                    }

                    break;

                case RoleConfiguration.TypeEnum.Team:
                    if (role.Team == null)
                    {
                        throw new InvalidPluginExecutionException("Team role is not set in role configuration.");
                    }

                    log.Log($"Record: {recordRef.Name}, ID: {recordRef.Id}"
                            + $". Team: {role.TeamName}" + (role.Team != null ? $", ID: {role.Team}" : ""));
                    owner = new EntityReference(Team.EntityLogicalName, role.Team.Value);

                    // check least loaded user
                    if (isLeastLoadedRouting)
                    {
                        var userId = GetLeastLoadedUser(role.Team.Value, record.LogicalName);

                        if (userId != null)
                        {
                            owner = new EntityReference(User.EntityLogicalName, userId.Value);
                            log.Log("Assigned to least loaded user.");
                        }
                    }

                    AssignRecord(recordRef, owner);
                    log.Log($"Assigned to team: {role.TeamName}");
                    break;

                case RoleConfiguration.TypeEnum.User:
                    if (role.User == null)
                    {
                        throw new InvalidPluginExecutionException("User role is not set in role configuration.");
                    }

                    log.LogLine();
                    owner = new EntityReference(User.EntityLogicalName, role.User.Value);
                    AssignRecord(recordRef, owner);
                    log.Log($"Assigned to user: {role.User}");
                    break;
                }

                return(owner);
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }
Example #6
0
        internal double GetSlaDuration(DateTime dateStartingTime, DateTime dateEndingTime, DurationUnit durationUnit)
        {
            try
            {
                log.LogFunctionStart();
                var nextDay             = dateStartingTime.AddDays(1);
                var durationInMinutes   = 0d;
                var dateStartingHours   = dateStartingTime.Hour;
                var dateStartingMinutes = dateStartingTime.Minute;

                var dateEndingHours   = dateEndingTime.Hour;
                var dateEndingMinutes = dateEndingTime.Minute;

                var vacations = GetVacations(dateStartingTime);

                var standardWorkingHours = GetStandardWorkingHours();

                var exceptionalWorkingHoursCollection = GetExceptionalWorkingHours();

                var nextdayWorkingHours = 0.0;

                if (dateStartingTime < dateEndingTime)
                {
                    //For First Day
                    var currentDayWorkingHours = GetDayWorkingHours(dateStartingTime, standardWorkingHours,
                                                                    exceptionalWorkingHoursCollection);

                    if (currentDayWorkingHours.Contains("ldv_workinghours"))
                    {
                        nextdayWorkingHours = double.Parse(currentDayWorkingHours["ldv_workinghours"].ToString());
                    }

                    if (currentDayWorkingHours.Contains("ldv_workinghoursend"))
                    {
                        //string hoursToText = ((Picklist)workingDays.Properties["ld_to"]).name;
                        var hoursFromText  = currentDayWorkingHours.FormattedValues["ldv_workinghoursstart"];
                        var hoursToText    = currentDayWorkingHours.FormattedValues["ldv_workinghoursend"];
                        var hoursFromParts = hoursFromText.Split(' ');
                        var hoursToParts   = hoursToText.Split(' ');
                        var hoursFrom      = double.Parse(hoursFromParts[0].Split(':')[0]);
                        var hoursTo        = double.Parse(hoursToParts[0].Split(':')[0]);
                        var minutesFrom    = double.Parse(hoursFromParts[0].Split(':')[1]);
                        var minutesTo      = double.Parse(hoursToParts[0].Split(':')[1]);

                        if (hoursFromParts[1].ToLower() == "pm" && hoursFrom != 12)
                        {
                            hoursFrom += 12;
                        }
                        if (minutesFrom == 30)
                        {
                            hoursFrom += 0.5;
                        }

                        if (hoursToParts[1].ToLower() == "pm" && hoursTo != 12)
                        {
                            hoursTo += 12;
                        }
                        if (minutesTo == 30)
                        {
                            hoursTo += 0.5;
                        }

                        if (!(IsVacation(dateStartingTime, currentDayWorkingHours, vacations)))
                        {
                            double sdt = (dateStartingHours * 60) + dateStartingMinutes;

                            if (dateStartingTime.Day != dateEndingTime.Day || dateStartingTime.Month != dateEndingTime.Month ||
                                dateStartingTime.Year != dateEndingTime.Year)
                            {
                                if (sdt < (hoursFrom * 60))
                                {
                                    durationInMinutes += nextdayWorkingHours * 60;
                                }
                                else if (sdt <= (hoursTo * 60))
                                {
                                    durationInMinutes += ((hoursTo - dateStartingHours) * 60) + ((0 - dateStartingMinutes));
                                }
                            }
                        }
                    }

                    //For the next Days
                    while (nextDay < dateEndingTime &&
                           ((nextDay.Day != dateEndingTime.Day && nextDay.Month == dateEndingTime.Month &&
                             nextDay.Year == dateEndingTime.Year) ||
                            (nextDay.Month != dateEndingTime.Month) ||
                            (nextDay.Year != dateEndingTime.Year)))
                    {
                        var nextDayWorkingHours = GetDayWorkingHours(nextDay, standardWorkingHours, exceptionalWorkingHoursCollection);

                        while (IsVacation(nextDay, nextDayWorkingHours, vacations))
                        {
                            nextDay             = nextDay.AddDays(1);
                            nextDayWorkingHours = GetDayWorkingHours(nextDay, standardWorkingHours, exceptionalWorkingHoursCollection);
                        }

                        if (nextDay < dateEndingTime &&
                            ((nextDay.Day != dateEndingTime.Day && nextDay.Month == dateEndingTime.Month &&
                              nextDay.Year == dateEndingTime.Year) ||
                             (nextDay.Month != dateEndingTime.Month) ||
                             (nextDay.Year != dateEndingTime.Year)))
                        {
                            if (nextDayWorkingHours.Contains("ldv_workinghours"))
                            {
                                nextdayWorkingHours = double.Parse(nextDayWorkingHours["ldv_workinghours"].ToString());
                            }

                            durationInMinutes += nextdayWorkingHours * 60;
                            nextDay            = nextDay.AddDays(1);
                        }
                    }

                    if (dateStartingTime.Day == dateEndingTime.Day && dateStartingTime.Month == dateEndingTime.Month &&
                        dateStartingTime.Year == dateEndingTime.Year)
                    {
                        currentDayWorkingHours = GetDayWorkingHours(dateStartingTime, standardWorkingHours,
                                                                    exceptionalWorkingHoursCollection);

                        if (!(IsVacation(dateStartingTime, currentDayWorkingHours, vacations)))
                        {
                            if (currentDayWorkingHours.Contains("ldv_workinghours"))
                            {
                                nextdayWorkingHours = double.Parse(currentDayWorkingHours["ldv_workinghours"].ToString());
                            }

                            if (currentDayWorkingHours.Contains("ldv_workinghoursstart") &&
                                currentDayWorkingHours.Contains("ldv_workinghoursend"))
                            {
                                //string hoursFromText = ((Picklist)workingDays.Properties["ld_from"]).name;
                                var hoursFromText  = currentDayWorkingHours.FormattedValues["ldv_workinghoursstart"];
                                var hoursToText    = currentDayWorkingHours.FormattedValues["ldv_workinghoursend"];
                                var hoursFromParts = hoursFromText.Split(' ');
                                var hoursToParts   = hoursToText.Split(' ');
                                var hoursFrom      = double.Parse(hoursFromParts[0].Split(':')[0]);
                                var hoursTo        = double.Parse(hoursToParts[0].Split(':')[0]);
                                var minutesFrom    = double.Parse(hoursFromParts[0].Split(':')[1]);
                                var minutesTo      = double.Parse(hoursToParts[0].Split(':')[1]);

                                if (hoursFromParts[1].ToLower() == "pm" && hoursFrom != 12)
                                {
                                    hoursFrom += 12;
                                }
                                if (minutesFrom == 30)
                                {
                                    hoursFrom += 0.5;
                                }

                                if (hoursToParts[1].ToLower() == "pm" && hoursTo != 12)
                                {
                                    hoursTo += 12;
                                }
                                if (minutesTo == 30)
                                {
                                    hoursTo += 0.5;
                                }

                                if (dateStartingTime.Day == dateEndingTime.Day &&
                                    dateStartingTime.Month == dateEndingTime.Month &&
                                    dateStartingTime.Year == dateEndingTime.Year)
                                {
                                    double sdt = (dateStartingHours * 60) + dateStartingMinutes;
                                    double edt = (dateEndingHours * 60) + dateEndingMinutes;

                                    if (sdt > (hoursFrom * 60) && edt < (hoursTo * 60))
                                    {
                                        durationInMinutes += ((dateEndingHours - dateStartingHours) * 60) + ((dateEndingMinutes - dateStartingMinutes));
                                    }
                                    else if (sdt >= (hoursFrom * 60) && edt >= (hoursTo * 60))
                                    {
                                        durationInMinutes += ((hoursTo - dateStartingHours) * 60) + ((0 - dateStartingMinutes));
                                    }
                                    else if (sdt <= (hoursFrom * 60) && edt < (hoursTo * 60))
                                    {
                                        durationInMinutes += ((dateEndingHours - hoursFrom) * 60) + ((dateEndingMinutes - 0));
                                    }
                                    else if (sdt < (hoursFrom * 60) && edt >= (hoursTo * 60))
                                    {
                                        durationInMinutes += nextdayWorkingHours * 60;
                                    }
                                }
                                else
                                {
                                    double edt = (dateEndingHours * 60) + dateEndingMinutes;

                                    durationInMinutes += ((((edt >= (hoursTo * 60)) ? hoursTo : dateEndingHours) - hoursFrom) * 60) +
                                                         ((edt >= (hoursTo * 60)) ? 0 : dateEndingMinutes);
                                }
                            }
                        }
                    }
                    else if (nextDay.Day == dateEndingTime.Day && nextDay.Month == dateEndingTime.Month &&
                             nextDay.Year == dateEndingTime.Year)
                    {
                        //Last Day
                        var lastDayWorkingHours = GetDayWorkingHours(nextDay, standardWorkingHours, exceptionalWorkingHoursCollection);


                        if (!IsVacation(nextDay, lastDayWorkingHours, vacations))
                        {
                            if (lastDayWorkingHours.Contains("ldv_workinghours"))
                            {
                                nextdayWorkingHours = double.Parse(lastDayWorkingHours["ldv_workinghours"].ToString());
                            }

                            if (lastDayWorkingHours.Contains("ldv_workinghoursstart") && lastDayWorkingHours.Contains("ldv_workinghoursend"))
                            {
                                //string hoursFromText = ((Picklist)workingDays.Properties["ld_from"]).name;
                                var hoursFromText  = lastDayWorkingHours.FormattedValues["ldv_workinghoursstart"];
                                var hoursToText    = lastDayWorkingHours.FormattedValues["ldv_workinghoursend"];
                                var hoursFromParts = hoursFromText.Split(' ');
                                var hoursToParts   = hoursToText.Split(' ');
                                var hoursFrom      = double.Parse(hoursFromParts[0].Split(':')[0]);
                                var hoursTo        = double.Parse(hoursToParts[0].Split(':')[0]);
                                var minutesFrom    = double.Parse(hoursFromParts[0].Split(':')[1]);
                                var minutesTo      = double.Parse(hoursToParts[0].Split(':')[1]);

                                if (hoursFromParts[1].ToLower() == "pm" && hoursFrom != 12)
                                {
                                    hoursFrom += 12;
                                }
                                if (minutesFrom == 30)
                                {
                                    hoursFrom += 0.5;
                                }

                                if (hoursToParts[1].ToLower() == "pm" && hoursTo != 12)
                                {
                                    hoursTo += 12;
                                }
                                if (minutesTo == 30)
                                {
                                    hoursTo += 0.5;
                                }

                                if (dateStartingTime.Day == dateEndingTime.Day &&
                                    dateStartingTime.Month == dateEndingTime.Month &&
                                    dateStartingTime.Year == dateEndingTime.Year)
                                {
                                    double sdt = (dateStartingHours * 60) + dateStartingMinutes;
                                    double edt = (dateEndingHours * 60) + dateEndingMinutes;

                                    if (sdt > (hoursFrom * 60) && edt < (hoursTo * 60))
                                    {
                                        durationInMinutes += ((dateEndingHours - dateStartingHours) * 60) + ((dateEndingMinutes - dateStartingMinutes));
                                    }
                                    else if (sdt >= (hoursFrom * 60) && edt >= (hoursTo * 60))
                                    {
                                        durationInMinutes += ((hoursTo - dateStartingHours) * 60) + ((0 - dateStartingMinutes));
                                    }
                                    else if (sdt <= (hoursFrom * 60) && edt < (hoursTo * 60))
                                    {
                                        durationInMinutes += ((dateEndingHours - hoursFrom) * 60) + ((dateEndingMinutes - 0));
                                    }
                                    else if (sdt < (hoursFrom * 60) && edt >= (hoursTo * 60))
                                    {
                                        durationInMinutes += nextdayWorkingHours * 60;
                                    }
                                }
                                else
                                {
                                    double edt = (dateEndingHours * 60) + dateEndingMinutes;

                                    durationInMinutes += ((((edt >= (hoursTo * 60)) ? hoursTo : dateEndingHours) - hoursFrom) * 60) +
                                                         ((edt >= (hoursTo * 60)) ? 0 : dateEndingMinutes);
                                }
                            }
                        }
                    }
                }


                //To return the duration
                if (durationInMinutes == 0)
                {
                    return(0);
                }

                var returnDuration = 0d;

                switch (durationUnit)
                {
                case DurationUnit.HOURS:
                    returnDuration = durationInMinutes / 60.0;
                    break;

                case DurationUnit.MINUTES:
                    returnDuration = durationInMinutes;
                    break;

                case DurationUnit.SECONDS:
                    returnDuration = durationInMinutes * 60.0;
                    break;
                }

                return(returnDuration < 0 ? 0 : returnDuration);
            }
            catch (Exception ex)
            {
                log.Log(ex);
                throw;
            }
            finally
            {
                log.LogFunctionEnd();
            }
        }