From 64b701914035320d540b8f583441d090dd4235f2 Mon Sep 17 00:00:00 2001 From: Fadil Zemmari <fadil.zemmari@xelians.fr> Date: Wed, 23 Sep 2020 13:22:14 +0200 Subject: [PATCH] [US TRTL-106] Add internal code at user creation --- .../server/user/converter/UserConverter.java | 4 ++ .../iam/internal/server/user/domain/User.java | 2 + .../user/service/UserInternalService.java | 4 ++ .../service/UserInternalServiceIntegTest.java | 1 + .../vitamui/commons/api/domain/UserDto.java | 2 + .../app/modules/models/user/user.interface.ts | 1 + .../user-create/user-create.component.html | 23 ++++++---- .../user/user-create/user-create.component.ts | 43 +++++++++++++++---- .../identity/service/CustomerServiceTest.java | 2 + 9 files changed, 65 insertions(+), 17 deletions(-) diff --git a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/converter/UserConverter.java b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/converter/UserConverter.java index ba8efc20..db55345f 100644 --- a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/converter/UserConverter.java +++ b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/converter/UserConverter.java @@ -84,6 +84,8 @@ public class UserConverter implements Converter<UserDto, User> { public static final String GROUP_IDENTIFIER_KEY = "Groupe de profils"; + public static final String INTERNAL_CODE_KEY = "Code interne"; + /** * Used for described user's blocked duration */ @@ -91,6 +93,7 @@ public class UserConverter implements Converter<UserDto, User> { public static final String SITE_CODE = "Code du site"; + private final GroupRepository groupRepository; private final AddressConverter addressConverter; @@ -112,6 +115,7 @@ public class UserConverter implements Converter<UserDto, User> { userLogbookData.put(TYPE_KEY, LogbookUtils.getValue(user.getType().toString())); userLogbookData.put(STATUS_KEY, LogbookUtils.getValue(user.getStatus().toString())); userLogbookData.put(SUBROGEABLE_KEY, LogbookUtils.getValue(user.isSubrogeable())); + userLogbookData.put(INTERNAL_CODE_KEY, LogbookUtils.getValue(user.getInternalCode())); userLogbookData.put(OTP_KEY, LogbookUtils.getValue(user.isOtp())); userLogbookData.put(SITE_CODE, LogbookUtils.getValue(user.getSiteCode())); AddressDto address = user.getAddress() != null ? user.getAddress() : new AddressDto(); diff --git a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/domain/User.java b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/domain/User.java index a4a6c036..70624477 100644 --- a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/domain/User.java +++ b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/domain/User.java @@ -130,5 +130,7 @@ public class User extends CustomerIdDocument implements BaseIdentifierDocument { private Address address = new Address(); + private String internalCode; + private String siteCode; } diff --git a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalService.java b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalService.java index 8c3cdee1..58bb1b90 100644 --- a/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalService.java +++ b/api/api-iam/iam-internal/src/main/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalService.java @@ -559,6 +559,10 @@ public class UserInternalService extends VitamUICrudService<UserDto, User> { } addressService.processPatch(user.getAddress(), CastUtils.toMap(entry.getValue()), logbooks); break; + case "internalCode" : + logbooks.add(new EventDiffDto(UserConverter.INTERNAL_CODE_KEY, user.getInternalCode(), entry.getValue())); + user.setInternalCode(CastUtils.toString(entry.getValue())); + break; case "siteCode" : logbooks.add(new EventDiffDto(UserConverter.SITE_CODE, user.getSiteCode(), entry.getValue())); user.setSiteCode(CastUtils.toString(entry.getValue())); diff --git a/api/api-iam/iam-internal/src/test/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalServiceIntegTest.java b/api/api-iam/iam-internal/src/test/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalServiceIntegTest.java index 8168f89b..b5d6bbf1 100644 --- a/api/api-iam/iam-internal/src/test/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalServiceIntegTest.java +++ b/api/api-iam/iam-internal/src/test/java/fr/gouv/vitamui/iam/internal/server/user/service/UserInternalServiceIntegTest.java @@ -338,6 +338,7 @@ public final class UserInternalServiceIntegTest extends AbstractLogbookIntegrati + "\"Type\":\"NOMINATIVE\"," + "\"Statut\":\"ENABLED\"," + "\"Subrogeable\":\"false\"," + + "\"Code interne\":\"\"," + "\"OTP\":\"true\"," + "\"Code du site\":\"001\"," + "\"Nom de la rue\":\"rue faubourg poissoniére\"," diff --git a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/UserDto.java b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/UserDto.java index 4a8b95c1..8bb8fd74 100644 --- a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/UserDto.java +++ b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/domain/UserDto.java @@ -111,5 +111,7 @@ public class UserDto extends CustomerIdDto { private AddressDto address = new AddressDto(); + private String internalCode; + private String siteCode; } diff --git a/ui/ui-frontend-common/src/app/modules/models/user/user.interface.ts b/ui/ui-frontend-common/src/app/modules/models/user/user.interface.ts index 53229d08..d29e5a32 100644 --- a/ui/ui-frontend-common/src/app/modules/models/user/user.interface.ts +++ b/ui/ui-frontend-common/src/app/modules/models/user/user.interface.ts @@ -57,6 +57,7 @@ export interface User extends Id { lastConnection: string; readonly: boolean; address: Address; + internalCode?: string; siteCode: string; } diff --git a/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.html b/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.html index 0ef17962..317cf395 100644 --- a/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.html +++ b/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.html @@ -157,8 +157,15 @@ <div class="content"> <h2 i18n="@@userCreateAddressTitle">Coordonnées</h2> - <ng-container formGroupName="address"> + <ng-container *ngIf="customer.addressType === ADDRESS_TYPE.INTERNAL_CODE"> + <div> + <vitamui-common-input class="field-street" required formControlName="internalCode" maxlength="20" placeholder="Code interne" + i18n-placeholder="@@userCreateInternalCodeInputPlaceholder"> + </vitamui-common-input> + </div> + </ng-container> + <ng-container formGroupName="address" *ngIf="!customer.addressType || customer.addressType === ADDRESS_TYPE.POSTAL"> <div> <vitamui-common-input class="field-street" [required]="!addressEmpty" formControlName="street" maxlength="250" placeholder="N° et nom de rue" i18n-placeholder="@@userCreateStreetInputPlaceholder"> @@ -196,16 +203,16 @@ </div> </mat-form-field> </div> - </ng-container> - <div> - <vitamui-common-input class="field-site-code" formControlName="siteCode" placeholder="Code du site" - i18n-placeholder="user create siteCode@@userCreateSiteCode"> - </vitamui-common-input> - </div> + <div> + <vitamui-common-input class="field-site-code" formControlName="siteCode" placeholder="Code du site" + i18n-placeholder="user create siteCode@@userCreateSiteCode"> + </vitamui-common-input> + </div> + </ng-container> <div class="actions"> - <button type="button" class="btn primary" cdkStepperNext [disabled]="form.get('address').pending || form.get('address').invalid" + <button type="button" class="btn primary" cdkStepperNext [disabled]="thirdStepInvalid()" i18n="user create next step otp@@userCreateNextStepOtpButton"> Continuer en gérant l'authentification </button> diff --git a/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.ts b/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.ts index df9764f8..3149340d 100644 --- a/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.ts +++ b/ui/ui-frontend/projects/identity/src/app/user/user-create/user-create.component.ts @@ -35,6 +35,7 @@ * knowledge of the CeCILL-C license and that you accept its terms. */ import { Subscription } from 'rxjs'; +import { AddressType } from 'ui-frontend-common'; import { AdminUserProfile, AuthService, ConfirmDialogService, Customer, isRootLevel, OtpState, ProfileSelection } from 'ui-frontend-common'; @@ -69,21 +70,32 @@ const emailValidator: RegExp = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](? }) export class UserCreateComponent implements OnInit, OnDestroy { - form: FormGroup; - formEmail: FormGroup; - customer: Customer; - groups: ProfileSelection[] = []; - groupName: string; - stepIndex = 0; - connectedUserInfo: AdminUserProfile; - addressEmpty = true; - creating = false; + public form: FormGroup; + + public formEmail: FormGroup; + + public customer: Customer; + + public groups: ProfileSelection[] = []; + + public groupName: string; + + public stepIndex = 0; + + public connectedUserInfo: AdminUserProfile; + + public addressEmpty = true; + + public creating = false; + + public ADDRESS_TYPE = AddressType; // stepCount is the total number of steps and is used to calculate the advancement of the progress bar. // We could get the number of steps using ViewChildren(StepComponent) but this triggers a // "Expression has changed after it was checked" error so we instead manually define the value. // Make sure to update this value whenever you add or remove a step from the template. private stepCount = 4; + private keyPressSubscription: Subscription; constructor( @@ -112,6 +124,11 @@ export class UserCreateComponent implements OnInit, OnDestroy { domain: [this.customer.emailDomains[0]] }); + let internalCode: string; + if (this.customer.addressType === AddressType.INTERNAL_CODE) { + internalCode = this.customer.internalCode; + } + this.form = this.formBuilder.group( { enabled: true, @@ -141,6 +158,7 @@ export class UserCreateComponent implements OnInit, OnDestroy { city: [null], country: ['FR'] }), + internalCode: [internalCode], siteCode: [null], }, { validator: UserValidators.missingPhoneNumber } @@ -221,6 +239,13 @@ export class UserCreateComponent implements OnInit, OnDestroy { this.form.get('enabled').invalid; } + public thirdStepInvalid(): boolean { + if (!this.customer.addressType || this.customer.addressType === AddressType.POSTAL) { + return this.form.get('address').pending || this.form.get('address').invalid; + } + return this.form.get('internalCode').pending || this.form.get('internalCode').invalid; + } + passGroupStep() { this.stepIndex = LAST_STEP_INDEX; } diff --git a/ui/ui-identity/src/test/java/fr/gouv/vitamui/identity/service/CustomerServiceTest.java b/ui/ui-identity/src/test/java/fr/gouv/vitamui/identity/service/CustomerServiceTest.java index f041b38a..46f918be 100644 --- a/ui/ui-identity/src/test/java/fr/gouv/vitamui/identity/service/CustomerServiceTest.java +++ b/ui/ui-identity/src/test/java/fr/gouv/vitamui/identity/service/CustomerServiceTest.java @@ -7,6 +7,7 @@ import static org.mockito.ArgumentMatchers.any; import java.util.Arrays; import java.util.Optional; +import fr.gouv.vitamui.commons.api.enums.AddressType; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -119,6 +120,7 @@ public class CustomerServiceTest extends UIIdentityServiceTest<CustomerDto> { customer.setOtp(OtpEnum.OPTIONAL); customer.setLanguage(LanguageDto.FRENCH); customer.setOwners(Arrays.asList(new OwnerDto())); + customer.setAddressType(AddressType.POSTAL); customer.setAddress(new AddressDto("street", "zipCode", "city", "country")); customer.setDefaultEmailDomain("@vitamui.com"); customer.setPasswordRevocationDelay(1); -- GitLab