diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts index c7dc8db99cd709ae5909a5b10db662801357276e..4c05bd47b57fa99637c1ca250fce6105363dfa46 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts @@ -1,6 +1,7 @@ import { Resource } from '@ngxp/rest'; export interface Bescheid { + id?: string; beschiedenAm: string; bewilligt: boolean; bescheidDocument?: string; diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts index 22aa4fbf7a5fb3411866f82b3feb2947fc246c93..3113ffb78ef2f532a99726a91adaeae3475f00e8 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts @@ -1,15 +1,27 @@ import { mock, Mock, useFromMock } from '@alfa-client/test-utils'; -import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { + VorgangService, + VorgangWithEingangLinkRel, + VorgangWithEingangResource, +} from '@alfa-client/vorgang-shared'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { BescheidFacade } from './+state/bescheid.facade'; import { BescheidService } from './bescheid.service'; import { buildCreateBescheidCommand } from './bescheid.util'; import { Observable, of } from 'rxjs'; -import { createStateResource, StateResource } from '@alfa-client/tech-shared'; +import { + createEmptyStateResource, + createStateResource, + StateResource, +} from '@alfa-client/tech-shared'; import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; +import { CommandOrder, CommandService, CreateCommand } from '@alfa-client/command-shared'; +import faker from '@faker-js/faker'; +import { createBescheidResource } from '../test/bescheid'; +import { createCommandStateResource } from '../../../command-shared/test/command'; import { singleCold } from '../../../tech-shared/src/lib/resource/marbles'; import { BescheidResource } from './bescheid.model'; -import { createBescheidResource } from '../test/bescheid'; +import { cold } from 'jest-marbles'; describe('BescheidService', () => { let service: BescheidService; @@ -17,6 +29,7 @@ describe('BescheidService', () => { let facade: Mock<BescheidFacade>; let vorgangService: Mock<VorgangService>; let resourceRepository: Mock<ResourceRepository>; + let commandService: Mock<CommandService>; const vorgangWithEingangStateResource$: Observable<StateResource<VorgangWithEingangResource>> = of(createStateResource(createVorgangWithEingangResource())); @@ -25,12 +38,13 @@ describe('BescheidService', () => { facade = mock(BescheidFacade); vorgangService = mock(VorgangService); resourceRepository = mock(ResourceRepository); - + commandService = mock(CommandService); vorgangService.getVorgangWithEingang.mockReturnValue(vorgangWithEingangStateResource$); service = new BescheidService( useFromMock(facade), useFromMock(vorgangService), + useFromMock(commandService), useFromMock(resourceRepository), ); }); @@ -73,7 +87,11 @@ describe('BescheidService', () => { }); describe('createBescheid', () => { - const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); + let vorgangWithEingang: VorgangWithEingangResource; + + beforeEach(() => { + vorgangWithEingang = createVorgangWithEingangResource(); + }); it('should call facade', () => { service.createBescheid(vorgangWithEingang); @@ -84,4 +102,126 @@ describe('BescheidService', () => { ); }); }); + + describe('bescheidLoeschenUndErstellungUeberspringen', () => { + let vorgangWithEingangResource: VorgangWithEingangResource; + let bescheidResource: BescheidResource; + let bescheidErstellungUeberspringen: jest.Mock; + let deleteBescheid: jest.Mock; + + beforeEach(() => { + vorgangWithEingangResource = createVorgangWithEingangResource(); + bescheidResource = createBescheidResource(); + bescheidErstellungUeberspringen = service.bescheidErstellungUeberspringen = jest.fn(); + deleteBescheid = service.deleteBescheid = jest.fn(); + bescheidErstellungUeberspringen.mockReturnValue(of(createCommandStateResource())); + deleteBescheid.mockReturnValue(of(createCommandStateResource())); + }); + + it('should Bescheiderstellung überspringen', (done) => { + const command$ = service.bescheidLoeschenUndErstellungUeberspringen( + vorgangWithEingangResource, + bescheidResource, + ); + + command$.subscribe(() => { + expect(bescheidErstellungUeberspringen).toHaveBeenCalledWith(vorgangWithEingangResource); + done(); + }); + }); + + it('should Bescheid löschen', (done) => { + const command$ = service.bescheidLoeschenUndErstellungUeberspringen( + vorgangWithEingangResource, + bescheidResource, + ); + + command$.subscribe(() => { + expect(deleteBescheid).toHaveBeenCalledWith( + bescheidResource.id, + vorgangWithEingangResource, + ); + done(); + }); + }); + + it('should emit delete bescheid command', () => { + const deleteBescheidCommand = createCommandStateResource(); + deleteBescheid.mockReturnValue(of(deleteBescheidCommand)); + + const command$ = service.bescheidLoeschenUndErstellungUeberspringen( + vorgangWithEingangResource, + bescheidResource, + ); + + expect(command$).toBeObservable(cold('(a|)', { a: deleteBescheidCommand })); + }); + }); + + describe('bescheidErstellungUeberspringen', () => { + let vorgangWithEingangResource: VorgangWithEingangResource; + + beforeEach(() => { + vorgangWithEingangResource = createVorgangWithEingangResource(); + commandService.createCommand.mockReturnValue(of(createCommandStateResource())); + }); + + it('should create command', (done) => { + const command$ = service.bescheidErstellungUeberspringen(vorgangWithEingangResource); + + command$.subscribe(() => { + expect(commandService.createCommand).toHaveBeenCalledWith( + vorgangWithEingangResource, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.VORGANG_ABSCHLIESSEN, + body: null, + } as CreateCommand, + ); + done(); + }); + }); + + it('should return command', () => { + const command = createCommandStateResource(); + commandService.createCommand.mockReturnValue(of(command)); + + const command$ = service.bescheidErstellungUeberspringen(vorgangWithEingangResource); + + expect(command$).toBeObservable(cold('(a|)', { a: command })); + }); + }); + + describe('deleteBescheid', () => { + let bescheidId: string; + let vorgang: VorgangWithEingangResource; + + beforeEach(() => { + bescheidId = faker.datatype.uuid(); + vorgang = createVorgangWithEingangResource(); + }); + + it('should create command', () => { + service.deleteBescheid(bescheidId, vorgang); + + expect(commandService.createCommand).toHaveBeenCalledWith( + vorgang, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.DELETE_BESCHEID, + body: null, + relationId: bescheidId, + } as CreateCommand, + ); + }); + + it('should return command', () => { + const command = createEmptyStateResource(); + commandService.createCommand.mockReturnValue(command); + + const createdCommand = service.deleteBescheid(bescheidId, vorgang); + + expect(createdCommand).toEqual(command); + }); + }); }); diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts index 6da8f80a4acffff5bed60dd3395f2d9a031bed07..8f5b54ded79a63c59a8b1b946dc83b290933227f 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -1,4 +1,4 @@ -import { CommandResource } from '@alfa-client/command-shared'; +import { CommandOrder, CommandResource, CommandService } from '@alfa-client/command-shared'; import { StateResource } from '@alfa-client/tech-shared'; import { VorgangService, @@ -6,7 +6,7 @@ import { VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, switchMap } from 'rxjs'; import { ResourceServiceConfig } from '../../../tech-shared/src/lib/resource/resource.model'; import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service'; @@ -21,6 +21,7 @@ export class BescheidService { constructor( private readonly facade: BescheidFacade, private readonly vorgangService: VorgangService, + private readonly commandService: CommandService, repository: ResourceRepository, ) { this.resourceService = new ResourceService(this.buildConfig(), repository); @@ -46,4 +47,41 @@ export class BescheidService { public createBescheid(vorgangWithEingang: VorgangWithEingangResource, bescheid?: Bescheid): void { this.facade.createBescheid(vorgangWithEingang, buildCreateBescheidCommand(bescheid)); } + + public bescheidLoeschenUndErstellungUeberspringen( + vorgangWithEingangResource: VorgangWithEingangResource, + bescheidResource: BescheidResource, + ): Observable<StateResource<CommandResource>> { + return this.bescheidErstellungUeberspringen(vorgangWithEingangResource).pipe( + switchMap(() => this.deleteBescheid(bescheidResource.id, vorgangWithEingangResource)), + ); + } + + public bescheidErstellungUeberspringen( + vorgangWithEingangResource: VorgangWithEingangResource, + ): Observable<StateResource<CommandResource>> { + return this.commandService.createCommand( + vorgangWithEingangResource, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.VORGANG_ABSCHLIESSEN, + body: null, + }, + ); + } + + public deleteBescheid( + bescheidId: string, + vorgangWithEingangResource: VorgangWithEingangResource, + ): Observable<StateResource<CommandResource>> { + return this.commandService.createCommand( + vorgangWithEingangResource, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.DELETE_BESCHEID, + relationId: bescheidId, + body: null, + }, + ); + } } diff --git a/alfa-client/libs/bescheid-shared/src/test/bescheid.ts b/alfa-client/libs/bescheid-shared/src/test/bescheid.ts index 447ce7902940277d309e84481a368f0d3ff9892a..aa3156fbb7f957d8ee0ccb9d22154a04bddc611c 100644 --- a/alfa-client/libs/bescheid-shared/src/test/bescheid.ts +++ b/alfa-client/libs/bescheid-shared/src/test/bescheid.ts @@ -1,8 +1,11 @@ import { Bescheid, BescheidResource } from '../lib/bescheid.model'; import { toResource } from 'libs/tech-shared/test/resource'; +import faker from '@faker-js/faker'; +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; export function createBescheid(): Bescheid { return { + id: faker.datatype.uuid(), beschiedenAm: '2024-01-01', bewilligt: true, }; @@ -11,3 +14,9 @@ export function createBescheid(): Bescheid { export function createBescheidResource(linkRel: string[] = []): BescheidResource { return toResource(createBescheid(), linkRel); } + +export function createBescheidStateResource( + linkRel: string[] = [], +): StateResource<BescheidResource> { + return createStateResource(createBescheidResource(linkRel)); +} diff --git a/alfa-client/libs/command-shared/src/lib/command.model.ts b/alfa-client/libs/command-shared/src/lib/command.model.ts index 1dbd3046f91c9e6079ad54cf6ccdd3ec7712ac0e..b01673cf043fe7b97e749d12bea509d2ae99cef5 100644 --- a/alfa-client/libs/command-shared/src/lib/command.model.ts +++ b/alfa-client/libs/command-shared/src/lib/command.model.ts @@ -27,6 +27,7 @@ import { Resource } from '@ngxp/rest'; export interface CreateCommand { order: CommandOrder | any; body?: any | CommandBody; + relationId?: string; } export interface CommandBody { @@ -80,6 +81,7 @@ export enum CommandOrder { LOESCH_ANFORDERUNG_ZURUECKNEHMEN = 'LOESCH_ANFORDERUNG_ZURUECKNEHMEN', CREATE_BESCHEID = 'CREATE_BESCHEID', SET_AKTENZEICHEN = 'SET_AKTENZEICHEN', + DELETE_BESCHEID = 'DELETE_BESCHEID', } export enum CommandOrderType { diff --git a/alfa-client/libs/command-shared/test/command.ts b/alfa-client/libs/command-shared/test/command.ts index eeb9f2dba68b587edc8d0f16ccb46c6cb4bde4c6..9668c8d8136b41f729b33ce7b3dcfecb876cfeaa 100644 --- a/alfa-client/libs/command-shared/test/command.ts +++ b/alfa-client/libs/command-shared/test/command.ts @@ -35,6 +35,7 @@ import { CreateCommand, CreateCommandProps, } from '../src/lib/command.model'; +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; export function createCommand(): Command { return { @@ -55,6 +56,10 @@ export function createCommandResources(linkRelations: string[] = []): CommandRes return times(10, () => toResource(createCommandResource(), [...linkRelations])); } +export function createCommandStateResource(linkRel: string[] = []): StateResource<CommandResource> { + return createStateResource(createCommandResource(linkRel)); +} + export function createCommandListResource( commandResources: CommandResource[] = createCommandResources(), linkRelations: string[] = [], diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts index 07ef0798552c6f98fdeed8603fca545ebf05562c..293d3e918580059d0aed36eb52051663afd945d7 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { EMPTY_ARRAY } from '@alfa-client/tech-shared'; +import { EMPTY_ARRAY, notHasLink } from '@alfa-client/tech-shared'; import { Resource } from '@ngxp/rest'; import { createDummyListResource, @@ -39,6 +39,8 @@ import { isResourceDifferent, isValidStateResource, } from './resource.util'; +import { createCommandResource } from '../../../../command-shared/test/command'; +import { CommandLinkRel } from '../../../../command-shared/src/lib/command.linkrel'; describe('resource util', () => { describe('isLoadingRequired', () => { @@ -189,4 +191,21 @@ describe('isResourceDifferent', () => { expect(isChanged).toBeFalsy(); }); + + describe('notHasLink', () => { + it('should return true', () => { + const result = notHasLink(createCommandResource(), CommandLinkRel.EFFECTED_RESOURCE); + + expect(result).toBeTruthy(); + }); + + it('should return true', () => { + const result = notHasLink( + createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]), + CommandLinkRel.EFFECTED_RESOURCE, + ); + + expect(result).toBeFalsy(); + }); + }); }); diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts index 08d17f6400cd22441ea75c8b6c57f0159a5f1109..78791500f052588d712548fe8274eff5d785d20e 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { encodeUrlForEmbedding, isNotNull } from '@alfa-client/tech-shared'; -import { getEmbeddedResource, getUrl, Resource, ResourceUri } from '@ngxp/rest'; +import { getEmbeddedResource, getUrl, hasLink, Resource, ResourceUri } from '@ngxp/rest'; import { isEqual, isNil } from 'lodash-es'; import { HttpError } from '../tech.model'; @@ -113,3 +113,7 @@ export function isResourceDifferent( export function throwErrorOn(condition: boolean, errorMsg: string): void { if (condition) throw Error(errorMsg); } + +export function notHasLink<T extends Resource>(resource: T, linkRel: string): boolean { + return !hasLink(resource, linkRel); +} diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts index e7c4b6524db9932fd85899a95f299bdc788b7486..805460d0d26cf91bd2e7252a077166622b424641 100644 --- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts +++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.spec.ts @@ -2,17 +2,19 @@ import { TestBed } from '@angular/core/testing'; import { Dialog, DialogConfig } from '@angular/cdk/dialog'; import { OzgcloudDialogService } from './ozgcloud-dialog.service'; -import { mock } from '@alfa-client/test-utils'; +import { Mock, mock } from '@alfa-client/test-utils'; describe('OzgcloudDialogService', () => { let service: OzgcloudDialogService; + let dialog: Mock<Dialog>; const component = <any>{ name: 'Component' }; - const dialog = mock(Dialog); const dialogData = { id: 'ZumBeispiel' }; const dialogConfigWithData: DialogConfig = { data: dialogData }; beforeEach(() => { + dialog = mock(Dialog); + TestBed.configureTestingModule({ providers: [ { @@ -29,10 +31,6 @@ describe('OzgcloudDialogService', () => { }); describe('open', () => { - beforeEach(() => { - dialog.open.mockReset(); - }); - it('should open dialog with data', () => { service.open(component, dialogData); @@ -47,10 +45,6 @@ describe('OzgcloudDialogService', () => { }); describe('openWizard', () => { - beforeEach(() => { - dialog.open.mockReset(); - }); - it('should open wizard dialog', () => { service.openWizard(component); diff --git a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts index 449aae405b44aa5f59152749e4e40c4e00798cfd..62cba4d267093de5a9b242dbb478fb1a87dbac12 100644 --- a/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts +++ b/alfa-client/libs/ui/src/lib/ui/ozgcloud-dialog/ozgcloud-dialog.service.ts @@ -35,4 +35,8 @@ export class OzgcloudDialogService { private openDialog<T>(component: ComponentType<T>, dialogConfig?: DialogConfig): DialogRef<T> { return this.dialog.open<T>(component, dialogConfig); } + + public closeAll(): void { + this.dialog.closeAll(); + } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts index 1b5791a219f69124dca4c77093010d54250cf451..82d1291e4c39cf5501b8feefeee3093005ae3878 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts @@ -1,6 +1,6 @@ import { Bescheid, BescheidService } from '@alfa-client/bescheid-shared'; import { createEmptyStateResource, formatForDatabase } from '@alfa-client/tech-shared'; -import { mock, useFromMock } from '@alfa-client/test-utils'; +import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { UntypedFormBuilder } from '@angular/forms'; @@ -14,13 +14,12 @@ registerLocaleData(localeDe); describe('BescheidenFormServiceService', () => { let service: BescheidenFormService; - - const bescheidService = mock(BescheidService); - + let bescheidService: Mock<BescheidService>; const now = new Date(); Date.now = jest.fn().mockReturnValue(now); beforeEach(() => { + bescheidService = mock(BescheidService); service = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); }); @@ -138,4 +137,15 @@ describe('BescheidenFormServiceService', () => { expect(service.vorgangWithEingangResource).toBe(vorgangWithEingangResource); }); }); + + describe('getVorgangWithEingangResource', () => { + it('should reutrn vorgangWithEingangResource', () => { + const vorgangWithEingangResource = createVorgangWithEingangResource(); + service.vorgangWithEingangResource = vorgangWithEingangResource; + + const vorang = service.getVorgangWithEingangResource(); + + expect(vorang).toBe(vorgangWithEingangResource); + }); + }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts index 5515fbf8f54812145bd9a6a8e943410338e109cf..1b14d33257f6f5ce68ffe686015be430034d8c7b 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts @@ -1,15 +1,15 @@ import { Bescheid, BescheidService } from '@alfa-client/bescheid-shared'; import { AbstractFormService, - StateResource, asBoolean, formatForDatabase, + StateResource, } from '@alfa-client/tech-shared'; import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { Injectable } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { isNil } from 'lodash-es'; -import { BehaviorSubject, Observable, map, startWith } from 'rxjs'; +import { BehaviorSubject, map, Observable, startWith } from 'rxjs'; @Injectable() export class BescheidenFormService extends AbstractFormService { @@ -86,4 +86,8 @@ export class BescheidenFormService extends AbstractFormService { ): void { this.vorgangWithEingangResource = vorgangWithEingangResource; } + + public getVorgangWithEingangResource(): VorgangWithEingangResource { + return this.vorgangWithEingangResource; + } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model.ts index c44625133f9a8739e215b4d72d33be87fbad044f..cdaaba160035bd674b9b97b2560b716ba44c1e4f 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model.ts @@ -5,3 +5,7 @@ export interface BescheidenDialogData { vorgangWithEingangResource: VorgangWithEingangResource; bescheidDraftResource?: BescheidResource; } + +export interface BescheiderstellungUeberspringenDialogData { + vorgangWithEingangResource: VorgangWithEingangResource; +} diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.spec.ts index 38d4b55a556221345205af61f2b824fe11d32b7e..cd1c843172aa1e4828f1a1e667412f3c75d0d865 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.spec.ts @@ -1,10 +1,9 @@ import { BescheidService } from '@alfa-client/bescheid-shared'; -import { mock, useFromMock } from '@alfa-client/test-utils'; +import { Mock, mock } from '@alfa-client/test-utils'; import { OzgcloudSvgIconComponent } from '@alfa-client/ui'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { UntypedFormBuilder } from '@angular/forms'; import { MatIcon } from '@angular/material/icon'; import { MockComponent } from 'ng-mocks'; import { BehaviorSubject } from 'rxjs'; @@ -17,38 +16,32 @@ describe('VorgangDetailBescheidenResultStatusComponent', () => { let component: VorgangDetailBescheidenResultStatusComponent; let fixture: ComponentFixture<VorgangDetailBescheidenResultStatusComponent>; - const bescheidService = mock(BescheidService); - const formService = new BescheidenFormService( - new UntypedFormBuilder(), - useFromMock(bescheidService), - ); - const bescheidChangesMock = jest.fn(); - bescheidChangesMock.mockReturnValue( - new BehaviorSubject({ beschiedenAm: new Date(), bewilligt: false }), - ); - formService.getBescheidChanges = bescheidChangesMock; + let bescheidService: Mock<BescheidService>; + let formService: Mock<BescheidenFormService>; beforeEach(async () => { - TestBed.overrideComponent(VorgangDetailBescheidenResultStatusComponent, { - set: { - providers: [ - { - provide: BescheidenFormService, - useValue: formService, - }, - { - provide: BescheidService, - useValue: bescheidService, - }, - ], - }, - }); + bescheidService = mock(BescheidService); + formService = mock(BescheidenFormService); + formService.getBescheidChanges.mockReturnValue( + new BehaviorSubject({ beschiedenAm: new Date(), bewilligt: false }), + ); + await TestBed.configureTestingModule({ declarations: [ VorgangDetailBescheidenResultStatusComponent, MatIcon, MockComponent(OzgcloudSvgIconComponent), ], + providers: [ + { + provide: BescheidenFormService, + useValue: formService, + }, + { + provide: BescheidService, + useValue: bescheidService, + }, + ], }).compileComponents(); fixture = TestBed.createComponent(VorgangDetailBescheidenResultStatusComponent); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.ts index 1dafab1f08b411ea2f54187289784735e11ba0a8..ea689654bbad5b54a1d5ddbed9c508c7e03de475 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component.ts @@ -4,7 +4,6 @@ import { BescheidenFormService } from '../../bescheiden.formservice'; @Component({ selector: 'alfa-vorgang-detail-bescheiden-result-status', templateUrl: './vorgang-detail-bescheiden-result-status.component.html', - styles: [], }) export class VorgangDetailBescheidenResultStatusComponent { constructor(public formService: BescheidenFormService) {} diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts index cac6414127bead528246228a2947e0b808bf49a7..195c9de8a0ab7fd4bf54050d39d16f9dfc58a892 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts @@ -1,4 +1,4 @@ -import { mock } from '@alfa-client/test-utils'; +import { Mock, mock } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MockComponent } from 'ng-mocks'; import { BescheidenFormService } from '../bescheiden.formservice'; @@ -9,9 +9,11 @@ describe('VorgangDetailBescheidenResultComponent', () => { let component: VorgangDetailBescheidenResultComponent; let fixture: ComponentFixture<VorgangDetailBescheidenResultComponent>; - const bescheidenFormService = mock(BescheidenFormService); + let bescheidenFormService: Mock<BescheidenFormService>; beforeEach(async () => { + bescheidenFormService = mock(BescheidenFormService); + await TestBed.configureTestingModule({ declarations: [ VorgangDetailBescheidenResultComponent, diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component.spec.ts index 85510f8c2ccc6297c0bdc3abba6a85a4224cfc23..f341daa2d8fe4004d725f6d76371169d7a8c7ecc 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component.spec.ts @@ -1,5 +1,5 @@ import { BescheidService } from '@alfa-client/bescheid-shared'; -import { mock, useFromMock } from '@alfa-client/test-utils'; +import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { DateEditorComponent } from '@alfa-client/ui'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; @@ -13,27 +13,12 @@ describe('VorgangDetailAntragBescheidenStepComponent', () => { let component: VorgangDetailAntragBescheidenStepComponent; let fixture: ComponentFixture<VorgangDetailAntragBescheidenStepComponent>; - const bescheidService = mock(BescheidService); - const formService = new BescheidenFormService( - new UntypedFormBuilder(), - useFromMock(bescheidService), - ); + let bescheidService: Mock<BescheidService>; + let formService: BescheidenFormService; beforeEach(async () => { - TestBed.overrideComponent(VorgangDetailAntragBescheidenStepComponent, { - set: { - providers: [ - { - provide: BescheidenFormService, - useValue: formService, - }, - { - provide: BescheidService, - useValue: bescheidService, - }, - ], - }, - }); + bescheidService = mock(BescheidService); + formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); await TestBed.configureTestingModule({ declarations: [ VorgangDetailAntragBescheidenStepComponent, @@ -43,6 +28,16 @@ describe('VorgangDetailAntragBescheidenStepComponent', () => { MockComponent(MatIcon), ], imports: [ReactiveFormsModule], + providers: [ + { + provide: BescheidenFormService, + useValue: formService, + }, + { + provide: BescheidService, + useValue: bescheidService, + }, + ], }).compileComponents(); fixture = TestBed.createComponent(VorgangDetailAntragBescheidenStepComponent); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.html index 4127fdefb5e7a1c4f61ddb8a5ae39b0a1d1d0006..a216435fc62bd74cf35bee3ed62d0fa40a8a72f5 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.html @@ -28,3 +28,7 @@ [activeStep]="activeStep" > </alfa-vorgang-detail-bescheiden-step-content> + +<alfa-vorgang-detail-bescheiden-ueberspringen-button + *ngIf="showBescheiderstellungUeberspringen" +></alfa-vorgang-detail-bescheiden-ueberspringen-button> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.spec.ts index ce71487fa6d042b8622573fce274a89fb3f20993..a70bede3ef5a468d28140815cb18106d89f3fa75 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.spec.ts @@ -1,18 +1,29 @@ -import { mock } from '@alfa-client/test-utils'; +import { Mock, mock } from '@alfa-client/test-utils'; import { EventEmitter } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MockComponent } from 'ng-mocks'; import { VorgangDetailBescheidenStepTitleComponent } from '../vorgang-detail-bescheiden-step-title/vorgang-detail-bescheiden-step-title.component'; import { VorgangDetailBescheidenWeiterButtonComponent } from '../vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component'; -import { VorgangDetailAntragBescheidenStepComponent } from './vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component'; import { VorgangDetailBescheidenStepContentComponent } from './vorgang-detail-bescheiden-step-content/vorgang-detail-bescheiden-step-content.component'; import { VorgangDetailBescheidenStepsContentComponent } from './vorgang-detail-bescheiden-steps-content.component'; +import { VorgangDetailAntragBescheidenStepComponent } from './vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component'; +import { VorgangDetailBescheidenUeberspringenButtonComponent } from './vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component'; +import { BescheidenFormService } from '../../bescheiden.formservice'; +import { createVorgangWithEingangResource } from '../../../../../../../vorgang-shared/test/vorgang'; +import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; describe('VorgangDetailBescheidenStepsContentComponent', () => { let component: VorgangDetailBescheidenStepsContentComponent; let fixture: ComponentFixture<VorgangDetailBescheidenStepsContentComponent>; + let formService: Mock<BescheidenFormService>; + let vorgangWithEingangResource: VorgangWithEingangResource; + beforeEach(async () => { + formService = mock(BescheidenFormService); + vorgangWithEingangResource = createVorgangWithEingangResource(); + formService.getVorgangWithEingangResource.mockReturnValue(vorgangWithEingangResource); + await TestBed.configureTestingModule({ declarations: [ VorgangDetailBescheidenStepsContentComponent, @@ -20,6 +31,13 @@ describe('VorgangDetailBescheidenStepsContentComponent', () => { MockComponent(VorgangDetailBescheidenStepTitleComponent), MockComponent(VorgangDetailBescheidenStepContentComponent), MockComponent(VorgangDetailAntragBescheidenStepComponent), + MockComponent(VorgangDetailBescheidenUeberspringenButtonComponent), + ], + providers: [ + { + provide: BescheidenFormService, + useValue: formService, + }, ], }).compileComponents(); @@ -43,4 +61,41 @@ describe('VorgangDetailBescheidenStepsContentComponent', () => { expect(component.activeStepChange.emit).toHaveBeenCalledWith(1); }); }); + + describe('ngOnInit', () => { + it('should render überspringen und abschliessen button', () => { + component.activeStep = 1; + formService.getVorgangWithEingangResource.mockReturnValue( + createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + ]), + ); + + component.ngOnInit(); + + expect(component.showBescheiderstellungUeberspringen).toBeTruthy(); + }); + + it('should not render überspringen und abschliessen button for active step 1', () => { + component.activeStep = 2; + formService.getVorgangWithEingangResource.mockReturnValue( + createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + ]), + ); + + component.ngOnInit(); + + expect(component.showBescheiderstellungUeberspringen).toBeFalsy(); + }); + + it('should not render überspringen und abschliessen button if link missing', () => { + component.activeStep = 1; + formService.getVorgangWithEingangResource.mockReturnValue(createVorgangWithEingangResource()); + + component.ngOnInit(); + + expect(component.showBescheiderstellungUeberspringen).toBeFalsy(); + }); + }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts index a70befbc6706c728275b395a3aa6d9dfa7cb3ebd..6558d2cc365be0179fe676a036bf64a5c70e46c6 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts @@ -1,14 +1,31 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { BescheidenFormService } from '../../bescheiden.formservice'; +import { VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared'; +import { hasLink } from '@ngxp/rest'; @Component({ selector: 'alfa-vorgang-detail-bescheiden-steps-content', templateUrl: './vorgang-detail-bescheiden-steps-content.component.html', styles: [':host {@apply flex flex-col}'], }) -export class VorgangDetailBescheidenStepsContentComponent { +export class VorgangDetailBescheidenStepsContentComponent implements OnInit { @Input() activeStep: number = 1; + @Output() activeStepChange = new EventEmitter<number>(); + showBescheiderstellungUeberspringen = false; + + constructor(private readonly formService: BescheidenFormService) {} + + ngOnInit(): void { + const vorgangWithEingangResource = this.formService.getVorgangWithEingangResource(); + this.showBescheiderstellungUeberspringen = + hasLink( + vorgangWithEingangResource, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + ) && this.activeStep === 1; + } + public changeActiveStep(step: number): void { this.activeStepChange.emit(step); } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.html new file mode 100644 index 0000000000000000000000000000000000000000..5d788111718efb024b7d0b2f3009ac6775878a11 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.html @@ -0,0 +1,3 @@ +<button (click)="onClick()" class="select-none text-left text-primary hover:underline"> + Bescheiderstellung überspringen<br />und abschließen +</button> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5bd380e629b34379a00163a4d56479c2bb80a254 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.spec.ts @@ -0,0 +1,59 @@ +import { Mock, mock } from '@alfa-client/test-utils'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { VorgangDetailBescheidenUeberspringenButtonComponent } from './vorgang-detail-bescheiden-ueberspringen-button.component'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { VorgangDetailBescheidenUeberspringenDialogComponent } from '../vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component'; +import { BescheiderstellungUeberspringenDialogData } from '@alfa-client/vorgang-detail'; +import { BescheidenFormService } from '../../../bescheiden.formservice'; +import { createVorgangWithEingangResource } from '../../../../../../../../vorgang-shared/test/vorgang'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; + +describe('VorgangDetailBescheidenUeberspringenButtonComponent', () => { + let component: VorgangDetailBescheidenUeberspringenButtonComponent; + let fixture: ComponentFixture<VorgangDetailBescheidenUeberspringenButtonComponent>; + + let ozgcloudDialogService: Mock<OzgcloudDialogService>; + let formService: Mock<BescheidenFormService>; + let vorgangWithEingangResource: VorgangWithEingangResource; + + beforeEach(async () => { + ozgcloudDialogService = mock(OzgcloudDialogService); + formService = mock(BescheidenFormService); + + vorgangWithEingangResource = createVorgangWithEingangResource(); + formService.getVorgangWithEingangResource.mockReturnValue(vorgangWithEingangResource); + + await TestBed.configureTestingModule({ + declarations: [VorgangDetailBescheidenUeberspringenButtonComponent], + providers: [ + { + provide: OzgcloudDialogService, + useValue: ozgcloudDialogService, + }, + { + provide: BescheidenFormService, + useValue: formService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VorgangDetailBescheidenUeberspringenButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onClick', () => { + it('should open dialog', () => { + component.onClick(); + + expect(ozgcloudDialogService.open).toHaveBeenCalledWith( + VorgangDetailBescheidenUeberspringenDialogComponent, + { vorgangWithEingangResource } as BescheiderstellungUeberspringenDialogData, + ); + }); + }); +}); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..63b182124b45070ea84e6285feef13589053240a --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component.ts @@ -0,0 +1,29 @@ +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { Component, Input } from '@angular/core'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { VorgangDetailBescheidenUeberspringenDialogComponent } from '../vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component'; +import { BescheidenFormService } from '../../../bescheiden.formservice'; +import { BescheiderstellungUeberspringenDialogData } from '@alfa-client/vorgang-detail'; + +@Component({ + selector: 'alfa-vorgang-detail-bescheiden-ueberspringen-button', + templateUrl: './vorgang-detail-bescheiden-ueberspringen-button.component.html', + styles: [':host {@apply flex flex-1 items-end}'], +}) +export class VorgangDetailBescheidenUeberspringenButtonComponent { + @Input() vorgang: VorgangWithEingangResource; + + constructor( + private readonly ozgcloudDialogService: OzgcloudDialogService, + private formService: BescheidenFormService, + ) {} + + public onClick(): void { + this.ozgcloudDialogService.open< + VorgangDetailBescheidenUeberspringenDialogComponent, + BescheiderstellungUeberspringenDialogData + >(VorgangDetailBescheidenUeberspringenDialogComponent, { + vorgangWithEingangResource: this.formService.getVorgangWithEingangResource(), + }); + } +} diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.html new file mode 100644 index 0000000000000000000000000000000000000000..44ed66ec4fb5b61351fd96a932edab83973d7eda --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.html @@ -0,0 +1,25 @@ +<div class="bg-background-200"> + <button (click)="onClose()"> + <mat-icon>close</mat-icon> + </button> + <h1>Bescheiderstellung überspringen</h1> + <p> + Soll die Bescheiderstellung übersprungen und der Vorgang direkt in den Status Abgeschlossen + gesetzt werden? + </p> + <ozgcloud-stroked-button-with-spinner + (click)="onConfirm()" + data-test-id="bescheiderstellung-ueberspringen-und-vorgang-abschliessen-dialog" + text="Überspringen und abschließen" + type="submit" + [stateResource]="bescheiderstellungUeberspringen$ | async" + > + </ozgcloud-stroked-button-with-spinner> + <ozgcloud-stroked-button-with-spinner + (click)="onCancel()" + data-test-id="bescheiderstellung-ueberspringen-und-vorgang-abschliessen-dialog" + text="Abbrechen" + type="submit" + > + </ozgcloud-stroked-button-with-spinner> +</div> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..71f794d276fff9cf640189625308419fcdd81f6e --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts @@ -0,0 +1,220 @@ +import { Mock, mock } from '@alfa-client/test-utils'; +import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { VorgangDetailBescheidenUeberspringenDialogComponent } from './vorgang-detail-bescheiden-ueberspringen-dialog.component'; +import { MockComponent } from 'ng-mocks'; +import { OzgcloudDialogService, OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui'; +import { MatIcon } from '@angular/material/icon'; +import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { createVorgangWithEingangResource } from '../../../../../../../../vorgang-shared/test/vorgang'; +import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { BescheiderstellungUeberspringenDialogData } from '@alfa-client/vorgang-detail'; +import { createCommandStateResource } from '../../../../../../../../command-shared/test/command'; +import { of } from 'rxjs'; +import { cold } from 'jest-marbles'; +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; +import { CommandLinkRel } from '../../../../../../../../command-shared/src/lib/command.linkrel'; +import { createBescheidResource } from '../../../../../../../../bescheid-shared/src/test/bescheid'; +import { CommandResource } from '@alfa-client/command-shared'; + +describe('VorgangDetailBescheidenUeberspringenButtonComponent', () => { + let component: VorgangDetailBescheidenUeberspringenDialogComponent; + let fixture: ComponentFixture<VorgangDetailBescheidenUeberspringenDialogComponent>; + + let dialogRef: Mock<DialogRef>; + let bescheidService: Mock<BescheidService>; + let ozgcloudDialogService: Mock<OzgcloudDialogService>; + let dialogData: BescheiderstellungUeberspringenDialogData; + let vorgangWithEingangResource: VorgangWithEingangResource; + + beforeEach(async () => { + dialogRef = mock(DialogRef); + bescheidService = mock(BescheidService); + ozgcloudDialogService = mock(OzgcloudDialogService); + + vorgangWithEingangResource = createVorgangWithEingangResource(); + dialogData = { vorgangWithEingangResource }; + + await TestBed.configureTestingModule({ + declarations: [ + VorgangDetailBescheidenUeberspringenDialogComponent, + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), + MockComponent(MatIcon), + ], + providers: [ + { + provide: DialogRef, + useValue: dialogRef, + }, + { + provide: BescheidService, + useValue: bescheidService, + }, + { + provide: OzgcloudDialogService, + useValue: ozgcloudDialogService, + }, + { + provide: DIALOG_DATA, + useValue: dialogData, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VorgangDetailBescheidenUeberspringenDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onCancel', () => { + it('should close dialog', () => { + component.onCancel(); + + expect(dialogRef.close).toHaveBeenCalled(); + }); + }); + + describe('onConfirm', () => { + let bescheidErstellungUeberspringen: jest.Mock; + let bescheidErstellungUeberspringenCommand: StateResource<CommandResource>; + + beforeEach(() => { + bescheidErstellungUeberspringen = component.bescheidErstellungUeberspringen = jest.fn(); + bescheidErstellungUeberspringenCommand = createCommandStateResource([ + CommandLinkRel.EFFECTED_RESOURCE, + ]); + bescheidErstellungUeberspringen.mockReturnValue(of(bescheidErstellungUeberspringenCommand)); + }); + + it('should call bescheidErstellungUeberspringen', (done) => { + component.onConfirm(); + + component.bescheiderstellungUeberspringen$.subscribe(() => { + expect(bescheidErstellungUeberspringen).toHaveBeenCalled(); + done(); + }); + }); + + it('should close all dialogs on success', (done) => { + component.onConfirm(); + + component.bescheiderstellungUeberspringen$.subscribe(() => { + expect(ozgcloudDialogService.closeAll).toHaveBeenCalled(); + done(); + }); + }); + + it('should not close all dialogs on failre', (done) => { + bescheidErstellungUeberspringen.mockReturnValue(of(createCommandStateResource())); + + component.onConfirm(); + + component.bescheiderstellungUeberspringen$.subscribe(() => { + expect(ozgcloudDialogService.closeAll).not.toHaveBeenCalled(); + done(); + }); + }); + + it('should return command', () => { + component.onConfirm(); + + expect(component.bescheiderstellungUeberspringen$).toBeObservable( + cold('(a|)', { a: bescheidErstellungUeberspringenCommand }), + ); + }); + }); + + describe('bescheidErstellungUeberspringen', () => { + describe('Bescheid Draft exists', () => { + let vorgangWithEingangResource: VorgangWithEingangResource; + let bescheidResource: BescheidResource; + + beforeEach(() => { + vorgangWithEingangResource = createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.BESCHEID_DRAFT, + ]); + dialogData.vorgangWithEingangResource = vorgangWithEingangResource; + bescheidResource = createBescheidResource(); + bescheidService.getBescheidDraft.mockReturnValue(of(createStateResource(bescheidResource))); + bescheidService.bescheidLoeschenUndErstellungUeberspringen.mockReturnValue( + of(createCommandStateResource()), + ); + }); + + it('should get bescheid draft', (done) => { + const command$ = component.bescheidErstellungUeberspringen(); + + command$.subscribe(() => { + expect(bescheidService.getBescheidDraft).toHaveBeenCalled(); + done(); + }); + }); + + it('should Bescheid löschen und Erstellung überspringen', (done) => { + const command$ = component.bescheidErstellungUeberspringen(); + + command$.subscribe(() => { + expect(bescheidService.bescheidLoeschenUndErstellungUeberspringen).toHaveBeenCalledWith( + vorgangWithEingangResource, + bescheidResource, + ); + done(); + }); + }); + + it('should return command', () => { + const command = createCommandStateResource(); + bescheidService.bescheidLoeschenUndErstellungUeberspringen.mockReturnValue(of(command)); + + const command$ = component.bescheidErstellungUeberspringen(); + + expect(command$).toBeObservable(cold('(a|)', { a: command })); + }); + }); + + describe('Bescheid Draft not exists', () => { + let vorgangWithEingangResource: VorgangWithEingangResource; + + beforeEach(() => { + vorgangWithEingangResource = createVorgangWithEingangResource(); + dialogData.vorgangWithEingangResource = vorgangWithEingangResource; + }); + + it('should Bescheiderstellung überspringen', (done) => { + bescheidService.bescheidErstellungUeberspringen.mockReturnValue( + of(createCommandStateResource()), + ); + + const command$ = component.bescheidErstellungUeberspringen(); + + command$.subscribe(() => { + expect(bescheidService.bescheidErstellungUeberspringen).toHaveBeenCalledWith( + vorgangWithEingangResource, + ); + done(); + }); + }); + + it('should return command', () => { + const command = createCommandStateResource(); + bescheidService.bescheidErstellungUeberspringen.mockReturnValue(of(command)); + + const command$ = component.bescheidErstellungUeberspringen(); + + expect(command$).toBeObservable(cold('(a|)', { a: command })); + }); + }); + }); + + describe('onClose', () => { + it('should close dialog', () => { + component.onClose(); + + expect(dialogRef.close).toHaveBeenCalled(); + }); + }); +}); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..c33af98fa79df291216ad75505be960d5353e702 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts @@ -0,0 +1,61 @@ +import { Component, Inject } from '@angular/core'; +import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { BescheidService } from '@alfa-client/bescheid-shared'; +import { Observable, switchMap, tap } from 'rxjs'; +import { CommandResource, isSuccessfulDone } from '@alfa-client/command-shared'; +import { notHasLink, StateResource } from '@alfa-client/tech-shared'; +import { BescheiderstellungUeberspringenDialogData } from '@alfa-client/vorgang-detail'; +import { VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared'; + +@Component({ + selector: 'alfa-vorgang-detail-bescheiden-ueberspringen-dialog', + templateUrl: './vorgang-detail-bescheiden-ueberspringen-dialog.component.html', +}) +export class VorgangDetailBescheidenUeberspringenDialogComponent { + bescheiderstellungUeberspringen$: Observable<StateResource<CommandResource>>; + + constructor( + private readonly dialogRef: DialogRef, + private readonly bescheidService: BescheidService, + private readonly ozgcloudDialogService: OzgcloudDialogService, + @Inject(DIALOG_DATA) private readonly dialogData: BescheiderstellungUeberspringenDialogData, + ) {} + + onCancel(): void { + this.dialogRef.close(); + } + + onConfirm(): void { + this.bescheiderstellungUeberspringen$ = this.bescheidErstellungUeberspringen().pipe( + tap((command) => { + if (isSuccessfulDone(command.resource)) { + this.ozgcloudDialogService.closeAll(); + } + }), + ); + } + + bescheidErstellungUeberspringen(): Observable<StateResource<CommandResource>> { + const vorgangWithEingangResource = this.dialogData.vorgangWithEingangResource; + + if (notHasLink(vorgangWithEingangResource, VorgangWithEingangLinkRel.BESCHEID_DRAFT)) { + return this.bescheidService.bescheidErstellungUeberspringen(vorgangWithEingangResource); + } else { + return this.bescheidService + .getBescheidDraft() + .pipe( + switchMap((bescheidStateResource) => + this.bescheidService.bescheidLoeschenUndErstellungUeberspringen( + vorgangWithEingangResource, + bescheidStateResource.resource, + ), + ), + ); + } + } + + onClose(): void { + this.dialogRef.close(); + } +} diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.spec.ts index 25e5f64656c4658d89c9e7bfc18b464502bdedc3..73a99ab73f0b5da16898817168f3fe9482884bce 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.spec.ts @@ -1,4 +1,4 @@ -import { mock } from '@alfa-client/test-utils'; +import { Mock, mock } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BescheidenFormService } from '../../bescheiden.formservice'; import { VorgangDetailBescheidenWeiterButtonComponent } from './vorgang-detail-bescheiden-weiter-button.component'; @@ -9,9 +9,11 @@ describe('VorgangDetailBescheidenWeiterButtonComponent', () => { let component: VorgangDetailBescheidenWeiterButtonComponent; let fixture: ComponentFixture<VorgangDetailBescheidenWeiterButtonComponent>; - const formService = mock(BescheidenFormService); + let formService: Mock<BescheidenFormService>; beforeEach(async () => { + formService = mock(BescheidenFormService); + await TestBed.configureTestingModule({ providers: [ { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts index a90f0deb26966b8ff3527b381cdb5510e9bfe544..78082d9bdc9b3c462dc1dc13102b0904d2f6f33e 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts @@ -1,5 +1,5 @@ -import { BescheidService } from '@alfa-client/bescheid-shared'; -import { mock, useFromMock } from '@alfa-client/test-utils'; +import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; @@ -11,22 +11,27 @@ import { BescheidenFormService } from './bescheiden.formservice'; import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component'; import { VorgangDetailBescheidenStepsComponent } from './vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps.component'; import { VorgangDetailBescheidenComponent } from './vorgang-detail-bescheiden.component'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; describe('VorgangDetailBescheidenComponent', () => { let component: VorgangDetailBescheidenComponent; let fixture: ComponentFixture<VorgangDetailBescheidenComponent>; - const vorgangWithEingangResource = createVorgangWithEingangResource(); - const bescheidDraftResource = createBescheidResource(); + let bescheidService: Mock<BescheidService>; + let formService: BescheidenFormService; + let dialogRef: Mock<DialogRef>; - const bescheidService = mock(BescheidService); - const formService = new BescheidenFormService( - new UntypedFormBuilder(), - useFromMock(bescheidService), - ); - const dialogRef = mock(DialogRef); + let vorgangWithEingangResource: VorgangWithEingangResource; + let bescheidDraftResource: BescheidResource; beforeEach(async () => { + bescheidService = mock(BescheidService); + formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); + dialogRef = mock(DialogRef); + + vorgangWithEingangResource = createVorgangWithEingangResource(); + bescheidDraftResource = createBescheidResource(); + TestBed.overrideComponent(VorgangDetailBescheidenComponent, { set: { providers: [ @@ -34,10 +39,6 @@ describe('VorgangDetailBescheidenComponent', () => { provide: BescheidenFormService, useValue: formService, }, - { - provide: BescheidService, - useValue: bescheidService, - }, ], }, }); @@ -50,8 +51,8 @@ describe('VorgangDetailBescheidenComponent', () => { ], providers: [ { - provide: BescheidenFormService, - useValue: formService, + provide: BescheidService, + useValue: bescheidService, }, { provide: DialogRef, diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts index 76194ddd0d5a2534b259ccff3135060600d0b69c..4d37d4b10bf41e707638c68bd5df3673c1ce6d29 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts @@ -40,7 +40,6 @@ import { WiedervorlageModule } from '@alfa-client/wiedervorlage'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { RadioButtonCardComponent } from 'design-system'; import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component'; import { AktenzeichenEditableComponent } from './aktenzeichen-editable/aktenzeichen-editable.component'; import { AbschliessenButtonComponent } from './buttons/abschliessen-button/abschliessen-button.component'; @@ -67,19 +66,22 @@ import { VorgangDetailBackButtonContainerComponent } from './vorgang-detail-page import { VorgangDetailBackButtonComponent } from './vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component'; import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component'; import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component'; -import { VorgangDetailBescheidenStepButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-button/vorgang-detail-bescheiden-step-button.component'; -import { VorgangDetailBescheidenStepButtonsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-buttons.component'; -import { VorgangDetailBescheidenStepTitleComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-title/vorgang-detail-bescheiden-step-title.component'; -import { VorgangDetailAntragBescheidenStepComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component'; -import { VorgangDetailBescheidenStepContentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-step-content/vorgang-detail-bescheiden-step-content.component'; -import { VorgangDetailBescheidenStepsContentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component'; +import { VorgangDetailBescheidenUeberspringenButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-button/vorgang-detail-bescheiden-ueberspringen-button.component'; import { VorgangDetailBescheidenStepsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps.component'; -import { VorgangDetailBescheidenWeiterButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component'; import { VorgangDetailBescheidenComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component'; import { VorgangDetailMoreMenuComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component'; import { VorgangExportContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component'; import { ProcessVorgangContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component'; import { VorgangDetailPageComponent } from './vorgang-detail-page/vorgang-detail-page.component'; +import { VorgangDetailBescheidenStepButtonsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-buttons.component'; +import { VorgangDetailBescheidenStepButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-button/vorgang-detail-bescheiden-step-button.component'; +import { VorgangDetailBescheidenWeiterButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component'; +import { VorgangDetailBescheidenStepTitleComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-title/vorgang-detail-bescheiden-step-title.component'; +import { VorgangDetailBescheidenStepsContentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component'; +import { VorgangDetailBescheidenStepContentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-step-content/vorgang-detail-bescheiden-step-content.component'; +import { VorgangDetailAntragBescheidenStepComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-antrag-bescheiden-step/vorgang-detail-antrag-bescheiden-step.component'; +import { RadioButtonCardComponent } from 'design-system'; +import { VorgangDetailBescheidenUeberspringenDialogComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component'; const routes: Routes = [ { @@ -150,6 +152,8 @@ const routes: Routes = [ VorgangDetailBescheidenStepContentComponent, VorgangDetailBescheidenResultStatusComponent, VorgangDetailAntragBescheidenStepComponent, + VorgangDetailBescheidenUeberspringenButtonComponent, + VorgangDetailBescheidenUeberspringenDialogComponent, ], exports: [ VorgangDetailAntragstellerComponent, diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts index 3ee8483333198b707bea7ffa26c0c053bccc1499..f49ddb1b57cd60961dd2f29d50e12abe48e8b691 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts @@ -62,6 +62,7 @@ export enum VorgangWithEingangLinkRel { SET_AKTENZEICHEN = 'set_aktenzeichen', BESCHEID_DRAFT = 'bescheidDraft', + UEBERSPRINGEN_UND_ABSCHLIESSEN = 'ueberspringen_und_abschliessen', } export enum LoeschAnforderungLinkRel { 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 25e5daeeda18211fe04c4ad6c22d1ce1b3cfd142..fa60bb0b188ac33e509a84ba4cf3e6e90051cef2 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 @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilder; -import de.ozgcloud.alfa.common.command.CommandController; +import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import lombok.RequiredArgsConstructor; @@ -21,8 +21,9 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class BescheidVorgangProcessor implements RepresentationModelProcessor<EntityModel<VorgangWithEingang>> { - static final String REL_DRAFT = "bescheidDraft"; + static final LinkRelation REL_DRAFT = LinkRelation.of("bescheidDraft"); static final LinkRelation REL_CREATE_BESCHEID_DRAFT = LinkRelation.of("createBescheidDraft"); + static final LinkRelation REL_UEBERSPRINGEN_UND_ABSCHLIESSEN = LinkRelation.of("ueberspringen_und_abschliessen"); private final FeatureToggleProperties featureToggleProperties; private final BescheidService bescheidService; @@ -36,20 +37,23 @@ class BescheidVorgangProcessor implements RepresentationModelProcessor<EntityMod } return ModelBuilder.fromModel(model) - .ifMatch(shouldAddLinkToDraft(vorgang)) + .ifMatch(isRetrievingDraftAllowed(vorgang)) .addLink(linkTo(methodOn(BescheidController.class).getDraft(vorgang.getId(), BescheidController.REQUEST_PARAM_STATUS_DRAFT)).withRel( REL_DRAFT)) - .ifMatch(shouldAddLinkToCreateDraft(vorgang)) - .addLink(linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), + .ifMatch(isCreatingDraftAllowed(vorgang)) + .addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_CREATE_BESCHEID_DRAFT)) + .ifMatch(isCreatingDraftAllowed(vorgang)) + .addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), + vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_UEBERSPRINGEN_UND_ABSCHLIESSEN)) .buildModel(); } - BooleanSupplier shouldAddLinkToDraft(Vorgang vorgang) { + BooleanSupplier isRetrievingDraftAllowed(Vorgang vorgang) { return () -> featureToggleProperties.isBescheidWizard() && isVorgangInBearbeitung(vorgang) && draftExists(vorgang); } - BooleanSupplier shouldAddLinkToCreateDraft(Vorgang vorgang) { + BooleanSupplier isCreatingDraftAllowed(Vorgang vorgang) { return () -> featureToggleProperties.isBescheidWizard() && isVorgangInBearbeitung(vorgang); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java index e3887f47b757ae3201e503a7817323165904546f..827bf9e9729cd7763d48fefc23626d8bd2cc6bdb 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java @@ -72,7 +72,8 @@ public enum CommandOrder { DELETE_ATTACHED_ITEM(false, Type.VORGANG), CREATE_BESCHEID(false, Type.VORGANG), - + DELETE_BESCHEID(false, Type.VORGANG), + PROCESS_VORGANG(false, Type.VORGANG); enum Type { 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 e535a2a8a1e894837959ce2cf87ada9ee7f33c37..69f2e7690b0a0a4911875a7ad402b4219d22752a 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 @@ -17,9 +17,11 @@ import org.mockito.Mock; import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; +import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.UserProfileUrlProvider; +import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -60,7 +62,7 @@ class BescheidVorgangProcessorTest { @Test void shouldNotHaveLinkToDraft() { - givenLinkToDraftShouldBeAdded(false); + givenRetrievingDraftIsAllowed(false); var model = callProcess(); @@ -69,7 +71,7 @@ class BescheidVorgangProcessorTest { @Test void shouldHaveLinkToDraft() { - givenLinkToDraftShouldBeAdded(true); + givenRetrievingDraftIsAllowed(true); var model = callProcess(); @@ -80,7 +82,7 @@ class BescheidVorgangProcessorTest { @Test void shouldHaveLinkToCreateBescheidDraft() { - givenLinkToCrateDraftShouldBeAdded(true); + givenCreatingDraftIsAllowed(true); var model = callProcess(); @@ -92,19 +94,39 @@ class BescheidVorgangProcessorTest { @Test void shouldNotHaveLinkToCreateBescheidDraft() { - givenLinkToCrateDraftShouldBeAdded(false); + givenCreatingDraftIsAllowed(false); var model = callProcess(); assertThat(model.getLink(BescheidVorgangProcessor.REL_CREATE_BESCHEID_DRAFT)).isEmpty(); } - private void givenLinkToDraftShouldBeAdded(boolean shouldBeAdded) { - doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).shouldAddLinkToDraft(vorgang); + @Test + void shouldNotHaveLinkToBescheidUeberspringenUndVorgangAbschliessen() { + givenCreatingDraftIsAllowed(false); + + var model = callProcess(); + + assertThat(model.getLink(BescheidVorgangProcessor.REL_UEBERSPRINGEN_UND_ABSCHLIESSEN)).isEmpty(); + } + + @Test + void shouldHaveLinkToBescheidUeberspringenUndVorgangAbschliessen() { + givenCreatingDraftIsAllowed(true); + + var model = callProcess(); + + assertThat(model.getLink(BescheidVorgangProcessor.REL_UEBERSPRINGEN_UND_ABSCHLIESSEN)).isPresent().map(Link::getHref) + .hasValue(new UriTemplate(CommandByRelationController.COMMAND_BY_RELATION_PATH).expand(VorgangHeaderTestFactory.ID, + VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString()); + } + + private void givenRetrievingDraftIsAllowed(boolean shouldBeAdded) { + doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).isRetrievingDraftAllowed(vorgang); } - private void givenLinkToCrateDraftShouldBeAdded(boolean shouldBeAdded) { - doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).shouldAddLinkToCreateDraft(vorgang); + private void givenCreatingDraftIsAllowed(boolean shouldBeAdded) { + doReturn((BooleanSupplier) () -> shouldBeAdded).when(processor).isCreatingDraftAllowed(vorgang); } private EntityModel<? extends Vorgang> callProcess() { @@ -119,7 +141,7 @@ class BescheidVorgangProcessorTest { } @Nested - class TestShouldAddLinkToDraft { + class TestIsRetrievingDraftAllowed { @Test void shouldReturnTrue() { @@ -167,12 +189,12 @@ class BescheidVorgangProcessorTest { } private BooleanSupplier callMethod() { - return processor.shouldAddLinkToDraft(vorgang); + return processor.isRetrievingDraftAllowed(vorgang); } } @Nested - class TestShouldAddLinkToCreateDraft { + class TestIsCreatingDraftAllowed { @Test void shouldReturnTrue() { @@ -204,7 +226,7 @@ class BescheidVorgangProcessorTest { } private BooleanSupplier callMethod() { - return processor.shouldAddLinkToCreateDraft(vorgang); + return processor.isCreatingDraftAllowed(vorgang); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java index 6495e5ade06e58926c0f6f382cfa062d4448d645..3737540596df3d9767a8413604057b399cc5a096 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java @@ -196,7 +196,8 @@ class CommandModelAssemblerTest { "WIEDERVORLAGE_WIEDEREROEFFNEN", "CREATE_KOMMENTAR", "EDIT_KOMMENTAR", "REDIRECT_VORGANG", "FORWARD_SUCCESSFULL", "FORWARD_FAILED", "ASSIGN_USER", "SEND_POSTFACH_MAIL", "SEND_POSTFACH_NACHRICHT", "RESEND_POSTFACH_MAIL", "CREATE_ATTACHED_ITEM", "UPDATE_ATTACHED_ITEM", "PATCH_ATTACHED_ITEM", "RECEIVE_POSTFACH_NACHRICHT", "VORGANG_LOESCHEN", "DELETE_ATTACHED_ITEM", - "VORGANG_ZUM_LOESCHEN_MARKIEREN", "LOESCH_ANFORDERUNG_ZURUECKNEHMEN", "CREATE_BESCHEID", "PROCESS_VORGANG", "SET_AKTENZEICHEN" }) + "VORGANG_ZUM_LOESCHEN_MARKIEREN", "LOESCH_ANFORDERUNG_ZURUECKNEHMEN", "CREATE_BESCHEID", "PROCESS_VORGANG", "SET_AKTENZEICHEN", + "DELETE_BESCHEID" }) void shouldBePresentOnOrder(CommandOrder order) { var model = toModelWithOrder(order);