예제 #1
0
        public ListModelBase <ProspectCustomerBasicInfoModel, ProspectCustomerListModelFilter> GetAbandonedCustomers(int pageNumber, int pageSize, ModelFilterBase filter, out int totalRecords)
        {
            var modelFilter = filter as ProspectCustomerListModelFilter;

            if (modelFilter.AgentOrganizationId > 0 && !modelFilter.FromDate.HasValue && !modelFilter.ToDate.HasValue)
            {
                modelFilter.FromDate = DateTime.Today.AddDays(-90);
                modelFilter.DateType = (int)ProspectCustomerDateTypeFilter.CreatedDate;
            }

            var prospectCustomers = _prospectCustomerRepository.GetAbandonedProspectCustomer(pageNumber, pageSize, modelFilter, out totalRecords);
            var model             = new ProspectCustomerListModel();

            if (prospectCustomers != null && prospectCustomers.Any())
            {
                var prospectCustomerNotes = _customerCallNotesRepository.GetProspectCustomerNotes(prospectCustomers.Select(pc => pc.Id).ToArray());

                var orgRoleUserIds = prospectCustomers.Where(pc => pc.ContactedBy.HasValue).Select(pc => pc.ContactedBy.Value).ToList();

                if (prospectCustomerNotes != null && prospectCustomerNotes.Any())
                {
                    orgRoleUserIds.AddRange(prospectCustomerNotes.Select(pcn => pcn.DataRecorderMetaData.DataRecorderCreator.Id));
                }

                orgRoleUserIds = orgRoleUserIds.Distinct().ToList();
                var idNamePairs = _organizationRoleUserRepository.GetNameIdPairofUsers(orgRoleUserIds.ToArray());

                var customerIds = prospectCustomers.Where(x => x.CustomerId.HasValue && x.CustomerId.Value > 0).Select(x => x.CustomerId.Value);
                var customers   = new List <Customer>();

                if (!customerIds.IsNullOrEmpty())
                {
                    customers = _customerRepository.GetCustomers(customerIds.ToArray());
                }

                var customTags = _corporateCustomerCustomTagRepository.GetByCustomerIds(customerIds);

                var corportateAccounts = new List <CorporateAccount>();

                if (!customers.IsNullOrEmpty())
                {
                    var cutomerTags = customers.Where(x => !string.IsNullOrEmpty(x.Tag) && x.Tag.Trim().Length > 1).Select(x => x.Tag);

                    if (customTags.Any())
                    {
                        corportateAccounts.AddRange(_corporateAccountRepository.GetByTags(cutomerTags.ToArray()));
                    }
                }

                var pcBasicmodels = new ProspectCustomerBasicInfoModel[prospectCustomers.Count()];
                int index         = 0;
                foreach (var prospectCustomer in prospectCustomers)
                {
                    SourceCode sourceCode = null;
                    if (prospectCustomer.SourceCodeId.HasValue)
                    {
                        sourceCode = _sourceCodeRepository.GetSourceCodeById(prospectCustomer.SourceCodeId.Value);
                    }

                    pcBasicmodels[index] = Mapper.Map <ProspectCustomer, ProspectCustomerBasicInfoModel>(prospectCustomer);

                    if (prospectCustomer.CustomerId.HasValue)
                    {
                        if (customers.Any())
                        {
                            var customer = customers.First(x => x.CustomerId == prospectCustomer.CustomerId);

                            pcBasicmodels[index].CorporateTag = string.IsNullOrEmpty(customer.Tag) ? "" : customer.Tag;
                            pcBasicmodels[index].MemberId     = string.IsNullOrEmpty(customer.InsuranceId) ? "" : customer.InsuranceId;


                            if (corportateAccounts.Any() && !string.IsNullOrEmpty(customer.Tag))
                            {
                                var corportateAccount = corportateAccounts.First(x => x.Tag == customer.Tag);
                                pcBasicmodels[index].CorporateSponsor = corportateAccount.Name;
                            }
                        }

                        var corporateCustomTags = string.Empty;
                        if (customTags != null && customTags.Any())
                        {
                            var customerCustomTags =
                                customTags.Where(ct => ct.CustomerId == prospectCustomer.CustomerId).Select(ct => ct.Tag).ToArray();

                            if (customerCustomTags.Any())
                            {
                                corporateCustomTags = string.Join(",", customerCustomTags);
                            }
                        }

                        pcBasicmodels[index].CustomTags = corporateCustomTags;
                        if (!string.IsNullOrEmpty(pcBasicmodels[index].CorporateTag) && string.IsNullOrEmpty(pcBasicmodels[index].CustomTags))
                        {
                            pcBasicmodels[index].CustomTags = "None";
                        }
                    }

                    var notesVieModel = new List <NotesViewModel>();

                    var prospectNotes = _notesViewModelFactory.GetProspectCustomerNotes(prospectCustomer.Id, prospectCustomerNotes, idNamePairs);

                    if (prospectNotes != null)
                    {
                        notesVieModel.AddRange(prospectNotes);
                    }

                    if (prospectCustomer.Tag == ProspectCustomerTag.Cancellation && prospectCustomer.CustomerId.HasValue && _settings.IsRefundQueueEnabled)
                    {
                        var eventCustomers = _eventCustomerRepository.GetbyCustomerId(prospectCustomer.CustomerId.Value);
                        eventCustomers = eventCustomers.Where(ec => !ec.AppointmentId.HasValue);

                        if (eventCustomers.Any())
                        {
                            var eventCustomerId = eventCustomers.Select(ec => ec.Id).Max();
                            if (eventCustomerId > 0)
                            {
                                var orderId        = _orderRepository.GetOrderIdByEventCustomerId(eventCustomerId);
                                var refundRequests = _refundRequestRepository.GetbyOrderId(orderId, true);
                                if (refundRequests != null && refundRequests.Any() && refundRequests.Count(rr => rr.RefundRequestType == RefundRequestType.CustomerCancellation) > 0)
                                {
                                    var refundRequest = refundRequests.LastOrDefault(rr => rr.RefundRequestType == RefundRequestType.CustomerCancellation && rr.RefundRequestResult != null &&
                                                                                     (rr.RefundRequestResult.RequestResultType == RequestResultType.IssueRefund || rr.RefundRequestResult.RequestResultType == RequestResultType.IssueGiftCertificate));

                                    if (refundRequest != null)
                                    {
                                        notesVieModel.Add(new NotesViewModel()
                                        {
                                            Note = refundRequest.RefundRequestResult.Notes
                                        });
                                    }
                                }
                            }
                        }
                    }

                    pcBasicmodels[index].Notes = notesVieModel;

                    if (sourceCode != null)
                    {
                        pcBasicmodels[index].SourceCode = sourceCode.CouponCode;
                    }

                    if (prospectCustomer.ContactedBy.HasValue)
                    {
                        pcBasicmodels[index].ContactedBy =
                            idNamePairs.Where(nip => nip.FirstValue == prospectCustomer.ContactedBy.Value).Select(nip => nip.SecondValue).SingleOrDefault();
                    }
                    index++;
                }
                model.Collection = pcBasicmodels;
            }
            return(model);
        }
