public async Task <UserInvite> CreateInvite(InviteViewModel inviteVM) { var invite = new UserInvite() { Email = inviteVM.InviteEmail, PracticeId = (await _context.Practices.Where(prac => prac.SubscriberPractices.Any(sp => sp.SubscriberUserId == _userProvider.GetUserId())).SingleAsync()).Id, CreationDate = _dateProvider.GetCurrentDateTime(), Code = _inviteCodeProvider.GetNewInviteCode(), Used = false }; _context.UserInvites.Add(invite); await _context.SaveChangesAsync(); return(invite); }
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); }