From e447864322bec8940fd1d2848453524122e4ae9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isidoro=20Nevares=20Mart=C3=ADn?= Date: Mon, 19 Jan 2026 11:09:30 +0100 Subject: [PATCH] Commit inicial --- .classpath | 41 ++++++ .gitignore | 3 + .project | 23 ++++ .settings/org.eclipse.core.resources.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 13 ++ .settings/org.eclipse.m2e.core.prefs | 4 + ficheros/catalogos.xml | 124 ++++++++++++++++++ ficheros/gastos.json | 84 ++++++++++++ ficheros/ingresos.csv | 8 ++ pom.xml | 55 ++++++++ .../es/palomafp/aadd/inm/AppProyectosIES.java | 33 +++++ .../palomafp/aadd/inm/dao/IContinenteDAO.java | 23 ++++ .../es/palomafp/aadd/inm/dao/IPaisDAO.java | 25 ++++ .../inm/dao/hbm/ContinenteDaoHibernate.java | 52 ++++++++ .../aadd/inm/dao/hbm/PaisDaoHibernate.java | 102 ++++++++++++++ .../aadd/inm/dao/jpa/ContinenteDaoJPA.java | 90 +++++++++++++ .../palomafp/aadd/inm/dao/jpa/PaisDaoJPA.java | 100 ++++++++++++++ .../inm/gestor/GestorEntityManagerJPA.java | 41 ++++++ .../gestor/GestorFicheroConfiguracion.java | 45 +++++++ .../inm/gestor/GestorSesionesHibernate.java | 46 +++++++ .../inm/procesador/ProcesadorFicheros.java | 59 +++++++++ .../es/palomafp/aadd/inm/vo/Concepto.java | 33 +++++ .../palomafp/aadd/inm/vo/CursoAcademico.java | 36 +++++ .../palomafp/aadd/inm/vo/CursoProyecto.java | 36 +++++ .../java/es/palomafp/aadd/inm/vo/Gasto.java | 49 +++++++ .../java/es/palomafp/aadd/inm/vo/Ingreso.java | 48 +++++++ .../es/palomafp/aadd/inm/vo/Patrocinador.java | 36 +++++ .../es/palomafp/aadd/inm/vo/Proyecto.java | 36 +++++ src/main/resources/META-INF/persistence.xml | 30 +++++ src/main/resources/conf.properties | 10 ++ src/main/resources/hibernate.cfg.xml | 30 +++++ 31 files changed, 1317 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 ficheros/catalogos.xml create mode 100644 ficheros/gastos.json create mode 100644 ficheros/ingresos.csv create mode 100644 pom.xml create mode 100644 src/main/java/es/palomafp/aadd/inm/AppProyectosIES.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/IContinenteDAO.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/IPaisDAO.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/jpa/ContinenteDaoJPA.java create mode 100644 src/main/java/es/palomafp/aadd/inm/dao/jpa/PaisDaoJPA.java create mode 100644 src/main/java/es/palomafp/aadd/inm/gestor/GestorEntityManagerJPA.java create mode 100644 src/main/java/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java create mode 100644 src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java create mode 100644 src/main/java/es/palomafp/aadd/inm/procesador/ProcesadorFicheros.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/Concepto.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/CursoAcademico.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/CursoProyecto.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/Gasto.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/Ingreso.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/Patrocinador.java create mode 100644 src/main/java/es/palomafp/aadd/inm/vo/Proyecto.java create mode 100644 src/main/resources/META-INF/persistence.xml create mode 100644 src/main/resources/conf.properties create mode 100644 src/main/resources/hibernate.cfg.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..51a6fca --- /dev/null +++ b/.classpath @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..93e00af --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/ +*.class +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..79e3ddc --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + aadd_act4_2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..bfac099 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=24 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=24 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=24 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/ficheros/catalogos.xml b/ficheros/catalogos.xml new file mode 100644 index 0000000..2185211 --- /dev/null +++ b/ficheros/catalogos.xml @@ -0,0 +1,124 @@ + + + + + 2024/2025 + + 2024-09-01 + 2025-08-31 + + Curso 2024/2025 + + + + + + + Hiperbaric + Proyecto Hiperbaric, alumnos de 1º de grado medio de electromecánica de vehículos. + https://eedd1dam.decieloytierra.es/avatars/e33ba9460633123bf4368fb219a43ad6f4c3a2403fece22134456e6009e4f485 + + Grado Medio de Electromecánica de Vehículos + + + + + + Chasis + Chasis para el vehículo + + + Asiento + Asiento para el vehículo + + + Suspensión + Sistema de suspensión para el vehículo + + + Dirección + Sistema de dirección para el vehículo + + + Frenos + Frenos del vehículo + + + Neumáticos y llantas + Neumáticos y llantas del vehículo + + + Elementos comerciales + Elementos comerciales para la venta o publicidad + + + Carrocería + Carrocería del vehículo + + + Cinturón + Cinturón de seguridad del vehículo + + + Equipos de protección + Equipos de protección para los conductores + + + Logística + Gastos de logística para el proyecto + + + Equipamiento, GPS y velocímetro + Equipamiento como GPS y velocímetro para el vehículo + + + Soportes para el vehículo + Soportes necesarios para montar el vehículo + + + + + + Soluciones Nerva + + + + + + Fibritel + + + + + + Karting Ángel Burgueño + + + + + + Mann filter + + + + + + IES Virgen de la Paloma + + + + + + Acer logística + + + + + + Talleres TUDAM + + + + + + diff --git a/ficheros/gastos.json b/ficheros/gastos.json new file mode 100644 index 0000000..9eabb47 --- /dev/null +++ b/ficheros/gastos.json @@ -0,0 +1,84 @@ +{ + "curso": "2024/2025", + "proyecto": "Hiperbaric", + "gastos": [ + { + "concepto": "Chasis", + "precio_unitario": 500, + "unidades": 1, + "fecha": "2024-09-15" + }, + { + "concepto": "Asiento", + "precio_unitario": 200, + "unidades": 1, + "fecha": "2024-09-16" + }, + { + "concepto": "Suspensión", + "precio_unitario": 100, + "unidades": 4, + "fecha": "2024-09-17" + }, + { + "concepto": "Dirección", + "precio_unitario": 800, + "unidades": 1, + "fecha": "2024-09-18" + }, + { + "concepto": "Frenos", + "precio_unitario": 600, + "unidades": 1, + "fecha": "2024-09-19" + }, + { + "concepto": "Neumáticos y llantas", + "precio_unitario": 250, + "unidades": 4, + "fecha": "2024-09-20" + }, + { + "concepto": "Elementos comerciales", + "precio_unitario": 400, + "unidades": 1, + "fecha": "2024-09-21" + }, + { + "concepto": "Carrocería", + "precio_unitario": 1000, + "unidades": 1, + "fecha": "2024-09-22" + }, + { + "concepto": "Cinturón", + "precio_unitario": 200, + "unidades": 1, + "fecha": "2024-09-23" + }, + { + "concepto": "Equipos de protección", + "precio_unitario": 950, + "unidades": 1, + "fecha": "2024-09-24" + }, + { + "concepto": "Logística", + "precio_unitario": 150, + "unidades": 1, + "fecha": "2024-09-25" + }, + { + "concepto": "Equipamiento, GPS y velocímetro", + "precio_unitario": 25, + "unidades": 30, + "fecha": "2024-09-26" + }, + { + "concepto": "Soportes para el vehículo", + "precio_unitario": 300, + "unidades": 1, + "fecha": "2024-09-27" + } + ] +} \ No newline at end of file diff --git a/ficheros/ingresos.csv b/ficheros/ingresos.csv new file mode 100644 index 0000000..902dffc --- /dev/null +++ b/ficheros/ingresos.csv @@ -0,0 +1,8 @@ +curso,proyecto,patrocinador,cantidad,observacion,fecha +2024/2025,Hiperbaric,Soluciones Nerva,1000,Donación para chasis,2024-09-15 +2024/2025,Hiperbaric,Fibritel,1500,Donación para suspensión y elementos comerciales,2024-09-16 +2024/2025,Hiperbaric,Karting Ángel Burgueño,800,Dirección,2024-09-17 +2024/2025,Hiperbaric,Mann filter,950,Donación para equipos de protección,2024-09-18 +2024/2025,Hiperbaric,IES Virgen de la Paloma,1000,Dietas y soportes para vehículo,2024-09-19 +2024/2025,Hiperbaric,Acer logística,150,Logística,2024-09-20 +2024/2025,Hiperbaric,Talleres TUDAM,700,Donación general,2024-09-21 \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..621d6aa --- /dev/null +++ b/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + aadd_act4_3 + aadd_act4_3 + 0.0.1-SNAPSHOT + + + + + objectdb + ObjectDB Repository + https://m2.objectdb.com + + + + + + + + tools.jackson.dataformat + jackson-dataformat-xml + 3.0.1 + + + + + com.objectdb + objectdb-jk + 2.9.4 + + + + + org.hibernate.orm + hibernate-core + 7.1.14.Final + + + + + jakarta.persistence + jakarta.persistence-api + 3.2.0 + + + + + org.postgresql + postgresql + 42.7.9 + + + + + \ No newline at end of file diff --git a/src/main/java/es/palomafp/aadd/inm/AppProyectosIES.java b/src/main/java/es/palomafp/aadd/inm/AppProyectosIES.java new file mode 100644 index 0000000..623c5ae --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/AppProyectosIES.java @@ -0,0 +1,33 @@ +package es.palomafp.aadd.inm; + +import es.palomafp.aadd.inm.procesador.ProcesadorFicheros; + +/** + * + * GestorMapaMundi: Clase que accede a información de la BBDD MapaMundi. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 26 sept 2025 + */ + +public class AppProyectosIES { + + public static void main(String[] args) { + AppProyectosIES app = new AppProyectosIES(); + + // Generar la estructura de la base de datos en PostgreSQL + //GestorSesionesHibernate.getSession(); + + app.procesarFicheros(); + } + + private void procesarFicheros() { + ProcesadorFicheros procesador = new ProcesadorFicheros(); + + procesador.procesarFicheroXMLCatalogos(); + + procesador.procesarFicheroJSONGastos(); + + procesador.procesarFicheroCSVIngresos(); + } +} \ No newline at end of file diff --git a/src/main/java/es/palomafp/aadd/inm/dao/IContinenteDAO.java b/src/main/java/es/palomafp/aadd/inm/dao/IContinenteDAO.java new file mode 100644 index 0000000..fa1e565 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/IContinenteDAO.java @@ -0,0 +1,23 @@ +package es.palomafp.aadd.inm.dao; + +import java.util.List; + +import es.palomafp.aadd.inm.vo.Patrocinador; + +/** + * + * IContinenteDAO: Interfaz que define las operaciones de acceso a datos para + * Continente. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public interface IContinenteDAO { + Patrocinador obtenerContinentePorID(String codigo); + + List obtenerListaContientes(); + + void crearContinente(Patrocinador continente); + + void actualizarContinente(Patrocinador continente); +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/IPaisDAO.java b/src/main/java/es/palomafp/aadd/inm/dao/IPaisDAO.java new file mode 100644 index 0000000..5ed765a --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/IPaisDAO.java @@ -0,0 +1,25 @@ +package es.palomafp.aadd.inm.dao; + +import java.util.List; + +import es.palomafp.aadd.inm.vo.Gasto; + +/** + * + * IPaisDAO: Interfaz que define las operaciones de acceso a datos para País. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public interface IPaisDAO { + Gasto obtenerPaisPorID(int identificador); + + List obtenerListaPaises(); + + void crearPais(Gasto pais); + + void actualizarPais(Gasto pais); + + Gasto obtenerPaisPorNombre(String nombre); + +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java b/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java new file mode 100644 index 0000000..95717f1 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java @@ -0,0 +1,52 @@ +package es.palomafp.aadd.inm.dao.hbm; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.query.SelectionQuery; + +import es.palomafp.aadd.inm.dao.IContinenteDAO; +import es.palomafp.aadd.inm.gestor.GestorSesionesHibernate; +import es.palomafp.aadd.inm.vo.Patrocinador; + +/** + * + * ContinenteDaoJDBC: Clase que implementa el interfaz IContinenteDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class ContinenteDaoHibernate implements IContinenteDAO { + + @Override + public List obtenerListaContientes() { + List listaContinentes = null; + String sentenciaHQL = """ + SELECT c + FROM Continente c + """; + // try con recursos "cerrables": Session + try (Session sesion = GestorSesionesHibernate.getSession();) { + SelectionQuery sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Patrocinador.class); + listaContinentes = sentenciaConsulta.getResultList(); + + } catch (Exception e) { + e.printStackTrace(); + } + return listaContinentes; + + } + + @Override + public void crearContinente(Patrocinador continente) { + } + + @Override + public Patrocinador obtenerContinentePorID(String codigo) { + return null; + } + + @Override + public void actualizarContinente(Patrocinador continente) { + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java b/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java new file mode 100644 index 0000000..60104f9 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java @@ -0,0 +1,102 @@ +package es.palomafp.aadd.inm.dao.hbm; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.SelectionQuery; + +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.gestor.GestorSesionesHibernate; +import es.palomafp.aadd.inm.vo.Gasto; + +/** + * + * PaisDaoJDBC: Clase que implementa el interfaz IPaisDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class PaisDaoHibernate implements IPaisDAO { + + @Override + public List obtenerListaPaises() { + List listaPaises = null; + String sentenciaHQL = """ + SELECT p + FROM Pais p + """; + + // try con recursos "cerrables": Session + try (Session sesion = GestorSesionesHibernate.getSession();) { + + SelectionQuery sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Gasto.class); + listaPaises = sentenciaConsulta.getResultList(); + + } catch (Exception e) { + e.printStackTrace(); + } + return listaPaises; + } + + @Override + public void actualizarPais(Gasto pais) { + Transaction transaccion = null; + Session sesion = null; + + try { + sesion = GestorSesionesHibernate.getSession(); + transaccion = sesion.beginTransaction(); + + if (!sesion.contains(pais)) + sesion.merge(pais); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (sesion != null) { + sesion.close(); + } + } + } + + @Override + public Gasto obtenerPaisPorID(int identificador) { + Gasto pais = null; + + return pais; + } + + @Override + public void crearPais(Gasto pais) { + // TODO Auto-generated method stub + + } + + @Override + public Gasto obtenerPaisPorNombre(String nombre) { + Gasto pais = null; + String sentenciaHQL = """ + SELECT p + FROM Pais p + where p.nombrePais = :nombre + """; + + // try con recursos "cerrables": Session + try (Session sesion = GestorSesionesHibernate.getSession();) { + + SelectionQuery sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Gasto.class); + sentenciaConsulta.setParameter("nombre", nombre); + pais = sentenciaConsulta.getSingleResult(); + + } catch (Exception e) { + e.printStackTrace(); + } + return pais; + } + +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/jpa/ContinenteDaoJPA.java b/src/main/java/es/palomafp/aadd/inm/dao/jpa/ContinenteDaoJPA.java new file mode 100644 index 0000000..26b99d4 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/jpa/ContinenteDaoJPA.java @@ -0,0 +1,90 @@ +package es.palomafp.aadd.inm.dao.jpa; + +import java.util.List; + +import es.palomafp.aadd.inm.dao.IContinenteDAO; +import es.palomafp.aadd.inm.gestor.GestorEntityManagerJPA; +import es.palomafp.aadd.inm.vo.Patrocinador; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; + +/** + * + * ContinenteDaoJDBC: Clase que implementa el interfaz IContinenteDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class ContinenteDaoJPA implements IContinenteDAO { + + @Override + public Patrocinador obtenerContinentePorID(String codigo) { + Patrocinador continente = null; + + // try con recursos "cerrables": Session + try (EntityManager gestorEntidades = GestorEntityManagerJPA.getEntityManager()) { + continente = gestorEntidades.find(Patrocinador.class, codigo); + } catch (Exception e) { + e.printStackTrace(); + } + return continente; + } + + @Override + public void crearContinente(Patrocinador continente) { + EntityManager gestorEntidades= null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion .begin(); + + gestorEntidades.persist(continente); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } + + @Override + public void actualizarContinente(Patrocinador continente) { + EntityManager gestorEntidades= null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion .begin(); + + if (!gestorEntidades.contains(continente)) + gestorEntidades.merge(continente); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } + + @Override + public List obtenerListaContientes() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/jpa/PaisDaoJPA.java b/src/main/java/es/palomafp/aadd/inm/dao/jpa/PaisDaoJPA.java new file mode 100644 index 0000000..25108f6 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/jpa/PaisDaoJPA.java @@ -0,0 +1,100 @@ +package es.palomafp.aadd.inm.dao.jpa; + +import java.util.List; + +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.gestor.GestorEntityManagerJPA; +import es.palomafp.aadd.inm.vo.Gasto; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; + +/** + * + * PaisDaoJPA: Clase que implementa el interfaz IPaisDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class PaisDaoJPA implements IPaisDAO { + + @Override + public Gasto obtenerPaisPorID(int identificador) { + Gasto pais = null; + + // try con recursos "cerrables": Session + try (EntityManager gestorEntidades = GestorEntityManagerJPA.getEntityManager()) { + pais = gestorEntidades.find(Gasto.class, identificador); + } catch (Exception e) { + e.printStackTrace(); + } + return pais; + + } + + + @Override + public void crearPais(Gasto pais) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + gestorEntidades.persist(pais); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + + } + + @Override + public void actualizarPais(Gasto pais) { + EntityManager gestorEntidades = null; + EntityTransaction transaccion = null; + + try { + gestorEntidades = GestorEntityManagerJPA.getEntityManager(); + transaccion = gestorEntidades.getTransaction(); + transaccion.begin(); + + if (!gestorEntidades.contains(pais)) + gestorEntidades.merge(pais); + + transaccion.commit(); + } catch (Exception e) { + if (transaccion != null && transaccion.isActive()) { + transaccion.rollback(); + } + e.printStackTrace(); + } finally { + if (gestorEntidades != null) { + gestorEntidades.close(); + } + } + } + + @Override + public List obtenerListaPaises() { + // TODO Auto-generated method stub + return null; + } + + + @Override + public Gasto obtenerPaisPorNombre(String nombre) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/main/java/es/palomafp/aadd/inm/gestor/GestorEntityManagerJPA.java b/src/main/java/es/palomafp/aadd/inm/gestor/GestorEntityManagerJPA.java new file mode 100644 index 0000000..7ef144e --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/gestor/GestorEntityManagerJPA.java @@ -0,0 +1,41 @@ +package es.palomafp.aadd.inm.gestor; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + +/** + * + * GestorEntityManagerJPA: Clase que realiza la gestión de EntityManagers de JPA. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 4 dic 2025 + * + * + */ + +public class GestorEntityManagerJPA { + private static EntityManagerFactory entityManagerFactory = null; + + private GestorEntityManagerJPA() { // Constructor privado para evitar instanciación + } + + // Carga la configuración desde META-INF/persistence.xml + static { + try { + entityManagerFactory = Persistence.createEntityManagerFactory("UP_PROYECTOSIES_ODB"); + } catch (Throwable ex) { + System.err.println("Error en EntityManagerFactory: " + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static EntityManager getEntityManager() { + return entityManagerFactory.createEntityManager(); + } + + + public static void closeEntityManagerFactory() { + entityManagerFactory.close(); + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java b/src/main/java/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java new file mode 100644 index 0000000..d2c68b6 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/gestor/GestorFicheroConfiguracion.java @@ -0,0 +1,45 @@ +package es.palomafp.aadd.inm.gestor; + +import java.io.IOException; +import java.util.Properties; + +/** + * + * GestorConfiguracion: Clase que se encarga de gestionar la configuración de + * los ficheros. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 10 oct 2025 + * + * + */ + +public class GestorFicheroConfiguracion { + private final static String RUTA_FICHERO_CONFIGURACION = "conf.properties"; + private static Properties propiedades = null; + + private GestorFicheroConfiguracion() { + // Constructor privado para evitar instanciación + } + + // Bloque estático que se ejecuta una única vez al cargar la clase + static { + cargarPropiedadesFichero(); + } + + private static void cargarPropiedadesFichero() { + propiedades = new Properties(); + try { + propiedades + .load(GestorFicheroConfiguracion.class.getClassLoader() + .getResourceAsStream(RUTA_FICHERO_CONFIGURACION)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static String getValorfromClave(String clave) { + return propiedades.getProperty(clave); + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java b/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java new file mode 100644 index 0000000..b62ada4 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java @@ -0,0 +1,46 @@ +package es.palomafp.aadd.inm.gestor; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +/** + * + * GestorSesionesHibernate: Clase que realiza .... + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 4 dic 2025 + * + * + */ + +public class GestorSesionesHibernate { + private static SessionFactory sessionFactory = null; + + private GestorSesionesHibernate() {// Constructor privado para evitar instanciación + } + + // Carga la configuración desde hibernate.cfg.xml + static { + try { + sessionFactory = new Configuration().configure().buildSessionFactory(); + } catch (Throwable ex) { + System.err.println("Error en SessionFactory: " + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static Session getSession() { + return sessionFactory.openSession(); + } + + public static Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + + public static void cerrarFactoria() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/procesador/ProcesadorFicheros.java b/src/main/java/es/palomafp/aadd/inm/procesador/ProcesadorFicheros.java new file mode 100644 index 0000000..1b72c58 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/procesador/ProcesadorFicheros.java @@ -0,0 +1,59 @@ +package es.palomafp.aadd.inm.procesador; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +import es.palomafp.aadd.inm.gestor.GestorFicheroConfiguracion; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; + +public class ProcesadorFicheros { + + public void procesarFicheroXMLCatalogos() { + String rutaFichero = GestorFicheroConfiguracion.getValorfromClave("catalogos.fichero.xml.ruta"); + File fichero = new File(rutaFichero); + + // Se asume que la información de Paises es correcta y ya existe en la BD + ObjectMapper mapper = new ObjectMapper(); + JsonNode root = mapper.readTree(fichero); + JsonNode nodoPeliculas = root.get("peliculas"); + + } + + public void procesarFicheroJSONGastos() { + String rutaFichero = GestorFicheroConfiguracion.getValorfromClave("gastos.fichero.json.ruta"); + File fichero = new File(rutaFichero); + + // Se asume que la información de Paises es correcta y ya existe en la BD + ObjectMapper mapper = new ObjectMapper(); + JsonNode root = mapper.readTree(fichero); + JsonNode nodoPeliculas = root.get("peliculas"); + + } + + public void procesarFicheroCSVIngresos() { + + String rutaFichero = GestorFicheroConfiguracion.getValorfromClave("ingresos.fichero.csv.ruta"); + File fichero = new File(rutaFichero); + + try (BufferedReader lector = new BufferedReader(new FileReader(fichero));) { + String linea; + while ((linea = lector.readLine()) != null) { + // Procesar la línea leída + String[] campos = linea.split(","); + // Suponiendo que el CSV tiene dos columnas: id, ingreso + String id = campos[0]; + String ingreso = campos[1]; + // Aquí iría la lógica para procesar cada línea + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + +} diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Concepto.java b/src/main/java/es/palomafp/aadd/inm/vo/Concepto.java new file mode 100644 index 0000000..077bd88 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/Concepto.java @@ -0,0 +1,33 @@ +package es.palomafp.aadd.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +/** + * + * Concepto: Clase que se usa para mapear la tabla de conceptos + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name = "T_CONCEPTO") +public class Concepto { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "identificador") + private int identificador; + + @Column(name = "nombre", length = 100, nullable = false, unique = true) + private String nombre; + + @Column(name = "descripcion", length = 255) + private String descripcion; +} diff --git a/src/main/java/es/palomafp/aadd/inm/vo/CursoAcademico.java b/src/main/java/es/palomafp/aadd/inm/vo/CursoAcademico.java new file mode 100644 index 0000000..dd2aff5 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/CursoAcademico.java @@ -0,0 +1,36 @@ +package es.palomafp.aadd.inm.vo; + +import java.time.LocalDate; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +/** + * + * CursoAcademico: Clase que se usa para mapear la tabla de Cursos Académicos. + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name="T_CURSO_ACADEMICO") +public class CursoAcademico { + @Id + @Column(name="codigo", columnDefinition = "CHAR(9)") + private String codigo; + + @Column(name="nombre", length=100, nullable = false, unique = true) + private String nombre; + + @Column(name="fecha_inicio", nullable = false) + private LocalDate fechaInicio; + + @Column(name="fecha_fin") + private LocalDate fechaFin; + +} + diff --git a/src/main/java/es/palomafp/aadd/inm/vo/CursoProyecto.java b/src/main/java/es/palomafp/aadd/inm/vo/CursoProyecto.java new file mode 100644 index 0000000..f1f8ae9 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/CursoProyecto.java @@ -0,0 +1,36 @@ +package es.palomafp.aadd.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * + * CursoProyecto: Clase que se usa para mapear la tabla de Proyectos de un Curso + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name = "T_CURSO_PROYECTO") +public class CursoProyecto { + @Id + @Column(name = "identificador") + private int identificador; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "cod_curso", columnDefinition = "CHAR(9)", nullable = false) + private CursoAcademico cursoAcademico; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "id_proyecto", nullable = false) + private Proyecto proyecto; + +} diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Gasto.java b/src/main/java/es/palomafp/aadd/inm/vo/Gasto.java new file mode 100644 index 0000000..8e33c24 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/Gasto.java @@ -0,0 +1,49 @@ +package es.palomafp.aadd.inm.vo; + +import java.time.LocalDate; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * + * Gasto: Clase que se usa para mapear la tabla de Gastos + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name="T_GASTO") +public class Gasto { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="identificador") + private int identificador; + + @Column(name="num_unidades", nullable = false) + private int numeroUnidades; + + @Column(name="precio_unidad", columnDefinition = "DECIMAL(10,2)", nullable = false) + private double precioUnidad; + + @Column(name="fecha") + private LocalDate fecha; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="id_concepto", nullable = false) + private Concepto concepto; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="id_cursoproyecto", nullable = false) + private CursoProyecto cursoProyecto; +} + diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Ingreso.java b/src/main/java/es/palomafp/aadd/inm/vo/Ingreso.java new file mode 100644 index 0000000..cff508d --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/Ingreso.java @@ -0,0 +1,48 @@ +package es.palomafp.aadd.inm.vo; + +import java.time.LocalDate; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +/** + * + * Ingreso: Clase que se usa para mapear la tabla de Ingresos + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name="T_INGRESO") +public class Ingreso { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="identificador") + private int identificador; + + @Column(name="cantidad", columnDefinition = "DECIMAL(10,2)", nullable = false) + private double cantidad; + + @Column(name="fecha") + private LocalDate fecha; + + @Column(name="observacion") + private String observacion; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="id_patrocinador", nullable = false) + private Patrocinador patrocinador; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="id_cursoproyecto", nullable = false) + private CursoProyecto cursoProyecto;} + diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Patrocinador.java b/src/main/java/es/palomafp/aadd/inm/vo/Patrocinador.java new file mode 100644 index 0000000..4870cf9 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/Patrocinador.java @@ -0,0 +1,36 @@ +package es.palomafp.aadd.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; + +/** + * + * Patrocinador: Clase que se usa para mapear la tabla de patrocinadoes + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name="T_PATROCINADOR") +public class Patrocinador { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="identificador") + private int identificador; + + @Column(name="nombre", length=100, nullable = false, unique = true) + private String nombre; + + @Lob + @Column(name = "imagen") + private byte[] imagenLogo; + +} + diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Proyecto.java b/src/main/java/es/palomafp/aadd/inm/vo/Proyecto.java new file mode 100644 index 0000000..af98298 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/vo/Proyecto.java @@ -0,0 +1,36 @@ +package es.palomafp.aadd.inm.vo; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +/** + * + * Proyecto: Clase que se usa para mapear la tabla de Proyectos + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 5 dic 2025 + * + * + */ + +@Entity +@Table(name="T_PROYECTO") +public class Proyecto { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="identificador") + private int identificador; + + @Column(name="nombre", length=100, nullable = false, unique = true) + private String nombre; + + @Column(name="descripcion", length=255) + private String descripcion; + + @Column(name="url_logo", length=255) + private String urlLogo; +} + diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..80e6f17 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,30 @@ + + + + + + com.objectdb.jpa.Provider + + + es.palomafp.aadd.inm.vo.Concepto + es.palomafp.aadd.inm.vo.Patrocinador + es.palomafp.aadd.inm.vo.Proyecto + es.palomafp.aadd.inm.vo.CursoAcademico + es.palomafp.aadd.inm.vo.CursoProyecto + es.palomafp.aadd.inm.vo.Gasto + es.palomafp.aadd.inm.vo.Ingreso + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/conf.properties b/src/main/resources/conf.properties new file mode 100644 index 0000000..23302e7 --- /dev/null +++ b/src/main/resources/conf.properties @@ -0,0 +1,10 @@ +# Informacin sobre fichero XML +catalogos.fichero.xml.ruta=ficheros/catalogos.xml + + +# Informacin sobre fichero JSON +gastos.fichero.json.ruta=ficheros/gastos.json + + +# Informacin sobre fichero CSV +ingresos.fichero.csv.ruta=ficheros/ingresos.csv diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..2d946fa --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,30 @@ + + + + + jdbc:postgresql://192.168.1.36:5432/proyectos_ies + org.postgresql.Driver + + org.hibernate.dialect.PostgreSQLDialect + + vdlp + postgresql_123 + + + create-drop + true + true + + + + + + + + + + + + \ No newline at end of file