Lectro

De WikiCE

Lectro
Autores Roberto Calvente Aragón
Leopoldo Gutiérrez Galeano
Lidia Lebrón Amaya
Luis Nadal
Miguel A. Vera Márquez
eLectro será una tienda online encargada de la venta electrodomésticos.

Contenido

Roles

  • Jefe de Proyecto: Leopoldo Gutiérrez Galeano.
  • Diseñador de interfaz de usuario: Todos.
  • Arquitecto software: Todos.
  • Administrador de base de datos: Todos.
  • Analista programador: Todos.
  • Codificador de pruebas: Todos.
  • Administrador de sistemas: Todos.

Entregable 1 - Documento de análisis

Historia de usuario

Fabricante

  • Añadir fabricante: El administrador podrá dar de alta a los fabricantes de electrodomésticos con los que trabaje, para ello rellenará un formulario con sus datos.
  • Editar fabricante: Si el fabricante cambiara algún dato, el administrador tendrá la opción de modificarlo, para ello sólo tendrá que modificar el campo del formulario que haya cambiado.
  • Ver fabricante: se cuenta con la opción de mostrar los detalles de cada fabricante de manera individual.
  • Listar fabricantes: Mediante esta opción,
    • el administrador podrá acceder a la lista de todos los fabricantes que tiene asociados.
    • el usuario (registrado o no) podrá acceder a la lista de fabricantes de electrodomésticos.
  • Eliminar fabricante: Si se deja de trabajar con alguno de los fabricantes de electrodomésticos, el administrador podrá borrarlos del sistema.

Electrodoméstico

  • Añadir electrodoméstico: El admisnitrador podrá incluir en el sistema nuevos electrodomésticos añadiéndolos a la página junto con su descripción.
  • Editar electrodoméstico: Si ha cambiado algún aspecto del electrodoméstico (por ejemplo el precio), el administrador tendrá la opción de modificarlo, cambiando el campo que sea necesario.
  • Ver electrodoméstico: Tanto el administrador como el usuario tendrá disponible la opción para ver cada uno de los electrodomésticos juntos con sus datos.
  • Listar electrodomésticos: Mediante esta opción,
    • el administrador podrá acceder a la lista de todos los electrodomésticos que ofrece al público.
    • el usuario (registrado o no) podrá acceder a la lista de electrodomésticos.
  • Eliminar electrodoméstico: Si se deja de vender algún tipo de electrodomésticos, el administrador podrá borrarlos del sistema.

Proveedor

  • Añadir proveedor: El administrador podrá dar de alta a los proveedores de electrodomésticos con los que trabaje, para ello rellenará un formulario con sus datos.
  • Editar proveedor: Si el proveedor cambiara algún dato, el administrador tendrá la opción de modificarlo, para ello sólo tendrá que modificar el campo del formulario que haya cambiado.
  • Ver proveedor: Se cuenta con la opción de mostrar los detalles de cada proveedor de manera individual.
  • Listar proveedores: Mediante esta opción, el administrador podrá acceder a la lista de todos los proveedores que tiene asociados.
  • Eliminar proveedores: Si se deja de trabajar con alguno de los proveedores, el administrador podrá borrarlos del sistema.

  • Añadir artículo a catálogo: El administrador podrá añadir los artículos que considere al catálogo.
  • Editar catálogo: El administrador podrá modificar cualquiera de los artículos que se encuentren dentro del catálogo.
  • Eliminar artículo del catálogo: El administrador podrá eliminar cualquier artículo del catálogo.
  • Ver catálogo: Tanto el administrador como los clientes podrán tener acceso para visualizar el catálogo.

Carrito de compra

  • Añadir artículo: El cliente podrá ir añadiendo los artículos que desee comprar al carrito.
  • Eliminar artículo: Se podrá eliminar cualquier artículo del carrito de manera individual.
  • Listar artículos: El cliente podrá ver una lista con todos los artículos que tiene agregados actualmente al carrito.

Foro

