public CustomerCallQueueCallAttempt Save(CustomerCallQueueCallAttempt domain, bool refatch = true)
 {
     using (var adapter = PersistenceLayer.GetDataAccessAdapter())
     {
         var entity = Mapper.Map <CustomerCallQueueCallAttempt, CustomerCallQueueCallAttemptEntity>(domain);
         if (!adapter.SaveEntity(entity, refatch))
         {
             throw new PersistenceFailureException();
         }
         return(!refatch
             ? domain
             : Mapper.Map <CustomerCallQueueCallAttemptEntity, CustomerCallQueueCallAttempt>(entity));
     }
 }
        private CustomerCallQueueCallAttempt SetCustomerCallQueueAttempt(CallQueueCustomer callQueueCustomer)
        {
            try
            {
                var lockedCustomer = _callQueueCustomerLockRepository.GetCallQueueCustomerLock(callQueueCustomer);

                if (lockedCustomer != null)
                {
                    return(null);
                }

                var prospectCustomer = _prospectCustomerRepository.GetProspectCustomerByCustomerId(callQueueCustomer.CustomerId.Value);

                Customer customer = null;
                if (prospectCustomer == null)
                {
                    customer = _customerRepository.GetCustomer(callQueueCustomer.CustomerId.Value);
                }

                using (var scope = new TransactionScope())
                {
                    //lock customer in call queue so that other agent not be able to call them;
                    var domain = new CallQueueCustomerLock
                    {
                        CallQueueCustomerId = callQueueCustomer.Id,
                        CustomerId          = callQueueCustomer.CustomerId,
                        ProspectCustomerId  = callQueueCustomer.ProspectCustomerId,
                        CreatedBy           = _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId,
                        CreatedOn           = DateTime.Now
                    };

                    _callQueueCustomerLockRepository.SaveCallQueueCustomerLock(domain);                                     //Lock Customer

                    callQueueCustomer.Status                  = CallQueueStatus.InProcess;
                    callQueueCustomer.DateModified            = DateTime.Now;
                    callQueueCustomer.ModifiedByOrgRoleUserId = _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId;

                    _callQueueCustomerRepository.Save(callQueueCustomer, false);                                                  //Update CallQueueCustomer Status



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

                    var customerCallQueueCallAttempt = new CustomerCallQueueCallAttempt
                    {
                        DateCreated              = DateTime.Now,
                        IsCallSkipped            = false,
                        IsNotesReadAndUnderstood = false,
                        CreatedBy             = _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId,
                        CustomerId            = callQueueCustomer.CustomerId.Value,
                        CallId                = null,
                        CallQueueCustomerId   = callQueueCustomer.Id,
                        NotInterestedReasonId = null
                    };

                    var callAttempt = _customerCallQueueCallAttemptRepository.Save(customerCallQueueCallAttempt);           //CustomerCallQueueCallAttempt Entry
                    scope.Complete();
                    return(callAttempt);
                }
            }
            catch (Exception ex)
            {
                _logger.Error("Some Error occured");
                _logger.Error("Message: " + ex.Message);
                _logger.Error("Stack Trace: " + ex.StackTrace);
            }
            return(null);
        }