Commit 7dc9f1b0 by Antonio Rueda

Merge con fixes en master

parents 75bdca43 663d8451
# Backend para banco virtual con criptomoneda propia
El proyecto propuesto consiste en diseñar el backend para un banco virtual
UJABank que usa una moneda propia, el UJACoin.
Como todo banco es posible abrir una cuenta, ingresar dinero (en euros que se
convierten en UJACs según el cambio actual) y transferir dinero de una cuenta a otra.
Se deben habilitar servicios para implementar la siguiente funcionalidad mínima:
- Registrar nuevos usuarios en UJABank creando una nueva cuenta. El usuario debe indicar sus datos personales (nombre, DNI o pasaporte, dirección de domicilio, fecha de nacimiento, tlf y e-mail).
- Hacer login de un usuario registrado previamente.
- Crear nuevas cuentas (para usuarios ya registrados con una primera cuenta).
- Ingresar dinero en euros, convirtiéndose en UJACs. Para ello se indicarán los
datos de una tarjeta de crédito (titular, número, fecha de caducidad y CVV).
- Transferir UJACoins de una cuenta a otra de UJABank de un usuario registrado.
Las transferencias llevan asociada fecha, concepto e importe.
- Retirar UJACs de una cuenta, que se transferirán en euros a la cuenta asociada
a una tarjeta de crédito (indicar los mismos datos que en el ingreso).
- Consultar movimientos de una cuenta de un usuario registrado (ingresos
y transferencias).
Para probar el funcionamiento del backend, se integrará en el mismo proyecto un
cliente sencillo de consola con un funcionamiento similar al de un cliente real
(web, móvil). Es importante que las clases relacionadas con este cliente se
mantengan en un paquete separado del resto del backend para evitar incumplimientos
del principio de separación en capas y facilitar su separación en un proyecto
diferente más adelante.
Nota: el profesor entregará una clase que devolverá el cambio actualizado Euro-UJAC.
\ No newline at end of file
......@@ -16,7 +16,7 @@ Después arranca el contenedor, define _secret_ como clave de root y
asocia MySQL al puerto de la máquina anfitrión 33060.
```
docker exec mysql-db mysql -psecret -e “create database ujacoin; use ujacoin; create user 'ujacoin' identified by 'secret'; grant all privileges on ujacoin to 'ujacoin'@'%'"
docker exec mysql-db mysql -psecret -e “create database ujacoin; use ujacoin; create user 'ujacoin' identified by 'secret'; grant all privileges on ujacoin.* to 'ujacoin'@'%'"
```
Este comando ejecuta la utilidad de administración `mysql` dentro del contenedor,
......
......@@ -7,4 +7,56 @@
<goal>spring-boot:run</goal>
</goals>
</action>
<action>
<actionName>run</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.0.0:exec</goal>
</goals>
<properties>
<exec.vmArgs></exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.appArgs></exec.appArgs>
<exec.mainClass>es.ujaen.dae.ujacoin.app.UjaCoinApp</exec.mainClass>
<exec.executable>java</exec.executable>
</properties>
</action>
<action>
<actionName>debug</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.0.0:exec</goal>
</goals>
<properties>
<exec.vmArgs>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.appArgs></exec.appArgs>
<exec.mainClass>es.ujaen.dae.ujacoin.app.UjaCoinApp</exec.mainClass>
<exec.executable>java</exec.executable>
<jpda.listen>true</jpda.listen>
</properties>
</action>
<action>
<actionName>profile</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.0.0:exec</goal>
</goals>
<properties>
<exec.vmArgs></exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.mainClass>es.ujaen.dae.ujacoin.app.UjaCoinApp</exec.mainClass>
<exec.executable>java</exec.executable>
<exec.appArgs></exec.appArgs>
</properties>
</action>
</actions>
......@@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<version>2.5.5</version>
</parent>
<dependencies>
......
......@@ -24,6 +24,9 @@ import javax.validation.constraints.Size;
*/
@Entity
public class Cuenta {
static final LocalDateTime PASADO_DISTANTE = LocalDateTime.of(1970, 1, 1, 0, 0);
static final LocalDateTime FUTURO_DISTANTE = LocalDateTime.of(2100, 1, 1, 0, 0);
/** Número de cuenta */
@Id
......@@ -92,21 +95,13 @@ public class Cuenta {
* @return la lista de movimientos dentro del intervalo de fechas indicado
*/
public List<Movimiento> listarMovimientosDesdeHasta(LocalDateTime fechaHoraDesde, LocalDateTime fechaHoraHasta) {
if (fechaHoraDesde == null) {
LocalDateTime ahora = LocalDateTime.now();
fechaHoraDesde = ahora.minusDays(ahora.getDayOfMonth() - 1);
}
if (fechaHoraHasta == null) {
fechaHoraHasta = LocalDateTime.now();
}
final LocalDateTime desde = fechaHoraDesde;
final LocalDateTime hasta = fechaHoraHasta;
LocalDateTime fechaHoraDesdeConsulta = Optional.ofNullable(fechaHoraDesde).orElse(PASADO_DISTANTE);
LocalDateTime fechaHoraHastaConsulta = Optional.ofNullable(fechaHoraHasta).orElse(FUTURO_DISTANTE);
return movimientos.stream().filter(m ->
m.getFechaHora().isAfter(desde) &&
m.getFechaHora().isBefore(hasta)
m.getFechaHora().isAfter(fechaDesdeConsulta) &&
m.getFechaHora().isBefore(fechaHastaConsulta)
).collect(Collectors.toList());
}
......
......@@ -24,7 +24,6 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Positive;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
......
......@@ -6,7 +6,8 @@ import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaEmitida;
import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaRecibida;
import java.time.LocalDate;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.jupiter.api.Test;
/**
* Test unitario para clase Cuenta
......
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