예제 #2
0
        public OutboundCallQueueListModel Create(IEnumerable <CallQueueCustomer> callQueueCustomers, IEnumerable <Customer> customers, IEnumerable <ProspectCustomer> prospectCustomers,
                                                 IEnumerable <CallQueueCriteria> callQueueCriterias, IEnumerable <Criteria> criterias, IEnumerable <CallQueueCustomerCall> callQueueCustomerCalls, IEnumerable <Call> calls,
                                                 IEnumerable <CallCenterNotes> callCenterNoteses, IEnumerable <CustomerCallNotes> customerCallNotes, IEnumerable <OrderedPair <long, string> > idNamePair)
        {
            var model      = new OutboundCallQueueListModel();
            var collection = new List <OutboundCallQueueViewModel>();

            callQueueCustomers.ToList().ForEach(cqc =>
            {
                Customer customer    = null;
                var prospectCustomer = new ProspectCustomer();

                if (cqc.CustomerId.HasValue)
                {
                    customer = customers.FirstOrDefault(c => c.CustomerId == cqc.CustomerId.Value);
                }

                if (cqc.ProspectCustomerId > 0)
                {
                    prospectCustomer = prospectCustomers.First(pc => pc.Id == cqc.ProspectCustomerId);
                }

                CallQueueCriteria callQueueCriteria = null;
                var callReason = string.Empty;

                if (callQueueCriterias != null && callQueueCriterias.Any() && criterias != null && criterias.Any())
                {
                    if (cqc.CallQueueCriteriaId.HasValue && cqc.CallQueueCriteriaId.Value > 0)
                    {
                        callQueueCriteria = callQueueCriterias.Single(cqcs => cqcs.Id == cqc.CallQueueCriteriaId.Value);
                    }
                    if (callQueueCriteria != null)
                    {
                        var criteria = criterias.Single(c => c.Id == callQueueCriteria.CriteriaId);

                        callReason = criteria.Name;

                        if (callQueueCriteria.CriteriaId == (long)QueueCriteria.AllProspects)
                        {
                            callReason = prospectCustomer.Tag.GetDescription();
                        }
                    }
                }

                var prospectNotes             = _notesViewModelFactory.GetProspectCustomerNotes(cqc.ProspectCustomerId ?? 0, customerCallNotes, idNamePair);
                var email                     = string.Empty;
                PhoneNumber mobilePhoneNumber = null;
                PhoneNumber officePhoneNumber = null;

                if (customer != null)
                {
                    email             = (customer.Email != null) ? customer.Email.ToString() : string.Empty;
                    mobilePhoneNumber = customer.OfficePhoneNumber;
                    officePhoneNumber = customer.MobilePhoneNumber;
                }
                else
                {
                    email = prospectCustomer.Email != null ? prospectCustomer.Email.ToString() : string.Empty;
                }

                var outboundModel = new OutboundCallQueueViewModel
                {
                    CallQueueCustomerId = cqc.Id,
                    ProspectCustomerId  = cqc.ProspectCustomerId,
                    CustomerId          = cqc.CustomerId,
                    FirstName           = customer != null ? customer.Name.FirstName : prospectCustomer.FirstName,
                    MiddleName          = customer != null ? customer.Name.MiddleName : "",
                    LastName            = customer != null ? customer.Name.LastName : prospectCustomer.LastName,
                    Gender = customer != null ? customer.Gender : prospectCustomer.Gender,
                    Email  = email,
                    CallBackPhoneNumber = customer != null ? customer.HomePhoneNumber : prospectCustomer.CallBackPhoneNumber,
                    MobilePhoneNumber   = mobilePhoneNumber,
                    OfficePhoneNumber   = officePhoneNumber,
                    DateOfBirth         = customer != null ? customer.DateOfBirth : prospectCustomer.BirthDate,
                    CreatedOn           = cqc.DateCreated,
                    CallReason          = callReason,
                    Notes             = prospectNotes,
                    ProspectCreatedOn = prospectCustomer != null && prospectCustomer.CreatedOn != DateTime.MinValue ? prospectCustomer.CreatedOn : (DateTime?)null,
                };

                if (callQueueCustomerCalls != null && callQueueCustomerCalls.Any())
                {
                    var callIds = callQueueCustomerCalls.Where(cqcc => cqcc.CallQueueCustomerId == cqc.Id).Select(cqcc => cqcc.CallId).ToArray();
                    if (callIds.Any())
                    {
                        var customerCalls   = calls.Where(c => callIds.Contains(c.Id)).Select(c => c);
                        var callHistoryList = new List <CallHistoryViewModel>();
                        foreach (var customerCall in customerCalls)
                        {
                            var callHistory = new CallHistoryViewModel()
                            {
                                CallId      = customerCall.Id,
                                DateCreated = customerCall.CallDateTime
                            };

                            if (callCenterNoteses != null && callCenterNoteses.Any())
                            {
                                var customerNotes = callCenterNoteses.Where(ccn => ccn.CallId == customerCall.Id).Select(ccn => ccn).ToArray();
                                callHistory.Notes = customerNotes.Select(cn => new NotesViewModel()
                                {
                                    Note = cn.Notes, EnteredOn = cn.DateCreated
                                });
                            }

                            callHistoryList.Add(callHistory);
                        }

                        outboundModel.CallHistory = callHistoryList;
                    }
                }

                collection.Add(outboundModel);
            });

            model.OutboundCallQueues = collection;
            return(model);
        }