From 062fe315e03d5b95b50b7b95497a8910d7c3f695 Mon Sep 17 00:00:00 2001 From: jon ander Date: Tue, 13 May 2025 16:28:25 +0200 Subject: [PATCH] Enhance button management and user services; refactor BotonDTO and BotonManager, add Factura and Item repositories and services, and update UserController for product handling --- .../controllers/UserController.java | 56 ++++++++++-- .../GestionInventario/dto/BotonDTO.java | 59 ++----------- .../GestionInventario/dto/BotonManager.java | 82 +++++++----------- .../GestionInventario/entities/User.java | 7 +- .../repos/DepartamentoRepository.java | 2 +- .../repos/FacturaRepository.java | 9 ++ .../repos/ItemRepository.java | 10 +++ .../repos/ProductoRepository.java | 12 +++ .../repos/PropiedadRepository.java | 10 +++ .../repos/ProveedorRepository.java | 9 ++ .../repos/TipoDatoRepository.java | 9 ++ .../repos/UbicacionRepository.java | 10 +++ .../repos/ValorRepository.java | 9 ++ .../services/DepartamentoService.java | 3 + .../services/FacturaService.java | 13 +++ .../services/ItemService.java | 13 +++ .../services/ProductoService.java | 23 +++++ .../services/PropiedadService.java | 13 +++ .../services/ProveedorService.java | 13 +++ .../services/TipoDatoService.java | 13 +++ .../services/UbicacionService.java | 13 +++ .../services/UserService.java | 6 +- .../services/ValorService.java | 13 +++ src/main/resources/db/Modelo_Inventario.mwb | Bin 18267 -> 18219 bytes 24 files changed, 293 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/FacturaRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/ItemRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/ProductoRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/PropiedadRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/ProveedorRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/TipoDatoRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/UbicacionRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/ValorRepository.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/FacturaService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/ItemService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/ProductoService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/PropiedadService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/ProveedorService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/TipoDatoService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/UbicacionService.java create mode 100644 src/main/java/com/ieslamar/GestionInventario/services/ValorService.java diff --git a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java index 7b96a24..cb8c86f 100644 --- a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java +++ b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java @@ -5,10 +5,13 @@ import com.ieslamar.GestionInventario.dto.BotonManager; import com.ieslamar.GestionInventario.entities.*; import com.ieslamar.GestionInventario.services.CategoriaService; import com.ieslamar.GestionInventario.services.DepartamentoService; +import com.ieslamar.GestionInventario.services.ProductoService; import com.ieslamar.GestionInventario.services.UserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyProperties; import org.springframework.context.ApplicationContext; import org.springframework.security.core.Authentication; +import org.springframework.security.core.CredentialsContainer; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -23,31 +26,46 @@ import java.util.*; public class UserController { @Autowired private ApplicationContext context; - private static final Logger logger = LoggerFactory.getLogger(UserController.class); - + private static final Logger logger = LoggerFactory.getLogger(UserController.class); +//SERVICES---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- private final UserService userService; private final DepartamentoService departamentoService; private final CategoriaService categoriaService; + private final ProductoService productoService; +//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- private final BotonManager botonManager; - public UserController(UserService userService, DepartamentoService departamentoService, CategoriaService categoriaService, BotonManager botonManager) { + public UserController(UserService userService, DepartamentoService departamentoService, CategoriaService categoriaService, ProductoService productoService, BotonManager botonManager) { this.userService = userService; this.departamentoService = departamentoService; this.categoriaService = categoriaService; + this.productoService = productoService; this.botonManager = botonManager; } - + private User getCurrentUser(){ + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) auth.getPrincipal(); + auth.getCredentials(); + return userService.getUserByName(springUser.getUsername()); + } private List filtrarBotones(Authentication auth, List botones) { List botones_response = new ArrayList<>(); List roles = auth.getAuthorities() .stream() .map(GrantedAuthority::getAuthority) .toList(); + User currentUser = getCurrentUser(); if (roles.contains("ROLE_ADMIN")) { return botones; } - for (BotonDTO botone : botones) { - if (!botone.isRequireAdmin()) { - botones_response.add(botone); + for (BotonDTO boton : botones) { + if (!boton.isRequireAdmin()) { + if(boton.getDepartamento()== null){ + logger.info("test"); + botones_response.add(boton); + }else { + if(boton.getDepartamento().getNombre().equals(currentUser.getDepartamento().getNombre())) + botones_response.add(boton); + } } } return botones_response; @@ -79,7 +97,6 @@ public class UserController { botonManager.getGestionCategorias(), botonManager.getGestionUbicaciones(), botonManager.getGestionInventario(), - botonManager.getGestionCategorias(), botonManager.getGestionTiposDatos(), botonManager.getHome() ))); @@ -202,7 +219,28 @@ public class UserController { // return "userPage"; // Redirige a la página de registro // } - + //PRODUCTOS-------------------------------------------------------------------------------------------------------- + @GetMapping("/producto_list") + public String productoList(Model model) { + model.addAttribute("title", "Gestión de Productos de" + getCurrentUser().getDepartamento().getNombre()); + model.addAttribute("headers", List.of("ID", "Nombre","Categoría","Desc")); + model.addAttribute( + "items", + productoService.getAllProductos().stream().map(departamento -> Map.of( + "id", departamento.getId(), + "values", List.of( + departamento.getId(), + departamento.getNombre()) + )).toList() + ); + model.addAttribute("actionsUrl", Map.of( + "edit", "", + "delete", "" + )); + model.addAttribute("backUrl", "/Inventario/home"); + model.addAttribute("addUrl", "/Inventario/"); + return "list"; + } //DEPARTAMENTOS-------------------------------------------------------------------------------------------------------- @GetMapping("/departamento_list") diff --git a/src/main/java/com/ieslamar/GestionInventario/dto/BotonDTO.java b/src/main/java/com/ieslamar/GestionInventario/dto/BotonDTO.java index e0da3e5..28d3c8b 100644 --- a/src/main/java/com/ieslamar/GestionInventario/dto/BotonDTO.java +++ b/src/main/java/com/ieslamar/GestionInventario/dto/BotonDTO.java @@ -1,65 +1,19 @@ package com.ieslamar.GestionInventario.dto; +import com.ieslamar.GestionInventario.entities.Departamento; +import lombok.Builder; import lombok.Getter; import lombok.Setter; import org.springframework.stereotype.Component; - +@Getter +@Setter +@Builder public class BotonDTO { private String texto; private String url; private boolean requireAdmin; private String cssClass; - - public BotonDTO(String texto, String url) { - this(texto, url, false, null); - } - - public BotonDTO(String texto, String url, boolean requireAdmin) { - this(texto, url, requireAdmin, null); - } - - public BotonDTO(String texto, String url, String cssClass) { - this(texto, url, false, cssClass); - } - - public BotonDTO(String texto, String url, boolean requireAdmin, String cssClass) { - this.texto = texto; - this.url = url; - this.requireAdmin = requireAdmin; - this.cssClass = cssClass; - } - - public String getTexto() { - return texto; - } - - public void setTexto(String texto) { - this.texto = texto; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public boolean isRequireAdmin() { - return requireAdmin; - } - - public void setRequireAdmin(boolean requireAdmin) { - this.requireAdmin = requireAdmin; - } - - public String getCssClass() { - return cssClass; - } - - public void setCssClass(String cssClass) { - this.cssClass = cssClass; - } + private Departamento departamento; @Override public String toString() { @@ -68,6 +22,7 @@ public class BotonDTO { ", url='" + url + '\'' + ", requireAdmin=" + requireAdmin + ", cssClass='" + cssClass + '\'' + + ", departamento='" + departamento.getNombre() + '\'' + '}'; } } diff --git a/src/main/java/com/ieslamar/GestionInventario/dto/BotonManager.java b/src/main/java/com/ieslamar/GestionInventario/dto/BotonManager.java index 2ebd91c..67ca17d 100644 --- a/src/main/java/com/ieslamar/GestionInventario/dto/BotonManager.java +++ b/src/main/java/com/ieslamar/GestionInventario/dto/BotonManager.java @@ -1,64 +1,46 @@ package com.ieslamar.GestionInventario.dto; +import com.ieslamar.GestionInventario.services.DepartamentoService; +import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @Component +@Getter public class BotonManager { - private final BotonDTO gestionUsuarios = new BotonDTO("Gestión de usuarios", "/user_list", true, null); - private final BotonDTO gestionProductos = new BotonDTO("Gestión de Productos", "/user_management", true, null); - private final BotonDTO gestionDepartamentos = new BotonDTO("Gestión de Departamentos", "/departamento_list", false, null); - private final BotonDTO gestionCategorias = new BotonDTO("Gestión de Categorías", "/user_management", true, null); - private final BotonDTO gestionUbicaciones = new BotonDTO("Gestión de Ubicaciones", "/user_management", true, null); - private final BotonDTO gestionInventario = new BotonDTO("Gestión de Inventario", "/inventario", true, null); - private final BotonDTO gestionTiposDatos = new BotonDTO("Gestión de Tipos de dato", "/user_management", true, null); + private final DepartamentoService departamentoService; + private final BotonDTO gestionUsuarios ; + private final BotonDTO gestionProductos ; + private final BotonDTO gestionDepartamentos; + private final BotonDTO gestionCategorias ; + private final BotonDTO gestionUbicaciones ; + private final BotonDTO gestionInventario ; + private final BotonDTO gestionTiposDatos ; - private final BotonDTO inventario = new BotonDTO("Inventario", "/management", false, null); - private final BotonDTO gestion = new BotonDTO("Gestión", "/management", true, null); + private final BotonDTO verProductos; - private final BotonDTO home = new BotonDTO("Salir", "/home", false, "button_salir"); - public BotonManager() { + + private final BotonDTO inventario; + private final BotonDTO gestion = BotonDTO.builder().texto("Gestión").url("/management").requireAdmin(true).build(); + + private final BotonDTO home = BotonDTO.builder().texto("Salir").url("/home").requireAdmin(false).cssClass("button_salir").build(); + public BotonManager(DepartamentoService departamentoService) { + this.departamentoService = departamentoService; + + this.verProductos = BotonDTO.builder().build(); + + + + this.gestionDepartamentos = BotonDTO.builder().texto("Gestión de Departamentos").url("/departamento_list").requireAdmin(false).build(); + this.inventario = BotonDTO.builder().texto("Inventario").url("/management").requireAdmin(false).build(); + this.gestionUsuarios= BotonDTO.builder().texto("Gestión de usuarios").url( "/user_list").requireAdmin(true).build(); + this.gestionProductos= BotonDTO.builder().texto("Gestión de Productos").url("/user_management").requireAdmin(true).build(); + this.gestionCategorias= BotonDTO.builder().texto("Gestión de Categorías").url("/user_management").requireAdmin(true).build(); + this.gestionUbicaciones= BotonDTO.builder().texto("Gestión de Ubicaciones").url("/user_management").requireAdmin(true).build(); + this.gestionInventario= BotonDTO.builder().texto("Gestión de Inventario").url("/inventario").requireAdmin(true).build(); + this.gestionTiposDatos= BotonDTO.builder().texto("Gestión de Tipos de dato").url("/user_management").requireAdmin(true).build(); } - public BotonDTO getGestionUsuarios() { - return gestionUsuarios; - } - - public BotonDTO getGestionProductos() { - return gestionProductos; - } - - public BotonDTO getGestionDepartamentos() { - return gestionDepartamentos; - } - - public BotonDTO getGestionCategorias() { - return gestionCategorias; - } - - public BotonDTO getGestionUbicaciones() { - return gestionUbicaciones; - } - - public BotonDTO getGestionInventario() { - return gestionInventario; - } - - public BotonDTO getGestionTiposDatos() { - return gestionTiposDatos; - } - - public BotonDTO getInventario() { - return inventario; - } - - public BotonDTO getGestion() { - return gestion; - } - - public BotonDTO getHome() { - return home; - } } diff --git a/src/main/java/com/ieslamar/GestionInventario/entities/User.java b/src/main/java/com/ieslamar/GestionInventario/entities/User.java index 544a281..d8cc555 100644 --- a/src/main/java/com/ieslamar/GestionInventario/entities/User.java +++ b/src/main/java/com/ieslamar/GestionInventario/entities/User.java @@ -1,8 +1,13 @@ package com.ieslamar.GestionInventario.entities; +import com.ieslamar.GestionInventario.repos.UserRepository; import jakarta.persistence.*; import lombok.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import java.util.Collection; import java.util.List; @Entity @@ -12,6 +17,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class User { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // ID autoincremental private Long id; @@ -36,7 +42,6 @@ public class User { @JoinColumn(name = "departamentos_iddepartamentos", nullable = true) private Departamento departamento; - } diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/DepartamentoRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/DepartamentoRepository.java index 197ea57..7faa43a 100644 --- a/src/main/java/com/ieslamar/GestionInventario/repos/DepartamentoRepository.java +++ b/src/main/java/com/ieslamar/GestionInventario/repos/DepartamentoRepository.java @@ -7,5 +7,5 @@ import org.springframework.stereotype.Repository; @Repository public interface DepartamentoRepository extends JpaRepository { - + Departamento getDepartamentoByNombre(String nombre); } \ No newline at end of file diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/FacturaRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/FacturaRepository.java new file mode 100644 index 0000000..5c5fe12 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/FacturaRepository.java @@ -0,0 +1,9 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Factura; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FacturaRepository extends JpaRepository { +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/ItemRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/ItemRepository.java new file mode 100644 index 0000000..c25e873 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/ItemRepository.java @@ -0,0 +1,10 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Item; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ItemRepository extends JpaRepository { + +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/ProductoRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/ProductoRepository.java new file mode 100644 index 0000000..99c8112 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/ProductoRepository.java @@ -0,0 +1,12 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Producto; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ProductoRepository extends JpaRepository { + +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/PropiedadRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/PropiedadRepository.java new file mode 100644 index 0000000..b323824 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/PropiedadRepository.java @@ -0,0 +1,10 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Propiedad; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PropiedadRepository extends JpaRepository { + +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/ProveedorRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/ProveedorRepository.java new file mode 100644 index 0000000..20d1aae --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/ProveedorRepository.java @@ -0,0 +1,9 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Proveedor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProveedorRepository extends JpaRepository { +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/TipoDatoRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/TipoDatoRepository.java new file mode 100644 index 0000000..c07783a --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/TipoDatoRepository.java @@ -0,0 +1,9 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.TipoDato; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TipoDatoRepository extends JpaRepository { +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/UbicacionRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/UbicacionRepository.java new file mode 100644 index 0000000..589e6c6 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/UbicacionRepository.java @@ -0,0 +1,10 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Ubicacion; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UbicacionRepository extends JpaRepository { + +} diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/ValorRepository.java b/src/main/java/com/ieslamar/GestionInventario/repos/ValorRepository.java new file mode 100644 index 0000000..e6fdd55 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/repos/ValorRepository.java @@ -0,0 +1,9 @@ +package com.ieslamar.GestionInventario.repos; + +import com.ieslamar.GestionInventario.entities.Valor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ValorRepository extends JpaRepository { +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java b/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java index f505a99..2215595 100644 --- a/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java +++ b/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java @@ -27,4 +27,7 @@ public class DepartamentoService { } + public Departamento getDepartamentoByName(String nombre) { + return departamentoRepository.getDepartamentoByNombre(nombre); + } } diff --git a/src/main/java/com/ieslamar/GestionInventario/services/FacturaService.java b/src/main/java/com/ieslamar/GestionInventario/services/FacturaService.java new file mode 100644 index 0000000..084d093 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/FacturaService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.FacturaRepository; +import org.springframework.stereotype.Service; + +@Service +public class FacturaService { + private final FacturaRepository facturaRepository; + + public FacturaService(FacturaRepository facturaRepository) { + this.facturaRepository = facturaRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/ItemService.java b/src/main/java/com/ieslamar/GestionInventario/services/ItemService.java new file mode 100644 index 0000000..bbdbaca --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/ItemService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.ItemRepository; +import org.springframework.stereotype.Service; + +@Service +public class ItemService { + private final ItemRepository itemRepository; + + public ItemService(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/ProductoService.java b/src/main/java/com/ieslamar/GestionInventario/services/ProductoService.java new file mode 100644 index 0000000..3fc94f4 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/ProductoService.java @@ -0,0 +1,23 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.entities.Departamento; +import com.ieslamar.GestionInventario.entities.Producto; +import com.ieslamar.GestionInventario.repos.ProductoRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProductoService { + private final ProductoRepository productoRepository; + + public ProductoService(ProductoRepository productoRepository) { + this.productoRepository = productoRepository; + } + public List getAllProductos(){ + return productoRepository.findAll(); + } + public Producto getProductoById(Integer id) { + return productoRepository.findById(id).orElse(null); + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/PropiedadService.java b/src/main/java/com/ieslamar/GestionInventario/services/PropiedadService.java new file mode 100644 index 0000000..5f6be1a --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/PropiedadService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.PropiedadRepository; +import org.springframework.stereotype.Service; + +@Service +public class PropiedadService { + private final PropiedadRepository propiedadRepository; + + public PropiedadService(PropiedadRepository propiedadRepository) { + this.propiedadRepository = propiedadRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/ProveedorService.java b/src/main/java/com/ieslamar/GestionInventario/services/ProveedorService.java new file mode 100644 index 0000000..24c53bc --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/ProveedorService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.ProveedorRepository; +import org.springframework.stereotype.Service; + +@Service +public class ProveedorService { + private final ProveedorRepository proveedorRepository; + + public ProveedorService(ProveedorRepository proveedorRepository) { + this.proveedorRepository = proveedorRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/TipoDatoService.java b/src/main/java/com/ieslamar/GestionInventario/services/TipoDatoService.java new file mode 100644 index 0000000..2d3dcba --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/TipoDatoService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.TipoDatoRepository; +import org.springframework.stereotype.Service; + +@Service +public class TipoDatoService { + private final TipoDatoRepository tipoDatoRepository; + + public TipoDatoService(TipoDatoRepository tipoDatoRepository) { + this.tipoDatoRepository = tipoDatoRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/UbicacionService.java b/src/main/java/com/ieslamar/GestionInventario/services/UbicacionService.java new file mode 100644 index 0000000..1ec8355 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/UbicacionService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.UbicacionRepository; +import org.springframework.stereotype.Service; + +@Service +public class UbicacionService { + private final UbicacionRepository ubicacionRepository; + + public UbicacionService(UbicacionRepository ubicacionRepository) { + this.ubicacionRepository = ubicacionRepository; + } +} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/UserService.java b/src/main/java/com/ieslamar/GestionInventario/services/UserService.java index d467267..403cd90 100644 --- a/src/main/java/com/ieslamar/GestionInventario/services/UserService.java +++ b/src/main/java/com/ieslamar/GestionInventario/services/UserService.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Objects; @Service -public class UserService { +public class UserService{ @Autowired public UserRepository userRepository; private final PasswordEncoder passwordEncoder; @@ -58,4 +58,8 @@ public class UserService { original.setDepartamento(user.getDepartamento()); userRepository.save(original); } + + public User getUserByName(String name) { + return userRepository.findByNombre(name).orElse(null); + } } diff --git a/src/main/java/com/ieslamar/GestionInventario/services/ValorService.java b/src/main/java/com/ieslamar/GestionInventario/services/ValorService.java new file mode 100644 index 0000000..38d52b8 --- /dev/null +++ b/src/main/java/com/ieslamar/GestionInventario/services/ValorService.java @@ -0,0 +1,13 @@ +package com.ieslamar.GestionInventario.services; + +import com.ieslamar.GestionInventario.repos.ValorRepository; +import org.springframework.stereotype.Service; + +@Service +public class ValorService { + private final ValorRepository valorRepository; + + public ValorService(ValorRepository valorRepository) { + this.valorRepository = valorRepository; + } +} diff --git a/src/main/resources/db/Modelo_Inventario.mwb b/src/main/resources/db/Modelo_Inventario.mwb index 36f9a692bab556a844180353a0941200d8bd3b74..d1d1c8d7c60671912866ff07e3200e5424291d68 100644 GIT binary patch delta 15647 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