Vistas

D 5.1.2 Implementación del Marketplace para PYMES

De MorfeoWiki

PROFIT

Morfeo-EzWeb

Área Temática: 350405 Strategic Action on Open Source Software
FIT-340503-2007-02 EzWeb



Morfeo project EzWeb

Entregable:

D 5.1.2 Implementación del Marketplace para PYMES






Versión: 1.0
Fecha de preparación: 23/11/07
Editores: CTIC, Treelogic
Revisores: Alimerka, Gesimde


Tabla de contenidos

Elección de las tecnologías

Un requisito indispensable para realizar una implementación de un marketplace de resoluciones ERP para PYMES es un exhaustivo análisis de las plataformas mashup existentes en la actualidad. Puntos claves en la evaluación de las mismas serán: la capacidad de utilización de gadgets creados en otras plataformas, representación conjunta de gadgets, catalogación, comunicación entre gadgets y mecanismos de seguridad existentes. A continuación se describen distintas plataformas evaluadas:


NetVibes

Se trata de una plataforma mashup de tipo presentacional, con un funcionamiento a través de 'Gadgets' (tipo GoogleIG). Permite el uso de gadgets de tipo sindicación (feeds RSS), calendario y podcast, así como la creación de gadgets propios utilizando una API dispuesta para ello. Los gadgets pueden ser recolocados y dispuestos en pestañas. Adicionalmente se permite su búsqueda y catalogación. Entre sus características principales se puede distinguir:

Características

  • Funcionamiento a través de Gadgets
    • Tipos de gadget:
      • Feed RSS para sindicación de contenidos.
      • iCal para compartición de calendarios.
      • Podcast para sindicación de audio y vídeo.
      • Creación de gadgets propios.
    • Características técnicas:
      • Creación mediante el uso de XHTML + CSS + JavaScript
      • Utilización del API UWA que permite compatibilidad con Google IG, Apple Dashboard y Opera Widgets.
        • Funcionalidades para comunicación con orígenes de datos Web vía asíncrona (AJAX)
          • Obtención directa de feeds RSS
          • Obtención de datos en texto plano
          • Obtención de datos en formato XML
          • Obtención de datos en formato JSON
        • Permite la ejecución de los gadgets en solitario (sin necesidad de plataforma NetVibes) a efectos de pruebas.
        • Utilización de Javascript limitada.
        • Permite la especificación de preferencias para cada gadget
        • Necesario el uso de navegador web salvo en el caso de Apple Dashboard
  • Presentación de gadgets en pantalla
    • Necesario uso de navegador Web
    • Distribución en pestañas
    • Recolocación en pantalla en rejilla con número configurable de columnas
    • Permite el uso de atajos de teclado
  • Funcionalidades de búsqueda y catalogado de gadgets
    • Catalogado de gadgets mediante 'ecosistemas'
      • Búsqueda de gadgets
      • Distribución en categorías (fijas, establecidas por NetVibes)
      • Agrupación de gadgets tipo feed RSS con información común en 'Universos'.

Valoración

Teniendo en cuenta las características descritas para la plataforma NetVibes se puede concluir lo siguiente:

La plataforma NetVibes permite la creación de gadgets mediante una infraestructura propia basada en el API UWA, permitiendo la reutilización de dichos gadgets en otras plataformas. El API ofrece una forma estructurada de crear gadgets que funcionan individualmente. La plataforma provee de la capacidad de representación conjunta de los gadgets, colocación y catalogación.

Sin embargo las capacidades de uso de JavaScript están reducidas y no se permite la comunicación entre gadgets. Además no se ofrece ningún tipo de información o implementación que sirva de referencia de los servicios de back-end con los que se comunicarían los gadgets. Esto implica que en el caso particular de la creación de gadgets con el propósito de la creación de un TPV haya que diseñar cómo serán los servicios que se consuman, requiriendo un esfuerzo adicional y limitando la posible reutilización.

Las limitaciones anteriormente mencionadas hacen necesario que toda la lógica de comunicación y estado deba de ser almacenada en servidores web propios, de forma que dicha información pueda ser accedida mediante los gadgets. Además, la plataforma no ofrece mecanismos de seguridad ni de aislamiento del entorno de ejecución (el navegador), que permitan cumplir algunos de los requisitos de los casos de uso descritos para PYME y Gran Empresa.

Por lo tanto, la plataforma NetVibes proporciona al menos unas funcionalidades mínimas que pueden ser aprovechadas para la creación de los gadgets en el caso de uso de PYME, si bien existirán algunas limitaciones que deberían de ser cubiertas por la plataforma final. La implementación inicial de los gadgets servirá además para pulir el conjunto de requisitos que deberá soportar la plataforma EzWeb.


MyYahoo

Se trata de una plataforma mashup de tipo presentacional con un funcionamiento a través de 'Módulos' (tipo GoogleIG). Permite el uso de módulos de tipo sindicación (feeds RSS) y de módulos de servicios ligeramente más avanzados creados por Yahoo. Permite la personalización de la página principal mediante la colocación de los diferentes módulos. Entre sus características principales se puede distinguir:

