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);
        }
Ejemplo n.º 6
0
 public SendSMSView(SendSMSViewModel viewModel)
 {
     InitializeComponent();
     this.DataContext      = viewModel;
     viewModel.CloseAction = new Action(this.Close);
 }