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)); }