Añadir, borrar, editar, actualizar foro: Esta operación será realizada por el administrador.

  • Añadir, borrar, editar, actualizar temas dentro de un foro: Esta operación será realizada por el administrador.
  • Añadir comentario: El usuario podrá comentar su opinión en cualquiera de los temas de los foros disponibles.
  • Eliminar comentario: El usuario podrá eliminar cualquier comentario que haya realizado con anterioridad al igual que el administrador podrá eliminar cualquier comentario que determine.
  • Ver comentarios: Los usuarios podrán ver los comentarios de los todos temas de todos los foros.

Etiquetas

  • Crear etiquetas: El administrador podrá crear y asignar una o varias etiquetas para los electrodomésticos.
  • Editar etiquetas: El administrador podrá editar las etiquetas asignadas a los electrodomésticos.
  • Eliminar etiquetas: El administrador podrá eliminar cualquier etiqueta asignada a un electrodoméstico.
  • Listar etiquetas: Un usuario podrá ver todos los electrodomésticos que compartan la misma etiqueta.

Seguridad

  • Registrar usuario: El usuario para poder terminar de realizar una compra, tendrá que registrarse con sus datos.
  • Iniciar sesión: Para confirmar la compra es necesario que el usuario inicie sesión con su cuenta.
  • Cerrar sesión: El usuario podrá cerrar la sesión siempre que quiera salir de la tienda.
  • Editar perfil: El usuario podrá modificar sus datos.

Facturación

  • Ver factura:El usuario podrá ver la factura asociada a su carrito de la compra.
  • Modificar factura:El usuario podrá modificar esa factura, en lo que se refiere a cantidad y a eliminar algún artículo.
  • Listar pedido:El adminsitrador tendrá una lista con todos los pedidos confirmados que se encuentran en el sistema hasta la fecha.
  • Confirmar pedido:Una vez que el usuario acepte el pedido este empezará a efectuarse.
  • Eliminar pedido: Si el usuario no está conforme podrá eliminar el pedido en cualquier momento.

Diagramas de Casos de uso

Fabricante

Fabri.jpeg

Proveedor

Proveedor.jpeg

Electrodoméstico

Electro.jpeg

Catálogo

Catalogo.png

Carrito

Carro.png

Foro

Foro.png

Etiqueta

Etiquetas.png

Seguridad

Seguridad.png

Facturación

Factura.png

Entregable 2 - Documento de diseño

Diagrama de clases

Modelo definitivo.png

Diagrama de Sistemas

Diagrama sistema.png

Entregable 3 - Casos de prueba

Pruebas Unitarias

Fabricantes

  1. Comprobar que se crea el nombre del fabricante.
  2. Comprobar que se crea la dirección del fabricante.
  3. Comprobar que se crea la ciudad del fabricante.
  4. Comprobar que se crea el teléfono del fabricante.
  5. Comprobar que se crea la web del fabricante.

Prueba unitaria:fabricantes

Proveedores

  1. Comprobar que se crea el nombre del proveedor.
  2. Comprobar que se crea la dirección del proveedor.
  3. Comprobar que se crea la ciudad del proveedor.
  4. Comprobar que se crea el teléfono del proveedor.
  5. Comprobar que se crea la web del proveedor.

Prueba unitaria: proveedores

Electrodomésticos

1. Comprobación de que no se puede insertar un electrodoméstico dejando algún campo vacío.
2. Inserción de un electrodoméstico con su fotografía.
3. Comprobar que se crea el nombre del electrodoméstico.
4. Comprobar que se crea el proveedor/es del electrodoméstico.
5. Comprobar que se crea el fabricante del electrodoméstico.
6. Comprobar que se crea el precio de los electrodomésticos.
7. Comprobar que se inserta la fotografía en el electrodoméstico.

Prueba unitaria: electrodomésticos


