Commit ef673668 by Adrian

Añadido repositorios y funcionalidad con DDBB

parent 044deb99
Showing with 493 additions and 143 deletions
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
<artifactId>junit-jupiter</artifactId> <artifactId>junit-jupiter</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
......
No preview for this file type
...@@ -6,7 +6,6 @@ import org.hibernate.dialect.Dialect; ...@@ -6,7 +6,6 @@ import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction;
import org.hibernate.Hibernate;
import org.hibernate.type.StringType; import org.hibernate.type.StringType;
public class SQLDialect extends Dialect { public class SQLDialect extends Dialect {
......
...@@ -13,8 +13,9 @@ import org.springframework.boot.autoconfigure.domain.EntityScan; ...@@ -13,8 +13,9 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
* *
* @author Adrian * @author Adrian
*/ */
/**
/** Clase principal de arranque de la aplicación basada en SpringBoot */ * Clase principal de arranque de la aplicación basada en SpringBoot
*/
@SpringBootApplication(scanBasePackages = "es.ujaen.dae.ujacoin.beans") @SpringBootApplication(scanBasePackages = "es.ujaen.dae.ujacoin.beans")
@EntityScan(basePackages = "es.ujaen.dae.ujacoin.entidades") @EntityScan(basePackages = "es.ujaen.dae.ujacoin.entidades")
public class AppUjaBank { public class AppUjaBank {
......
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author adria
*/
@Repository
@Transactional
public class RepositorioClientes {
@PersistenceContext
EntityManager em;
public Cliente buscar(String clave) {
return em.find(Cliente.class, clave);
}
public void insertar(Cliente cliente) {
em.persist(cliente);
}
public void actualizar(Cliente cliente) {
em.merge(cliente);
}
public void eliminar(Cliente cliente) {
em.remove(em.merge(cliente));
}
public Cliente login(String dni, String clave) {
Cliente cliente = em.createQuery("Select c from Cliente c where c.dni = :dni and c.clave = :clave", Cliente.class).setParameter("dni", dni).setParameter("clave", clave).getSingleResult();
return cliente;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author adria
*/
@Repository
@Transactional
public class RepositorioCuentas {
@PersistenceContext
EntityManager em;
public Cuenta buscar(String numero) {
return em.find(Cuenta.class, numero);
}
public void insertar(Cuenta cuenta) {
em.persist(cuenta);
}
public void actualizar(Cuenta cuenta) {
em.merge(cuenta);
}
public void eliminar(Cuenta cuenta) {
em.remove(em.merge(cuenta));
}
public List<Cuenta> listarCuentasPorCliente(Cliente cliente) {
em.merge(cliente);
cliente.getTarjetasAsociadas();
return new ArrayList<>(cliente.getCuentasAsociadas().values());
}
public void añadirMovimiento(Cuenta cuenta, Movimiento movimiento){
Cuenta cuentaEnlazada = em.merge(cuenta);
cuentaEnlazada.getMovimientos().add(movimiento);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author adria
*/
@Repository
@Transactional
public class RepositorioMovimientos {
@PersistenceContext
EntityManager em;
public Movimiento buscar(String clave) {
return em.find(Movimiento.class, clave);
}
public void insertar(Movimiento movimiento) {
em.persist(movimiento);
}
public void actualizar(Movimiento movimiento) {
em.merge(movimiento);
}
public void eliminar(Movimiento movimiento) {
em.remove(em.merge(movimiento));
}
/**
* Devolver los movimientos desde y hacia una tarjeta concreta
*
* @param tarjeta tarjeta objetivo
* @return listado de movimientos
*/
public List<Movimiento> listMovimientos(Tarjeta tarjeta) {
List<Movimiento> movimientos = em.createQuery("Select m from Movimiento m where m.tarjeta = :tarjeta", Movimiento.class).setParameter("tarjeta", tarjeta.getIdentificador()).getResultList();
return movimientos;
}
/**
* Devolver los movimientos desde y hacia una tarjeta concreta
*
* @param cuenta tarjeta objetivo
* @return listado de movimientos
*/
public List<Movimiento> listMovimientos(Cuenta cuenta) {
List<Movimiento> movimientos = em.createQuery("Select m from Movimiento m where m.cuenta = :cuenta", Movimiento.class).setParameter("cuenta", cuenta.getNumero()).getResultList();
return movimientos;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author adria
*/
@Repository
@Transactional
public class RepositorioTarjetas {
@PersistenceContext
EntityManager em;
public Tarjeta buscar(int identificador) {
return em.find(Tarjeta.class, identificador);
}
public void insertar(Tarjeta tarjeta) {
em.persist(tarjeta);
}
public void actualizar(Tarjeta tarjeta) {
em.merge(tarjeta);
}
public void eliminar(Tarjeta tarjeta) {
em.remove(em.merge(tarjeta));
}
public List<Tarjeta> listarTarjetasPorCliente(Cliente cliente) {
em.merge(cliente);
cliente.getTarjetasAsociadas();
return new ArrayList<>(cliente.getTarjetasAsociadas().values());
}
}
...@@ -7,14 +7,21 @@ package es.ujaen.dae.ujacoin.beans; ...@@ -7,14 +7,21 @@ package es.ujaen.dae.ujacoin.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente; import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta; import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Movimiento;
import es.ujaen.dae.ujacoin.entidades.Tarjeta; import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import es.ujaen.dae.ujacoin.excepciones.DDBBCaida;
import es.ujaen.dae.ujacoin.excepciones.SaldoRestanteNoCero; import es.ujaen.dae.ujacoin.excepciones.SaldoRestanteNoCero;
import es.ujaen.dae.ujacoin.excepciones.UsuarioYaExistente;
import es.ujaen.dae.ujacoin.interfaces.ServicioUjaBank; import es.ujaen.dae.ujacoin.interfaces.ServicioUjaBank;
import es.ujaen.dae.ujacoin.util.TipoMovimiento;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random; import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/** /**
* Clase controlador principal del sistema * Clase controlador principal del sistema
...@@ -22,21 +29,21 @@ import org.springframework.stereotype.Component; ...@@ -22,21 +29,21 @@ import org.springframework.stereotype.Component;
@Component @Component
public class ServicioUjaBankImpl implements ServicioUjaBank { public class ServicioUjaBankImpl implements ServicioUjaBank {
/**
* Mapa para guardar los clientes usando el dni como clave
*/
private Map<String, Cliente> clientes;
/**
* Mapa para guardar las cuentas usando el numero como clave
*/
private Map<String, Cuenta> cuentas;
private Random rand = new Random(); private Random rand = new Random();
public ServicioUjaBankImpl() { @Autowired
private RepositorioClientes repoClientes;
clientes = new HashMap<>(); @Autowired
cuentas = new HashMap<>(); private RepositorioCuentas repoCuentas;
@Autowired
private RepositorioTarjetas repoTarjetas;
@Autowired
private RepositorioMovimientos repoMovimientos;
public ServicioUjaBankImpl() {
} }
...@@ -46,47 +53,81 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -46,47 +53,81 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
Cuenta cuentaNueva = new Cuenta(generadorCuentasNuevas(), cliente); Cuenta cuentaNueva = new Cuenta(generadorCuentasNuevas(), cliente);
cliente.asignarCuenta(cuentaNueva); cliente.asignarCuenta(cuentaNueva);
clientes.put(cliente.getDni(), cliente); try {
cuentas.put(cuentaNueva.getNumero(), cuentaNueva); repoClientes.insertar(cliente);
repoCuentas.insertar(cuentaNueva);
} catch (org.hibernate.exception.GenericJDBCException e) {
throw new UsuarioYaExistente();
} catch (DataAccessResourceFailureException e) {
throw new DDBBCaida();
}
} }
@Override @Override
public boolean loginCliente(String dni, String clave) { public Cliente loginCliente(String dni, String clave) {
return clientes.containsKey(dni) && clientes.get(dni).claveVálida(clave);
try {
return repoClientes.login(dni, clave);
} catch (EmptyResultDataAccessException e) {
return null;
}
} }
@Override @Override
public ArrayList<Tarjeta> listaTarjetas(String dni) { @Transactional
return new ArrayList<>(clientes.get(dni).getTarjetasAsociadas().values()); public ArrayList<Tarjeta> listaTarjetas(Cliente cliente) {
repoClientes.actualizar(cliente);
cliente.getTarjetasAsociadas();
return new ArrayList<>(cliente.getTarjetasAsociadas().values());
} }
@Override @Override
public ArrayList<Cuenta> listaCuentas(String dni) { public ArrayList<Cuenta> listaCuentas(Cliente cliente) {
return new ArrayList<>(clientes.get(dni).getCuentasAsociadas().values()); return (ArrayList<Cuenta>) repoCuentas.listarCuentasPorCliente(cliente);
} }
@Override @Override
public Cuenta verCuenta(String numero) { public Cuenta verCuenta(String numero) {
return cuentas.get(numero);
return repoCuentas.buscar(numero);
} }
@Override @Override
@Transactional
public void ingreso(Cuenta cuenta, Tarjeta tarjeta, float importe) { public void ingreso(Cuenta cuenta, Tarjeta tarjeta, float importe) {
//Llamada al sistema de gestión de tarjetas //cuenta.ingreso(tarjeta, importe);
cuenta.ingreso(tarjeta, importe);
} }
@Override @Override
@Transactional
public void reintegro(Cuenta cuenta, Tarjeta tarjeta, float importe) { public void reintegro(Cuenta cuenta, Tarjeta tarjeta, float importe) {
cuenta.reintegro(tarjeta, importe); // cuenta.reintegro(tarjeta, importe);
//Llamada al sistema de gestión de tarjetas
} }
@Override @Override
public void transferencia(Cuenta cuentaOrigen, Cuenta cuentaDestino, float importe) { public void transferencia(Cuenta cuentaOrigen, Cuenta cuentaDestino, float importe) {
cuentaOrigen.transferenciaA(cuentaDestino, importe);
cuentaDestino.transferenciaDesde(cuentaOrigen, importe); repoCuentas.actualizar(cuentaOrigen);
repoCuentas.actualizar(cuentaDestino);
cuentaOrigen.modificarSaldo(-importe);
cuentaDestino.modificarSaldo(importe);
Movimiento movOrigen = new Movimiento(TipoMovimiento.TMTransferenciaEmitida, importe, LocalDateTime.now(), cuentaDestino);
Movimiento movDestino = new Movimiento(TipoMovimiento.TMTrasnferenciaRecibida, importe, LocalDateTime.now(), cuentaOrigen);
repoMovimientos.insertar(movOrigen);
repoMovimientos.insertar(movDestino);
repoCuentas.añadirMovimiento(cuentaOrigen, movOrigen);
repoCuentas.añadirMovimiento(cuentaDestino, movDestino);
} }
@Override @Override
...@@ -95,7 +136,8 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -95,7 +136,8 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
Cuenta cuentaNueva = new Cuenta(generadorCuentasNuevas(), cliente); Cuenta cuentaNueva = new Cuenta(generadorCuentasNuevas(), cliente);
cliente.asignarCuenta(cuentaNueva); cliente.asignarCuenta(cuentaNueva);
cuentas.put(cuentaNueva.getNumero(), cuentaNueva); repoClientes.actualizar(cliente);
repoCuentas.insertar(cuentaNueva);
return cuentaNueva; return cuentaNueva;
...@@ -107,22 +149,36 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -107,22 +149,36 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
cliente.añadirTarjeta(tarjeta); cliente.añadirTarjeta(tarjeta);
repoClientes.actualizar(cliente);
repoClientes.insertar(cliente);
} }
@Override @Override
@Transactional
public void borrarCuenta(Cuenta cuenta) { public void borrarCuenta(Cuenta cuenta) {
if (cuenta.getSaldo() > 0) { if (cuenta.getSaldo() > 0) {
throw new SaldoRestanteNoCero(); throw new SaldoRestanteNoCero();
} }
//Cuidado es lazy
cuenta.getTitular().desenlazarCuenta(cuenta); cuenta.getTitular().desenlazarCuenta(cuenta);
cuentas.remove(cuenta.getNumero()); repoClientes.actualizar(cuenta.getTitular());
repoCuentas.eliminar(cuenta);
} }
@Override @Override
public void borrarTarjeta(Tarjeta tarjeta) { public void borrarTarjeta(int identificador) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
Tarjeta tarjeta = repoTarjetas.buscar(identificador);
if (tarjeta != null) {
repoTarjetas.eliminar(tarjeta);
}
} }
private String generadorCuentasNuevas() { private String generadorCuentasNuevas() {
...@@ -152,7 +208,7 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -152,7 +208,7 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
numeroCadena = numeroCadena.concat(String.valueOf(codigo)); numeroCadena = numeroCadena.concat(String.valueOf(codigo));
} }
if (!cuentas.containsKey(numeroCadena)) { if (repoCuentas.buscar(numeroCadena) == null) {
numeroValido = true; numeroValido = true;
} }
......
...@@ -10,6 +10,7 @@ import java.time.LocalDate; ...@@ -10,6 +10,7 @@ import java.time.LocalDate;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.MapKey; import javax.persistence.MapKey;
...@@ -24,27 +25,45 @@ import javax.persistence.Transient; ...@@ -24,27 +25,45 @@ import javax.persistence.Transient;
@Entity @Entity
public class Cliente { public class Cliente {
/**Dni del cliente*/ /**
* Dni del cliente
*/
@Id @Id
private String dni; private String dni;
/**Nombre del cliente*/ /**
* Nombre del cliente
*/
private String nombre; private String nombre;
/**Fecha de nacimiento del cliente*/ /**
* Fecha de nacimiento del cliente
*/
private LocalDate fechaNacimiento; private LocalDate fechaNacimiento;
/**Dirección del cliente*/ /**
* Dirección del cliente
*/
private String direccion; private String direccion;
/**Teléfono del cliente*/ /**
* Teléfono del cliente
*/
private String telefono; private String telefono;
/**Email del cliente*/ /**
* Email del cliente
*/
private String email; private String email;
/**Contraseña del cliente*/ /**
* Contraseña del cliente
*/
private String clave; private String clave;
/**Cuentas de las que es titular*/ /**
@OneToMany(mappedBy = "titular") * Cuentas de las que es titular
*/
@OneToMany(mappedBy = "titular", fetch = FetchType.EAGER)
@MapKey(name = "numero") @MapKey(name = "numero")
private Map<String, Cuenta> cuentasAsociadas; private Map<String, Cuenta> cuentasAsociadas;
/**Cuentas de las que es titular*/ /**
@OneToMany * Cuentas de las que es titular
*/
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn @JoinColumn
@MapKey(name = "numero") @MapKey(name = "numero")
private Map<String, Tarjeta> tarjetasAsociadas; private Map<String, Tarjeta> tarjetasAsociadas;
...@@ -114,6 +133,7 @@ public class Cliente { ...@@ -114,6 +133,7 @@ public class Cliente {
/** /**
* Añade una cuenta al cliente * Añade una cuenta al cliente
*
* @param cuenta * @param cuenta
*/ */
public void asignarCuenta(Cuenta cuenta) { public void asignarCuenta(Cuenta cuenta) {
...@@ -122,20 +142,22 @@ public class Cliente { ...@@ -122,20 +142,22 @@ public class Cliente {
/** /**
* Desenlaza la cuenta del usuario * Desenlaza la cuenta del usuario
*
* @param cuenta cuenta a remover * @param cuenta cuenta a remover
*/ */
public void desenlazarCuenta(Cuenta cuenta){ public void desenlazarCuenta(Cuenta cuenta) {
cuentasAsociadas.remove(cuenta.getNumero()); cuentasAsociadas.remove(cuenta.getNumero());
} }
/** /**
* Añade una tarjeta al cliente * Añade una tarjeta al cliente
*
* @param tarjeta * @param tarjeta
*/ */
public void añadirTarjeta(Tarjeta tarjeta) { public void añadirTarjeta(Tarjeta tarjeta) {
if(tarjetasAsociadas.get(tarjeta.getNumero()) != null && if (tarjetasAsociadas.get(tarjeta.getNumero()) != null
tarjetasAsociadas.get(tarjeta.getNumero()).getCvc().equals(tarjeta.getCvc())){ && tarjetasAsociadas.get(tarjeta.getNumero()).getCvc().equals(tarjeta.getCvc())) {
throw new TarjetaYaVinculada(); throw new TarjetaYaVinculada();
......
...@@ -12,6 +12,7 @@ import java.time.LocalDateTime; ...@@ -12,6 +12,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
...@@ -36,7 +37,7 @@ public class Cuenta { ...@@ -36,7 +37,7 @@ public class Cuenta {
/** /**
* Titular de la cuenta * Titular de la cuenta
*/ */
@ManyToOne @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "titularCuenta") @JoinColumn(name = "titularCuenta")
private Cliente titular; private Cliente titular;
...@@ -86,68 +87,21 @@ public class Cuenta { ...@@ -86,68 +87,21 @@ public class Cuenta {
} }
/** /**
* Ingresa en la cuenta el importe desde la tarjeta * Modifica el saldo, lanza excepción si el saldo resultante es negativo.
* * @param importe cambio
* @param tarjeta Tarjeta origen
* @param importe Importe de la operación
*/ */
public void ingreso(Tarjeta tarjeta, Float importe) { public void modificarSaldo(float importe){
movimientos.add(new Movimiento(TipoMovimiento.TMIngreso, importe, LocalDateTime.now(), tarjeta));
saldo += importe;
}
/**
* Reintegra en la tarjeta el importe desde la cuenta
*
* @param tarjeta Tarjeta destino
* @param importe Importe de la operación
*/
public void reintegro(Tarjeta tarjeta, Float importe) {
if ((saldo - importe) < 0) { if ((saldo + importe) < 0) {
throw new SaldoInsuficiente(); throw new SaldoInsuficiente();
} }
movimientos.add(new Movimiento(TipoMovimiento.TMReintegro, importe, LocalDateTime.now(), tarjeta));
saldo -= importe;
}
/**
* Ingresa en la cuenta el importe desde otra cuenta
*
* @param cuenta Cuenta origen
* @param importe Importe de la operación
*/
public void transferenciaDesde(Cuenta cuenta, Float importe) {
movimientos.add(new Movimiento(TipoMovimiento.TMTrasnferenciaRecibida, importe, LocalDateTime.now(), cuenta));
saldo += importe; saldo += importe;
} }
/** /**
* Retira de la cuenta el importe hacia otra cuenta
*
* @param cuenta Cuenta origen
* @param importe Importe de la operación
*/
public void transferenciaA(Cuenta cuenta, Float importe) {
if ((saldo - importe) < 0) {
throw new SaldoInsuficiente();
}
movimientos.add(new Movimiento(TipoMovimiento.TMTransferenciaEmitida, importe, LocalDateTime.now(), cuenta));
saldo -= importe;
}
/**
* Comprueba que el número de cuenta es válido, 12 dígitos numéricos, los * Comprueba que el número de cuenta es válido, 12 dígitos numéricos, los
* dos últimos dígitos son la suma de los anteriores modulo 100. * dos últimos dígitos son la suma de los anteriores modulo 100.
* *
......
...@@ -11,7 +11,6 @@ import es.ujaen.dae.ujacoin.excepciones.TarjetaNoValida; ...@@ -11,7 +11,6 @@ import es.ujaen.dae.ujacoin.excepciones.TarjetaNoValida;
import es.ujaen.dae.ujacoin.excepciones.TipoMovimientoInvalido; import es.ujaen.dae.ujacoin.excepciones.TipoMovimientoInvalido;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
...@@ -29,28 +28,33 @@ public class Movimiento { ...@@ -29,28 +28,33 @@ public class Movimiento {
@Id @Id
@GeneratedValue(strategy = GenerationType.AUTO) @GeneratedValue(strategy = GenerationType.AUTO)
private int identificador; private int identificador;
/** /**
* Tipo de movimiento * Tipo de movimiento
*/ */
private TipoMovimiento tipo; private TipoMovimiento tipo;
/** /**
* Importe del movimiento * Importe del movimiento
*/ */
private float importe; private float importe;
/** /**
* Fecha y hora del movimiento * Fecha y hora del movimiento
*/ */
private LocalDateTime fechaHora; private LocalDateTime fechaHora;
/** /**
* Cuenta destino/origen * Cuenta destino/origen
*/ */
@OneToOne @OneToOne//Eager por defecto
@JoinColumn(name = "cuentaOD") @JoinColumn(name = "cuentaOD")
private Cuenta cuenta; private Cuenta cuenta;
/** /**
* Tarjeta destino/origen * Tarjeta destino/origen
*/ */
@OneToOne @OneToOne//Eager por defecto
@JoinColumn(name = "tarjetaOD") @JoinColumn(name = "tarjetaOD")
private Tarjeta tarjeta; private Tarjeta tarjeta;
...@@ -105,4 +109,12 @@ public class Movimiento { ...@@ -105,4 +109,12 @@ public class Movimiento {
return tarjeta; return tarjeta;
} }
public int getIdentificador() {
return identificador;
}
public LocalDateTime getFechaHora() {
return fechaHora;
}
} }
...@@ -13,24 +13,33 @@ import javax.persistence.GeneratedValue; ...@@ -13,24 +13,33 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
/**Tarjetas de crédito asociadas a clientes /**
* Tarjetas de crédito asociadas a clientes
* *
* @author Adrian * @author Adrian
*/ */
@Entity @Entity
public class Tarjeta{ public class Tarjeta {
@Id @Id
@GeneratedValue(strategy = GenerationType.AUTO) @GeneratedValue(strategy = GenerationType.AUTO)
private int Identificador; private int Identificador;
/** Número de la tarjeta*/ /**
* Número de la tarjeta
*/
private String numero; private String numero;
/** Titular de la tarjeta*/ /**
* Titular de la tarjeta
*/
private String titular; private String titular;
/** Código de seguridad de la tarjeta*/ /**
* Código de seguridad de la tarjeta
*/
private String cvc; private String cvc;
/** Fecha de caducidad de la tarjeta*/ /**
* Fecha de caducidad de la tarjeta
*/
private LocalDate fechaCaducidad; private LocalDate fechaCaducidad;
public Tarjeta() { public Tarjeta() {
...@@ -40,7 +49,9 @@ public class Tarjeta{ ...@@ -40,7 +49,9 @@ public class Tarjeta{
public Tarjeta(String numero, String titular, String cvc, LocalDate fechaCaducidad) { public Tarjeta(String numero, String titular, String cvc, LocalDate fechaCaducidad) {
if(!checkNumeroTarjeta(numero)) throw new TarjetaNoValida(); if (!checkNumeroTarjeta(numero)) {
throw new TarjetaNoValida();
}
this.numero = numero; this.numero = numero;
this.titular = titular; this.titular = titular;
...@@ -65,8 +76,14 @@ public class Tarjeta{ ...@@ -65,8 +76,14 @@ public class Tarjeta{
return fechaCaducidad; return fechaCaducidad;
} }
public int getIdentificador() {
return Identificador;
}
/** /**
* Comprueba que el número de tarjeta es válido, 8 dígitos numéricos, la suma de los dígitos tiene que ser multiplo de 4. * Comprueba que el número de tarjeta es válido, 8 dígitos numéricos, la
* suma de los dígitos tiene que ser multiplo de 4.
*
* @param numero Numero de tarjeta a comprobar * @param numero Numero de tarjeta a comprobar
* @return True si el número es válido, false en otro caso * @return True si el número es válido, false en otro caso
*/ */
......
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.excepciones;
/**
*
* @author Adrian
*/
public class DDBBCaida extends RuntimeException {
}
...@@ -9,6 +9,6 @@ package es.ujaen.dae.ujacoin.excepciones; ...@@ -9,6 +9,6 @@ package es.ujaen.dae.ujacoin.excepciones;
* *
* @author UJA * @author UJA
*/ */
public class SaldoRestanteNoCero extends RuntimeException{ public class SaldoRestanteNoCero extends RuntimeException {
} }
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.excepciones;
/**
*
* @author Adrian
*/
public class UsuarioYaExistente extends RuntimeException {
}
...@@ -12,40 +12,46 @@ import java.util.ArrayList; ...@@ -12,40 +12,46 @@ import java.util.ArrayList;
/** /**
* Interfaz para las operaciones publicas del servidor * Interfaz para las operaciones publicas del servidor
*
* @author Adrian * @author Adrian
*/ */
public interface ServicioUjaBank { public interface ServicioUjaBank {
/** /**
* Da de alta a un nuevo cliente y le asocia una cuenta * Da de alta a un nuevo cliente y le asocia una cuenta
*
* @param cliente cliente a crear * @param cliente cliente a crear
*/ */
public void altaCliente(Cliente cliente); public void altaCliente(Cliente cliente);
/** /**
* Comprueba las credenciales del cliente * Comprueba las credenciales del cliente
*
* @param dni Dni del cliente * @param dni Dni del cliente
* @param clave Contraseña * @param clave Contraseña
* @return True si las credenciales son válidas * @return Cliente si las credenciales son válidas, Null si no
*/ */
public boolean loginCliente(String dni, String clave); public Cliente loginCliente(String dni, String clave);
/** /**
* Lista las tarjetas asociadas a un cliente * Lista las tarjetas asociadas a un cliente
* @param dni Dni del cliente *
* @param cliente cliente
* @return Lista de las tarjetas * @return Lista de las tarjetas
*/ */
public ArrayList<Tarjeta> listaTarjetas(String dni); public ArrayList<Tarjeta> listaTarjetas(Cliente cliente);
/** /**
* Listas las cuentas asociadas a un cliente * Listas las cuentas asociadas a un cliente
* @param dni Dni del cliente *
* @param cliente Dni del cliente
* @return Lista de cuentas * @return Lista de cuentas
*/ */
public ArrayList<Cuenta> listaCuentas(String dni); public ArrayList<Cuenta> listaCuentas(Cliente cliente);
/** /**
* Devuelve una cuenta localizando su número * Devuelve una cuenta localizando su número
*
* @param numero Identificador de la cuenta * @param numero Identificador de la cuenta
* @return * @return
*/ */
...@@ -53,6 +59,7 @@ public interface ServicioUjaBank { ...@@ -53,6 +59,7 @@ public interface ServicioUjaBank {
/** /**
* Genera un ingreso en la cuenta del cliente desde una tarjeta * Genera un ingreso en la cuenta del cliente desde una tarjeta
*
* @param cuenta Cuenta destino * @param cuenta Cuenta destino
* @param tarjeta Tarjeta origen * @param tarjeta Tarjeta origen
* @param importe Importe de la operación * @param importe Importe de la operación
...@@ -61,6 +68,7 @@ public interface ServicioUjaBank { ...@@ -61,6 +68,7 @@ public interface ServicioUjaBank {
/** /**
* Genera un reintegro desde una cuenta del cliente hacia una tarjeta * Genera un reintegro desde una cuenta del cliente hacia una tarjeta
*
* @param cuenta Cuenta origen * @param cuenta Cuenta origen
* @param tarjeta Tarjeta destino * @param tarjeta Tarjeta destino
* @param importe Importe de la operación * @param importe Importe de la operación
...@@ -69,6 +77,7 @@ public interface ServicioUjaBank { ...@@ -69,6 +77,7 @@ public interface ServicioUjaBank {
/** /**
* Genera una transferencia entre cuentas * Genera una transferencia entre cuentas
*
* @param cuentaOrigen Cuenta origen * @param cuentaOrigen Cuenta origen
* @param cuentaDestino Cuenta destino * @param cuentaDestino Cuenta destino
* @param importe Importe de la operación * @param importe Importe de la operación
...@@ -77,6 +86,7 @@ public interface ServicioUjaBank { ...@@ -77,6 +86,7 @@ public interface ServicioUjaBank {
/** /**
* Genera una cuenta nueva para el cliente y la devuelve * Genera una cuenta nueva para el cliente y la devuelve
*
* @param cliente Cliente al que se le asignara la nueva cuenta * @param cliente Cliente al que se le asignara la nueva cuenta
* @return la cuenta recién creada * @return la cuenta recién creada
*/ */
...@@ -84,23 +94,24 @@ public interface ServicioUjaBank { ...@@ -84,23 +94,24 @@ public interface ServicioUjaBank {
/** /**
* Genera una tarjeta nueva para el cliente y la devuelve * Genera una tarjeta nueva para el cliente y la devuelve
*
* @param cliente Cliente al que se le asignara la nueva cuenta * @param cliente Cliente al que se le asignara la nueva cuenta
* @param tarjeta tarjeta para vincular al clente * @param tarjeta tarjeta para vincular al clente
*/ */
public void añadirTarjeta(Cliente cliente, Tarjeta tarjeta); public void añadirTarjeta(Cliente cliente, Tarjeta tarjeta);
/** /**
* Borra una cuenta con saldo = 0 * Borra una cuenta con saldo = 0
*
* @param cuenta cuenta a borrar * @param cuenta cuenta a borrar
*/ */
public void borrarCuenta(Cuenta cuenta); public void borrarCuenta(Cuenta cuenta);
/** /**
* Borra una tarjeta * Borra una tarjeta
* @param tarjeta tarjeta a borrar *
* @param identificador tarjeta a borrar
*/ */
public void borrarTarjeta(Tarjeta tarjeta); public void borrarTarjeta(int identificador);
} }
...@@ -5,11 +5,12 @@ ...@@ -5,11 +5,12 @@
*/ */
package es.ujaen.dae.ujacoin.util; package es.ujaen.dae.ujacoin.util;
/** Enum para el tipo de movimiento /**
* Enum para el tipo de movimiento
* *
* @author Adrian * @author Adrian
*/ */
public enum TipoMovimiento{ public enum TipoMovimiento {
TMIngreso, TMIngreso,
TMReintegro, TMReintegro,
TMTransferenciaEmitida, TMTransferenciaEmitida,
......
...@@ -14,19 +14,22 @@ import org.junit.jupiter.api.Test; ...@@ -14,19 +14,22 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Assumptions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
/** /**
* Test de integración para el controlador del sistema Usa @SpringBootTest para * Test de integración para el controlador del sistema Usa @SpringBootTest para
* poder hacer el test usando el bean dentro del contenedor IoC de Spring * poder hacer el test usando el bean dentro del contenedor IoC de Spring
*/ */
//@DataJpaTest
//@ContextConfiguration(classes = AppUjaBank.class)
@SpringBootTest(classes = {AppUjaBank.class}) @SpringBootTest(classes = {AppUjaBank.class})
public class ServicioUjaBankImplIntegrationTest { public class ServicioUjaBankImplIntegrationTest {
@Autowired @Autowired
ServicioUjaBankImpl ujaBank; ServicioUjaBankImpl ujaBank;
/** /**
* Test of altaCliente method, of class ServicioUjaBankImpl. * Test of altaCliente method, of class ServicioUjaBankImpl.
*/ */
...@@ -34,9 +37,9 @@ public class ServicioUjaBankImplIntegrationTest { ...@@ -34,9 +37,9 @@ public class ServicioUjaBankImplIntegrationTest {
public void testAltaClienteYLoginCliente() { public void testAltaClienteYLoginCliente() {
ujaBank.altaCliente(new Cliente("12345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas")); ujaBank.altaCliente(new Cliente("12345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas"));
Assertions.assertFalse(ujaBank.loginCliente("12345678A", "1234qwasd")); Assertions.assertNull(ujaBank.loginCliente("12345678A", "1234qwasd"));
Assertions.assertFalse(ujaBank.loginCliente("123678A", "1234qwas")); Assertions.assertNull(ujaBank.loginCliente("123678A", "1234qwas"));
Assertions.assertTrue(ujaBank.loginCliente("12345678A", "1234qwas")); Assertions.assertNotNull(ujaBank.loginCliente("12345678A", "1234qwas"));
} }
...@@ -53,11 +56,13 @@ public class ServicioUjaBankImplIntegrationTest { ...@@ -53,11 +56,13 @@ public class ServicioUjaBankImplIntegrationTest {
*/ */
@Test @Test
public void testListaCuentas() { public void testListaCuentas() {
ujaBank.altaCliente(new Cliente("12345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas")); ujaBank.altaCliente(new Cliente("12345679A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas"));
Cliente cliente = ujaBank.loginCliente("12345679A", "1234qwas");
Assumptions.assumeTrue(ujaBank.loginCliente("12345678A", "1234qwas")); Assumptions.assumeTrue(cliente != null);
Assertions.assertEquals(1, ujaBank.listaCuentas("12345678A").size()); Assertions.assertEquals(1, ujaBank.listaCuentas(cliente).size());
} }
...@@ -67,10 +72,12 @@ public class ServicioUjaBankImplIntegrationTest { ...@@ -67,10 +72,12 @@ public class ServicioUjaBankImplIntegrationTest {
@Test @Test
public void testVerCuenta() { public void testVerCuenta() {
ujaBank.altaCliente(new Cliente("12345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas")); ujaBank.altaCliente(new Cliente("22345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas"));
Assumptions.assumeTrue(ujaBank.loginCliente("12345678A", "1234qwas")); Cliente cliente = ujaBank.loginCliente("22345678A", "1234qwas");
Assumptions.assumeTrue(cliente != null);
ArrayList<Cuenta> cuentas = ujaBank.listaCuentas("12345678A"); ArrayList<Cuenta> cuentas = ujaBank.listaCuentas(cliente);
cuentas.forEach(cuenta -> { cuentas.forEach(cuenta -> {
Assertions.assertNotNull(ujaBank.verCuenta(cuenta.getNumero())); Assertions.assertNotNull(ujaBank.verCuenta(cuenta.getNumero()));
...@@ -100,14 +107,17 @@ public class ServicioUjaBankImplIntegrationTest { ...@@ -100,14 +107,17 @@ public class ServicioUjaBankImplIntegrationTest {
@Test @Test
public void testTransferencia() { public void testTransferencia() {
ujaBank.altaCliente(new Cliente("12345678A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas")); ujaBank.altaCliente(new Cliente("12345687A", "Antonio Francisco Postigo", LocalDate.parse("1950-05-13"), "Calle Falsa 123", "654654654", "pureba@uja.es", "1234qwas"));
Assumptions.assumeTrue(ujaBank.loginCliente("12345678A", "1234qwas"));
ujaBank.altaCliente(new Cliente("87654321B", "Antonio Francisco Postigo", LocalDate.parse("1950-02-01"), "Calle Falsa 124", "953010101", "pureba@uja.es", "qwas1234")); ujaBank.altaCliente(new Cliente("87654321B", "Antonio Francisco Postigo", LocalDate.parse("1950-02-01"), "Calle Falsa 124", "953010101", "pureba@uja.es", "qwas1234"));
Assumptions.assumeTrue(ujaBank.loginCliente("87654321B", "qwas1234"));
Cuenta cuentaA = ujaBank.listaCuentas("12345678A").get(0); Cliente clienteA = ujaBank.loginCliente("12345687A", "1234qwas");
Cuenta cuentaB = ujaBank.listaCuentas("87654321B").get(0); Cliente clienteB = ujaBank.loginCliente("87654321B", "qwas1234");
Assumptions.assumeTrue(clienteA != null);
Assumptions.assumeTrue(clienteB != null);
Cuenta cuentaA = ujaBank.listaCuentas(clienteA).get(0);
Cuenta cuentaB = ujaBank.listaCuentas(clienteB).get(0);
cuentaA.setSaldo(450); cuentaA.setSaldo(450);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment