private MFulfillment_AllocateFulfillableItem RandomFulfillableItem() { var description = $"{Words.GetRandomAdjective()} {Words.GetRandomNoun()}"; var fulfillableItemReference = CreateFulfillableItemReference.FromTimestamp(GetUniqueNow()); var consumableReference = CreateConsumableReference.FromTimestamp(GetUniqueNow()); var components = new List <MFulfillment_AllocateFulfillableItemComponent>(); var max = Random.Next(9); for (int idx = 0; idx < max; ++idx) // Note: allow zero items { components.Add(RandomFulfillableItemComponent()); } return(new MFulfillment_AllocateFulfillableItem() { Description = description, FulfillableItemReference = fulfillableItemReference, ConsumableReference = consumableReference, FulfillableItemComponents = components }); }
private async Task HandleFulfillmentRequiredEventAsync(MOrder_OrderEvent eventData) { var fulfillableReference = CreateFulfillableReference.FromOrderId(eventData.OrderId); var existingFulfillableId = await FullfillmentMicroService.LookupFulfillableAsync(fulfillableReference); long fulfillableId; if (!existingFulfillableId.HasValue) { var allocateFulfillable = new MFulfillment_AllocateFulfillable() { FulfillableReference = fulfillableReference, Name = $"Order {eventData.OrderNumber}", ShippingAddress = eventData.ShippingAddress, FulfillableItems = new List <MFulfillment_AllocateFulfillableItem>() }; foreach (var fulfillmentEventItem in eventData.OrderEventItems) { var fulfillableItemReference = CreateFulfillableItemReference.FromOrderItemId(fulfillmentEventItem.OrderItemId); var allocateFulfillableItem = new MFulfillment_AllocateFulfillableItem() { FulfillableItemReference = fulfillableItemReference, Description = fulfillmentEventItem.Description, ConsumableReference = fulfillmentEventItem.ConsumableReference, FulfillableItemComponents = new List <MFulfillment_AllocateFulfillableItemComponent>() }; foreach (var fulfillmentEventItemComponent in fulfillmentEventItem.OrderEventItemComponents) { var allocateFulfillableItemComponent = new MFulfillment_AllocateFulfillableItemComponent() { Description = fulfillmentEventItemComponent.Description, ConsumableReference = fulfillmentEventItemComponent.ConsumableReference, Quantity = fulfillmentEventItemComponent.Quantity }; allocateFulfillableItem.FulfillableItemComponents.Add(allocateFulfillableItemComponent); } allocateFulfillable.FulfillableItems.Add(allocateFulfillableItem); } var allocateFulfillableResponse = await FullfillmentMicroService.AllocateFulfillableAsync(allocateFulfillable); fulfillableId = allocateFulfillableResponse.FulfillableId; } else { fulfillableId = existingFulfillableId.Value; } //LogMessage($"Fullfillable ID = {fulfillableId}."); foreach (var fulfillmentEventItem in eventData.OrderEventItems) { if (fulfillmentEventItem.RequiredQuantity != 0) { var fulfillableItemReference = CreateFulfillableItemReference.FromOrderItemId(fulfillmentEventItem.OrderItemId); var fulfillableItemId = await FullfillmentMicroService.LookupFulfillableItemAsync(fulfillableItemReference); if (fulfillableItemId.HasValue) { await FullfillmentMicroService.SetFulfillmentRequestQuantity(fulfillableItemId.Value, fulfillmentEventItem.RequiredQuantity, eventData.UnitOfWork).ConfigureAwait(false); } else { throw new InvalidOperationException($"Fulfillable item not found for reference {fulfillableItemReference}"); } } } }