public async Task <IHttpActionResult> GetKontingent(string forUserId = "") { var access = GetCurrentUserAccess(); var role = access.RolePublicClient.GetRolePublicClientEnum(); User user; if (!string.IsNullOrWhiteSpace(forUserId) && role == AccessRolesEnum.BAR) // BAR User bestellt im Namen eines anderen Benutzer, Kontingent für Empfänger zurückgeben { user = userDataAccess.GetUser(forUserId); } else { user = userDataAccess.GetUser(access.UserId); } if (user == null) { return(Content(HttpStatusCode.NotFound, $"User with id {forUserId} not found")); } var bestimmer = new KontingentBestimmer(digitalisierungsbeschraenkungSettings); var userOrderings = await client.GetOrderings(user.Id); var result = bestimmer.BestimmeKontingent(userOrderings, role, user); return(Ok(result)); }
private async Task ValidateDigitalisierungsauftragBestellung(string bestellerId, bool bestellungIstFuerAndererBenutzer, UserAccess userAccess, OrderItemDto[] basket, List <int> orderItemIdsToExclude) { var kontingentBestimmer = new KontingentBestimmer(digitalisierungsbeschraenkungSettings); var orderings = await client.GetOrderings(bestellerId); var role = bestellungIstFuerAndererBenutzer ? AccessRolesEnum.BAR : userAccess.RolePublicClient.GetRolePublicClientEnum(); var user = userDataAccess.GetUser(bestellerId); var result = kontingentBestimmer.BestimmeKontingent(orderings, role, user); // User should usually not see these validation-messages, as it is already checked on client (so no translation here) if (result.Bestellkontingent <= 0) { throw new BadRequestException( $"Das Bestellkontingent ist überschritten. Sie haben bereits {result.AktiveDigitalisierungsauftraege} aktive Aufträge."); } var anzahlgewaehlteAuftraege = basket.Select(i => i.Id).Except(orderItemIdsToExclude).Count(); if (anzahlgewaehlteAuftraege == 0) { throw new BadRequestException("Es wurden keine Aufträge für die Bestellung ausgewählt."); } if (result.Bestellkontingent < anzahlgewaehlteAuftraege) { throw new BadRequestException( $"Das Bestellkontingent wird überschritten. Sie haben {anzahlgewaehlteAuftraege} Aufträge ausgewählt, dürfen aber nur {result.Bestellkontingent} Aufträge bestellen."); } }
public void BestimmeKontingent_AktiveAuftraege_Should_Not_BeCalculatedFromOrderings_When_Ordering_Is_Not_Digitalisierung(OrderType orderType) { // arrange var setting = new DigitalisierungsbeschraenkungSettings(); var itemsFromOrdering = new List <OrderItem> { new OrderItem { Status = OrderStatesInternal.FreigabePruefen }, new OrderItem { Status = OrderStatesInternal.Ausgeliehen } }; var orderings = new List <Ordering> { new Ordering { Type = orderType, Items = itemsFromOrdering.ToArray() } }; var sut = new KontingentBestimmer(setting); // act var result = sut.BestimmeKontingent(orderings, AccessRolesEnum.Ö2, new User()); // assert result.AktiveDigitalisierungsauftraege.Should().Be(0); }
public void BestimmeKontingent_Bestellkontingent_Should_Be_Zero_When_Orderings_Equals_Threshold() { // arrange var setting = new DigitalisierungsbeschraenkungSettings { DigitalisierungsbeschraenkungBvw = 2 }; var itemsFromOrdering = new List <OrderItem> { new OrderItem { Status = OrderStatesInternal.FreigabePruefen // Zählt }, new OrderItem { Status = OrderStatesInternal.FuerDigitalisierungBereit // Zählt }, new OrderItem { Status = OrderStatesInternal.Abgebrochen // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.DigitalisierungAbgebrochen // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.ZumReponierenBereit // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.Abgeschlossen // Zählt nicht } }; var orderings = new List <Ordering> { new Ordering { Type = OrderType.Digitalisierungsauftrag, // zählt Items = itemsFromOrdering.ToArray() }, new Ordering { Type = OrderType.Einsichtsgesuch, // zählt nicht Items = itemsFromOrdering.ToArray() } }; var sut = new KontingentBestimmer(setting); // act var result = sut.BestimmeKontingent(orderings, AccessRolesEnum.BVW, new User()); // assert result.AktiveDigitalisierungsauftraege.Should().Be(2); result.Digitalisierungesbeschraenkung.Should().Be(setting.DigitalisierungsbeschraenkungBvw); result.Bestellkontingent.Should().Be(0); }
public void BestimmeKontingent_Von_Oe1_Should_Throw_NotImplementedException() { // arrange var setting = new DigitalisierungsbeschraenkungSettings(); var orderings = new List <Ordering>(); var sut = new KontingentBestimmer(setting); // act var action = new Action(() => { sut.BestimmeKontingent(orderings, AccessRolesEnum.Ö1, new User()); }); // assert action.Should().Throw <ArgumentOutOfRangeException>(); }
public void BestimmeKontingent_AktiveAuftraege_Should_BeCalculatedFromOrderings_When_Ordering_Is_Digitalisierung() { // arrange var setting = new DigitalisierungsbeschraenkungSettings(); var itemsFromOrdering = new List <OrderItem> { new OrderItem { Status = OrderStatesInternal.FreigabePruefen // Zählt }, new OrderItem { Status = OrderStatesInternal.FuerDigitalisierungBereit // Zählt }, new OrderItem { Status = OrderStatesInternal.Abgebrochen // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.DigitalisierungAbgebrochen // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.ZumReponierenBereit // Zählt nicht }, new OrderItem { Status = OrderStatesInternal.Abgeschlossen // Zählt nicht } }; var orderings = new List <Ordering> { new Ordering { Type = OrderType.Digitalisierungsauftrag, Items = itemsFromOrdering.ToArray() } }; var sut = new KontingentBestimmer(setting); // act var result = sut.BestimmeKontingent(orderings, AccessRolesEnum.Ö2, new User()); // assert result.AktiveDigitalisierungsauftraege.Should().Be(2); }
public void BestimmeKontingent_Digitalisierungsbeschraekung_Should_Come_From_Settings() { // arrange var setting = new DigitalisierungsbeschraenkungSettings { DigitalisierungsbeschraenkungOe2 = 2 }; var orderings = new List <Ordering>(); var sut = new KontingentBestimmer(setting); // act var result = sut.BestimmeKontingent(orderings, AccessRolesEnum.Ö2, new User()); // assert result.Digitalisierungesbeschraenkung.Should().Be(setting.DigitalisierungsbeschraenkungOe2); }
public void BestimmeKontingent_Von_Oe1_Should_Throw_NotImplementedException() { // arrange var setting = new DigitalisierungsbeschraenkungSettings(); var orderings = new List <Ordering>(); var sut = new KontingentBestimmer(setting); // act var action = new Action(() => { sut.BestimmeKontingent(orderings, new User { RolePublicClient = AccessRoles.RoleOe1, Access = new UserAccess("1", AccessRoles.RoleOe1, "oe1", null, false) }); }); // assert action.Should().Throw <ArgumentOutOfRangeException>(); }
public void BestimmeKontingent_Bestellkontingent_Should_Be_Zero_When_User_DisablesThreshold_Ends_Yesterday() { // arrange var setting = new DigitalisierungsbeschraenkungSettings { DigitalisierungsbeschraenkungBar = 1 }; var itemsFromOrdering = new List <OrderItem> { new OrderItem { Status = OrderStatesInternal.FreigabePruefen // Zählt }, new OrderItem { Status = OrderStatesInternal.FuerDigitalisierungBereit // Zählt } }; var orderings = new List <Ordering> { new Ordering { Type = OrderType.Digitalisierungsauftrag, // zählt Items = itemsFromOrdering.ToArray() } }; var user = new User { DigitalisierungsbeschraenkungAufgehobenBis = DateTime.Now.AddDays(-1) }; var sut = new KontingentBestimmer(setting); // act var result = sut.BestimmeKontingent(orderings, AccessRolesEnum.BAR, user); // assert result.Bestellkontingent.Should().Be(0); }