public async Task <IActionResult> SendMessages([FromBody] SendSMSViewModel vm) { var smsGroupSendResult = await _clientRelationsService.SendSMS(vm); return(Json(new JsonResponse(smsGroupSendResult.Error == null, smsGroupSendResult.Error) { ReturnData = Url.Action(nameof(ClientRelationsController.MessageGroupDetails), "ClientRelations", new { id = smsGroupSendResult.Id }, protocol: HttpContext.Request.Scheme) })); }
public void GivenValidSettings_SendSms_SendsSms() { var smsTaskMock = new Mock <ISmsTask>(); smsTaskMock.Setup(task => task.CanSendSms).Returns(true); var sut = new SendSMSViewModel(smsTaskMock.Object, CreateSettingsService("phone", "plate")); sut.SendSmsCommand.Execute(FareType.Area1Time1Hour); smsTaskMock.Verify(task => task.SendSms("phone", "404 plate"), Times.Once); }
public void GivenInvalidSettings_SendSms_DoesntSendSms(ISettingsService settingsService) { var smsTaskMock = new Mock <ISmsTask>(); smsTaskMock.Setup(task => task.CanSendSms).Returns(true); var sut = new SendSMSViewModel(smsTaskMock.Object, settingsService); sut.SendSmsCommand.Execute(FareType.Area1Time1Hour); smsTaskMock.Verify(task => task.SendSms(It.IsAny <string>(), It.IsAny <string>()), Times.Never); }
public ActionResult CreateSms(SendSMSViewModel tblSend) { if (ModelState.IsValid) { if (_dbManager.SendSMS(tblSend.CellNumber, tblSend.Message, User.Identity.Name)) { TempData["Success"] = "Message was successfully sent"; } else { TempData["Error"] = "An error occured while sending the message"; } } return(RedirectToAction("CreateSms")); }
public async Task <SMSGroupSendResult> SendSMS(SendSMSViewModel vm) { var practice = await _context.Practices.FilterByCurrentUserManagedPractices(_userProvider.GetUserId()).Include(p => p.MessagePurchases).Include(p => p.MessageGroupSendResults).SingleOrDefaultAsync(); int smsPerNumber = vm.Message.Length < 160 ? 1 : (int)Math.Floor((double)vm.Message.Length / 153); var smsNumRequired = vm.Numbers.Count(n => !vm.Numbers.Contains(n)) * smsPerNumber; SMSGroupSendResult result; List <SMSSendResult> results = new List <SMSSendResult>(); if (practice == null) { result = new SMSGroupSendResult() { SubscriberUserId = _userProvider.GetUserId(), Error = "This user is not a practice manager, or the practice could not be found.", TotalSucceeded = 0 }; } else if (practice.GetMsgQuota(PurchaseType.SMS, _dateProvider.GetCurrentDateTime()) < smsNumRequired) { result = new SMSGroupSendResult() { PracticeId = practice.Id, Error = "Insufficient SMS credit available.", TotalSucceeded = 0 }; } else { List <string> existingNumbers = await _context.ClientUsers.Where(c => c.PhoneNumberConfirmed).Select(c => c.PhoneNumber).ToListAsync(); await Task.WhenAll( vm.Numbers .Where( n => !existingNumbers.Contains(n)) .Select( async n => { var userCode = _inviteCodeProvider.GetNewInviteCode(10); results.Add( (await _smsSender.SendSmsAsync(n, vm.Message, userCode, vm.From)) ); } ) ); result = new SMSGroupSendResult() { SubscriberUserId = _userProvider.GetUserId(), PracticeId = practice.Id, TotalRequested = vm.Numbers.Count(), TotalExisting = existingNumbers.Count(n => vm.Numbers.Contains(n)), TotalSucceeded = results.Where(r => r.Success).Count(), TotalFailed = results.Where(r => !r.Success).Count() }; } practice.MessageGroupSendResults.Add(result); foreach (SMSSendResult smr in results) { result.SendResults.Add(smr); } int numberToUse = result.TotalSucceeded * smsPerNumber; var messagePurchases = practice .MessagePurchases.Where(mp => mp.PurchaseType == PurchaseType.SMS && (!mp.DoExpire || mp.ExpiryDate.CompareTo(_dateProvider.GetCurrentDateTime()) > 0) && mp.MessagesRemaining() > 0) .OrderBy(mp => mp.ExpiryDate).ToList(); int i = 0; while (numberToUse > 0 && i < messagePurchases.Count) { var currentMP = messagePurchases.ElementAt(i); if (currentMP.MessagesRemaining() >= numberToUse) { currentMP.NumberUsed = currentMP.NumberUsed + numberToUse; numberToUse = 0; } else { numberToUse = numberToUse - currentMP.MessagesRemaining(); currentMP.NumberUsed = currentMP.NumberPurchased; } i++; } await _context.SaveChangesAsync(); return(result); }
public SendSMSView(SendSMSViewModel viewModel) { InitializeComponent(); this.DataContext = viewModel; viewModel.CloseAction = new Action(this.Close); }