Commit inicial

This commit is contained in:
Isidoro Nevares Martín 2026-01-19 11:09:30 +01:00
commit e447864322
31 changed files with 1317 additions and 0 deletions

41
.classpath Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="test" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/bin/
*.class
/target/

23
.project Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>aadd_act4_2</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -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

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

124
ficheros/catalogos.xml Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<Catalogos>
<Cursos>
<Curso>
<Codigo>2024/2025</Codigo>
<Fechas>
<FechaInicio>2024-09-01</FechaInicio>
<FechaFin>2025-08-31</FechaFin>
</Fechas>
<Nombre>Curso 2024/2025</Nombre>
</Curso>
</Cursos>
<Proyectos>
<Proyecto>
<Informacion_descriptiva>
<Nombre>Hiperbaric</Nombre>
<Descripcion>Proyecto Hiperbaric, alumnos de 1º de grado medio de electromecánica de vehículos.</Descripcion>
<url_imagen_logo>https://eedd1dam.decieloytierra.es/avatars/e33ba9460633123bf4368fb219a43ad6f4c3a2403fece22134456e6009e4f485</url_imagen_logo>
</Informacion_descriptiva>
<ciclo_formativo>Grado Medio de Electromecánica de Vehículos</ciclo_formativo>
</Proyecto>
</Proyectos>
<Conceptos>
<Concepto>
<Nombre>Chasis</Nombre>
<Descripcion>Chasis para el vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Asiento</Nombre>
<Descripcion>Asiento para el vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Suspensión</Nombre>
<Descripcion>Sistema de suspensión para el vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Dirección</Nombre>
<Descripcion>Sistema de dirección para el vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Frenos</Nombre>
<Descripcion>Frenos del vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Neumáticos y llantas</Nombre>
<Descripcion>Neumáticos y llantas del vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Elementos comerciales</Nombre>
<Descripcion>Elementos comerciales para la venta o publicidad</Descripcion>
</Concepto>
<Concepto>
<Nombre>Carrocería</Nombre>
<Descripcion>Carrocería del vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Cinturón</Nombre>
<Descripcion>Cinturón de seguridad del vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Equipos de protección</Nombre>
<Descripcion>Equipos de protección para los conductores</Descripcion>
</Concepto>
<Concepto>
<Nombre>Logística</Nombre>
<Descripcion>Gastos de logística para el proyecto</Descripcion>
</Concepto>
<Concepto>
<Nombre>Equipamiento, GPS y velocímetro</Nombre>
<Descripcion>Equipamiento como GPS y velocímetro para el vehículo</Descripcion>
</Concepto>
<Concepto>
<Nombre>Soportes para el vehículo</Nombre>
<Descripcion>Soportes necesarios para montar el vehículo</Descripcion>
</Concepto>
</Conceptos>
<Patrocinadores>
<Patrocinador>
<Nombre>Soluciones Nerva</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>Fibritel</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>Karting Ángel Burgueño</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>Mann filter</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>IES Virgen de la Paloma</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>Acer logística</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
<Patrocinador>
<Nombre>Talleres TUDAM</Nombre>
<Direccion/>
<Telefono/>
<Imagen/>
</Patrocinador>
</Patrocinadores>
</Catalogos>

84
ficheros/gastos.json Normal file
View File

@ -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"
}
]
}

8
ficheros/ingresos.csv Normal file
View File

@ -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
1 curso proyecto patrocinador cantidad observacion fecha
2 2024/2025 Hiperbaric Soluciones Nerva 1000 Donación para chasis 2024-09-15
3 2024/2025 Hiperbaric Fibritel 1500 Donación para suspensión y elementos comerciales 2024-09-16
4 2024/2025 Hiperbaric Karting Ángel Burgueño 800 Dirección 2024-09-17
5 2024/2025 Hiperbaric Mann filter 950 Donación para equipos de protección 2024-09-18
6 2024/2025 Hiperbaric IES Virgen de la Paloma 1000 Dietas y soportes para vehículo 2024-09-19
7 2024/2025 Hiperbaric Acer logística 150 Logística 2024-09-20
8 2024/2025 Hiperbaric Talleres TUDAM 700 Donación general 2024-09-21

55
pom.xml Normal file
View File

