public async Task <OrderPlaced> Handle(PlaceOrder command)
        {
            var(clientId, offer) = CreateDomainModelFrom(command);
            var currentOffer = await _calculatePrices.For(clientId,
                                                          SalesChannel.OnlineSales,
                                                          offer.ProductAmounts,
                                                          offer.Currency);

            if (!offer.Equals(currentOffer))
            {
                throw new DomainException();
            }
            var order       = Order.FromOffer(offer);
            var orderHeader = new OrderHeader
            {
                Id               = order.Id.Value,
                ClientId         = clientId.Value,
                InvoicingDetails = command.InvoicingDetails
            };
            await _orders.Save(order);

            await _crudOperations.Create(orderHeader);

            var orderPlaced = CreateEventFrom(clientId, order);

            _eventsOutbox.Add(orderPlaced);
            return(orderPlaced);
        }
        public async Task <OfferConfirmed> Handle(ConfirmOfferCommand command)
        {
            var(orderId, offer) = CreateDomainModelFrom(command);
            var order = await _orders.GetBy(orderId);

            var orderHeader = await _orderHeaders.GetBy(orderId);

            var currentOffer = await _calculatePrices.For(orderHeader.ClientId,
                                                          SalesChannel.Wholesales,
                                                          offer.ProductAmounts,
                                                          offer.Currency);

            if (!offer.Equals(currentOffer))
            {
                throw new DomainException();
            }
            var priceChangesPolicy = await _priceChangesPolicies.ChooseFor(orderHeader.ClientId);

            var now = _clock.Now;

            order.ConfirmPrices(offer, now + _offerExpirationTime, now, priceChangesPolicy);
            await _orders.Save(order);

            return(CreateEventFrom(orderId, offer));
        }
        public async Task <OfferCalculated> Handle(GetOffer command)
        {
            var(orderId, currency) = CreateDomainModelFrom(command);
            var order = await _orders.GetBy(orderId);

            var clientId = await GetClient(orderId);

            var offer = await _calculatePrices.For(clientId, SalesChannel.Wholesales, order.ProductAmounts, currency);

            return(CreateEventFrom(orderId, offer));
        }
        public async Task <OrderPlaced> Handle(PlaceOrderCommand command)
        {
            var(clientId, offer) = CreateDomainModelFrom(command);
            var currentOffer = await _calculatePrices.For(clientId, SalesChannel.OnlineSales, offer.ProductAmounts, offer.Currency);

            if (!offer.Equals(currentOffer))
            {
                throw new DomainException();
            }
            var order = Order.FromOffer(offer);
            await _orders.Save(order);

            return(CreateEventFrom(clientId, order));
        }