diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts index aa57359b25c945a65d89d10106ebb798e1f1b294..63790fb84e15e94d2e2af47edb46d4b34db592b9 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts @@ -162,23 +162,4 @@ describe('Bescheid Wizard', () => { contains(bescheidWizard.getStatusText(), bewilligtText); }) }); - - describe('Save entries after Weiter', () => { - it ('should NOT save entries without click on Weiter', () => { - bescheidWizard.getAbgelehntButton().click(); - bescheidWizard.getCloseButton().click(); - vorgangFormularButtons.getBescheidenButton().click(); - contains(bescheidWizard.getStatusText(), bewilligtText); - }) - - it ('should save entries after click on Weiter', () => { - cy.wait(1000); - bescheidWizard.getAbgelehntButton().click(); - bescheidWizard.getWeiterButton().click(); - cy.wait(2000); - bescheidWizard.getCloseButton().click(); - vorgangFormularButtons.getBescheidenButton().click(); - contains(bescheidWizard.getStatusText(), abgelehntText); - }) - }) }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts index 7c24cf66f97dd2c37b98288fbe9bc481c5172aa9..e080573972a6bf55f8534238372e44a408f7d904 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts @@ -98,21 +98,21 @@ describe('Vorgang abschliessen', () => { notExist(snackBar.getMessage()); }); - it('should have status Abgeschlossen', () => { + it('FIXME: should have status Abgeschlossen', () => { haveText( vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN], ); }); - it('back to vorgang list', () => { + it('FIXME: back to vorgang list', () => { vorgangPage.getSubnavigation().getBackButton().click(); waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }); - it('should have status Abgeschlossen', () => { + it('FIXME: should have status Abgeschlossen', () => { haveText( vorgangList.getListItem(vorgangAbschliessen.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN], diff --git a/alfa-client/libs/bescheid-shared/src/index.ts b/alfa-client/libs/bescheid-shared/src/index.ts index 16fde03966472be2f75f8d5f4a47fa8a21d4aa44..8a8af5864bd07257774992c864fd03fc821143b8 100644 --- a/alfa-client/libs/bescheid-shared/src/index.ts +++ b/alfa-client/libs/bescheid-shared/src/index.ts @@ -2,3 +2,4 @@ export * from './lib/bescheid-shared.module'; export * from './lib/bescheid.linkrel'; export * from './lib/bescheid.model'; export * from './lib/bescheid.service'; +export * from './lib/document.model'; diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts index d10b73f178585ebb0fa151c3deaed33317cdc87b..e964530ec152d458c7c979b460358c81476df685 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts @@ -3,7 +3,8 @@ export enum BescheidLinkRel { UPLOAD_BESCHEID_FILE = 'uploadBescheidFile', UPLOAD_ATTACHMENT = 'uploadAttachment', UPDATE = 'update', - CREATE_BESCHEID_DOCUMENT = 'createBescheidDocument', + CREATE_DOCUMENT = 'createDocument', + CREATE_DOCUMENT_FROM_FILE = 'createDocumentFromFile', ATTACHMENTS = 'attachments', BESCHEID_DOCUMENT = 'bescheidDocument', SEND = 'send', 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 f766bcf0d702f14714ca817ed7dbb80ae3101823..554a859838cc2b78c2651e28eeaa32072f51d40c 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.model.ts @@ -1,3 +1,4 @@ +import { HttpError } from '@alfa-client/tech-shared'; import { Resource } from '@ngxp/rest'; export interface Bescheid { @@ -16,3 +17,9 @@ export enum BescheidSendBy { MANUAL = 'MANUAL', NACHRICHT = 'NACHRICHT', } + +export interface UploadFileInProgress { + loading: boolean; + fileName?: string; + error?: HttpError; +} 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 8fae422705bbf0aa4f92662742812add234c1dfe..da86ebb7e3c336964c3fd85aed986db3f8662a54 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 @@ -10,6 +10,7 @@ import { CreateCommandProps, } from '@alfa-client/command-shared'; import { + ApiError, EMPTY_STRING, HttpError, StateResource, @@ -20,6 +21,7 @@ import { import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { VorgangCommandService, + VorgangHeaderLinkRel, VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource, @@ -48,16 +50,17 @@ import { createBescheid, createBescheidResource, createBescheidStateResource, + createUploadFileInProgress, } from '../test/bescheid'; import { createDocumentResource } from '../test/document'; import { BescheidFacade } from './+state/bescheid.facade'; import { BescheidLinkRel } from './bescheid.linkrel'; -import { Bescheid, BescheidResource } from './bescheid.model'; +import { Bescheid, BescheidResource, UploadFileInProgress } from './bescheid.model'; import { BescheidService } from './bescheid.service'; +import { DocumentLinkRel } from './document.linkrel'; import { DocumentResource } from './document.model'; import * as BescheidUtil from './bescheid.util'; -import { DocumentLinkRel } from './document.linkrel'; describe('BescheidService', () => { let service: BescheidService; @@ -255,7 +258,8 @@ describe('BescheidService', () => { }); it('should emit state resources', () => { - const bescheid$ = service.getBescheidDraftIfExists(); + const bescheid$: Observable<StateResource<BescheidResource>> = + service.getBescheidDraftIfExists(); expect(bescheid$).toBeObservable( cold('(ab|)', { a: createEmptyStateResource(), b: bescheidStateResource }), @@ -407,6 +411,7 @@ describe('BescheidService', () => { .mockReturnValue(createCommandProps); service.resourceService.stateResource.next(createStateResource(bescheidResource)); commandService.createCommandByProps.mockReturnValue(of(commandStateResource)); + service.resourceService.setResourceByUri = jest.fn(); }); it('should build update bescheid command props', () => { @@ -425,8 +430,6 @@ describe('BescheidService', () => { }); it('should return command', () => { - service.resourceService.setResourceByUri = jest.fn(); - const updateBescheid$: Observable<StateResource<CommandResource>> = service.updateBescheid(bescheid); @@ -434,8 +437,6 @@ describe('BescheidService', () => { }); it('should set resource by uri', (done) => { - service.resourceService.setResourceByUri = jest.fn(); - service .updateBescheid(bescheid) .pipe(first()) @@ -447,12 +448,20 @@ describe('BescheidService', () => { }); }); - it('should remove error from bescheid document file', (done) => { - service.resourceService.setResourceByUri = jest.fn(); - service.bescheidDocumentFile$.next(createErrorStateResource(createApiError())); + it('should clear create bescheid document in progress', (done) => { + service.createBescheidDocumentInProgress$.next(createUploadFileInProgress()); + + service.updateBescheid(bescheid).subscribe(() => { + expect(service.createBescheidDocumentInProgress$.value).toEqual({ loading: false }); + done(); + }); + }); + + it('should clear upload bescheid document in progress', (done) => { + service.uploadBescheidDocumentInProgress$.next(createUploadFileInProgress()); service.updateBescheid(bescheid).subscribe(() => { - expect(service.bescheidDocumentFile$.value.error).toBeUndefined(); + expect(service.uploadBescheidDocumentInProgress$.value).toEqual({ loading: false }); done(); }); }); @@ -554,7 +563,7 @@ describe('BescheidService', () => { }); it('should return embedded resources', () => { - const attachments$ = service.getAttachments(); + const attachments$: Observable<BinaryFileResource[]> = service.getAttachments(); expect(attachments$).toBeObservable(singleColdCompleted([binaryFileResource])); }); @@ -582,7 +591,7 @@ describe('BescheidService', () => { createStateResource(binaryFile); service.bescheidDocumentFile$.next(binaryFileStateResource); - service.getBescheidDocumentFile().subscribe((result) => { + service.getBescheidDocumentFile().subscribe((result: StateResource<BinaryFileResource>) => { expect(result).toBe(binaryFileStateResource); done(); }); @@ -594,20 +603,29 @@ describe('BescheidService', () => { const file: File = createFile(); beforeEach(() => { - service.initBescheidDocumentUpload = jest.fn(); service.doUploadBescheidDocument = jest.fn(); }); - it('should call init bescheid document upload', () => { + it('should call init upload bescheid document in progress', () => { service.uploadBescheidDocument(bescheid, file); - expect(service.initBescheidDocumentUpload).toHaveBeenCalledWith(file.name); + expect(service.uploadBescheidDocumentInProgress$.value).toEqual({ + loading: true, + fileName: file.name, + }); }); - it('should set load bescheid document in progresss', () => { + it('should clear create bescheid document', () => { + service.createBescheidDocumentInProgress$.next({ + loading: true, + fileName: 'Dummy', + error: createApiError(), + }); service.uploadBescheidDocument(bescheid, file); - expect(service.uploadBescheidDocumentInProgress$.value).toBeTruthy(); + expect(service.createBescheidDocumentInProgress$.value).toEqual({ + loading: false, + }); }); it('should call do upload bescheid document', () => { @@ -617,32 +635,13 @@ describe('BescheidService', () => { }); it('should return bescheid document file', (done) => { - service.uploadBescheidDocument(bescheid, file).subscribe((value) => { - expect(value).toBeTruthy(); - done(); - }); - }); - }); - - describe('init bescheid document upload', () => { - const fileName: string = faker.name.firstName(); - - it('should set loading flag', () => { - service.initBescheidDocumentUpload(); - - expect(service.bescheidDocumentFile$.value.loading).toBeTruthy(); - }); - - it('should set binaryFile with name as resource', () => { - service.initBescheidDocumentUpload(fileName); - - expect(service.bescheidDocumentFile$.value.resource.name).toBe(fileName); - }); - - it('should set binaryFile with undefined as resource', () => { - service.initBescheidDocumentUpload(); - - expect(service.bescheidDocumentFile$.value.resource.name).toBeUndefined(); + service + .uploadBescheidDocument(bescheid, file) + .subscribe((uploadFileInProgress: UploadFileInProgress) => { + expect(uploadFileInProgress.fileName).toBe(file.name); + expect(uploadFileInProgress.loading).toBeTruthy(); + done(); + }); }); }); @@ -685,12 +684,13 @@ describe('BescheidService', () => { const bescheid: BescheidResource = createBescheidResource(); const binaryFile: BinaryFileResource = createBinaryFileResource(); + const apiError: ApiError = createApiError(); const binaryFileErrorStateResource: StateResource<BinaryFileResource> = - createErrorStateResource(createApiError()); + createErrorStateResource(apiError); const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource(binaryFile); - it('should call create bescheid document from file', () => { + it('should call create bescheid document from file on success', () => { service.createBescheidDocumentFromFile = jest.fn(); service.handleUploadBescheidDocumentResponse(bescheid, binaryFileStateResource); @@ -699,21 +699,20 @@ describe('BescheidService', () => { }); describe('on no error', () => { - it('should handle error on error stateResource', () => { - service.bescheidDocumentFile$.next(createEmptyStateResource()); + it('should set error', () => { + service.uploadBescheidDocumentInProgress$.next({ loading: false }); service.handleUploadBescheidDocumentResponse(bescheid, binaryFileErrorStateResource); - expect(service.bescheidDocumentFile$.value).toBe(binaryFileErrorStateResource); + expect(service.uploadBescheidDocumentInProgress$.value.error).toBe(apiError); }); - it('should set upload bescheid document in progress done', () => { - service.uploadBescheidDocumentInProgress$.next(true); - service.createBescheidDocumentFromFile = jest.fn(); + it('should set loading to false', () => { + service.uploadBescheidDocumentInProgress$.next({ loading: true }); service.handleUploadBescheidDocumentResponse(bescheid, binaryFileErrorStateResource); - expect(service.uploadBescheidDocumentInProgress$.value).toBeFalsy(); + expect(service.uploadBescheidDocumentInProgress$.value.loading).toBeFalsy(); }); }); }); @@ -778,14 +777,24 @@ describe('BescheidService', () => { }); describe('on error', () => { - it('should set document file', () => { + it('should set upload bescheid in progress error', () => { const httpError: HttpError = createApiError(); const errorStateResource: StateResource<CommandResource> = createErrorStateResource(httpError); service.handleCreateBescheidDocumentFromFileResponse(errorStateResource, binaryFile); - expect(service.bescheidDocumentFile$.value).toEqual(createErrorStateResource(httpError)); + expect(service.uploadBescheidDocumentInProgress$.value.error).toBe(httpError); + }); + + it('should set upload bescheid in progress loading false', () => { + const httpError: HttpError = createApiError(); + const errorStateResource: StateResource<CommandResource> = + createErrorStateResource(httpError); + + service.handleCreateBescheidDocumentFromFileResponse(errorStateResource, binaryFile); + + expect(service.uploadBescheidDocumentInProgress$.value.loading).toBeFalsy(); }); }); @@ -875,7 +884,19 @@ describe('BescheidService', () => { it('should set create beschied document in progress', () => { service.createBescheidDocument(); - expect(service.createBescheidDocumentInProgress$.value).toBeTruthy(); + expect(service.createBescheidDocumentInProgress$.value.loading).toBeTruthy(); + }); + + it('should set upload beschied document in progress loading false', () => { + service.uploadBescheidDocumentInProgress$.next({ + loading: true, + error: createApiError(), + fileName: 'Dummy', + }); + + service.createBescheidDocument(); + + expect(service.uploadBescheidDocumentInProgress$.value).toEqual({ loading: false }); }); describe('on successfully done command', () => { @@ -907,21 +928,21 @@ describe('BescheidService', () => { const commandErrorStateResource: StateResource<CommandResource> = createErrorStateResource(apiError); - it('should set error on state resource', () => { + it('should set error ', () => { commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource)); service.createBescheidDocument(); - expect(service.bescheidDocumentFile$.value).toEqual(createErrorStateResource(apiError)); + expect(service.createBescheidDocumentInProgress$.value.error).toBe(apiError); }); - it('should set create bescheid document in progress done', () => { - service.createBescheidDocumentInProgress$.next(true); + it('should set create bescheid document in progress loading false', () => { + service.createBescheidDocumentInProgress$.next({ loading: true }); commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource)); service.createBescheidDocument(); - expect(service.createBescheidDocumentInProgress$.value).toBeFalsy(); + expect(service.createBescheidDocumentInProgress$.value.loading).toBeFalsy(); }); }); }); @@ -1006,10 +1027,10 @@ describe('BescheidService', () => { }); it('should return command', () => { - const command = createCommandStateResource(); + const command: StateResource<CommandResource> = createCommandStateResource(); service.deleteBescheid = jest.fn().mockReturnValue(singleCold(command)); - const command$ = service.bescheidVerwerfen(); + const command$: Observable<StateResource<CommandResource>> = service.bescheidVerwerfen(); expect(command$).toBeObservable(singleCold(command)); }); @@ -1039,12 +1060,69 @@ describe('BescheidService', () => { expect(service.bescheidDocumentFile$.value).toBe(binaryFileStateResource); }); - it('should set create bescheid document in progress done', () => { - service.createBescheidDocumentInProgress$.next(true); + it('should set create bescheid document in progress loading false', () => { + service.createBescheidDocumentInProgress$.next({ loading: true }); service.loadBescheidDocumentFile(document); - expect(service.createBescheidDocumentInProgress$.value).toBeFalsy(); + expect(service.createBescheidDocumentInProgress$.value.loading).toBeFalsy(); + }); + }); + + describe('getBescheidDocument', () => { + it('should return bescheid document', () => { + const documentStateResource: StateResource<DocumentResource> = + createStateResource(createDocumentResource()); + service.bescheidDocument$.next(documentStateResource); + + const bescheidDocument$: Observable<StateResource<DocumentResource>> = + service.getBescheidDocument(); + + expect(bescheidDocument$).toBeObservable(singleCold(documentStateResource)); + }); + }); + + describe('getEmpfaenger', () => { + it('should return Empfänger', () => { + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); + const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = + createStateResource(vorgangWithEingangResource); + vorgangService.getVorgangWithEingang.mockReturnValue(of(vorgangWithEingangStateResource)); + + const empfaenger$: Observable<string> = service.getEmpfaenger(); + + expect(empfaenger$).toBeObservable( + singleColdCompleted( + `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`, + ), + ); + }); + }); + + describe('isPostfachConfigured', () => { + it('should return true', () => { + vorgangService.getVorgangWithEingang.mockReturnValue( + of( + createStateResource( + createVorgangWithEingangResource([VorgangHeaderLinkRel.POSTFACH_MAILS]), + ), + ), + ); + + const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured(); + + expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(true)); + }); + + it('should return false', () => { + vorgangService.getVorgangWithEingang.mockReturnValue( + of(createStateResource(createVorgangWithEingangResource())), + ); + + const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured(); + + expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(false)); }); }); }); 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 4991aee1230dd17fa5812f4df091d750b219af65..2474203852ea6c55a58eb19c3844b6ce1bf43c3b 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -11,9 +11,9 @@ import { tapOnCommandSuccessfullyDone, } from '@alfa-client/command-shared'; import { + HttpError, StateResource, createEmptyStateResource, - createErrorStateResource, createStateResource, filterIsLoadedOrHasError, getEmbeddedResources, @@ -23,10 +23,12 @@ import { } from '@alfa-client/tech-shared'; import { VorgangCommandService, + VorgangHeaderLinkRel, VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; import { Injectable } from '@angular/core'; import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; import { @@ -44,7 +46,7 @@ import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resour import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service'; import { BescheidFacade } from './+state/bescheid.facade'; import { BescheidLinkRel } from './bescheid.linkrel'; -import { Bescheid, BescheidResource } from './bescheid.model'; +import { Bescheid, BescheidResource, UploadFileInProgress } from './bescheid.model'; import { buildCreateBescheidCommand, buildCreateBescheidDocumentCommandProps, @@ -70,11 +72,11 @@ export class BescheidService { readonly bescheidDocument$: BehaviorSubject<StateResource<DocumentResource>> = new BehaviorSubject<StateResource<DocumentResource>>(createEmptyStateResource()); - readonly createBescheidDocumentInProgress$: BehaviorSubject<boolean> = - new BehaviorSubject<boolean>(false); + readonly createBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> = + new BehaviorSubject<UploadFileInProgress>({ loading: false }); - readonly uploadBescheidDocumentInProgress$: BehaviorSubject<boolean> = - new BehaviorSubject<boolean>(false); + readonly uploadBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> = + new BehaviorSubject<UploadFileInProgress>({ loading: false }); loadBescheidDocumentSubscription: Subscription; @@ -173,7 +175,8 @@ export class BescheidService { return this.doUpdateBescheid(this.resourceService.getResource(), bescheid).pipe( tapOnCommandSuccessfullyDone((commandStateResource: StateResource<CommandResource>) => { this.updateBescheidDraft(commandStateResource.resource); - this.removeErrorFromBescheidDocumentFile(); + this.clearCreateBescheidDocumentInProgress(); + this.clearUploadBescheidDocumentInProgress(); }), ); } @@ -204,10 +207,6 @@ export class BescheidService { this.resourceService.setResourceByUri(getEffectedResourceUrl(command)); } - private removeErrorFromBescheidDocumentFile(): void { - this.bescheidDocumentFile$.next({ ...this.bescheidDocumentFile$.value, error: undefined }); - } - public getAttachments(): Observable<BinaryFileResource[]> { return this.getBescheidDraft().pipe( filter(isLoaded), @@ -239,6 +238,10 @@ export class BescheidService { return this.bescheidDocumentFile$.asObservable(); } + public getBescheidDocument(): Observable<StateResource<DocumentResource>> { + return this.bescheidDocument$.asObservable(); + } + public loadBescheidDocument(resourceUri: ResourceUri): void { this.setBescheidDocumentFileLoading(); this.loadBescheidDocumentSubscription = this.repository @@ -255,15 +258,25 @@ export class BescheidService { this.bescheidDocumentFile$.next({ ...this.bescheidDocumentFile$.value, loading: true }); } - public uploadBescheidDocument(bescheid: BescheidResource, file: File): Observable<boolean> { - this.initBescheidDocumentUpload(file.name); - this.initUploadBescheidDocumentInProgress(); + public uploadBescheidDocument( + bescheid: BescheidResource, + file: File, + ): Observable<UploadFileInProgress> { + this.clearCreateBescheidDocumentInProgress(); + this.initUploadBescheidDocumentInProgress(file.name); this.doUploadBescheidDocument(bescheid, file); - return this.uploadBescheidDocumentInProgress$.asObservable(); + return this.getUploadBescheidDocumentInProgress(); } - private initUploadBescheidDocumentInProgress(): void { - this.uploadBescheidDocumentInProgress$.next(true); + private clearCreateBescheidDocumentInProgress(): void { + this.createBescheidDocumentInProgress$.next({ loading: false }); + } + + private initUploadBescheidDocumentInProgress(fileName: string): void { + this.uploadBescheidDocumentInProgress$.next({ fileName, loading: true }); + } + public getUploadBescheidDocumentInProgress(): Observable<UploadFileInProgress> { + return this.uploadBescheidDocumentInProgress$.asObservable(); } doUploadBescheidDocument(bescheid: BescheidResource, file: File): void { @@ -280,8 +293,7 @@ export class BescheidService { binaryFileStateResource: StateResource<BinaryFileResource>, ): void { if (hasError(binaryFileStateResource)) { - this.bescheidDocumentFile$.next(binaryFileStateResource); - this.setUploadBescheidDocumentInProgressDone(); + this.setUploadBescheidDocumentInProgressError(binaryFileStateResource.error); } else { this.createBescheidDocumentFromFile(bescheid, binaryFileStateResource.resource); } @@ -301,16 +313,16 @@ export class BescheidService { binaryFile: BinaryFileResource, ): void { if (hasError(commandStateResource)) { - this.bescheidDocumentFile$.next(createErrorStateResource(commandStateResource.error)); + this.setUploadBescheidDocumentInProgressError(commandStateResource.error); } else { this.bescheidDocumentFile$.next(createStateResource(binaryFile)); this.bescheidDocumentUri$.next(getEffectedResourceUrl(commandStateResource.resource)); + this.clearUploadBescheidDocumentInProgress(); } - this.setUploadBescheidDocumentInProgressDone(); } - private setUploadBescheidDocumentInProgressDone(): void { - this.uploadBescheidDocumentInProgress$.next(false); + private setUploadBescheidDocumentInProgressError(error: HttpError): void { + this.uploadBescheidDocumentInProgress$.next({ loading: false, error }); } public deleteBescheidDocument(): void { @@ -318,19 +330,27 @@ export class BescheidService { this.bescheidDocumentFile$.next(createEmptyStateResource()); } - public createBescheidDocument(): Observable<boolean> { - this.initBescheidDocumentUpload(); + public createBescheidDocument(): Observable<UploadFileInProgress> { + this.clearUploadBescheidDocumentInProgress(); this.setCreateBescheidDocumenInProgress(); this.doCreateBescheidDocument() .pipe(filterIsLoadedOrHasError(), first()) .subscribe((commandStateResource: StateResource<CommandResource>) => this.handleCreateBescheidDocumentResponse(commandStateResource), ); + return this.getCreateBescheidDocumentInProgress(); + } + + private clearUploadBescheidDocumentInProgress(): void { + this.uploadBescheidDocumentInProgress$.next({ loading: false }); + } + + public getCreateBescheidDocumentInProgress(): Observable<UploadFileInProgress> { return this.createBescheidDocumentInProgress$.asObservable(); } private setCreateBescheidDocumenInProgress(): void { - this.createBescheidDocumentInProgress$.next(true); + this.createBescheidDocumentInProgress$.next({ loading: true }); } doCreateBescheidDocument(): Observable<StateResource<CommandResource>> { @@ -343,33 +363,29 @@ export class BescheidService { commandStateResource: StateResource<CommandResource>, ): void { if (hasError(commandStateResource)) { - this.bescheidDocumentFile$.next(createErrorStateResource(commandStateResource.error)); - this.setCreateBescheidDocumentInProgressDone(); + this.setCreateBescheidDocumentInProgressError(commandStateResource.error); } else { const documentUri: ResourceUri = getEffectedResourceUrl(commandStateResource.resource); - this.loadBescheidDocument(documentUri); this.bescheidDocumentUri$.next(documentUri); + this.loadBescheidDocument(documentUri); } } - initBescheidDocumentUpload(fileName?: string): void { - this.bescheidDocumentFile$.next( - createStateResource(<BinaryFileResource>{ name: fileName }, true), - ); - } - loadBescheidDocumentFile(document: DocumentResource): void { this.binaryFileService .getFile(getUrl(document, DocumentLinkRel.FILE)) .pipe(filterIsLoadedOrHasError(), first()) .subscribe((binaryFile) => { this.bescheidDocumentFile$.next(binaryFile); - this.setCreateBescheidDocumentInProgressDone(); + this.createBescheidDocumentInProgress$.next({ loading: false }); }); } - private setCreateBescheidDocumentInProgressDone(): void { - this.createBescheidDocumentInProgress$.next(false); + private setCreateBescheidDocumentInProgressError(error: HttpError): void { + this.createBescheidDocumentInProgress$.next({ + error, + loading: false, + }); } public getBescheidDocumentCommand(): Observable<StateResource<CommandResource>> { @@ -393,4 +409,19 @@ export class BescheidService { public reloadCurrentVorgang(): void { this.vorgangService.reloadCurrentVorgang(); } + + public getEmpfaenger(): Observable<string> { + return this.vorgangService.getVorgangWithEingang().pipe( + filter(isLoaded), + map((stateResource) => stateResource.resource), + map(getEmpfaenger), + ); + } + + public isPostfachConfigured(): Observable<boolean> { + return this.vorgangService.getVorgangWithEingang().pipe( + filter(isLoaded), + map((stateResource) => hasLink(stateResource.resource, VorgangHeaderLinkRel.POSTFACH_MAILS)), + ); + } } diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts index 755f071d49ee06d084e0f352723b14e585ba6756..a6ba05191512ec2c4ad936eb85d756dd2836dd51 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts @@ -66,7 +66,7 @@ describe('BescheidUtil', () => { binaryFileResource, ); - expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT); + expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE); }); describe('command', () => { @@ -195,7 +195,7 @@ describe('BescheidUtil', () => { it('should have linkRel', () => { const props: CreateCommandProps = buildCreateBescheidDocumentCommandProps(bescheidResource); - expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT); + expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT); }); describe('command', () => { diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts index e3cd07a88f6b2be5932030f5ee0057fc3aec537f..ee496fe13667e8281da29458f5a698391bfc0497 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts @@ -28,7 +28,7 @@ export function buildCreateBescheidDocumentFromFileProps( ): CreateCommandProps { return { resource: bescheid, - linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT, + linkRel: BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE, command: buildCreateBescheidDocumentFromFileCommand(binaryFile), snackBarMessage: EMPTY_STRING, }; @@ -67,7 +67,7 @@ export function buildCreateBescheidDocumentCommandProps( ): CreateCommandProps { return { resource, - linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT, + linkRel: BescheidLinkRel.CREATE_DOCUMENT, command: { order: CommandOrder.CREATE_BESCHEID_DOCUMENT, 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 2d791e3ec7a962ca9cc1dadf1fa5a7a1d53238e4..87b026957ac62dbd239308663ac94be788110486 100644 --- a/alfa-client/libs/bescheid-shared/src/test/bescheid.ts +++ b/alfa-client/libs/bescheid-shared/src/test/bescheid.ts @@ -1,7 +1,13 @@ import { createStateResource, StateResource } from '@alfa-client/tech-shared'; import faker from '@faker-js/faker'; import { toResource } from 'libs/tech-shared/test/resource'; -import { Bescheid, BescheidResource, BescheidSendBy } from '../lib/bescheid.model'; +import { createApiError } from '../../../tech-shared/test/error'; +import { + Bescheid, + BescheidResource, + BescheidSendBy, + UploadFileInProgress, +} from '../lib/bescheid.model'; export function createBescheid(): Bescheid { return { @@ -21,3 +27,7 @@ export function createBescheidStateResource( ): StateResource<BescheidResource> { return createStateResource(createBescheidResource(linkRel)); } + +export function createUploadFileInProgress(): UploadFileInProgress { + return { loading: true, fileName: faker.name.firstName(), error: createApiError() }; +} diff --git a/alfa-client/libs/bescheid-shared/src/test/document.ts b/alfa-client/libs/bescheid-shared/src/test/document.ts index 1c88004f87bcc6b198a9ac3a453a3c9839326e1e..38fa7d022856d8c7ad33c9a5ba88ba4f0b4a3737 100644 --- a/alfa-client/libs/bescheid-shared/src/test/document.ts +++ b/alfa-client/libs/bescheid-shared/src/test/document.ts @@ -1,6 +1,16 @@ +import faker from '@faker-js/faker'; import { toResource } from 'libs/tech-shared/test/resource'; -import { DocumentResource } from '../lib/document.model'; +import { Document, DocumentResource } from '../lib/document.model'; + +export function createDocument(): Document { + return { + type: 'Bescheid', + fileId: faker.internet.url(), + nachrichtSubject: faker.datatype.string(10), + nachrichtText: faker.lorem.text(), + }; +} export function createDocumentResource(linkRel: string[] = []): DocumentResource { - return toResource({}, linkRel); + return toResource(createDocument(), linkRel); } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts index 81dbf91bfdc2657a53bbcdbc6e10089f0ffa4f24..ff10996f5a08bcb16c51b9fafc0a0b5ec736e549 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts @@ -21,8 +21,12 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { PostfachMailListResource, PostfachService } from '@alfa-client/postfach-shared'; +import { PostfachMailFormComponent } from '@alfa-client/postfach'; +import { + PostfachMailFormDialogData, + PostfachMailListResource, + PostfachService, +} from '@alfa-client/postfach-shared'; import { HasLinkPipe, StateResource, @@ -32,6 +36,9 @@ import { import { mock } from '@alfa-client/test-utils'; import { DialogService } from '@alfa-client/ui'; import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import faker from '@faker-js/faker'; import { createCommandResource } from 'libs/command-shared/test/command'; import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach'; import { createApiError } from 'libs/tech-shared/test/error'; @@ -41,6 +48,9 @@ import { of } from 'rxjs'; import { PostfachMailButtonContainerComponent } from './postfach-mail-button-container.component'; import { PostfachMailButtonComponent } from './postfach-mail-button/postfach-mail-button.component'; +jest.mock('@alfa-client/vorgang-shared-ui'); +const getEmpfaengerMock = getEmpfaenger as jest.Mock; + describe('PostfachMailButtonContainerComponent', () => { let component: PostfachMailButtonContainerComponent; let fixture: ComponentFixture<PostfachMailButtonContainerComponent>; @@ -173,13 +183,45 @@ describe('PostfachMailButtonContainerComponent', () => { }); }); - describe('getEmpfaenger', () => { - it('should return antragsteller name', () => { - const antragsteller = component.getEmpfaenger(); + describe('buildDialogData', () => { + const postfachMailListStateResource: StateResource<PostfachMailListResource> = + createStateResource(createPostfachMailListResource()); - expect(antragsteller).toEqual( - `${vorgang.eingang.antragsteller.vorname} ${vorgang.eingang.antragsteller.nachname}`, + it('should get empfänger', () => { + component.buildDialogData(postfachMailListStateResource); + + expect(getEmpfaengerMock).toHaveBeenCalled(); + }); + + it('should set empfänger', () => { + const empfanger: string = faker.name.firstName(); + getEmpfaengerMock.mockReturnValue(empfanger); + + const dialogData: PostfachMailFormDialogData = component.buildDialogData( + postfachMailListStateResource, ); + + expect(dialogData.empfaenger).toEqual(empfanger); + }); + + it('should set component', () => { + const dialogData = component.buildDialogData(postfachMailListStateResource); + + expect(dialogData.component).toBe(PostfachMailFormComponent); + }); + + it('should set title', () => { + const dialogData: PostfachMailFormDialogData = component.buildDialogData( + postfachMailListStateResource, + ); + + expect(dialogData.title).toEqual(PostfachMailButtonContainerComponent.TITLE); + }); + + it('should set state resource', () => { + const dialogData = component.buildDialogData(postfachMailListStateResource); + + expect(dialogData.postfachMailListStateResource).toEqual(postfachMailListStateResource); }); }); }); diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts index dde104c79cf00b344d836312072bf0963f96bbf1..6a4d16d49caa38d8901b8f352fded1be89bd7b59 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts @@ -21,8 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; import { CommandResource } from '@alfa-client/command-shared'; import { PostfachMailFormDialogData, @@ -30,15 +28,12 @@ import { PostfachMailListResource, PostfachService, } from '@alfa-client/postfach-shared'; -import { - EMPTY_STRING, - StateResource, - hasError, - isNotNull, - isNotUndefined, -} from '@alfa-client/tech-shared'; +import { StateResource, hasError, isNotNull, isNotUndefined } from '@alfa-client/tech-shared'; import { DialogService, FixedDialogComponent } from '@alfa-client/ui'; import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { Component, Input } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; import { hasLink } from '@ngxp/rest'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @@ -50,6 +45,8 @@ import { PostfachMailFormComponent } from '../postfach-mail-form/postfach-mail-f styleUrls: ['./postfach-mail-button-container.component.scss'], }) export class PostfachMailButtonContainerComponent { + static readonly TITLE = 'Neue Nachricht'; + private _vorgang: VorgangWithEingangResource; public get vorgang(): VorgangWithEingangResource { return this._vorgang; @@ -108,24 +105,14 @@ export class PostfachMailButtonContainerComponent { ); } - private buildDialogData( + buildDialogData( postfachMailListStateResource: StateResource<PostfachMailListResource>, ): PostfachMailFormDialogData { return { component: PostfachMailFormComponent, - title: 'Neue Nachricht', - empfaenger: this.getEmpfaenger(), + title: PostfachMailButtonContainerComponent.TITLE, + empfaenger: getEmpfaenger(this.vorgang), postfachMailListStateResource: postfachMailListStateResource, }; } - - getEmpfaenger(): string { - return this.existsAntragsteller() ? - `${this.vorgang.eingang.antragsteller.vorname} ${this.vorgang.eingang.antragsteller.nachname}` - : EMPTY_STRING; - } - - private existsAntragsteller(): boolean { - return !!this.vorgang.eingang.antragsteller; - } } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts index 9eb44a2c48f63bd3a8779a830445df2369eb1725..68f51e677db01f0005da3029089197ba2e37f4a6 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts @@ -21,10 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Inject, Input } from '@angular/core'; import { ON_PAGE, PostfachMailLinkRel, PostfachMailResource } from '@alfa-client/postfach-shared'; import { StateResource } from '@alfa-client/tech-shared'; -import { VorgangResource } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { Component, Inject, Input } from '@angular/core'; @Component({ selector: 'alfa-outgoing-mail', @@ -33,7 +33,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared'; }) export class OutgoingMailComponent { @Input() postfachMail: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangResource>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; readonly postfachNachrichtLinkRel = PostfachMailLinkRel; diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts index 58fb157e90d1021e84023f057cf096017b11d4b4..a7eaeaab39408e2db221bf4156d3b812cbcfd8b6 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts @@ -1,20 +1,20 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared'; -import { EMPTY_STRING, createStateResource } from '@alfa-client/tech-shared'; +import { createStateResource } from '@alfa-client/tech-shared'; import { Mock, dispatchEventFromFixture, getMockComponent, mock } from '@alfa-client/test-utils'; import { DialogService, OzgcloudIconComponent } from '@alfa-client/ui'; -import { Antragsteller, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import faker from '@faker-js/faker'; import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach'; import { PostfachMailFormComponent } from 'libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { - createAntragsteller, - createEingang, - createVorgangWithEingangResource, -} from 'libs/vorgang-shared/test/vorgang'; +import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; import { PostfachNachrichtEditButtonContainerComponent } from './postfach-nachricht-edit-button-container.component'; +jest.mock('@alfa-client/vorgang-shared-ui'); +const getEmpfaengerMock = getEmpfaenger as jest.Mock; + describe('PostfachNachrichtEditButtonContainerComponent', () => { let component: PostfachNachrichtEditButtonContainerComponent; let fixture: ComponentFixture<PostfachNachrichtEditButtonContainerComponent>; @@ -96,63 +96,19 @@ describe('PostfachNachrichtEditButtonContainerComponent', () => { expect(dialogData.postfachNachricht).toBe(postfachNachricht); }); - it('should get Empfaenger', () => { - component.getEmpfaenger = jest.fn(); - + it('should get empfänger', () => { component.buildDialogData(); - expect(component.getEmpfaenger).toHaveBeenCalled(); - }); - }); - - describe('getEmpfaenger', () => { - it('should return nachname only if exists', () => { - const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual(antragsteller.nachname); - }); - - it('should return vorname only if exists', () => { - const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual(antragsteller.vorname); - }); - - it('should return name and vorname if exists', () => { - const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); - component.vorgangStateResource = createStateResource(vorgangWithEingang); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual( - `${vorgangWithEingang.eingang.antragsteller.vorname} ${vorgangWithEingang.eingang.antragsteller.nachname}`, - ); + expect(getEmpfaengerMock).toHaveBeenCalled(); }); - it('should return empty string if none exists', () => { - const antragsteller: Antragsteller = { - ...createAntragsteller(), - nachname: undefined, - vorname: undefined, - }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); + it('should set empfänger', () => { + const empfanger: string = faker.name.firstName(); + getEmpfaengerMock.mockReturnValue(empfanger); - const empfaenger: string = component.getEmpfaenger(); + const dialogData: PostfachMailFormDialogData = component.buildDialogData(); - expect(empfaenger).toEqual(EMPTY_STRING); + expect(dialogData.empfaenger).toEqual(empfanger); }); - - function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource { - return { - ...createVorgangWithEingangResource(), - eingang: { ...createEingang(), antragsteller }, - }; - } }); }); diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts index 7d1aad74943eb34874ef94577135ba5a7dd8a13c..a7ee3b38e083aa4d9a800a7420a6e7e9dfed393d 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts @@ -1,7 +1,8 @@ import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared'; -import { EMPTY_STRING, StateResource, isNotNil } from '@alfa-client/tech-shared'; +import { StateResource } from '@alfa-client/tech-shared'; import { DialogService } from '@alfa-client/ui'; -import { Antragsteller, VorgangWithEingang } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; import { Component, Input } from '@angular/core'; import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/postfach-mail-form.component'; @@ -12,7 +13,7 @@ import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/pos }) export class PostfachNachrichtEditButtonContainerComponent { @Input() postfachNachricht: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangWithEingang>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; constructor(private dialogService: DialogService) {} @@ -25,27 +26,7 @@ export class PostfachNachrichtEditButtonContainerComponent { title: 'Nachricht bearbeiten', component: PostfachMailFormComponent, postfachNachricht: this.postfachNachricht, - empfaenger: this.getEmpfaenger(), + empfaenger: getEmpfaenger(this.vorgangStateResource.resource), }; } - - getEmpfaenger(): string { - return `${this.getVorname()} ${this.getNachname()}`.trim(); - } - - private getVorname(): string { - return isNotNil(this.getAntragsteller()?.vorname) ? - this.getAntragsteller().vorname - : EMPTY_STRING; - } - - private getNachname(): string { - return isNotNil(this.getAntragsteller()?.nachname) ? - this.getAntragsteller().nachname - : EMPTY_STRING; - } - - private getAntragsteller(): Antragsteller { - return this.vorgangStateResource.resource.eingang.antragsteller; - } } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts index 41f9e4879ce3133551800f72fc1eabc05d7966a4..51b14d26cd1aaca7c3b93a4ed8e1bbda2d482d16 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts @@ -21,7 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Inject, Input } from '@angular/core'; import { ON_PAGE, PostfachMailLinkRel, @@ -29,7 +28,8 @@ import { isIncomingMail, } from '@alfa-client/postfach-shared'; import { StateResource } from '@alfa-client/tech-shared'; -import { VorgangResource } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { Component, Inject, Input } from '@angular/core'; @Component({ selector: 'alfa-postfach-mail', @@ -38,7 +38,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared'; }) export class PostfachMailComponent { @Input() postfachMail: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangResource>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; readonly postfachNachrichtLinkRel = PostfachMailLinkRel; 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 1dd2e6701baba2c50028dbfdfa9c215359e7ef06..2a96a3b53a7329a7ef6536c2e184cf5d1be096a9 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 @@ -21,19 +21,25 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { HasLinkPipe, createStateResource } from '@alfa-client/tech-shared'; +import { CommandResource } from '@alfa-client/command-shared'; +import { + HasLinkPipe, + StateResource, + createEmptyStateResource, + createStateResource, +} from '@alfa-client/tech-shared'; import { mock } from '@alfa-client/test-utils'; import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, } from '@alfa-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } 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'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; -import { of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { AbschliessenButtonComponent } from './abschliessen-button.component'; describe('AbschliessenButtonComponent', () => { @@ -84,11 +90,28 @@ describe('AbschliessenButtonComponent', () => { }); describe('abschliessen', () => { + const command: CommandResource = createCommandResource(); + const comandStateResource$: Observable<StateResource<CommandResource>> = of( + createStateResource(command), + ); + + beforeEach(() => { + vorgangCommandService.abschliessen.mockReturnValue(comandStateResource$); + }); + it('should call vorgang service', () => { component.abschliessen(); expect(vorgangCommandService.abschliessen).toHaveBeenCalled(); }); + + it('should assign response', () => { + component.commandStateResource$ = of(createEmptyStateResource<CommandResource>()); + + component.abschliessen(); + + expect(component.commandStateResource$).toBe(comandStateResource$); + }); }); describe('abschliessen button', () => { 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 f4dafed5cdc6da7afcec0f200722405e281d1e17..15df48ad2b497eed92ec4dfd36278e18fd3e506f 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 @@ -21,7 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input, OnInit } from '@angular/core'; import { CommandResource } from '@alfa-client/command-shared'; import { StateResource, createEmptyStateResource } from '@alfa-client/tech-shared'; import { @@ -29,6 +28,7 @@ import { VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; +import { Component, Input, OnInit } from '@angular/core'; import { Observable, of } from 'rxjs'; @Component({ @@ -53,6 +53,6 @@ export class AbschliessenButtonComponent implements OnInit { } public abschliessen(): void { - this.vorgangCommandService.abschliessen(this.vorgang); + this.commandStateResource$ = this.vorgangCommandService.abschliessen(this.vorgang); } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts index 0f2ccfe5b42b0c78b073e968ebd9a0821d26828b..d6251e13d63c817db05ef4b8a744e5d100d88b82 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts @@ -22,6 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { CommandResource } from '@alfa-client/command-shared'; import { HasLinkPipe, StateResource, @@ -41,10 +42,11 @@ import { } from '@alfa-client/vorgang-shared'; import { DialogRef } from '@angular/cdk/dialog'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; -import { of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { createBescheidResource } from '../../../../../bescheid-shared/src/test/bescheid'; import { BescheidenDialogData } from '../../vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.model'; import { VorgangDetailBescheidenComponent } from '../../vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component'; @@ -171,32 +173,50 @@ describe('BescheidenButtonComponent', () => { }); describe('onClick', () => { - it('should open bescheid wizard when create bescheid draft link exists', () => { - component.openBescheidenWizard = jest.fn(); - component.vorgang = createVorgangWithEingangResource([ - VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT, - ]); + describe('should open bescheid wizard', () => { + beforeEach(() => { + component.openBescheidenWizard = jest.fn(); + component.vorgang = createVorgangWithEingangResource([ + VorgangWithEingangLinkRel.CREATE_BESCHEID_DRAFT, + ]); + }); - component.onClick(); + it('should open bescheid wizard when create bescheid draft link exists', () => { + component.onClick(); + + expect(component.openBescheidenWizard).toHaveBeenCalled(); + }); - expect(component.openBescheidenWizard).toHaveBeenCalled(); + it('should open bescheid wizard when bescheid draft exists', () => { + component.onClick(); + + expect(component.openBescheidenWizard).toHaveBeenCalled(); + }); }); - it('should open bescheid wizard when bescheid draft exists', () => { - component.openBescheidenWizard = jest.fn(); - component.vorgang = createVorgangWithEingangResource([ - VorgangWithEingangLinkRel.BESCHEID_DRAFT, - ]); + describe('should do bescheiden', () => { + const command: CommandResource = createCommandResource(); + const comandStateResource$: Observable<StateResource<CommandResource>> = of( + createStateResource(command), + ); - component.onClick(); + beforeEach(() => { + vorgangCommandService.bescheiden.mockReturnValue(comandStateResource$); + }); - expect(component.openBescheidenWizard).toHaveBeenCalled(); - }); + it('should call vorgangCommandService.bescheiden', () => { + component.onClick(); - it('should call vorgangCommandService.bescheiden', () => { - component.onClick(); + expect(vorgangCommandService.bescheiden).toHaveBeenCalled(); + }); + + it('should assign response', () => { + component.commandStateResource$ = of(createEmptyStateResource<CommandResource>()); - expect(vorgangCommandService.bescheiden).toHaveBeenCalled(); + component.onClick(); + + expect(component.commandStateResource$).toBe(comandStateResource$); + }); }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts index 57fb4b05366bdd752b98c8b3cfc20f8a372f1bae..d76a5cf53225299d7f63695281c06c13bba00cc0 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.ts @@ -76,7 +76,7 @@ export class BescheidenButtonComponent implements OnInit { if (this.shouldOpenBescheidenWizard()) { this.openBescheidenWizard(); } else { - this.vorgangCommandService.bescheiden(this.vorgang); + this.commandStateResource$ = this.vorgangCommandService.bescheiden(this.vorgang); } } 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 0b1990b314cf37d4afefdeed405b889a38b456a2..5b082c9a1a664ffc1aa4c5e37979a2834b24f520 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 @@ -4,22 +4,31 @@ import { BescheidResource, BescheidSendBy, BescheidService, + DocumentResource, } from '@alfa-client/bescheid-shared'; +import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { CommandResource } from '@alfa-client/command-shared'; -import { StateResource, createStateResource, formatForDatabase } from '@alfa-client/tech-shared'; +import { + EMPTY_STRING, + StateResource, + createStateResource, + formatForDatabase, +} from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { fakeAsync, tick } from '@angular/core/testing'; import { UntypedFormBuilder } from '@angular/forms'; import faker from '@faker-js/faker'; -import { Resource } from '@ngxp/rest'; +import { Resource, ResourceUri } from '@ngxp/rest'; import { cold } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; import { toResource } from 'libs/tech-shared/test/resource'; import { of } from 'rxjs'; import { createBescheidResource } from '../../../../../bescheid-shared/src/test/bescheid'; +import { createDocumentResource } from '../../../../../bescheid-shared/src/test/document'; import { createBinaryFileResource } from '../../../../../binary-file-shared/test/binary-file'; import { singleCold } from '../../../../../tech-shared/src/lib/resource/marbles'; import { createVorgangWithEingangResource } from '../../../../../vorgang-shared/test/vorgang'; @@ -30,7 +39,7 @@ registerLocaleData(localeDe); describe('BescheidenFormService', () => { let service: BescheidenFormService; let bescheidService: Mock<BescheidService>; - const now = new Date(); + const now: Date = new Date(); Date.now = jest.fn().mockReturnValue(now); beforeEach(() => { @@ -82,6 +91,8 @@ describe('BescheidenFormService', () => { attachments: [], bescheidDocument: null, sendBy: BescheidSendBy.NACHRICHT, + nachrichtSubject: '', + nachrichtText: '', }, }), ); @@ -89,7 +100,7 @@ describe('BescheidenFormService', () => { }); describe('getValue', () => { - let getFormValue; + let getFormValue: jest.Mock; beforeEach(() => { getFormValue = service.getFormValue = jest.fn(); @@ -103,7 +114,7 @@ describe('BescheidenFormService', () => { }); it('should return bescheid', () => { - const value = service.getValue(); + const value: Bescheid = service.getValue(); expect(value).toEqual({ bewilligt: true, beschiedenAm: formatForDatabase(now) } as Bescheid); }); @@ -118,6 +129,8 @@ describe('BescheidenFormService', () => { attachments: [], bescheidDocument: null, sendBy: BescheidSendBy.NACHRICHT, + nachrichtSubject: '', + nachrichtText: '', }), ); }); @@ -144,7 +157,7 @@ describe('BescheidenFormService', () => { }); it('should call patch with undefined sendBy', () => { - const bescheidDocumentUri = faker.internet.url(); + const bescheidDocumentUri: ResourceUri = faker.internet.url(); service.patchValues({ ...bescheidResource, sendBy: undefined, @@ -159,6 +172,8 @@ describe('BescheidenFormService', () => { [BescheidenFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), [BescheidenFormService.FIELD_SEND_BY]: BescheidSendBy.NACHRICHT, [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtSubject, }); }); @@ -242,7 +257,8 @@ describe('BescheidenFormService', () => { describe('setVorgangWithEingangResource', () => { it('should set vorgangWithEingangResource', () => { - const vorgangWithEingangResource = createVorgangWithEingangResource(); + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); service.setVorgangWithEingangResource(vorgangWithEingangResource); @@ -252,10 +268,11 @@ describe('BescheidenFormService', () => { describe('getVorgangWithEingangResource', () => { it('should reutrn vorgangWithEingangResource', () => { - const vorgangWithEingangResource = createVorgangWithEingangResource(); + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); service.vorgangWithEingangResource = vorgangWithEingangResource; - const vorang = service.getVorgangWithEingangResource(); + const vorang: VorgangWithEingangResource = service.getVorgangWithEingangResource(); expect(vorang).toBe(vorgangWithEingangResource); }); @@ -263,9 +280,9 @@ describe('BescheidenFormService', () => { describe('deleteFile', () => { it('should emit binary file resource', (done) => { - const file = createBinaryFileResource(); + const file: BinaryFileResource = createBinaryFileResource(); - service.getFileDelete().subscribe((deletedFile) => { + service.getFileDelete().subscribe((deletedFile: BinaryFileResource) => { expect(deletedFile).toEqual(file); done(); }); @@ -273,4 +290,35 @@ describe('BescheidenFormService', () => { service.deleteFile(file); }); }); + + describe('setActiveStep', () => { + it('should emit step', () => { + service.setActiveStep(3); + + expect(service.getActiveStep()).toBeObservable(singleCold(3)); + }); + }); + + describe('patchNachricht', () => { + it('should patch values', () => { + const documentResource: DocumentResource = createDocumentResource(); + + service.patchNachricht(documentResource); + + expect(service.getValue().nachrichtSubject).toEqual(documentResource.nachrichtSubject); + expect(service.getValue().nachrichtText).toEqual(documentResource.nachrichtText); + }); + }); + + describe('clearNachricht', () => { + it('should patch values', () => { + const documentResource: DocumentResource = createDocumentResource(); + + service.patchNachricht(documentResource); + service.clearNachricht(); + + expect(service.getValue().nachrichtSubject).toEqual(EMPTY_STRING); + expect(service.getValue().nachrichtText).toEqual(EMPTY_STRING); + }); + }); }); 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 b044ee37f0ebced6f2c78b77780118210f1bb481..4780976bf07b0e69ee852dc317b19f6c785c1b7e 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 @@ -4,11 +4,13 @@ import { BescheidResource, BescheidSendBy, BescheidService, + DocumentResource, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { tapOnCommandSuccessfullyDone } from '@alfa-client/command-shared'; import { AbstractFormService, + EMPTY_STRING, HttpError, StateResource, asBoolean, @@ -36,15 +38,17 @@ export class BescheidenFormService extends AbstractFormService implements OnDest static readonly FIELD_BESCHEID_DOCUMENT = 'bescheidDocument'; static readonly FIELD_ATTACHMENTS = 'attachments'; public static readonly FIELD_SEND_BY = 'sendBy'; + static readonly FIELD_NACHRICHT_SUBJECT = 'nachrichtSubject'; + static readonly FIELD_NACHRICHT_TEXT = 'nachrichtText'; static readonly FIELD_PATH_PREFIX = 'command.body'; private readonly bescheidChanges$: BehaviorSubject<Bescheid>; - private attachmentUpload$: Subject<StateResource<BinaryFileResource>>; + private attachmentUpload$: BehaviorSubject<StateResource<BinaryFileResource>>; private bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>; private readonly fileDelete$: Subject<BinaryFileResource>; - private readonly activeStep: BehaviorSubject<number> = new BehaviorSubject(1); + private readonly activeStep$: BehaviorSubject<number> = new BehaviorSubject(1); readonly sendByManual: BehaviorSubject<boolean> = new BehaviorSubject(false); vorgangWithEingangResource: VorgangWithEingangResource; @@ -67,7 +71,9 @@ export class BescheidenFormService extends AbstractFormService implements OnDest init(): void { this.formControlSubscriptions = this.subscribeToSendBy(); this.bescheidFileUpload$ = of(createEmptyStateResource<BinaryFileResource>()); - this.attachmentUpload$ = new Subject<StateResource<BinaryFileResource>>(); + this.attachmentUpload$ = new BehaviorSubject<StateResource<BinaryFileResource>>( + createEmptyStateResource(), + ); this.initializeFormChanges(); } @@ -116,6 +122,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, [BescheidenFormService.FIELD_SEND_BY]: isUndefined(bescheid.sendBy) ? BescheidSendBy.NACHRICHT : bescheid.sendBy, + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheid.nachrichtSubject, + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheid.nachrichtText, }); bescheid.attachments.forEach((attachmentLink) => (this.form.controls[BescheidenFormService.FIELD_ATTACHMENTS] as UntypedFormArray).push( @@ -138,6 +146,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest [BescheidenFormService.FIELD_SEND_BY]: new UntypedFormControl(BescheidSendBy.NACHRICHT), [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: new UntypedFormControl(null), [BescheidenFormService.FIELD_ATTACHMENTS]: new UntypedFormArray([]), + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: new UntypedFormControl(''), + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: new UntypedFormControl(''), }); } @@ -208,11 +218,11 @@ export class BescheidenFormService extends AbstractFormService implements OnDest } public setActiveStep(step: number) { - this.activeStep.next(step); + this.activeStep$.next(step); } public getActiveStep(): Observable<number> { - return this.activeStep.asObservable(); + return this.activeStep$.asObservable(); } public clearBescheidDocumentFile(): void { @@ -230,4 +240,21 @@ export class BescheidenFormService extends AbstractFormService implements OnDest public isSendByManual(): Observable<boolean> { return this.sendByManual.asObservable(); } + + public patchNachricht(documentResource: DocumentResource): void { + this.setNachrichtSubject(documentResource.nachrichtSubject); + this.setNachrichtText(documentResource.nachrichtText); + } + + public clearNachricht(): void { + this.setNachrichtSubject(EMPTY_STRING); + this.setNachrichtText(EMPTY_STRING); + } + + private setNachrichtSubject(value: string): void { + this.form.controls[BescheidenFormService.FIELD_NACHRICHT_SUBJECT].patchValue(value); + } + private setNachrichtText(value: string): void { + this.form.controls[BescheidenFormService.FIELD_NACHRICHT_TEXT].patchValue(value); + } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.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-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts index 7f2dfcf065308069b95c77fd4a2a8dc1164482cf..ba48a240982fb6f74a545cdf7b799a4c439277da 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.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-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts @@ -126,6 +126,14 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { expect(component.existingAttachments).toEqual([attachment]); }); + + it('should reset uploaded attachments', () => { + component.uploadedAttachments = [createStateResource(createBinaryFileResource())]; + + component.loadExistingAttachments(); + + expect(component.uploadedAttachments).toEqual([]); + }); }); describe('subscribeToAttachmentUpload', () => { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts index f4a2d246c43ae2a45efcdf5e5d21ffca38793f72..4fb7941eaf9e917d802f20e051e51194e8a88001 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts @@ -43,7 +43,10 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest this.bescheidService .getAttachments() .pipe(first()) - .subscribe((attachments) => (this.existingAttachments = attachments)); + .subscribe((attachments) => { + this.uploadedAttachments = []; + this.existingAttachments = attachments; + }); } subscribeToAttachmentUpload() { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html index 865686862a5e76ce5f2874b80b8375c20bff151d..e6fc88be75711bd7be2bd368b7e1dc5c578cf3c6 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html @@ -1,7 +1,3 @@ -<!--REPLACENME: Durch Neue UI/UX Componente ersetzten - @Input() stateResource: StateResource<BinaryFileResource> =# bescheidDocumentFile - @Output() delete: EventEmitter<BinaryFileResource> ---> <ng-container *ngIf="bescheidDocumentFile.resource"> <alfa-binary-file2-container *ngIf="!bescheidDocumentFile.loading" @@ -11,12 +7,17 @@ > </alfa-binary-file2-container> </ng-container> -<ng-container *ngIf="bescheidDocumentFile.loading"> - <span *ngIf="bescheidDocumentFile.resource">{{ bescheidDocumentFile.resource.name }}</span> +<ng-container *ngIf="uploadBescheidDocumentInProgress.loading"> + <span *ngIf="bescheidDocumentFile.resource">{{ uploadBescheidDocumentInProgress.fileName }}</span> <ods-spinner-icon spinner class="mr-3 flex size-10" /> </ng-container> +<!-- REPLACEME: UI/UX Componente für den Fehler anzeigen--> +<ng-container *ngIf="createBescheidDocumentInProgress.error"> + <span data-test-id="create-bescheid-document-error">Fehler beim automatischen Erstellen.</span> +</ng-container> +<!-- --> <alfa-vorgang-detail-bescheiden-form-error - *ngIf="bescheidDocumentFile.error && !bescheidDocumentFile.loading" - [error]="bescheidDocumentFile.error" + *ngIf="uploadBescheidDocumentInProgress.error && !bescheidDocumentFile.loading" + data-test-id="upload-bescheid-document-error" + [error]="uploadBescheidDocumentInProgress.error" ></alfa-vorgang-detail-bescheiden-form-error> -<!-- --> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.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-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts index 275bac1d9998a0ccfdfb94bd934c05a5b344dde2..08fc89135573aca9a8ac8218a357232c3e58deef 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.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-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts @@ -1,11 +1,13 @@ import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; import { BinaryFile2ContainerComponent } from '@alfa-client/binary-file'; import { createStateResource } from '@alfa-client/tech-shared'; -import { Mock, mock } from '@alfa-client/test-utils'; +import { Mock, existsAsHtmlElement, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { getUrl } from '@ngxp/rest'; import { createBescheidResource } from 'libs/bescheid-shared/src/test/bescheid'; import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { createApiError } from 'libs/tech-shared/test/error'; import { MockComponent } from 'ng-mocks'; import { VorgangDetailBescheidenFormErrorComponent } from '../vorgang-detail-bescheiden-form-error/vorgang-detail-bescheiden-form-error.component'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument.component'; @@ -14,6 +16,9 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { let component: VorgangDetailBescheidenResultDokumentComponent; let fixture: ComponentFixture<VorgangDetailBescheidenResultDokumentComponent>; + const createBescheidDocumentError: string = getDataTestIdOf('create-bescheid-document-error'); + const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error'); + let bescheidService: Mock<BescheidService>; beforeEach(async () => { @@ -62,4 +67,40 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { expect(bescheidService.loadBescheidDocument).not.toHaveBeenCalled(); }); }); + + describe('upload bescheid document error', () => { + it('should be shown if error exists', () => { + component.uploadBescheidDocumentInProgress = { loading: false, error: createApiError() }; + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, uploadBescheidDocumentError); + }); + + it('should be hidden on non error', () => { + component.uploadBescheidDocumentInProgress = { loading: false }; + + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, uploadBescheidDocumentError); + }); + }); + + describe('create bescheid document error', () => { + it('should be shown if error exists', () => { + component.createBescheidDocumentInProgress = { loading: false, error: createApiError() }; + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, createBescheidDocumentError); + }); + + it('should be hidden on non error', () => { + component.createBescheidDocumentInProgress = { loading: false }; + + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, createBescheidDocumentError); + }); + }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts index de533509bbef42e139f9502f0694f2aff68a9b7c..b8349745f2f0c67b699f0c0f7512674c0969a13d 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts @@ -1,4 +1,9 @@ -import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { + BescheidLinkRel, + BescheidResource, + BescheidService, + UploadFileInProgress, +} from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { StateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; @@ -10,6 +15,8 @@ import { getUrl, hasLink } from '@ngxp/rest'; }) export class VorgangDetailBescheidenResultDokumentComponent { @Input() bescheidDocumentFile: StateResource<BinaryFileResource>; + @Input() uploadBescheidDocumentInProgress: UploadFileInProgress = { loading: false }; + @Input() createBescheidDocumentInProgress: UploadFileInProgress = { loading: false }; @Input() set bescheidDraftStateResource(bescheidStateResource: StateResource<BescheidResource>) { this.handleBescheiDocument(bescheidStateResource.resource); } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html new file mode 100644 index 0000000000000000000000000000000000000000..44cf270aac5fb6dbb0e7fcef8505e1af8c43a68d --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html @@ -0,0 +1,20 @@ +<h1>Neue Nachricht</h1> +<p *ngIf="empfaenger$ | async as empfaenger" data-test-id="bescheid-nachricht-empfaenger"> + An: {{ empfaenger }} +</p> +<div [formGroup]="form"> + <!-- TODO: neue Komponente oder stylen? --> + <ozgcloud-text-editor + [formControlName]="formServiceClass.FIELD_NACHRICHT_SUBJECT" + label="Betreff" + > + </ozgcloud-text-editor> + + <!-- TODO: neue Komponente oder stylen? --> + <ozgcloud-textarea-editor + [formControlName]="formServiceClass.FIELD_NACHRICHT_TEXT" + label="Text" + class="message-editor" + > + </ozgcloud-textarea-editor> +</div> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.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-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f6e11aa735e90c470e1f8e7a0a334ffe1f7e464 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts @@ -0,0 +1,135 @@ +import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared'; +import { + createEmptyStateResource, + createErrorStateResource, + createStateResource, + StateResource, +} from '@alfa-client/tech-shared'; +import { getElementFromFixture } from '@alfa-client/test-utils'; +import { TextAreaEditorComponent, TextEditorComponent } from '@alfa-client/ui'; +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; +import { MatIcon } from '@angular/material/icon'; +import { MatIconTestingModule } from '@angular/material/icon/testing'; +import faker from '@faker-js/faker'; +import { Mock, mock, useFromMock } from 'libs/test-utils/src/lib/mocking'; +import { OzgcloudSvgIconComponent } from 'libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component'; +import { MockComponent } from 'ng-mocks'; +import { EMPTY, of } from 'rxjs'; +import { createDocumentResource } from '../../../../../../../bescheid-shared/src/test/document'; +import { singleColdCompleted } from '../../../../../../../tech-shared/src/lib/resource/marbles'; +import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test'; +import { createApiError } from '../../../../../../../tech-shared/test/error'; +import { BescheidenFormService } from '../../bescheiden.formservice'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht.component'; + +registerLocaleData(localeDe); + +describe('VorgangDetailBescheidenResultNachrichtComponent', () => { + let component: VorgangDetailBescheidenResultNachrichtComponent; + let fixture: ComponentFixture<VorgangDetailBescheidenResultNachrichtComponent>; + + let bescheidService: Mock<BescheidService>; + let formService: BescheidenFormService; + + const bescheidNachrichtEmpfaengerElement: string = getDataTestIdOf( + 'bescheid-nachricht-empfaenger', + ); + + beforeEach(async () => { + bescheidService = mock(BescheidService); + formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); + + await TestBed.configureTestingModule({ + imports: [ReactiveFormsModule, MatIconTestingModule], + declarations: [ + VorgangDetailBescheidenResultNachrichtComponent, + MatIcon, + MockComponent(OzgcloudSvgIconComponent), + MockComponent(TextEditorComponent), + MockComponent(TextAreaEditorComponent), + ], + providers: [ + { + provide: BescheidService, + useValue: bescheidService, + }, + { + provide: BescheidenFormService, + useValue: formService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VorgangDetailBescheidenResultNachrichtComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('render', () => { + it('should render Nachrichtenempfänger', () => { + const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`; + bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger)); + component.ngOnInit(); + + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement); + expect(element).toBeInstanceOf(HTMLElement); + }); + + it('should not render Nachrichtenempfänger', () => { + bescheidService.getEmpfaenger.mockReturnValue(EMPTY); + component.ngOnInit(); + + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement); + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + + describe('ngOnInit', () => { + it('should set Nachrichtenempfänger', () => { + const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`; + bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger)); + + component.ngOnInit(); + + expect(component.empfaenger$).toBeObservable(singleColdCompleted(empfaenger)); + }); + }); + + describe('set bescheidDocumentStateResource', () => { + beforeEach(() => { + formService.patchNachricht = jest.fn(); + }); + + it('should patch form', () => { + const documentStateResource: StateResource<DocumentResource> = + createStateResource(createDocumentResource()); + + component.bescheidDocumentStateResource = documentStateResource; + + expect(formService.patchNachricht).toHaveBeenCalledWith(documentStateResource.resource); + }); + + it('should not patch form if document not loaded', () => { + component.bescheidDocumentStateResource = createEmptyStateResource(); + + expect(formService.patchNachricht).not.toHaveBeenCalled(); + }); + + it('should not patch form if document loaded with error', () => { + component.bescheidDocumentStateResource = createErrorStateResource(createApiError()); + + expect(formService.patchNachricht).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cddc36969c17d7bf279a4fbc21a329184f6697a1 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts @@ -0,0 +1,33 @@ +import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared'; +import { StateResource } from '@alfa-client/tech-shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { BescheidenFormService } from '../../bescheiden.formservice'; + +@Component({ + selector: 'alfa-vorgang-detail-bescheiden-result-nachricht', + templateUrl: './vorgang-detail-bescheiden-result-nachricht.component.html', +}) +export class VorgangDetailBescheidenResultNachrichtComponent implements OnInit { + @Input() set bescheidDocumentStateResource(stateResource: StateResource<DocumentResource>) { + if (stateResource.loaded && !stateResource.error) { + this.formService.patchNachricht(stateResource.resource); + } + } + + empfaenger$: Observable<string>; + form: FormGroup; + + readonly formServiceClass = BescheidenFormService; + + constructor( + private readonly bescheidService: BescheidService, + private readonly formService: BescheidenFormService, + ) {} + + ngOnInit(): void { + this.empfaenger$ = this.bescheidService.getEmpfaenger(); + this.form = this.formService.form; + } +} 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.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html index b5c96a727291d98ec4488b42d60bcc273374b3ed..73a4f5ecf28582a26586bed9eb2f36928ad14635 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html @@ -1,58 +1,85 @@ <section - class="flex w-full flex-col justify-between overflow-auto rounded-xl bg-background-100 p-4" - *ngIf="{ activeStep: activeStep$ | async, sendByManual: sendByManual$ | async } as wizardData" + class="w-full overflow-auto rounded-xl bg-background-100" + *ngIf="{ + activeStep: activeStep$ | async, + sendByManual: sendByManual$ | async, + isPostfachConfigured: isPostfachConfigured$ | async + } as wizardData" > - <div class="flex-1"> - <div class="mb-4 text-base font-bold text-primary-600">Bescheid</div> - <div class="my-6" data-test-id="bescheid-status-text"> - <alfa-vorgang-detail-bescheiden-result-status - *ngIf=" - wizardData.activeStep === 1 || - wizardData.activeStep === 2 || - (wizardData.activeStep === 3 && wizardData.sendByManual) - " - data-test-id="bescheid-status" - [bescheid]="bescheid$ | async" - ></alfa-vorgang-detail-bescheiden-result-status> - </div> + <div class="p-4 text-base font-bold text-primary-600">Bescheid</div> + <div class="p-4" data-test-id="bescheid-status-text"> + <alfa-vorgang-detail-bescheiden-result-status + *ngIf=" + wizardData.activeStep === 1 || (wizardData.activeStep === 3 && wizardData.sendByManual) + " + data-test-id="bescheid-status" + [bescheid]="bescheid$ | async" + ></alfa-vorgang-detail-bescheiden-result-status> + </div> + + <div class="p-4"> + <alfa-vorgang-detail-bescheiden-result-nachricht + *ngIf=" + !wizardData.sendByManual && wizardData.activeStep === 3 && wizardData.isPostfachConfigured + " + [bescheidDocumentStateResource]="bescheidDocument$ | async" + data-test-id="bescheid-nachricht-an-antragsteller" + ></alfa-vorgang-detail-bescheiden-result-nachricht> + </div> - <div class="my-4" data-test-id="bescheid-status-dokument"> - <alfa-vorgang-detail-bescheiden-result-dokument - *ngIf=" - wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual) - " - data-test-id="bescheid-document" - [bescheidDraftStateResource]="bescheidDraftStateResource$ | async" - [bescheidDocumentFile]="bescheidDocumentFile$ | async" - (deleteFile)="deleteBescheidDocument()" - ></alfa-vorgang-detail-bescheiden-result-dokument> - </div> + <div class="p-4" data-test-id="bescheid-status-dokument"> + <alfa-vorgang-detail-bescheiden-result-dokument + *ngIf=" + wizardData.activeStep === 2 || + (wizardData.activeStep === 3 && + (wizardData.sendByManual || wizardData.isPostfachConfigured)) + " + data-test-id="bescheid-document" + [bescheidDraftStateResource]="bescheidDraftStateResource$ | async" + [uploadBescheidDocumentInProgress]="uploadBescheidDocumentInProgress$ | async" + [createBescheidDocumentInProgress]="createBescheidDocumentInProgress$ | async" + [bescheidDocumentFile]="bescheidDocumentFile$ | async" + (deleteFile)="deleteBescheidDocument()" + ></alfa-vorgang-detail-bescheiden-result-dokument> + </div> - <div class="my-4" data-test-id="bescheid-status-attachments"> - <alfa-vorgang-detail-bescheiden-result-attachments - *ngIf=" - wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual) - " - data-test-id="bescheid-attachments" - ></alfa-vorgang-detail-bescheiden-result-attachments> - </div> + <div class="p-4" data-test-id="bescheid-status-attachments"> + <alfa-vorgang-detail-bescheiden-result-attachments + *ngIf=" + wizardData.activeStep === 2 || + (wizardData.activeStep === 3 && + (wizardData.sendByManual || wizardData.isPostfachConfigured)) + " + data-test-id="bescheid-attachments" + ></alfa-vorgang-detail-bescheiden-result-attachments> </div> - <div class="flex-none"> - <div - class="flex flex-col align-bottom" - *ngIf="wizardData.sendByManual && wizardData.activeStep === 3" - > - <span>Der Bescheid muss manuell versendet werden</span> - <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource"> - <button - (click)="saveAndSend(bescheidDraftStateResource.resource)" - type="button" - class="mt-8 self-end rounded-md bg-primary-600 px-8 py-2 text-sm text-white shadow-sm hover:bg-ozgblue-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ozgblue-800" - data-test-id="save-and-send-button" - > - Antrag bescheiden und speichern - </button> - </ng-container> - </div> + + <div *ngIf="wizardData.sendByManual && wizardData.activeStep === 3"> + <span>Der Bescheid muss manuell versendet werden.</span> + + <!-- REPLACEME: Durch UI/UX Componenten ersetzen --> + <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource"> + <ozgcloud-button-with-spinner + data-test-id="save-and-send-button" + [stateResource]="saveAndSendInProgress$ | async" + text="Antrag bescheiden und speichern" + (clickEmitter)="saveAndSendManually(bescheidDraftStateResource.resource)" + ></ozgcloud-button-with-spinner> + </ng-container> + <!-- --> </div> + <ng-container + *ngIf=" + wizardData.activeStep === 3 && !wizardData.sendByManual && wizardData.isPostfachConfigured + " + > + <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource"> + <ozgcloud-button-with-spinner + data-test-id="send-button" + [stateResource]="saveAndSendInProgress$ | async" + text="Bescheid senden" + (clickEmitter)="saveAndSendWithNachricht(bescheidDraftStateResource.resource)" + ></ozgcloud-button-with-spinner> + </ng-container> + </ng-container> </section> 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 d2123e02d3d960effac6f42e7d1e5e4f140c8974..74a8ae7f0bcc486b2c72dd94c5da91c2f5fab12f 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 @@ -4,6 +4,8 @@ import { StateResource, createStateResource } from '@alfa-client/tech-shared'; import { Mock, dispatchEventFromFixture, + existsAsHtmlElement, + getElementFromFixture, mock, notExistsAsHtmlElement, } from '@alfa-client/test-utils'; @@ -18,6 +20,7 @@ import { BehaviorSubject, first, of } from 'rxjs'; import { BescheidenFormService } from '../bescheiden.formservice'; import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component'; import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component'; import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-bescheiden-result.component'; @@ -32,6 +35,8 @@ describe('VorgangDetailBescheidenResultComponent', () => { const bescheidDocument: string = getDataTestIdOf('bescheid-document'); const bescheidAttachments: string = getDataTestIdOf('bescheid-attachments'); const saveAndSendButton: string = getDataTestIdOf('save-and-send-button'); + const sendButton: string = getDataTestIdOf('send-button'); + const nachrichtAntragstellerComponent = getDataTestIdOf('bescheid-nachricht-an-antragsteller'); beforeEach(async () => { bescheidService = mock(BescheidService); @@ -46,6 +51,7 @@ describe('VorgangDetailBescheidenResultComponent', () => { MockComponent(VorgangDetailBescheidenResultDokumentComponent), MockComponent(VorgangDetailBescheidenResultAttachmentsComponent), MockComponent(OzgcloudButtonWithSpinnerComponent), + MockComponent(VorgangDetailBescheidenResultNachrichtComponent), ], providers: [ { @@ -68,6 +74,109 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(component).toBeTruthy(); }); + describe('render Nachricht component', () => { + it('should render', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).toBeInstanceOf(HTMLElement); + }); + + it.each([1, 2])('should not render in step %d', (step) => { + formService.getActiveStep.mockReturnValue(of(step)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if send by manual', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(true)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if postfach not configured', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(false)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + + describe('render send button', () => { + it('should render', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + bescheidService.getBescheidDraft.mockReturnValue( + of(createStateResource(createBescheidResource())), + ); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).toBeInstanceOf(HTMLElement); + }); + + it.each([1, 2])('should not render in step %d', (step) => { + formService.getActiveStep.mockReturnValue(of(step)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if send by manual', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(true)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if postfach not configured', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(false)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + describe('ngOnInit', () => { it('should call service to get bescheid document file', () => { component.ngOnInit(); @@ -81,6 +190,12 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(bescheidService.getBescheidDraft).toHaveBeenCalled(); }); + it('should call service to get bescheid document', () => { + component.ngOnInit(); + + expect(bescheidService.getBescheidDocument).toHaveBeenCalled(); + }); + it('should call formservice to get active step', () => { component.ngOnInit(); @@ -98,6 +213,24 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(formService.isSendByManual).toHaveBeenCalled(); }); + + it('should call service to get upload bescheid document in progress', () => { + component.ngOnInit(); + + expect(bescheidService.getUploadBescheidDocumentInProgress).toHaveBeenCalled(); + }); + + it('should call service to get create bescheid document in progress', () => { + component.ngOnInit(); + + expect(bescheidService.getCreateBescheidDocumentInProgress).toHaveBeenCalled(); + }); + + it('should should call service to check if postfach is configured', () => { + component.ngOnInit(); + + expect(bescheidService.isPostfachConfigured).toHaveBeenCalled(); + }); }); describe('deleteBescheidDocument', () => { @@ -108,7 +241,7 @@ describe('VorgangDetailBescheidenResultComponent', () => { }); }); - describe('save and send', () => { + describe('save and send manually', () => { const bescheidDraft: BescheidResource = createBescheidResource(); const bescheidStateResource: StateResource<BescheidResource> = createStateResource(bescheidDraft); @@ -119,20 +252,48 @@ describe('VorgangDetailBescheidenResultComponent', () => { component.activeStep$ = of(3); }); + it('should clear nachricht', () => { + component.doSaveAndSend = jest.fn(); + + component.saveAndSendManually(bescheidDraft); + + expect(formService.clearNachricht).toHaveBeenCalled(); + }); + it('should call component on event dispatch', () => { - component.saveAndSend = jest.fn(); + component.saveAndSendManually = jest.fn(); fixture.detectChanges(); dispatchEventFromFixture(fixture, saveAndSendButton, 'click'); - expect(component.saveAndSend).toHaveBeenCalledWith(bescheidDraft); + expect(component.saveAndSendManually).toHaveBeenCalledWith(bescheidDraft); }); it('should call do save and send', () => { component.doSaveAndSend = jest.fn(); - component.saveAndSend(bescheidDraft); + component.saveAndSendManually(bescheidDraft); + + expect(component.doSaveAndSend).toHaveBeenCalled(); + }); + }); + + describe('save and send with Nachricht', () => { + const bescheidDraft: BescheidResource = createBescheidResource(); + const bescheidStateResource: StateResource<BescheidResource> = + createStateResource(bescheidDraft); + + beforeEach(() => { + component.bescheidDraftStateResource$ = of(bescheidStateResource); + component.sendByManual$ = of(true); + component.activeStep$ = of(3); + }); + + it('should call do save and send', () => { + component.doSaveAndSend = jest.fn(); + + component.saveAndSendWithNachricht(bescheidDraft); expect(component.doSaveAndSend).toHaveBeenCalled(); }); @@ -215,6 +376,16 @@ describe('VorgangDetailBescheidenResultComponent', () => { notExistsAsHtmlElement(fixture, bescheidDocument); }); + + it('should be visible in step 3 when postfach is configured', () => { + component.sendByManual$ = of(false); + component.activeStep$ = of(3); + component.isPostfachConfigured$ = of(true); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, bescheidDocument); + }); }); describe('bescheid attachments', () => { @@ -243,6 +414,16 @@ describe('VorgangDetailBescheidenResultComponent', () => { notExistsAsHtmlElement(fixture, bescheidAttachments); }); + + it('should be visible in step 3 when postfach is configured', () => { + component.sendByManual$ = of(false); + component.activeStep$ = of(3); + component.isPostfachConfigured$ = of(true); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, bescheidAttachments); + }); }); describe('update and bescheiden', () => { 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.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts index b566e499b1ee6f592e35980d099e6518b65261f8..fdc71f20a21b61d3a14f5942f3eebca547b02214 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts @@ -1,8 +1,9 @@ import { Bescheid, BescheidResource, - BescheidSendBy, BescheidService, + DocumentResource, + UploadFileInProgress, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { @@ -33,12 +34,22 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { public bescheidDocumentFile$: Observable<StateResource<BinaryFileResource>> = of( createEmptyStateResource<BinaryFileResource>(), ); + public bescheidDocument$: Observable<StateResource<DocumentResource>> = of( + createEmptyStateResource<DocumentResource>(), + ); + public isPostfachConfigured$: Observable<boolean>; public saveAndSendInProgress$: Observable<StateResource<CommandResource>> = of( createEmptyStateResource<CommandResource>(), ); - public readonly bescheidSendBy = BescheidSendBy; + public uploadBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({ + loading: false, + }); + + public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({ + loading: false, + }); constructor( private bescheidService: BescheidService, @@ -48,6 +59,12 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { ngOnInit(): void { this.bescheidDraftStateResource$ = this.bescheidService.getBescheidDraft(); this.bescheidDocumentFile$ = this.bescheidService.getBescheidDocumentFile(); + this.uploadBescheidDocumentInProgress$ = + this.bescheidService.getUploadBescheidDocumentInProgress(); + this.createBescheidDocumentInProgress$ = + this.bescheidService.getCreateBescheidDocumentInProgress(); + this.bescheidDocument$ = this.bescheidService.getBescheidDocument(); + this.isPostfachConfigured$ = this.bescheidService.isPostfachConfigured(); this.activeStep$ = this.formService.getActiveStep(); this.bescheid$ = this.formService.getBescheidChanges(); @@ -58,7 +75,12 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { this.bescheidService.deleteBescheidDocument(); } - public saveAndSend(bescheidDraft: BescheidResource): void { + public saveAndSendManually(bescheidDraft: BescheidResource): void { + this.formService.clearNachricht(); + this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft); + } + + public saveAndSendWithNachricht(bescheidDraft: BescheidResource): void { this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft); } 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html index beceda0d3be96d70591eb81f22ae37fe787ea855..0755d974036beed033db585e4fd65985ee013ce9 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html @@ -1,9 +1,9 @@ <ng-container *ngIf="bescheidDraftStateResource.resource as bescheidDraft"> <div class="mt-4"> <ods-button - *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_BESCHEID_DOCUMENT" + *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_DOCUMENT" class="w-72" - [isLoading]="createBescheidDocumentInProgress$ | async" + [isLoading]="(createBescheidDocumentInProgress$ | async).loading" (click)="createBescheidDocument()" data-test-id="create-bescheid-document-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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts index 36b7f53498bcb23a40cbb3aecb91a618533c0f92..79731c5661bc0d85b66cb78fd6eaabdfa2c6f839 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts @@ -60,7 +60,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { describe('create bescheid document button', () => { beforeEach(() => { component.bescheidDraftStateResource = createStateResource( - createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]), + createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]), ); fixture.detectChanges(); @@ -81,7 +81,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { it('should be visible if link is present', () => { component.bescheidDraftStateResource = createStateResource( - createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]), + createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]), ); fixture.detectChanges(); 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts index d0d0173bce7b54596f033a708a0eaab4b0a1c2f9..1fba2f97430d7795157fa9d632d44acf0e7d17ac 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts @@ -1,4 +1,9 @@ -import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { + BescheidLinkRel, + BescheidResource, + BescheidService, + UploadFileInProgress, +} from '@alfa-client/bescheid-shared'; import { StateResource } from '@alfa-client/tech-shared'; import { Component, Input } from '@angular/core'; import { Observable, of } from 'rxjs'; @@ -10,7 +15,9 @@ import { Observable, of } from 'rxjs'; export class VorgangDetailBescheidenBescheidAutomatischErstellenComponent { @Input() public bescheidDraftStateResource: StateResource<BescheidResource>; - public createBescheidDocumentInProgress$: Observable<boolean> = of(false); + public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({ + loading: false, + }); public readonly bescheidLinkRel = BescheidLinkRel; 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html index 7f70f0144fdb33feb761e3b7465571e6f3b10ecd..3f8d987a08ba92b5140bba08a7f7012c1ecb9df5 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html @@ -1,7 +1,7 @@ <div [formGroup]="formService.form"> <ozgcloud-single-file-upload-editor *ngIf="bescheidDraftStateResource.resource | hasLink: bescheidLinkRel.UPLOAD_BESCHEID_FILE" - [uploadInProgress]="uploadDocumentFileInProgress$ | async" + [uploadInProgress]="(uploadDocumentFileInProgress$ | async).loading" class="w-72" attr.data-test-id="vorgang-bescheiden-upload-editor" [formControlName]="formServiceClass.FIELD_BESCHEID_DOCUMENT" 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts index 775b3923baff50eff59275b2abb6bf9cd2446ca3..5393ff9750ee988022d563db57a7b5691d4ed77f 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.ts @@ -1,4 +1,9 @@ -import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { + BescheidLinkRel, + BescheidResource, + BescheidService, + UploadFileInProgress, +} from '@alfa-client/bescheid-shared'; import { StateResource, isNotNil } from '@alfa-client/tech-shared'; import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { ResourceUri } from '@ngxp/rest'; @@ -14,7 +19,7 @@ import { BescheidenFormService } from '../../../../bescheiden.formservice'; export class VorgangDetailBescheidenDokumentHochladenComponent implements OnInit, OnDestroy { @Input() bescheidDraftStateResource: StateResource<BescheidResource>; - public uploadDocumentFileInProgress$: Observable<boolean> = of(false); + public uploadDocumentFileInProgress$: Observable<UploadFileInProgress> = of({ loading: false }); public readonly formServiceClass = BescheidenFormService; public readonly bescheidLinkRel = BescheidLinkRel; 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 e766aa38002e0187f7f03fda8841d6fc603dda4e..837545e68b34902a10953df5d1b9961e71ce504d 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 @@ -76,6 +76,7 @@ import { VorgangDetailBackButtonComponent } from './vorgang-detail-page/vorgang- import { VorgangDetailBescheidenFormErrorComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-form-error/vorgang-detail-bescheiden-form-error.component'; import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.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'; @@ -188,6 +189,7 @@ const routes: Routes = [ VorgangDetailBescheidenResultAttachmentsComponent, VorgangDetailBescheidenFormErrorComponent, VorgangDetailBescheidenBescheidVersendenComponent, + VorgangDetailBescheidenResultNachrichtComponent, ], exports: [ VorgangDetailAntragstellerComponent, diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts index 4501f9dd24a6281055e309eb04f5c211161f2e8e..41d1e94862b57a486bf7129415a25a1906781dc3 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts @@ -21,9 +21,19 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Vorgang } from '@alfa-client/vorgang-shared'; -import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; -import { getAktenzeichenText, VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN } from './vorgang-util'; +import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { Antragsteller, Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { + createAntragsteller, + createEingang, + createVorgangResource, + createVorgangWithEingangResource, +} from 'libs/vorgang-shared/test/vorgang'; +import { + VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN, + getAktenzeichenText, + getEmpfaenger, +} from './vorgang-util'; describe('Vorgang Util', () => { describe('getAktenzeichenText', () => { @@ -43,4 +53,58 @@ describe('Vorgang Util', () => { expect(result).toEqual(VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN); }); }); + + describe('getEmpfaenger', () => { + it('should return nachname only if exists', () => { + const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(antragsteller.nachname); + }); + + it('should return vorname only if exists', () => { + const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(antragsteller.vorname); + }); + + it('should return name and vorname if exists', () => { + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual( + `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`, + ); + }); + + it('should return empty string if none exists', () => { + const antragsteller: Antragsteller = { + ...createAntragsteller(), + nachname: undefined, + vorname: undefined, + }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(EMPTY_STRING); + }); + + function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource { + return { + ...createVorgangWithEingangResource(), + eingang: { ...createEingang(), antragsteller }, + }; + } + }); }); diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts index 97b7913c19a9f5b76b209c105dcb9934a797ff52..5d90f07fe9a46e9c19ab44294aab7ffb32f7138b 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts @@ -21,10 +21,23 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Vorgang } from '@alfa-client/vorgang-shared'; +import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; export const VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN = 'kein Aktenzeichen'; export function getAktenzeichenText(vorgang: Vorgang): string { return vorgang.aktenzeichen || VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN; } + +export function getEmpfaenger(vorgangWithEingangResource: VorgangWithEingangResource): string { + return `${getVorname(vorgangWithEingangResource)} ${getNachname(vorgangWithEingangResource)}`.trim(); +} + +function getVorname(vorgangWithEingangResource: VorgangWithEingangResource): string { + return vorgangWithEingangResource.eingang.antragsteller?.vorname ?? EMPTY_STRING; +} + +function getNachname(vorgangWithEingangResource: VorgangWithEingangResource): string { + return vorgangWithEingangResource.eingang.antragsteller?.nachname ?? EMPTY_STRING; +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java index 365d7e268306e05d8025a8a9e7c6937186804d53..8ebf3d388dd200bb2d9ee9a5d57f817ab4a3817a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java @@ -23,12 +23,15 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc static final String REL_UPLOAD_ATTACHMENT = "uploadAttachment"; static final String REL_ATTACHMENTS = "attachments"; static final String REL_UPDATE = "update"; - static final String REL_CREATE_BESCHEID_DOCUMENT = "createBescheidDocument"; + static final String REL_CREATE_DOCUMENT = "createDocument"; + static final String REL_CREATE_DOCUMENT_FROM_FILE = "createDocumentFromFile"; static final String REL_BESCHEID_DOCUMENT = "bescheidDocument"; static final String REL_SEND = "send"; private static final Predicate<Bescheid> HAS_ATTACHMENTS = bescheid -> !bescheid.getAttachments().isEmpty(); + private final BescheidService bescheidService; + @Override public EntityModel<Bescheid> toModel(Bescheid bescheid) { var selfLink = linkTo(methodOn(BescheidController.class).getDraft(bescheid.getVorgangId())); @@ -49,7 +52,9 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc .ifMatch(HAS_ATTACHMENTS) .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) .addLink(createCommandLink.withRel(REL_UPDATE)) - .addLink(createCommandLink.withRel(REL_CREATE_BESCHEID_DOCUMENT)) + .ifMatch(bescheidService::canCreateBescheidDocumentAutomatically) + .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT)) + .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE)) .addLink(createCommandLink.withRel(REL_SEND)) .buildModel(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java index c68d00855d06ecfe745b0d0d63f6c0435eea804d..52a882303b0466a417fa37894702a4a49bf655e8 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import de.ozgcloud.alfa.common.GrpcUtil; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; import de.ozgcloud.bescheid.GrpcBescheid; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -35,4 +36,9 @@ class BescheidRemoteService { Optional<GrpcBescheid> getBescheidFromResponse(GrpcGetBescheidDraftResponse response) { return response.hasBescheid() ? Optional.of(response.getBescheid()) : Optional.empty(); } + + public boolean canCreateBescheidDocument() { + var response = bescheidServiceStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build()); + return response.hasFeatures() && response.getFeatures().getCanCreateBescheidDocument(); + } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java index 67bef19968599583c09c5ab5ecde6b241aed3a4d..5d8bbe22a333e181203dd2b445c5d38a0f51da2a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java @@ -15,4 +15,8 @@ public class BescheidService { public Optional<Bescheid> getBescheidDraft(String vorgangId) { return remoteService.getBescheidDraft(vorgangId); } + + public boolean canCreateBescheidDocumentAutomatically() { + return remoteService.canCreateBescheidDocument(); + } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java index bcc71eaf47a9f1d83bcd198df36b3dbe908587ed..34d8fd74dc506dd00b6222584b6674ce934a6259 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryService.java @@ -1,18 +1,13 @@ package de.ozgcloud.alfa.historie; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.springframework.stereotype.Service; - import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandService; import de.ozgcloud.alfa.common.user.UserService; -import de.ozgcloud.alfa.vorgang.Eingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.ozgcloud.alfa.vorgang.ZustaendigeStelle; +import java.util.List; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor @@ -34,27 +29,24 @@ public class VorgangChangeHistoryService { Stream<VorgangChange> createStatusChangeHistory(VorgangWithEingang vorgang, List<Command> commands) { return StatusChangeHistoryBuilder.builder() .withCommands(commands) - .withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang)) + .withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID()) .build(); } Stream<VorgangChange> createAktenzeichenChangeHistory(VorgangWithEingang vorgang, List<Command> commands) { return AktenzeichenChangeHistoryBuilder.builder() .withCommands(commands) - .withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang)) + .withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID()) .build(); } Stream<VorgangChange> createAssignedUserChangeHistory(VorgangWithEingang vorgang, List<Command> commands) { return AssignedUserChangeHistoryBuilder.builder() .withCommands(commands) - .withOrganisationseinheitenID(getOrganisationseinheitenID(vorgang)) + .withOrganisationseinheitenID(vorgang.getOrganisationseinheitenID()) .withUserProfileCache(UserProfileCache.create(userService::getById)) .build(); } - String getOrganisationseinheitenID(VorgangWithEingang vorgang) { - return Optional.ofNullable(vorgang.getEingang()).map(Eingang::getZustaendigeStelle).map(ZustaendigeStelle::getOrganisationseinheitenId) - .orElse(null); - } + } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java index 68d549f5613eaba7386d048e0759e69c4a6cf41c..5c61d0f5d75baed860c3abffbc4cd793bd6509df 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingang.java @@ -23,12 +23,14 @@ */ package de.ozgcloud.alfa.vorgang; +import jakarta.annotation.Nullable; import java.time.ZonedDateTime; import com.fasterxml.jackson.annotation.JsonIgnore; import de.ozgcloud.alfa.common.LinkedUserProfileResource; import de.ozgcloud.alfa.common.user.UserId; +import java.util.Optional; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -59,4 +61,13 @@ public class VorgangWithEingang implements Vorgang { private VorgangHead header; private Eingang eingang; + + @JsonIgnore + @Nullable + public String getOrganisationseinheitenID() { + return Optional.ofNullable(getEingang()) + .map(Eingang::getZustaendigeStelle) + .map(ZustaendigeStelle::getOrganisationseinheitenId) + .orElse(null); + } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java index 78d288a3afb3324f1a9c60a9cc9ab07608f5e4df..450d840af3c37898c155029886b6241e1220f679 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java @@ -2,6 +2,7 @@ package de.ozgcloud.alfa.bescheid; import static de.ozgcloud.alfa.bescheid.BescheidModelAssembler.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.Collections; @@ -9,11 +10,12 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import org.springframework.hateoas.LinkRelation; import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.common.command.CommandController; @@ -22,8 +24,12 @@ import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; class BescheidModelAssemblerTest { @Spy + @InjectMocks private BescheidModelAssembler assembler; + @Mock + private BescheidService bescheidService; + @Nested class TestToModel { @@ -88,10 +94,29 @@ class BescheidModelAssemblerTest { } @Test - void shouldHaveCreateBescheidDocumentLink() { + void shouldHaveCreateDocumentLink() { + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + var model = callToModel(); - assertThat(model.getLink(REL_CREATE_BESCHEID_DOCUMENT)).isPresent().get().extracting(Link::getHref) + assertThat(model.getLink(REL_CREATE_DOCUMENT)).isPresent().get().extracting(Link::getHref) + .isEqualTo(createCommandLink()); + } + + @Test + void shoulNotdHaveCreateDocumentLink() { + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(false); + + var model = callToModel(); + + assertThat(model.getLink(REL_CREATE_DOCUMENT)).isEmpty(); + } + + @Test + void shouldHaveCreateDocumentFromFileLink() { + var model = callToModel(); + + assertThat(model.getLink(REL_CREATE_DOCUMENT_FROM_FILE)).isPresent().get().extracting(Link::getHref) .isEqualTo(createCommandLink()); } @@ -111,16 +136,6 @@ class BescheidModelAssemblerTest { .isEqualTo(String.format("%s/%s", DocumentController.PATH, BescheidTestFactory.BESCHEID_DOCUMENT)); } - @Test - void shouldHaveOnlyExpectedLinks() { - var model = callToModel(); - - assertThat(model.getLinks()).extracting(Link::getRel).containsExactlyInAnyOrder( - IanaLinkRelations.SELF, LinkRelation.of(REL_DELETE), LinkRelation.of(REL_UPLOAD_BESCHEID_FILE), - LinkRelation.of(REL_UPLOAD_ATTACHMENT), LinkRelation.of(REL_ATTACHMENTS), LinkRelation.of(REL_UPDATE), - LinkRelation.of(REL_CREATE_BESCHEID_DOCUMENT), LinkRelation.of(REL_BESCHEID_DOCUMENT), LinkRelation.of(REL_SEND)); - } - @Test void shouldHaveSendLink() { var model = callToModel(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java index 8c06cc6275761009a474a91a10488a3aa9ac6143..1a60e85c321546fc174228b0be968448b882e74e 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java @@ -14,6 +14,8 @@ import org.mockito.Spy; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse; import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse; @@ -119,4 +121,53 @@ class BescheidRemoteServiceTest { } } + @Nested + class TestCanCreateBescheidDocument { + + private final GrpcBescheidManagerConfigRequest request = GrpcBescheidManagerConfigRequestTestFactory.create(); + private final GrpcBescheidManagerConfigResponse respone = GrpcBescheidManagerConfigResponseTestFactory.create(); + + @BeforeEach + void setUp() { + when(bescheidServiceStub.getConfig(request)).thenReturn(respone); + } + + @Test + void shouldCallRemoteService() { + service.canCreateBescheidDocument(); + + verify(bescheidServiceStub).getConfig(request); + } + + @Test + void shouldReturnTrue() { + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isTrue(); + } + + @Test + void shouldReturnFalseIfNoFeaturesAvailable() { + when(bescheidServiceStub.getConfig(request)).thenReturn(GrpcBescheidManagerConfigResponse.newBuilder().build()); + + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isFalse(); + } + + @Test + void shouldReturnFalseIfFeatureDisabled() { + var respones = GrpcBescheidManagerConfigResponseTestFactory.createBuilder() + .setFeatures(GrpcBescheidManagerFeaturesTestFactory.createBuilder() + .setCanCreateBescheidDocument(false) + .build()) + .build(); + when(bescheidServiceStub.getConfig(request)).thenReturn(respones); + + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isFalse(); + } + } + } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java index 6241bdce4c6a7c514c9e6273a7235d11736156ba..53b89afb965f0068dc6559753069634a0bac69ee 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java @@ -7,6 +7,8 @@ import java.util.Optional; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -41,4 +43,25 @@ class BescheidServiceTest { assertThat(result).isEqualTo(remoteServiceResult); } } + + @Nested + class TestCanCreateBescheidDocumentAutomatically { + + @Test + void shouldCallRemoteService() { + service.canCreateBescheidDocumentAutomatically(); + + verify(remoteService).canCreateBescheidDocument(); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldRetrun(boolean canCreateBescheidDocument) { + when(remoteService.canCreateBescheidDocument()).thenReturn(canCreateBescheidDocument); + + var canCreateAutomatically = service.canCreateBescheidDocumentAutomatically(); + + assertThat(canCreateAutomatically).isEqualTo(canCreateBescheidDocument); + } + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b3b7518632401a74dadba71ea91a0da1b09bfd61 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; + +public class GrpcBescheidManagerConfigRequestTestFactory { + + public static GrpcBescheidManagerConfigRequest create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerConfigRequest.Builder createBuilder() { + return GrpcBescheidManagerConfigRequest.newBuilder(); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..72a9bcb5fe4267782c78acf48703c9f580e66a5c --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse; + +public class GrpcBescheidManagerConfigResponseTestFactory { + + public static GrpcBescheidManagerConfigResponse create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerConfigResponse.Builder createBuilder() { + return GrpcBescheidManagerConfigResponse.newBuilder().setFeatures(GrpcBescheidManagerFeaturesTestFactory.create()); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..fc745ca20b8507af338b860735958df1e828640a --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java @@ -0,0 +1,16 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerFeatures; + +public class GrpcBescheidManagerFeaturesTestFactory { + + public static final boolean CAN_CREATE_BESCHEID = true; + + public static GrpcBescheidManagerFeatures create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerFeatures.Builder createBuilder() { + return GrpcBescheidManagerFeatures.newBuilder().setCanCreateBescheidDocument(CAN_CREATE_BESCHEID); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java index f582a35ec8ec508c9219aa47705eed47070709a2..451b3e9b0d1fceb0cfcced85d257679f7466b837 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/historie/VorgangChangeHistoryServiceTest.java @@ -6,7 +6,6 @@ import static org.mockito.Mockito.*; import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; import java.util.function.Function; import java.util.stream.Stream; @@ -29,14 +28,13 @@ import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserProfile; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserService; -import de.ozgcloud.alfa.vorgang.EingangTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory; public class VorgangChangeHistoryServiceTest { - private static final String ORGANISATIONSEINHEITEN_ID = UUID.randomUUID().toString(); + private static final String ORGANISATIONSEINHEITEN_ID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID; private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final Command command0105 = ChangeHistoryBuilderTest.commandFinishedAt(LocalDateTime.of(2023, 5, 1, 12, 0)); @@ -122,7 +120,6 @@ public class VorgangChangeHistoryServiceTest { void init() { mockBuilderFactoryMethod(); mockBuilderWiths(); - mockGetOrganisationseinheitenID(); } private void mockBuilderFactoryMethod() { @@ -179,7 +176,6 @@ public class VorgangChangeHistoryServiceTest { void init() { mockBuilderFactoryMethod(); mockBuilderWiths(); - mockGetOrganisationseinheitenID(); } private void mockBuilderFactoryMethod() { @@ -244,7 +240,6 @@ public class VorgangChangeHistoryServiceTest { mockBuilderFactoryMethod(); mockBuilderWiths(); mockUserProfileCacheFactoryMethod(); - mockGetOrganisationseinheitenID(); } private void mockBuilderFactoryMethod() { @@ -318,37 +313,4 @@ public class VorgangChangeHistoryServiceTest { } } - @Nested - class TestGetOrganisationseinheitenID { - - @Test - void shouldReturnNullWhenEingangIsNull() { - var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(null).build(); - - var id = service.getOrganisationseinheitenID(vorgang); - - assertThat(id).isNull(); - } - - @Test - void shouldReturnNullIfZustaendigeStelleIsNull() { - var eingang = EingangTestFactory.createBuilder().zustaendigeStelle(null).build(); - var vorgang = VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build(); - - var id = service.getOrganisationseinheitenID(vorgang); - - assertThat(id).isNull(); - } - - @Test - void shouldReturnOrganisationseinheitenID() { - var id = service.getOrganisationseinheitenID(vorgang); - - assertThat(id).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); - } - } - - private void mockGetOrganisationseinheitenID() { - when(service.getOrganisationseinheitenID(vorgang)).thenReturn(ORGANISATIONSEINHEITEN_ID); - } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java index db4252d5187923d1f7b22b194767a3d04738db1c..dc82e3ab1ca130feea7c764a1685e10d5f18c7c1 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarTestFactory.java @@ -27,11 +27,11 @@ import java.time.ZonedDateTime; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.UUID; import com.thedeanda.lorem.Lorem; import com.thedeanda.lorem.LoremIpsum; +import de.ozgcloud.alfa.common.TestUtils; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -41,7 +41,7 @@ public class KommentarTestFactory { private static Lorem lorem = LoremIpsum.getInstance(); - public static final String ID = UUID.randomUUID().toString(); + public static final String ID = TestUtils.createMongoDbObjectId(); public static final long VERSION = 73; public static final String CREATED_BY = UserProfileTestFactory.ID.toString(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e08ec5e72558100a51e8ea645dabb2fb0492adb1 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangTest.java @@ -0,0 +1,66 @@ +package de.ozgcloud.alfa.vorgang; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class VorgangWithEingangTest { + + @Test + void shouldGetOrganisationseinheitWhenSet() { + VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + String organisationseinheitenID = vorgang.getOrganisationseinheitenID(); + + assertThat(organisationseinheitenID).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); + } + + @Test + void shouldNotGetOrganisationseinheitWithEingangUnset() { + VorgangWithEingang vorgang = createVorgangWithNullEingang(); + + String organisationseinheitenID = vorgang.getOrganisationseinheitenID(); + + assertThat(organisationseinheitenID).isNull(); + } + + @Test + void shouldNotGetOrganisationseinheitWithZustaendigeStelleUnset() { + VorgangWithEingang vorgang = createVorgangWithNullZustaendigeStelle(); + + String organisationseinheitenID = vorgang.getOrganisationseinheitenID(); + + assertThat(organisationseinheitenID).isNull(); + } + + @Test + void shouldNotGetOrganisationseinheitWithOrganisationseinheitUnset() { + VorgangWithEingang vorgang = createVorgangWithNullOrganisationseinheit(); + + String organisationseinheitenID = vorgang.getOrganisationseinheitenID(); + + assertThat(organisationseinheitenID).isNull(); + } + + private VorgangWithEingang createVorgangWithNullEingang() { + return createVorgangWithEingang(null); + } + + private VorgangWithEingang createVorgangWithNullZustaendigeStelle() { + Eingang eingang = EingangTestFactory.createBuilder().zustaendigeStelle(null).build(); + + return createVorgangWithEingang(eingang); + } + + private VorgangWithEingang createVorgangWithNullOrganisationseinheit() { + ZustaendigeStelle zustaendigeStelle = ZustaendigeStelle.builder().organisationseinheitenId(null).build(); + Eingang eingang = EingangTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build(); + + return createVorgangWithEingang(eingang); + } + + private VorgangWithEingang createVorgangWithEingang(Eingang eingang) { + return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build(); + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java index 146d1199194d1f86a9070058161b5d8a6127dac7..2e36dd77eb1da1e8f721b66d5e2d74c86484ee2a 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java @@ -1,5 +1,8 @@ package de.ozgcloud.alfa.kommentar; +import de.ozgcloud.alfa.common.DateConverter; +import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; +import de.ozgcloud.alfa.common.UUIDConverter; import java.util.Collections; import java.util.List; @@ -8,16 +11,27 @@ import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder; import de.ozgcloud.alfa.common.file.OzgFile; import de.xoev.xdomea.AnlageDokumentType; import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.FormatType; +import de.xoev.xdomea.HistorienProtokollInformationType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.VersionType; +import java.util.Collections; +import java.util.List; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) class DokumentTypeBuilder { static final String TYP = "Notiz"; + static final String AKTION = "CREATE_KOMMENTAR"; private Kommentar kommentar; private List<OzgFile> kommentarAttachments = Collections.emptyList(); + private String authorFullName; + private String organisationseinheitenID; public static DokumentTypeBuilder builder() { return new DokumentTypeBuilder(); @@ -33,12 +47,23 @@ class DokumentTypeBuilder { return this; } + public DokumentTypeBuilder withAuthorFullName(String authorFullName) { + this.authorFullName = authorFullName; + return this; + } + + public DokumentTypeBuilder withOrganisationseinheitenID(String organisationseinheitenID) { + this.organisationseinheitenID = organisationseinheitenID; + return this; + } + public DokumentType build() { var dokumentType = new DokumentType(); dokumentType.setIdentifikation(IdentifikationObjektTypeBuilder.builder() .withObjectID(kommentar.getId()) .build()); dokumentType.setTyp(TYP); + dokumentType.getHistorienProtokollInformation().add(createHistorie()); kommentarAttachments.stream().map(this::createAnlage).forEach(dokumentType.getAnlage()::add); return dokumentType; } @@ -47,4 +72,18 @@ class DokumentTypeBuilder { return AnlageDokumentTypeBuilder.builder().withOzgFile(ozgFile).build(); } + HistorienProtokollInformationType createHistorie() { + var historienProtokollInformationType = new HistorienProtokollInformationType(); + historienProtokollInformationType.setMetadatumName(kommentar.getText()); + historienProtokollInformationType.setAkteur(createAkteur()); + historienProtokollInformationType.setDatumUhrzeit(DateConverter.toXmlGregorianCalendar(kommentar.getCreatedAt())); + historienProtokollInformationType.setAktion(AKTION); + return historienProtokollInformationType; + } + + String createAkteur() { + return this.authorFullName + "; " + this.organisationseinheitenID; + } + + } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java index a300e4dcfd3e9d22078efb2786779af3d30427ca..1d4d9e209314cb629342e45e5c0ca18ab9e57fb1 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java @@ -1,14 +1,16 @@ package de.ozgcloud.alfa.kommentar; import java.util.List; +import java.util.stream.Stream; import org.springframework.stereotype.Service; import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.user.UserId; +import de.ozgcloud.alfa.common.user.UserService; import de.ozgcloud.alfa.kommentar.KommentarsExportData.KommentarsExportDataBuilder; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.xoev.xdomea.DokumentType; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -17,24 +19,49 @@ public class ExportKommentarService { private final KommentarService kommentarService; private final BinaryFileService binaryFileService; + private final UserService userService; public KommentarsExportData createExportData(VorgangWithEingang vorgang) { - var exportDataBuilder = KommentarsExportData.builder(); - kommentarService.findByVorgangId(vorgang.getId()) - .forEach(kommentar -> addKommentarToBuilder(kommentar, exportDataBuilder)); - return exportDataBuilder.build(); + KommentarsExportDataBuilder builder = KommentarsExportData.builder(); + getKommentare(vorgang) + .map(kommentar -> createKommentarExportData(vorgang, kommentar)) + .forEach(kommentarExportData -> addKommentarExportData(kommentarExportData, builder)); + return builder.build(); } - void addKommentarToBuilder(Kommentar kommentar, KommentarsExportDataBuilder builder) { - var attachments = binaryFileService.getFiles(kommentar.getAttachments()).toList(); - builder.dokumentType(buildDokumentType(kommentar, attachments)); - builder.attachments(attachments); + KommentarExportData createKommentarExportData(VorgangWithEingang vorgang, Kommentar kommentar){ + return new KommentarExportData(vorgang.getOrganisationseinheitenID(), kommentar); } - DokumentType buildDokumentType(Kommentar kommentar, List<OzgFile> attachments) { - return DokumentTypeBuilder.builder() + void addKommentarExportData(KommentarExportData kommentarExportData, KommentarsExportDataBuilder builder) { + List<OzgFile> attachments = getAttachments(kommentarExportData.kommentar); + + var dokumentType = DokumentTypeBuilder.builder() .withKommentarAttachments(attachments) - .withKommentar(kommentar) + .withKommentar(kommentarExportData.kommentar) + .withOrganisationseinheitenID(kommentarExportData.organisationsEinheitenID) + .withAuthorFullName(getAuthorFullName(kommentarExportData.kommentar)) .build(); + + builder.dokumentType(dokumentType); + builder.attachments(attachments); + } + + List<OzgFile> getAttachments(Kommentar kommentar) { + return binaryFileService.getFiles(kommentar.getAttachments()).toList(); + } + + String getAuthorFullName(Kommentar kommentar) { + return userService.getById(UserId.from(kommentar.getCreatedBy())).getFullName(); + } + + Stream<Kommentar> getKommentare(VorgangWithEingang vorgang) { + return kommentarService.findByVorgangId(vorgang.getId()); + } + + record KommentarExportData( + String organisationsEinheitenID, + Kommentar kommentar + ) { } } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java similarity index 87% rename from alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java rename to alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java index ddf72dde4fcb9a47ddd3e1275794826552a6e2ac..425a9731e62f3055a703ef2aecd623ba5603ea83 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/HistorienProtokollInformationTypeTestFactory.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/HistorienProtokollInformationTypeTestFactory.java @@ -1,4 +1,4 @@ -package de.ozgcloud.alfa.export; +package de.ozgcloud.alfa.common; import de.xoev.xdomea.HistorienProtokollInformationType; diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java index 567c55f91a45a5929001e4492dad0fe6951732d9..60f57250052a7d1f28655002f3fff6324fbe9f93 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java @@ -27,6 +27,7 @@ import org.mockito.MockedStatic; import org.mockito.Spy; import de.ozgcloud.alfa.common.ExportFilenameGenerator; +import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.common.TestUtils; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java index d7fa4e55e249cc9e0539588c739baf8da631909c..f7fda37ca90273d24630868b4b1a940ec32b9e31 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java @@ -6,6 +6,7 @@ import java.util.List; import org.junit.jupiter.api.Test; +import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.vorgang.VorgangTypeTestFactory; import de.xoev.xdomea.DokumentType; import de.xoev.xdomea.HistorienProtokollInformationType; diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java index 3482a58b25c0efd0a7f43d438d137555cbae9a76..60f66c5e2cdfff4024892a451d0aaa48abd73b4f 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/historie/ExportHistorieServiceTest.java @@ -18,7 +18,7 @@ import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.alfa.common.DateConverter; import de.ozgcloud.alfa.common.command.CommandOrder; -import de.ozgcloud.alfa.export.HistorienProtokollInformationTypeTestFactory; +import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; import de.xoev.xdomea.HistorienProtokollInformationType; diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java index 9f05b1bc42cf44880d831bf8915a4ab513bc601b..e09747b371014cfb5b9b776f8fed4a533649421e 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java @@ -5,6 +5,8 @@ import static org.mockito.Mockito.*; import java.util.List; +import javax.xml.datatype.XMLGregorianCalendar; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -13,13 +15,21 @@ import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Spy; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.alfa.common.AnlageDokumentTypeBuilder; import de.ozgcloud.alfa.common.AnlageDokumentTypeTestFactory; +import de.ozgcloud.alfa.common.DateConverter; +import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.export.IdentifikationObjektTypeTestFactory; +import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory; import de.xoev.xdomea.AnlageDokumentType; +import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.HistorienProtokollInformationType; import de.xoev.xdomea.IdentifikationObjektType; class DokumentTypeBuilderTest { @@ -38,12 +48,15 @@ class DokumentTypeBuilderTest { private final OzgFile ozgFile = OzgFileTestFactory.create(); private final AnlageDokumentType anlageDokumentType = AnlageDokumentTypeTestFactory.create(); + private final HistorienProtokollInformationType historienProtokollInformationType = HistorienProtokollInformationTypeTestFactory.create(); + @BeforeEach void setUp() { identifikationObjektTypeBuilderMockedStatic = mockStatic(IdentifikationObjektTypeBuilder.class); identifikationObjektTypeBuilderMockedStatic.when(IdentifikationObjektTypeBuilder::builder).thenReturn(identifikationObjektTypeBuilder); when(identifikationObjektTypeBuilder.withObjectID(KommentarTestFactory.ID)).thenReturn(identifikationObjektTypeBuilder); when(identifikationObjektTypeBuilder.build()).thenReturn(identifikationObjektType); + doReturn(historienProtokollInformationType).when(builder).createHistorie(); } @AfterEach @@ -105,6 +118,28 @@ class DokumentTypeBuilderTest { assertThat(dokumentType.getAnlage()).contains(anlageDokumentType); } } + + @Test + void shouldHaveHistorienProtokoll() { + DokumentType dokumentType = builder.build(); + + assertThat(dokumentType.getHistorienProtokollInformation().get(0)).isEqualTo(historienProtokollInformationType); + } + + @Test + void shouldHaveOneHistorienProtokoll() { + DokumentType dokumentType = builder.build(); + + assertThat(dokumentType.getHistorienProtokollInformation()).size().isEqualTo(1); + } + + @Test + void shouldCreateHistorienProtokoll() { + builder.build(); + + verify(builder).createHistorie(); + } + } @Nested @@ -156,4 +191,88 @@ class DokumentTypeBuilderTest { } } + @Nested + class TestWithOrganisationseinheitenID { + @Test + void shouldReturnBuilder() { + var result = builder.withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); + + assertThat(result).isNotNull(); + } + } + + @Nested + class TestWithAuthorFullName { + @Test + void shouldReturnBuilder() { + var result = builder.withAuthorFullName(UserProfileTestFactory.FULLNAME); + + assertThat(result).isNotNull(); + } + } + + @Nested + class TestCreateHistorie { + + Kommentar kommentar = KommentarTestFactory.create(); + + @BeforeEach + void setupBuilder() { + builder.withKommentar(kommentar); + } + + @Test + void shouldHaveMetadatumName() { + var historie = builder.createHistorie(); + + assertThat(historie.getMetadatumName()).isEqualTo(KommentarTestFactory.TEXT); + } + + @Test + void shouldHaveAkteur() { + String expectedAkteurName = LoremIpsum.getInstance().getWords(5); + doReturn(expectedAkteurName).when(builder).createAkteur(); + + var historie = builder.createHistorie(); + + assertThat(historie.getAkteur()).isEqualTo(expectedAkteurName); + } + + @Test + void shouldHaveDatumUhrzeit() { + var historie = builder.createHistorie(); + + assertThat(historie.getDatumUhrzeit()).isEqualTo(createExpectedDatumUhrzeit()); + } + + @Test + void shouldHaveAktion() { + var historie = builder.createHistorie(); + + assertThat(historie).hasFieldOrPropertyWithValue("aktion", DokumentTypeBuilder.AKTION); + } + + private XMLGregorianCalendar createExpectedDatumUhrzeit() { + return DateConverter.toXmlGregorianCalendar(kommentar.getCreatedAt()); + } + } + + @Nested + class TestCreateAkteur { + @Test + void shouldCreateName() { + builder.withAuthorFullName(UserProfileTestFactory.FULLNAME); + builder.withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); + + String akteur = builder.createAkteur(); + + assertThat(akteur).isEqualTo(createExpectedAkteurName()); + } + + private String createExpectedAkteurName() { + return UserProfileTestFactory.FULLNAME + "; " + ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID; + } + + } + } \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java index 249e6637f797caf542e5576fe7978a894db562d9..66d5b18b2bb00cf80d1747fc2fa4804fba28dd48 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java @@ -1,6 +1,5 @@ package de.ozgcloud.alfa.kommentar; -import static de.ozgcloud.alfa.common.TestUtils.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -18,10 +17,15 @@ import org.mockito.Spy; import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.user.UserId; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; +import de.ozgcloud.alfa.common.user.UserService; import de.ozgcloud.alfa.export.DokumentTypeTestFactory; import de.ozgcloud.alfa.kommentar.KommentarsExportData.KommentarsExportDataBuilder; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory; import de.xoev.xdomea.DokumentType; class ExportKommentarServiceTest { @@ -35,12 +39,20 @@ class ExportKommentarServiceTest { @Mock private BinaryFileService binaryFileService; + @Mock + private UserService userService; + + private final Kommentar kommentar = KommentarTestFactory.create(); + @Nested class TestCreateExportData { - private final Kommentar kommentar = KommentarTestFactory.create(); + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final KommentarsExportData exportData = KommentarsExportDataTestFactory.create(); + private final ExportKommentarService.KommentarExportData kommentarExportData = new ExportKommentarService.KommentarExportData( + ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID, kommentar); + private MockedStatic<KommentarsExportData> kommentarsExportDataMockedStatic; @Mock private KommentarsExportDataBuilder exportDataBuilder; @@ -49,8 +61,9 @@ class ExportKommentarServiceTest { void setUp() { kommentarsExportDataMockedStatic = mockStatic(KommentarsExportData.class); kommentarsExportDataMockedStatic.when(KommentarsExportData::builder).thenReturn(exportDataBuilder); - when(kommentarService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(kommentar)); - doNothing().when(service).addKommentarToBuilder(kommentar, exportDataBuilder); + when(service.getKommentare(vorgang)).thenReturn(Stream.of(kommentar)); + when(service.createKommentarExportData(vorgang, kommentar)).thenReturn(kommentarExportData); + doNothing().when(service).addKommentarExportData(kommentarExportData, exportDataBuilder); when(exportDataBuilder.build()).thenReturn(exportData); } @@ -60,17 +73,10 @@ class ExportKommentarServiceTest { } @Test - void shouldLoadKommentare() { - callService(); - - verify(kommentarService).findByVorgangId(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldAddKommentarToBuilder() { + void shouldAddKommentarExportData() { callService(); - verify(service).addKommentarToBuilder(kommentar, exportDataBuilder); + verify(service).addKommentarExportData(eq(kommentarExportData), eq(exportDataBuilder)); } @Test @@ -88,31 +94,46 @@ class ExportKommentarServiceTest { } private KommentarsExportData callService() { - return service.createExportData(VorgangWithEingangTestFactory.create()); + return service.createExportData(vorgang); } } @Nested - class TestAddKommentarToBuilder { + class TestAddKommentarExportData { - private final Kommentar kommentar = KommentarTestFactory.create(); + private final String authorFullName = UserProfileTestFactory.FULLNAME; private final List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE); private final DokumentType dokumentType = DokumentTypeTestFactory.create(); - + private final String organisationsEinheitenID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID; + private final ExportKommentarService.KommentarExportData kommentarExportData = new ExportKommentarService.KommentarExportData( + organisationsEinheitenID, + kommentar + ); + private MockedStatic<DokumentTypeBuilder> dokumentTypeBuilderMockedStatic; + @Mock + private DokumentTypeBuilder dokumentTypeBuilder; @Mock private KommentarsExportDataBuilder exportDataBuilder; @BeforeEach void setUp() { - mockStreamToList(attachments, stream -> when(binaryFileService.getFiles(KommentarTestFactory.ATTACHMENTS)).thenReturn(stream)); - doReturn(dokumentType).when(service).buildDokumentType(kommentar, attachments); - } + doReturn(attachments).when(service).getAttachments(kommentar); + doReturn(authorFullName).when(service).getAuthorFullName(kommentar); - @Test - void shouldLoadOzgFilesForKommentareAttachments() { - callService(); + dokumentTypeBuilderMockedStatic = mockStatic(DokumentTypeBuilder.class); + dokumentTypeBuilderMockedStatic.when(() -> DokumentTypeBuilder.builder()).thenReturn(dokumentTypeBuilder); + + doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withKommentarAttachments(attachments); + doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withKommentar(kommentar); + doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder) + .withOrganisationseinheitenID(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); + doReturn(dokumentTypeBuilder).when(dokumentTypeBuilder).withAuthorFullName(authorFullName); + doReturn(dokumentType).when(dokumentTypeBuilder).build(); + } - verify(binaryFileService).getFiles(KommentarTestFactory.ATTACHMENTS); + @AfterEach + void tearDown() { + dokumentTypeBuilderMockedStatic.close(); } @Test @@ -129,58 +150,110 @@ class ExportKommentarServiceTest { verify(exportDataBuilder).attachments(attachments); } + @Test + void shouldSetOzgFile() { + callService(); + + verify(dokumentTypeBuilder).withKommentarAttachments(attachments); + } + + @Test + void shouldSetKommentar() { + callService(); + + verify(dokumentTypeBuilder).withKommentar(kommentar); + } + + @Test + void shouldSetOrganisationseinheitID() { + callService(); + + verify(dokumentTypeBuilder).withOrganisationseinheitenID(organisationsEinheitenID); + } + + @Test + void shouldReturnAuthorFullName() { + callService(); + + verify(dokumentTypeBuilder).withAuthorFullName(authorFullName); + } + + @Test + void shouldBuildDokumentType() { + callService(); + + verify(dokumentTypeBuilder).build(); + } + private void callService() { - service.addKommentarToBuilder(kommentar, exportDataBuilder); + service.addKommentarExportData(kommentarExportData, exportDataBuilder); } } @Nested - class TestbBuildDokumentType { + class TestGetAttachments { - private final Kommentar kommentar = KommentarTestFactory.create(); - private final List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE); + @Test + void shouldGetFiles() { + service.getAttachments(kommentar); - private MockedStatic<DokumentTypeBuilder> dokumentTypeBuilderMockedStatic; - @Mock - private DokumentTypeBuilder dokumentTypeBuilder; + verify(binaryFileService).getFiles(KommentarTestFactory.ATTACHMENTS); + } - @BeforeEach - void setUp() { - dokumentTypeBuilderMockedStatic = mockStatic(DokumentTypeBuilder.class); - dokumentTypeBuilderMockedStatic.when(DokumentTypeBuilder::builder).thenReturn(dokumentTypeBuilder); - when(dokumentTypeBuilder.withKommentarAttachments(attachments)).thenReturn(dokumentTypeBuilder); - when(dokumentTypeBuilder.withKommentar(kommentar)).thenReturn(dokumentTypeBuilder); - when(dokumentTypeBuilder.build()).thenReturn(KommentarsExportDataTestFactory.DOKUMENT_TYPE); + @Test + void shouldReturnAttachments() { + List<OzgFile> attachments = List.of(KommentarsExportDataTestFactory.OZG_FILE); + when(binaryFileService.getFiles(KommentarTestFactory.ATTACHMENTS)).thenReturn(attachments.stream()); + + var result = service.getAttachments(kommentar); + + assertThat(result).isEqualTo(attachments); } + } - @AfterEach - void tearDown() { - dokumentTypeBuilderMockedStatic.close(); + @Nested + class TestGetAuthorFullName { + + @BeforeEach + void init() { + when(userService.getById(UserProfileTestFactory.ID)).thenReturn(UserProfileTestFactory.create()); } @Test - void shouldSetOzgFile() { - callService(); + void shouldGetUser() { + service.getAuthorFullName(KommentarTestFactory.create()); - verify(dokumentTypeBuilder).withKommentarAttachments(attachments); + verify(userService).getById(eq(UserId.from(KommentarTestFactory.CREATED_BY))); } @Test - void shouldSetKommentar() { - callService(); + void shouldReturnAuthorsFullName() { + var authorFullName = service.getAuthorFullName(KommentarTestFactory.create()); - verify(dokumentTypeBuilder).withKommentar(kommentar); + assertThat(authorFullName).isEqualTo(UserProfileTestFactory.FULLNAME); } + } + + @Nested + class TestGetKommentare { + + private VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); @Test - void shouldBuildDokumentType() { - callService(); + void shouldFindKommentareByVorgang() { + service.getKommentare(vorgang); - verify(dokumentTypeBuilder).build(); + verify(kommentarService).findByVorgangId(VorgangHeaderTestFactory.ID); } - private void callService() { - service.buildDokumentType(kommentar, attachments); + @Test + void shouldReturnKommentare() { + when(kommentarService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(kommentar)); + + var result = service.getKommentare(vorgang); + + assertThat(result).containsExactly(kommentar); } } + } \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java index 0cce8df618915d5214ef4543103b2cbb8cc28f3f..92f88ef542e125d0c0054564bfca590d0b0d5b32 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/postfach/DokumentTypeBuilderTest.java @@ -19,13 +19,13 @@ import org.mockito.Spy; import de.ozgcloud.alfa.common.AnlageDokumentTypeBuilder; import de.ozgcloud.alfa.common.AnlageDokumentTypeTestFactory; import de.ozgcloud.alfa.common.DateConverter; +import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; import de.ozgcloud.alfa.common.user.UserProfile; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; -import de.ozgcloud.alfa.export.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.export.IdentifikationObjektTypeTestFactory; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; import de.ozgcloud.alfa.vorgang.ZustaendigeStelleTestFactory; diff --git a/pom.xml b/pom.xml index b061f02e10eb46999380c84b53b3fcc1aedeb8ba..7986fc9ca35ec07cbd7a20e207f108f2cec4274e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <vorgang-manager.version>2.6.0</vorgang-manager.version> + <vorgang-manager.version>2.7.0-SNAPSHOT</vorgang-manager.version> <ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version> <user-manager.version>2.2.0</user-manager.version> diff --git a/src/main/helm/templates/keycloak_crd.yaml b/src/main/helm/templates/keycloak_crd.yaml index b439bc8a6227a7d42b950618ed3548b0f37afd7b..9d55120f30d540c75bb0430a1e24cca8ffb26228 100644 --- a/src/main/helm/templates/keycloak_crd.yaml +++ b/src/main/helm/templates/keycloak_crd.yaml @@ -6,9 +6,14 @@ metadata: namespace: {{ include "app.namespace" . }} spec: keep_after_delete: {{ (.Values.sso).keep_after_delete | default false }} - displayName: {{ include "app.ssoRealmDisplayName" . }} - {{- with .Values.smtpServer }} + displayName: {{ include "app.ssoRealmDisplayName" . }} + {{- with ((.Values.sso).keycloak_realm).roles }} + realmRoles: +{{ toYaml . | indent 4}} + {{- end }} + {{- with ((.Values.sso).keycloak_realm).smtpServer }} smtpServer: -{{ toYaml . | indent 4 }} +{{ toYaml . | indent 4}} {{- end }} -{{- end }} \ No newline at end of file +{{- end }} + diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index 6c2e839f4345272a03c3290f870ed91e72d7f153..0e84c312bbfbcf0e243f8b32f2da91f815f353fe 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -32,6 +32,7 @@ replicaCount: 2 # [default: 2] usermanagerName: user-manager + # env: # overrideSpringProfiles: "oc,prod" # customList: # add name value pair for additional environments @@ -60,3 +61,5 @@ usermanagerName: user-manager # bundesland: sh # bezeichner: kiel # environment: dev + + diff --git a/src/test/helm/keycloak_crd_test.yaml b/src/test/helm/keycloak_crd_test.yaml index ffe8329acfa1adf3c622f6e459009a061868d1a2..f3eb4d388fe05c8ca0a4de12eadcd72c621875d2 100644 --- a/src/test/helm/keycloak_crd_test.yaml +++ b/src/test/helm/keycloak_crd_test.yaml @@ -80,15 +80,17 @@ tests: - it: should have smtp server Values set: - smtpServer: - user: user0 - from: user0@test.de - password: psw - fromDisplayName: displayed name - starttls: true - auth: true - port: 587 - host: host0 + sso: + keycloak_realm: + smtpServer: + user: user0 + from: user0@test.de + password: psw + fromDisplayName: displayed name + starttls: true + auth: true + port: 587 + host: host0 asserts: - equal: path: spec.smtpServer.host @@ -114,4 +116,24 @@ tests: - equal: path: spec.smtpServer.fromDisplayName value: displayed name - \ No newline at end of file + + - it: should create realm roles if set + set: + sso: + keycloak_realm: + roles: + - name: role1 + - name: role0 + asserts: + - contains: + path: spec.realmRoles + content: + name: role0 + - contains: + path: spec.realmRoles + content: + name: role1 + - it: should not create realm roles by default + asserts: + - isNull: + path: spec.realmRoles \ No newline at end of file