Características

  • Funcionamiento a través de Módulos
    • Tipos de Módulos
      • Feed RSS para sindicación de contenidos
      • Módulos con otro tipo de servicios creados por Yahoo (horóscopo, tiempo, etc)
    • Características técnicas
      • Agregación de feeds RSS
  • Presentación de gadgets en pantalla
    • Necesario uso de navegador Web
    • Distribución en pestañas
    • Recolocación en pantalla en rejilla con número configurable de columnas
  • Funcionalidades de búsqueda y catalogado de Módulos
    • Catalogado de Módulos
      • Búsqueda
      • Distribución en categorías (fijas, establecidas por Yahoo)
      • Posibilidad de agregación de feeds RSS externos

Valoración

Teniendo en cuenta las características descritas para la plataforma My Yahoo se puede concluir lo siguiente: La plataforma MyYahoo sólo permite el uso de servicios desarrollados por la propia Yahoo y la agregación y sindicación de feeds RSS propios. Carece de la posibilidad de integrar módulos propios con funcionalidades más allá de la sindicación de contenidos, con lo que no cumple los requisitos mínimos para el desarrollo de un TPV sobre la plataforma. Dentro de la plataforma Yahoo existen también tecnologías de gadgets pero orientadas a su uso en escritorio y no a su utilización mediante mashup Web.


PageFlakes

Se trata de una plataforma mashups, basada en Ajax, similar a NetVibes en funcionamiento y en aspecto, sin embargo más avanzada en lo que a funcionalidades y diseño se refiere.

PageFlakes está organizada en solapas o pestañas (tabs), permitiendo crear escritorios múltiples a los que podemos acceder a través de dichas tabs, cada tab contiene a modo de agregador diversos servicios (flakes) previamente definidos por el usuario. Además de la opción obligada de consultar los feeds, pone a disposición de los desarrolladores, APIS para que hagan nuevos módulos (JSP).

Características

  • Funcionamiento a través de Flakes
    • Tipos de flakes:
      • Feed RSS para sindicación de contenidos.
      • Creación de flakes propios.
      • Podcast para sindicación de audio y vídeo.
    • Características técnicas:
      • Creación mediante el uso de XHTML + CSS + JavaScript
      • Funcionalidades para comunicación con orígenes de datos Web vía asíncrona (AJAX)
      • Agregación de feeds RSS
      • Ejecución de los flakes en solitario.
      • Especificación de preferencias para cada flakes.
    • Presentación de flakes en pantalla
      • Necesario uso de navegador Web
      • Distribución en pestañas
      • Recolocación en rejilla con número configurable de columnas
  • Funcionalidades de búsqueda y catalogado de flakes
    • Búsqueda de flakes
    • Agrupación de flakes tipo feed RSS

Valoración

Teniendo en cuenta las características descritas para la plataforma PageFlakes se puede concluir lo siguiente:

La plataforma PageFlakes permite la creación estructurada de flakes que funcionan individualmente, mediante una infraestructura propia basada en el API, permitiendo la reutilización de dichos flakes en otras plataformas. PageFlakes provee de la capacidad de representación conjunta de los flakes, colocación,...

Sin embargo no se ofrece ningún tipo de información acerca de los servicios back-end con los que se comunicarán los flakes. Lo que implica un esfuerzo adicional con el propósito de la creación de flakes para un TPV.

Esta plataforma proporciona funcionalidades suficientes aprovechables para la creación inicial de flakes en el caso de uso de PYME, con la finalidad de cumplir más adelante los requisitos que deberá soportar la plataforma EzWEb.


POSH de Portaneo

La plataforma POSH es un portal personalizable al estilo de Netvibes e IGoogle, creado mediante HTML, AJAX y MySQL. Permite el uso de módulos (gadgets) previamente creados, o bien, crear nuestros propios gadgets mediante su correspondiente API. Se pueden distribuir los gadgets por pestañas y ubicar éstos dentro de la página de forma libre. Otra funcionalidad es la capacidad de añadir funcionalidades al sistema mediante addons, como por ejemplo un reproductor mp3 en flash. Es un software libre distribuido bajo la licencia GNU General Public License Entre sus características principales se puede distinguir:

Características

  • Funcionamiento a través de Módulos
    • Tipos de módulos:
      • Sindicación RSS.
      • Creación de módulos propios.
    • Características técnicas:
      • Uso de Javascrip + XHTML + CSS para los módulos.
      • Uso de PHP, AJAX y MySQL para el portal.
  • Presentación de gadgets en pantalla
    • Necesidad de un navegador web.
    • Uso de pestañas.
    • Distribución flexible por la pantalla.
    • Posibilidad de configurar el número de columnas
  • Funcionalidades de catalogado y búsqueda de módulos
    • Los módulos están ordenados por categorías.
    • Se permite la realización de búsquedas

Valoración

Aunque la plataforma está en una fase de desarrollo preliminar a las anteriormente comentadas, con distintos detalles por mejorar (por ejemplo, una mejor documentación sobre cómo crear módulos y un mejor sistema de clasificación de los mismos), resulta muy interesante el hecho de poder disponer del código. La plataforma está creada con PHP, AJAX y MySQL. El código está disponible en la siguiente URL: http://www.portaneo.com/solutions/en/opensource_development.php

El único requisito necesario para instalarlo es disponer de un servidor MySQL y un servidor web debidamente configurado.

Implementación

Para la plataforma NetVibes se han desarrollado los gadgets de ‘Búsqueda de Artículos’ y ‘Gestión de artículos’ especificados en el apartado D.5.1.2 intentando cumplir al máximo los requisitos establecidos con las posibilidades que aporta esta plataforma. El contenido de los gadgets de NetVibes se encuentra en ficheros HTML. Se ha utilizado PHP en el servidor para el manejo de la base de datos

