willyPhelan /
Examen-final-Modulo-2-Henry-Frontend-Aprobado
Segundo examen henry challenge. Evaluacion de conocimientos en desarrollo frontend
Loading repository data…
Antomaker / repository
evaluación de conocimientos hasta el corte 2
Evaluación de conocimientos hasta el corte 2
Asignatura: Programación Orientada a Objetos Tema: Clases Abstractas, Interfaces, Excepciones, Herencia y Polimorfismo
Desarrollar una aplicación Java que integre los siguientes conceptos de POO:
Un banco necesita digitalizar su sistema de gestión de clientes, cuentas y transacciones. El sistema debe permitir:
Gestión de Clientes:
Gestión de Cuentas:
Gestión de Transacciones:
Gestión de Personal:
A continuación se listan todas las historias de usuario del sistema. Cada historia debe estar implementada y demostrada en la clase principal.
| ID | Historia | Criterios de Aceptación | Prioridad | Story Points |
|---|---|---|---|---|
| HU-01 | Como cajero, quiero registrar un cliente natural con sus datos personales para aperturar una cuenta en el sistema | - El sistema valida que el documento de identidad no esté repetido. El sistema lanza CapacidadExcedidaException si el banco alcanzó su límite de clientes. Los datos nulos o vacíos lanzan |
Debes identificar y modelar los casos de uso para los siguientes actores:
El diagrama debe incluir obligatoriamente:
<<implements>>)Jerarquía de herencia:
Persona (abstracta)
├── Empleado (abstracta)
│ ├── Cajero
│ ├── AsesorFinanciero
│ └── GerenteSucursal
└── Cliente (abstracta)
├── ClienteNatural
└── ClienteEmpresarial
Cuenta (abstracta)
├── CuentaCorriente
├── CuentaAhorros
└── CuentaCredito
Debes crear las siguientes interfaces en el paquete modelo.interfaces. Cada método debe tener implementación real en las clases que las usen — no se aceptan cuerpos vacíos {}.
ConsultableContrato para cualquier entidad que pueda ser consultada en el sistema.
| Método | Descripción |
|---|---|
String obtenerResumen() | Retorna un texto con los datos principales de la entidad |
boolean estaActivo() | Indica si la entidad está operativa |
String obtenerTipo() | Retorna una cadena que identifica el tipo concreto |
TransaccionableContrato para cuentas que soportan operaciones financieras. Sus métodos deben declarar las excepciones correspondientes con throws.
| Método | Descripción |
|---|---|
void depositar(double monto) | Aumenta el saldo de la cuenta |
void retirar(double monto) | Disminuye el saldo validando disponibilidad |
double calcularComision(double monto) | Retorna el valor de la comisión según el tipo de cuenta |
double consultarSaldo() | Retorna el saldo disponible actual |
AuditableContrato para entidades que registran historial de cambios.
| Método | Descripción |
|---|---|
LocalDateTime obtenerFechaCreacion() | Retorna la fecha en que se creó la entidad |
LocalDateTime obtenerUltimaModificacion() | Retorna la fecha del último cambio registrado |
String obtenerUsuarioModificacion() | Retorna el legajo del usuario que hizo el último cambio |
void registrarModificacion(String usuario) | Actualiza la fecha y el usuario de modificación |
NotificableContrato para entidades que pueden recibir notificaciones del banco.
| Método | Descripción |
|---|---|
void notificar(String mensaje) | Envía (imprime) un mensaje al cliente |
String obtenerContacto() | Retorna el email o teléfono de contacto |
boolean aceptaNotificaciones() | Indica si el cliente tiene activadas las notificaciones |
¿Qué clase implementa qué interfaz?
| Clase | Interfaces que debe implementar |
|---|---|
ClienteNatural | Consultable, Notificable, Auditable |
ClienteEmpresarial | Consultable, Notificable, Auditable |
CuentaCorriente | Consultable, Transaccionable, Auditable |
CuentaAhorros | Consultable, Transaccionable, Auditable |
CuentaCredito | Consultable, Transaccionable, Auditable |
AsesorFinanciero | Consultable, Auditable |
GerenteSucursal | Consultable, Auditable |
Banco | Auditable |
Debes crear la siguiente jerarquía de excepciones en el paquete modelo.excepciones.
Exception
└── SistemaBancarioException ← checked, clase base
├── SaldoInsuficienteException
├── CuentaBloqueadaException
├── ClienteNoEncontradoException
└── CapacidadExcedidaException
RuntimeException
└── BancoRuntimeException ← unchecked, clase base
├── DatoInvalidoException
├── EstadoTransaccionInvalidoException
└── PermisoInsuficienteException
| Excepción | Atributos adicionales obligatorios |
|---|---|
SistemaBancarioException | codigoError: String, timestamp: LocalDateTime |
SaldoInsuficienteException | saldoActual: double, montoSolicitado: double |
ClienteNoEncontradoException | idCliente: String |
CapacidadExcedidaException | capacidadMaxima: int |
DatoInvalidoException | campo: String, valorRecibido: Object |
EstadoTransaccionInvalidoException | (mensaje descriptivo con estado origen y destino) |
PermisoInsuficienteException | (mensaje descriptivo con la acción denegada) |
Todas las excepciones deben tener constructor con mensaje descriptivo, getters para sus atributos adicionales y sobrescribir
toString()cuando agreguen información relevante.
| Método | Excepción que debe lanzar |
|---|---|
Banco.abrirCuenta(...) | CapacidadExcedidaException |
Banco.registrarCliente(...) | CapacidadExcedidaException |
Banco.buscarCliente(String id) | ClienteNoEncontradoException |
Banco.registrarEmpleado(...) | CapacidadExcedidaException |
CuentaCorriente.retirar(double) | SaldoInsuficienteException, CuentaBloqueadaException |
CuentaAhorros.retirar(double) | SaldoInsuficienteException, CuentaBloqueadaException |
CuentaCredito.retirar(double) | CuentaBloqueadaException |
Cualquier depositar(double) | CuentaBloqueadaException |
Transaccion.cambiarEstado(...) | EstadoTransaccionInvalidoException |
| Todos los setters con validación | DatoInvalidoException |
GerenteSucursal.aprobarCredito(...) cuando lo llama otro tipo de empleado | PermisoInsuficienteException |
Persona — abstractaAtributos privados: id, nombre, apellido, fechaNacimiento (LocalDate), email
Métodos abstractos que las subclases deben implementar:
| Método | Propósito |
|---|---|
int calcularEdad() | Calcula la edad con base en fechaNacimiento y la fecha actual |
String obtenerTipo() | Retorna una cadena que identifica el tipo concreto de persona |
String obtenerDocumentoIdentidad() | Retorna el documento formateado según el tipo de persona |
Métodos concretos heredables:
| Método | Propósito |
|---|---|
String getNombreCompleto() | Retorna nombre + " " + apellido |
Reglas de validación en setters: id no puede ser nulo ni vacío. email debe contener @. fechaNacimiento no puede ser una fecha futura.
Empleado — abstracta, extiende PersonaAtributos privados: legajo, fechaContratacion (LocalDate), salarioBase, activo
Métodos abstractos:
| Método | Propósito |
|---|---|
double calcularSalario() | Calcula el salario mensual incluyendo bonificaciones — diferente en cada tipo de empleado |
double calcularBono() | Calcula el bono según metas o especialidad — diferente en cada tipo de empleado |
Métodos concretos heredables:
| Método | Propósito |
|---|---|
int calcularAntigüedad() | Retorna los años transcurridos desde fechaContratacion |
Regla: salarioBase debe ser mayor a 0. fechaContratacion no puede ser una fecha futura.
Cuenta — abstractaAtributos privados: numeroCuenta, saldo, bloqueada, fechaCreacion (LocalDateTime), ultimaModificacion (LocalDateTime), usuarioModificacion
Array estático interno: Transaccion[] historial de tamaño máximo 20.
Métodos abstractos:
| Método | Propósito |
|---|---|
double calcularInteres() | Calcula el interés mensual — fórmula diferente en cada tipo de cuenta |
double getLimiteRetiro() | Retorna el límite máximo de retiro diario según el tipo |
String getTipoCuenta() | Retorna la etiqueta del tipo de cuenta |
Métodos concretos heredables:
| Método | Propósito |
|---|---|
void verificarBloqueada() | Lanza CuentaBloqueadaException si la cuenta está bloqueada |
void agregarAlHistorial(Transaccion t) | Agrega al array interno; lanza CapacidadExcedidaException si está lleno |
Transaccion[] getHistorial() | Retorna una copia del array (no el original) |
| Clase | Atributos adicionales | Comportamiento especial |
|---|---|---|
Cajero | turno: Turno, sucursalAsignada: String, transaccionesDia: int | calcularSalario() = salarioBase + bono por transacciones del día |
AsesorFinanciero | comisionBase: double, metasMensuales: double, clientesAsignados: Cliente[] (máx. 20) | calcularSalario() = salarioBase + comisión si supera meta |
GerenteSucursal | sucursal: String, presupuestoAnual: double, empleadosACargo: Empleado[] (máx. 30) | calcularSalario() = salarioBase + bono por antigüedad + bono fijo de gerencia |
| Clase | Atributos adicionales |
|---|---|
ClienteNatural | tipoDocumento: TipoDocumento, numeroDocumento: String, cuentas: Cuenta[] (máx. 5) |
ClienteEmpresarial | nit: String, razonSocial: String, representanteLegal: String, cuentas: Cuenta[] (máx. 5) |
| Clase | Atributos adicionales | Fórmula de interés |
|---|---|---|
CuentaAhorros |
Selected from shared topics, language and repository description—not editorial ratings.
willyPhelan /
Segundo examen henry challenge. Evaluacion de conocimientos en desarrollo frontend
whalther /
Evaluación de conocimientos
whalther /
Evaluación de conocimientos
AldoGranillo /
Sistema de Logica difusa para la evaluacion de conocimiento
AnonimusEzio130 /
Test de evaluación conocimiento de Full stack Java + angular + spring boot + Typescript + sql
jsamaniego-22 /
Generación de un grafo de conocimiento a partir de Ontologias, para evaluación del aprendizaje en elearning