From 4bb197a3c9713b9e45acf674e7765f58e30799e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garcia=20Nu=C3=B1ez?= Date: Tue, 31 Dec 2019 15:42:59 +0100 Subject: [PATCH] Mejora en validador de NIF, ahora comprueba duplicados sin antes de guardar el formulario. --- .../docroot/profile/RegisterUser.xhtml | 7 +++-- .../docroot/profile/UpdateProfile.xhtml | 9 ++++-- .../MyHealth/docroot/resources/js/common.js | 14 ++++++++- .../managedbean/common/ValidationUtils.java | 22 +++++++------- .../profile/RegisterUserMBean.java | 27 +++++------------ .../profile/UpdateProfileMBean.java | 29 +++++-------------- .../managedbean/validators/NifValidator.java | 25 +++++++++++++++- 7 files changed, 75 insertions(+), 58 deletions(-) diff --git a/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml b/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml index 9c42b17..6423bc1 100644 --- a/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml +++ b/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml @@ -67,9 +67,12 @@
- + + + + - +
diff --git a/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml b/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml index 6748985..095f009 100644 --- a/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml +++ b/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml @@ -42,13 +42,16 @@
- + + + + - +
- +
diff --git a/1.sources/MyHealth/docroot/resources/js/common.js b/1.sources/MyHealth/docroot/resources/js/common.js index d94d7d9..f65c742 100644 --- a/1.sources/MyHealth/docroot/resources/js/common.js +++ b/1.sources/MyHealth/docroot/resources/js/common.js @@ -22,15 +22,27 @@ function startLogin() { PF('btnLogin').disable(); } +function nifCheckClick() { + var nif = PF('nif'); + nif.jq.change(); +} + // Actualiza la interfaz tras validar si un nif está duplicado. function handleNIFResponse(xhr, status, args) { + var isValid = false; + + if (typeof args.validationFailed != "undefined") + isValid = !args.validationFailed; + else if (typeof args.NIFisValid != "undefined") + isValid = args.NIFisValid; + if (args.formattedNIF) { var nif = PF('nif'); nif.jq.val(args.formattedNIF); } var nifButton = PF('nifButton'); - if (args.NIFisDupe == false) { + if (isValid == true) { nifButton.jq.children(".ui-icon").removeClass("pi pi-times"); nifButton.jq.removeClass('red-button'); diff --git a/1.sources/MyHealth/src/managedbean/common/ValidationUtils.java b/1.sources/MyHealth/src/managedbean/common/ValidationUtils.java index 034c764..7870e15 100644 --- a/1.sources/MyHealth/src/managedbean/common/ValidationUtils.java +++ b/1.sources/MyHealth/src/managedbean/common/ValidationUtils.java @@ -16,8 +16,12 @@ public class ValidationUtils { static final String NIE_LETTERS = "XYZ"; public static String normalizeNIF(String nif) { - return nif.toUpperCase().replace("-", "").replace(".", ""); + if (nif == null) + return nif; + else + return nif.toUpperCase().replace("-", "").replace(".", ""); } + /** * * @param nif NIF a validar @@ -57,25 +61,21 @@ public class ValidationUtils { } /** - * Comprueba si un NIF existe para un tipo de usuario. * No se permite que el - * mismo NIF esté registrado como médico de familia y como especialista. * Se - * permite que el mismo NIF esté registrado como paciente y como médico (de - * familia o especialista) + * Comprueba si un NIF existe para un tipo de usuario. * No se permite que el mismo NIF esté registrado como médico de familia y como especialista. * Se permite que el mismo + * NIF esté registrado como paciente y como médico (de familia o especialista) * * @param remoteSvc Servicio Remoto para recuperar datos. * @param userType Tipo de usuario a comprobar * @param nif NIF a comprobar. - * @param id Parámetro opcional, id del usuario actual (si encuentra el - * mismo nif y el usuario coincide no se devuelve la - * coincidencia) + * @param id Parámetro opcional, id del usuario actual (si encuentra el mismo nif y el usuario coincide no se devuelve la coincidencia) * @return true si el NIF ya estaba registrado para un usuario diferente. */ public static boolean checkIfNifAlreadyRegistered(CommonFacadeRemote remoteSvc, UserType userType, String nif, Integer id) { boolean nifExists = false; - + if (userType == null || remoteSvc == null) return nifExists; - + switch (userType) { case ADMINISTRATOR: break; @@ -90,7 +90,7 @@ public class ValidationUtils { if (sd != null && (id == null || sd.getId().equals(id) == false)) nifExists = true; - } else if (id == null || fd.getId().equals(id) == false ) + } else if (id == null || fd.getId().equals(id) == false) // Si se trata de un usuario diferente, entonces está repetido nifExists = true; diff --git a/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java b/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java index b419290..693df21 100644 --- a/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java @@ -34,7 +34,6 @@ import managedbean.common.ValidationUtils; public class RegisterUserMBean extends ManagedBeanBase implements Serializable { private static final long serialVersionUID = 1L; - private int id; private String cipCode; private String nif; private String name; @@ -156,22 +155,12 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { } /** - * Gestióna el evento de modficación del NIF del usuario actual. Búsca si el NIF ya está en uso para otro usuario. Solo se permite que el mismo NIF se refistro como paciente y - * como médico (especialista o de familia, pero no como ambos). + * Búsca si el NIF ya está en uso para otro usuario. Solo se permite que el mismo NIF se refistro como paciente y como médico (especialista o de familia, pero no como ambos). * * Un Médico puede estar registrado como paciente con el mismo NIF, pero como médico de familia y especialista al mismo tiempo. */ - public void handleNIFValueChange() { - boolean isDupe = false; - this.nif = ValidationUtils.normalizeNIF(this.nif); - - if (ValidationUtils.checkIfNifAlreadyRegistered(this.getRemoteManagerCommon(), this.userType, this.nif, null) == true) { - isDupe = true; - this.addFacesMessage("frmRegisterUser:nif", FacesMessage.SEVERITY_WARN, "NIF duplicado", "El nif indicado pertenece a otro usuario previamente registrado"); - } - - PrimeFaces.current().ajax().addCallbackParam("NIFisDupe", isDupe); - PrimeFaces.current().ajax().addCallbackParam("formattedNIF", this.nif); + public boolean checkNIFDuplicated(String nifValue, UserType userType) { + return ValidationUtils.checkIfNifAlreadyRegistered(this.getRemoteManagerCommon(), userType, nifValue, null); } public boolean isPatient() { @@ -247,7 +236,7 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { */ public void addNewUser() { int error = 0; - + this.nif = ValidationUtils.normalizeNIF(this.nif); if (this.isFamilyDoctor() && this.primaryHealthCareCenter == null) { @@ -263,7 +252,7 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { this.addFacesMessage(FacesMessage.SEVERITY_WARN, "El NIF indicado no es válido", "Por favor, especifique un NIF válido."); error++; } - if (ValidationUtils.checkIfNifAlreadyRegistered(this.getRemoteManagerCommon(), this.userType, this.nif, null) == true) { + if (this.checkNIFDuplicated(this.nif, this.userType) == true) { this.addFacesMessage("frmRegisterUser:nif", FacesMessage.SEVERITY_WARN, "NIF duplicado", "El nif indicado pertenece a otro usuario previamente registrado"); error++; } @@ -272,17 +261,17 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { try { switch (this.userType) { case PATIENT: - PatientTO pat = this.getRemoteManagerProfile().registerPatient(id, nif, name, surname, password, email); + PatientTO pat = this.getRemoteManagerProfile().registerPatient(nif, name, surname, password, email); this.cipCode = pat.getPersonalIdentificationCode(); break; case FAMILY_DOCTOR: - FamilyDoctorTO fd = this.getRemoteManagerProfile().registerFamilyDoctor(id, nif, name, surname, password, email, this.primaryHealthCareCenter); + FamilyDoctorTO fd = this.getRemoteManagerProfile().registerFamilyDoctor(nif, name, surname, password, email, this.primaryHealthCareCenter); this.cipCode = fd.getProfessionalNumber(); break; case SPECIALIST_DOCTOR: - SpecialistDoctorTO sd = this.getRemoteManagerProfile().registerSpecialistDoctor(id, nif, name, surname, password, email, this.medicalSpecialty); + SpecialistDoctorTO sd = this.getRemoteManagerProfile().registerSpecialistDoctor(nif, name, surname, password, email, this.medicalSpecialty); this.cipCode = sd.getProfessionalNumber(); break; diff --git a/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java b/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java index 4b5f83d..e928e1d 100644 --- a/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java @@ -10,8 +10,6 @@ import javax.faces.view.ViewScoped; import javax.inject.Named; import javax.resource.NotSupportedException; -import org.primefaces.PrimeFaces; - import TO.FamilyDoctorTO; import TO.LoggedUserTO; import TO.MedicalSpecialtyTO; @@ -206,22 +204,12 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable } /** - * Gestióna el evento de modficación del NIF del usuario actual. Búsca si el NIF ya está en uso para otro usuario. Solo se permite que el mismo NIF se refistro como paciente y - * como médico (especialista o de familia, pero no como ambos). + * Búsca si el NIF ya está en uso para otro usuario. Solo se permite que el mismo NIF se refistro como paciente y como médico (especialista o de familia, pero no como ambos). * * Un Médico puede estar registrado como paciente con el mismo NIF, pero como médico de familia y especialista al mismo tiempo. */ - public void handleNIFValueChange() { - boolean isDupe = false; - this.nif = ValidationUtils.normalizeNIF(this.nif); - - if (ValidationUtils.checkIfNifAlreadyRegistered(this.getRemoteManagerCommon(), this.userType, this.nif, this.id) == true) { - isDupe = true; - this.addFacesMessage("frmUpdateProfile:nif", FacesMessage.SEVERITY_WARN, "NIF duplicado", "El nif indicado pertenece a otro usuario previamente registrado"); - } - - PrimeFaces.current().ajax().addCallbackParam("NIFisDupe", isDupe); - PrimeFaces.current().ajax().addCallbackParam("formattedNIF", this.nif); + public boolean checkNIFDuplicated(String nifValue, UserType userType, Integer userId) { + return ValidationUtils.checkIfNifAlreadyRegistered(this.getRemoteManagerCommon(), userType, nifValue, userId); } public List getFamilyDoctorList() { @@ -304,12 +292,11 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable } /** - * Método que guarda los datos realizados en la modificación del perfil. - * Tiene en cuenta el tipo de usuario que está editando su perfil. + * Método que guarda los datos realizados en la modificación del perfil. Tiene en cuenta el tipo de usuario que está editando su perfil. * - * Si el usuario es un médico de familia requiere que se seleccione un CAP para el usuario. - * Si el usuario es un médico especialista requiere que se seleccione una especialidad médica para el usuario. - * Se comprueba que el NIF especificado sea válido y no pertenezca a otro usuario registrado (ver relgas de NIF permitidos para usuarios en el método handleNIFValueChange) + * Si el usuario es un médico de familia requiere que se seleccione un CAP para el usuario. Si el usuario es un médico especialista requiere que se seleccione una especialidad + * médica para el usuario. Se comprueba que el NIF especificado sea válido y no pertenezca a otro usuario registrado (ver relgas de NIF permitidos para usuarios en el método + * handleNIFValueChange) * * Si se especifica una nueva contraseña, entonces se realiz un cambio de contraseña, y se requiere además: Que la nueva contraseña sea diferente a la anterior. * @@ -321,7 +308,7 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable // Si no hay tipo de usuario, es que algo raro ha pasado (sesión caducada?). salimos. if (this.userType == null) return; - + this.nif = ValidationUtils.normalizeNIF(this.nif); boolean changePassword = (this.oldPassword != null && this.oldPassword.equals("") == false) || (this.password != null && this.password.equals("") == false); diff --git a/1.sources/MyHealth/src/managedbean/validators/NifValidator.java b/1.sources/MyHealth/src/managedbean/validators/NifValidator.java index 9b1bfd3..95e48c0 100644 --- a/1.sources/MyHealth/src/managedbean/validators/NifValidator.java +++ b/1.sources/MyHealth/src/managedbean/validators/NifValidator.java @@ -9,16 +9,19 @@ import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; +import org.primefaces.PrimeFaces; import org.primefaces.validate.ClientValidator; import managedbean.common.ValidationUtils; +import managedbean.profile.RegisterUserMBean; +import managedbean.profile.UpdateProfileMBean; @FacesValidator("nifValidator") public class NifValidator implements Validator, ClientValidator { public void validate(FacesContext context, UIComponent comp, String value) throws ValidatorException { String strValue = ""; - + if (value != null) strValue = String.valueOf(value); @@ -26,8 +29,28 @@ public class NifValidator implements Validator, ClientValidator { throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "El NIF no es válido", "El NIF " + strValue + " no es válido")); strValue = ValidationUtils.normalizeNIF(strValue); + if (ValidationUtils.isValid(strValue) == false) throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "El NIF no es válido", "El NIF " + strValue + " no es válido")); + + Object managedBean = comp.getValueExpression("managedBean").getValue(context.getELContext()); + boolean nifIsDupe = false; + + if (managedBean instanceof RegisterUserMBean) { + RegisterUserMBean ruBean = RegisterUserMBean.class.cast(managedBean); + nifIsDupe = ruBean.checkNIFDuplicated(strValue, ruBean.getUserType()); + } else if (managedBean instanceof UpdateProfileMBean) { + UpdateProfileMBean upBean = UpdateProfileMBean.class.cast(managedBean); + nifIsDupe = upBean.checkNIFDuplicated(strValue, upBean.getUserType(), upBean.getId()); + } + + PrimeFaces.current().ajax().addCallbackParam("formattedNIF", strValue); + + if (nifIsDupe == true) + throw new ValidatorException( + new FacesMessage(FacesMessage.SEVERITY_ERROR, "El NIF está duplicado", "El NIF " + strValue + " pertenece a otro usuario previamente registrado")); + + PrimeFaces.current().ajax().addCallbackParam("NIFisValid", true); } public Map getMetadata() {