diff --git a/pom.xml b/pom.xml
index efd35ad71..8d364424e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,12 +4,12 @@
4.0.0
br.com.rjconsultores
ventaboletosadm
- 1.81.0
+ 1.82.0
war
- 1.61.0
- 1.46.0
+ 1.62.0
+ 1.47.0
UTF-8
diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/IndexController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/IndexController.java
index e94bde606..ac8fbab5f 100644
--- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/IndexController.java
+++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/IndexController.java
@@ -12,6 +12,8 @@ import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.Execution;
+import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
@@ -97,8 +99,19 @@ public class IndexController extends MyGenericForwardComposer {
if (usuario == null) {
toolBarUser.setVisible(Boolean.FALSE);
+
+ Execution exec = Executions.getCurrent();
+ String param = exec.getParameter("param");
+
+ if(param != null) {
+ Map args = new HashMap();
+ args.put("login", param);
+
+ openWindow("/recuperarSenha.zul", "Recuperar Senha", args, MODAL, Boolean.FALSE);
+ } else {
+ openWindow("/login.zul", Labels.getLabel("winLogin.title"), arg, MODAL, Boolean.FALSE);
+ }
- openWindow("/login.zul", Labels.getLabel("winLogin.title"), arg, MODAL, Boolean.FALSE);
} else {
win.setCtrlKeys("^q");
diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/LoginController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/LoginController.java
new file mode 100644
index 000000000..b5ef5c9e6
--- /dev/null
+++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/LoginController.java
@@ -0,0 +1,196 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.rjconsultores.ventaboletos.web.gui.controladores;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.mail.SendFailedException;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+import org.zkoss.util.resource.Labels;
+import org.zkoss.zhtml.Messagebox;
+import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.event.Event;
+import org.zkoss.zk.ui.util.Clients;
+import org.zkoss.zul.Button;
+import org.zkoss.zul.Textbox;
+
+import com.rjconsultores.ventaboletos.entidad.Constante;
+import com.rjconsultores.ventaboletos.entidad.RecuperarSenha;
+import com.rjconsultores.ventaboletos.entidad.Usuario;
+import com.rjconsultores.ventaboletos.service.ConstanteService;
+import com.rjconsultores.ventaboletos.service.UsuarioService;
+import com.rjconsultores.ventaboletos.utilerias.DateUtil;
+import com.rjconsultores.ventaboletos.utilerias.SendMail;
+import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
+
+@Controller("loginController")
+@Scope("prototype")
+public class LoginController extends MyGenericForwardComposer {
+
+ private static final long serialVersionUID = 1L;
+ private static final String HOST_SMTP_RECUPERACAOSENHA = "HOST_SMTP_RECUPERACAOSENHA";
+ private static final String PORTA_SMTP_RECUPERACAOSENHA = "PORTA_SMTP_RECUPERACAOSENHA";
+ private static final String USUARIO_SMTP_RECUPERACAOSENHA = "USUARIO_SMTP_RECUPERACAOSENHA";
+ private static final String SENHAUSUARIO_SMTP_RECUPERACAOSENHA = "SENHAUSUARIO_SMTP_RECUPERACAOSENHA";
+ private static final String URL_ADM = "URL_ADM";
+ private static Logger log = LogManager.getLogger(LoginController.class);
+
+ @Autowired
+ private UsuarioService usuarioService;
+
+ @Autowired
+ private ConstanteService constanteService;
+
+ private Button btnRecuperarSenha;
+
+ //login usuario, mantive o nome da tela para nao alterar o processo de login
+ private Textbox u;
+
+ @Override
+ public void doAfterCompose(Component comp) throws Exception {
+ super.doAfterCompose(comp);
+ }
+
+ public Button getBtnRecuperarSenha() {
+ return btnRecuperarSenha;
+ }
+
+ public void setBtnRecuperarSenha(Button btnRecuperarSenha) {
+ this.btnRecuperarSenha = btnRecuperarSenha;
+ }
+
+ public void onClick$btnRecuperarSenha(Event ev) {
+ try {
+ String login = u.getValue();
+
+ if (StringUtils.isBlank(login)) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ List usuarioList = usuarioService.buscarPelaCveUsuario(login);
+
+ //Nao encontrado nenhum usuario com o login
+ if(usuarioList.isEmpty()) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.loginNaoEncontrado"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ if(usuarioList.size() > 1) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.multiplusUsuariosPorLogin"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ Usuario usuario = usuarioList.get(0);
+
+ if(StringUtils.isBlank(usuario.getDescCorreo())) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.configuracaoConstante"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ Constante hostSmtp = constanteService.buscarPorNomeConstante(HOST_SMTP_RECUPERACAOSENHA);
+ Constante portaSmtp = constanteService.buscarPorNomeConstante(PORTA_SMTP_RECUPERACAOSENHA);
+ Constante usuarioSmtp = constanteService.buscarPorNomeConstante(USUARIO_SMTP_RECUPERACAOSENHA);
+ Constante senhaUsuarioSMTP = constanteService.buscarPorNomeConstante(SENHAUSUARIO_SMTP_RECUPERACAOSENHA);
+ Constante urlADM = constanteService.buscarPorNomeConstante(URL_ADM);
+
+ if(isNull(hostSmtp) || isNull(portaSmtp) || isNull(usuarioSmtp) || isNull(senhaUsuarioSMTP) || isNull(urlADM)) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.emailNaoCadastrado"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ String URL = montarURL(login, urlADM, usuario);
+
+
+ enviarEmail(usuario, usuarioSmtp.getValorconstante(), hostSmtp.getValorconstante(), senhaUsuarioSMTP.getValorconstante(),
+ portaSmtp.getValorconstante(), URL);
+
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.MSG.EmailRecuperacaoSenhaEnviado"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ } catch (Exception ex) {
+ log.error(ex.getLocalizedMessage());
+ Clients.alert(ex.getLocalizedMessage(), Labels.getLabel("winCambiaContrasena.title"), Messagebox.INFORMATION);
+ }
+ }
+
+ private String montarURL(String login, Constante urlADM, Usuario usuario) {
+ String URL = urlADM.getValorconstante();
+
+ String dataAtual = DateUtil.getStringDate24Hour(new Date());
+
+ String paramEncode = login.concat(";").concat(dataAtual);
+
+ paramEncode = new String(Base64.encodeBase64(paramEncode.getBytes()));
+
+ URL = URL.concat("?param=").concat(paramEncode);
+
+ salvarParametro(paramEncode, usuario);
+
+ return URL;
+ }
+
+ private void salvarParametro(String paramEncode, Usuario usuario) {
+ RecuperarSenha recSenhaExiste = usuarioService.buscarLinkRecuperacaoSenhaPeloParam(paramEncode);
+
+ //Para evitar criar mais de um link no mesmo minuto
+ if(recSenhaExiste == null) {
+ RecuperarSenha recSenha = new RecuperarSenha();
+
+ recSenha.setParam(paramEncode);
+ recSenha.setActivo(Boolean.TRUE);
+ recSenha.setFecmodif(new Date());
+ recSenha.setUsuarioId(usuario.getUsuarioId());
+
+ usuarioService.salvarLinkRecuperacaoSenha(recSenha);
+ }
+ }
+
+ private boolean isNull(Constante valorConstante) {
+ return valorConstante == null || StringUtils.isBlank(valorConstante.getValorconstante());
+ }
+
+ private void enviarEmail(Usuario usuario, String usuarioSmtp, String smtpHost, String senhaSmtp, String portaSmtp, String urlADM) throws SendFailedException {
+
+ SendMail mail = new SendMail();
+ mail.setEmailTo(usuario.getDescCorreo());
+ mail.setEmailFrom(usuarioSmtp); // "cassiohcsilvadev@gmail.com"
+ mail.setSmtpHost(smtpHost); //"smtp.gmail.com"
+ mail.setSmtpPassword(senhaSmtp); // "jtzpzyzcjviyheym"
+ mail.setSmtpPort(portaSmtp); //"587"
+ mail.setSmtpUser(usuarioSmtp); //"cassiohcsilvadev@gmail.com"
+ mail.setAuth(true);
+
+ //URL: /ventaboletosadm/index.zul?param=USUARIO
+
+ String textoEmail = "RECUPERAÇÃO DE SENHA ADM. \n ";
+ textoEmail = textoEmail.concat("Link para recuperacao de senha: " + urlADM + " \n");
+ textoEmail = textoEmail.concat("O link tem validade de 5 minutos. ");
+
+ mail.setSubject("RECUPERAÇÃO DE SENHA ADM.");
+ mail.setText(textoEmail);
+ mail.send();
+ }
+
+ public Textbox getU() {
+ return u;
+ }
+
+ public void setU(Textbox u) {
+ this.u = u;
+ }
+}
diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/RecuperarSenhaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/RecuperarSenhaController.java
new file mode 100644
index 000000000..692c67f31
--- /dev/null
+++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/RecuperarSenhaController.java
@@ -0,0 +1,167 @@
+package com.rjconsultores.ventaboletos.web.gui.controladores;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+import org.zkoss.util.resource.Labels;
+import org.zkoss.zhtml.Messagebox;
+import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.Executions;
+import org.zkoss.zk.ui.event.Event;
+import org.zkoss.zk.ui.util.Clients;
+import org.zkoss.zul.Button;
+import org.zkoss.zul.Textbox;
+
+import com.rjconsultores.ventaboletos.entidad.RecuperarSenha;
+import com.rjconsultores.ventaboletos.entidad.Usuario;
+import com.rjconsultores.ventaboletos.service.UsuarioService;
+import com.rjconsultores.ventaboletos.utilerias.DateUtil;
+import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
+
+@Controller("recuperarSenhaController")
+@Scope("prototype")
+public class RecuperarSenhaController extends MyGenericForwardComposer {
+
+ private static final long serialVersionUID = 1L;
+ private static Logger log = LogManager.getLogger(RecuperarSenhaController.class);
+
+ @Autowired
+ private UsuarioService usuarioService;
+
+ private Textbox txtUser;
+ private Textbox txtNewPassword;
+ private Textbox txtConfirmPassword;
+ private Button btnSalvar;
+ private Button btnFecharTela;
+
+ private RecuperarSenha recSenha;
+
+ @Override
+ public void doAfterCompose(Component comp) throws Exception {
+ super.doAfterCompose(comp);
+
+ String param = (String) Executions.getCurrent().getArg().get("login");
+
+ if(param != null) {
+ recSenha = usuarioService.buscarLinkRecuperacaoSenhaPeloParam(param);
+
+ //Se nao existe no banco nao ativa a troca de senha
+ if(recSenha == null) {
+ desativarCampos();
+ } else {
+ btnFecharTela.setVisible(false);
+ String paramDecode = new String(Base64.decodeBase64(param.getBytes()));
+
+ String[] parametros = paramDecode.split(";");
+
+ if(parametros.length != 2) {
+ desativarCampos();
+ } else {
+
+ if(isDataValida(parametros)) {
+ txtUser.setText(parametros[0]);
+
+ } else {
+ desativarCampos();
+ btnFecharTela.setLabel("Link expirado. Fechar tela.");
+ }
+ }
+ }
+
+ }
+ }
+
+ private void desativarCampos() {
+ txtUser.setDisabled(true);
+ txtNewPassword.setDisabled(true);
+ txtConfirmPassword.setDisabled(true);
+
+ btnSalvar.setVisible(false);
+ btnFecharTela.setVisible(true);
+ }
+
+ private boolean isDataValida(String[] parametros) {
+ Date dataParam =DateUtil.getDateString24Hour(parametros[1]);
+
+ Date dataAtual = new Date();
+
+ Long minutos = DateUtil.getElapsedMinutos(dataParam, dataAtual);
+
+ //A data e valida em ate 5 minutos
+ return minutos <= 5;
+ }
+
+ private void fecharTela() {
+ closeWindow();
+ openWindow("/login.zul", Labels.getLabel("indexController.app.nome"), arg, MODAL, Boolean.FALSE);
+ }
+
+ public void onClick$btnFecharTela(Event ev) {
+ fecharTela();
+ }
+
+ public void onClick$btnSalvar(Event ev) throws InterruptedException {
+ try {
+
+ if (StringUtils.isBlank(txtUser.getValue())) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ List usuarioList = usuarioService.buscarPelaCveUsuario(txtUser.getValue());
+
+ //Nao encontrado nenhum usuario
+ if(usuarioList.isEmpty()) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ if (!txtNewPassword.getValue().equals(txtConfirmPassword.getValue())) {
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.senhasDiferentes"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+ return;
+ }
+
+ Usuario usuario = usuarioList.get(0);
+
+ usuarioService.cambiarContrasena(usuario, txtNewPassword.getValue());
+
+ //Desativar link
+ usuarioService.desativarLinkRecuperacaoSenha(recSenha);
+
+ Messagebox.show(Labels.getLabel("winCambiaContrasena.MSG.suscribirOK"),
+ Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
+
+ fecharTela();
+
+ } catch (Exception ex) {
+ log.error(ex.getLocalizedMessage());
+ Clients.alert(ex.getLocalizedMessage(), Labels.getLabel("winCambiaContrasena.title"), Messagebox.INFORMATION);
+ }
+ }
+
+ public Button getBtnSalvar() {
+ return btnSalvar;
+ }
+
+ public void setBtnSalvar(Button btnSalvar) {
+ this.btnSalvar = btnSalvar;
+ }
+
+ public Button getBtnFecharTela() {
+ return btnFecharTela;
+ }
+
+ public void setBtnFecharTela(Button btnFecharTela) {
+ this.btnFecharTela = btnFecharTela;
+ }
+}
diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/seguridad/EditarUsuarioController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/seguridad/EditarUsuarioController.java
index 615fe5794..84495ca9c 100644
--- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/seguridad/EditarUsuarioController.java
+++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/seguridad/EditarUsuarioController.java
@@ -27,6 +27,7 @@ import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
+import org.zkoss.zul.Datebox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Radio;
@@ -155,6 +156,10 @@ public class EditarUsuarioController extends MyGenericForwardComposer {
private boolean indConstanteIndMultiPuntoVenta;
private final String nombreIndConstanteIndMultiPuntoVenta ="IND_MULTI_PUNTOVENTA";
+ private Checkbox chkIndRecuperarSenha;
+ private Textbox txtMatricula;
+ private Datebox dataNascimento;
+ private Textbox txtSobrenomePaterno;
@Override
public void doAfterCompose(Component comp) throws Exception {
@@ -592,6 +597,13 @@ public class EditarUsuarioController extends MyGenericForwardComposer {
usuario.setTipoVentaIntegracaoId(Long.valueOf(tipoVentaSeleccionado.getTipoventaId()));
}
+ if(chkIndRecuperarSenha.isChecked()) {
+ if(dataNascimento.getValue() == null || StringUtils.isBlank(txtMatricula.getValue()) || StringUtils.isBlank(txtSobrenomePaterno.getValue())) {
+ MensagensUtils.showMessageExclamation("editarUsuarioController.MSG.necessarioPreencherDadosRecuperacao", TITULO_CONTROLER);
+ return;
+ }
+ }
+
usuario.setIndRetornaTodasLocalidades( chkRetornaTodasLocalidades.isChecked());
usuario.setIndTrocaSenha(chkTrocarSenha.isChecked());
@@ -976,4 +988,36 @@ public class EditarUsuarioController extends MyGenericForwardComposer {
public void setChkTrocarSenha(Checkbox chkTrocarSenha) {
this.chkTrocarSenha = chkTrocarSenha;
}
+
+ public Checkbox getChkIndRecuperarSenha() {
+ return chkIndRecuperarSenha;
+ }
+
+ public void setChkIndRecuperarSenha(Checkbox chkIndRecuperarSenha) {
+ this.chkIndRecuperarSenha = chkIndRecuperarSenha;
+ }
+
+ public Textbox getTxtMatricula() {
+ return txtMatricula;
+ }
+
+ public void setTxtMatricula(Textbox txtMatricula) {
+ this.txtMatricula = txtMatricula;
+ }
+
+ public Datebox getDataNascimento() {
+ return dataNascimento;
+ }
+
+ public void setDataNascimento(Datebox dataNascimento) {
+ this.dataNascimento = dataNascimento;
+ }
+
+ public Textbox getTxtSobrenomePaterno() {
+ return txtSobrenomePaterno;
+ }
+
+ public void setTxtSobrenomePaterno(Textbox txtSobrenomePaterno) {
+ this.txtSobrenomePaterno = txtSobrenomePaterno;
+ }
}
diff --git a/src/java/spring-config.xml b/src/java/spring-config.xml
index 4e9fc8245..e024d308e 100644
--- a/src/java/spring-config.xml
+++ b/src/java/spring-config.xml
@@ -459,7 +459,8 @@
com.rjconsultores.ventaboletos.entidad.HeaderTabelaEsquemaCorrida
com.rjconsultores.ventaboletos.entidad.Disponibilidad
com.rjconsultores.ventaboletos.entidad.EmpresaPMArtespConfig
- com.rjconsultores.ventaboletos.entidad.EmpresaSicfeConfig
+ com.rjconsultores.ventaboletos.entidad.EmpresaSicfeConfig
+ com.rjconsultores.ventaboletos.entidad.RecuperarSenha
diff --git a/web/WEB-INF/i3-label_es_MX.label b/web/WEB-INF/i3-label_es_MX.label
index 3fa599802..c5bc3a659 100644
--- a/web/WEB-INF/i3-label_es_MX.label
+++ b/web/WEB-INF/i3-label_es_MX.label
@@ -9988,3 +9988,16 @@ winMovimentacionBilhetesPuntoVenta.numSerie.label = Série
winMovimentacionBilhetesPuntoVenta.origem.label = Origen
winMovimentacionBilhetesPuntoVenta.puntoventa.label = Ag.
winMovimentacionBilhetesPuntoVenta.tipoMovimentacion.label = Naturaleza
+
+editarUsuarioController.tabel.restaurarSenha= Restablecimiento de contraseña
+editarUsuarioController.tabel.numeroMatricula= Registro
+editarUsuarioController.tabel.dataNascimento= Fecha de nacimiento
+editarUsuarioController.tabel.sobrenomePaterno= Apellido paterno
+editarUsuarioController.MSG.necessarioPreencherDadosRecuperacao=Se deben completar todos los datos para utilizar la recuperación de contraseña.
+winCambiaContrasena.erro.loginNaoEncontrado= No se encontró ningún usuario con el inicio de sesión proporcionado.
+winCambiaContrasena.erro.multiplusUsuariosPorLogin= Se encontró más de un usuario con el mismo inicio de sesión, comuníquese con el administrador del sistema.
+winCambiaContrasena.erro.emailNaoCadastrado= Correo electrónico del usuario no registrado, contacte al administrador del sistema.
+winCambiaContrasena.MSG.EmailRecuperacaoSenhaEnviado=Se envió un enlace de recuperación de contraseña al correo electrónico registrado en el inicio de sesión del usuario.
+winCambiaContrasena.erro.configuracaoConstante= Es necesario configurar constantes de envío de correo electrónico para la recuperación de contraseña. Póngase en contacto con el administrador de su sistema.
+winCambiaContrasena.erro.linkInvalido=Enlace no válido.
+winCambiaContrasena.btnLinkInvalidoFecharTela= Enlace no válido. Cerrar pantalla.
diff --git a/web/WEB-INF/i3-label_fr_FR.label b/web/WEB-INF/i3-label_fr_FR.label
index 82457b6a7..47a397d61 100644
--- a/web/WEB-INF/i3-label_fr_FR.label
+++ b/web/WEB-INF/i3-label_fr_FR.label
@@ -9961,3 +9961,17 @@ winMovimentacionBilhetesPuntoVenta.numSerie.label = Série
winMovimentacionBilhetesPuntoVenta.origem.label = Origine
winMovimentacionBilhetesPuntoVenta.puntoventa.label = Ag.
winMovimentacionBilhetesPuntoVenta.tipoMovimentacion.label = Nature
+
+editarUsuarioController.tabel.restaurarSenha= Réinitialisation du mot de passe
+editarUsuarioController.tabel.numeroMatricula= Inscription
+editarUsuarioController.tabel.dataNascimento= Date de naissance
+editarUsuarioController.tabel.sobrenomePaterno= Nom paternel
+editarUsuarioController.MSG.necessarioPreencherDadosRecuperacao=Toutes les données doivent être renseignées pour utiliser la récupération de mot de passe.
+winCambiaContrasena.erro.loginNaoEncontrado= Aucun utilisateur avec le login donné n'a été trouvé.
+winCambiaContrasena.erro.multiplusUsuariosPorLogin= Plusieurs utilisateurs ont été trouvés avec le même identifiant, contactez votre administrateur système.
+winCambiaContrasena.erro.emailNaoCadastrado= E-mail de l'utilisateur non enregistré, contactez l'administrateur système.
+winCambiaContrasena.MSG.EmailRecuperacaoSenhaEnviado=Un lien de récupération de mot de passe a été envoyé à l'e-mail enregistré dans la connexion de l'utilisateur.
+winCambiaContrasena.erro.configuracaoConstante= Il est nécessaire de configurer les constantes d'envoi d'e-mails pour la récupération du mot de passe. Contactez votre administrateur système.
+winCambiaContrasena.erro.linkInvalido=Lien invalide.
+winCambiaContrasena.btnLinkInvalidoFecharTela= Lien invalide. Fermez l'écran.
+
diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label
index 2df16bbe4..357d94b99 100644
--- a/web/WEB-INF/i3-label_pt_BR.label
+++ b/web/WEB-INF/i3-label_pt_BR.label
@@ -9966,3 +9966,16 @@ winMovimentacionBilhetesPuntoVenta.numSerie.label = Série
winMovimentacionBilhetesPuntoVenta.origem.label = Origem
winMovimentacionBilhetesPuntoVenta.puntoventa.label = Ag.
winMovimentacionBilhetesPuntoVenta.tipoMovimentacion.label = Natureza
+
+editarUsuarioController.tabel.restaurarSenha= Restauração de Senha
+editarUsuarioController.tabel.numeroMatricula= Matrícula
+editarUsuarioController.tabel.dataNascimento= Data Nascimento
+editarUsuarioController.tabel.sobrenomePaterno= Sobrenome Paterno
+editarUsuarioController.MSG.necessarioPreencherDadosRecuperacao=Necessário preencher todos os dados para utilização da recuperação de senha.
+winCambiaContrasena.erro.loginNaoEncontrado= Não foi encontrado nenhum usuário com o login informado.
+winCambiaContrasena.erro.multiplusUsuariosPorLogin= Foi encontrado mais de um usuário com o mesmo login, contacte o administrador do sistema.
+winCambiaContrasena.erro.emailNaoCadastrado= E-mail do usuário não cadastrado, contacte o adaministrado do sistema.
+winCambiaContrasena.MSG.EmailRecuperacaoSenhaEnviado=Foi enviado um link de recuperação de senha para o e-mail cadastrado no login do usuário.
+winCambiaContrasena.erro.configuracaoConstante= Necessário configurar constantes de envio de e-mail para a recuperação de senha. Contacte o administrador do sistema.
+winCambiaContrasena.erro.linkInvalido=Link inválido.
+winCambiaContrasena.btnLinkInvalidoFecharTela= Link Inválido. Fechar tela.
diff --git a/web/gui/seguridad/editarUsuario.zul b/web/gui/seguridad/editarUsuario.zul
index 1c4ff6dd7..9484740e1 100644
--- a/web/gui/seguridad/editarUsuario.zul
+++ b/web/gui/seguridad/editarUsuario.zul
@@ -39,6 +39,7 @@
+
@@ -259,6 +260,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/login.zul b/web/login.zul
index de53aaac5..7cc0f8f51 100644
--- a/web/login.zul
+++ b/web/login.zul
@@ -8,9 +8,9 @@
xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:w="http://www.zkoss.org/2005/zk/client"
- xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
+ xsi:schemaLocation="http://www.zkoss.org/2005/zul">
-
@@ -32,13 +32,15 @@
+ name="j_password" />
+
+
diff --git a/web/recuperarSenha.zul b/web/recuperarSenha.zul
new file mode 100644
index 000000000..7e637205f
--- /dev/null
+++ b/web/recuperarSenha.zul
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file