private List <DetailField> GetOrderingFieldsInternal(ModulFunktionsblock modulFunktionsblock) { var access = ManagementControllerHelper.GetUserAccess(); var retFields = new List <DetailField>(); var fields = typeof(OrderingFlatItem).GetProperties(); foreach (var field in fields) { var isReadonly = true; IEditRequiresFeatureAttribute attr; switch (modulFunktionsblock) { case ModulFunktionsblock.AuftragsuebersichAuftraege: attr = field.GetCustomAttributes(true).OfType <EditAuftragRequiresFeatureAttribute>().FirstOrDefault(); break; case ModulFunktionsblock.AuftragsuebersichEinsichtsgesuch: attr = field.GetCustomAttributes(true).OfType <EditEinsichtsgesuchRequiresFeatureAttribute>().FirstOrDefault(); break; default: throw new ArgumentOutOfRangeException(); } if (attr != null) { var features = attr.RequiredFeatures; if (features.Any(f => access.HasFeature(f))) { isReadonly = false; } } var name = field.Name; retFields.Add(new DetailField { Name = name, IsReadonly = isReadonly }); } return(retFields); }
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)); }
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)); }