Exemplo n.º 1
0
        private OutboundCallQueueListModel OutboundCallQueueListModel(IEnumerable <CallQueueCustomer> callQueueCustomers, string customerTags)
        {
            var customerIds = callQueueCustomers.Where(cqc => cqc.CustomerId.HasValue && cqc.CustomerId.Value > 0).Select(cqc => cqc.CustomerId.Value).ToArray();
            IEnumerable <Customer> customers = null;

            if (customerIds.Any())
            {
                customerIds = customerIds.Distinct().ToArray();
                customers   = _customerRepository.GetCustomers(customerIds);
            }

            var prospectCustomers = _prospectCustomerRepository.GetProspectCustomersByCustomerIds(customerIds);

            var callQueueCustomerCalls = _callCenterCallRepository.GetCallForHealtPlanCallQueueCustomer(customerIds, customerTags);

            IEnumerable <CallCenterNotes> callCenterNotes = null;

            if (callQueueCustomerCalls != null && callQueueCustomerCalls.Any())
            {
                callCenterNotes = _callCenterNotesRepository.GetByCallIds(callQueueCustomerCalls.Select(s => s.CallId));
            }

            var corporateCustomTags = _corporateCustomerCustomTagRepository.GetByCustomerIds(customerIds);

            return(_outboundCallQueueListModelFactory.SystemGeneratedCallQueueCustomers(callQueueCustomers, customers, prospectCustomers, callQueueCustomerCalls, callCenterNotes, null, null, corporateCustomTags));
        }