Importante:

  1. En el archvo test_helper.rb ha de estar la directiva include ActionDispatch::TestProcess para poder invocar el método fixture_file_upload usado para la carga de la fotografia.
  2. Los archivos de fotografías (.jpg, .gif, etc...) han de estar en el directorio../test/fixtures.
  3. Antes de ejecutar los archivos de pruebas es necesario inicializar la B.D., para ello ejecutar rake db:test:clone_structure


Etiquetas

Prueba unitaria: tag

Facturación

Prueba unitaria factura

Pruebas Funcionales

Fabricantes

  1. Prueba de solicitud GET a la acción index, comprobación de obtención de la plantilla adecuada y que la variable de instancia se asigna con el controlador adecuado.
  2. Prueba para mostrar un fabricante. Se comprueba que se obtiene una instancia y un objeto fabricante valido.
  3. Prueba para obtener la plantilla de  nuevos fabricantes
  4. Prueba para crear un fabricante valido.
  5. Prueba para editar un fabricante.
  6. Prueba para actualizar un fabricante
  7. Prueba para eliminar un fabricante

Prueba funcional: Fabricantes

Proveedores

  1. Prueba de solicitud GET a la acción index, comprobación de obtención de la plantilla adecuada y que la variable de instancia se asigna con el controlador adecuado.
  2. Prueba para obtener la plantilla de nuevos proveedores.
  3. Prueba para actualizar un proveedor
  4. Prueba para editar un proveedor.
  5. Prueba para crear un proveedor valido
  6. Prueba para mostrar un proveedor. Se comprueba que se obtiene una instancia y un objeto proveedor valido.
  7. Prueba para eliminar un proveedor

Prueba Funcional: Proveedores

Electrodomésticos

  1. Prueba de solicitud GET a la acción index, comprobación de obtención de la plantilla adecuada y que la variable de instancia se asigna con el controlador adecuado.
  2. Prueba para obtener la plantilla de nuevos elecrodométicos.
  3. Prueba para actualizar un elecrodomético
  4. Prueba para editar un elecrodomético.
  5. Prueba para crear un elecrodomético valido
  6. Prueba para mostrar un elecrodomético. Se comprueba que se obtiene una instancia y un objeto elecrodomético valido.
  7. Prueba para eliminar un elecrodomético

Prueba Funcional: Electrodomésticos

Catálogo

Prueba Funcional: Catálogo

Prueba Integración: Catálogo

Entregable 4 - Base de datos

Para el proyecto se ha optado por usar la base de datos MySQL. Para el correcto funcionamiento es necesario tener instalado MySQL server. Para configurar la base de datos adecuadamente puede seguir los pasos indicados en el tutorial Configuración del proyecto o en esta misma página en el apartado Instalación y despliegue para ello dirígase a los apartados Configurando MySQL y Preparando la BD desde el proyecto.

Rails usa Active Record como sistema de mapeo objeto-relacional en su relación con la base de datos. Este sistema es independiente de la base de datos, además, nos permite hacer, deshacer y realizar un seguimiento a los cambios que se realizan en la estructura de la base de datos a través de un mecanismo denominado migrations.Destacar que ActiveRecord por defecto crea automáticamente por cada tabla un campo denominado id con autoincremento y establecido como clave primaria. Existe una relación N:M entre proveedores y electrodomésticos que necesita ser modelada a través de una tabla intermedia, para más información consultar la guía que se referencia en este apartado.


Diagrama Entidad-Relación

ModeloER.png


Esquema de la base de datos

Se puede ver el esquema de la base de datos de la aplicación aqui.


Relaciones en los modelos

Para saber más acerca de como representar relaciones con Rails acceder a la guía Active Record Associations. Las relaciones entre nuestros modelos principales son las siguientes:

  • Fabricante
    • has_many :electrodomesticos
  • Proveedor:
    • has_and_belongs_to_many :electrodomesticos
  • Electrodomestico:
    • has_and_belongs_to_many :proveedors
    • belongs_to :fabricante
    • has_many :carritos, though => :carrito_items y has_many : carritos


Migrations

