public Task <FurnitureReservationResult> Handle(FurnitureReservationRequest request, CancellationToken cancellationToken)
        {
            var result = new FurnitureReservationResult();


            Contract.AddNotifications(
                request.User.Contract
                , request.Payment.Contract
                , request.Furniture.Contract);


            if (Contract.Invalid)
            {
                foreach (var notification in Contract.Notifications)
                {
                    result.Errors.Add(notification.Message);
                }
                return(Task.FromResult(result));
            }

            try
            {
                if (_furnitureRep.AlreadyHostedForThisTime(
                        request.Furniture,
                        request.Checkin.Date,
                        request.Checkout.Date
                        ))
                {
                    Contract.AddNotification("Furniture handler", "this furniture already hosted for this time");
                }
            }
            catch (Exception ex)
            {
                Contract.AddNotification("Internal error", ex.Message);

                result.Errors.Add(ex.Message);
                return(Task.FromResult(result));
            }


            var newAccomodationReserve = new Acommodation(
                request.User,
                request.Furniture,
                request.Checkin,
                request.Checkout);

            newAccomodationReserve.AddPayment(request.Payment);

            if (newAccomodationReserve.Contract.Invalid)
            {
                Contract.AddNotifications(newAccomodationReserve.Contract);
            }



            if (Contract.Invalid)
            {
                foreach (var notification in Contract.Notifications)
                {
                    result.Errors.Add(notification.Message);
                }
                return(Task.FromResult(result));
            }



            try
            {
                _paymentService.makeAPayment(request.Payment);
                _acommodationRep.AddAcommodationAndUpdateFurnitureSchedule(newAccomodationReserve);
            }
            catch (Exception ex)
            {
                Contract.AddNotification("External error", ex.Message);

                result.Errors.Add(ex.Message);
                return(Task.FromResult(result));
            }


            result.FurnitureDetails = newAccomodationReserve.Furniture;
            result.Checkin          = newAccomodationReserve.Checkin;
            result.Checkout         = newAccomodationReserve.Checkout;

            return(Task.FromResult(result));
        }