diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html index be0c599a5b7e04df8b03cbe0c51568aed474e709..e86356acece82f9d84a903d8a71d0181ffc5c6bf 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html @@ -23,7 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<ng-container *ngIf="vorgang | hasLink: linkRel.ABSCHLIESSEN"> +<ng-container *ngIf="isVisible"> <ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button" diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts index 4d98aa579e9927feab12c1474ebc7dfaddb8e926..53f7eb0cbc0b54c8a83a4bba21443ce3377cd2b8 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts @@ -22,22 +22,10 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { CommandResource } from '@alfa-client/command-shared'; -import { - HasLinkPipe, - StateResource, - createEmptyStateResource, - createStateResource, -} from '@alfa-client/tech-shared'; +import { createEmptyStateResource, createStateResource, HasLinkPipe, StateResource, } from '@alfa-client/tech-shared'; import { mock } from '@alfa-client/test-utils'; -import { - IconButtonWithSpinnerComponent, - OzgcloudStrokedButtonWithSpinnerComponent, -} from '@alfa-client/ui'; -import { - VorgangCommandService, - VorgangStatus, - VorgangWithEingangLinkRel, -} from '@alfa-client/vorgang-shared'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, } from '@alfa-client/ui'; +import { VorgangCommandService, VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -126,7 +114,7 @@ describe('AbschliessenButtonComponent', () => { }); it('should be hidden', () => { - component.vorgang = createVorgangWithEingangResource(); + component.isVisible = false; fixture.detectChanges(); const buttonElement = fixture.nativeElement.querySelector(abschliessenButton); @@ -135,9 +123,7 @@ describe('AbschliessenButtonComponent', () => { }); it('should be visible', () => { - component.vorgang = createVorgangWithEingangResource([ - VorgangWithEingangLinkRel.ABSCHLIESSEN, - ]); + component.isVisible = true; fixture.detectChanges(); const buttonElement = fixture.nativeElement.querySelector(abschliessenButton); @@ -153,7 +139,7 @@ describe('AbschliessenButtonComponent', () => { }); it('should be hidden', () => { - component.vorgang = createVorgangWithEingangResource(); + component.isVisible = false; fixture.detectChanges(); const buttonElement = fixture.nativeElement.querySelector(abschliessenIconButton); @@ -161,11 +147,8 @@ describe('AbschliessenButtonComponent', () => { expect(buttonElement).not.toBeInstanceOf(HTMLElement); }); - it('should be visible', () => { - component.vorgang = createVorgangWithEingangResource([ - VorgangWithEingangLinkRel.ABSCHLIESSEN, - ]); + component.isVisible = true; fixture.detectChanges(); const buttonElement = fixture.nativeElement.querySelector(abschliessenIconButton); @@ -173,4 +156,58 @@ describe('AbschliessenButtonComponent', () => { expect(buttonElement).toBeInstanceOf(HTMLElement); }); }); + + describe('set vorgang', () => { + it('should set vorgang with eingang resource', () => { + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); + + component.vorgang = vorgang; + + expect(component.vorgangWithEingangResource).toBe(vorgang); + }); + + it('should set visible to true', () => { + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.ABSCHLIESSEN, + ]); + component.vorgang = vorgang; + + const isVisible: boolean = component.isVisible; + + expect(isVisible).toBeTruthy(); + }); + + it('should set visible to false', () => { + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); + component.vorgang = vorgang; + + const isVisible: boolean = component.isVisible; + + expect(isVisible).toBeFalsy(); + }); + + it('should set visible to false if have createBescheidDraft link', () => { + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.ABSCHLIESSEN, + VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT, + ]); + component.vorgang = vorgang; + + const isVisible: boolean = component.isVisible; + + expect(isVisible).toBeFalsy(); + }); + + it('should set visible to false if have bescheidDraft link', () => { + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.ABSCHLIESSEN, + VorgangWithEingangLinkRel.BESCHEID_DRAFT, + ]); + component.vorgang = vorgang; + + const isVisible: boolean = component.isVisible; + + expect(isVisible).toBeFalsy(); + }); + }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts index 15df48ad2b497eed92ec4dfd36278e18fd3e506f..891dc472cdf377bc9ee28125b925d6a1bcd2dacf 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts @@ -22,13 +22,10 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { CommandResource } from '@alfa-client/command-shared'; -import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared'; -import { - VorgangCommandService, - VorgangWithEingangLinkRel, - VorgangWithEingangResource, -} from '@alfa-client/vorgang-shared'; +import { createEmptyStateResource, notHasLink, StateResource } from '@alfa-client/tech-shared'; +import { VorgangCommandService, VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; import { Component, Input, OnInit } from '@angular/core'; +import { hasLink } from '@ngxp/rest'; import { Observable, of } from 'rxjs'; @Component({ @@ -37,9 +34,19 @@ import { Observable, of } from 'rxjs'; styleUrls: ['./abschliessen-button.component.scss'], }) export class AbschliessenButtonComponent implements OnInit { - @Input() vorgang: VorgangWithEingangResource; + @Input() set vorgang(vorgang: VorgangWithEingangResource) { + this.vorgangWithEingangResource = vorgang; + this.isVisible = + hasLink(vorgang, VorgangWithEingangLinkRel.ABSCHLIESSEN) && + notHasLink(vorgang, VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT) && + notHasLink(vorgang, VorgangWithEingangLinkRel.BESCHEID_DRAFT); + } + @Input() showAsIconButton: boolean = false; + public isVisible: boolean = false; + vorgangWithEingangResource: VorgangWithEingangResource; + commandStateResource$: Observable<StateResource<CommandResource>> = of( createEmptyStateResource<CommandResource>(), ); @@ -53,6 +60,8 @@ export class AbschliessenButtonComponent implements OnInit { } public abschliessen(): void { - this.commandStateResource$ = this.vorgangCommandService.abschliessen(this.vorgang); + this.commandStateResource$ = this.vorgangCommandService.abschliessen( + this.vorgangWithEingangResource, + ); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java index b6524e0b584102bd93baebf1e6d489e994056a98..1977b5ffb63dbf495578eeac0ebce27d6d7a4af5 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessor.java @@ -15,6 +15,8 @@ import de.ozgcloud.alfa.bescheid.BescheidController.BescheidByVorgangController; import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; +import de.ozgcloud.alfa.common.user.CurrentUserService; +import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import lombok.RequiredArgsConstructor; @@ -29,11 +31,12 @@ class BescheidVorgangProcessor implements RepresentationModelProcessor<EntityMod private final BescheidService bescheidService; private final FeatureToggleProperties featureToggleProperties; + private final CurrentUserService currentUserService; @Override public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { var vorgang = model.getContent(); - if (Objects.isNull(vorgang)) { + if (Objects.isNull(vorgang) || currentUserService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)) { return model; } return ModelBuilder.fromModel(model) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java index 81ddfb139f273627653798ac0a8368ce32f6ab39..f4a517c4052a3658f8ecfc3d81e5ac5a6593c849 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java @@ -95,8 +95,8 @@ public class CurrentUserService { public Optional<UserId> findUserId() { return Optional.ofNullable(getSingleClaimValue(ATTRIBUTE_NAME_USER_ID) - .map(UserId::from) - .orElseGet(this::getInternalId)) + .map(UserId::from) + .orElseGet(this::getInternalId)) .filter(Objects::nonNull); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java index 510a3f2a395f726aabb88c0c29998bd89508f462..ec24740d58cd87f75c86a04801232b5076fe03f3 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidVorgangProcessorTest.java @@ -22,6 +22,8 @@ import org.springframework.hateoas.Link; import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.UserProfileUrlProvider; +import de.ozgcloud.alfa.common.user.CurrentUserService; +import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -35,8 +37,11 @@ class BescheidVorgangProcessorTest { @Spy @InjectMocks private BescheidVorgangProcessor processor; + @Mock private BescheidService service; + @Mock + private CurrentUserService currentUserService; @Mock private FeatureToggleProperties featureToggleProperties; @@ -53,6 +58,16 @@ class BescheidVorgangProcessorTest { assertThat(processedModel).isEqualTo(inputModel); } + @Test + void shouldReturnTheSameModelWhenUserIsEinheitlicherAnsprechpartner() { + var inputModel = EntityModel.of(VorgangWithEingangTestFactory.create()); + when(currentUserService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)).thenReturn(true); + + var processedModel = processor.process(inputModel); + + assertThat(processedModel).isEqualTo(inputModel); + } + @Test void shouldCallExistsBescheid() { initUserProfileUrlProvider(new UserProfileUrlProvider());