Las migraciones creadas en nuestra aplicación se pueden ver aqui.

Entregable 5 - Implementación

La implementación del proyecto está disponible aquí y está alojada en el repositorio Assembla.

Entregable 6 - Wiki del proyecto

El proyecto comienza con la instalación y configuración del entorno según el tutorial configuración del proyecto.

El proyecto está dividido en sprints en los cuales se realizan las siguientes tareas:

  • Sprint 0: FABRICANTES
    • Generado Fabricante mediante scaffold.
    • Se activa la internacionalización mediante la gema i18n. De momento, solo se tratan los enlaces de las vistas y los botones submit.
  • Sprint 1: PROVEEDORES Y ELECTRODOMÉSTICOS
    • Generado Proveedor mediante scaffold.
    • Creada la migration para Electrodomestico teniendo en cuenta las tablas necesarias para implementar las relaciones existentes.
    • Generado el scaffold para Electrodomestico.
    • Se modifican las vistas para mostrar la información relacionada adecuadamente.
    • Instalación del plugin file_column para subir archivos y modificación de las vistas.
    • Los problemas principales son que el libro maneja información correspondiente a una versión de rails antigua y hay cosas que cambian. Se ha empleado mucho tiempo en consultar documentación para poder implementar con Rails 3.
  • Sprint 2: CATÁLOGO, RSS, MOTOR DE BÚSQUEDA
    • 28/12/2010 - Cambio del motor de búsqueda Ferret por Sunspot. Agradecimientos a BRACEL por su información acerca de este motor.
    • 29/12/2010 - RSS funcionando.Se accede a través de http://localhost:3000/catalogo/rss
    • 29/12/2010 - Problemas para resolver:
      • Dar de alta correctamente Electrodomesticos desde Seeds.rb.La falta información en los campos "proveedors" e "imagen" provocan que en el catálogo falle el show del artículo. Este fallo no afecta a los Electrodomesticos creados manualmente.(Arreglado)
  • Sprint 3: CARRITO DE LA COMPRA
  • Sprint 4: FORO
    • 02/01/2011 - Implementado Foro. Hay comportamiento no deseado:
      • Hay un helper que se encarga de generar código HTML y lo devuelve en una variable. El código devuelto no se muestra correctamente, se ha duplicado el código del helper en la vista a la espera de una solución. Se muestran las dos representaciones en pantalla.
      • El plugin acts_as_threaded no está funcionando. Este plugin se limita a actualizar los campos necesarios de la bd para mantener la jerarquía de los mensajes y sus respuestas pero no está actualizando dichos campos. En espera de una solución.
    • 14/01/2011 - Eliminacion del foro propuesto por el libro con el plugin acts_as_threaded. Despues de consultar en clase se opta por usar la gema Community:
      • Problema con la creacion de respuestas a los mensajes, se deja en espera de la finalización del sprint de autenticación.
  • Sprint 5: ETIQUETAS
    • 16/01/2011 - Implementación de etiquetas. Todo correcto a falta de resolver un problema con la ejecución de una porción de javascript.
  • Sprint 6: SEGURIDAD
    • 15/01/2011 - Implementada seguridad y usuarios.
      • Se ha incorporado una gestión de usuarios y sesiones. El sistema ahora permite registrarse, loguearse, editar perfil y salir de la sesión. Además muestra las etiquetas y enlaces oportunos en función de si el usuario está logueado o no. Se ha empleado la gema authlogic para ello.
  • Sprint 7: FACTURACIÓN
    • Creadas las cuentas para el comprador y el vendedor por medio de sandbox, cuentas que serán utilizadas a la hora de la facturación mediante paypal.
    • Implementadas las vistas, controlador y pruebas de facturción.
    • OJO: Falta comprobar que se realiza la compra, modificando la cuenta del comprador.
    • 25/01/2011 - Implementado compra y pago a través de PayPal, integración con carrito y facturación.

Entregable 7 - Instalación y despliegue

