public UnfinishedCallException(string message, Exception inner, CallDetail callDetail)
     : base(message, inner)
 {
     CallDetail = callDetail;
 }
        private CallDetail FetchAssignment()
        {
            var contact = UnitOfWork.ContactRepository.NextCleaningContact(Telesale.Id);

            CallDetail detail = null;
            if (contact != null)
            {
                detail = new CallDetail
                {
                    OccupiedId = SaveOccupied(contact.Id, Telesale.Id),
                    Contact = contact,
                    Site = contact.Site,
                    ScriptActions = DefaultActions
                };

                detail.Script = new TelesaleScriptProvider(contact, Telesale, null).Get();
            }

            return detail;
        }
        private CallDetail FetchOpr()
        {
            if (CleaningQueue == null)
                throw new Exception("Invalid call queue");

            lock (Locker)
            {
                foreach (var queue in CleaningQueue.GetQueue())
                {
                    var person = queue.Key;
                    if (person == null)
                        return null;

                    var contact = NextContact(person);
                    if (contact == null)
                        continue;

                    var callDetail = new CallDetail
                    {
                        OccupiedId = SaveOccupied(contact.Id, Telesale.Id, person.Id),
                        Contact = contact,
                        LeadPerson = person,
                        Site = contact.Site,
                        ScriptActions = DefaultActions
                    };

                    callDetail.Script = new TelesaleScriptProvider(contact, Telesale, person).Get();
                    return callDetail;
                }

                return null;
            }
        }
        protected bool Prepare(string initial)
        {
            if (Telesale == null && string.IsNullOrEmpty(initial))
                throw new Exception("Initial required!");

            if (Telesale == null)
            {
                Telesale =
                    UnitOfWork.TelesaleRepository.Filter(x => x.Initial == initial, x => x, x => x.Assignments)
                        .SingleOrDefault();
            }

            if (Telesale == null)
                throw new Exception("Invalid initial!");

            var occupiedCall = UnitOfWork.OccupiedContactRepository.SingleOrDefault(x => x.TelesaleId == Telesale.Id);
            if (occupiedCall != null)
            {
                var callDetail = new CallDetail
                {
                    OccupiedId = occupiedCall.Id,
                    LeadPerson = occupiedCall.LeadPersonal,
                    Contact = occupiedCall.Contact,
                    Site = occupiedCall.Contact.Site
                };

                callDetail.Script = new TelesaleScriptProvider(occupiedCall.Contact, occupiedCall.Telesale,
                    occupiedCall.LeadPersonal).Get();

                throw new UnfinishedCallException(
                    "Same initial is been used by another caller or the last call has not been successfuly confirmed.",
                    callDetail);
            }

            return true;
        }