예제 #1
0
        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);
        }