Se suponen instalados Ruby 1.8, MySQL y un cliente de subversión.Se supone Linux como sistema operativo.

  • Instalar las dependencias necesarias:
    • ...~$ sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8                  = > Paquetes de ruby developer
    • ...~$ sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby       = > Paquetes de ruby developer
    • ...~$ sudo apt-get install libxslt-dev libxml2-dev                                          = > Paquetes requeridos para la gema Nokogiri
    • ...~$ sudo aptitude install imagemagick                                                      = > Necesario para la gema Paperclip
  • Descargar mediante el cliente svn el proyecto desde http://subversion.assembla.com/svn/e-lectro/trunk/
  • Desde la carpeta del proyecto ejecutar:
    • ...~$ sudo bundle install         = > Para instalar las gemas necesarias.
    • ...~$ sudo ./script/inicia.sh     

    El script solicitará la contraseña del usuario root de MySQL, eliminará las bd si existieran, creará nuevamente las bases de datos, las poblará con datos de prueba y arrancará los servidores del motor de búsqueda y de la aplicación.

Entregable 8 - Documento de configuración

Bases del proyecto

Para el desarrollo de este proyecto se ha usado Linux como sistema operativo y, aunque es posible configurar Ruby on Rails en windows, se recomienda el primero.

Para la correcta ejecución de la aplicación debemos tener instalados los siguientes componentes:

  • ruby 1.8.7
  • rubygems 1.3.7
  • rails 3.0.3
  • NetBeans 6.9.1 o superior. (si se quiere desarrollar)
  • subversion 1.6.9 (si se quiere desarrollar, opcional, no es imprescindible ya que NetBeans posee su propio cliente svn)
  • mysql server y mysql client. Aunque Rails permite usar otras bases de datos.

Las herramientas ruby, rubygems, subversion y mysql, se pueden instalar a través de yast o synaptics, según si se utiliza suse o ubuntu. Para una primera toma de contacto con el entorno y asegurar una configuración correcta del mismo se recomienda realizar el tutorial oficial.

La aplicación tiene una serie de dependencias con otros paquetes y es necesario que estén instalados en nuestro sistema, estos paquetes están detallados en el entregable 7.

Entornos del proyecto

Para configurar la conexión a la base de datos, utilizamos el archivo database.yml ubicado en config -> database.yml. Este archivo nos permite configurar la conexión a tres bases de datos para tres entornos:

  • development (desarrollo):config -> environments -> development.rb Entorno de desarrollo para realizar y observar cambios.
  • test (prueba):config -> environments -> test.rb se utiliza exclusivamente para ejecutar las pruebas y comprobaciones en la aplicación.
  • production (producción):config -> environments -> production.rb, entorno de producción para utilizar aplicaciones finalizadas.

Para indicar a Rails qué entorno vamos a utilizar podemos:

  • Configurar el archivo config/environment.rb descomentando o escribiendo la línea
env['rails_env'] = production 

En este caso se ha cambiado al entorno de producción. Para probar nuestra aplicación no es necesario ningún cambio.

Arrancando la aplicación

Llegados a este punto, con el entorno configurado, podemos lanzar la aplicacación. Simplemente tenemos que seguir las indicaciones del entregable 7. Se instalarán las gemas necesarias, se crearán las BD y se arrancará la aplicación.


A continuación se exponen más en profundidad aspectos importantes de la configuración de la aplicación.

Gemas 

La gemas son el corazón de Rails. Existen gemas ya instaladas pertenecientes al framework y gemas que son necesarias para la implementación de las distintas funcionalides de la aplicación. Con Rails 3 las dependencias con las gemas particulares del proyecto se encuentran en el fichero Gemfile en la raíz del proyecto. Es necesario que las gemas no instaladas sean descargadas e integradas antes de lanzar la aplicación, para ello basta ejecutar la siguiente orden desde una consola de comandos y situados en la carpeta raíz del proyecto:

...Carpeta_proyecto$> sudo bundle install