Implementación del gadget "Búsqueda de artículos" en NetVibes

La funcionalidad del gadget está desarrollada en: http://ezweb.treelogic.com/widgets/buscaProd.html

  • Se proporciona una lista de artículos basándose en el criterio de búsqueda.
  • El mismo criterio se utiliza para buscar en todos los campos más representativos del artículo.
  • La modificación del criterio de búsqueda genera una búsqueda instantánea.
  • La búsqueda se realiza sin ser necesario pulsar ninguna tecla ni botón.
  • El criterio de búsqueda esta formado por la conjunción copulativa de todas las palabras introducidas.
  • Al realizar una búsqueda de artículos se permite exportar los datos de cada artículo a un fichero XML.

Inconvenientes: El tiempo de respuesta depende de la ubicación del servidor con la BBDD. Además la API UWA de NetVibes sólo proporciona funciones asíncronas, por lo que los tiempos de respuesta al mostrar los resultados pueden variar.

Implementación del gadget "Gestión de artículos" en NetVibes

La funcionalidad del gadget está desarrollada en: http://ezweb.treelogic.com/widgets/gestionArticulos.html

Alta de artículo
  • Para realizar un alta deberemos pulsar en la pestaña “Alta”.
  • El identificador del artículo a dar de alta puede ser creado de forma manual, siempre y cuando no esté ocupado ya, o automática. En este último caso bastará con dejar en blanco el campo “Producto” del formulario.
  • Todos los campos del formulario deberán ser rellenados, excepto el identificador de producto, para que el alta sea correcto.
  • Se podrá dar de alta un artículo que anteriormente haya sido dado de baja.
Baja de artículo
  • Para realizar una baja deberemos pulsar en la pestaña “Baja”.
  • Se podrá dar de baja un artículo sin que sea eliminado del sistema.
  • Se podrá eliminar un artículo definitivamente del sistema, una vez haya sido dado de baja.
Modificación de artículo
  • Para realizar una modificación en un artículo deberemos pulsar la pestaña “Modificación”.
  • En primer lugar habrá de buscar el artículo que se quiera modificar.
  • Los datos del artículo a modificar se mostrarán en el formulario pero no se podrán editar.
  • Para editar los datos del artículo primero se deberá pulsar en la casilla “Bloquear para modificación” con el fin de bloquear el artículo y que ningún otro usuario pueda modificarlo.
  • Una vez realizados los cambios se pulsará el botón “Modificar” que automáticamente desbloqueará el artículo una vez modificado.
  • Si no se desease aplicar los cambios realizados, bastará con desmarcar la casilla “Bloquear para modificación” antes de pulsar “Modificar”.
General en todas las pestañas
  • Se podrán realizar búsquedas de artículos a partir de su identificador con el fin de comprobar si un artículo existe ya en el sistema. Para ello se deberá pulsar el botón situado a continuación del campo “Producto”.
  • Cuando se realiza una búsqueda a partir de un identificador de artículo, si éste existe se rellenarán automáticamente todos los campos del formulario.
  • Existe la opción de buscar también un identificador de Familia o Sección, del mismo modo que con un artículo.

Se permite la exportación de los datos de un artículo a un fichero XML simplemente con pulsar el botón “XML”.

Instrucciones de uso

"Búsqueda de artículos" en la plataforma NetVibes

El interfaz de usuario es lo más simple posible y consta de:

  • Campo de texto donde se introduce el criterio de búsqueda.
  • Parrilla de datos donde se muestran los resultados.
Imagen:Buscar_producto.JPG

Debido a las limitaciones de esta plataforma no se pueden cumplir todos los requisitos establecidos:

  • No es posible definir opciones de teclado para realizar el movimiento por la parrilla y seleccionar registros.

"Gestión de artículos" en la plataforma NetVibes

El interfaz de usuario dispone de los siguientes elementos para proporcionar las funcionalidades comentadas en el apartado "Implementación":

  • Etiquetas con el nombre de los campos a rellenar
  • Campos de texto donde introducir los datos.
  • Botones de búsqueda de Productos, Familias y Secciones.
  • Distintas pestañas de navegación, una para cada acción sobre los artículos:
  • Alta
  • Baja
  • Modificación
Imagen:Gestion_producto.JPG

Debido a las limitaciones de esta plataforma no se pueden cumplir todos los requisitos establecidos:

  • No es posible definir opciones de teclado para moverse a través de las pestañas y los diferentes campos y botones del formulario.
  • No es posible la importación de datos a partir de ficheros dado que Javascript no permite el manejo de los mismos.

Implementación sobre iGoogle

NOTA - A día 19 de diciembre de 2007 Google ha pasado los gadgets de tipo html-inline a estado deprecated (es decir, los ha marcado como a abandonar) aduciendo dificultad en su mantenimiento a causa de potenciales riesgos en la seguridad. Esto ha provocado que muchos gadgets a nivel mundial dejen de ser operativos. El cambio ha afectado a los gadgets desarrollados dentro de la Actividad 5, que incluyen requisitos de inter-comunicación (tal y como queda explicado dentro de este mismo documento)y que necesitan ser declarados como html-inline para poder funcionar correctamente.