Exemplo n.º 2
0
        public ListModelBase <CallQueueExcludedCustomerReportModel, CallQueueExcludedCustomerReportModelFilter> GetCallQueueExcludedCustomerReport(int pageNumber, int pageSize, ModelFilterBase filter, out int totalRecords)
        {
            var callQueueFilter = filter as CallQueueExcludedCustomerReportModelFilter;
            var customers       = _customerRepository.GetCallQueueExcludedCustomers(callQueueFilter, pageNumber, pageSize, out totalRecords);

            if (customers == null || !customers.Any())
            {
                return(null);
            }

            var customerIds = customers.Select(c => c.CustomerId).ToArray();

            var customerEligibilities = _customerEligibilityRepository.GetCustomerEligibilityByCustomerIdsAndYear(customerIds, DateTime.Today.Year);

            if (customerEligibilities.IsNullOrEmpty())
            {
                customerEligibilities = new List <CustomerEligibility>();
            }

            var customTags = _corporateCustomerCustomTagRepository.GetByCustomerIds(customerIds);

            var prospectCustomers = _prospectCustomerRepository.GetProspectCustomersByCustomerIds(customerIds);

            var eventCustomers = _eventCustomerRepository.GetByCustomerIds(customerIds);

            eventCustomers = eventCustomers.Where(x => x.AppointmentId.HasValue && x.NoShow == false);

            var eventIds = eventCustomers.Select(x => x.EventId).ToArray();

            var events = _eventRepository.GetEvents(eventIds);

            var orgRoleUsers = _organizationRoleUserRepository.GetOrganizationRoleUsers(customerIds);

            var userIds = orgRoleUsers.Select(x => x.UserId).ToList();

            var users = _userRepository.GetUsers(userIds);

            var targetedCustomers = _customerTargetedRepository.GetCustomerTargetedByCustomerIdsAndYear(customerIds, DateTime.Today.Year);

            if (callQueueFilter.CampaignId > 0)
            {
                var zipIds             = _callQueueCustomerRepository.GetAccountZip(callQueueFilter.HealthPlanId);
                var callQueueCustomers = _callQueueCustomerRepository.GetCallQueueCustomersForRejectedList(customerIds, callQueueFilter.CampaignId, callQueueFilter.HealthPlanId);
                var account            = ((IUniqueItemRepository <CorporateAccount>)_corporateAccountRepository).GetById(callQueueFilter.HealthPlanId);

                var criterias = _healthPlanCallQueueCriteriaRepository.GetByCampaignId(callQueueFilter.CampaignId);
                var criteria  = criterias.First();

                var accountCallQueueSetting = (_callQueueSettingRepository.GetByAccountIdAndCallQueueId(callQueueFilter.HealthPlanId, criteria.CallQueueId));
                return(_callQueueExcludedCustomerReportListModelFactory.Create(customers, customTags, prospectCustomers, eventCustomers, events, orgRoleUsers, users, callQueueCustomers, zipIds, account, accountCallQueueSetting, customerEligibilities, targetedCustomers));
            }

            return(_callQueueExcludedCustomerReportListModelFactory.Create(customers, customTags, prospectCustomers, eventCustomers, events, orgRoleUsers, users, null, null, null, null, customerEligibilities, targetedCustomers));
        }
        private void ParseCallUploadedCalls(IEnumerable <DataRow> rows, List <CallUploadLog> failedCustomerList, List <CallUploadLog> successCustomerList, long callUploadId)
        {
            var callUploadLogs = rows.Select(row => _callUploadHelper.GetUploadLog(row, callUploadId));

            if (callUploadLogs.IsNullOrEmpty())
            {
                _logger.Info("No Record Found For Parsing in file");
                return;
            }

            SaveFailedCustomers(failedCustomerList, callUploadLogs);

            callUploadLogs = callUploadLogs.Where(x => x.IsSuccessfull);

            if (callUploadLogs.IsNullOrEmpty())
            {
                _logger.Info("No Successfull Customer Found For Parsing in file");
                return;
            }
            var customerIds = callUploadLogs.Select(x => x.CustomerId).Distinct();

            var outboundCustomerIds = callUploadLogs.Where(x => !x.IsDirectMail).Select(x => x.CustomerId).ToArray();

            IEnumerable <Customer> customers = null;

            try
            {
                customers = _customerRepository.GetCustomers(customerIds.ToArray());
            }
            catch (Exception ex)
            {
                _logger.Error(" Exception : " + ex.Message + " \n Stack Trace: " + ex.StackTrace);
            }

            if (customers != null && customers.Any())
            {
                var healthPlans = _corporateAccountRepository.GetAllHealthPlan();

                var events = ((IUniqueItemRepository <Event>)_eventRepository).GetByIds(callUploadLogs.Where(x => x.EventId > 0).Select(x => x.EventId).ToArray());

                var callQueue = _callQueueRepository.GetCallQueueByCategory(HealthPlanCallQueueCategory.CallRound);

                var callQueueCustomers = _callQueueCustomerRepository.GetCallQueueCustomersBuCustomerIds(outboundCustomerIds, callQueue.Id).ToList();

                var prospectCustomers = _prospectCustomerRepository.GetProspectCustomersByCustomerIds(outboundCustomerIds);

                var calls = _callCenterCallRepository.GetCallDetails(outboundCustomerIds);

                var emailIds = callUploadLogs.Select(x => x.Email).Distinct().ToList();

                var userNames = callUploadLogs.Where(x => !string.IsNullOrEmpty(x.UserName)).Select(x => x.UserName).Distinct().ToList();

                var organizationRoleUserEmail = _organizationRoleUserRepository.GetNameIdPairofOrgRoleIdByEmail(emailIds, (long)Roles.CallCenterRep);

                var organizationRoleUserUserName = _organizationRoleUserRepository.GetNameIdPairofOrgRoleIdByUserNames(userNames, (long)Roles.CallCenterRep);

                var directMailTypes = _directMailTypeRepository.GetAll();


                foreach (var callUploadLog in callUploadLogs)
                {
                    try
                    {
                        var customer = customers.SingleOrDefault(x => x.CustomerId == callUploadLog.CustomerId);
                        if (customer == null)
                        {
                            callUploadLog.IsSuccessfull = false;
                            callUploadLog.ErrorMessage  = "Customer ID is not valid.";
                            _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                            failedCustomerList.Add(callUploadLog);
                            continue;
                        }

                        if (string.IsNullOrEmpty(customer.Tag))
                        {
                            callUploadLog.IsSuccessfull = false;
                            callUploadLog.ErrorMessage  = "Customer does not belong to any HealthPlan.";
                            _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                            failedCustomerList.Add(callUploadLog);
                            continue;
                        }

                        var healthPlan = healthPlans.SingleOrDefault(x => x.Tag == customer.Tag);

                        if (healthPlan == null)
                        {
                            callUploadLog.IsSuccessfull = false;
                            callUploadLog.ErrorMessage  = "HealthPlan " + customer.Tag + " not found.";
                            _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                            failedCustomerList.Add(callUploadLog);
                            continue;
                        }

                        var orgRoleId = _callUploadHelper.GetOrganizationRoleId(callUploadLog, organizationRoleUserEmail, organizationRoleUserUserName);

                        if (orgRoleId <= 0)
                        {
                            callUploadLog.IsSuccessfull = false;
                            callUploadLog.ErrorMessage  = "Created By Information does not found.";
                            _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                            failedCustomerList.Add(callUploadLog);
                            continue;
                        }

                        long?directMailTypeId = null;
                        if (callUploadLog.IsDirectMail)
                        {
                            var campaign = _campaignRepository.GetCampaignByName(callUploadLog.CampaignName);

                            if (campaign == null)
                            {
                                callUploadLog.IsSuccessfull = false;
                                callUploadLog.ErrorMessage  = " Please provide a valid campaign name.";
                                _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                                failedCustomerList.Add(callUploadLog);
                                continue;
                            }

                            if (!string.IsNullOrEmpty(callUploadLog.DirectMailType))
                            {
                                var directMailType = directMailTypes.SingleOrDefault(s => s.Name.ToLower() == callUploadLog.DirectMailType.ToLower());

                                if (directMailType == null)
                                {
                                    callUploadLog.IsSuccessfull = false;
                                    callUploadLog.ErrorMessage  = " Please provide a valid Direct Mail Type.";
                                    _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                                    failedCustomerList.Add(callUploadLog);
                                    continue;
                                }
                                directMailTypeId = directMailType.Id;
                            }
                            var isInvalidAddress = false;
                            if (callUploadLog.IsInvalidAddress != null)
                            {
                                isInvalidAddress = callUploadLog.IsInvalidAddress.ToLower().Trim() == "yes" ? true : false;
                            }

                            var directMail = new DirectMail
                            {
                                CustomerId       = callUploadLog.CustomerId,
                                MailDate         = callUploadLog.OutreachDateTime.Value.Date,
                                CallUploadId     = callUploadLog.CallUploadId,
                                CampaignId       = campaign.Id,
                                DirectMailTypeId = directMailTypeId,
                                Mailedby         = orgRoleId,
                                IsInvalidAddress = isInvalidAddress,
                                Notes            = isInvalidAddress ? "Direct Mail returned because of invalid address." : string.Empty,
                            };

                            _directMailRepository.Save(directMail);
                        }
                        else
                        {
                            Event theEventData = null;
                            if (callUploadLog.EventId > 0)
                            {
                                theEventData = events.SingleOrDefault(x => x.Id == callUploadLog.EventId);
                                if (theEventData == null)
                                {
                                    callUploadLog.IsSuccessfull = false;
                                    callUploadLog.ErrorMessage  = "Event Id provide is not valid.";
                                    _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                                    failedCustomerList.Add(callUploadLog);
                                    continue;
                                }
                            }

                            if (callUploadLog.EventId > 0)
                            {
                                var isValidEventForAccount = _eventRepository.ValidateEventForAccount(callUploadLog.EventId, healthPlan.Id);
                                if (!isValidEventForAccount)
                                {
                                    callUploadLog.IsSuccessfull = false;
                                    callUploadLog.ErrorMessage  = "Event Id provide is not valid for customer HealthPlan.";
                                    _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                                    failedCustomerList.Add(callUploadLog);
                                    continue;
                                }
                            }

                            var prospectCustomer = prospectCustomers.FirstOrDefault(x => x.CustomerId == customer.CustomerId);

                            if (prospectCustomer == null && customer != null)
                            {
                                prospectCustomer = _prospectCustomerFactory.CreateProspectCustomerFromCustomer(customer, false);
                                prospectCustomer = ((IUniqueItemRepository <ProspectCustomer>)_prospectCustomerRepository).Save(prospectCustomer);
                            }

                            var callQueueCustomer = SaveCallQueueCustomer(callQueue.Id, callUploadLog, healthPlan.Id,
                                                                          callQueueCustomers);

                            var call = SaveCall(callUploadLog, theEventData != null ? theEventData.Id : 0, orgRoleId, healthPlan.Id);

                            if (prospectCustomer != null)
                            {
                                UpdateContactedInfo(prospectCustomer.Id, call.Id, orgRoleId);
                            }

                            SaveCallQueueCustomerCall(callQueueCustomer, call);
                            SaveCallNotes(callUploadLog, call.Id, orgRoleId);

                            var  customerCalls = calls.Where(x => x.CalledCustomerId == callUploadLog.CustomerId);
                            bool isRemovedFromCallQueue;
                            var  isRuleApplied = _callUploadRuleEngine.ApplyRuleEngine(callUploadLog, customerCalls, prospectCustomer, orgRoleId, callQueueCustomer.Id, callQueueCustomer.CallQueueId, out isRemovedFromCallQueue, _logger);

                            if (isRemovedFromCallQueue)
                            {
                                callQueueCustomer.Status = CallQueueStatus.Removed;
                                _callQueueCustomerRepository.Save(callQueueCustomer);
                            }

                            callUploadLog.IsRuleApplied = isRuleApplied;
                        }

                        successCustomerList.Add(callUploadLog);

                        _callUploadLogRepository.SaveCallUploadLog(callUploadLog);
                    }
                    catch (Exception ex)
                    {
                        callUploadLog.IsSuccessfull = false;
                        callUploadLog.ErrorMessage  = "Message: " + ex.Message + "\n stack Trace: " + ex.StackTrace;
                        failedCustomerList.Add(callUploadLog);
                        _logger.Error("Message: " + ex.Message + "\n stack Trace: " + ex.StackTrace);
                    }
                }
            }
            else
            {
                foreach (var callUploadLog in callUploadLogs)
                {
                    callUploadLog.IsSuccessfull = false;
                    callUploadLog.ErrorMessage  = "Please Provide a valid CustomerId";
                    failedCustomerList.Add(callUploadLog);
                }
            }


            SaveFailedCustomers(failedCustomerList, callUploadLogs);
        }
        public void PollForApplyRule()
        {
            try
            {
                var timeOfDay = DateTime.Now;
                _logger.Info("Entering In Apply Rules On Locked Customers PollingAgent");
                if (_isDevEnvironment || timeOfDay.TimeOfDay > new TimeSpan(4, 0, 0))
                {
                    var callUploadLogs = _callUploadLogRepository.GetCustomerForApplyRule(OutReachType);


                    if (callUploadLogs.IsNullOrEmpty())
                    {
                        _logger.Info("No Record Found");
                        return;
                    }
                    var customerIds       = callUploadLogs.Select(x => x.CustomerId);
                    var callcenterCalls   = _callCenterCallRepository.GetCallDetails(customerIds);
                    var prospectCustomers = _prospectCustomerRepository.GetProspectCustomersByCustomerIds(customerIds.ToArray());

                    var emailIds  = callUploadLogs.Select(x => x.Email).Distinct().ToList();
                    var userNames = callUploadLogs.Select(x => x.UserName).Distinct().ToList();

                    var organizationRoleUserEmail    = _organizationRoleUserRepository.GetNameIdPairofOrgRoleIdByEmail(emailIds, (long)Roles.CallCenterRep);
                    var organizationRoleUserUserName = _organizationRoleUserRepository.GetNameIdPairofOrgRoleIdByUserNames(userNames, (long)Roles.CallCenterRep);

                    var callQueue = _callQueueRepository.GetCallQueueByCategory(HealthPlanCallQueueCategory.CallRound);

                    var callQueueCustomers = _callQueueCustomerRepository.GetCallQueueCustomersBuCustomerIds(customerIds, callQueue.Id).ToList();

                    foreach (var uploadLog in callUploadLogs)
                    {
                        try
                        {
                            var customerCalls    = callcenterCalls.Where(x => x.CalledCustomerId == uploadLog.CustomerId);
                            var prospectCustomer = prospectCustomers.Single(x => x.CustomerId == uploadLog.CustomerId);
                            var orgRoleId        = _callUploadHelper.GetOrganizationRoleId(uploadLog, organizationRoleUserEmail, organizationRoleUserUserName);

                            var  callQueueCustomer = callQueueCustomers.FirstOrDefault(x => x.CustomerId.HasValue && x.CustomerId.Value == uploadLog.CustomerId);
                            bool isRemovedFromCallQueue;

                            var isRuleApplied = _callUploadRuleEngine.ApplyRuleEngine(uploadLog, customerCalls, prospectCustomer, orgRoleId, callQueueCustomer.Id, callQueueCustomer.CallQueueId, out isRemovedFromCallQueue, _logger);
                            if (isRuleApplied)
                            {
                                if (isRemovedFromCallQueue)
                                {
                                    callQueueCustomer.Status = CallQueueStatus.Removed;
                                    _callQueueCustomerRepository.Save(callQueueCustomer);
                                }

                                uploadLog.IsRuleApplied = isRuleApplied;
                                _callUploadLogRepository.SaveCallUploadLog(uploadLog);
                            }
                        }
                        catch (Exception exception)
                        {
                            _logger.Error("Error on Apply Rule on Locked Customer For CallUploadLogId: " + uploadLog.Id + " Exception: " + exception + "\n Stack Trace:" + exception.StackTrace);
                        }
                    }
                }
                else
                {
                    _logger.Info(string.Format("Apply Rule on Locked Customer can not be called as time of day is {0}", timeOfDay.TimeOfDay));
                }
            }
            catch (Exception exception)
            {
                _logger.Error("Error on Apply Rule on Locked Customer Exception: " + exception + "\n Stack Trace:" + exception.StackTrace);
            }
        }
        private void SaveCallQueueCustomerAndAssignment(IEnumerable <CallQueueCustomer> callQueueCustomers, IEnumerable <CallQueueCustomer> existingCustomers, long criteriaId, long healthPlanId, long callQueueId,
                                                        IEnumerable <long> customerIds)//, IEnumerable<long> eventids
        {
            int       totalRecords    = customerIds.Count();
            var       pageNumber      = 1;
            const int PageSize        = 100;
            var       firstDateOfYear = new DateTime(DateTime.Today.Year, 1, 1);

            var accountSetting = _callQueueSettingRepository.GetByAccountIdAndCallQueueId(healthPlanId, callQueueId);
            var maxDayCount    = (from asetting in accountSetting
                                  where asetting.SuppressionTypeId == (long)CallQueueSuppressionType.Others
                                  select asetting.NoOfDays).FirstOrDefault();

            try
            {
                while (true)
                {
                    var pagedCusotmerIds       = customerIds.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToArray();
                    var pagedcallQueueCusomers = callQueueCustomers.Where(x => pagedCusotmerIds.Contains(x.CustomerId.Value));

                    var callDetails = _centerCallRepository.GetCallByCustomerId(pagedCusotmerIds, firstDateOfYear, true);

                    var customers         = _customerRepository.GetCustomers(pagedCusotmerIds);
                    var prospectCustomers = _prospectCustomerRepository.GetProspectCustomersByCustomerIds(pagedCusotmerIds);

                    var eventCustomers = _eventCustomerRepository.GetByEventIdsOrCustomerIds(firstDateOfYear, pagedCusotmerIds);

                    var customerEligibilities = _customerEligibilityRepository.GetCustomerEligibilityByCustomerIdsAndYear(pagedCusotmerIds, DateTime.Today.Year);

                    var targetedCustomers = _customerTargetedRepository.GetCustomerTargetedByCustomerIdsAndYear(pagedCusotmerIds, DateTime.Today.Year);

                    eventCustomers = eventCustomers ?? new List <EventCustomer>();

                    var cancelledCustomersLog = (_eventAppointmentCancellationLogRepository.GetCancellationByCusomerIds(pagedCusotmerIds, DateTime.Today.AddDays(-maxDayCount)));


                    var appointmentIds = (from ec in eventCustomers
                                          where ec.AppointmentId.HasValue
                                          select ec.AppointmentId.Value).ToArray();

                    var appointments = _appointmentRepository.GetByIds(appointmentIds);

                    foreach (var callQueueCustomer in pagedcallQueueCusomers)
                    {
                        try
                        {
                            var customerId = callQueueCustomer.CustomerId;
                            var existingCallQueueCustomer = existingCustomers.FirstOrDefault(cq => (cq.CustomerId == customerId));
                            var customer = customers.First(x => x.CustomerId == callQueueCustomer.CustomerId);

                            var prospectCustomer = prospectCustomers.FirstOrDefault(p => p.CustomerId.Value == customerId);

                            var customerCalls = (from cd in callDetails
                                                 where cd.CalledCustomerId == customerId && cd.Status != (long)CallStatus.CallSkipped
                                                 select cd).ToArray();

                            var callAttempts = (from cd in callDetails
                                                where cd.CalledCustomerId == customerId && cd.CallQueueId.Value == callQueueId && cd.Status != (long)CallStatus.CallSkipped &&
                                                (cd.IsContacted.HasValue && cd.IsContacted.Value)
                                                select cd).Count();

                            var customerswithAppointment = (from ec in eventCustomers
                                                            where ec.AppointmentId.HasValue
                                                            select ec).ToArray();

                            var appointmentDate = (from ec in customerswithAppointment
                                                   join a in appointments on ec.AppointmentId.Value equals a.Id
                                                   where ec.AppointmentId.HasValue && ec.CustomerId == customerId && /*&& ec.AppointmentId.HasValue*/
                                                   ec.NoShow == false
                                                   orderby a.StartTime descending
                                                   select a).FirstOrDefault();


                            var eacl = (from ccl in cancelledCustomersLog
                                        join ec in eventCustomers on ccl.EventCustomerId equals ec.Id
                                        where ec.AppointmentId == null && ec.CustomerId == customerId
                                        orderby ccl.DateCreated descending
                                        select ccl).FirstOrDefault();

                            var customerEligibility = customerEligibilities.FirstOrDefault(x => x.CustomerId == customerId);

                            var targetedCustomer = targetedCustomers != null?targetedCustomers.FirstOrDefault(x => x.CustomerId == customerId) : null;

                            var noShowMarkedEventCustomer = eventCustomers.Where(x => x.CustomerId == customerId);

                            existingCallQueueCustomer = CreateCustomerCallQueueCustomerModel(existingCallQueueCustomer, callQueueCustomer, customer, customerCalls,
                                                                                             callAttempts, appointmentDate, prospectCustomer, eacl, false, customerEligibility, noShowMarkedEventCustomer, targetedCustomer);

                            /*if (!eventids.IsNullOrEmpty())
                             * {
                             *  existingCallQueueCustomer.EventIds = string.Join(",", eventids.ToArray()) + ",";
                             * }*/
                            existingCallQueueCustomer.LastUpdatedOn = DateTime.Today;

                            var isNew = !(existingCallQueueCustomer.Id > 0);

                            existingCallQueueCustomer = _callQueueCustomerRepository.Save(existingCallQueueCustomer, isNew);

                            _healthPlanCallQueueAssignmentRepository.Save(new HealthPlanCallQueueCriteriaAssignment
                            {
                                CallQueueCustomerId = existingCallQueueCustomer.Id,
                                CallQueueId         = callQueueCustomer.CallQueueId,
                                CriteriaId          = criteriaId
                            });
                        }
                        catch (Exception ex)
                        {
                            logger.Error(string.Format("Error saving Call Queue Customer. \nMessage : {0} \nStack Trace : {1}", ex.Message, ex.StackTrace));
                        }
                    }

                    if ((pageNumber * PageSize) >= totalRecords)
                    {
                        break;
                    }

                    pageNumber++;
                }
            }
            catch (Exception)
            {
            }
        }