/// <summary>
        ///     Mappt Elastic-Daten auf ein Auftragsdetail, somit werden die zum Zeitpunkt der Bestellung aufgenommenen Index-Daten
        ///     temporär überschrieben
        ///     Damit das Admin-Backend statt "nicht-sichtbar" die korrekten, echten Daten sehen
        /// </summary>
        /// <param name="snapshot"></param>
        /// <param name="item"></param>
        public static void ApplySnapshotToDetailItem(OrderingIndexSnapshot snapshot, OrderingFlatItem item)
        {
            foreach (var snapshotProperty in typeof(OrderingIndexSnapshot).GetProperties())
            {
                try
                {
                    var itemProperty = typeof(OrderingFlatItem).GetProperty(snapshotProperty.Name);
                    if (itemProperty == null || itemProperty.PropertyType != snapshotProperty.PropertyType)
                    {
                        continue;
                    }

                    itemProperty.SetValue(item, snapshotProperty.GetValue(snapshot));
                }
                catch (Exception ex)
                {
                    Log.Warning(ex, "Error when applying indexsnapshot to detail item");
                }
            }

            // Ausnahmen, die sich nicht automatisch mappen lassen
            item.BehaeltnisNummer = snapshot.BehaeltnisCode;
        }
        public void When_Applying_An_ElasticSnapshot_To_Detailitem_It_Should_Replace_Unknown_Texts_With_Real_Data()
        {
            // arrange
            var detailItem = new OrderingFlatItem();
            var snapshot   = new OrderingIndexSnapshot();

            foreach (var prop in detailItem.GetType().GetProperties().Where(p => p.PropertyType == typeof(string)))
            {
                var isElasticProperty = typeof(OrderingIndexSnapshot).GetProperty(prop.Name) != null;
                if (!isElasticProperty)
                {
                    continue;
                }

                prop.SetValue(detailItem, "HIDDEN");
            }

            detailItem.BehaeltnisNummer = "HIDDEN";
            SetAllStringPropertiesWithThisText(snapshot, "SECRET");

            // act
            OrderHelper.ApplySnapshotToDetailItem(snapshot, detailItem);

            // assert
            foreach (var prop in typeof(OrderingFlatItem)
                     .GetProperties()
                     .Where(p => p.PropertyType == typeof(string)))
            {
                var value = prop.GetValue(detailItem) as string;
                if (value == null || string.IsNullOrEmpty(value))
                {
                    continue;
                }

                value.Should().Be("SECRET", $"Field {prop.Name} must have the value of the snapshot");
            }
        }
        private async Task <IHttpActionResult> UpdateOrderItem([FromBody] OrderingFlatItem flatItem, ModulFunktionsblock modulFunktionsblock)
        {
            var existingOrdering = await orderManagerClient.GetOrdering(flatItem.OrderId);

            if (existingOrdering == null)
            {
                return(BadRequest("Ordering does not exist in DB"));
            }

            var existingItem = existingOrdering.Items.FirstOrDefault(i => i.Id == flatItem.ItemId);

            if (existingItem == null)
            {
                return(BadRequest("OrderItem does not exist in DB"));
            }

            var updateOrderingData  = new UpdateOrderingData();
            var updateOrderItemData = new UpdateOrderItemData();

            // map flatitem back to to ordering & orderitem
            foreach (var field in GetOrderingFieldsInternal(modulFunktionsblock))
            {
                var flatItemProperty = typeof(OrderingFlatItem).GetProperty(field.Name);
                if (flatItemProperty == null)
                {
                    throw new ArgumentOutOfRangeException(field.Name);
                }

                var newVal          = flatItemProperty.GetValue(flatItem);
                var originAttribute = flatItemProperty.GetCustomAttributes(true).OfType <OriginAttribute>().FirstOrDefault();

                if (string.IsNullOrWhiteSpace(originAttribute?.Column) || string.IsNullOrWhiteSpace(originAttribute.Table))
                {
                    continue; // field is not updateable, because it is missing the origin attribute
                }

                switch (originAttribute.Table)
                {
                case nameof(Ordering):
                    EnsureUpdateIsGranted(newVal, existingOrdering, originAttribute.Column, field.IsReadonly);
                    Reflective.SetValue(updateOrderingData, originAttribute.Column, newVal);
                    break;

                case nameof(OrderItem):
                    EnsureUpdateIsGranted(newVal, existingItem, originAttribute.Column, field.IsReadonly);
                    Reflective.SetValue(updateOrderItemData, originAttribute.Column, newVal);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(originAttribute.Table), $"Unknown table: {originAttribute.Table}");
                }
            }

            if (flatItem.Status == (int)OrderStatesInternal.Ausgeliehen && !existingItem.Ausleihdauer.Equals(flatItem.Ausleihdauer))
            {
                var user = ControllerHelper.UserDataAccess.GetUser(ControllerHelper.GetCurrentUserId());
                updateOrderItemData.InternalComment = updateOrderItemData.InternalComment.Prepend(
                    $"Erwartetes Rückgabedatum von {existingItem.Ausgabedatum.Value.AddDays(existingItem.Ausleihdauer):dd.MM.yyyy} " +
                    $"auf {flatItem.Ausgabedatum.Value.AddDays(flatItem.Ausleihdauer):dd.MM.yyyy} angepasst," +
                    $" {DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}, {user.FirstName} {user.FamilyName}");
            }

            var data = new UpdateOrderDetailData
            {
                OrderItem = updateOrderItemData,
                Ordering  = updateOrderingData
            };

            await orderManagerClient.UpdateOrderDetail(data);

            return(StatusCode(HttpStatusCode.NoContent));
        }
 public async Task <IHttpActionResult> EinsichtsgesuchUpdateOrderItem([FromBody] OrderingFlatItem flatItem)
 {
     return(await UpdateOrderItem(flatItem, ModulFunktionsblock.AuftragsuebersichEinsichtsgesuch));
 }