La comunicación de este hecho por parte de Google no se ha realizado a través de la información principal para desarrolladores, sino que se ha dado a conocer a través de un post en los foros de Google.

Dentro de este entregable se incluyen capturas de pantalla y vídeos que permiten mostrar la funcionalidad que se ha logrado en caso de que el soporte por parte de Google se retire de forma definitiva.


Valoración de la plataforma

Para el desarrollo final de los gadgets de PYME se ha escogido iGoogle[1] por ser la plataforma de gadgets que menos restricciones impone en el uso de Javascript, etc. Sin embargo, cuenta con importantes limitaciones que reducen la funcionalidad final de los gadgets y que deberán ser solventadas en la plataforma EzWeb:

  • No permite realizar ni peticiones POST, PUT ni DELETE.
  • No permite negociar el tipo de contenido que debe devolver el servidor cuando se realiza una petición AJAX (siempre se realizan peticiones con Accept HTML).
  • No provee controles avanzados que permitan una interacción rica (es necesario realizar integración con librerías JavaScript como Dojo, Ext o YUI.
  • Capacidades de login sólo a través de Cookies
  • Imposibilidad de conectividad local (salvo que el servidor local se exponga a través de Web o que se utilicen servidores intermedios)
  • Las funcionalidades de intercomunicación entre gadgets aún estan en base Beta y tienen errores (por esta razón se ha utilizado un sistema de intercomunicación basado en una pizarra en la que se publican datos)
  • No tiene API de acceso por teclado para seleccionar widgets.

Muchos de los problemas pueden ser solventados si se amplía el API AJAX que realiza peticiones para que incluya todos los verbos y que además permita indicar el tipo de contenido a servir.

Entorno de servidor

Para el desarrollo de los prototipos de widgets se ha implementado una aplicación prototipo REST[2] sobre la plataforma Java CETIA4[3]. Esta plataforma permite un mapeo y manejo sencillo de los verbos[4] y URIs que son utilizados en REST, de forma que supone una aproximación válida a la solución que podría implantarse en el servidor en un caso real.

Desde CETIA4 se distinguen las representaciones de cliente en función de la cabecera 'Accept' de HTTP, sirviendo HTML o XML en función del valor de la cabecera en la petición. Sin embargo, para el prototipo de widgets sólo se han especificado las representaciones en XML[5] ya que son las más propicias para su uso dentro de una plataforma de mashup como iGoogle.

Dentro de las infraestructuras REST todas las operaciones son realizadas mediante los verbos GET, PUT, POST y DELETE. En la siguiente sección se describen los mapeos actualmente utilizados.

Operaciones permitidas

operacion direccion
Articulos
Listar articulos GET /articulos
Listar articulos

(inf. extendida)

GET /articulos?extended
Buscar articulos GET /articulos?filter=cadena
Filtrar articulos GET /articulos?campo=cadena (ej id=1 ó descripcion=cerveza)
Listar articulo GET /articulos/{idArticulo}
Insertar articulo PUT /articulos
Modificar articulo POST /articulos/{idArticulo}
Borrar articulo DELETE /articulos/{idArticulo}
Familias
Listar familias GET /familias
Listar familias

(inf. extendida)

GET /familias?extended
Buscar familias GET /familias?filter=cadena
Filtrar familias GET /familias?campo=cadena (ej id=1 ó descripcion=cerveza)
Listar familia GET /familias/{idFamilia}
Secciones
Listar secciones GET /secciones
Listar secciones

(inf. extendida)

GET /secciones?extended
Buscar secciones GET /secciones?filter=cadena
Filtrar secciones GET /secciones?campo=cadena (ej id=1 ó descripcion=cerveza)
Listar seccion GET /secciones/{idSeccion}
TiposIVA
Listar tiposIVA GET /tiposIVA
Listar tiposIVA

(inf. extendida)

GET /tiposIVA?extended
Buscar tiposIVA GET /tiposIVA?filter=cadena
Filtrar tiposIVA GET /tiposIVA?campo=cadena (ej id=1 ó descripcion=cerveza)
Listar tipo IVA GET /tiposIVA/{idTipoIva}
Tickets
Listar tickets GET /tickets
Listar tickets

(inf. extendida)

GET /tickets?extended
Buscar tickets GET /tickets?filter=cadena
Filtrar tickets GET /tickets?campo=cadena (ej ticketFinalizado=false)
Listar un ticket GET /tickets/{idTicket}
Borrar un ticket DELETE /tickets/{idTicket}
Insertar un ticket PUT /tickets
Modificar un ticket (sólo para el estado) POST /ticket/{idTicket}?ticketFinalizado=true
Líneas de ticket
Listar líneas de un ticket GET /tickets/{idTicket}/lineas_ticket
Listar líneas de un ticket

(inf. extendida)

GET /tickets/{idTicket}/lineas_ticket?extended
Obtener una linea en particular GET /tickets/{idTicket}/lineas_ticket/{linea}
Insertar una linea PUT /tickets/{idTicket}/lineas_ticket?articulo={idArticulo}&cantidad={cantidad}
Borrar una linea DELETE /tickets/{idTicket}/lineas_ticket/{linea}
Modificar una linea (sólo la cantidad} POST /tickets/{idTicket}/lineas_ticket/{linea}?cantidad={cantidad}
Cobros
Listar cobros de un ticket GET /tickets/{idTicket}/cobros
Listar cobros de un ticket

(inf. extendida)

GET /tickets/{idTicket}/cobros?extended
Obtener un cobro para una modalidad de pago en particular GET /tickets/{idTicket}/cobros/{modalidadPago}
Insertar un cobro PUT /tickets/{idTicket}/cobros?articulo={idArticulo}&cantidad={cantidad}
Borrar un cobro DELETE /tickets/{idTicket}/cobros/{modalidadPago}
Modificar un cobro (sólo el importe} POST /tickets/{idTicket}/cobros/{modalidadPago}?importe={importe}
Modalidades Pago
Listar modalidades GET /modalidadesPago
Listar modalidades

(inf. extendida)

GET /modalidadesPago?extended
Buscar modalidades GET /modalidadesPago?filter=cadena
Listar una modalidad GET /modalidadesPago/{idModalidad}

Para el caso de modificación e inserción de artículos podrían llegar a cambiarse los verbos, de esta forma insertar pasaría a ser con POST (ya que no es idempotente) y modificar con PUT (que sí es idempotente)

Para forzar la negociación de contenidos y que se devuelva XML, la petición puede llevar el parámetro _type=ws (p.ej. GET /articulos?_type=ws)

Para forzar una inserción, modificación o borrado a través de GET (por ejemplo por que exista la imposibilidad de utilizar PUT, POST o DELETE como en el caso de iGoogle) estos se pueden lograr utilizando _method=insert, _method=update o _method=delete.

Representaciones de cliente

Para las representaciones de cliente se muestran tan sólo aquellas en XML

GET /articulos (opcionalmente se puede usar busqueda o filtrado)
<articulos href="http://idi.fundacionctic.org/EzWeb/articulos">
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/1">1</articulo>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/2">2</articulo>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/3">3</articulo>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/4">4</articulo>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/5">5</articulo>
</articulos>
GET /articulos?extended (opcionalmente se puede usar busqueda o filtrado)
<articulos href="http://idi.fundacionctic.org/EzWeb/articulos">
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/1">
		<id>1</id>
		<descripcion>Chorizo</descripcion>
		<seccion href="http://idi.fundacionctic.org/EzWeb/secciones/2">2</seccion>
		<familia href="http://idi.fundacionctic.org/EzWeb/familias/1">1</familia>
		<pvp>1.5</pvp>
		<iva href="http://idi.fundacionctic.org/EzWeb/tiposIVA/1">1</iva>
		<rutaImagen href="http://idi.fundacionctic.org/EzWeb/static/images/800021601_arena_de_gatos.jpg">
		800021601_arena_de_gatos.jpg
		</rutaImagen >
		<bloqueado>false</bloqueado>
		<enBaja>false</enBaja>
		<eans>
			<ean>800021601</ean>
		</eans>
	</articulo>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/2">
		<id>2</id>
		<descripcion>Filete</descripcion>
		<seccion href="http://idi.fundacionctic.org/EzWeb/secciones/1">1</seccion>
		<familia href="http://idi.fundacionctic.org/EzWeb/familias/1">1</familia>
		<pvp>2.0</pvp>
		<iva href="http://idi.fundacionctic.org/EzWeb/tiposIVA/1">1</iva>
		<rutaImagen href="http://idi.fundacionctic.org/EzWeb/static/images/800021601_arena_de_gatos.jpg">
		800021601_arena_de_gatos.jpg
		</rutaImagen >
		<bloqueado>false</bloqueado>
		<enBaja>true</enBaja>
		<eans>
			<ean>800021601</ean>
		</eans>	
	</articulo>
	<...>
</articulos>
GET /articulos/{idArticulo}
<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/{idArticulo}">
	<id>{idArticulo}</id>
	<descripcion>Chorizo</descripcion>
	<seccion href="http://idi.fundacionctic.org/EzWeb/secciones/2">2</seccion>
	<familia href="http://idi.fundacionctic.org/EzWeb/familias/1">1</familia>
	<pvp>1.5</pvp>
	<iva href="http://idi.fundacionctic.org/EzWeb/tiposIVA/1">1</iva>
	<rutaImagen href="http://idi.fundacionctic.org/EzWeb/static/images/800021601_arena_de_gatos.jpg">
		800021601_arena_de_gatos.jpg
	</rutaImagen >
	<bloqueado>false</bloqueado>
	<enBaja>true</enBaja>
	<eans>
		<ean>800021601</ean>
	</eans>	
</articulo>
PUT /articulos
<response>
	<status>OK</status>
	<articulo 
	href="http://idi.fundacionctic.org/EzWeb/articulos/{newId}">
	{newId}
	</articulo>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
POST /articulos/{idArticulo}
<response>
	<status>OK</status>
	<articulo 
	href="http://idi.fundacionctic.org/EzWeb/articulos/{idArticulo}">
	{idArticulo}
	</articulo>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
DELETE /articulos/{idArticulo}
<response>
	<status>OK</status>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
GET /familias (opcionalmente se puede usar busqueda o filtrado)
<familias href="http://idi.fundacionctic.org/EzWeb/familias">
	<familia href="http://idi.fundacionctic.org/EzWeb/familias/1">1</familia>
	<familia href="http://idi.fundacionctic.org/EzWeb/familias/2">2</familia>
</articulos>
GET /familias?extended (opcionalmente se puede usar busqueda o filtrado)
<familias href="http://idi.fundacionctic.org/EzWeb/familias">
	< familia href="http://idi.fundacionctic.org/EzWeb/familias/1">
		<id>1</id>
		<descripcion>Ternera</descripcion>
	</familia>
	<...>
</familias>
GET /familias/{idFamilia}
<familia href="http://idi.fundacionctic.org/EzWeb/familias/{idFamilia}">
	<id>{idFamilia}</id>
	<descripcion>Ternera</descripcion>
</familia>
GET /secciones (opcionalmente se puede usar busqueda o filtrado)
<secciones href="http://idi.fundacionctic.org/EzWeb/secciones">
	<seccion href="http://idi.fundacionctic.org/EzWeb/secciones/1">1</seccion>
	< seccion href="http://idi.fundacionctic.org/EzWeb/secciones/2">2</seccion>
</articulos>
GET /secciones?extended (opcionalmente se puede usar busqueda o filtrado)
<secciones href="http://idi.fundacionctic.org/EzWeb/secciones">
	< seccion href="http://idi.fundacionctic.org/EzWeb/secciones/1">
		<id>1</id>
		<descripcion>Carnicería</descripcion>
	</seccion>
	<...>
</secciones>
GET /secciones/{idseccion}
<seccion href="http://idi.fundacionctic.org/EzWeb/secciones/{idseccion}">
	<id>{idseccion}</id>
	<descripcion>Carnicería</descripcion>
</seccion>
GET /tiposIVA (opcionalmente se puede usar busqueda o filtrado)
<tiposIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA">
	<tipoIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA/1">1</tipoIVA>
	< tipoIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA/2">2</tipoIVA>
</tiposIVA>
GET /tiposIVA?extended (opcionalmente se puede usar busqueda o filtrado)
< tiposIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA">
	< tipoIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA/1">
		<id>1</id>
		<valor>0.16</valor>
		<re>1</re>
	</tipoIVA>
	<...>
</tiposIVA>
GET /tiposIVA/{idtipoIVA}
<tipoIVA href="http://idi.fundacionctic.org/EzWeb/tiposIVA/{idtipoIVA}">
	<id>{idtipoIVA}</id>
	<valor>0.16</valor>
	<re>1</re>
</tipoIVA>


GET /tickets (opcionalmente se puede usar busqueda o filtrado)
<tickets href="http://idi.fundacionctic.org/EzWeb/tickets">
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/1">1</ticket>
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/2">2</ticket>
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/3">3</ticket>
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/4">4</ticket>
</tickets>
GET /tickets?extended (opcionalmente se puede usar busqueda o filtrado)
<tickets href="http://idi.fundacionctic.org/EzWeb/tickets">
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/1">
		<supermercado>Gijon</supermercado>
		<caja>Caja1</caja>
		<numeroTicket>1</numeroTicket>
		<cliente>Cliente1</cliente>
		<fecha>2007-12-13</fecha>
		<hora>10:38:17</hora>
		<importe>10.52</importe>
		<ticketFinalizado>false</ticketFinalizado>
		<lineasTicket href="http://idi.fundacionctic.org/EzWeb/tickets/1/lineas_ticket">lineas_ticket</lineasTicket>
		<cobros href="http://idi.fundacionctic.org/EzWeb/tickets/1/cobros">cobros</cobros>
	</ticket>
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/2">
		<supermercado>Gijon</supermercado>
		<caja>Caja1</caja>
		<numeroTicket>2</numeroTicket>
		<cliente>Cliente1</cliente>
		<fecha>2007-12-15</fecha>
		<hora>16:34:23</hora>
		<importe>0.0</importe>
		<ticketFinalizado>false</ticketFinalizado>
		<lineasTicket href="http://idi.fundacionctic.org/EzWeb/tickets/2/lineas_ticket">lineas_ticket</lineasTicket>
		<cobros href="http://idi.fundacionctic.org/EzWeb/tickets/2/cobros">cobros</cobros>
	</ticket>
	<...>
</tickets>
GET /tickets/{idTicket}
<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}">
	<supermercado>Gijon</supermercado>
	<caja>Caja1</caja>
	<numeroTicket>{idTicket}</numeroTicket>
	<cliente>Cliente1</cliente>
	<fecha>2007-12-13</fecha>
	<hora>10:38:17</hora>
	<importe>10.52</importe>
	<ticketFinalizado>false</ticketFinalizado>
	<lineasTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket">lineas_ticket</lineasTicket>
	<cobros href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros">cobros</cobros>
