From a66b80a1b3e443a958e03ccc7679a536d075ee62 Mon Sep 17 00:00:00 2001
From: UO271447
Date: Sun, 1 May 2022 15:50:23 +0200
Subject: [PATCH 74/80] eliminando menu inutil
---
webapp/src/components/Fragments/Nav.tsx | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/webapp/src/components/Fragments/Nav.tsx b/webapp/src/components/Fragments/Nav.tsx
index bb85b97..7a12ec1 100644
--- a/webapp/src/components/Fragments/Nav.tsx
+++ b/webapp/src/components/Fragments/Nav.tsx
@@ -48,17 +48,7 @@ export default function MenuAppBar() {
return (
-
-
-
-
-
+
Date: Sun, 1 May 2022 17:58:47 +0200
Subject: [PATCH 75/80] Fix: error en redireccionado
---
webapp/src/components/Login/FormLogIn.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp/src/components/Login/FormLogIn.tsx b/webapp/src/components/Login/FormLogIn.tsx
index 3b58ddc..1d6e721 100644
--- a/webapp/src/components/Login/FormLogIn.tsx
+++ b/webapp/src/components/Login/FormLogIn.tsx
@@ -56,7 +56,7 @@ const FormLogIn = () => {
onChange={(e) => setIdp(e.target.value)}
InputProps={{
endAdornment: (
-
+
From 069dfe7934cf9712e23244bb01dd91c7d1218a70 Mon Sep 17 00:00:00 2001
From: UO277876 <79647031+UO277876@users.noreply.github.com>
Date: Sun, 1 May 2022 20:00:19 +0200
Subject: [PATCH 76/80] Arreglando conflictos
---
webapp/src/components/POD/Coordenadas.tsx | 50 +++++++++++++++++++++
webapp/src/components/POD/GetAddressPod.tsx | 46 +++++++++++++++++++
webapp/src/shared/shareddtypes.ts | 6 +--
3 files changed, 99 insertions(+), 3 deletions(-)
create mode 100644 webapp/src/components/POD/Coordenadas.tsx
create mode 100644 webapp/src/components/POD/GetAddressPod.tsx
diff --git a/webapp/src/components/POD/Coordenadas.tsx b/webapp/src/components/POD/Coordenadas.tsx
new file mode 100644
index 0000000..402e649
--- /dev/null
+++ b/webapp/src/components/POD/Coordenadas.tsx
@@ -0,0 +1,50 @@
+export
+function coordenadas(address: string){
+ const axios = require("axios");
+ return axios
+ .get(
+ "https://api.mapbox.com/geocoding/v5/mapbox.places/" +
+ address +
+ ".json?access_token=" + "pk.eyJ1IjoidW8yNzE0NDciLCJhIjoiY2wyN2MxdDdwMHMxcTNkbnAyd2x3ajFpaiJ9.4meULCmzm3oog7dC-22EvQ"
+ )
+ .then((response: any) => {
+ return response.data;
+ })
+ .catch((error: any) => {
+ return error;
+ });
+ }
+ export
+ async function distancias(address: string){
+ if(address !== ""){
+ const coord= await coordenadas(address);
+ let earthRadiusInKm:number = 6371;
+
+ var latitudAlmacen =43.354805679135595
+ var longitudAlmacen= -5.8513295460816295
+ let lat = coord.features[0].geometry.coordinates[1];
+ let lon = coord.features[0].geometry.coordinates[0];
+ let dLat : number = gradosARadianes(lat-latitudAlmacen);
+ let dLon : number = gradosARadianes(lon-longitudAlmacen);
+
+ latitudAlmacen = gradosARadianes(latitudAlmacen);
+ lat = gradosARadianes(lat);
+
+ let a : number = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(latitudAlmacen) * Math.cos(lat);
+ let c : number = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
+ return Math.round(earthRadiusInKm * c*0.3*100)/100
+ }
+ else return 0;
+ }
+
+function gradosARadianes(degrees: number) : number {
+ return degrees * Math.PI / 180;
+}
+
+ export
+ async function calcularValorGastosdeEnvío(address: string){
+ var x=0
+ x= Number(sessionStorage.getItem('precioCarrito'));
+ var d= await distancias(address);
+ return Number((x+d).toFixed(2));
+ }
diff --git a/webapp/src/components/POD/GetAddressPod.tsx b/webapp/src/components/POD/GetAddressPod.tsx
new file mode 100644
index 0000000..c7c6e91
--- /dev/null
+++ b/webapp/src/components/POD/GetAddressPod.tsx
@@ -0,0 +1,46 @@
+import {getSolidDataset,getThing,getStringNoLocale,Thing,getUrl} from "@inrupt/solid-client";
+import { VCARD } from "@inrupt/lit-generated-vocab-common";
+import React, {useEffect} from "react";
+import { Box, Grid } from "@mui/material";
+
+type Props_POD = {
+ webId: string;
+};
+
+async function userAddress(webID: string): Promise {
+ let profileDocumentURI = webID.split("#")[0]
+ let myDataSet = await getSolidDataset(profileDocumentURI)
+ let profile = getThing(myDataSet, webID)
+ let hasAddress = getUrl(profile as Thing, VCARD.hasAddress) as string
+ let addressUser = await getThing(myDataSet, hasAddress)
+
+ let street_address= getStringNoLocale(addressUser as Thing, VCARD.street_address) as string
+ let locality= getStringNoLocale(addressUser as Thing, VCARD.locality) as string
+ let postal_code= getStringNoLocale(addressUser as Thing, VCARD.postal_code) as string
+ let region= getStringNoLocale(addressUser as Thing, VCARD.region) as string
+ let country= getStringNoLocale(addressUser as Thing, VCARD.country_name) as string;
+ let address = [street_address,locality,postal_code,region,country];
+ return address;
+ }
+
+function GetAddressPod( props: Props_POD): JSX.Element {
+ const [address, setAddress] = React.useState([]);
+ const getAddress = async () => setAddress(await userAddress(props.webId))
+
+ useEffect(() => {
+ getAddress();
+ });
+
+ return (
+
+
+ Calle: {address[0]}
+ Localidad: {address[1]}
+ Codigo Postal: {address[2]}
+ Región: {address[3]}
+ Pais: {address[4]}
+
+
+ );
+ }
+export default GetAddressPod;
\ No newline at end of file
diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts
index d481136..182dcce 100644
--- a/webapp/src/shared/shareddtypes.ts
+++ b/webapp/src/shared/shareddtypes.ts
@@ -2,9 +2,9 @@ import { ObjectId } from 'bson';
import { Double } from 'mongodb';
export type User = {
- name:string;
- email:string;
- }
+ username:string;
+ password:string;
+}
export type Product = {
nombre: string;
From de0af0b47b71511c7fa49b8c2f32f845308a9329 Mon Sep 17 00:00:00 2001
From: UO277876 <79647031+UO277876@users.noreply.github.com>
Date: Sun, 1 May 2022 20:13:15 +0200
Subject: [PATCH 77/80] Corrigiendo conflictos webapp
---
webapp/src/components/Details/Details.tsx | 6 ++--
webapp/src/components/Fragments/Nav.tsx | 12 ++++++-
webapp/src/components/Home/Home.tsx | 3 ++
webapp/src/components/Home/List.tsx | 13 ++++----
webapp/src/components/Home/Shoes.tsx | 4 +--
webapp/src/components/Login/ProfileViewer.tsx | 31 +++++++++++++++----
6 files changed, 51 insertions(+), 18 deletions(-)
diff --git a/webapp/src/components/Details/Details.tsx b/webapp/src/components/Details/Details.tsx
index 28c7793..ab4b237 100644
--- a/webapp/src/components/Details/Details.tsx
+++ b/webapp/src/components/Details/Details.tsx
@@ -10,11 +10,11 @@ import { getProduct } from '../../api/api';
export default function Details():JSX.Element {
//Obtenemos la parte de parametros de la url
- const querystring = window.location.search;
- const params = new URLSearchParams(querystring)
+ const querystring:string = window.location.search;
+ const params:URLSearchParams = new URLSearchParams(querystring)
//Obtenemos la id del producto
- const id = params.get('id') as string;
+ const id:string = params.get('id') as string;
const [product, setProduct] = useState();
const reloadDetails = async () => {
diff --git a/webapp/src/components/Fragments/Nav.tsx b/webapp/src/components/Fragments/Nav.tsx
index 86be710..05593cd 100644
--- a/webapp/src/components/Fragments/Nav.tsx
+++ b/webapp/src/components/Fragments/Nav.tsx
@@ -48,7 +48,17 @@ export default function MenuAppBar() {
return (
-
+
+
+
+
+
{
// Recarga de la lista de productos para el /home
+ const { session } = useSession();
+ const { webId } = session.info;
const [products, setProducts] = useState([]);
const reloadItems = async () => {
setProducts(await getProducts());
diff --git a/webapp/src/components/Home/List.tsx b/webapp/src/components/Home/List.tsx
index e6d8a96..d61fd83 100644
--- a/webapp/src/components/Home/List.tsx
+++ b/webapp/src/components/Home/List.tsx
@@ -74,35 +74,36 @@ const useStyles = makeStyles({
const itemData = [
{
- img: 'https://i.blogs.es/67332d/screenshot_4501/original.jpeg',
+ img: 'https://i.imgur.com/cyhVYVf.jpg',
title: 'Pokemon',
featured: true,
},
{
- img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTviEWtiJBnAfMBudW5kmrIpt9tng4cD2_F_w1HDAnVAcnqoP5LJM9vKNBOBlrvSigJEIM&usqp=CAU',
+ img: 'https://i.imgur.com/VwtfVgU.jpg',
title: 'Zapatillas Baby Yoda',
author: '@rollelflex_graphy726',
},
{
- img: 'https://images.ecestaticos.com/Xt-KJxmVpvzrqtKT8eEnRNxbcTc=/51x0:1249x899/1200x900/filters:fill(white):format(jpg)/f.elconfidencial.com%2Foriginal%2F9c2%2F2d6%2F83d%2F9c22d683d9536e8961c5d4fe8a2f6f4f.jpg',
+ img: 'https://i.imgur.com/1jWaZbp.jpg',
title: 'Style',
author: '@helloimnik',
},
{
- img: 'https://images-eu.ssl-images-amazon.com/images/G/30/AMAZON-FASHION/2021/FASHION/FEATURE_PAGES/SNEAKERS/MENS/04_C12x.jpg',
+ img: 'https://i.imgur.com/d864pTb.jpg',
title: 'Caña Alta',
author: '@nolanissac',
},
{
- img: 'https://ichef.bbci.co.uk/news/640/cpsprodpb/B9FF/production/_117751674_satan-shoes1.jpg',
+ img: 'https://i.imgur.com/C4fhmzn.jpg',
title: 'Lo último',
author: '@hjrc33',
},
{
- img: 'https://www.clara.es/medio/2019/02/28/zapatillas-negras-vans-85%E2%82%AC_482707a2_1000x1500.jpg',
+ img: 'https://i.imgur.com/nZGVoea.jpg',
title: 'Casual',
author: '@arwinneil',
featured: true,
},
];
+
\ No newline at end of file
diff --git a/webapp/src/components/Home/Shoes.tsx b/webapp/src/components/Home/Shoes.tsx
index 3d49c82..a421ebf 100644
--- a/webapp/src/components/Home/Shoes.tsx
+++ b/webapp/src/components/Home/Shoes.tsx
@@ -79,7 +79,7 @@ const ShoesView = (parsed : ProductsParsed) => {
refreshProductos();
},[]);
function filterFunction(texto: any) {
- var filter;
+ var filter:TypeProduct[];
if(texto==""){
filter=parsed.products;
}
@@ -88,7 +88,7 @@ const ShoesView = (parsed : ProductsParsed) => {
}
setProductos(filter);
}
- let details = '/Details?id='
+ let details:string = '/Details?id='
return (
<>
diff --git a/webapp/src/components/Login/ProfileViewer.tsx b/webapp/src/components/Login/ProfileViewer.tsx
index 8d7444c..7fbbc23 100644
--- a/webapp/src/components/Login/ProfileViewer.tsx
+++ b/webapp/src/components/Login/ProfileViewer.tsx
@@ -2,7 +2,8 @@ import { useSession, CombinedDataProvider, Image, LogoutButton, Text } from "@in
import { Button, Card, CardActionArea, CardContent, CardHeader, Container, Typography } from "@material-ui/core";
import { FOAF, VCARD } from "@inrupt/lit-generated-vocab-common";
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
-
+import GetAddressPod from "../POD/GetAddressPod";
+import ShoppingCartIcon from "@mui/icons-material/ShoppingCart";
const useStyles = makeStyles((theme: Theme) =>
createStyles({
container: {
@@ -18,6 +19,17 @@ const useStyles = makeStyles((theme: Theme) =>
marginTop: theme.spacing(2),
flexGrow: 1
},
+ margen:{
+ margin: '-25px 0 0 -25px',
+ marginRight:'30%',
+ marginTop: theme.spacing(20),
+ display: 'flex',
+ justifyContent:'center',
+ position: 'absolute',
+ top: '50%',
+ left: '50%',
+
+ },
header: {
textAlign: 'center',
background: '#212121',
@@ -30,10 +42,15 @@ const useStyles = makeStyles((theme: Theme) =>
},
})
);
+
const ProfileViewer = () => {
const classes = useStyles();
const { session } = useSession();
const { webId } = session.info;
+ function guardarWebId(){
+ sessionStorage.setItem('webIdSesion', webId as string);
+ const w= sessionStorage.getItem('webIdSesion');
+ }
return (
<>
@@ -49,13 +66,9 @@ const ProfileViewer = () => {
-
-
-
-
-
+
@@ -65,6 +78,9 @@ const ProfileViewer = () => {
Logout
+ } variant="contained" color="secondary" href="/GastosEnvio" onClick={guardarWebId}>
+ Continuar con su compra
+
>
@@ -72,3 +88,6 @@ const ProfileViewer = () => {
}
export default ProfileViewer
+
+
+
From 9a9d96e278cb914217e7527c81b277d2e515a729 Mon Sep 17 00:00:00 2001
From: UO277876 <79647031+UO277876@users.noreply.github.com>
Date: Sun, 1 May 2022 20:20:54 +0200
Subject: [PATCH 78/80] Corregidos conflictos restapi
---
restapi/config.ts | 2 +-
restapi/modelos/productoModelo.ts | 55 +++++++++++++++++++++++-----
restapi/package.json | 5 +--
restapi/rutas/productoRutas.ts | 60 +++++++++++++++----------------
4 files changed, 80 insertions(+), 42 deletions(-)
diff --git a/restapi/config.ts b/restapi/config.ts
index d9eb5e1..e95f78a 100644
--- a/restapi/config.ts
+++ b/restapi/config.ts
@@ -12,4 +12,4 @@ const config = {
},
}
-export default config;
\ No newline at end of file
+export default config;
\ No newline at end of file
diff --git a/restapi/modelos/productoModelo.ts b/restapi/modelos/productoModelo.ts
index d6dadb5..6a0ae46 100644
--- a/restapi/modelos/productoModelo.ts
+++ b/restapi/modelos/productoModelo.ts
@@ -9,9 +9,21 @@ export interface IProducto {
precio: Number;
descripcion: String;
categoria:String; //Hombre, Mujer, Niño, Niña
- }
+ fotos: Foto[];
+ tallas: Talla[];
+}
+
+interface Foto{
+ ruta:String;
+ descripcion: String;
+}
+
+interface Talla {
+ numero: String;
+ cantidad: Number;
+}
- interface ProductoDoc extends mongoose.Document {
+interface ProductoDoc extends mongoose.Document {
_id: ObjectId;
referencia:String;
marca:String;
@@ -20,11 +32,13 @@ export interface IProducto {
precio: Number;
descripcion: String;
categoria:String; //Hombre, Mujer, Niño, Niña
- }
+ fotos: Foto[];
+ tallas: Talla[];
+}
- interface ProductoModelInterface extends mongoose.Model {
+interface ProductoModelInterface extends mongoose.Model {
build(attr: IProducto): ProductoDoc
- }
+}
const productoSchema = new mongoose.Schema({
referencia: {
@@ -61,14 +75,37 @@ const productoSchema = new mongoose.Schema({
type: String,
required: false,
trim: true
- }
+ },
+ fotos: [{
+ ruta:{
+ type: String,
+ required: true,
+ trim: true
+ },
+ descripcion:{
+ type: String,
+ required: false,
+ trim: true
+ }
+ }],
+
+ tallas:[{
+ numero:{
+ type: String,
+ required: true,
+ trim: true
+ },
+ cantidad:{
+ type: Number,
+ required: true
+ }
+ }],
})
productoSchema.statics.build = (attr: IProducto) => {
return new Producto(attr)
}
-const Producto = mongoose.model('Producto',productoSchema)
-
-export { Producto , ProductoDoc }
+const Producto:ProductoModelInterface = mongoose.model('Producto',productoSchema)
+export { Producto , ProductoDoc }
\ No newline at end of file
diff --git a/restapi/package.json b/restapi/package.json
index 49cbc3b..7987dbf 100644
--- a/restapi/package.json
+++ b/restapi/package.json
@@ -2,7 +2,8 @@
"name": "restapi",
"version": "1.0.0",
"scripts": {
- "start": "ts-node-dev ./server.ts"
+ "start": "ts-node-dev ./server.ts",
+ "test": "cd tests && jest --runInBand"
},
"keywords": [],
"author": "",
@@ -34,4 +35,4 @@
"ts-node-dev": "^1.1.8",
"typescript": "^4.5.4"
}
-}
+}
\ No newline at end of file
diff --git a/restapi/rutas/productoRutas.ts b/restapi/rutas/productoRutas.ts
index 0cd3229..fe99f93 100644
--- a/restapi/rutas/productoRutas.ts
+++ b/restapi/rutas/productoRutas.ts
@@ -5,7 +5,7 @@ import "dotenv/config";
import { ObjectId } from 'bson';
//Obtenemos la url de la apirest de Heroku o utilizamos localhost por defecto
-let URL_BASE = `${process.env.API_REST_URL_BASE_LOCAL}`
+let URL_BASE:string = `${process.env.API_REST_URL_BASE_LOCAL}`
if(process.env.PORT) {
URL_BASE = `${process.env.API_REST_URL_BASE_HEROKU}`
}
@@ -13,15 +13,15 @@ if(process.env.PORT) {
const router = express.Router()
//Recuperamos todos los colores asociados a un producto facilitando su referencia
router.get('/producto/detalles/colores/:referencia', async (req: Request, res: Response) => {
- const ref = req.params.referencia;
- const colores = await Producto.find({ referencia: ref }, 'color');
+ const ref:string = req.params.referencia;
+ const colores:ProductoDoc[] = await Producto.find({ referencia: ref }, 'color');
return res.json(colores);
})
//Recuperamos la foto etiquetada como principal asociada a un producto facilitando su referencia
router.get('/producto/detalles/foto/:referencia', async (req: Request, res: Response) => {
- const ref = req.params.referencia;
- const productos = await Producto.find({ referencia: ref });
+ const ref:string = req.params.referencia;
+ const productos:ProductoDoc[] = await Producto.find({ referencia: ref });
if (productos.length == 1){
//Recuperamos todas las fotos asociadas a este producto
const fotos = await consultarREST(URL_BASE +'foto/' + productos[0].id)
@@ -32,8 +32,8 @@ router.get('/producto/detalles/foto/:referencia', async (req: Request, res: Resp
//Recuperamos todas las fotos asociadas a un producto facilitando su referencia
router.get('/producto/detalles/fotos/:referencia', async (req: Request, res: Response) => {
- const ref = req.params.referencia;
- const productos = await Producto.find({ referencia: ref });
+ const ref:string = req.params.referencia;
+ const productos:ProductoDoc[] = await Producto.find({ referencia: ref });
if (productos.length == 1){
//Recuperamos todas las fotos asociadas a este producto
const fotos = await consultarREST(URL_BASE +'fotos/' + productos[0].id)
@@ -45,8 +45,8 @@ router.get('/producto/detalles/fotos/:referencia', async (req: Request, res: Res
//Recuperamos todas las tallas asociadas a un producto facilitando su referencia
router.get('/producto/detalles/tallas/:referencia', async (req: Request, res: Response) => {
- const ref = req.params.referencia;
- const productos = await Producto.find({ referencia: ref });
+ const ref:string = req.params.referencia;
+ const productos:ProductoDoc[] = await Producto.find({ referencia: ref });
if (productos.length == 1){
//Recuperamos todas las tallas asociadas a este producto
const tallas = await consultarREST(URL_BASE +'tallas/' + productos[0].id)
@@ -57,8 +57,8 @@ router.get('/producto/detalles/tallas/:referencia', async (req: Request, res: Re
//Recuperamos todas las tallas disponibles (con existencias en stock) asociadas a un producto facilitando su referencia
router.get('/producto/detalles/tallas_disponibles/:referencia', async (req: Request, res: Response) => {
- const ref = req.params.referencia;
- const productos = await Producto.find({ referencia: ref });
+ const ref:string = req.params.referencia;
+ const productos:ProductoDoc[] = await Producto.find({ referencia: ref });
if (productos.length == 1){
//Recuperamos todas las tallas disponibles asociadas a este producto
const tallas = await consultarREST(URL_BASE +'tallas_disponibles/' + productos[0].id)
@@ -77,32 +77,33 @@ router.get('/products/list', async (req: Request, res: Response) => {
imagen: String;
}
- let resultado = new Array();
+ let resultado:TypeProduct[] = new Array();
- const productos = await Producto.find({})
+ const productos:ProductoDoc[] = await Producto.find({})
for (var i=0; i< productos.length; i++)
{
- let entrada = productos[i];
+ let entrada:ProductoDoc = productos[i];
let salida: TypeProduct = ({ _objectId: entrada._id, id: "", nombre:"",precio:0,imagen: "" });
salida.id = entrada.referencia;
salida.nombre = entrada.marca + " " +entrada.modelo;
- salida.precio = entrada.precio
+ salida.precio = entrada.precio;
//Recuperamos la imagen principal asociada a este producto
- const foto = await consultarREST(URL_BASE +'foto/' + entrada.id) ;
- if (foto.length != 0)
- salida.imagen = foto[0].ruta
- else
- salida.imagen = "" //buscar una imagen por defecto si no hay principal
- resultado.push(salida)
+ if (entrada.fotos.length != 0){
+ salida.imagen = entrada.fotos[0].ruta;
+ }
+ else{
+ salida.imagen = ""; //buscar una imagen por defecto si no hay principal
+ }
+ resultado.push(salida);
}
return res.status(200).send(resultado)
})
router.post('/products/add', async (req: Request, res: Response) => {
- const { referencia, marca, modelo, color, precio, descripcion, categoria } = req.body;
+ const { referencia, marca, modelo, color, precio, descripcion, categoria, fotos, tallas} = req.body;
- const product = Producto.build({ referencia, marca, modelo, color, precio, descripcion, categoria })
+ const product:ProductoDoc = Producto.build({ referencia, marca, modelo, color, precio, descripcion, categoria , fotos, tallas })
await product.save()
return res.status(201).send(product)
})
@@ -118,22 +119,21 @@ router.get('/producto/detalles/:referencia', async (req: Request, res: Response)
imagen: String;
}
- let resultado = new Array();
+ let resultado:TypeProduct[] = new Array();
//Parametro referencia
- const ref = req.params.referencia;
+ const ref:string = req.params.referencia;
//Realizamos la busqueda por referencia
const product = await Producto.findOne({referencia: ref})
if(product){
- let entrada = product;
+ let entrada:ProductoDoc = product;
let salida: TypeProduct = ({ _objectId: entrada._id, id: "", nombre:"",precio:0,descripcion:"",imagen: "" });
salida.id = entrada.referencia;
salida.nombre = entrada.marca + " " +entrada.modelo;
salida.precio = entrada.precio
salida.descripcion = entrada.descripcion;
- //Recuperamos la imagen principal asociada a este producto
- const foto = await consultarREST(URL_BASE +'foto/' + entrada.id) ;
- if (foto.length != 0)
- salida.imagen = foto[0].ruta
+
+ if (entrada.fotos.length != 0)
+ salida.imagen = entrada.fotos[0].ruta;
else
salida.imagen = "" //buscar una imagen por defecto si no hay principal
resultado.push(salida)
From 2cca9b9f69cca066d2e19451f44b7004a5c985fe Mon Sep 17 00:00:00 2001
From: UO277876 <79647031+UO277876@users.noreply.github.com>
Date: Sun, 1 May 2022 20:38:29 +0200
Subject: [PATCH 79/80] Solucionando conflictos doc
---
docs/01_introduction_and_goals.adoc | 79 ++++++++++++++-------------
docs/02_architecture_constraints.adoc | 8 ++-
docs/03_system_scope_and_context.adoc | 63 +++------------------
docs/04_solution_strategy.adoc | 20 -------
docs/05_building_block_view.adoc | 67 -----------------------
docs/06_runtime_view.adoc | 45 +++------------
docs/07_deployment_view.adoc | 49 +----------------
docs/08_concepts.adoc | 2 +-
docs/10_quality_scenarios.adoc | 3 +-
docs/11_technical_risks.adoc | 2 +-
docs/12_glossary.adoc | 1 +
11 files changed, 69 insertions(+), 270 deletions(-)
diff --git a/docs/01_introduction_and_goals.adoc b/docs/01_introduction_and_goals.adoc
index bd4f165..83cec09 100644
--- a/docs/01_introduction_and_goals.adoc
+++ b/docs/01_introduction_and_goals.adoc
@@ -1,46 +1,49 @@
[[section-introduction-and-goals]]
-[role="arc42help"]
-****
-
-****
== Introducción y Metas
El proyecto trata de una aplicación de compra y venta de objetos, llamada DeDe, cuyo codigo fuente sera realizado con "TypeScript". Estará enfocada al mercado electrónico y dará soporte a la realización de pedidos asociados a una cuenta de usuario concreta.
Objetivos de Negocio:
- -A corto plazo: Realizar una documentación adecuada de manera que se cumplan las
- expectativas y necesidades del proyecto.
- -A largo plazo: Poder realizar una aplicación de manera que cumpla todos los objetivos
- de usabilidad para poder realizar compra/venta de playeros de una manera mas
- cómoda,sencilla y accesible.
+-A corto plazo: Realizar una documentación adecuada de manera que se cumplan las
+expectativas y necesidades del proyecto.
+
+-A largo plazo: Poder realizar una aplicación de manera que cumpla todos los objetivos
+de usabilidad para poder realizar compra/venta de playeros de una manera mas
+cómoda,sencilla y accesible.
+
-[role="arc42help"]
-****
-****
=== Vista de Requerimientos
- -Se necesitara una pequeña base de Typescript para la implementación de código de la aplicación y el uso de
- react para la implementación de cara al usuario.
- -Para realizar el control de versiones es necesario el uso de git, herramienta muy util para trabajos de
- gran tamaño permitiendo el uso de varias ramas para no alterar los prototipos del proyecto.
- -Será necesario emplear un navegador y disponer de un proveedor de internet para poder acceder a dede_es3a y
- utilizar toda la funcionalidad de la que dispone.
- -El sistema permitirá al usuario realizar una búsqueda mediante la que filtrar los artículos mostrados según
- su nombre/descripción.
- -Dede_es3a dispondrá de un carrito en el que almacenar artículos y cuyo contenido podrá ser consultado por el
- usuario.
- -Dede_es3a dará al usuario la posibilidad de añadir elementos al carrito.
- -Dede_es3a dará al usuario la posibilidad de borrar elementos del carrito.
- -Dede_es3a permitirá el registro de usuarios mediante formulario siempre y cuando el usuario no sea existente.
- -Dede_es3a permitirá el registro de usuarios mediante formulario si las credenciales coinciden con la BDD.
- -Dede_es3a dispondrá de uan lista de pedidos por usuario en la que se almacenará los pedidos realizados por el usuario.
-
-[role="arc42help"]
-****
-****
+-Se necesitara una pequeña base de Typescript para la implementación de código de la aplicación y el uso de
+react para la implementación de cara al usuario.
+
+-Para realizar el control de versiones es necesario el uso de git, herramienta muy util para trabajos de
+gran tamaño permitiendo el uso de varias ramas para no alterar los prototipos del proyecto.
+
+-Será necesario emplear un navegador y disponer de un proveedor de internet para poder acceder a dede_es3a y
+utilizar toda la funcionalidad de la que dispone.
+
+-El sistema permitirá al usuario realizar una búsqueda mediante la que filtrar los artículos mostrados según
+su nombre/descripción.
+
+-Dede_es3a dispondrá de un carrito en el que almacenar artículos y cuyo contenido podrá ser consultado por el
+usuario.
+
+-Dede_es3a dará al usuario la posibilidad de añadir elementos al carrito.
+
+-Dede_es3a dará al usuario la posibilidad de borrar elementos del carrito.
+
+-Dede_es3a permitirá el registro de usuarios mediante formulario siempre y cuando el usuario no sea existente.
+
+-Dede_es3a permitirá el registro de usuarios mediante formulario si las credenciales coinciden con la BDD.
+
+-Dede_es3a dispondrá de una lista de pedidos por usuario en la que se almacenará los pedidos realizados por el usuario.
+
=== Metas de calidad
+
+.Metas de calidad
[options="header",cols="1,2,1,1"]
|===
|Meta de Calidad|Motivación|Prioridad del ED| Prioridad del Cliente
@@ -51,18 +54,16 @@ Objetivos de Negocio:
|Modificabilidad|La arquitectura debe ser fácil de modificar, agregando nuevas características o cambiando las existentes|Media|Media
|===
-[role="arc42help"]
-****
-****
=== Partes interesadas (Stakeholders)
-
+.Stakeholders
[options="header",cols="1,2"]
|===
-|Role/Name|Expectations
+|Role/Name|Expectations|
|Administradores |Realizar una administración cómoda y sin inconvenientes.
-|Equipo de desarrollo|Esperan poder obtener una aplicacíon correcta y usable.
-|Cliente | Sus expectativas son poder realizar una compra en la aplicación de una manera sencilla y accesible.
+| Equipo de desarrollo|Esperan poder obtener una aplicacíon correcta y usable.
+| Cliente | Sus expectativas son poder realizar una compra en la aplicación de una manera sencilla y accesible.
+|===
Administradores: se encargan de modificar precios, calcular inventarios, ver todos los pedidos realizados o
realizar pedidos a proveedores
@@ -72,4 +73,4 @@ todo el código para facilitar el entendimiento por parte de los demás miembros
plantear las arquitecturas a usar. Por ejemplo: Para el desarrollo de Diagramas de secuencia.
Cliente: Quien interactuaría con la version final de la aplicacíon para la realización de compra
-de Objetos.
+de Objetos.
\ No newline at end of file
diff --git a/docs/02_architecture_constraints.adoc b/docs/02_architecture_constraints.adoc
index 78f132e..762649c 100644
--- a/docs/02_architecture_constraints.adoc
+++ b/docs/02_architecture_constraints.adoc
@@ -17,6 +17,7 @@ Son las restricciones tecnicas que tendrá el equipo a lo largo del desarrollo.
.Form
Tabla con todas las restricciones técnicas junto con una breve descripción .
****
+.Restricciones técnicas
[options="header",cols="1,2"]
|===
|Restricción|Descripción
@@ -26,6 +27,7 @@ Tabla con todas las restricciones técnicas junto con una breve descripción .
|Git| El código ha de ser subido a un repositorio remoto en GitHub.
|PlantUML| Herramienta de código abierto que permite la creación de diagramas de forma textual.
|Draw.io| Herramienta que permite la creación de diagramas de forma gráfica.
+|Material ui| Es una biblioteca de código abierto que implementa el lenguaje visual de «materiales» de Google en sus componentes React.
|===
=== Restricciones de negocio
@@ -37,11 +39,11 @@ Son las restricciones de negocio para el desarrollo del sistema.
.Form
Tabla con todas las restricciones de negocio junto con una breve descripción .
****
-
+.Restricciones de negocio
[options="header",cols="1,2"]
|===
|Restricción|Descripción
-|Equipo| El equipo esta formado por 5 personas con las que apenas hemos interactuado con anterioridad.
+|Equipo| El equipo esta formado por 5 personas con las que apenas hemos interactuado con anterioridad. Además de esto, 2 miembros del equipo abandonaron el proyecto.
|Horarios| Todos somos estudiantes con más asignaturas o incluso que trabaja mientras cursa esta asignatura.
|Límite de tiempo| Cada entrega tiene una fecha de entrega bastante cercana a la anterior.
-|===
+|===
\ No newline at end of file
diff --git a/docs/03_system_scope_and_context.adoc b/docs/03_system_scope_and_context.adoc
index 3766f5c..0a28f08 100644
--- a/docs/03_system_scope_and_context.adoc
+++ b/docs/03_system_scope_and_context.adoc
@@ -1,82 +1,33 @@
[[section-system-scope-and-context]]
== Alcance y Contexto del Sistema
-[role="arc42help"]
-****
-.Contents
-System scope and context - as the name suggests - delimits your system (i.e. your scope) from all its communication partners
-(neighboring systems and users, i.e. the context of your system). It thereby specifies the external interfaces.
-
-If necessary, differentiate the business context (domain specific inputs and outputs) from the technical context (channels, protocols, hardware).
-
-.Motivation
-The domain interfaces and technical interfaces to communication partners are among your system's most critical aspects. Make sure that you completely understand them.
-
-.Form
-Various options:
-
-* Context diagrams
-* Lists of communication partners and their interfaces.
-****
-
-
=== Contexto de negocio
-
-[role="arc42help"]
-****
-.Contents
-Specification of *all* communication partners (users, IT-systems, ...) with explanations of domain specific inputs and outputs or interfaces.
-Optionally you can add domain specific formats or communication protocols.
-
-.Motivation
-All stakeholders should understand which data are exchanged with the environment of the system.
-
-.Form
-All kinds of diagrams that show the system as a black box and specify the domain interfaces to communication partners.
-
-Alternatively (or additionally) you can use a table.
-The title of the table is the name of your system, the three columns contain the name of the communication partner, the inputs, and the outputs.
-****
image:03_diagramaContextoNegocio.png["Diagrama de contexto"]
* **Cliente**
- Usuarios finales de la aplicación. Son los clientes que van a realizar las compras.
+Usuarios finales de la aplicación. Son los clientes que van a realizar las compras.
* **Administrador**
- Usuario que va a poder gestionar la aplicación: dar de alta productos, actualizar los stocks, revisar los pedidos, etc.
+Usuario que va a poder gestionar la aplicación: dar de alta productos, actualizar los stocks, revisar los pedidos, etc.
* **DeDe**
- Nuestro sistema de venta online (Decentralized Delivery)
+Nuestro sistema de venta online (Decentralized Delivery)
* **Base de datos**
- Se guardará aquí toda la información necesaria para el funcionamiento de la aplciación: pedidos de los usuarios, productos, etc.
+Se guardará aquí toda la información necesaria para el funcionamiento de la aplciación: pedidos de los usuarios, productos, etc.
* **POD**
- El sistema se conectará con el POD del usuario para obtener los datos de su dirección, ya que por privacidad no se almacenarán estos datos en nuestra aplicación.
+El sistema se conectará con el POD del usuario para obtener los datos de su dirección, ya que por privacidad no se almacenarán estos datos en nuestra aplicación.
* **Empresas de Mensajería**
- Nuestro sistema se conectará con diferentes empresas de mensajería para poder calcular los costes de envío de los pedidos.
+Nuestro sistema se conectará con diferentes empresas de mensajería para poder calcular los costes de envío de los pedidos.
=== Contexto técnico
-[role="arc42help"]
-****
-.Contents
-Technical interfaces (channels and transmission media) linking your system to its environment. In addition a mapping of domain specific input/output to the channels, i.e. an explanation with I/O uses which channel.
-
-.Motivation
-Many stakeholders make architectural decision based on the technical interfaces between the system and its context. Especially infrastructure or hardware designers decide these technical interfaces.
-
-.Form
-E.g. UML deployment diagram describing channels to neighboring systems,
-together with a mapping table showing the relationships between channels and input/output.
-
-****
-
-Pendiente
+Nuestra tienda DeDe se debe cumplir los principios SOLID de descentralizacion de datos personales mediante el almacenamiento de estos en PODs independientes para cada usuario, el proveedor de PODs para DeDe será Inrupt. El front-end estara desarrollado mediante el framework React implementando componentes ya desarrollados o bien creados por nosotros mismos,el lenguaje para el desarrollo de las diversas funcionalidades de las pantallas sera TypeScript. Por la parte del back-end, nuestro SGDB es Mongo.db y mediante Node.js express realizaremos todas las transacciones a la base de datos, en la misma almacenaremos los datos de los productos y de los usuarios registrados en DeDe.
\ No newline at end of file
diff --git a/docs/04_solution_strategy.adoc b/docs/04_solution_strategy.adoc
index 2e9643f..82a74bd 100644
--- a/docs/04_solution_strategy.adoc
+++ b/docs/04_solution_strategy.adoc
@@ -1,26 +1,6 @@
[[section-solution-strategy]]
== Estrategia de la solución
-[role="arc42help"]
-****
-.Contents
-A short summary and explanation of the fundamental decisions and solution strategies, that shape the system's architecture. These include
-
-* technology decisions
-* decisions about the top-level decomposition of the system, e.g. usage of an architectural pattern or design pattern
-* decisions on how to achieve key quality goals
-* relevant organizational decisions, e.g. selecting a development process or delegating certain tasks to third parties.
-
-.Motivation
-These decisions form the cornerstones for your architecture. They are the basis for many other detailed decisions or implementation rules.
-
-.Form
-Keep the explanation of these key decisions short.
-
-Motivate what you have decided and why you decided that way,
-based upon your problem statement, the quality goals and key constraints.
-Refer to details in the following sections.
-****
Para el desarrollo de este proyecto viene impuesta como restricción la utilización de React, TypeScript y SOLID. No hay imposición en cuento a la base de datos a utilizar. Se ha decidito optar por seguir la arquitectura MERN. Es un conjunto de marcos/tecnologías utilizados para el desarrollo web de aplicaciones que consta de MongoDB, React, Express y Node como sus componentes.
diff --git a/docs/05_building_block_view.adoc b/docs/05_building_block_view.adoc
index 6fdfe05..5452bb5 100644
--- a/docs/05_building_block_view.adoc
+++ b/docs/05_building_block_view.adoc
@@ -2,61 +2,8 @@
== Vista de bloques
-
-[role="arc42help"]
-****
-.Content
-The building block view shows the static decomposition of the system into building blocks (modules, components, subsystems, classes,
-interfaces, packages, libraries, frameworks, layers, partitions, tiers, functions, macros, operations,
-datas structures, ...) as well as their dependencies (relationships, associations, ...)
-
-This view is mandatory for every architecture documentation.
-In analogy to a house this is the _floor plan_.
-
-.Motivation
-Maintain an overview of your source code by making its structure understandable through
-abstraction.
-
-This allows you to communicate with your stakeholder on an abstract level without disclosing implementation details.
-
-.Form
-The building block view is a hierarchical collection of black boxes and white boxes
-(see figure below) and their descriptions.
-
-image:05_building_blocks-EN.png["Hierarchy of building blocks"]
-
-*Level 1* is the white box description of the overall system together with black
-box descriptions of all contained building blocks.
-
-*Level 2* zooms into some building blocks of level 1.
-Thus it contains the white box description of selected building blocks of level 1, together with black box descriptions of their internal building blocks.
-
-*Level 3* zooms into selected building blocks of level 2, and so on.
-****
-
=== Sistema general
-[role="arc42help"]
-****
-Here you describe the decomposition of the overall system using the following white box template. It contains
-
- * an overview diagram
- * a motivation for the decomposition
- * black box descriptions of the contained building blocks. For these we offer you alternatives:
-
- ** use _one_ table for a short and pragmatic overview of all contained building blocks and their interfaces
- ** use a list of black box descriptions of the building blocks according to the black box template (see below).
- Depending on your choice of tool this list could be sub-chapters (in text files), sub-pages (in a Wiki) or nested elements (in a modeling tool).
-
-
- * (optional:) important interfaces, that are not explained in the black box templates of a building block, but are very important for understanding the white box.
-Since there are so many ways to specify interfaces why do not provide a specific template for them.
- In the worst case you have to specify and describe syntax, semantics, protocols, error handling,
- restrictions, versions, qualities, necessary compatibilities and many things more.
-In the best case you will get away with examples or simple signatures.
-
-****
-
image:05_diagramaGeneral.png["Diagrama de contexto"]
Motivacion::
@@ -74,14 +21,6 @@ Interfaces importantes::
=== Nivel 2
-[role="arc42help"]
-****
-Here you can specify the inner structure of (some) building blocks from level 1 as white boxes.
-
-You have to decide which building blocks of your system are important enough to justify such a detailed description.
-Please prefer relevance over completeness. Specify important, surprising, risky, complex or volatile building blocks.
-Leave out normal, simple, boring or standardized parts of your system
-****
image:05_diagramaDetalleNivel1.png["Diagrama de detalle nivel 1"]
@@ -97,13 +36,7 @@ Interfaces importantes::
=== Nivel 3
-[role="arc42help"]
-****
-Here you can specify the inner structure of (some) building blocks from level 2 as white boxes.
-When you need more detailed levels of your architecture please copy this
-part of arc42 for additional levels.
-****
image:05_diagramaDetalleNivel2.png["Diagrama de detalle nivel 2"]
diff --git a/docs/06_runtime_view.adoc b/docs/06_runtime_view.adoc
index be80260..12c0a41 100644
--- a/docs/06_runtime_view.adoc
+++ b/docs/06_runtime_view.adoc
@@ -1,47 +1,19 @@
[[section-runtime-view]]
== Vista de Ejecución
-=== Proceso de Login
-El segundo escenario muestra el proceso de "Login". Para ello,
-el usuario debe introducir los datos en el formulario, esos datos serán verificados y si son correctos
-volverá a la pantalla de inicio con la sesión iniciada.
-[plantuml,"Login_diagrama",png]
-----
-@startuml
-actor Usuario
-entity DeDe
-entity inrupt.net
-Usuario-> DeDe: Petición de autenticación
-DeDe-> inrupt.net: Comprobación de credenciales
-alt usuario existe
-
- inrupt.net -> DeDe:Devuelve al usuario
- DeDe->Usuario:Redirección a página principal con usuario identificado
-
-else usuario no existe
- inrupt.net -> DeDe: Mensaje de error
-end
-@enduml
-----
=== Proceso de compra
El primer escenario muestra el proceso de compra de un producto. Para ello,
el usuario debe conectarse con su cuenta y seleccionar la talla correspondiente para que se añada al carrito de la compra.
-[plantuml,"Compra_diagrama",png]
-----
-@startuml
-actor Usuario
-entity DeDe
-database MONGODB
-Usuario-> DeDe: Añadir productos al carrito
-DeDe-> Usuario: Pedir datos necesarios para compra
-Usuario-> DeDe:Introducción datos necesarios
-DeDe-> MONGODB: Comprobación datos
-MONGODB-> DeDe: Devuelve información necesaria
-DeDe-> Usuario: Notificación de la compra
-@endtuml
-----
+image:DiagramaCompra.png["DiagramaCompra"]
+
+=== Proceso de Login
+El segundo escenario muestra el proceso de "Login". Para ello,
+el usuario debe introducir los datos en el formulario, esos datos serán verificados y si son correctos
+volverá a la pantalla de inicio con la sesión iniciada.
+
+image:DiagramaLogin.JPG["LogIn"]
=== Cálculo de los gastos de envío
El tercer escenario nos muestra el proceso de cálculo de los costes de envío de un pedido. Tras finalizar el usuario el pedido, DeDe solicita al POD del usuario la dirección de envío del usuario. Con esta dirección solicita a la empresa de mensajería el importe de los gastos de envío. Una vez obtenido este importe le devuelve al usuario el importe total del pedido, con los gastos de envío incluidos. Si el usuario confirma el pedido DeDe procede a almacenarlo en la base de datos y muestra al usuario la confirmación del envío.
@@ -53,3 +25,4 @@ El último diagrama se corresponde con el proceso de envío al usuario del pedid
una vez finalizado el proceso de compra.
image:DiagramaEnvio.png["Envio"]
+
diff --git a/docs/07_deployment_view.adoc b/docs/07_deployment_view.adoc
index b517f47..b7cf6a9 100644
--- a/docs/07_deployment_view.adoc
+++ b/docs/07_deployment_view.adoc
@@ -2,52 +2,7 @@
== Vista de Despliegue
-
-[role="arc42help"]
-****
-.Content
-The deployment view describes:
-
- 1. the technical infrastructure used to execute your system, with infrastructure elements like geographical locations, environments, computers, processors, channels and net topologies as well as other infrastructure elements and
-
-2. the mapping of (software) building blocks to that infrastructure elements.
-
-Often systems are executed in different environments, e.g. development environment, test environment, production environment. In such cases you should document all relevant environments.
-
-Especially document the deployment view when your software is executed as distributed system with more then one computer, processor, server or container or when you design and construct your own hardware processors and chips.
-
-From a software perspective it is sufficient to capture those elements of the infrastructure that are needed to show the deployment of your building blocks. Hardware architects can go beyond that and describe the infrastructure to any level of detail they need to capture.
-
-.Motivation
-Software does not run without hardware.
-This underlying infrastructure can and will influence your system and/or some
-cross-cutting concepts. Therefore, you need to know the infrastructure.
-
-.Form
-
-Maybe the highest level deployment diagram is already contained in section 3.2. as
-technical context with your own infrastructure as ONE black box. In this section you will
-zoom into this black box using additional deployment diagrams:
-
-* UML offers deployment diagrams to express that view. Use it, probably with nested diagrams,
-when your infrastructure is more complex.
-* When your (hardware) stakeholders prefer other kinds of diagrams rather than the deployment diagram, let them use any kind that is able to show nodes and channels of the infrastructure.
-****
-
=== Nivel de Infraestructura 1
-
-[role="arc42help"]
-****
-Describe (usually in a combination of diagrams, tables, and text):
-
-* the distribution of your system to multiple locations, environments, computers, processors, .. as well as the physical connections between them
-* important justification or motivation for this deployment structure
-* Quality and/or performance features of the infrastructure
-* the mapping of software artifacts to elements of the infrastructure
-
-For multiple environments or alternative deployments please copy that section of arc42 for all relevant environments.
-****
-
image:DiagramaDespliegue.png["DiagramaDespliegue"]
Motivacion::
@@ -61,6 +16,8 @@ Como nuestro objetivo es tener un sistema optimo tanto en cuanto a rendimiento c
intentado buscar y comenzar a usar la mejor infraestructura posible.
Mapeo de Bloques de Construccion a Infraestructura::
+
+
[options="header",cols="1,2"]
|===
|Building Block|Mapping
@@ -71,4 +28,4 @@ Mapeo de Bloques de Construccion a Infraestructura::
| POD| "Almacenes" para guardar los datos de los usuarios de forma segura.
| CorreosAPI| Usada para simular el envio de un pedido a correos.
| Github| Será usado un repositorio a parte para guardar las imágenes de los diferentes artículos de la aplicación.
-|===
+|===
\ No newline at end of file
diff --git a/docs/08_concepts.adoc b/docs/08_concepts.adoc
index 4cd68ba..d2ad4d8 100644
--- a/docs/08_concepts.adoc
+++ b/docs/08_concepts.adoc
@@ -8,7 +8,7 @@ de Entidad-Relación(ER-Diagram):
image:DiagramaER.png["ER Diagram"]
-.Table
+.Modelo de dominio
[options="header",cols="1,2"]
|===
|Name|Descripción
diff --git a/docs/10_quality_scenarios.adoc b/docs/10_quality_scenarios.adoc
index 7ab6e79..e293ab3 100644
--- a/docs/10_quality_scenarios.adoc
+++ b/docs/10_quality_scenarios.adoc
@@ -11,6 +11,7 @@ En esta sección se muestra un diagrama de árbol de calidad para el sistema des
image:DiagramaCalidad.png["DiagramaArbolCalidad"]
=== Escenarios de calidad
+.Escenarios de calidad
[options="header",cols="1,2"]
|===
|Requerimiento|Descripción
@@ -18,4 +19,4 @@ image:DiagramaCalidad.png["DiagramaArbolCalidad"]
| Usabilidad| La aplicación tiene una interfaz y manejo intuitivos, de uso fácil.
| Accesibilidad| Cualquier usuario, puede interactuar con la página sin problemas. Nuestro objetivo es seguir unas pautas de accesibilidad Web.
| Disponibilidad| En cualquier momento que el usuario desee interactuar con la aplicación, podrá hacerlo y se ejecutará eficientemente.
-|===
+|===
\ No newline at end of file
diff --git a/docs/11_technical_risks.adoc b/docs/11_technical_risks.adoc
index 01bf7d3..7b72de1 100644
--- a/docs/11_technical_risks.adoc
+++ b/docs/11_technical_risks.adoc
@@ -3,7 +3,7 @@
Los riesgo durante un proceso de desarrollo están siempre presentes, no obstante, su identificación y registro son cruciales para el bienestar de cualquier proyecto. En esta sección, iremos dejando constancia de todos y cada uno de los riesgo que se hayan encontrado así como las deudas técnicas que hayan podido o puedan surgir debido a malas decisiones. Realizar esta tarea correctamente implicará un crecimiento beneficioso tanto para el proyecto como para el equipo de desarrollo.
-A continuación se muestra una tabla [Table 1] en la que se irán recogiendo todos los riesgos y en la [Table 2] las deudas técnicas que se hayan ido identificando a lo largo del proceso de desarrollo. Están ordenados de mayor a menor prioridad.
+A continuación se muestra una tabla [Table 7] en la que se irán recogiendo todos los riesgos y en la [Table 8] las deudas técnicas que se hayan ido identificando a lo largo del proceso de desarrollo. Están ordenados de mayor a menor prioridad.
.Lista de riesgos
[options="header",cols="1,2,3"]
diff --git a/docs/12_glossary.adoc b/docs/12_glossary.adoc
index 051ba60..d4046e6 100644
--- a/docs/12_glossary.adoc
+++ b/docs/12_glossary.adoc
@@ -1,5 +1,6 @@
[[section-glossary]]
== Glosario
+****
.Glosario
[options="header",cols="1,3"]
|===
From 5014fc32dd5b6d8f9217b38cc40f81a0bcb6ac16 Mon Sep 17 00:00:00 2001
From: UO277876 <79647031+UO277876@users.noreply.github.com>
Date: Sun, 1 May 2022 20:40:26 +0200
Subject: [PATCH 80/80] Cambiadas imagenes
---
docs/01_introduction_and_goals.adoc | 6 +++---
docs/images/DiagramaER.png | Bin 52358 -> 58788 bytes
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/01_introduction_and_goals.adoc b/docs/01_introduction_and_goals.adoc
index 83cec09..a98b5e3 100644
--- a/docs/01_introduction_and_goals.adoc
+++ b/docs/01_introduction_and_goals.adoc
@@ -59,10 +59,10 @@ usuario.
.Stakeholders
[options="header",cols="1,2"]
|===
-|Role/Name|Expectations|
+|Role/Name|Expectations
|Administradores |Realizar una administración cómoda y sin inconvenientes.
-| Equipo de desarrollo|Esperan poder obtener una aplicacíon correcta y usable.
-| Cliente | Sus expectativas son poder realizar una compra en la aplicación de una manera sencilla y accesible.
+|Equipo de desarrollo|Esperan poder obtener una aplicacíon correcta y usable.
+|Cliente | Sus expectativas son poder realizar una compra en la aplicación de una manera sencilla y accesible.
|===
Administradores: se encargan de modificar precios, calcular inventarios, ver todos los pedidos realizados o
diff --git a/docs/images/DiagramaER.png b/docs/images/DiagramaER.png
index 7c39f407b53d83dd30ea0be431be3de1ff9363df..1ebd821830c42552dee9e55aa7e66aeec782f42d 100644
GIT binary patch
literal 58788
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