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(); } }
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(); } }
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(); } }
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(); } }
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(); } }