</ticket>
PUT /tickets
<response>
	<status>OK</status>
	<ticket href="http://idi.fundacionctic.org/EzWeb/tickets/{newIdTicket}">{idTicket}</ticket>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
POST /tickets/{idTicket}
<response>
	<status>OK</status>
	<ticket
	href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}">
	{idTicket}
	</ticket>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
DELETE /tickets/{idTicket}
<response>
	<status>OK</status>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
GET /tickets/{idTicket}/lineas_ticket
<lineasTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket">
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/1">1</lineaTicket>
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/2">2</lineaTicket>
</lineasTicket>
GET /tickets/{idTicket}/lineas_ticket?extended
<lineasTicket href="http://idi.fundacionctic.org/EzWeb/tickets/1/lineas_ticket">
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/1">
		<supermercado>Gijon</supermercado>
		<caja>Caja1</caja>
		<numeroTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}">{idTicket}</numeroTicket>
		<linea>1</linea>
		<pvp>1.45</pvp>
		<cantidad>4</cantidad>
		<importe>5.8</importe>
		<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/1">
			<id>1</id>
			<descripcion>Arena de gatos ALIMERKA bolsas 5kg</descripcion>
			<pvp>1.45</pvp>
			<eans>
				<ean>800021601</ean>
			</eans>
		</articulo>
	</lineaTicket>
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/2">
		<supermercado>Gijon</supermercado>
		<caja>Caja1</caja>
		<numeroTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}">{idTicket}</numeroTicket>
		<linea>2</linea>
		<pvp>1.18</pvp>
		<cantidad>4</cantidad>
		<importe>4.72</importe>
		<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/4">
			<id>4</id>
			<descripcion>Croquetas de jamon artesanas ALIMERKA bolsa 500gr</descripcion>
			<pvp>1.18</pvp>
			<eans>
				<ean>800031401</ean>
			</eans>
		</articulo>
	</lineaTicket>
	<...>