Exemplo n.º 5
0
        private async Task <IHttpActionResult> UpdateOrderItem([FromBody] OrderingFlatItem flatItem, ModulFunktionsblock modulFunktionsblock)
        {
            var existingOrdering = await orderManagerClient.GetOrdering(flatItem.OrderId);

            if (existingOrdering == null)
            {
                return(BadRequest("Ordering does not exist in DB"));
            }

            var existingItem = existingOrdering.Items.FirstOrDefault(i => i.Id == flatItem.ItemId);

            if (existingItem == null)
            {
                return(BadRequest("OrderItem does not exist in DB"));
            }

            var updateOrderingData  = new UpdateOrderingData();
            var updateOrderItemData = new UpdateOrderItemData();

            // map flatitem back to to ordering & orderitem
            foreach (var field in GetOrderingFieldsInternal(modulFunktionsblock))
            {
                var flatItemProperty = typeof(OrderingFlatItem).GetProperty(field.Name);
                if (flatItemProperty == null)
                {
                    throw new ArgumentOutOfRangeException(field.Name);
                }

                var newVal          = flatItemProperty.GetValue(flatItem);
                var originAttribute = flatItemProperty.GetCustomAttributes(true).OfType <OriginAttribute>().FirstOrDefault();

                if (string.IsNullOrWhiteSpace(originAttribute?.Column) || string.IsNullOrWhiteSpace(originAttribute.Table))
                {
                    continue; // field is not updateable, because it is missing the origin attribute
                }

                switch (originAttribute.Table)
                {
                case nameof(Ordering):
                    EnsureUpdateIsGranted(newVal, existingOrdering, originAttribute.Column, field.IsReadonly);
                    Reflective.SetValue(updateOrderingData, originAttribute.Column, newVal);
                    break;

                case nameof(OrderItem):
                    EnsureUpdateIsGranted(newVal, existingItem, originAttribute.Column, field.IsReadonly);
                    Reflective.SetValue(updateOrderItemData, originAttribute.Column, newVal);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(originAttribute.Table), $"Unknown table: {originAttribute.Table}");
                }
            }

            var data = new UpdateOrderDetailData
            {
                OrderItem = updateOrderItemData,
                Ordering  = updateOrderingData
            };

            await orderManagerClient.UpdateOrderDetail(data);

            return(StatusCode(HttpStatusCode.NoContent));
        }