コード例 #1
0
        public async Task <IHttpActionResult> Order([FromBody] OrderParams orderParams)
        {
            // Diese Prüfung soll immer für den aktuellen Benutzer (also nicht für den Besteller) ablaufen gemäss Telefonat mit Marlies Hertig
            var basket = await GetBasket();

            if (basket == null || basket.Count(i => !i.EinsichtsbewilligungNotwendig) == 0)
            {
                throw new BadRequestException("Order not is allowed, because there are no items in basket");
            }

            var userAccess = GetUserAccess();

            var bestellerId = !string.IsNullOrWhiteSpace(orderParams.UserId)
                ? orderParams.UserId
                : ControllerHelper.GetCurrentUserId();
            var bestellungIstFuerAndererBenutzer = ControllerHelper.GetCurrentUserId() != bestellerId;

            if (bestellungIstFuerAndererBenutzer)
            {
                if (GetCurrentUserAccess().RolePublicClient != AccessRoles.RoleBAR)
                {
                    throw new BadRequestException(
                              "Es wird versucht, für einen anderen Benutzer als den aktuellen Benutzer zu bestellen. Dazu fehlt aber die Berechtigung.");
                }

                orderParams.Comment = string.Join(" ", orderParams.Comment,
                                                  FrontendSettingsViaduc.Instance.GetTranslation(WebHelper.GetClientLanguage(Request),
                                                                                                 "order.frombar", "(Diese Bestellung wurde durch das Bundesarchiv ausgelöst.)"));
            }

            var orderItemIdsToExclude = basket
                                        .Where(basketItem => basketItem.EinsichtsbewilligungNotwendig ||
                                               orderParams.Type == OrderType.Digitalisierungsauftrag &&
                                               orderParams.OrderIdsToExclude != null && orderParams.OrderIdsToExclude.Contains(basketItem.Id))
                                        .Select(item => item.Id)
                                        .ToList();

            DateTime?leseSaalDateAsDateTime = null;

            switch (orderParams.Type)
            {
            case OrderType.Verwaltungsausleihe:
                ValidateVerwaltungsausleiheBestellung(userAccess);
                break;

            case OrderType.Digitalisierungsauftrag:
                await ValidateDigitalisierungsauftragBestellung(bestellerId, bestellungIstFuerAndererBenutzer,
                                                                userAccess, basket, orderItemIdsToExclude);

                break;

            case OrderType.Lesesaalausleihen:
                leseSaalDateAsDateTime = orderParams.LesesaalDate.ParseDateTimeSwiss();
                ValidateLesesaalBestellung(leseSaalDateAsDateTime);
                break;

            default:
                throw new BadRequestException(
                          $"Bestelltyp {orderParams.Type.ToString()} ist hier nicht unterstützt.");
            }

            if (userAccess.RolePublicClient == AccessRoles.RoleAS)
            {
                var settings = NinjectWebCommon.Kernel.Get <VerwaltungsausleiheSettings>();
                orderParams.ArtDerArbeit = (int)settings.ArtDerArbeitFuerAmtsBestellung;
            }

            var creationRequest = new OrderCreationRequest
            {
                OrderItemIdsToExclude = orderItemIdsToExclude,
                Type          = orderParams.Type,
                Comment       = orderParams.Comment,
                ArtDerArbeit  = orderParams.ArtDerArbeit,
                LesesaalDate  = leseSaalDateAsDateTime,
                CurrentUserId = ControllerHelper.GetCurrentUserId(),
                BestellerId   = bestellerId
            };

            var veInfoList = basket.Where(item => item.VeId.HasValue && !orderItemIdsToExclude.Contains(item.Id))
                             .Select(item => new VeInfo((int)item.VeId, item.Reason)).ToList();

            await kontrollstellenInformer.InformIfNecessary(userAccess, veInfoList);

            await client.CreateOrderFromBasket(creationRequest);

            return(Content <object>(HttpStatusCode.NoContent, null));
        }