@ -0,0 +1,55 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>aadd_act4_3</groupId>
<artifactId>aadd_act4_3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- Repositorio propio de ObjectDB -->
<repositories>
<repository>
<id>objectdb</id>
<name>ObjectDB Repository</name>
<url>https://m2.objectdb.com</url>
</repository>
</repositories>
<dependencies>
<!-- JACKSON para XML y JSON -->
<dependency>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>3.0.1</version>
</dependency>
<!-- Dependencia de ObjectDB buscada en el repositorio propio de ObjectDB -->
<dependency>
<groupId>com.objectdb</groupId>
<artifactId>objectdb-jk</artifactId>
<version>2.9.4</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>7.1.14.Final</version>
</dependency>
<!-- Jakarta Persistence API (requerida por Hibernate 7) -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.2.0</version>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.9</version>
</dependency>
</dependencies>
</project>

View File

@ -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();
}
}

View File

@ -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<Patrocinador> obtenerListaContientes();
void crearContinente(Patrocinador continente);
void actualizarContinente(Patrocinador continente);
}

View File

@ -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<Gasto> obtenerListaPaises();
void crearPais(Gasto pais);
void actualizarPais(Gasto pais);
Gasto obtenerPaisPorNombre(String nombre);
}

View File

@ -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<Patrocinador> obtenerListaContientes() {
List<Patrocinador> listaContinentes = null;
String sentenciaHQL = """
SELECT c
FROM Continente c
""";
// try con recursos "cerrables": Session
try (Session sesion = GestorSesionesHibernate.getSession();) {
SelectionQuery<Patrocinador> 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) {
}
}

View File

@ -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<Gasto> obtenerListaPaises() {
List<Gasto> listaPaises = null;
String sentenciaHQL = """
SELECT p
FROM Pais p
""";
// try con recursos "cerrables": Session
try (Session sesion = GestorSesionesHibernate.getSession();) {
SelectionQuery<Gasto> 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<Gasto> sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Gasto.class);
sentenciaConsulta.setParameter("nombre", nombre);
pais = sentenciaConsulta.getSingleResult();
} catch (Exception e) {
e.printStackTrace();
}
return pais;
}
}

View File

@ -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<Patrocinador> obtenerListaContientes() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -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<Gasto> obtenerListaPaises() {
// TODO Auto-generated method stub
return null;
}
@Override
public Gasto obtenerPaisPorNombre(String nombre) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="UP_PROYECTOSIES_ODB" transaction-type="RESOURCE_LOCAL">
<!-- Proveedor de persistencia JPA -->
<provider>com.objectdb.jpa.Provider</provider>
<!-- Mapeo de clases -->
<class>es.palomafp.aadd.inm.vo.Concepto</class>
<class>es.palomafp.aadd.inm.vo.Patrocinador</class>
<class>es.palomafp.aadd.inm.vo.Proyecto</class>
<class>es.palomafp.aadd.inm.vo.CursoAcademico</class>
<class>es.palomafp.aadd.inm.vo.CursoProyecto</class>
<class>es.palomafp.aadd.inm.vo.Gasto</class>
<class>es.palomafp.aadd.inm.vo.Ingreso</class>
<!-- Configuración de propiedades del SGDB (ObjectDB)-->
<properties>
<property name="jakarta.persistence.jdbc.url" value="objectdb://localhost/proyectos_ies.odb" />
<property name="jakarta.persistence.jdbc.user" value="admin"/>
<property name="jakarta.persistence.jdbc.password" value="admin"/>
</properties>
</persistence-unit>
</persistence>

View File

@ -0,0 +1,10 @@
# Información sobre fichero XML
catalogos.fichero.xml.ruta=ficheros/catalogos.xml
# Información sobre fichero JSON
gastos.fichero.json.ruta=ficheros/gastos.json
# Información sobre fichero CSV
ingresos.fichero.csv.ruta=ficheros/ingresos.csv

View File

@ -0,0 +1,30 @@
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:postgresql://192.168.1.36:5432/proyectos_ies</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="connection.username">vdlp</property>
<property name="connection.password">postgresql_123</property>
<!-- DB schema will be updated if needed -->
<property name="hbm2ddl.auto">create-drop</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- Mapeo de clases -->
<mapping class="es.palomafp.aadd.inm.vo.Concepto"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.Patrocinador"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.Proyecto"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.CursoAcademico"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.CursoProyecto"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.Gasto"></mapping>
<mapping class="es.palomafp.aadd.inm.vo.Ingreso"></mapping>
</session-factory>
</hibernate-configuration>