diff --git a/pom.xml b/pom.xml index e130f53..d454d96 100644 --- a/pom.xml +++ b/pom.xml @@ -55,10 +55,12 @@ vaadin + com.vaadin vaadin-spring-boot-starter + org.parttio line-awesome @@ -80,22 +82,35 @@ org.springframework.boot spring-boot-starter-validation + org.springframework.boot spring-boot-devtools true + org.springframework.boot spring-boot-starter-test test + com.vaadin vaadin-testbench-junit5 test + + org.springframework.boot + spring-boot-starter-data-ldap + + + + org.springframework.security + spring-security-ldap + + com.oracle.database.jdbc diff --git a/src/main/bundles/prod.bundle b/src/main/bundles/prod.bundle index 2b84bb7..c70dd04 100644 Binary files a/src/main/bundles/prod.bundle and b/src/main/bundles/prod.bundle differ diff --git a/src/main/java/mx/gob/jumapacelaya/Services/GuardarSolicitudService.java b/src/main/java/mx/gob/jumapacelaya/Services/GuardarSolicitudService.java index ed8533a..f476af2 100644 --- a/src/main/java/mx/gob/jumapacelaya/Services/GuardarSolicitudService.java +++ b/src/main/java/mx/gob/jumapacelaya/Services/GuardarSolicitudService.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import com.vaadin.flow.component.UI; import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; @@ -31,6 +32,7 @@ public class GuardarSolicitudService { this.jdbcTemplate = jdbcTemplate; } + @SuppressWarnings("static-access") public boolean guardarSolicitud( Integer pPredioID, String pTiposolicitud, @@ -89,6 +91,11 @@ public class GuardarSolicitudService { callableStatement.execute(); notifiSuccess("Solicitud guardada correctamente.."); + + UI.getCurrent().getSession().setAttribute("usuarioSesion", null); + UI.getCurrent().getPage().reload(); + UI.getCurrent().getSession().getCurrent().close(); + //UI.getCurrent().navigate("/"); return true; } catch (SQLException e) { diff --git a/src/main/java/mx/gob/jumapacelaya/Services/UserService.java b/src/main/java/mx/gob/jumapacelaya/Services/UserService.java index a936cee..5d8479b 100644 --- a/src/main/java/mx/gob/jumapacelaya/Services/UserService.java +++ b/src/main/java/mx/gob/jumapacelaya/Services/UserService.java @@ -20,11 +20,9 @@ public class UserService { public List getUsusarios() { List usuarios = new ArrayList<>(); - String query = "SELECT usuarioid, empleadoid, nombrecompleto " + - "FROM usuarios " + - "INNER JOIN empleados USING (usuarioid) " + - "WHERE uniorgid=12 AND fechabaja IS NULL AND fechabaj IS NULL AND regexp_like(puestoid, 'EJVEN') " + - "ORDER BY nombrecompleto"; + String query = "select usuarioid, empleadoid, nombrecompleto " + + "from soldigitusuarios " + + "order by nombrecompleto"; return jdbcTemplate.query(query, usuarioRowMapper()); } diff --git a/src/main/java/mx/gob/jumapacelaya/Services/ValidaLDAPUsuario.java b/src/main/java/mx/gob/jumapacelaya/Services/ValidaLDAPUsuario.java new file mode 100644 index 0000000..9c71d19 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/Services/ValidaLDAPUsuario.java @@ -0,0 +1,89 @@ +package mx.gob.jumapacelaya.Services; + +import java.util.Hashtable; + +import javax.naming.Context; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.Attributes; +import javax.naming.directory.SearchControls; +import javax.naming.directory.SearchResult; +import javax.naming.ldap.InitialLdapContext; +import javax.naming.ldap.LdapContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ValidaLDAPUsuario { + + private static final Logger logger = LoggerFactory.getLogger(ValidaLDAPUsuario.class); + + @Value("${spring.ldap.url}") + private String ldapUrl; + + @Value("${spring.ldap.base}") + private String ldapBase; + + public boolean autenticar(String username, String password) { + LdapContext ctx = null; + if (ldapUrl == null|| ldapUrl.trim().isEmpty()){ldapUrl="ldap://svradmin.jumapacelaya.gob.mx:389";} + if (ldapBase == null || ldapBase.trim().isEmpty()){ldapBase="dc=jumapacelaya,dc=gob,dc=mx";} + + try { + logger.info("Iniciando rutina autenticar con la URL ["+ldapUrl+"].."); + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.SECURITY_AUTHENTICATION, "simple"); + env.put(Context.SECURITY_PRINCIPAL, username + "@jumapacelaya.gob.mx"); + env.put(Context.SECURITY_CREDENTIALS, password); + env.put(Context.PROVIDER_URL, ldapUrl); + + logger.info("Autenticando al usuario ["+env.get(Context.SECURITY_PRINCIPAL)+"]"); + + ctx = new InitialLdapContext(env, null); + logger.info("Inicializando Contexto para realizar la busqueda.."); + + // Búsqueda de atributos del usuario + String searchFilter = "(&(objectClass=user)(sAMAccountName=" + username + "))"; + String searchBase = ldapBase; + + logger.info("Preparando la busqueda.."); + SearchControls searchControls = new SearchControls(); + searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); + searchControls.setReturningAttributes(new String[]{"sAMAccountName", "memberOf", "mail", "givenName", "sn"}); + + NamingEnumeration results = ctx.search(searchBase, searchFilter, searchControls); + + logger.info("Busqueda terminada.."); + + if (results.hasMore()) { + SearchResult result = results.next(); + Attributes attrs = result.getAttributes(); + // Procesar atributos y crear objeto de respuesta + logger.info("Usuario encontrado, regresando informacion.."); + return true; + } + + logger.info("No se encontro el usuario.."); + return false; + } catch (NamingException e) { + // La autenticación falló o hubo un error + logger.error("Error de autenticacion.."); + return false; + } finally { + if (ctx != null) { + try { + ctx.close(); + logger.info("Cierre de Contexto Terminado.."); + } catch (NamingException e) { + // Manejar error de cierre + logger.error("Error de autenticacion.."); + //return false; + } + } + } + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/views/CuestionarioView.java b/src/main/java/mx/gob/jumapacelaya/views/CuestionarioView.java index e204535..99451ff 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/CuestionarioView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/CuestionarioView.java @@ -9,12 +9,18 @@ import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.radiobutton.RadioButtonGroup; import com.vaadin.flow.component.radiobutton.RadioGroupVariant; import com.vaadin.flow.component.textfield.NumberField; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.BeforeEnterObserver; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.VaadinSession; + import de.f0rce.signaturepad.SignaturePad; import mx.gob.jumapacelaya.Services.GuardarSolicitudService; import mx.gob.jumapacelaya.Services.PredioService; import mx.gob.jumapacelaya.models.Predio; +import mx.gob.jumapacelaya.models.Usuario; +import oracle.net.aso.f; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -26,7 +32,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @PageTitle("Estudio Socioeconomico") @Route(value = "cuestionario", layout = MainLayout.class) -public class CuestionarioView extends VerticalLayout { +public class CuestionarioView extends VerticalLayout implements BeforeEnterObserver { + + Usuario usuario; + @Override + public void beforeEnter(BeforeEnterEvent event) { + usuario = (Usuario) VaadinSession.getCurrent().getAttribute("usuarioSesion"); + if (usuario == null) { + event.forwardTo("/"); + } + else + { + lblFirmaEje.setText("Firma [" + usuario.getNombre() + "]"); + } + } private final PredioService predioService; private final GuardarSolicitudService guardarSolicitudService; @@ -41,7 +60,9 @@ public class CuestionarioView extends VerticalLayout { private RadioButtonGroup opcionesZona= new RadioButtonGroup<>(); private RadioButtonGroup opcionesEscolar= new RadioButtonGroup<>(); private RadioButtonGroup opcionesEdad= new RadioButtonGroup<>(); + VerticalLayout botonLayout = new VerticalLayout(); private Button btnGuardar = new Button(); + H5 lblFirmaEje = new H5(); public CuestionarioView(PredioService predioService, GuardarSolicitudService guardarSolicitudService) { this.setSizeFull(); @@ -54,7 +75,6 @@ public class CuestionarioView extends VerticalLayout { vFirmaCuest.setHeight("200px"); vFirmaCuest.setPenColor("#000000"); vFirmaCuest.getElement().getStyle().set("border", "1px solid black"); - vFirmaCuest.setVisible(false); vFirmaCuest.setReadOnly(false); vFirmaCuest.getStyle().remove("pointer-events"); @@ -223,45 +243,45 @@ public class CuestionarioView extends VerticalLayout { /* Columnas rangos */ // Columna Rangos Ingreso - Span rango1 = new Span("$6,223.20 en adelante"); - Span rango2 = new Span("$ 2,500.01 a $ 6,223.19"); - Span rango3 = new Span("$ 2,000.01 a $ 2,500.00"); - Span rango4 = new Span("igual o menor a $ 2,000.00"); + Span rango1 = new Span("1. $6,223.20 en adelante"); + Span rango2 = new Span("2. $ 2,500.01 a $ 6,223.19"); + Span rango3 = new Span("3. $ 2,000.01 a $ 2,500.00"); + Span rango4 = new Span("4. igual o menor a $ 2,000.00"); // Columna Rangos Enfermedades - Span rangoenf1 = new Span("No padece enfermedad o discapacidad"); - Span rangoenf2 = new Span("Quien padece, no aporta económicamente"); - Span rangoenf3 = new Span("Quien padece, si aporta económicamente"); + Span rangoenf1 = new Span("1. No padece enfermedad o discapacidad"); + Span rangoenf2 = new Span("2. Quien padece, no aporta económicamente"); + Span rangoenf3 = new Span("3. Quien padece, si aporta económicamente"); // Columna Rangos Dependientes - Span rangoDepen1 = new Span("No tiene dependientes"); - Span rangoDepen2 = new Span("1 a 3"); - Span rangoDepen3 = new Span("4 a 6"); - Span rangoDepen4 = new Span("7 a 9"); + Span rangoDepen1 = new Span("1. No tiene dependientes"); + Span rangoDepen2 = new Span("2. 1 a 3"); + Span rangoDepen3 = new Span("3. 4 a 6"); + Span rangoDepen4 = new Span("4. 7 a 9"); // Columnas Rangos Acceso/Salud - Span rangoSalud1 = new Span("Particular"); - Span rangoSalud2 = new Span("IMSS o ISSTE"); - Span rangoSalud3 = new Span("ISAPEG"); - Span rangoSalud4 = new Span("Ninguno"); + Span rangoSalud1 = new Span("1. Particular"); + Span rangoSalud2 = new Span("2. IMSS o ISSTE"); + Span rangoSalud3 = new Span("3. ISAPEG"); + Span rangoSalud4 = new Span("4. Ninguno"); // Columnas Rangos Zona habitacional - Span rangoZona1 = new Span("Excelente"); - Span rangoZona2 = new Span("Buena"); - Span rangoZona3 = new Span("Regular"); - Span rangoZona4 = new Span("Mala"); + Span rangoZona1 = new Span("1. Excelente"); + Span rangoZona2 = new Span("2. Buena"); + Span rangoZona3 = new Span("3. Regular"); + Span rangoZona4 = new Span("4. Mala"); // Columna Rangos Escolaridad - Span rangoEscolar1 = new Span("Profesional"); - Span rangoEscolar2 = new Span("Preparatoria"); - Span rangoEscolar3 = new Span("Secundaria"); - Span rangoEscolar4 = new Span("Primaria o menos"); + Span rangoEscolar1 = new Span("1. Profesional"); + Span rangoEscolar2 = new Span("2. Preparatoria"); + Span rangoEscolar3 = new Span("3. Secundaria"); + Span rangoEscolar4 = new Span("4. Primaria o menos"); // Columna Rangos Edad - Span rangoEdad1 = new Span("18 a 30"); - Span rangoEdas2 = new Span("31 a 40"); - Span rangoEdad3 = new Span("41 a 60"); - Span rangoEdad4 = new Span("A partir de 61"); + Span rangoEdad1 = new Span("1. 18 a 30"); + Span rangoEdas2 = new Span("2. 31 a 40"); + Span rangoEdad3 = new Span("3. 41 a 60"); + Span rangoEdad4 = new Span("4. A partir de 61"); /* Columnas puntos */ // Columna puntos Ingresos @@ -383,19 +403,16 @@ public class CuestionarioView extends VerticalLayout { String parentesco = (String) UI.getCurrent().getSession().getAttribute("txtParentesco"); String tipoIdentificacion = (String) UI.getCurrent().getSession().getAttribute("cmbTipoIdentificacion"); String numIdentificacion = (String) UI.getCurrent().getSession().getAttribute("numIdentificacion"); - String usuarioId = (String) UI.getCurrent().getSession().getAttribute("usuarioId"); String firma = (String) UI.getCurrent().getSession().getAttribute("firma"); String email = (String) UI.getCurrent().getSession().getAttribute("email"); String estado = (String) UI.getCurrent().getSession().getAttribute("estado"); String detdesc = (String) UI.getCurrent().getSession().getAttribute("detdesc"); - //String firmaUsuario = (String) UI.getCurrent().getSession().getAttribute("firmaUsuario"); String detCalif = (String) UI.getCurrent().getSession().getAttribute("detCalif"); - logger.info("Predio: "+this.predio+" con tipo de solicitud: ["+tipoSolicitud+"] y nombre de Solicitante: "+ nombreSolicitante); // Boton para guardar la solicitud - btnGuardar = new Button("Guardar", event -> { + btnGuardar = new Button("Guardar Solicitud", event -> { boolean vGuardado=false; String vDetDesc=""; String vDetCalif=""; @@ -419,24 +436,28 @@ public class CuestionarioView extends VerticalLayout { parentesco, // String parentesco tipoIdentificacion, // String tipoIdentificacion numIdentificacion, // String numIdentificacion - usuarioId, // String usuarioId + usuario.getUsuarioId(), // String usuarioId firma, // String firma email, // String email - "", // boolean vigencia (ejemplo: true) + "", // Date vigencia vEstado, // String estado vDetDesc, // String detdesc ejecutivoSignBase64, // String firmaUsuario vDetCalif ); + + if (vGuardado) + { + UI.getCurrent().navigate("/"); + } }); btnGuardar.addThemeVariants(ButtonVariant.LUMO_PRIMARY); - btnGuardar.setVisible(false); - VerticalLayout botonLayout = new VerticalLayout(); botonLayout.setAlignItems(Alignment.CENTER); botonLayout.setWidthFull(); botonLayout.setHeightFull(); - botonLayout.add(vFirmaCuest, btnGuardar); + botonLayout.add(vFirmaCuest, btnGuardar, lblFirmaEje); + botonLayout.setVisible(false); // HorizontalLayout totalesLayout = new HorizontalLayout(puntos, descuento, txtAgua, txtDrena, txtTrata); @@ -474,7 +495,8 @@ public class CuestionarioView extends VerticalLayout { Runnable actualizarVisibilidad = () -> { boolean todosSelccionados = allRadioButtonsSelected(); - btnGuardar.setVisible(todosSelccionados); - vFirmaCuest.setVisible(todosSelccionados); + if(todosSelccionados){ + botonLayout.setVisible(true); + } }; } diff --git a/src/main/java/mx/gob/jumapacelaya/views/HomeView.java b/src/main/java/mx/gob/jumapacelaya/views/HomeView.java index d5da9a9..e2ff497 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/HomeView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/HomeView.java @@ -1,19 +1,24 @@ package mx.gob.jumapacelaya.views; +import com.vaadin.flow.component.Key; import com.vaadin.flow.component.UI; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.dialog.Dialog; +import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.H1; import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.notification.Notification.Position; import com.vaadin.flow.component.notification.NotificationVariant; import com.vaadin.flow.component.orderedlayout.FlexComponent; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.PasswordField; import com.vaadin.flow.router.*; import java.time.LocalDate; @@ -21,7 +26,12 @@ import java.time.format.TextStyle; import java.util.Locale; import mx.gob.jumapacelaya.Services.UserService; +import mx.gob.jumapacelaya.Services.ValidaLDAPUsuario; import mx.gob.jumapacelaya.models.Usuario; +import oracle.net.aso.l; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.lineawesome.LineAwesomeIconUrl; @@ -30,8 +40,12 @@ import org.vaadin.lineawesome.LineAwesomeIconUrl; @Menu(order = 0, icon = LineAwesomeIconUrl.FILE) public class HomeView extends VerticalLayout { + private static final Logger logger = LoggerFactory.getLogger(HomeView.class); private final UserService userService; private Usuario usuarioSeleccionado = null; + ValidaLDAPUsuario validador = new ValidaLDAPUsuario(); + HorizontalLayout cardLayout = new HorizontalLayout(); + ComboBox cmbUsuario = new ComboBox<>("Selecciona tu usuario"); @Autowired public HomeView(UserService userService) { @@ -85,13 +99,21 @@ public class HomeView extends VerticalLayout { VerticalLayout menuLayout = new VerticalLayout(); menuLayout.setSizeFull(); - - ComboBox cmbUsuario = new ComboBox<>("Selecciona tu usuario"); + //Combo Usuarios cmbUsuario.setWidth("20em"); cmbUsuario.setItems(userService.getUsusarios()); // Llenar el combo con los usuarios cmbUsuario.setItemLabelGenerator(Usuario::getNombre); - cmbUsuario.addValueChangeListener(event -> usuarioSeleccionado = event.getValue()); + //cmbUsuario.addValueChangeListener(event -> usuarioSeleccionado = event.getValue()); + + cmbUsuario.addValueChangeListener(event -> { + Usuario selectedUser = event.getValue(); + if (selectedUser != null) { + usuarioSeleccionado = selectedUser; + showPasswordDialog(selectedUser); + logger.info("Usuario seleccionado: "+selectedUser.getUsuarioId()); + } + }); String[][] opciones = { @@ -101,12 +123,12 @@ public class HomeView extends VerticalLayout { {"PGO y Tomas independientes", "pgotomasindep"} }; - - HorizontalLayout cardLayout = new HorizontalLayout(); + //Layout de Opciones: cardLayout.setWidthFull(); cardLayout.setSpacing(true); cardLayout.getStyle().set("flex-wrap", "wrap"); cardLayout.getStyle().set("justify-content", "center"); + cardLayout.setVisible(false); @@ -138,7 +160,8 @@ public class HomeView extends VerticalLayout { card.addClickListener(event -> { if (usuarioSeleccionado != null) { String username = usuarioSeleccionado.getUsuarioId(); - UI.getCurrent().navigate(route + "?usuarioid=" + username); + UI.getCurrent().getSession().setAttribute("usuarioSesion", usuarioSeleccionado); + UI.getCurrent().navigate(route); } else { notificacion("Por favor, selecciona un usuario primero."); @@ -184,4 +207,83 @@ public class HomeView extends VerticalLayout { notification.add(wrapper); notification.open(); } + + private void showPasswordDialog(Usuario usuario) { + Dialog dialog = new Dialog(); + dialog.setHeaderTitle("Ingresa tu contraseña " + usuario.getUsuarioId()); + dialog.setModal(true); + dialog.setDraggable(false); + dialog.setCloseOnEsc(false); + dialog.setCloseOnOutsideClick(false); + + VerticalLayout dialogLayout = new VerticalLayout(); + dialogLayout.setSpacing(true); + dialogLayout.setPadding(true); + + PasswordField passwordField = new PasswordField("Contraseña"); + passwordField.setWidth("100%"); + + Button confirmButton = new Button("Confirmar"); + confirmButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + + Div errorMessage = new Div(); + errorMessage.getStyle().setColor("var(--lumo-error-text-color)"); + errorMessage.setVisible(false); + + dialogLayout.add(passwordField, errorMessage, confirmButton); + dialog.add(dialogLayout); + + confirmButton.addClickListener(e -> { + String password = passwordField.getValue(); + + if (password == null || password.trim().isEmpty()) { + errorMessage.setText("La contraseña es requerida"); + errorMessage.setVisible(true); + return; + } + + // Llamada al servicio de validación + try { + logger.info("Validando Usuario: "+usuario.getUsuarioId()); + boolean isValid = validador.autenticar(usuario.getUsuarioId(), password); + if (isValid) { + // Procesar login exitoso + dialog.close(); + Notification.show("Acceso correcto", 3000, Position.TOP_CENTER) + .addThemeVariants(NotificationVariant.LUMO_SUCCESS); + // Lógica post-login + cardLayout.setVisible(true); + } else { + errorMessage.setText("Contraseña incorrecta"); + errorMessage.setVisible(true); + passwordField.clear(); + } + } catch (Exception ex) { + errorMessage.setText("Error al validar la contraseña: ["+ex.getMessage()+"]"); + errorMessage.setVisible(true); + } + }); + + Button cancelButton = new Button("Cancelar", e -> { + dialog.close(); + cmbUsuario.clear(); + }); + cancelButton.addThemeVariants(ButtonVariant.LUMO_ERROR); + + HorizontalLayout buttonLayout = new HorizontalLayout(confirmButton, cancelButton); + buttonLayout.setJustifyContentMode(JustifyContentMode.END); + dialogLayout.add(buttonLayout); + + passwordField.addKeyPressListener(Key.ENTER, e -> { + confirmButton.click(); + }); + + dialog.addDialogCloseActionListener(e -> { + cmbUsuario.clear(); + dialog.close(); + }); + + // Abre el dialog para la contraseña: + dialog.open(); + } } diff --git a/src/main/java/mx/gob/jumapacelaya/views/SolicitudDescView.java b/src/main/java/mx/gob/jumapacelaya/views/SolicitudDescView.java index 82d437f..a04847d 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/SolicitudDescView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/SolicitudDescView.java @@ -16,9 +16,12 @@ import com.vaadin.flow.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterObserver; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.VaadinSession; + import mx.gob.jumapacelaya.Services.GuardarSolicitudService; import mx.gob.jumapacelaya.Services.PredioService; import mx.gob.jumapacelaya.models.Predio; +import mx.gob.jumapacelaya.models.Usuario; import mx.gob.jumapacelaya.views.tiposSolicitud.InfraccionesView; import org.aspectj.weaver.ast.Not; import org.hibernate.annotations.DialectOverride; @@ -34,8 +37,20 @@ import java.util.List; @Route(value = "solidesc", layout = MainLayout.class) public class SolicitudDescView extends VerticalLayout implements BeforeEnterObserver { + Usuario usuario; + @Override + public void beforeEnter(BeforeEnterEvent event) { + usuario = (Usuario) VaadinSession.getCurrent().getAttribute("usuarioSesion"); + if (usuario == null) { + event.forwardTo("/"); + } + else + { + label.setText("Solicitud de Descuento en adeudo [" + usuario.getUsuarioId() + "]"); + } + } + private H3 label; - private String usuarioId; private final PredioService predioService; private final GuardarSolicitudService guardarSolicitudService; @@ -50,8 +65,6 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse formulario(); } - - private void cabezera() { HorizontalLayout encabezadoLayout = new HorizontalLayout(); @@ -102,6 +115,19 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse Span labelTexto = new Span(); labelTexto.setText("Prepara la solicitud:"); + Button btnCierraSesion = new Button("Cerrar Sesion"); + btnCierraSesion.addThemeVariants(ButtonVariant.LUMO_ERROR); + btnCierraSesion.addThemeVariants(ButtonVariant.LUMO_SMALL); + + btnCierraSesion.addClickListener(event -> { + UI.getCurrent().getSession().setAttribute("usuarioSesion", null); + UI.getCurrent().getPage().reload(); + UI.getCurrent().getSession().getCurrent().close(); + UI.getCurrent().navigate("/"); + }); + + HorizontalLayout hltSesion=new HorizontalLayout(); + hltSesion.add(label, btnCierraSesion); RadioButtonGroup tipoSolicitudGroup = new RadioButtonGroup<>("Elige el tipo de Solicitud:"); tipoSolicitudGroup.setItems("Recargos", "Infracciones", "Ajuste de Facturas", "Descuento Especial Pago Anual"); @@ -201,7 +227,6 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse UI.getCurrent().getSession().setAttribute("txtParentesco", txtParentesco.getValue()); UI.getCurrent().getSession().setAttribute("cmbTipoIdentificacion", tipoIden); UI.getCurrent().getSession().setAttribute("numIdentificacion", numIdentificacion.getValue()); - UI.getCurrent().getSession().setAttribute("usuarioId", usuarioId); if (!url.isEmpty()) { UI.getCurrent().navigate(url); @@ -215,7 +240,7 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse }); identificacionLayout.add(cmbTipoIdentificacion, numIdentificacion); - formularioLayout.add(label, labelTexto, + formularioLayout.add(hltSesion, labelTexto, tipoSolicitudGroup, predioTxt, solicitante, identificacionTexto, identificacionLayout, txtParentesco); @@ -223,6 +248,7 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse this.add(formularioLayout, btnVerSolicitud); } + /* @Override public void beforeEnter(BeforeEnterEvent event) { usuarioId = event.getLocation().getQueryParameters().getParameters().get("usuarioid") != null @@ -237,4 +263,5 @@ public class SolicitudDescView extends VerticalLayout implements BeforeEnterObse UI.getCurrent().navigate("/"); } } + */ } diff --git a/src/main/java/mx/gob/jumapacelaya/views/VerificacionView.java b/src/main/java/mx/gob/jumapacelaya/views/VerificacionView.java index 44ccd58..1ee6677 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/VerificacionView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/VerificacionView.java @@ -83,6 +83,16 @@ public class VerificacionView extends VerticalLayout implements BeforeEnterObser formularioLayout.setSpacing(true); formularioLayout.setPadding(true); + Button btnCerrarSesion = new Button("Cerrar Sesion"); + + btnCerrarSesion.addClickListener(event -> { + UI.getCurrent().getSession().setAttribute("usuarioSesion", null); + UI.getCurrent().getPage().reload(); + UI.getCurrent().getSession().getCurrent().close(); + UI.getCurrent().navigate("/"); + + }); + label = new H3("Solicitud de Descuento en adeudo [USUARIO]"); Span labelTexto = new Span("Prepara la solicitud:"); @@ -141,7 +151,7 @@ public class VerificacionView extends VerticalLayout implements BeforeEnterObser }); - formularioLayout.add(label, labelTexto, + formularioLayout.add(label, btnCerrarSesion, labelTexto, predioTxT, solicitante, identificacionLayout); diff --git a/src/main/java/mx/gob/jumapacelaya/views/redirInicio.java b/src/main/java/mx/gob/jumapacelaya/views/redirInicio.java new file mode 100644 index 0000000..7f9eefc --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/views/redirInicio.java @@ -0,0 +1,21 @@ +package mx.gob.jumapacelaya.views; + +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.BeforeEnterObserver; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.VaadinSession; + +import mx.gob.jumapacelaya.models.Usuario; + +@PageTitle("Solicitud de Descuento") +@Route(value = "solicatenusu/inicio", layout = MainLayout.class) +public class redirInicio extends VerticalLayout implements BeforeEnterObserver{ + @Override + public void beforeEnter(BeforeEnterEvent event) { + + event.forwardTo("/"); + + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/views/tiposSolicitud/DescEspView.java b/src/main/java/mx/gob/jumapacelaya/views/tiposSolicitud/DescEspView.java index f1410c9..8cbb3ef 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/tiposSolicitud/DescEspView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/tiposSolicitud/DescEspView.java @@ -33,6 +33,7 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { private Predio predio; Span nombreCliente = new Span(); private SignaturePad userPadDesc; + H2 presolicitud = new H2(); public DescEspView(PredioService predioService, GuardarSolicitudService guardarSolicitudService) { @@ -48,6 +49,18 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { String numIdentificacion = (String) UI.getCurrent().getSession().getAttribute("numIdentificacion"); String usuarioId = (String) UI.getCurrent().getSession().getAttribute("usuarioId"); + if(predio.getTarifaid()!=101 && predio.getTarifaid()!=108 && predio.getTarifaid()!=131) + { + notifiError("No debemos aplicar descuento con esta tarifa ["+predio.getTarifaid()+"-"+predio.getTarifa()+"]"); + presolicitud.setText("No debemos aplicar descuento con esta tarifa ["+predio.getTarifaid()+"-"+predio.getTarifa()+"]"); + presolicitud.getStyle().set("color", "red"); + } + else + { + presolicitud.setText("PreSolicitud"); + presolicitud.getStyle().set("color", "black"); + } + // Verificar que los datos estén disponibles if (predio == null || tipoSolicitud == null || nombreSolicitante == null) { Notification.show("Faltan datos importantes. Por favor ingresa la solicitud nuevamente.", 3000, Notification.Position.MIDDLE); @@ -93,9 +106,6 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { Span fecha = new Span(); fecha.setText("Celaya, Guanajuato a " + fechaFormateada); - H2 presolicitud = new H2(); - presolicitud.setText("PreSolicitud"); - encabezadoLayout.add(fecha); encabezadoLayout.addAndExpand(new HorizontalLayout()); encabezadoLayout.add(presolicitud); @@ -133,7 +143,7 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { parrafo1.setText( "Sirva este medio para solicitar de la manera más atenta se me valore mi condición socioeconómica, " + "ya que por el momento no cuento con la solvencia económica suficiente para pagar la tarifa del " + - "presente año que corresponde al domicilio que habito ubicado en: " + predio.getDirecmostrar() + "año 2025 que corresponde al domicilio que habito ubicado en: " + predio.getDirecmostrar() ); parrafo1.getStyle().set("text-align", "justify"); @@ -158,7 +168,6 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { this.add(bodyLayout); } - private void sign() { VerticalLayout signLayout = new VerticalLayout(); userPadDesc = new SignaturePad(); @@ -227,4 +236,36 @@ public class DescEspView extends VerticalLayout implements BeforeEnterObserver { nombreCliente.setText("Sin solicitante"); } } + + private void notifiError(String message) { + Notification notification = new Notification(); + notification.setPosition(Notification.Position.TOP_CENTER); + notification.addThemeVariants(NotificationVariant.LUMO_ERROR); + notification.setDuration(7000); + + Icon warningIcon = new Icon(VaadinIcon.CLOSE_CIRCLE_O); + warningIcon.setSize("48px"); + warningIcon.getStyle().set("margin-bottom", "10px"); + + + Paragraph messajeTexto = new Paragraph(message); + messajeTexto.getStyle().set("margin", "0").set("text-align", "center"); + + + HorizontalLayout buttonsLayout = new HorizontalLayout(warningIcon, messajeTexto); + buttonsLayout.setAlignItems(Alignment.CENTER); + buttonsLayout.setSpacing(false); + buttonsLayout.setPadding(false); + buttonsLayout.setWidthFull(); + + HorizontalLayout wrapper = new HorizontalLayout(buttonsLayout); + wrapper.setPadding(true); + wrapper.setSpacing(false); + wrapper.getStyle().set("position", "relative"); + wrapper.getStyle().set("padding", "10px"); + wrapper.setWidth("100%"); + + notification.add(wrapper); + notification.open(); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d7f0b6e..00e7311 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,4 +35,10 @@ spring.datasource.hikari.data-source-properties.oracle.net.CONNECT_TIMEOUT=10000 spring.datasource.hikari.data-source-properties.oracle.jdbc.ReadTimeout=30000 # Validación de conexiones -spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL \ No newline at end of file +spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL + +#LDAP Config +spring.ldap.url=ldap://svradmin.jumapacelaya.gob.mx:389 +spring.ldap.base=dc=jumapacelaya,dc=gob,dc=mx +spring.ldap.username=uid=administrator,ou=system +spring.ldap.password=Dr3na$134%4guA \ No newline at end of file