En nuestro caso las gemas instaladas y sus versiones son las siguientes:

  • rake (0.8.7)
  • abstract (1.0.0)
  • activesupport (3.0.3)
  • builder (2.1.2)
  • i18n (0.4.2)
  • activemodel (3.0.3)
  • erubis (2.6.6)
  • rack (1.2.1)
  • rack-mount (0.6.13)
  • rack-test (0.5.6)
  • tzinfo (0.3.23)
  • actionpack (3.0.3)
  • mime-types (1.16)
  • polyglot (0.3.1)
  • treetop (1.4.9)
  • mail (2.2.10)
  • actionmailer (3.0.3)
  • braintree (2.6.3)
  • activemerchant (1.9.4)
  • arel (2.0.4)
  • activerecord (3.0.3)
  • activeresource (3.0.3)
  • acts-as-taggable-on (2.0.6)
  • authlogic (2.1.6)
  • bundler (1.0.7)
  • cancan (1.5.0)
  • community (0.1.5)
  • escape (0.0.4)
  • mysql2 (0.2.6)
  • nokogiri (1.4.4)
  • pr_geohash (1.0.0)
  • thor (0.14.6)
  • railties (3.0.3)
  • rails (3.0.3)
  • rsolr (0.12.1)
  • sunspot (1.2.rc4)
  • sunspot_rails (1.2.rc4)
  • will_paginate (2.3.15)

Para la instalación de una gema particular sin la intervención del fichero Gemfile solo debemos de ejecutar el siguiente comando en la consola:

sudo gem install 'Nombre de la gema'

Base de datos: MySQL

Vamos a usar para el manejo de la base de datos de la aplicación MySQL. Para instalar MySQL, debes instalar los siguientes paquetes: mysql-server y mysql-client. Se te pedirá crear la contraseña del administrador cuando se instale el programa. Una vez asignada una contraseña al administrador, puedes conectar con el servidor mySQL de la manera siguiente:

$ mysql -h localhost -u root -p

Donde "localhost" és la dirección de tu host y "root" el nombre de usuario.

Te aparece la siguiente pantalla:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20 to server version: 5.0.24a-Debian_9ubuntu2-log
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Aunque el usuario es creado automáticamente por la aplicación, a continuación se muestra el código necesario para crear el usuario que será el encargado de interactuar con las BDs de nuestro proyecto:

mysql>
grant all on electro_development.* to 'electro'@'localhost' identified by 'electro';
grant all on electro_production.* to 'electro'@'localhost' identified by 'electro';
grant all on electro_test.* to 'electro'@'localhost' identified by 'electro';


Migraciones

Cada una de las tablas creadas se migrarán con la siguiente orden:

$ rake db:migrate

Logs

La descripción de los logs se pueden ver aquí y está alojada en el repositorio Assembla.

Levantar el servidor

Dentro de la consola de comandos,en la carpeta de nuestro proyecto ejecutamos lo siguiente:

$ rails server 

El servidor se pone en marcha y podemos ver nuestra aplicación en http://localhost:3000

Script

Otra opción es ejecutar el siguiente script inicia.sh que se divide en dos fases:

  • La parte relacionada con la base de datos en la que se empieza de cero y se migran las tablas ya existente:
echo
echo
echo -n "Introduzca la clave de root para mysql: "
read pass
echo "Eliminando Bases de datos del proyecto"
rake db:drop:all
echo "Habilitando usuario de la aplicación"
mysql --user=root --password=$pass < ./script/permisos.sql
echo "Creando BD"
rake db:create RAILS_ENV=development
echo "Actualizando BD"
rake db:migrate RAILS_ENV=development

  • La parte que arranca, reindexa e inicia el servidor:
echo "Arrancando motor de búsqueda"
rake sunspot:solr:start
echo "Reindexando los datos"
rake sunspot:reindex
echo "Poblando BD"
rake db:seed RAILS_ENV=development
echo "Iniciando servidor de la aplicación"
rails server
echo "Finalizado"
Herramientas personales