Ejemplo n.º 1
0
        public CallQueueEditModel GetCallQueue(long callQueueId)
        {
            var callQueue = _callQueueRepository.GetById(callQueueId);

            var callQueueEditModel = Mapper.Map <CallQueue, CallQueueEditModel>(callQueue);

            if (callQueueEditModel.ScriptId > 0)
            {
                var script = _scriptRepository.GetById(callQueueEditModel.ScriptId);
                callQueueEditModel.ScriptText = script.ScriptText;
            }

            var callQueueCriterias = _callQueueCriteriaRepository.GetByCallQueueId(callQueueId);
            var criteriaEditModels = Mapper.Map <IEnumerable <CallQueueCriteria>, IEnumerable <CallQueueCriteriaEditModel> >(callQueueCriterias);
            var criterias          = _criteriaRepository.GetAll();

            foreach (var callQueueCriteriaEditModel in criteriaEditModels)
            {
                callQueueCriteriaEditModel.Name = criterias.Where(c => c.Id == callQueueCriteriaEditModel.CriteriaId).Select(c => c.Name).Single();
            }
            callQueueEditModel.Criterias = criteriaEditModels;

            var assginments          = _callQueueAssignmentRepository.GetByCallQueueId(callQueueId);
            var assignmentEditModels = Mapper.Map <IEnumerable <CallQueueAssignment>, IEnumerable <CallQueueAssignmentEditModel> >(assginments);
            var idNamePairs          = _organizationRoleUserRepository.GetNameIdPairofUsers(assignmentEditModels.Select(a => a.AssignedOrgRoleUserId).ToArray());

            foreach (var callQueueAssignmentEditModel in assignmentEditModels)
            {
                callQueueAssignmentEditModel.Name = idNamePairs.Where(inp => inp.FirstValue == callQueueAssignmentEditModel.AssignedOrgRoleUserId).Select(inp => inp.SecondValue).Single();
            }
            callQueueEditModel.Assignments = assignmentEditModels;

            return(callQueueEditModel);
        }
Ejemplo n.º 2
0
        public void SendCustomersOnCallQueue()
        {
            try
            {
                var callQueues = _callQueueRepository.GetAll().Where(x => x.IsActive && (x.IsQueueGenerated == false || (DateTime.Now >= (x.LastQueueGeneratedDate.HasValue ? x.LastQueueGeneratedDate.Value.AddMinutes(x.QueueGenerationInterval.Value) : DateTime.Now))));

                foreach (CallQueue queue in callQueues)
                {
                    var callAssignMents = _callQueueAssignmentRepository.GetByCallQueueId(queue.Id);

                    _callQueueCustomerRepository.DeleteForInActiveCallQueueCriteria(queue.Id);

                    var customerList = _outboundCallQueueService.GetCallQueueCustomers(queue);

                    //int callsToInsert = customerList.Count > 1000 ? 1000 : customerList.Count;//only this number of calls to be inserted at a time
                    if (!queue.IsQueueGenerated)
                    {
                        //var shortList = customerList.Take(callsToInsert);
                        //customerList = shortList.ToList();
                        _outboundCallQueueService.ChangeAssignmentOfExistingQueue(queue, callAssignMents);
                    }
                    int totalRecords = customerList.Count;

                    //assigning each call centre user with number of customer based on percentage
                    var callDivision = (from ca in callAssignMents
                                        let count = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(totalRecords * ca.Percentage) / 100))
                                                    select new
                    {
                        AssignedTo = ca.AssignedOrgRoleUserId,
                        callCount = count > 0 ? count : 1
                    }).ToList();
                    int startCount = 0;
                    for (int i = 0; i < callDivision.Count; i++)
                    {
                        int endCount = callDivision[i].callCount;

                        int thresholdCount = customerList.Count < (startCount + endCount) ? customerList.Count : (startCount + endCount);

                        for (int j = startCount; j < thresholdCount; j++)
                        {
                            CallQueueCustomer callQueueCustomer = customerList[j];

                            if (_callQueueCustomerRepository.IsCallQueueExist(queue.Id, callQueueCustomer.ProspectCustomerId.HasValue ? callQueueCustomer.ProspectCustomerId.Value : 0, callQueueCustomer.CustomerId.HasValue ? callQueueCustomer.CustomerId.Value : 0, callQueueCustomer.EventId, _settings.NoOfDaysToIncludeRemovedFromQueue))
                            {
                                continue;
                            }

                            callQueueCustomer.CallQueueId = queue.Id;

                            callQueueCustomer.IsActive                = true;
                            callQueueCustomer.Attempts                = 0;
                            callQueueCustomer.DateCreated             = DateTime.Now;
                            callQueueCustomer.Status                  = CallQueueStatus.Initial;
                            callQueueCustomer.AssignedToOrgRoleUserId = callDivision[i].AssignedTo;
                            callQueueCustomer.CallDate                = DateTime.Now;
                            _callQueueCustomerRepository.Save(callQueueCustomer);
                        }
                        //Once the quota for 1 user is complete next user will start from that
                        startCount = startCount + endCount;
                    }

                    queue.IsQueueGenerated       = true;
                    queue.LastQueueGeneratedDate = DateTime.Now;
                    _callQueueRepository.Save(queue);
                }
            }
            catch (Exception ex)
            {
                _logger.Error(string.Format("Message:{0} \nStackTrace: {1}", ex.Message, ex.StackTrace));
            }
        }