From 758f4ced0cc3f3f8b4626db09ec9910523a1a6b2 Mon Sep 17 00:00:00 2001 From: Jorge Berlanaga Date: Wed, 17 Jun 2026 09:05:40 +0200 Subject: [PATCH] En la rama inversion, he desacoplado e inyectado las dependencias de forma manual. --- src/main/java/org/biblioteca/Aplicacion.java | 10 +- .../biblioteca/interfaz/MenuPrincipal.java | 12 +- .../org/biblioteca/negocio/GestionLibros.java | 39 +----- .../biblioteca/negocio/GestionLibrosImpl.java | 51 ++++++++ .../biblioteca/negocio/GestionPrestamos.java | 80 +----------- .../negocio/GestionPrestamosImpl.java | 88 +++++++++++++ .../org/biblioteca/negocio/GestionSocios.java | 35 +----- .../biblioteca/negocio/GestionSociosImpl.java | 46 +++++++ .../biblioteca/repositorio/AlmacenLibros.java | 103 ++-------------- .../repositorio/AlmacenLibrosImpl.java | 116 ++++++++++++++++++ .../repositorio/AlmacenPrestamos.java | 103 ++-------------- .../repositorio/AlmacenPrestamosImpl.java | 116 ++++++++++++++++++ .../biblioteca/repositorio/AlmacenSocios.java | 92 ++------------ .../repositorio/AlmacenSociosImpl.java | 104 ++++++++++++++++ .../classes/org/biblioteca/Aplicacion.class | Bin 2155 -> 3423 bytes .../biblioteca/interfaz/MenuPrincipal.class | Bin 8963 -> 9096 bytes .../biblioteca/negocio/GestionLibros.class | Bin 1699 -> 571 bytes .../biblioteca/negocio/GestionPrestamos.class | Bin 3241 -> 533 bytes .../biblioteca/negocio/GestionSocios.class | Bin 1558 -> 511 bytes .../repositorio/AlmacenLibros$1.class | Bin 715 -> 0 bytes .../repositorio/AlmacenLibros.class | Bin 5274 -> 627 bytes .../repositorio/AlmacenPrestamos$1.class | Bin 736 -> 0 bytes .../repositorio/AlmacenPrestamos.class | Bin 5349 -> 643 bytes .../repositorio/AlmacenSocios$1.class | Bin 715 -> 0 bytes .../repositorio/AlmacenSocios.class | Bin 4981 -> 570 bytes 25 files changed, 574 insertions(+), 421 deletions(-) create mode 100644 src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java create mode 100644 src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java create mode 100644 src/main/java/org/biblioteca/negocio/GestionSociosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java create mode 100644 src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenPrestamos$1.class delete mode 100644 target/classes/org/biblioteca/repositorio/AlmacenSocios$1.class diff --git a/src/main/java/org/biblioteca/Aplicacion.java b/src/main/java/org/biblioteca/Aplicacion.java index 3e3821a..97944a4 100644 --- a/src/main/java/org/biblioteca/Aplicacion.java +++ b/src/main/java/org/biblioteca/Aplicacion.java @@ -1,12 +1,20 @@ package org.biblioteca; import org.biblioteca.interfaz.MenuPrincipal; +import org.biblioteca.negocio.*; +import org.biblioteca.repositorio.*; import java.util.Scanner; public class Aplicacion { + private static final AlmacenLibros almacenLibros = new AlmacenLibrosImpl(); + private static final AlmacenPrestamos almacenPrestamos = new AlmacenPrestamosImpl(); + private static final AlmacenSocios almacenSocios = new AlmacenSociosImpl(); + private static final GestionLibros gestionLibros = new GestionLibrosImpl(almacenLibros); + private static final GestionPrestamos gestionPestamos = new GestionPrestamosImpl(almacenPrestamos, almacenLibros, almacenSocios); + private static final GestionSocios gestionSocios = new GestionSociosImpl(almacenSocios); private static final Scanner lector = new Scanner(System.in); - private static final MenuPrincipal menu = new MenuPrincipal(lector); + private static final MenuPrincipal menu = new MenuPrincipal(lector, gestionLibros, gestionPestamos, gestionSocios); public static void main(String[] args) { boolean continuar = true; diff --git a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java index c5fa648..a30b71a 100644 --- a/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java +++ b/src/main/java/org/biblioteca/interfaz/MenuPrincipal.java @@ -3,9 +3,7 @@ import org.biblioteca.entidades.Libro; import org.biblioteca.entidades.Prestamo; import org.biblioteca.entidades.Socio; -import org.biblioteca.negocio.GestionLibros; -import org.biblioteca.negocio.GestionPrestamos; -import org.biblioteca.negocio.GestionSocios; +import org.biblioteca.negocio.*; import java.time.LocalDate; import java.util.List; @@ -18,11 +16,11 @@ public class MenuPrincipal { private final GestionSocios gestionSocios; private final GestionPrestamos gestionPrestamos; - public MenuPrincipal(Scanner lector) { + public MenuPrincipal(Scanner lector, GestionLibros gestionLibros, GestionPrestamos gestionPrestamos, GestionSocios gestionSocios) { this.lector = lector; - this.gestionLibros = new GestionLibros(); - this.gestionSocios = new GestionSocios(); - this.gestionPrestamos = new GestionPrestamos(); + this.gestionLibros = gestionLibros; + this.gestionSocios = gestionSocios; + this.gestionPrestamos = gestionPrestamos; } public void mostrarMenuLibros() { diff --git a/src/main/java/org/biblioteca/negocio/GestionLibros.java b/src/main/java/org/biblioteca/negocio/GestionLibros.java index a45419f..823be30 100644 --- a/src/main/java/org/biblioteca/negocio/GestionLibros.java +++ b/src/main/java/org/biblioteca/negocio/GestionLibros.java @@ -1,45 +1,18 @@ package org.biblioteca.negocio; import org.biblioteca.entidades.Libro; -import org.biblioteca.repositorio.AlmacenLibros; import java.util.List; import java.util.Optional; -public class GestionLibros { - private final AlmacenLibros almacen; +public interface GestionLibros { + List listarLibros(); - public GestionLibros() { - this.almacen = new AlmacenLibros(); - } + Optional buscarLibro(String isbn); - public List listarLibros() { - return almacen.consultarTodos(); - } + boolean añadirLibro(Libro libro); - public Optional buscarLibro(String isbn) { - return almacen.consultarPorIsbn(isbn); - } + boolean eliminarLibro(String isbn); - public boolean añadirLibro(Libro libro) { - if (libro.getIsbn() == null || libro.getIsbn().isBlank()) { - return false; - } - if (libro.getTitulo() == null || libro.getTitulo().isBlank()) { - return false; - } - if (libro.getEjemplaresTotales() <= 0) { - return false; - } - return almacen.guardar(libro); - } - - public boolean eliminarLibro(String isbn) { - return almacen.borrar(isbn); - } - - public void modificarLibro(Libro libro) { - almacen.actualizar(libro); - } + void modificarLibro(Libro libro); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java b/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java new file mode 100644 index 0000000..f67e04e --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionLibrosImpl.java @@ -0,0 +1,51 @@ +package org.biblioteca.negocio; + +import org.biblioteca.entidades.Libro; +import org.biblioteca.repositorio.AlmacenLibros; +import org.biblioteca.repositorio.AlmacenLibrosImpl; + +import java.util.List; +import java.util.Optional; + +public class GestionLibrosImpl implements GestionLibros { + private final AlmacenLibros almacen; + + public GestionLibrosImpl(AlmacenLibros almacenLibros) { + this.almacen = almacenLibros; + } + + @Override + public List listarLibros() { + return almacen.consultarTodos(); + } + + @Override + public Optional buscarLibro(String isbn) { + return almacen.consultarPorIsbn(isbn); + } + + @Override + public boolean añadirLibro(Libro libro) { + if (libro.getIsbn() == null || libro.getIsbn().isBlank()) { + return false; + } + if (libro.getTitulo() == null || libro.getTitulo().isBlank()) { + return false; + } + if (libro.getEjemplaresTotales() <= 0) { + return false; + } + return almacen.guardar(libro); + } + + @Override + public boolean eliminarLibro(String isbn) { + return almacen.borrar(isbn); + } + + @Override + public void modificarLibro(Libro libro) { + almacen.actualizar(libro); + } +} + diff --git a/src/main/java/org/biblioteca/negocio/GestionPrestamos.java b/src/main/java/org/biblioteca/negocio/GestionPrestamos.java index 45dd943..8259c12 100644 --- a/src/main/java/org/biblioteca/negocio/GestionPrestamos.java +++ b/src/main/java/org/biblioteca/negocio/GestionPrestamos.java @@ -1,86 +1,16 @@ package org.biblioteca.negocio; -import org.biblioteca.entidades.Libro; import org.biblioteca.entidades.Prestamo; -import org.biblioteca.entidades.Socio; -import org.biblioteca.repositorio.AlmacenLibros; -import org.biblioteca.repositorio.AlmacenPrestamos; -import org.biblioteca.repositorio.AlmacenSocios; -import java.time.LocalDate; import java.util.List; import java.util.Optional; -public class GestionPrestamos { - private final AlmacenPrestamos almacenPrestamos; - private final AlmacenLibros almacenLibros; - private final AlmacenSocios almacenSocios; +public interface GestionPrestamos { + List listarPrestamos(); - public GestionPrestamos() { - this.almacenPrestamos = new AlmacenPrestamos(); - this.almacenLibros = new AlmacenLibros(); - this.almacenSocios = new AlmacenSocios(); - } + Optional buscarPrestamo(String identificador); - public List listarPrestamos() { - return almacenPrestamos.consultarTodos(); - } + boolean realizarPrestamo(Prestamo prestamo); - public Optional buscarPrestamo(String identificador) { - return almacenPrestamos.consultarPorId(identificador); - } - - public boolean realizarPrestamo(Prestamo prestamo) { - if (prestamo.getIdentificador() == null || prestamo.getIdentificador().isBlank()) { - return false; - } - - Optional socioOpt = almacenSocios.consultarPorNumero(prestamo.getNumeroSocio()); - if (socioOpt.isEmpty()) { - return false; - } - - Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); - if (libroOpt.isEmpty()) { - return false; - } - - Libro libro = libroOpt.get(); - if (!libro.hayDisponibilidad()) { - return false; - } - - int disponibles = libro.getEjemplaresDisponibles() - 1; - libro.setEjemplaresDisponibles(disponibles); - almacenLibros.actualizar(libro); - - return almacenPrestamos.guardar(prestamo); - } - - public boolean devolverLibro(String identificador) { - Optional prestamoOpt = almacenPrestamos.consultarPorId(identificador); - if (prestamoOpt.isEmpty()) { - return false; - } - - Prestamo prestamo = prestamoOpt.get(); - if (!prestamo.isActivo()) { - return false; - } - - prestamo.setActivo(false); - prestamo.setFechaDevolucionReal(LocalDate.now()); - almacenPrestamos.actualizar(prestamo); - - Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); - if (libroOpt.isPresent()) { - Libro libro = libroOpt.get(); - int disponibles = libro.getEjemplaresDisponibles() + 1; - libro.setEjemplaresDisponibles(disponibles); - almacenLibros.actualizar(libro); - } - - return true; - } + boolean devolverLibro(String identificador); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java b/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java new file mode 100644 index 0000000..c73cd4b --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionPrestamosImpl.java @@ -0,0 +1,88 @@ +package org.biblioteca.negocio; + +import org.biblioteca.entidades.Libro; +import org.biblioteca.entidades.Prestamo; +import org.biblioteca.entidades.Socio; +import org.biblioteca.repositorio.*; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +public class GestionPrestamosImpl implements GestionPrestamos { + private final AlmacenPrestamos almacenPrestamos; + private final AlmacenLibros almacenLibros; + private final AlmacenSocios almacenSocios; + + public GestionPrestamosImpl(AlmacenPrestamos almacenPrestamos, AlmacenLibros almacenLibros, AlmacenSocios almacenSocios) { + this.almacenPrestamos = almacenPrestamos; + this.almacenLibros = almacenLibros; + this.almacenSocios = almacenSocios; + } + + @Override + public List listarPrestamos() { + return almacenPrestamos.consultarTodos(); + } + + @Override + public Optional buscarPrestamo(String identificador) { + return almacenPrestamos.consultarPorId(identificador); + } + + @Override + public boolean realizarPrestamo(Prestamo prestamo) { + if (prestamo.getIdentificador() == null || prestamo.getIdentificador().isBlank()) { + return false; + } + + Optional socioOpt = almacenSocios.consultarPorNumero(prestamo.getNumeroSocio()); + if (socioOpt.isEmpty()) { + return false; + } + + Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); + if (libroOpt.isEmpty()) { + return false; + } + + Libro libro = libroOpt.get(); + if (!libro.hayDisponibilidad()) { + return false; + } + + int disponibles = libro.getEjemplaresDisponibles() - 1; + libro.setEjemplaresDisponibles(disponibles); + almacenLibros.actualizar(libro); + + return almacenPrestamos.guardar(prestamo); + } + + @Override + public boolean devolverLibro(String identificador) { + Optional prestamoOpt = almacenPrestamos.consultarPorId(identificador); + if (prestamoOpt.isEmpty()) { + return false; + } + + Prestamo prestamo = prestamoOpt.get(); + if (!prestamo.isActivo()) { + return false; + } + + prestamo.setActivo(false); + prestamo.setFechaDevolucionReal(LocalDate.now()); + almacenPrestamos.actualizar(prestamo); + + Optional libroOpt = almacenLibros.consultarPorIsbn(prestamo.getIsbnLibro()); + if (libroOpt.isPresent()) { + Libro libro = libroOpt.get(); + int disponibles = libro.getEjemplaresDisponibles() + 1; + libro.setEjemplaresDisponibles(disponibles); + almacenLibros.actualizar(libro); + } + + return true; + } +} + diff --git a/src/main/java/org/biblioteca/negocio/GestionSocios.java b/src/main/java/org/biblioteca/negocio/GestionSocios.java index ec9431e..e3cad99 100644 --- a/src/main/java/org/biblioteca/negocio/GestionSocios.java +++ b/src/main/java/org/biblioteca/negocio/GestionSocios.java @@ -1,41 +1,16 @@ package org.biblioteca.negocio; import org.biblioteca.entidades.Socio; -import org.biblioteca.repositorio.AlmacenSocios; import java.util.List; import java.util.Optional; -public class GestionSocios { - private final AlmacenSocios almacen; +public interface GestionSocios { + List listarSocios(); - public GestionSocios() { - this.almacen = new AlmacenSocios(); - } + Optional buscarSocio(String numeroSocio); - public List listarSocios() { - return almacen.consultarTodos(); - } + boolean registrarSocio(Socio socio); - public Optional buscarSocio(String numeroSocio) { - return almacen.consultarPorNumero(numeroSocio); - } - - public boolean registrarSocio(Socio socio) { - if (socio.getNumeroSocio() == null || socio.getNumeroSocio().isBlank()) { - return false; - } - if (socio.getApellidos() == null || socio.getApellidos().isBlank()) { - return false; - } - if (socio.getNombre() == null || socio.getNombre().isBlank()) { - return false; - } - return almacen.guardar(socio); - } - - public boolean darDeBajaSocio(String numeroSocio) { - return almacen.borrar(numeroSocio); - } + boolean darDeBajaSocio(String numeroSocio); } - diff --git a/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java b/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java new file mode 100644 index 0000000..1c1335e --- /dev/null +++ b/src/main/java/org/biblioteca/negocio/GestionSociosImpl.java @@ -0,0 +1,46 @@ +package org.biblioteca.negocio; + +import org.biblioteca.entidades.Socio; +import org.biblioteca.repositorio.AlmacenSocios; +import org.biblioteca.repositorio.AlmacenSociosImpl; + +import java.util.List; +import java.util.Optional; + +public class GestionSociosImpl implements GestionSocios { + private final AlmacenSocios almacen; + + public GestionSociosImpl(AlmacenSocios almacenSocios) { + this.almacen = almacenSocios; + } + + @Override + public List listarSocios() { + return almacen.consultarTodos(); + } + + @Override + public Optional buscarSocio(String numeroSocio) { + return almacen.consultarPorNumero(numeroSocio); + } + + @Override + public boolean registrarSocio(Socio socio) { + if (socio.getNumeroSocio() == null || socio.getNumeroSocio().isBlank()) { + return false; + } + if (socio.getApellidos() == null || socio.getApellidos().isBlank()) { + return false; + } + if (socio.getNombre() == null || socio.getNombre().isBlank()) { + return false; + } + return almacen.guardar(socio); + } + + @Override + public boolean darDeBajaSocio(String numeroSocio) { + return almacen.borrar(numeroSocio); + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java b/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java index 2097951..267d855 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenLibros.java @@ -1,109 +1,22 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Libro; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenLibros { - private final Path rutaArchivo; - private final Type tipoListaLibros = new TypeToken>(){}.getType(); - private List listaLibros = new ArrayList<>(); +public interface AlmacenLibros { + void leerDesdeArchivo(); - public AlmacenLibros() { - this.rutaArchivo = Path.of("datos", "libros.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaLibros); - if (temporal != null) { - listaLibros = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer libros: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaLibros, tipoListaLibros); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir libros: " + excepcion.getMessage()); - } - } + Optional consultarPorIsbn(String isbn); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Libro l : listaLibros) { - copia.add(l); - } - return copia; - } + boolean guardar(Libro libro); - public Optional consultarPorIsbn(String isbn) { - leerDesdeArchivo(); - for (Libro l : listaLibros) { - if (l.getIsbn().equals(isbn)) { - return Optional.of(l); - } - } - return Optional.empty(); - } + boolean borrar(String isbn); - public boolean guardar(Libro libro) { - leerDesdeArchivo(); - Optional existente = consultarPorIsbn(libro.getIsbn()); - if (existente.isPresent()) { - return false; - } - listaLibros.add(libro); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String isbn) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaLibros.size(); i++) { - if (listaLibros.get(i).getIsbn().equals(isbn)) { - listaLibros.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } - - public void actualizar(Libro libro) { - leerDesdeArchivo(); - for (int indice = 0; indice < listaLibros.size(); indice++) { - if (listaLibros.get(indice).getIsbn().equals(libro.getIsbn())) { - listaLibros.set(indice, libro); - escribirEnArchivo(); - break; - } - } - } + void actualizar(Libro libro); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java new file mode 100644 index 0000000..28aec50 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenLibrosImpl.java @@ -0,0 +1,116 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import org.biblioteca.entidades.Libro; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class AlmacenLibrosImpl implements AlmacenLibros { + private final Path rutaArchivo; + private final Type tipoListaLibros = new TypeToken>(){}.getType(); + private List listaLibros = new ArrayList<>(); + + public AlmacenLibrosImpl() { + this.rutaArchivo = Path.of("datos", "libros.json"); + leerDesdeArchivo(); + } + + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaLibros); + if (temporal != null) { + listaLibros = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer libros: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaLibros, tipoListaLibros); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir libros: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Libro l : listaLibros) { + copia.add(l); + } + return copia; + } + + @Override + public Optional consultarPorIsbn(String isbn) { + leerDesdeArchivo(); + for (Libro l : listaLibros) { + if (l.getIsbn().equals(isbn)) { + return Optional.of(l); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Libro libro) { + leerDesdeArchivo(); + Optional existente = consultarPorIsbn(libro.getIsbn()); + if (existente.isPresent()) { + return false; + } + listaLibros.add(libro); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String isbn) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaLibros.size(); i++) { + if (listaLibros.get(i).getIsbn().equals(isbn)) { + listaLibros.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } + + @Override + public void actualizar(Libro libro) { + leerDesdeArchivo(); + for (int indice = 0; indice < listaLibros.size(); indice++) { + if (listaLibros.get(indice).getIsbn().equals(libro.getIsbn())) { + listaLibros.set(indice, libro); + escribirEnArchivo(); + break; + } + } + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java index 05efd77..c604e22 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamos.java @@ -1,109 +1,22 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Prestamo; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenPrestamos { - private final Path rutaArchivo; - private final Type tipoListaPrestamos = new TypeToken>(){}.getType(); - private List listaPrestamos = new ArrayList<>(); +public interface AlmacenPrestamos { + void leerDesdeArchivo(); - public AlmacenPrestamos() { - this.rutaArchivo = Path.of("datos", "prestamos.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaPrestamos); - if (temporal != null) { - listaPrestamos = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer préstamos: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaPrestamos, tipoListaPrestamos); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir préstamos: " + excepcion.getMessage()); - } - } + Optional consultarPorId(String identificador); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Prestamo p : listaPrestamos) { - copia.add(p); - } - return copia; - } + boolean guardar(Prestamo prestamo); - public Optional consultarPorId(String identificador) { - leerDesdeArchivo(); - for (Prestamo p : listaPrestamos) { - if (p.getIdentificador().equals(identificador)) { - return Optional.of(p); - } - } - return Optional.empty(); - } + boolean borrar(String identificador); - public boolean guardar(Prestamo prestamo) { - leerDesdeArchivo(); - Optional existente = consultarPorId(prestamo.getIdentificador()); - if (existente.isPresent()) { - return false; - } - listaPrestamos.add(prestamo); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String identificador) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaPrestamos.size(); i++) { - if (listaPrestamos.get(i).getIdentificador().equals(identificador)) { - listaPrestamos.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } - - public void actualizar(Prestamo prestamo) { - leerDesdeArchivo(); - for (int indice = 0; indice < listaPrestamos.size(); indice++) { - if (listaPrestamos.get(indice).getIdentificador().equals(prestamo.getIdentificador())) { - listaPrestamos.set(indice, prestamo); - escribirEnArchivo(); - break; - } - } - } + void actualizar(Prestamo prestamo); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java new file mode 100644 index 0000000..039a271 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenPrestamosImpl.java @@ -0,0 +1,116 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import org.biblioteca.entidades.Prestamo; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class AlmacenPrestamosImpl implements AlmacenPrestamos { + private final Path rutaArchivo; + private final Type tipoListaPrestamos = new TypeToken>(){}.getType(); + private List listaPrestamos = new ArrayList<>(); + + public AlmacenPrestamosImpl() { + this.rutaArchivo = Path.of("datos", "prestamos.json"); + leerDesdeArchivo(); + } + + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaPrestamos); + if (temporal != null) { + listaPrestamos = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer préstamos: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaPrestamos, tipoListaPrestamos); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir préstamos: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Prestamo p : listaPrestamos) { + copia.add(p); + } + return copia; + } + + @Override + public Optional consultarPorId(String identificador) { + leerDesdeArchivo(); + for (Prestamo p : listaPrestamos) { + if (p.getIdentificador().equals(identificador)) { + return Optional.of(p); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Prestamo prestamo) { + leerDesdeArchivo(); + Optional existente = consultarPorId(prestamo.getIdentificador()); + if (existente.isPresent()) { + return false; + } + listaPrestamos.add(prestamo); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String identificador) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaPrestamos.size(); i++) { + if (listaPrestamos.get(i).getIdentificador().equals(identificador)) { + listaPrestamos.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } + + @Override + public void actualizar(Prestamo prestamo) { + leerDesdeArchivo(); + for (int indice = 0; indice < listaPrestamos.size(); indice++) { + if (listaPrestamos.get(indice).getIdentificador().equals(prestamo.getIdentificador())) { + listaPrestamos.set(indice, prestamo); + escribirEnArchivo(); + break; + } + } + } +} + diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java b/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java index 0ebeaca..66ceed9 100644 --- a/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java +++ b/src/main/java/org/biblioteca/repositorio/AlmacenSocios.java @@ -1,98 +1,20 @@ package org.biblioteca.repositorio; -import com.google.gson.reflect.TypeToken; import org.biblioteca.entidades.Socio; -import org.biblioteca.herramientas.JsonUtil; -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class AlmacenSocios { - private final Path rutaArchivo; - private final Type tipoListaSocios = new TypeToken>(){}.getType(); - private List listaSocios = new ArrayList<>(); +public interface AlmacenSocios { + void leerDesdeArchivo(); - public AlmacenSocios() { - this.rutaArchivo = Path.of("datos", "socios.json"); - leerDesdeArchivo(); - } + void escribirEnArchivo(); - private void leerDesdeArchivo() { - try { - if (Files.notExists(rutaArchivo.getParent())) { - Files.createDirectories(rutaArchivo.getParent()); - } - if (Files.notExists(rutaArchivo)) { - Files.writeString(rutaArchivo, "[]"); - } - String contenido = Files.readString(rutaArchivo); - List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaSocios); - if (temporal != null) { - listaSocios = temporal; - } - } catch (IOException excepcion) { - System.err.println("Error al leer socios: " + excepcion.getMessage()); - } - } + List consultarTodos(); - private void escribirEnArchivo() { - try { - String json = JsonUtil.obtenerInstancia().toJson(listaSocios, tipoListaSocios); - Files.writeString(rutaArchivo, json); - } catch (IOException excepcion) { - System.err.println("Error al escribir socios: " + excepcion.getMessage()); - } - } + Optional consultarPorNumero(String numeroSocio); - public List consultarTodos() { - leerDesdeArchivo(); - List copia = new ArrayList<>(); - for (Socio s : listaSocios) { - copia.add(s); - } - return copia; - } + boolean guardar(Socio socio); - public Optional consultarPorNumero(String numeroSocio) { - leerDesdeArchivo(); - for (Socio s : listaSocios) { - if (s.getNumeroSocio().equals(numeroSocio)) { - return Optional.of(s); - } - } - return Optional.empty(); - } - - public boolean guardar(Socio socio) { - leerDesdeArchivo(); - Optional existente = consultarPorNumero(socio.getNumeroSocio()); - if (existente.isPresent()) { - return false; - } - listaSocios.add(socio); - escribirEnArchivo(); - return true; - } - - public boolean borrar(String numeroSocio) { - leerDesdeArchivo(); - boolean eliminado = false; - for (int i = 0; i < listaSocios.size(); i++) { - if (listaSocios.get(i).getNumeroSocio().equals(numeroSocio)) { - listaSocios.remove(i); - eliminado = true; - break; - } - } - if (eliminado) { - escribirEnArchivo(); - } - return eliminado; - } + boolean borrar(String numeroSocio); } - diff --git a/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java b/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java new file mode 100644 index 0000000..c594f85 --- /dev/null +++ b/src/main/java/org/biblioteca/repositorio/AlmacenSociosImpl.java @@ -0,0 +1,104 @@ +package org.biblioteca.repositorio; + +import com.google.gson.reflect.TypeToken; +import org.biblioteca.entidades.Socio; +import org.biblioteca.herramientas.JsonUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class AlmacenSociosImpl implements AlmacenSocios { + private final Path rutaArchivo; + private final Type tipoListaSocios = new TypeToken>(){}.getType(); + private List listaSocios = new ArrayList<>(); + + public AlmacenSociosImpl() { + this.rutaArchivo = Path.of("datos", "socios.json"); + leerDesdeArchivo(); + } + + @Override + public void leerDesdeArchivo() { + try { + if (Files.notExists(rutaArchivo.getParent())) { + Files.createDirectories(rutaArchivo.getParent()); + } + if (Files.notExists(rutaArchivo)) { + Files.writeString(rutaArchivo, "[]"); + } + String contenido = Files.readString(rutaArchivo); + List temporal = JsonUtil.obtenerInstancia().fromJson(contenido, tipoListaSocios); + if (temporal != null) { + listaSocios = temporal; + } + } catch (IOException excepcion) { + System.err.println("Error al leer socios: " + excepcion.getMessage()); + } + } + + @Override + public void escribirEnArchivo() { + try { + String json = JsonUtil.obtenerInstancia().toJson(listaSocios, tipoListaSocios); + Files.writeString(rutaArchivo, json); + } catch (IOException excepcion) { + System.err.println("Error al escribir socios: " + excepcion.getMessage()); + } + } + + @Override + public List consultarTodos() { + leerDesdeArchivo(); + List copia = new ArrayList<>(); + for (Socio s : listaSocios) { + copia.add(s); + } + return copia; + } + + @Override + public Optional consultarPorNumero(String numeroSocio) { + leerDesdeArchivo(); + for (Socio s : listaSocios) { + if (s.getNumeroSocio().equals(numeroSocio)) { + return Optional.of(s); + } + } + return Optional.empty(); + } + + @Override + public boolean guardar(Socio socio) { + leerDesdeArchivo(); + Optional existente = consultarPorNumero(socio.getNumeroSocio()); + if (existente.isPresent()) { + return false; + } + listaSocios.add(socio); + escribirEnArchivo(); + return true; + } + + @Override + public boolean borrar(String numeroSocio) { + leerDesdeArchivo(); + boolean eliminado = false; + for (int i = 0; i < listaSocios.size(); i++) { + if (listaSocios.get(i).getNumeroSocio().equals(numeroSocio)) { + listaSocios.remove(i); + eliminado = true; + break; + } + } + if (eliminado) { + escribirEnArchivo(); + } + return eliminado; + } +} + diff --git a/target/classes/org/biblioteca/Aplicacion.class b/target/classes/org/biblioteca/Aplicacion.class index ce8a147926036ff4852a4a20af6e273436c4e319..7681bc967b17ab84eddf14ff12df161dfaec9be7 100644 GIT binary patch literal 3423 zcmc&$TXYju6x}xoO&W$4Ld*Lxyh;Ov098a<&;q4KQmCX>9->ae&<-S-Fi8+lKos$T z4-hJXq9VGg{@JY6u4UKqL;n2o*Wdp7<0otBLie2+`ba_YN7_5*KF&RN-+j)#=l*v0 z=U)Icnp$RolWOC(A;XNeTSg|I$XmLWZVaGG;7oA1_sVeZ#YgmiHHfL0=0`}u zbkqn;zYkCWe^$ayWw?`iXDc=*+=r3rZVYz@FhgMVaPK8mRTHs9M@w6?x~)ZRZAo;* zZeQN1Zi#J)$98qJY;E2hYo?A$)c|G*oF4AI{)l!?#%}~Lhg(`3R$KL4-nd=Ns0Vd5 zZgg2@E`WI)S~q?uVI~bZv_N2X!}y_g>-G=1yq1>3szA+}u$s_PhDD1hHD}0Z&;nR2 zP`N9cluK7oiK793&y*dCi z2Y{~N5V{#XE`Sj&fk+t`M$`$zD2oKgAr6Kf2SZ9h8ay!fNN`ljBf-(->REyM5)v|c zx4aFa_SIpIqu+!j6A0rxQeVb49nbL^l|CydIEGgVw_9FG_v{MPl^VM5`h*`;LNl@!qJ@oWX}X%{3yQ5f>DEfDZ*chRm`f?}b<@1|abgM(_N-@rW*Cz5>@<^MOb@2t7k}3Bk7)+Q2E2(cc zf+*KnsF{?L>G zR7+Xw%9*a5?aH~XobSqou3R*LCH<%yz^VbPYg@I`v)&gOz!N`mMPLuh8kPo@ILkto z)hwGLp~eAhx`qbtdS4$Rkx;YUT zlE)dS!c2Z=VF6}yg*ik%m#?9D*vvJzv$vi5`5h|$pp%EO7=L03{=!n+q4wWcF1)C> z{h-o*JHE%~_(Fz)@Zko&gsfbp|l(3mvOgKQ0f0N0V aLN2B-RIA8LHFoe>y9d*#d5bz8eET0DBoa&j delta 384 zcmX|-J5K^p5QV?HJcP}n_y84%Kw>rqqjcJt*l08qL@V*R0xF282(}h>w)-b+aSIYj z`~gu4-Ld*;cbs%Wf8}dcE9mte{sFG-70!m1!~7SQqa>3CJ(DBw1Fx z67S1&P;Ch`%3|Fz3~(gY_-o*p6Ul;9sLD&p`OqWk#%)65ycRA)zc?ja^W1YvO=zLKoKcren$kGu zLP%WNx5jj?@vml45blY0ncI4x&|%NP?2?nj>|i;px*AnqqwWrsuMLSN#g)Vw&0n(h BI;a2u diff --git a/target/classes/org/biblioteca/interfaz/MenuPrincipal.class b/target/classes/org/biblioteca/interfaz/MenuPrincipal.class index d80296423aa5e70a9a71bfc7751c9c4a0dd6d191..4fbdddf038f1e6a9cd812300d3d797e7860a7842 100644 GIT binary patch literal 9096 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 literal 8963 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 diff --git a/target/classes/org/biblioteca/negocio/GestionLibros.class b/target/classes/org/biblioteca/negocio/GestionLibros.class index 57497779dd112619869af468898a6dfee404927f..d63bad8fcfc16a171d0e3f206e406ee6d464cfee 100644 GIT binary patch delta 225 zcmZ3?yPJjg)W2Q(7#J8F8AR9_m?l=LE3-4OFfs^aC6*=X=OpH(>-#5Vr6!j!GVtVN z7MCOz`D7*)P5dA}S&BKBQDbr!v-;#V=J?5qOe&U)47{m1nYo#H5JmZn45Au72y=o< ziZb)ktu><<8TfMZQ!>*slc5SH%QLAmhE29-QSxJBWME`q2D*oVffeWsRt7d8pB>0! mV&DMsIT^U%d~P70hk=&?f7+t|DU#stU6GFZHEB4e<5#Y8-+>~a;{W>HhlbZ@NeS{`bdU09Nr^8AB*I7faZ$y7hS^+jC_2igz`G(cQe}Y*4o`s?>aASFSJO3ZzHt{5 zIKWW#RT#yA;d)cGRm3n+n{Or6#YP5=mW)i|Kjq>e4pHTO|3^x%M_x#E*3y7Pjt!$_ z*l7-8JlwI2c|bTvaMZyME{@?i!*q_Y2#sv>wumSz$wI|-gh^9O_DBupDB}cX9GrCV zBTjvGCn*U6kkJ}NJWnp=iB12Li#eOSM9`bk#DTKbnu~eV879ekds}pO0dDU}8H0LR;gL5v<;{r8_r?j?#Q+sKaxL$H`8CMv} z+&3`~Y4@3N*gTU|++4nbJv*(* z;0DwST&FEd3U0_w$W5#X|5ERI`aQFpN6qW9LWujkIPx<@VlR_!n)tGr81C&Q*Fc;0 zTI{>hy8Q3=ye-p87)FA$+h)E+nW3^_xc~e<-^nDbh(LB_*e{{lRc-lHeyXXwprr@rZmN|w#n?Mqr#LnvFg_4p%;K*l zJ}Y#79fvZUYxHY*mn_c0E++FpQwh+))F}fZcif=Ylp%#&qt#6;($`XZl|e2M+~I#v zu|K<*evOgBTUyVirr810={NQ)W3cd+Fbatz(=>6Qu^z`!D*PB`ah#_91P$*D8uVCL ziBe`ueP&Czh1 diff --git a/target/classes/org/biblioteca/negocio/GestionPrestamos.class b/target/classes/org/biblioteca/negocio/GestionPrestamos.class index 39a7724d9399718d7ead2485e9f8a9b4a8163cd1..a22282aca7329317ef5323dbd2f89d9e21fefe67 100644 GIT binary patch delta 165 zcmZ1}IhBR?)W2Q(7#J8F8HCswm?qX}iLo=VFfs^aC6*=X=OpH(>-#5Vr6!k57Gx6< z7Sho40ZWvYWajAmWEPiLPgZ7&oUFy9Ie9)?>f~ZpHO8pP793iW*KjDiu`x0*GB5+p vW?*0e8p+DQ2IR8?c}xr(Kt3k}7o5)xSs}bkwTi_kEs9`jcvL7BY^#%Ggu##rlL;34en0HH zpX_h&L%UXuUF}+3{nQWrO|Gu)dnZF66^kotW$xU2&fe$jbMC$K_dmb=0bm$Egi!}y z5Pl5-)C)wG^i@5c)AI}Q$@G$uaRlm5n|ae267a>kXM<=E=(X&Hc-lncb5fvwn6UNl6lXzn5SjxWZvyE zKcV4CJXK|Om$%34+9ssr`!wvw0fC(vD_<<-9NnI=vQ|+b8tYD}8kZb17f+c*N7*0J z@H7r@w4bu-=)TS(7Y78lIOd zn#`n_&a2wXE*jQwR&qo(a!3owFrwi+Mj0!;YEyQ19lPg(z}_u2tniHCMGY5aq)m(Z z+K5>!Sa~yT=A_bLjA2~E1SSRckm&r9v0TXM+?SqR&R{=qQzxbAOBya=nx@4qP5rTC z_pD6rWeu~qED+W+PD#(1w{%wSP^@-uR72_9nc0R(>YnDW} zs_JVRUYF@Mn8o3YW3F1V2-h^|NDG7*x;rc2kIhTEEQ}zoYgoXdK(nf*V=f!9{%)G%~O&j)%p3ZS5s&bjtZBxEiCjHK$$>Mg` zmSn4wHbLYZ&jQ`{1gCds+FZ!%PRS})rRh|NmLM)hK24;3nR6nl3YxzM2~k7^zS+_M|bQ14`5t_?YPjVOzN z8Vc;+8rt0z0z0ymjjJ}KNV3y5*L1Dm)pg(@ypNDT9eJt>kLl=!Cd=12?dX{s<9eae zS&doQ{HunoOaxjVR;YO<<*BRG7<|0Ay&|d5!_!vD&KRSn?Dp2$Z-gUqQ{wEQdZGER*5mGPW6+04l^WxO!a?@e-W?oW)J z^0)iTNd73D7GUjJu!^^f8xud`#A!U@b_fJHnBlgFhLZ^+GJJ!c#5;eF<~57YPnA2Q41wE2i5 zA94EdF+L&t9NO_IK4VcoCx+C`wf|z>{xFJbP2egf zah<|iluOEafr-pg94S+Ps}UuWY?PICiB~FZ6~ZFEQ4)9HvXb3L?0zM-e_dGD>RU?W fuHB~mQrH&w9)MC()<_Ut4{(uV3i=(_>hS%)r_n=> diff --git a/target/classes/org/biblioteca/negocio/GestionSocios.class b/target/classes/org/biblioteca/negocio/GestionSocios.class index ee17e345f2a4d132de4e5dc6ea97e5d3f6a09a04..f40629f6611ba5e4422652b812139db34043ab08 100644 GIT binary patch delta 202 zcmbQn^Pidb)W2Q(7#J8F8HCswm?l=LE3-4OFfs^aC6*=X=OpH(>-#5Vr6!j!GVtVN z7MCOz1?MMcPW&J~`36%kqsC-^X7$P5%!$m(8a|T~8Rc}WHKQ0A_)-#!TvDA9vl2my z^BEaLHGB}}1(y_M=A{D_PX5NMWa~9vO9C<-gD1Ackcf9`Q;mcDjw%CfQ*Gf8$%do7~A1*xZ`oZ z?QAr6gc~vpuSj2ps|=aa(w2oRLrLkj)09n5s!+Jx(W0XQ87eK6Q}y<^EBuCXr3&(} zkjY^LwuMm}1sr3TPX+s;ZG4@lA_%2Q0vRkG12L5AsffR(tC)P_Hi|gTP;iwWbiI)4 zP1RBXL$S0}kE-j2(sSxE2qXUq8e3ffb5rO|-t@>)tSgs$TU<-C zPmF`%Yf0T&NRv47o>Zt#k2=Y9eBr3NhHU#h>}tZl+0*o}<11;@bZM)EIMVC}Zh}ZV zKe`J^n~Hzl2Zm=y72bE(dbi}ivKO>yQ$?g`l5!|8^T9ClFYXMZjgY&$&v_@&vOo=8 z7d5`a6Rdngb+s#=$VmR*M(&E44b0N84$z;0nq$V5RztL=Ujx0b)2@aLt$?xeXRz{D zSg$@K_X+tAWE;Q@dKbt8urY{HiZ9@1w2NYJ3%6;vKO%pCvG=r& zaZE;Fye~eR#NUm4?$P;uOeHuE=xccA49@ZaPNab*BB06GDFGsPRIoxoG2{bUt>QAh z4YhX(WR2iXe#fZ!9ANq_hBEuKo{vrQeWu0OwAeExT*~`|mWjlfrnv#l;y6x|1ZOdi zb2P2zNst-bqain9#T;vg9BX)pN5rX0XITu7voU&TU&FP8X}b6;CSkvd3w^-3L*QQV J3~Q19`Y%*rXPf{4 diff --git a/target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class b/target/classes/org/biblioteca/repositorio/AlmacenLibros$1.class deleted file mode 100644 index 6de083a3f229138536d1df6f1eac8a68ef2173a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcma)4O-~y!5PiEhP0BioDATmMo| zl{oMN`lBjl0~fe7Uae=|^E{9JcK`mny#sKD{U$1?MyRz=M?>IUX6JEkZLTTKy*06; zZL;s~4-cjSwXvO%z(%4BT^93{+(f3Dna#vzQctB*C4MAp;aYit_bd144TgNB zQq?=*o2;y3Rr@oAYdiZQot#r3$9>nYRBmJ_9G~xN@?SGY$#;1p<02>>C(4J>^Y&zd zn#mb?USqTmH<{*dVDg7EM%WeTuj;$N+9mn$$@(DB zx-f>^SWEB8<1HfoW6B};tz(^0ld}(uOTK>i2jVv;6};fNu`KJL#re)d0bb%2qf)$q nHm`TeoOk=xW@?i`1+THSjN2>%YUuL(X32E1$Fa$>h$D}C>>0p` diff --git a/target/classes/org/biblioteca/repositorio/AlmacenLibros.class b/target/classes/org/biblioteca/repositorio/AlmacenLibros.class index 6c2b47223b4a19b0c9dc7c244c1c2d4aa3821964..70589133f0abc793c4352c3d22d98e05cbc4f0d2 100644 GIT binary patch delta 223 zcmbQG`I&|H)W2Q(7#J8F8N}Hcm?l2dc4lW_VPp`Tn*Y{7#N=+^S3gx7x z7P+Jrr=&U-C1+%oH%gi_5_xs-W{axSZ z3;(_T41gy5CyW9V$_Oc#h9U{&r_|GGG_4w`=>G0gTEdY~v_&^`XPbn=n%YA$iY3&U zRw~-9cc*pJ(GqIZ(lVy4JEo+RQHll=I9wSuG^04 z!Im)hcALnUBcZ}Y(C_H!Xp?2BXT{PmDp4pP%vZ1gRT4_mL4)O+ut}(cGh29oqfkcGOtn6p5v1DDeawf0%s=Lh+3jeCX0;ehUn8Nb)Q0huF#Dn@ z(@ZflQk)yz!=G3f2f+%~so*{wW<*amNkZ{S%j^>yNZ96Mck7`KGay)A`3W-eN@q;Q z5eYNKiiJpg8OO5G%hYYzzw1mwa|65t$8kc2s-PQ*{CaTKcCL2gBE@yBDOco46Z@j3+$;q}=Xn>U42dQ`hjJHtZ8 zhS()myiviM@UVoC;ST3Zo{NPyOIS26rWwq7QcY@h)NMQh>suAP4R5DyHJKbImT#%H zD~$7ahk|zsXN%U@Vt2DXF2=hRyhp4pViK!qJB$l>pN#j5hVg+sGG3`rnLgR<40QZ# ze!H}@GZ|nP@Th{vFu=B@^<|v1<3$Wiorw=CcpM*L7$+D{{b@(F+D%K~9Ji(KDnG0y zZuv0<9~Yh|(d~9ivniNpIZr6~q-Z%aH9NuTtXsQ`T+ivkrxkn#gLH?jpJN8lOD#g# z&nfskzQA`XCX{Un#y&+@XXHVgc2YZ1Ir*2j4MF8rGhSX^CJd(L}LIup0-okB(c7wKvS7uThUGCAAP3B(N%WCy!OAH`s}gsw9#3n$U<}NJnGqde z{RA6RQ(Jcfbl+qZD&W0rpijxBoa$Gtq{@=BY{Kz(Jb~ISQb>!Fv#T|Ogfr-D|LB#U z9TFPsNmL%xb<4zw$@_~uJMb)?YIes zF~YwE;xgg^kRpU!$T6qx3Tj8NmIeF<)(@j`0JDNaTZXZ%Qw-!j&lGQw9em$8jNR_H zVeE?!qphA_%7<`Z6kV;WpF?roYEl?PMf@qex_$`B>*xW7kiP7qI)MZaW+4uM_aKG8 z3&^307o$adU(EZ%5+2o;q7%z-grg@=!xbx$WXrZu>+-AP`n{No>v)uvZd6CvUkD3)1 z``C1?OC}+ti zIPQX!@O3;(XaeMu{2SumMiCW$)Ch$0M(}`y*3~0;jf4Tr<-;2!(mmf+-!Ou=6rgkP z)=Tx5xYCo~3!@EuYotVXQQVCLx`|=5IR~+p5&R8&(+!$NADDtVJm*GvR$Oo73Pl{H z^%*F51(h;*dwlRF7W%pHEq>(z$mj65&taqBFcEw881{xCJi;(~*8qwehVkA@gSTEB z#s>w9pwQdM;%dTeiL?KwozI~hRtF?bGR3&(aa4|d}i*&cWKiHt2~Sp673aYc;h zn8tl46mkAf@iU*7g3v4ccQxtGo0uk()z9$@pW9`w7jD?&ajOb2YZT8_`ON4fMoy*s zh3@%MAvy&e!LNY)o)tyaqqUR(!BP`q8L5DV23{REA%(3hU)wph8@)MK6>;R3q#{bi zo*b1uzSBlI8W!%V0p)RnUxkBd7<%VP)oRyxg z4P{aGf8A5x-H{cj_q5gVKwze`Ge|Hi@Xh&L4)xGz7b#OLx_3cG=e3iErcfE#OHU!H z!iDypz-}jUhy<2WZRuiM49WM^&@i)-x=fjY^18(T$!fgOK|oG(Ona}( zcPoYMUB1#ZQWmz(Dc-ozrShtvNS;rhyVAK;aqPLuAL+Zs_R?GRQ^|4EMy5K%-rEYu zMmY8~Dhv!Lo!SkAE?{$>RV3 diff --git a/target/classes/org/biblioteca/repositorio/AlmacenPrestamos.class b/target/classes/org/biblioteca/repositorio/AlmacenPrestamos.class index 87f8483dc08e0ee9ac7126e9fc0b03955a2ee56c..6fcd2576c4671cc1126974486b4d2984f3886d47 100644 GIT binary patch delta 215 zcmaE=*~}_%>ff$?3=9m84C3qzOpFZL6YaJ2*%??E83eKt%M$f-67$ma{gbj%lS_a? zIjN~dE~&*Ssg6a-8JT7Ij10^gnqiY4a)?Y`#ihZ|8JwA(msnC-l*-6puAw=30;l=p zb`Gn_KHRO7t$7qDm++WP-pr#M$HvG2)Cshefq@-p6DtE71IR{pD9ypZ36$po$}%x< j1I2k5c;S3LAfKN>0IXh+K?qC>Gl&4yGBSvQb%+4~Qz9gw literal 5349 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 n`My=Tn*Y{7#N=+^S3gx7x z7P+Jrr=&U-C1+%ocD?R98Q^?I9R)jclUDwzZ4$(HIt>L_%1iVkwphRAj>rt9*yvGtxX+h7|&{GMZ~S z3Tldk?{aO!>?^}+I&nN5H=c7WvjVkPt6-gq^{5kwdmv0oe%8q9iB8S!7l>GA1(J0k z^uDv?iK$D0kVPIm5gSxAVgom~hg_}2PWKz32#)9@KPtM>-Ij~$>_l| z67XgfTX2g&IV0Gq*}BPuT9A)nu`dPND10%ilwl4W&bfwV#&9ckD7a052QlY#Kg~f>tlJz|bb_=X6MxeQjM(>cTC*&S2`Ck&w?JD-5 zMPP2))-_k(XV}a|7J)=^*Nk?59p}kuLsN!U2KdA&1^cJybU3G*6FS|Y;vm`>z@Yn#Daf5FQfL>5QIAZ1+q!AD4OelHqA?ss zr-C=AxC>nZwUg?%UuUTe8q6TgNgQH59A*8nZmeEcH+8$sWciwDL!&m#ue3Fo=(DUo zRz@Ff6L;_<8N*SqgLSL88^@W^(-{erowcn&xq(1)fZgkd0nCtKMeQfd$ZwrV1t$dN zOf(Bw_zF(tvzMjYc6k4VwC*K%IZoq@0!>9P(#8GYqT}j=?7vh%V7?E44|lRnxJ0FE zgQRv6x{9;tqx`J3cHMEbJ~qsG`CS02p$B;#xh+^vR^WcTS;1RWycKWD_t+v6Qt8*64*dcf83$sI zeBvD{-iZeUqNcZ8EO{Xp-X*YNQcg3Ojf|GjorE`dB-Zz+crV^Z-&!U!NvyzAeNPMz z;{7T$3OooF=QX&{aY$iT)N81LHX>05`kK)zSm)S}qS( z9#NQ%g+L#%G8WOt^Zlow6uk=GsF_S_vS3WGw3U+$ed`n-Gg7<4oTv+dL(}!0P!RKZ zJ0sUh-;ic!G&YhoQx3J0dDQoiiFc0kBxkPBf-w&cRK=+-u>JqVRN8BCLdpp-9aDl3 z2LJO|P_Ac%dXL~HS!!-;~!ji)`&9vQDAA|X1-7-3@S_U=NSHimlga~&ZNI_ z_IoqaYet57-Wt#oe*SVeaZDZ1m7)i| zH;K^Apl-s)=X@IuSp_aywQRPFGlm(iwwXMXv}QHO(RslCXZ~Cn<}@8t1^?!lm_onE zlpV?Eg;i{U5zg`w#O0BlS8@6B!|#ZE3E}+vrgwdX?@~-cl=AZlt~lNmu&v=~h=ymN z9Op&(DAcQ{;?D)gpT?rASlkd_9=(p0$4la?y2h~PD(V|X(Ig#2@FYK%&<(g@lrXBf z^$KpiiSI#Mu@K+l9hKX06Fh~h{Eo=i1RsEi6LJaH+=i!6KaNdo#@DfR4BLk>FTAvC z49(qgp>TVy{1xBJ-}}aJz`HkwL#Z)zH1bZ>D2_abp7ssTqpV>ADU6^x^(5ZdIEu_Q z^aG>FKH;G{gEWs!QIE$KA_WDjrew8bv4ul)55+x*)#%0=oZ#vi)bWXR$Z(1}sQ36a z@cDySM5mOImgN|uhX`#dF^+5AK5oGN8SWtU@U5=U>f2n2VOH(Zm3tMOtmFzu87-u~ z4^tf(*iGa`T8n*Zc1n_O%yTc|c0R;y8S$T_hlv<95z$6s+sr!&)G$g3vXn8ZptSvS=lXeFYY)P*q^DBVYlt{edUG#H^y^ zRm>sa)i;RDuihUL@$>i*Kc(stxh$Ra9%3STXcV7p-!O{L3}aTwWyzt@SD6N%k6xy! zFY^jU5zN;p+8FOctlK+TtL+5afwg@1%4Y*z7oe@jk14vK{Sv%@7rAv_YJcS?T#>NL zAYPSHU!v_#@v{KxOS~%+BqgDi>@I0u?koI7fyb~(UN0ZVS0XYs3gT7=%a@rZ(cL2` zf1pH++OQ zvSQ1aRxjb_o`|Ue(^L?IQriClzYKV(h`z?Zc!^tXU>5&KhF@{V2!4&<@H