Exemplo n.º 1
0
        public List <CallQueueCustomer> GetCallQueueCustomers(CallQueue queue)
        {
            var callQueuesCriterias = _callQueueCriteriaRepository.GetByCallQueueId(queue.Id);

            var callCriterias = (from qc in callQueuesCriterias
                                 orderby qc.Sequence
                                 select new
            {
                Id = qc.Id,
                CriteriaId = qc.CriteriaId,
                CallQueueId = qc.CallQueueId,
                qc.Condition,
                qc.Radius,
                qc.Zipcode,
                CustomerTempList = new List <CallQueueCustomer>()
            }).ToList();

            var customerList = new List <CallQueueCustomer>();

            for (int i = 0; i < callCriterias.Count(); i++)
            {
                if (callCriterias[i].CriteriaId == (long)QueueCriteria.AllCustomers)
                {
                    var customers = _customerRepository.GetCustomerBasedOnGeography(callCriterias[i].Zipcode, callCriterias[i].Radius, false);
                    if (customers == null || !customers.Any())
                    {
                        continue;
                    }
                    foreach (long customerId in customers)
                    {
                        callCriterias[i].CustomerTempList.Add(new CallQueueCustomer {
                            CallQueueId = queue.Id, CustomerId = customerId, CallQueueCriteriaId = callCriterias[i].Id
                        });
                    }
                }
                else if (callCriterias[i].CriteriaId == (long)QueueCriteria.AllCustomersOlderThanOneYear)
                {
                    var customers = _customerRepository.GetCustomerBasedOnGeography(callCriterias[i].Zipcode, callCriterias[i].Radius, true);
                    if (customers == null || !customers.Any())
                    {
                        continue;
                    }
                    foreach (long customerId in customers)
                    {
                        callCriterias[i].CustomerTempList.Add(new CallQueueCustomer {
                            CallQueueId = queue.Id, CustomerId = customerId, CallQueueCriteriaId = callCriterias[i].Id
                        });
                    }
                }
                else if (callCriterias[i].CriteriaId == (long)QueueCriteria.PhysicianPartner)
                {
                    var customers = _customerRepository.GetPhysicianPartnerCustomerBasedOnGeography(callCriterias[i].Zipcode, callCriterias[i].Radius, _settings.PhysicianPartnerAccountId);
                    if (customers == null || !customers.Any())
                    {
                        continue;
                    }
                    foreach (long customerId in customers)
                    {
                        callCriterias[i].CustomerTempList.Add(new CallQueueCustomer {
                            CallQueueId = queue.Id, CustomerId = customerId, CallQueueCriteriaId = callCriterias[i].Id
                        });
                    }
                }
                else
                {
                    var prospects = _prospectCustomerRepository.GetProspectsBasedOnGeography(callCriterias[i].Zipcode, callCriterias[i].Radius, ((QueueCriteria)callCriterias[i].CriteriaId).ToString());
                    if (prospects == null || !prospects.Any())
                    {
                        continue;
                    }
                    foreach (var pc in prospects)
                    {
                        callCriterias[i].CustomerTempList.Add(new CallQueueCustomer {
                            CallQueueId = queue.Id, CustomerId = pc.SecondValue, ProspectCustomerId = pc.FirstValue, CallQueueCriteriaId = callCriterias[i].Id
                        });
                    }
                }
            }

            //creating master list from individual call criterias
            for (int i = 0; i < callCriterias.Count(); i++)
            {
                if (callCriterias.Count() == 1)
                {
                    customerList = callCriterias[0].CustomerTempList;
                }
                else
                {
                    //putting list in 0th element in the master list
                    if (i == 0)
                    {
                        customerList = callCriterias[0].CustomerTempList;
                    }
                    else
                    {
                        //comparing condition between (AND/Or) current and previows element
                        if (!callCriterias[i].Condition)
                        {
                            customerList.AddRange(callCriterias[i - 1].CustomerTempList.AsEnumerable().Intersect(callCriterias[i].CustomerTempList.AsEnumerable(), new CallQueueCustomerEqualityComparer()).ToList());
                        }
                        else
                        {
                            customerList.AddRange(callCriterias[i].CustomerTempList);
                        }
                    }
                }
            }

            var finalList = (from c in customerList
                             group c by new { c.CallQueueId, c.CustomerId, c.ProspectCustomerId }
                             into g
                             select new CallQueueCustomer {
                CallQueueId = g.Key.CallQueueId, CustomerId = g.Key.CustomerId, ProspectCustomerId = g.Key.ProspectCustomerId, CallQueueCriteriaId = g.Min(c => c.CallQueueCriteriaId)
            }).ToList();

            return(finalList);
        }