</lineasticket>
GET /tickets/{idTicket}/lineas_ticket/{linea}
<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/{linea}">
	<supermercado>Gijon</supermercado>
	<caja>Caja1</caja>
	<numeroTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}">{idTicket}</numeroTicket>
	<linea>{linea}</linea>
	<pvp>1.18</pvp>
	<cantidad>4</cantidad>
	<importe>4.72</importe>
	<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/4">
		<id>4</id>
		<descripcion>Croquetas de jamon artesanas ALIMERKA bolsa 500gr</descripcion>
		<pvp>1.18</pvp>
		<eans>
			<ean>800031401</ean>
		</eans>
	</articulo>
</lineaTicket>
PUT /tickets/{idTicket}/lineas_ticket
<response>
	<status>OK</status>
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/lineas_ticket/{newLinea}">
		<linea>{newLinea}</linea>
		<importe>2.3</importe>
		<cantidad>2</cantidad>
		<articulo href="http://idi.fundacionctic.org/EzWeb/articulos/3">
			<id>3</id>
			<descripcion>Jamon cocido extra en lochas ALIMERKA 80gr</descripcion>
			<pvp>1.15</pvp>
			<eans>
				<ean>28100801</ean>
			</eans>
		</articulo>
	</lineaTicket>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
POST /tickets/{idTicket}/lineas_ticket/{linea}
<response>
	<status>OK</status>
	<lineaTicket href="http://idi.fundacionctic.org/EzWeb/tickets/1/lineas_ticket/1">1</lineaTicket>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
