public IResult TakePhone(string phoneId, string currentUserId)
        {
            TakeOrderResultViewModel model = new TakeOrderResultViewModel();

            Phone phone = this.Data.Phones.All()
                          .Where(p => p.PhoneNumber == phoneId)
                          .FirstOrDefault();

            if (phone == null)
            {
                return(this.ErrorResult("Error: There is no such phone"));
            }

            if (phone.PhoneStatus != PhoneStatus.Taken)
            {
                return(this.ErrorResult(string.Format("Error: Phone status is {0}. It can be taken back.", phone.PhoneStatus.ToString())));
            }

            PhoneNumberOrder takeOrder = this.Data.PhoneNumberOrders.All()
                                         .Where(p => p.PhoneNumber == phoneId)
                                         .OrderByDescending(p => p.Id)
                                         .FirstOrDefault();

            if (takeOrder == null)
            {
                return(this.ErrorResult(string.Format("Error: There is no order for this phone {0}", phoneId)));
            }

            if (takeOrder.PhoneAction != PhoneAction.TakePhone)
            {
                return(this.ErrorResult(string.Format("Error: Order status is {0} for phone {1}. It can be taken back.",
                                                      takeOrder.PhoneAction.ToString(), phoneId)));
            }

            PhoneNumberOrder order = new PhoneNumberOrder()
            {
                ActionDate  = DateTime.Now,
                AdminId     = currentUserId,
                PhoneNumber = phoneId,
                UserId      = takeOrder.UserId,
                PhoneAction = PhoneAction.GiveBackPhone
            };

            User user = this.Data.Users.GetById(order.UserId);

            user.IsActive = true;

            this.Data.PhoneNumberOrders.Add(order);
            this.Data.Users.Update(user);
            phone.PhoneStatus = PhoneStatus.Free;
            phone.UserId      = null;
            this.Data.Phones.Update(phone);

            // TODO phone available after logic

            try
            {
                this.Data.SaveChanges();
            }
            catch (Exception ex)
            {
                ErrorResult errors = new ErrorResult();
                foreach (var key in ex.Data.Keys)
                {
                    errors.Add(key + " " + ex.Data[key]);
                }

                return(errors);
            }

            MessageResult message = new MessageResult();

            message.Add(string.Format("Order with id {0} was created", order.Id));
            message.Add(string.Format("Phone with id {0} was set to free and available after {1}", phone.PhoneNumber, phone.AvailableAfter));
            return(message);
        }