diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts index 0507e30112e6638ca225665737c64002a6ec99f0..e6a92b958deb0a0f2947b27bbb14283d2bee379d 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-historie.cy.ts @@ -111,6 +111,8 @@ describe('Bescheid History', () => { uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID); notExist(bescheidWizard.getAttachmentUploadSpinner()); bescheidWizard.getWeiterButton().click(); + waitForSpinnerToDisappear(); + bescheidWizard.getSaveButton().click(); bescheidWizard.getConfirmAndSaveButton().click(); waitForSpinnerToDisappear(); @@ -144,6 +146,8 @@ describe('Bescheid History', () => { uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID); notExist(bescheidWizard.getBescheidUploadSpinner()); bescheidWizard.getWeiterButton().click(); + waitForSpinnerToDisappear(); + bescheidWizard.getSaveButton().click(); bescheidWizard.getConfirmAndSaveButton().click(); waitForSpinnerToDisappear(); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts index 6e602187c7712d336ea0cc1532cab9cab587bd52..a6d7e8cc4795a1794745211f20c99a6f4a7e213e 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-info-anzeigen.cy.ts @@ -28,36 +28,15 @@ import { VorgangBescheidWizardE2EComponent } from 'apps/alfa-e2e/src/components/ import { VorgangBescheideE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-bescheide.e2e.component'; import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; import { VorgangSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-subnavigation'; -import { - VorgangE2E, - VorgangStatusE2E, - vorgangStatusLabelE2E, -} from 'apps/alfa-e2e/src/model/vorgang'; -import { - TEST_FILE_BESCHEID_ANHANG_VALID, - TEST_FILE_BESCHEID_VALID, -} from 'apps/alfa-e2e/src/support/data.util'; +import { VorgangE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from 'apps/alfa-e2e/src/model/vorgang'; +import { TEST_FILE_BESCHEID_ANHANG_VALID, TEST_FILE_BESCHEID_VALID } from 'apps/alfa-e2e/src/support/data.util'; import { getAdjustedDateGerman } from 'apps/alfa-e2e/src/support/tech.util'; import 'cypress-real-events/support'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { - countDownloadFiles, - deleteDownloadFolder, - dropCollections, - readFileFromDownloads, -} from '../../../support/cypress-helper'; -import { - contains, - enterWith, - exist, - haveLength, - haveText, - notBeVisible, - notExist, - visible, -} from '../../../support/cypress.util'; +import { countDownloadFiles, deleteDownloadFolder, dropCollections, readFileFromDownloads, } from '../../../support/cypress-helper'; +import { contains, enterWith, exist, haveLength, haveText, notBeVisible, notExist, visible } from '../../../support/cypress.util'; import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; @@ -79,11 +58,9 @@ describe('Bescheid Info anzeigen', () => { status: VorgangStatusE2E.IN_BEARBEITUNG, }; - const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = - vorgangPage.getFormularButtons(); + const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); - const vorgangSubnavigationButtons: VorgangSubnavigationE2EComponent = - vorgangPage.getSubnavigation(); + const vorgangSubnavigationButtons: VorgangSubnavigationE2EComponent = vorgangPage.getSubnavigation(); const bescheide: VorgangBescheideE2EComponent = vorgangPage.getBescheide(); @@ -129,10 +106,7 @@ describe('Bescheid Info anzeigen', () => { }); it('should show status In Bearbeitung', () => { - haveText( - vorgangPage.getVorgangDetailHeader().getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG], - ); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }); it('should show Bescheid as Entwurf with abgelehnt status and date yesterday', () => { @@ -149,6 +123,8 @@ describe('Bescheid Info anzeigen', () => { describe('should show complete info after saving Bescheid', () => { it('should set date to two days before and continue to step 2', () => { vorgangFormularButtons.getBescheidenButton().click(); + waitForSpinnerToDisappear(); + enterWith(bescheidWizard.getDateInput(), getAdjustedDateGerman(-2)); bescheidWizard.getWeiterButton().click(); bescheidWizard.isBescheidDocumentsStep(); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts index d2e2df9695234a26ff907b7cdde54563df9ca977..e6c7a90ef2a6e1f91f94d7ef31b83235732aca8c 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts @@ -86,6 +86,8 @@ describe('Bescheid speichern', () => { uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID); notExist(bescheidWizard.getAttachmentUploadSpinner()); bescheidWizard.getWeiterButton().click(); + waitForSpinnerToDisappear(); + bescheidWizard.getSaveButton().click(); contains(bescheidWizard.getStatusText(), abgelehntText + ' ' + getAdjustedDateGerman(-1)); diff --git a/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.spec.ts b/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.spec.ts index 2125d0b8e171796f264901d4b22e40c269d0cc7d..86c5f0caee0f27416b51343699e465ec2eb4ef47 100644 --- a/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.spec.ts +++ b/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.spec.ts @@ -415,41 +415,41 @@ describe('BescheidFormService', () => { }); describe('patchValues', () => { + const sendBy: BescheidSendBy = BescheidSendBy.NACHRICHT; let bescheidResource: BescheidResource; let patch: jest.Mock; beforeEach(() => { bescheidResource = createBescheidResource(); patch = service.patch = jest.fn(); + service._evaluateSendBy = jest.fn().mockReturnValue(sendBy); }); it('should patch', () => { + const sendBy: BescheidSendBy = BescheidSendBy.NACHRICHT; service.patchValues(bescheidResource); expect(patch).toHaveBeenCalledWith({ [BescheidFormService.FIELD_BESCHIEDEN_AM]: bescheidResource.beschiedenAm, [BescheidFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), [BescheidFormService.FIELD_BESCHEID_DOCUMENT]: null, - [BescheidFormService.FIELD_SEND_BY]: String(bescheidResource.sendBy), + [BescheidFormService.FIELD_SEND_BY]: String(sendBy), [BescheidFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, [BescheidFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtText, }); }); - it('should patch sendBy to default', () => { - service.patchValues({ - ...bescheidResource, - sendBy: undefined, - }); + it('should set send by', () => { + const sendBy: BescheidSendBy = BescheidSendBy.NACHRICHT; + service.patchValues(bescheidResource); - expect(patch).toHaveBeenCalledWith({ - [BescheidFormService.FIELD_BESCHIEDEN_AM]: bescheidResource.beschiedenAm, - [BescheidFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), - [BescheidFormService.FIELD_SEND_BY]: BescheidSendBy.NACHRICHT, - [BescheidFormService.FIELD_BESCHEID_DOCUMENT]: null, - [BescheidFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, - [BescheidFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtText, - }); + expect(bescheidService.setSendBy).toHaveBeenCalledWith(sendBy); + }); + + it('should evaluate send by', () => { + service.patchValues(bescheidResource); + + expect(service._evaluateSendBy).toHaveBeenCalledWith(bescheidResource); }); it('should patch bescheid document uri', () => { @@ -465,7 +465,7 @@ describe('BescheidFormService', () => { expect(patch).toHaveBeenCalledWith({ [BescheidFormService.FIELD_BESCHIEDEN_AM]: bescheidResource.beschiedenAm, [BescheidFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), - [BescheidFormService.FIELD_SEND_BY]: BescheidSendBy.NACHRICHT, + [BescheidFormService.FIELD_SEND_BY]: sendBy, [BescheidFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, [BescheidFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, [BescheidFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtText, @@ -479,6 +479,44 @@ describe('BescheidFormService', () => { }); }); + describe('_evaluateSendBy', () => { + it('should return MANUAL on MANUAL', () => { + const sendBy: BescheidSendBy = service._evaluateSendBy({ + ...createBescheidResource([BescheidLinkRel.BESCHEIDEN]), + sendBy: BescheidSendBy.MANUAL, + }); + + expect(sendBy).toEqual(BescheidSendBy.MANUAL); + }); + + it('should return MANUAL on NACHRICHT and missing link', () => { + const sendBy: BescheidSendBy = service._evaluateSendBy({ + ...createBescheidResource([BescheidLinkRel.BESCHEIDEN]), + sendBy: BescheidSendBy.NACHRICHT, + }); + + expect(sendBy).toEqual(BescheidSendBy.MANUAL); + }); + + it('should return NACHRICHT', () => { + const sendBy: BescheidSendBy = service._evaluateSendBy({ + ...createBescheidResource([BescheidLinkRel.BESCHEIDEN_UND_SENDEN]), + sendBy: BescheidSendBy.NACHRICHT, + }); + + expect(sendBy).toEqual(BescheidSendBy.NACHRICHT); + }); + + it('should return MANUAL', () => { + const sendBy: BescheidSendBy = service._evaluateSendBy({ + ...createBescheidResource([BescheidLinkRel.BESCHEIDEN_UND_SENDEN]), + sendBy: BescheidSendBy.MANUAL, + }); + + expect(sendBy).toEqual(BescheidSendBy.MANUAL); + }); + }); + describe('getBescheidFormValueChanges', () => { const bescheid: Bescheid = createBescheid(); diff --git a/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.ts b/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.ts index 4e650ff9f6660e2e987ee53979858474096cafe2..eb96bb9d90af5f6729a3f251ea01bc2e91c58eb7 100644 --- a/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.ts +++ b/alfa-client/libs/bescheid/src/lib/bescheid-wizard-container/bescheid.formservice.ts @@ -21,21 +21,14 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { - Bescheid, - BescheidLinkRel, - BescheidResource, - BescheidSendBy, - BescheidWizardStep, - Wizard, -} from '@alfa-client/bescheid-shared'; +import { Bescheid, BescheidLinkRel, BescheidResource, BescheidSendBy, BescheidWizardStep, Wizard, } from '@alfa-client/bescheid-shared'; import { CommandResource, switchMapCommandSuccessfullyDone } from '@alfa-client/command-shared'; import { AbstractFormService, convertToBoolean, formatForDatabase, isNotNil, StateResource } from '@alfa-client/tech-shared'; import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { Injectable } from '@angular/core'; import { FormControl, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { getUrl, hasLink, ResourceUri } from '@ngxp/rest'; -import { isNil, isUndefined } from 'lodash-es'; +import { isNil } from 'lodash-es'; import { first, Observable, startWith, switchMap } from 'rxjs'; import { BescheidService2 } from '../../../../bescheid-shared/src/lib/bescheid2.service'; @@ -118,12 +111,13 @@ export class BescheidFormService extends AbstractFormService<CommandResource> { public patchValues(bescheidResource: BescheidResource): void { this.bescheidResource = bescheidResource; const bescheidDocumentUri: ResourceUri = this.getBescheidDocumentUri(bescheidResource); + const sendBy: BescheidSendBy = this._evaluateSendBy(bescheidResource); + this.bescheidService.setSendBy(sendBy); this.patch({ [BescheidFormService.FIELD_BESCHIEDEN_AM]: bescheidResource.beschiedenAm, [BescheidFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), [BescheidFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, - [BescheidFormService.FIELD_SEND_BY]: - isUndefined(bescheidResource.sendBy) ? BescheidSendBy.NACHRICHT : bescheidResource.sendBy, + [BescheidFormService.FIELD_SEND_BY]: sendBy, [BescheidFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, [BescheidFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtText, }); @@ -142,6 +136,16 @@ export class BescheidFormService extends AbstractFormService<CommandResource> { return null; } + _evaluateSendBy(bescheidResource: BescheidResource): BescheidSendBy { + if ( + bescheidResource.sendBy === BescheidSendBy.NACHRICHT && + hasLink(bescheidResource, BescheidLinkRel.BESCHEIDEN_UND_SENDEN) + ) { + return BescheidSendBy.NACHRICHT; + } + return BescheidSendBy.MANUAL; + } + public getBescheidFormValueChanges(): Observable<Bescheid> { return this.form.valueChanges.pipe(startWith(this.getBescheidFormValue())); } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts index 87869c5c4e0aa1dff4a3050b95ed26abd476c0d6..5bf83514f4fdbe127b04b8db9caf828408cdfdc1 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts @@ -82,12 +82,6 @@ describe('ResourceService', () => { isInvalidResourceCombinationSpy = jest.spyOn(ResourceUtil, 'isInvalidResourceCombination').mockReturnValue(true); }); - it('should have debounce', () => { - service.get().subscribe(); - - expect(service.handleResourceChanges).not.toHaveBeenCalled(); - }); - it('should handle config resource changed', fakeAsync(() => { service.get().subscribe(); tick(50); diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts index 1953e85ff4691dec3b95771a73f1bc1c7283efd1..b71624d87bffb0a0169167e60aba0c6be0fce2a1 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts @@ -24,35 +24,14 @@ import { HttpErrorResponse } from '@angular/common/http'; import { getUrl, hasLink, Resource, ResourceUri } from '@ngxp/rest'; import { isEqual, isNull } from 'lodash-es'; -import { - BehaviorSubject, - catchError, - combineLatest, - debounceTime, - filter, - first, - map, - Observable, - of, - startWith, - tap, - throwError, -} from 'rxjs'; +import { BehaviorSubject, catchError, combineLatest, filter, first, map, Observable, of, startWith, tap, throwError } from 'rxjs'; import { isUnprocessableEntity } from '../http.util'; import { HttpError } from '../tech.model'; import { isNotNull } from '../tech.util'; import { ResourceServiceConfig } from './resource.model'; import { ResourceRepository } from './resource.repository'; import { mapToFirst, mapToResource } from './resource.rxjs.operator'; -import { - createEmptyStateResource, - createErrorStateResource, - createStateResource, - isInvalidResourceCombination, - isLoadingRequired, - isStateResoureStable, - StateResource, -} from './resource.util'; +import { createEmptyStateResource, createErrorStateResource, createStateResource, isInvalidResourceCombination, isLoadingRequired, isStateResoureStable, StateResource, } from './resource.util'; /** * B = Type of baseresource @@ -70,7 +49,6 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { public get(): Observable<StateResource<T>> { return combineLatest([this.stateResource.asObservable(), this.getConfigResource()]).pipe( - debounceTime(50), tap(([stateResource, configResource]) => this.handleResourceChanges(stateResource, configResource)), filter(([stateResource]) => !isInvalidResourceCombination(stateResource, this.configResource)), mapToFirst<T, B>(),