DELETE /tickets/{idTicket}/lineas_ticket/{linea}
<response>
	<status>OK</status>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
GET /tickets/{idTicket}/cobros
<cobros href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros">
	<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/1">Contado</cobro>
	<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/2">Tarjeta</cobro>
</cobros>
GET /tickets/{idTicket}/cobros?extended
<cobros href="http://idi.fundacionctic.org/EzWeb/tickets/66/cobros">
	<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/1">
		<fecha>2007-12-21</fecha>
		<hora>10:06:02</hora>
		<importe>10.0</importe>
		<modalidadPago href="http://idi.fundacionctic.org/EzWeb/modalidadespago/1">Contado</modalidadPago>
	</cobro>
	<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/2">
		<fecha>2007-12-21</fecha>
		<hora>10:06:02</hora>
		<importe>8.4</importe>
		<modalidadPago href="http://idi.fundacionctic.org/EzWeb/modalidadespago/2">Tarjeta</modalidadPago>
	</cobro>
	<...>
</cobros>
GET /tickets/{idTicket}/cobros/{idModalidadPago}
<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/{idModalidadPago}">
	<fecha>2007-12-21</fecha>
	<hora>10:06:02</hora>
	<importe>10.0</importe>
	<modalidadPago href="http://idi.fundacionctic.org/EzWeb/modalidadespago/{idModalidadPago}">Contado</modalidadPago>
</cobro>
PUT /tickets/{idTicket}/cobros
<response>
	<status>OK</status>
	<cobrohref="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/{idModalidadPago}" />
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
POST /tickets/{idTicket}/cobros/{idModalidadPago}
<response>
	<status>OK</status>
	<cobro href="http://idi.fundacionctic.org/EzWeb/tickets/{idTicket}/cobros/{idModalidadPago}">{idModalidadPago}</cobro>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>
DELETE /tickets/{idTicket}/cobros/{idModalidadPago}
<response>
	<status>OK</status>
</response>
<response>
	<status>ERROR</status>
	<message>Mensaje error</message>
</response>

Gadgets

Para la plataforma de IGoogle se han desarrollado los gadgets dispuestos en el apartado búsqueda de artículos de D.5.1.2 , lista de compra de D.5.1.2, gestión de cobros de D.5.1.2 y gestión de tickets de D.5.1.2.

Gadget Visualización de imagen de artículo

  • Este gadget muestra la imagen del artículo que se haya seleccionado a través del gadget de Listado de artículos.
  • El gadget esta a la escucha de datos de un artículo para mostrar su imagen.
  • Podría ser conectado con cualquier otro gadget que publicase datos de artículo.

Imagen: VisorImagenArticulo_PYME.png

