====== 5. Modelado de la aplicación ====== Usar UML para modelar la aplicación. La mejor herramienta es [[https://plantuml.com/es/|PlantUML]] * [[https://plantuml.com/es/download|Plant UML Download]]: El jar que transforma el texto de UML en un PNG con el diagrama * [[https://plantuml.com/es/command-line|Command line]]: Generar el diagrama dese la linea de comandos usando el jar anterior * [[https://plugins.jetbrains.com/plugin/7017-plantuml4idea|plantuml4idea]]: Plugin en IntelliJ ===== Modelo de datos ===== title Pedido, LineaPedido y Cliente class Cliente { id nombre mail } class Pedido { id fecha total -- Reglas -- fecha>=Hoy total>0 } class LineaPedido { cantidad : BigDecimal precioUnitario : BigDecimal subtotal : BigDecimal -- Reglas -- subtotal=cantidad * precioUnitario cantidad>0 precioUnitario>0 } Cliente "1" -- "0..*" Pedido Pedido "1" -- "1..*" LineaPedido @startuml title Pedido, LineaPedido y Cliente class Cliente { id nombre mail } class Pedido { id fecha total -- Reglas -- fecha>=Hoy total>0 } class LineaPedido { cantidad : BigDecimal precioUnitario : BigDecimal subtotal : BigDecimal -- Reglas -- subtotal=cantidad * precioUnitario cantidad>0 precioUnitario>0 } Cliente "1" -- "0..*" Pedido Pedido "1" -- "1..*" LineaPedido @enduml EntornoCriptografico ..> EntornoCriptograficoConfig DispositivoCriptografico ..> DispositivoCriptograficoConfig AlmacenCertificadosConfiables ..> AlmacenCertificadosConfiablesConfig EntornoCriptografico *-left- AlmacenCertificadosConfiables EntornoCriptografico *-right- "*" DispositivoCriptografico EntornoCriptograficoConfig *-left- AlmacenCertificadosConfiablesConfig EntornoCriptograficoConfig *-right- "*" DispositivoCriptograficoConfig class AlmacenCertificadosConfiables { trustedKeyStore } class DispositivoCriptografico { PrivateKey getPrivateKey(Alias) Certificate[] getCertificateChain(Alias) List getAliases() } class DispositivoCriptograficoConfig { pkcs11LibraryPath slot pin } class AlmacenCertificadosConfiablesConfig { InputStream password } EntornoCriptografico ..> EntornoCriptograficoConfig DispositivoCriptografico ..> DispositivoCriptograficoConfig AlmacenCertificadosConfiables ..> AlmacenCertificadosConfiablesConfig EntornoCriptografico *-left- AlmacenCertificadosConfiables EntornoCriptografico *-right- "*" DispositivoCriptografico EntornoCriptograficoConfig *-left- AlmacenCertificadosConfiablesConfig EntornoCriptograficoConfig *-right- "*" DispositivoCriptograficoConfig class AlmacenCertificadosConfiables { trustedKeyStore } class DispositivoCriptografico { PrivateKey getPrivateKey(Alias) Certificate[] getCertificateChain(Alias) List getAliases() } class DispositivoCriptograficoConfig { pkcs11LibraryPath slot pin } class AlmacenCertificadosConfiablesConfig { InputStream password } DocumentoPdfFactory --> "*" DocumentoPdf AlmacenClave <- DocumentoPdf DocumentoPdf -> CampoFirma DocumentoPdf -> ResultadoFirma AlmacenClave <|-- AlmacenClaveFichero AlmacenClave <|-- AlmacenClaveDispositivo ResultadoFirma *-- DatosCertificado DocumentoPdfFactory --> "*" DocumentoPdf AlmacenClave <- DocumentoPdf DocumentoPdf -> CampoFirma DocumentoPdf -> ResultadoFirma AlmacenClave <|-- AlmacenClaveFichero AlmacenClave <|-- AlmacenClaveDispositivo ResultadoFirma *-- DatosCertificado ===== Modelo de estados ===== [*] --> ENTRADA_DATOS ENTRADA_DATOS -> [*] : DELETE ENTRADA_DATOS --> PENDIENTE_PRESENTACION : GUARDAR_DATOS PENDIENTE_PRESENTACION --> ENTRADA_DATOS : BACK PENDIENTE_PRESENTACION --> PENDIENTE_RESOLUCION : PRESENTAR PENDIENTE_RESOLUCION --> ENTRADA_DATOS : RESOLVER[tipoResolucion=SUBSANAR_DATOS] PENDIENTE_RESOLUCION --> ACEPTADO : RESOLVER[tipoResolucion=ACEPTAR] PENDIENTE_RESOLUCION --> RECHAZADO : RESOLVER[tipoResolucion=RECHAZAR] [*] --> ENTRADA_DATOS ENTRADA_DATOS -> [*] : DELETE ENTRADA_DATOS --> PENDIENTE_PRESENTACION : GUARDAR_DATOS PENDIENTE_PRESENTACION --> ENTRADA_DATOS : BACK PENDIENTE_PRESENTACION --> PENDIENTE_RESOLUCION : PRESENTAR PENDIENTE_RESOLUCION --> ENTRADA_DATOS : RESOLVER[tipoResolucion=SUBSANAR_DATOS] PENDIENTE_RESOLUCION --> ACEPTADO : RESOLVER[tipoResolucion=ACEPTAR] PENDIENTE_RESOLUCION --> RECHAZADO : RESOLVER[tipoResolucion=RECHAZAR] * Ejemplo de navegación entre páginas: [*] --> Login Login --> Home : botón "Entrar"\n(credenciales correctas) Login --> Login : botón "Entrar"\n(credenciales incorrectas) Home --> Perfil : link "Perfil" Home --> Login : link "Salir" Perfil --> Home : link "Home" [*] --> Login Login --> Home : botón "Entrar"\n(credenciales correctas) Login --> Login : botón "Entrar"\n(credenciales incorrectas) Home --> Perfil : link "Perfil" Home --> Login : link "Salir" Perfil --> Home : link "Home"