Trabajo Final Integrador de Programación 2 - UTN
Link al video explicativo: https://youtu.be/tlba6bTBGB0
Link secundario: https://drive.google.com/file/d/1tR6CAjF2fkM8lgNX4Pv6hndnKGzz3X3H/view?usp=sharing
| Nombre y Apellido | Email de Contacto | Comisión |
|---|---|---|
| Agustín Sotelo Carmelich | [email protected] | 10 |
| Bruno Giuliano Vapore | [email protected] | 10 |
| Diego Alejandro Velardes | [email protected] | 3 |
| Santiago Octavio Varela | [email protected] | 14 |
📦 TFI_Programacion2_Grupo10
┣ 📂 src/
┃ ┗ 📂 main/
┃ ┗ 📂 java/
┃ ┣ 📂 config/ # Conexión a la base de datos (DatabaseConnection)
┃ ┣ 📂 dao/ # Interfaces genéricas y DAOs concretos (EmpleadoDao, LegajoDao)
┃ ┣ 📂 entities/ # Clases Empleado y Legajo
┃ ┣ 📂 service/ # Lógica de negocio y manejo de transacciones
┃ ┗ 📂 main/ # Clase principal y menú de consola (AppMenu)
┣ 📂 sql/
┃ ┗ 📂 Scripts/
┃ ┣ 📄 create_database.sql # Script de creación de la base y tablas
┃ ┗ 📄 insert_data.sql # Script con datos de prueba
┣ 📂 lib/ # Librerías externas (.jar) agregadas al proyecto desde NetBeans
┣ 📂 img/
┃ ┗ 📄 UML_Empleado_Legajo.png # Imagen del Diagrama UML del dominio Empleado-Legajo
┣ 📂 docs/
┃ ┣ 📄 Informe_TFI_Grupo10.pdf # Informe final con análisis y conclusiones
┃ ┗ 📄 Diagrama_TFI_Grupo10.uxf # Diagrama UML para importar en UMLetino
┣ 📄 config.properties # Configuración de conexión MySQL (usuario, contraseña, URL)
┣ 📄 .gitignore # Exclusiones de archivos y carpetas
┗ 📄 README.md # Archivo actual
Se seleccionó el dominio Empleado (A) → Legajo (B) por su aplicabilidad para cumplir con todos los objetivos técnicos y de negocio establecidos en el Trabajo Final Integrador.
El requisito principal del trabajo es modelar una asociación unidireccional 1 a 1, y el dominio Empleado → Legajo representa este escenario de forma natural en un sistema de gestión de personal. Un Empleado posee un único Legajo en su expediente, y un Legajo pertenece exclusivamente a un Empleado.
Esta correlación directa permite implementar la restricción 1 a 1 en la base de datos mediante una clave foránea única (UNIQUE FOREIGN KEY) en la tabla legajo (específicamente, la columna empleado_id), apuntando a empleado. Esto garantiza que cada empleado tenga un solo legajo y viceversa.
Además, el dominio permite aplicar de manera práctica el uso de transacciones (commit/rollback). El alta de un empleado constituye un caso ideal para demostrar la atomicidad: la creación de un Empleado (entidad A) requiere la creación simultánea de su Legajo (entidad B). Si alguna de las inserciones falla (por ejemplo, por violar una restricción UNIQUE en nro_legajo), toda la operación debe revertirse, asegurando la integridad del sistema.
El sistema se apoya en un conjunto de validaciones que garantizan la consistencia de los datos y la correcta gestión del personal:
-
Validación de Unicidad:
dni(Empleado)email(Empleado)nro_legajo(Legajo)
-
Validación de Formato:
- Campo
emailcon estructura estándar (ejemplo: [email protected])
- Campo
-
Manejo de Tipos de Datos:
- Fechas (
fechaIngreso,fechaAlta) gestionadas conjava.time.LocalDate - Campo
estadodel legajo comoENUM('ACTIVO','INACTIVO')
- Fechas (
-
Borrado Lógico:
- Campo
eliminadopara ocultar registros sin perder trazabilidad.
- Campo
-
Relación 1→1 y Borrado en Cascada:
- Cada
Empleadotiene un únicoLegajo. - Si un
Empleadose elimina, suLegajoasociado también se borra (ON DELETE CASCADE).
- Cada
El flujo de negocio está pensado en sentido único: dado un empleado, obtener su legajo.
Esto justifica una asociación unidireccional donde la entidad Empleado conoce a Legajo, pero no a la inversa, cumpliendo con la consigna del TFI.
- Java JDK 21 o superior
- MySQL 8.0 o superior
- DBeaver o cliente SQL compatible
- Apache NetBeans IDE 19 o superior
- Conector JDBC MySQL (
mysql-connector-j-9.5.0.jar)
-
Abrir DBeaver y conectarse a MySQL como usuario
root. -
Ejecutar el script
create_database.sqlubicado en la carpeta/sql/:SOURCE sql/create_database.sql;
Esto creará la base de datos
tpi_prog2_empleadosjunto con las tablasempleadoylegajo. -
Seleccionar base de datos y Ejecutar el script
insert_data.sql:SOURCE sql/insert_data.sql;
Esto insertará datos de prueba coherentes con el dominio
Empleado → Legajo. -
Verificar la correcta creación de los registros con:
SELECT * FROM empleado; SELECT * FROM legajo;
Dado que los archivos del entorno (nbproject/, build.xml, etc.) no se incluyen en el repositorio por buenas prácticas de versionado, se debe importar el código fuente existente en NetBeans de la siguiente manera:
-
Abrir Apache NetBeans.
-
Ir a File → New Project...
-
Seleccionar Java with Ant → Java Project with Existing Sources y presionar Next.
-
Asignar el nombre del proyecto (por ejemplo,
TFI_Programacion2_Grupo10). -
En Project Folder, elegir la ubicación donde se guardará el proyecto.
-
En Source Package Folders, seleccionar la carpeta
src/del repositorio clonado. -
Presionar Finish.
-
Una vez creado el proyecto, en el panel izquierdo hacer clic derecho sobre “Libraries” → Add JAR/Folder...
-
Seleccionar el archivo
mysql-connector-j-9.5.0.jarubicado dentro de la carpeta/lib/del repositorio. -
Confirmar con Open y verificar que el JAR aparezca en la lista de librerías del proyecto.
-
Luego, copiar el archivo
config.properties.exampley usarlo de modelo paraconfig.properties(ubicarlo en la carpetasrc/o una carpeta nuevasrc/main/resources/o en la raíz del proyecto) y completar las credenciales de conexión a MySQL:db.url=jdbc:mysql://localhost:3306/ db.name=tpi_prog2_empleados db.user=root db.pass=ESCRIBE_TU_CLAVE_LOCAL_AQUI
⚠️ Es importante reemplazartu_contraseñapor la clave real del usuariorooten tu instalación local de MySQL. Hacer Cleand and Build del proyecto si es necesario
Con esto, NetBeans generará automáticamente los archivos de configuración locales (nbproject/, build.xml, etc.), agregará el conector JDBC y establecerá los parámetros de conexión a la base de datos.
El proyecto quedará listo para compilar y ejecutar correctamente desde el IDE.
El siguiente diagrama UML representa la relación 1→1 entre las clases Empleado (A) y Legajo (B), junto con sus principales atributos y la dirección de la asociación.