Gadget Gestión de datos de artículo

  • Este gadget permite gestionar los datos de los artículos, admitiendo operaciones de inserción, modificación y borrado.
  • El gadget se puede comunicar con gadgets que reciban datos de un artículo, como por ejemplo el de búsquedas y listados.
  • El gadget está a la escucha de datos de artículos también, de forma que pueda presentar los datos que se le envíen, como pudiesen ser los de un artículo seleccionado dentro del gadget de búsquedas.
  • El gadget permite la inserción de un artículo a través del boton 'Nuevo', que inicializa el gadget y desbloquea los campos para permitir la edición y guardar posteriormente sus datos a través del botón 'Grabar'.
  • Para modificar un artículo primero hay que obtener sus datos, los cuales provendrán de otros gadgets. Una vez seleccionado se deberá desbloquear y editar para guardar posteriormente sus datos a través del botón 'Grabar'.

Imagen: VisorArticulo1_PYME.png

Gadget Listado y búsqueda de artículos

  • Este gadget permite realizar búsquedas sobre los artículos de la base de datos.
  • El gadget está a la escucha de restricciones sobre los criterios de búsqueda. Estas restricciones pueden ser enviadas desde otros gadgets y pueden ser borradas a través del botón 'Borrar restricciones'.
  • El gadget puede filtrar los resultados de búsqueda a través de un campo de entrada. La modificación de ese campo provocará que se realice una búsqueda entre los campos más representativos de los artículos (dicha búsqueda podrá estar ya pre-filtrada a través de las restricciones anteriormente comentadas).
  • Los resultados de la búsqueda pueden ser navegados con el teclado a través del control de rejilla.
  • Los resultados de la búsqueda pueden ser paginados mediante un desplegable de forma que su navegación sea más sencilla.
  • La rejilla puede ser ordenada mediante un 'clic' en la cabecera de cualquiera de sus columnas.
  • Una vez encontrado el artículo adecuado, habrá que seleccionarlo y pulsar 'Intro' para que sus datos se envíen a los gadgets que estén suscritos.

Imagen: ListaArticulos1_PYME.png Imagen: ListaArticulos2_PYME.png Imagen: ListaArticulos3_PYME.png

Gadget Gestión de tickets

  • Este gadget permite realizar búsquedas sobre los tickets de la base de datos que estén marcados como 'No Finalizados'.
  • El gadget puede filtrar los resultados de búsqueda a través de un campo de entrada. La modificación de ese campo provocará que se realice una búsqueda entre los campos más representativos de los artículos.
  • Los resultados de la búsqueda pueden ser navegados con el teclado a través del control de rejilla.
  • Los resultados de la búsqueda pueden ser paginados mediante un desplegable de forma que su navegación sea más sencilla.
  • La rejilla puede ser ordenada mediante un 'clic' en la cabecera de cualquiera de sus columnas.
  • Una vez encontrado el ticket adecuado, habrá que seleccionarlo y pulsar 'Intro' para que sus datos se envíen a los gadgets que estén suscritos (por ejemplo el gadget de gestión de tickets).

Imagen: ListaTickets1_PYME.png Imagen: ListaTickets2_PYME.png

Gadget Lista de la compra

  • Este gadget permite gestionar los datos de los tickets, admitiendo operaciones de inserción y modificación.
  • El gadget está a la escucha de datos de tickets , de forma que pueda presentar los datos que se le envíen, como pudiesen ser los de un ticket seleccionado dentro del gadget de gestión de tickets.
  • El gadget permite la inserción de un ticket a través del boton 'Nuevo', que inicializa el gadget y desbloquea los campos para permitir la edición y guardar posteriormente sus datos a través del botón 'Fin Venta'.
  • Al finalizar un ticket este será anunciado para que otros gadgets, como el de gestión de cobros, puedan trabajar con él.
  • En cualquier momento se pueden utilizar los botones de 'Repetir Linea' y 'Eliminar Linea' para hacer más ágil la generación del ticket.
  • Para crear una nueva línea sólo habrá que introducir el número de unidades y el ean del producto.
  • Este gadget podría beneficiarse de la comunicación con hardware, por ejemplo conectándolo a un escáner de productos.

Imagen: ListaCompra1_PYME.png

Gadget Gestión de cobros

  • Este gadget permite finalizar un ticket.
  • El gadget está a la escucha de datos de un ticket, como pueden ser los que le envíe el gadget de gestión de cobros.
  • En el gadget habrá que introducir la cantidad que se desea pagar al contado y automtáticamente se inicializará la que haya que cobrar con tarjeta, introduciendo los cobros correspondientes en la base de datos al pulsar 'Listo' .

Imagen: GestionCobros1_PYME.png

Videos de los gadgets

Aquí se muestran videos de algunos de los gadgets en funcionamiento.


Referencias

  1. Google gadgets (http://www.google.com/webmasters/gadgets/)
  2. R. T. Fielding, Architectural styles and the design of network-based software architectures, Ph.D. thesis, University of California, Irvine, 2000
  3. CETIA4 ( https://cetia4.dev.java.net/)
  4. R. T. Fielding et al., Hypertext Transfer Protocol -- HTTP/1.1, RFC 2626, 1999
  5. Extensible Markup Language (XML) 1.1 (Second Edition) , E. Maler, C. M. Sperberg-McQueen, J. Cowan, J. Paoli, T. Bray, F. Yergeau, Editors, W3C Recommendation, 16 August 2006, http://www.w3.org/TR/2006/REC-xml11-20060816 . Latest version available at http://www.w3.org/TR/xml11/ .