Exemplo n.º 1
0
        public async Task CreateOrderFromBasket(OrderCreationRequest creationRequest)
        {
            using (var t = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
            {
                // Transform the basket into an order
                var orderingId = await sqlDataAccess.CreateOrderFromBasket(creationRequest);

                if (creationRequest.BestellerId != creationRequest.CurrentUserId)
                {
                    await sqlDataAccess.ChangeUserForOrdering(orderingId, creationRequest.BestellerId);
                }

                // get the order items of the order
                var order = await sqlDataAccess.GetOrdering(orderingId);

                if (creationRequest.FunktionDigitalisierungAusloesen)
                {
                    // Digitalisierungs-Kategorie Gesuch setzen
                    await sqlDataAccess.UpdateDigipool(order.Items.Select(i => i.Id).ToList(), (int)DigitalisierungsKategorie.Gesuch, null);

                    foreach (var orderItem in order.Items)
                    {
                        orderItem.DigitalisierungsKategorie = DigitalisierungsKategorie.Gesuch;
                    }
                }

                // Execute state change
                await statusWechsler.Execute(oi => oi.Bestellen(), order.Items, GetUser(creationRequest.CurrentUserId), DateTime.Now);

                // If we are here, we can commit all pending updates
                t.Complete();
            }
        }
        /// <summary>
        ///     Lädt zu jedem OrderItem das entsprechende Ordering von der DB.
        ///     Das Ordering muss auch seine OrderItems enthalten.
        ///     Dabei sicherstellen, dass ein-und dasselbe OrderItem in Ordering.OrderItems
        ///     auftaucht, wie auch in den orderItems[] enthalten ist.
        /// </summary>
        private async Task LoadOrderings()
        {
            foreach (var orderItem in orderItems)
            {
                if (!orderingsById.TryGetValue(orderItem.OrderId, out var ordering))
                {
                    ordering = await orderDataAccess.GetOrdering(orderItem.OrderId);

                    orderingsById[orderItem.OrderId] = ordering;
                }

                // OrderItems ersetzen, damit nicht doppel geladen:
                for (var idx = 0; idx < ordering.Items.Length; idx++)
                {
                    if (ordering.Items[idx].Id == orderItem.Id)
                    {
                        ordering.Items[idx] = orderItem;
                        break;
                    }
                }
            }
        }
Exemplo n.º 3
0
        public async Task Consume(ConsumeContext <InVorlageExportierenRequest> context)
        {
            using (LogContext.PushProperty(nameof(context.ConversationId), context.ConversationId))
            {
                Log.Information("Received {CommandName} command with conversationId {ConversationId} from the bus",
                                context.Message.GetType().Name, context.ConversationId);

                string userId = null;
                foreach (var id in context.Message.OrderItemIds)
                {
                    var item = await orderDataAccess.GetOrderItem(id);

                    if (item == null)
                    {
                        throw new Exception("Invalid OrderItem: " + id);
                    }

                    var order = await orderDataAccess.GetOrdering(item.OrderId, false);

                    if (string.IsNullOrEmpty(userId))
                    {
                        userId = order?.UserId;
                    }
                    else
                    {
                        if (userId != order?.UserId)
                        // Der Gesuchsteller wird im Mail angezeigt und mehrere werden nicht unterstützt
                        {
                            throw new BadRequestException("Es dürfen nur Gesuche vom gleichen Gesuchsteller verarbeitet werden");
                        }
                    }
                }

                var m = context.Message;
                await manager.InVorlageExportieren(m.CurrentUserId, m.OrderItemIds, m.Vorlage, m.Sprache);

                await context.RespondAsync(new InVorlageExportierenResponse());
            }
        }