public SMSJob SaveSMSJob(SMSJob job, string auditUser) { var numbers = Rp.ExecuteAction( () => ProxylessContext.HotelDetails.Where(h => h.PKID == job.FKHotel) .SelectMany(h => h.SMSWelcomeRequestType.SMSNumbers.Select(n => n.PhoneNumber))); SortedSet <SmsTimeSlot> timeslots = null; var taskStart = DateTime.UtcNow.AddMinutes(-1); var tasks = Rp.ExecuteAction(() => ProxylessContext.SMSTasks.Where(x => numbers.Contains(x.FromPhone) && x.RunAt > taskStart && x.Status == SMSTaskStatus.SCHEDULED)).ToList(); var existing = Rp.ExecuteAction(() => ProxylessContext.SMSJobs.Where(x => x.PKID == job.PKID)).FirstOrDefault(); if (existing == null) { job.CreatedOn = DateTime.UtcNow; job.Status = SMSJobStatus.INCOMPLETE; var availableNumbers = numbers.ToList(); job.SMSTasks.ForEach(t => { t.Status = SMSTaskStatus.SCHEDULED; t.Message = t.Message.Replace("{FirstName}", t.FirstName).Replace("{LastName}", t.LastName); var timeslot = GetNextAvailableTaskTimeslot(availableNumbers, t.RunAt.ToUniversalTime(), t.Message.Length, tasks, ref timeslots); t.FromPhone = timeslot.Item1; t.RunAt = timeslot.Item2; t.StatusLastUpdated = DateTime.UtcNow; }); } else { return(null); } if (job.SMSJobCallbacks.All(x => x.Url != "https://Connect.Monscierge.com/ConnectCMS/Request/NotifyTaskChanged")) { job.SMSJobCallbacks.Add(new SMSJobCallback { Url = "https://Connect.Monscierge.com/ConnectCMS/Request/NotifyTaskChanged" }); } ProxylessContext.SMSJobs.Add(job); ProxylessContext.LogValidationFailSaveChanges(string.Format(auditUser)); SmsTaskTopicSender.GetHandle().NotifySmsTaskInserted(); return(job); }
public SMSTask RetrySMSTask(int userId, int taskId) { if (CheckSMSTaskPermission(userId, taskId).Result != PermissionResults.Authorized) { return(null); } var task = GetSMSTask(taskId).Include(t => t.SMSJob).Include(t => t.SMSJob.SMSJobCallbacks).FirstOrDefault(); if (task == null) { return(null); } var nowWithBuffer = DateTime.UtcNow.AddMinutes(-1); var scheduledTasks = GetSMSJobs(task.SMSJob.FKHotel) .SelectMany( j => j.SMSTasks.Where(t => t.Status == SMSTaskStatus.SCHEDULED && t.RunAt > nowWithBuffer)).ToList(); var hotel = RootRepository.HotelRepository.GetHotelQuery(task.SMSJob.FKHotel).Include(x => x.HotelDetail.SMSWelcomeRequestType.SMSNumbers).FirstOrDefault(); var numbers = hotel.HotelDetail.SMSWelcomeRequestType.SMSNumbers.Select(n => n.PhoneNumber).ToList(); SortedSet <SmsTimeSlot> timeslots = null; var timeslot = GetNextAvailableTaskTimeslot(numbers, DateTime.UtcNow, task.Message.Length, scheduledTasks, ref timeslots); task.RunAt = timeslot.Item2; task.FromPhone = timeslot.Item1; task.Status = SMSTaskStatus.SCHEDULED; task.StatusMessage = null; task.MessageId = null; task.StatusLastUpdated = DateTime.UtcNow; if (task.SMSJob.SMSJobCallbacks.All(x => x.Url != "https://Connect.Monscierge.com/ConnectCMS/Request/NotifyTaskChanged")) { task.SMSJob.SMSJobCallbacks.Add(new SMSJobCallback { Url = "https://Connect.Monscierge.com/ConnectCMS/Request/NotifyTaskChanged" }); } ProxylessContext.LogValidationFailSaveChanges(string.Format("CU|{0}", userId)); SmsTaskTopicSender.GetHandle().NotifySmsTaskInserted(); return(task); }
public SMSJob CancelSMSJob(int userId, int jobId) { if (CheckSMSJobPermission(userId, jobId).Result != PermissionResults.Authorized) { return(null); } var job = GetSMSJob(jobId).Include(x => x.SMSTasks); var tasks = job.SelectMany(x => x.SMSTasks.Where(t => t.Status == SMSTaskStatus.SCHEDULED)).ToList(); if (tasks.Count <= 0) { return(null); } tasks.ForEach(t => { t.Status = SMSTaskStatus.CANCELLED; t.StatusLastUpdated = DateTime.UtcNow; }); ProxylessContext.LogValidationFailSaveChanges(string.Format("CU|{0}", userId)); SmsTaskTopicSender.GetHandle().NotifySmsTaskInserted(); return(job.FirstOrDefault()); }