Tesis Guevara
Tesis Guevara
Tesis Guevara
UNIVERSIDAD DE ORIENTE
NÚCLEO DE ANZOATEGUI
ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS
DEPARTAMENTO DE COMPUTACIÓN Y SISTEMAS
Presentado por:
Luis Carlos Guevara Franco
C. I.: 13.167.548
Barcelona, 2010
|
UNIVERSIDAD DE ORIENTE
NÚCLEO DE ANZOATEGUI
ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS
DEPARTAMENTO DE COMPUTACIÓN Y SISTEMAS
Asesor:
Barcelona, 2010
|
UNIVERSIDAD DE ORIENTE
NÚCLEO DE ANZOATEGUI
ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS
DEPARTAMENTO DE COMPUTACIÓN Y SISTEMAS
Jurado Calificador:
_____________________ ______________________
Ing. Mónica Saettone Ing. Gabriela Veracierta
(Jurado) (Jurado)
_______________________
Ing. Aquiles Torrealba
(Asesor Académico)
Barcelona, 2010
RESOLUCIÓN
iv
RESUMEN
v
DEDICATORIA
vi
AGRADECIMIENTO
Ante todo doy gracias a Dios Todopoderoso por darme la oportunidad de llegar
hasta este punto de mi existencia en que cumplo una meta tan importante como lo es
graduarme de Ingeniero en Computación.
Agradezco a mis padres por supuesto, por todo el apoyo y la confianza que han
tenido para conmigo, y su deseo de verme graduado lo más pronto posible. A mi
hermano, quien de alguna u otra forma siempre ha sabido estar presente en los
trabajos y asignaciones universitarias (como ésta ¡claro está!) que me ha tocado
realizar, a pesar de la distancia geográfica que nos separa.
Por último, pero no menos importante, agradezco a mis amigos (los que no
pertenecen a la universidad) y a mis compañeros de estudios universitarios, quienes
nos ayudamos entre sí, y que al igual que yo, espero pronto saber que finalizaron.
vii
ÍNDICE DE FIGURAS
viii
Figura 4.10. Diagrama de Secuencia del Caso de Uso “Registrar Presupuesto”¡Error!
Marcador no definido.
Figura 4.11. Diagrama de Secuencia del Caso de Uso “Consultar Facturas”.... ¡Error!
Marcador no definido.
Figura 4.12. Diagrama de Secuencia del Caso “Consultar Solicitudes de Repuestos”
.....................................................................................¡Error! Marcador no definido.
Figura 4.13. Modelo Estructural WebML del sistema.............................................. 140
Figura 4.14. Prototipo de interfaz “Principal Externa” o de “Inicio de Sesión”....... 147
Figura 4.15. Prototipo de interfaz “Principal para Usuarios del sistema” ................ 148
Figura 4.16. Modelo Relacional de la Base de Datos ............................................... 170
Figura 4.17. Nueva versión de la arquitectura de software candidata ...................... 173
Figura 4.18. Modelo de Navegación “Principal Externo” ........................................ 174
Figura 4.19. Modelo de Navegación “Principal para Empleados” ........................... 175
Figura 4.20. Modelo de Navegación “Principal para Clientes” ................................ 176
Figura 4.21. Diagrama de Composición del Caso de Uso “Iniciar Sesión Usuario” 179
Figura 4.22. Diagrama de Composición del Caso de Uso “Registrar Empresa” ...... 181
Figura 4.23. Diagrama de Composición del Caso de Uso “Consultar Empresa” ..... 183
Figura 4.24. Diagrama de Composición del Caso de Uso “Modificar Repuesto”.... 185
Figura 4.25. Diagrama de Composición del Caso de Uso “Dar de Baja Usuario” ... 189
Figura 4.26. Diagrama de Composición del Caso de Uso “Registrar Presupuesto”. 190
Figura 4.27. Diagrama de Composición del Caso de Uso “Consultar Facturas”...... 192
Figura 4.28. Diagrama de Composición del Caso “Consultar Solicitudes de
Repuestos” ................................................................................................................ 194
Figura 4.29. Diagrama de despliegue del sistema..................................................... 195
Figura 5.1. Interfaz “Principal Externa” o de “Inicio de Sesión” ............................. 194
Figura 5.2. Interfaz “Principal para Empleados de HIDROCONS” ......................... 195
Figura 5.3. Interfaz “Registrar Empresa” para Empleados de HIDROCONS.......... 196
Figura 5.4. Interfaz “Consultar Empresa” para Clientes de HIDROCONS.............. 197
Figura 5.5. Interfaz “Registrar Presupuesto” ............................................................ 198
ix
Figura 5.6. Interfaz “Consultar Presupuestos” para Clientes de HIDROCONS....... 199
x
ÍNDICE DE TABLAS
xi
Tabla 4.9. Tabla USUARIOS y sus respectivos campos .......................................... 150
Tabla 4.10. Tabla SESIONES y sus respectivos campos.......................................... 151
Tabla 4.11. Tabla COMENTARIOS y sus respectivos campos ............................... 152
Tabla 4.12. Tabla SERVICIOS y sus respectivos campos........................................ 153
Tabla 4.13. Tabla REPUESTOS y sus respectivos campos...................................... 155
Tabla 4.14. Tabla PRESUPUESTOS y sus respectivos campos .............................. 158
Tabla 4.15. Tabla DETALLES_PRESUPUESTO y sus respectivos campos .......... 159
Tabla 4.16. Tabla FACTURAS y sus respectivos campos ....................................... 160
Tabla 4.17. Tabla DETALLES_FACTURA y sus respectivos campos ................... 161
Tabla 4.18. Tabla SOLICITUDES_REPUESTOS y sus respectivos campos .......... 162
Tabla 4.19. Tabla REPUESTOS_SOLICITADOS y sus respectivos campos.......... 162
Tabla 5.1. Clases de Equivalencia generales presentes en el sistema....................... 230
Tabla 5.2. Caso de Prueba de Caja Negra “Iniciar Sesión Usuario”......................... 232
Tabla 5.3. Caso de Prueba de Caja Negra “Registrar Empresa”............................... 232
Tabla 5.4. Caso de Prueba de Caja Negra “Modificar Usuario”............................... 234
Tabla 5.5. Caso de Prueba de Caja Negra “Registrar Factura”................................. 235
Tabla 5.6. Caso de Prueba de Integración “Iniciar Sesión Usuario” ........................ 237
Tabla 5.7. Casos de Prueba de Integración “Registrar Empresa” y “Registrar Usuario”
................................................................................................................................... 238
Tabla 5.8. Caso de Prueba de Integración “Modificar Usuario”............................... 239
Tabla 5.9. Caso de Prueba de Integración “Registrar Factura”................................. 241
Tabla 5.10. Caso de Prueba de Integración “Cancelar Factura” ............................... 243
Tabla 5.11. Caso de Prueba de Integración “Registrar Solicitud de Repuestos”...... 244
Tabla 5.12. Caso de Prueba de Integración “Aceptar Presupuesto” ......................... 245
Tabla 6.1. Distribución de horas durante adiestramiento de usuarios de SIADCON
................................................................................................................................... 252
xii
CONTENIDO
RESOLUCIÓN ............................................................................................................ iv
RESUMEN.................................................................................................................... v
DEDICATORIA .......................................................................................................... vi
AGRADECIMIENTO ................................................................................................vii
ÍNDICE DE FIGURAS..............................................................................................viii
ÍNDICE DE TABLAS ................................................................................................. xi
CONTENIDO ............................................................................................................xiii
CAPÍTULO I............................................................................................................... 18
1.1 Reseña histórica de HIDROCONS, C. A.................................................... 18
1.2 Planteamiento del prob lema........................................................................... 19
1.3 Objetivos del proyecto .................................................................................... 22
1.3.1. Objetivo General: .................................................................................... 22
1.3.2. Objetivos Específicos:............................................................................. 23
CAPÍTULO II ............................................................................................................. 24
2.1 Antecedentes de la investigación ................................................................... 24
2.2. Ingeniería de software [12] ............................................................................ 27
2.2.1. Sistemas de Información [12] ................................................................. 28
2.2.2. Software [12]........................................................................................... 28
2.2.3. Diseño de Software [9] ........................................................................... 28
2.3. Fundamentos de pruebas de software [10]..................................................... 30
2.3.1. Prueba de Software de Caja Negra.......................................................... 30
2.3.2. Prueba de Software de Integración ......................................................... 30
2.4. Fundamentos de “RUP” [10] ......................................................................... 30
2.4.1. RUP (Rational Unified Process – Proceso Unificado Racional) ............ 30
xiii
2.4.2. Características de RUP............................................................................ 31
2.4.3. Elementos básicos de RUP ..................................................................... 33
2.5. Programación orientada a objetos .................................................................. 33
2.5.1. ¿Qué es la Programación Orientada a Objetos? [20] .............................. 33
2.5.2. Características de la Programación Orientada a Objetos [20] ................ 33
2.5.2.1. Encapsulación .................................................................................. 34
2.5.2.2. Jerarquía ........................................................................................... 34
2.5.2.3. Polimorfismo.................................................................................... 34
2.5.3. Clases y Objetos [20] .............................................................................. 34
2.5.4. Abstracción de Objetos [6] ..................................................................... 35
2.5.5. Ventajas de la Programación Orientada a Objetos en el Ciclo de Vida de
Desarrollo [20] .................................................................................................... 35
2.6. Fundamentos de “UML” ................................................................................ 36
2.6.1. UML (Unified Modeling Language – Lenguaje de Modelado Unificado)
[6] ........................................................................................................................ 36
2.6.2. Objetivos de UML [12]........................................................................... 36
2.6.3. Elementos de UML [17].......................................................................... 37
2.6.4. Diagramas de UML [21] ......................................................................... 37
2.6.4.1. Modelado Estructural [6] ................................................................. 38
2.6.4.2. Diagrama de Casos de Uso .............................................................. 39
2.6.4.3. Diagramas de Interacción [6] ........................................................... 39
2.6.5. Lenguajes de modelado [6] ..................................................................... 40
2.6.6. Análisis y Diseño de Sistemas Orientado a Objetos [6] ......................... 40
2.6.7. Interfaz de un objeto [6].......................................................................... 40
2.7. Fundamentos de diseño de bases de datos [7]................................................ 41
2.7.1. Modelo de Datos ..................................................................................... 41
2.7.2. Modelo de Datos Relacional ................................................................... 41
2.7.3. Bases de Datos (BDD) ............................................................................ 41
2.7.4. Diagrama Entidad – Relación ................................................................. 42
xiv
2.7.5. Atributos.................................................................................................. 42
2.7.6. Normalización de Base de Datos ............................................................ 42
2.7.7. RDBMS (Relational Data Base Management System)........................... 43
2.7.8. Pasos para el Diseño de una BDD........................................................... 43
2.7.9. Lenguaje De Consulta Estructurado (Structured Query Language - SQL)
............................................................................................................................. 44
2.7.9.1. Clasificación de los Lenguajes del SQL .......................................... 44
2.8. Fundamentos de “WebML” ........................................................................... 45
2.8.1. WebML (Web Modeling Language – Lenguaje de Modelado Web)
[5] ........................................................................................................................ 45
2.8.2. Modelo estructural [1][5] ........................................................................ 46
2.8.3. Modelo de Hipertexto [1][5] ................................................................... 46
2.8.3.1. Modelo de Composición o de Gestión de Contenido [5]................. 47
2.8.3.2. Modelo de Navegación [5]............................................................... 48
2.8.4. Modelo de Presentación [5] .................................................................... 48
2.8.5. Modelo de Personalización [5] ............................................................... 49
2.8.6. SiteViews ................................................................................................ 49
2.8.7. Unidades de contenido [18] .................................................................... 50
2.8.8. Estereotipos WebML [4]........................................................................... 50
2.9. Programación WEB ....................................................................................... 55
2.9.1. Introducción al Desarrollo de Aplicaciones Web [4]................................ 55
2.9.2. Aplicación Web [2] ................................................................................. 55
2.9.3. Programación Web Cliente / Servidor [4]............................................... 57
2.9.4. Sitio Web [4] ........................................................................................... 57
2.9.5. Interfaz Estática de Usuario [4] .............................................................. 58
2.9.6. Interfaz Dinámica de Usuario [4]............................................................ 58
2.9.7. HTML [2]................................................................................................ 58
2.9.7.1. Ventajas de HTML [2] ..................................................................... 60
2.9.8. Lenguaje Java [11] .................................................................................. 60
xv
2.10. Fundamentos técnicos de HIDROCONS, C. A. [13]................................... 61
2.10.1. Estación de Servicio (Establecimiento dispensador de combustible) ... 61
2.10.2. Dispensador o surtidor de Combustible ................................................ 61
2.10.3. Bomba Sumergible................................................................................ 62
2.10.4. Tanque de almacenamiento de combustible ......................................... 62
2.10.5. Combustible .......................................................................................... 63
2.10.6. Gasolina ................................................................................................ 63
2.10.7. Accesorios y repuestos para venta ........................................................ 63
CAPÍTULO III ............................................................................................................ 64
3.1. Descripción de la empresa .............................................................................. 64
3.1.1. Ubicación geográfica de la empresa ........................................................ 64
3.1.2. Naturaleza de la empresa ......................................................................... 64
3.1.3. Objetivos de la empresa ........................................................................... 64
3.1.4. Organigrama de la empresa..................................................................... 65
3.1.5. Misión de la empresa ............................................................................... 65
3.1.6. Visión de la empresa ................................................................................ 66
3.2. Introducción ................................................................................................... 66
3.3. Planificación de la fase de inicio.................................................................... 67
3.4. Análisis........................................................................................................... 70
3.4.1. Requisitos esenciales............................................................................... 70
3.4.2. Requisitos adicionales............................................................................. 71
3.4.3. Contexto del sistema ............................................................................... 72
3.4.4. Riesgos del sistema ................................................................................. 73
3.4.5. Actores del sistema .................................................................................. 76
3.4.6. Interacciones de los actores con el sistema (Casos de uso) ..................... 78
3.4.7. Modelo del dominio ................................................................................ 92
3.4.8. Arquitectura candidata del sistema ......................................................... 99
3.4.8.1. Arquitectura de software ................................................................... 99
3.4.8.2. Arquitectura de red y hardware...................................................... 102
xvi
3.5. Evaluación de la fase de inicio..................................................................... 104
CAPÍTULO IV.......................................................................................................... 126
4.1. Introducción ................................................................................................. 126
4.2. Planificación de la fase de elaboración ........................................................ 127
4.3. Requisitos..................................................................................................... 128
4.3.1. Modelos de casos de uso ....................................................................... 128
4.3.2. Actores, requisitos y arquitectura del sistema....................................... 133
4.3.3. Modelo de dominio o diagrama de clases ............................................. 133
4.4. Análisis......................................................................................................... 136
4.4.1. Diagramas de secuencia ........................................................................ 137
4.4.2. Diagramas WEBML ............................................................................. 138
4.4.2.1. Modelo estructural WEBML ......................................................... 138
4.4.2.2. Siteviews WEBML ........................................................................ 140
4.5. Diseño .......................................................................................................... 145
4.5.1. Prototipos de interfaces ......................................................................... 145
4.5.2. Diseño de la base de datos .................................................................... 148
4.5.3. Arquitectura de software ....................................................................... 170
4.5.3.1. Sistema de base de datos ................................................................ 171
4.5.3.2. Visión de la arquitectura J2EE....................................................... 171
4.5.3.3. Modelos de navegación WEBML.................................................. 173
4.5.3.4. Modelos de composición o de gestión de contenido WEBML..... 176
4.5.4. Arquitectura de red y hardware............................................................. 194
4.6. Evaluación de la fase de elaboración ........................................................... 195
CAPÍTULO V ........................................................................................................... 190
5.1. Introducción ................................................................................................. 190
5.2. Planificación de la fase de construcción ...................................................... 190
5.3. Diseño .......................................................................................................... 191
5.3.1. Herramientas de desarrollo empleadas.................................................. 192
5.4. Implementación............................................................................................ 193
xvii
5.4.1. Interfaces gráficas de usuario................................................................ 193
5.4.2. Código fuente ........................................................................................ 199
5.5. Pruebas ......................................................................................................... 229
5.5.1. Determinación de clases de equivalencia.............................................. 230
5.5.2. Casos de prueba de caja negra .............................................................. 231
5.5.3. Casos de prueba de integración............................................................. 237
5.6. Evaluación de la fase de construcción ......................................................... 246
CAPÍTULO VI.......................................................................................................... 248
6.1. Introducción ................................................................................................. 248
6.2. Planificación de la fase de transición [9] ..................................................... 249
6.3. Implementación............................................................................................ 250
6.3.1. Preparación de la versión beta .............................................................. 251
6.3.2. Instalación de la versión beta ................................................................ 251
6.4. Evaluación de la fase de transición .............................................................. 253
CONCLUSIONES .................................................................................................... 254
RECOMENDACIONES ........................................................................................... 256
BIBLIOGRAFÍA ...................................................................................................... 257
METADATOS PARA TRABAJOS DE GRADO, TESIS Y ASCENSO:............... 261
xviii
CAPÍTULO I
EL PROBLEMA
Cabe destacar que además, con la posible implantación de un sitio Web de tales
referencias se registraría el hecho de que la empresa en cuestión incurriría por
primera vez en el uso de la tecnología Web como medio informativo y publicitario, lo
cual constituye algo innovador para la misma en lo que a manejo de transacciones
comerciales electrónicas se refiere, mejorándose el rendimiento del personal
administrativo, e inclusive del personal técnico, al contar con un software para ser
dado a conocer y visitado a gran escala por su distinguida clientela a través de un
medio tan difundido y ampliamente en expansión como lo es Internet.
MARCO TEÓRICO
¾ Juan Carlos Tenias Belmonte. Elaboró el trabajo de grado que tiene por título
“Desarrollo de un software basado en Aplicaciones Web para el
Monitoreo de Dispositivos de la Plataforma de Telecomunicaciones de
PDVSA - GAS” (2007). Este trabajo fue presentado en la Universidad de
Oriente – Núcleo de Anzoátegui como requisito parcial para optar por el título
de Ingeniero en Computación. El desarrollo del sistema se llevó a cabo
mediante las fases del proceso unificado de desarrollo de software, y algunos
diagramas del Lenguaje de Modelado Unificado (UML). El sistema se
denominó SIMREDS (Sistema de Monitoreo de Redes y Servidores), y para el
cual se utilizó herramientas y lenguajes de software libre, tal como el lenguaje
de programación Web PHP sobre el sistema operativo LINUX, empleó el
protocolo de red SNMP y sistema manejador de base de datos MySQL. La
importancia del software radica en que permite a los usuarios determinar el
estado de los enlaces de servidores, detectar cuellos de botella y colapsos de
segmentos de red, así como fallas de equipos. [19]
Una vez que las diversas unidades del software ya fueron sometidas al proceso
de prueba de unidad, los defectos que aparecen durante el proceso habrán sido
eliminados y los errores corregidos. Ahora se debe ensamblar las diferentes unidades
en el sistema total. Este proceso de ensamblar las diferentes unidades en el sistema
completo se llama integración, y probar el sistema como la integración de varias
unidades se llama Prueba de Integración.
Define claramente quién es responsable de tal o cuál actividad, cómo y cuando deben
hacerse las cosas y describe una estructura bien definida para el ciclo de vida de un
proyecto, marcando claramente los puntos de decisión esenciales. RUP se basa en la
evolución de prototipos ejecutables o versiones finales que se mostrará a los usuarios;
de allí se refiere su naturaleza iterativa e incremental.
¾ Inicio: Se hace un plan de fases, se identifican los actores que harán uso del
futuro sistema, se determinan los principales casos de uso y se identifican los
riesgos.
32
Los seres humanos perciben el mundo como si estuviera formado por objetos:
mesas, sillas, computadoras, coches, cuentas bancarias, partidos de fútbol, etc.
También es un instinto humano intentar organizar estos objetos disponiéndolos de
una forma concreta, optando por destacar determinadas características de algunos
objetos que los destacan de otros. La programación orientada a objetos se puede
describir rápidamente como la identificación de objetos importantes, su organización
en jerarquías, la adición de atributos a los objetos que describen las características
relevantes en el contexto del problema y de la adición de las funciones (métodos) a
los objetos para realizar las tareas necesarias en el objeto.
2.5.2.1. Encapsulación
2.5.2.2. Jerarquía
Las dos jerarquías más importantes de un sistema complejo son las estructuras
de clases (generalización/especialización) y las estructuras de objetos (agregación).
Las jerarquías de generalización/especialización se conocen como herencia, y es la
propiedad que permite a un objeto transmitir sus propiedades a otros objetos
denominados descendientes. Esta propiedad permite la reutilización de objetos
previamente definidos. La agregación es el concepto que permite el agrupamiento
físico de estructuras relacionadas lógicamente.
2.5.2.3. Polimorfismo
hacia grandes sistemas, lo que significa que independientemente del tamaño del
sistema, el programador simplemente está creando objetos, que son las partes más
sencillas de todo sistema de este tipo. Por último, la posibilidad de ocultar datos
también genera sistemas más seguros, lo que conlleva a que el estado de los objetos
sólo se puede modificar mediante métodos expuestos públicamente; esto aumenta la
posibilidad de predecir el comportamiento del objeto.
Los objetivos de UML son muchos, pero se pueden sintetizar sus funciones en
estas principales:
Los diagramas de casos de uso describen cómo los usuarios interactúan con el
sistema a desarrollar. Representa una funcionalidad puntual del mismo, son la base
para el desarrollo del sistema entero, ya que son una forma de capturar los
requerimientos funcionales del sistema en cuestión.
En este modelo se representan una o más tablas que contienen los datos y las
relaciones entre los diferentes datos. Cada tabla posee las siguientes características:
una tabla es una colección de registros en una base de datos, dicha tabla tiene
múltiples columnas, cada columna tiene un nombre único y contiene conjuntos de
datos, cada conjunto de datos se denomina registro o fila.
Es una forma de modelar la relación existente entre los objetos del mundo real,
denominados entidades. Este modelo expresa entidades relevantes para un sistema de
información, así como sus interrelaciones y propiedades. Dicho modelo permite
tender un puente sobre la brecha que existe entre la representación del mundo real y
la manera como debe ser modelada en un sistema de computación.
2.7.5. Atributos
Todos los datos referentes a una entidad están contenidos en sus atributos. Un
atributo es la propiedad de la entidad, cuyo valor tiene que ser almacenado en la base
de datos. Cada instancia de una entidad tendrá el mismo conjunto de atributos, pero
pueden contener valores diferentes. Los atributos pueden ser simples, como la fecha
de nacimiento, o compuestos, como el nombre, conteniendo el primer y segundo
nombre. Puede ser de valor único como la fecha de nacimiento (cada persona, por
ejemplo, tiene solamente una fecha de nacimiento), o multivaluados, como las
calificaciones de una asignatura.
Los siguientes son los cuatro pasos esenciales del proceso de diseño de una base
de datos: a) Recolección y análisis de requerimientos, b) Diseño conceptual, c)
Diseño lógico y d) Diseño físico.
Para WebML este expresa el contenido de los datos del sitio Web, en términos
de las entidades existentes y las relaciones entre ellas. WebML no propone otro
lenguaje para el modelado de datos, sin embargo, es compatible con notaciones
clásicas como el modelo Entidad – Relación, el modelado orientado a objetos y los
diagramas de clase de UML. Para hacer frente al requisito de expresar la información
redundante y calculada, el modelo estructural también ofrece un simplificado
lenguaje de consulta, por el cual es posible especificar la información derivada de
dicha consulta. Los elementos del modelo estructural son: las entidades, los atributos
de estas entidades, las relaciones entre entidades y sus herencias.
Describe uno o más enlaces hipertextos que pueden ser publicados en el sitio
Web. Cada enlace hipertexto define una vista del sitio Web, y las descripciones de
las vistas del sitio Web consiste a su vez en dos sub-modelos: modelo de
composición y modelo de navegación. Los ingredientes claves del WebML están
constituidos por páginas, unidades y enlaces organizados en construcciones
modularizadas llamadas áreas y vistas del sitio. Las unidades son las piezas
atómicas de contenido publicable, que ofrecen formas alternativas de arreglar el
contenido dinámicamente extraído de las entidades y relaciones del esquema de
datos. Son los bloques de construcción de las páginas, que son la interfaz actual de
los elementos presentados al usuario. Las páginas son típicamente construidas
ensamblando varias unidades de muchos tipos, para mantener el efecto de
47
pueden ser utilizadas para conformar las páginas y los procesos que en ellas se llevan
a cabo: unidades de entrada de datos, unidades de consulta de datos, unidades de
multi-datos, unidades de índice, unidades de creación, modificación y eliminación de
datos, transacciones, unidades de desplazamiento entre datos, enlaces contextuales y
no contextuales, páginas web, siteviews o vistas, entre otros.
Expresa cómo las páginas, áreas y siteviews son enlazados para formar los
hipertextos o referencias cruzadas de textos hacia otros textos. Los enlaces son tanto
no contextuales: cuando conectan semánticamente páginas independientes (es decir,
no transportan datos de la página de origen a la página destino), como contextuales:
cuando el contenido de las unidades de destino del enlace depende del contenido de la
unidad de origen (por ejemplo, las páginas Web dinámicas, que extraen e ingresan
información de una base de datos). Estos últimos están basados en el esquema
estructurado, porque ellos conectan unidades de contenido cuyas entidades
subyacentes están asociadas por relaciones en el esquema estructurado.
2.8.6. SiteViews
- Enlace de
Transporte
¾ Servidor Web: Acepta las solicitudes por páginas Web hechas por el cliente
y las entrega, puede aceptar solicitudes por scripts en el lado del servidor que
generan páginas Web dinámicas, por ejemplo Scripts PHP.
IU Datos
RED
Cliente
Servidor
asociando el DNS ingresado con la dirección IP del servidor que contenga el sitio
Web en el cual está la página HTML buscada.
todos los exploradores Web alrededor de 1995 y fue la primera versión de HTML
ampliamente utilizado en el WWW. En 1994, se propuso HTML+ para ampliar el
HTML 2.0 pero nunca se implementó. HTML 3.0, que nunca se estandarizó ni fue
implementado totalmente por ningún desarrollador de exploradores Web, introdujo
las tablas. HTML 3.2, el último estándar propuesto, incorpora características
ampliamente implementadas en 1996. La mayoría de los exploradores, especialmente
Netscape Navigator, Mozilla e Internet Explorer, reconocen más etiquetas de HTML
que las incluidas en el estándar actual. HTML 4, la última especificación, soporta
hojas de estilo y lenguajes de script e incluye características de internacionalización y
de accesibilidad.
Una bomba sumergible es una bomba que tiene un motor sellado a la carcasa.
El conjunto se sumerge en el líquido a bombear. La ventaja de este tipo de bomba es
que puede proporcionar una fuerza de elevación significativa pues no depende de la
presión de aire externa para hacer ascender el líquido. Las bombas sumergibles
encuentran muchas utilidades: las bombas de etapa simple se utilizan para el drenaje,
el bombeo de aguas residuales, el bombeo industrial general y el bombeo de la
mezcla. Las bombas sumergibles se colocan habitualmente en la parte inferior de los
depósitos de combustible y también se utilizan para la extracción de agua desde
algunos pozos.
2.10.5. Combustible
2.10.6. Gasolina
FASE DE INICIO
Organigrama
Director Gerente
Administrador
Soldador
Plomero
Albañil
Trabajadores
3.2. Introducción
¾ ¿Es viable?
67
Entender lo que se desea alcanzar en esta fase ayudará a aplicar el enfoque RUP
a los proyectos con más eficacia. Se seleccionan y realizan solamente las actividades
que contribuyan a alcanzar los objetivos de un proyecto en particular. La meta más
importante de esta fase es alcanzar consenso de los objetivos del ciclo de vida del
68
proyecto entre todos los inversionistas y afectados por el desarrollo del proyecto. [9]
En otras palabras, la idea de esta fase es realmente entender el alcance del proyecto y
los objetivos, obtener suficiente información para confirmar qué se debería proceder
con el proyecto o tal vez concluir qué no se debería hacer en el desarrollo del mismo.
Esta fase tiene cuatro objetivos básicos, que son:
3.4. Análisis
¾ Permitir que los clientes puedan ver los presupuestos de algún trabajo a
realizarse en su Estación de Servicio o infraestructura en la comodidad de su
casa u oficina, para aprobarlos o rechazarlos en el menor tiempo posible.
¾ Todo esto enmarcado en una aplicación Web cuya interfaz sea amigable, clara
y sencilla, para que los usuarios puedan interactuar con la misma sin
complicaciones mayores.
¾ La empresa debe tener un servidor que procese las solicitudes de los usuarios
y maneje la base de datos, y así cubrir con las necesidades de funcionamiento.
72
¾ Es necesario contar con un sistema operativo para el equipo servidor tal como
Microsoft Windows XP o superior, o en su defecto, Linux en cualquiera de
sus versiones. Igualmente el software de navegación o programa visualizador
de Internet usado para interactuar con la aplicación puede ser Microsoft
Internet Explorer 6.0 o superior, e inclusive, Netscape Navegator o Mozilla.
Los actores del sistema son los sujetos o entidades las cuales interactúan con el
mismo, es decir, hacen uso de dicha aplicación. Constituyen un conjunto de
personas, sub-sistemas o sistemas adicionales que se relacionan con este. Tienen la
propiedad de ser externos a la aplicación en cuestión. Se debe tener en cuenta que un
usuario puede acceder al sistema como un actor en particular o inclusive, como
diversos actores, según sea el tipo de usuario con el cual esté registrado y de acuerdo
a los privilegios y permisologías que se le atribuyan. La representación gráfica de un
actor en los diferentes diagramas a los cuales se le hace alusión se denotará mediante
el dibujo de un monigote o muñeco.
dominio como uno de los artefactos que podrían crearse en la disciplina del modelado
del negocio. El diagrama de clase del dominio se elabora para establecer las
relaciones entre las clases del dominio, bien sea de dependencia, herencia, asociación,
agregación y composiciones que existen entre ellas. Este diagrama permite visualizar
el comportamiento general del sistema en función de los objetos del dominio. [15]
Una clase es el marco de trabajo para un conjunto de objetos. En un diagrama de
clases, según UML, el nombre de cada una de estas clases debe constar de una sola
palabra simple, que comience con letra mayúscula, y si el nombre está compuesto por
dos o más palabras, las mismas deben estar unidas comenzando cada una igualmente
en mayúscula. Lo importante es que los nombres estén contenidos dentro de una sola
palabra, sin espacios vacíos que los separen.
ocurre entre la clase Usuario y la clase Empleado por ejemplo, donde existe una
relación denominada “de Herencia”, debido a que la clase principal o superclase, la
cual es la señalada por la punta de la flecha (Usuario), le transfiere sus propiedades a
la subclase, que en este caso viene dada por la clase Empleado, indicada por el otro
extremo de la flecha. Esta relación es llamada también “es un tipo de”, por lo que se
lee de manera que “un Empleado es un tipo de Usuario”. Mientras tanto, entre la
clase Empresa y las clases Factura o Presupuesto existe una relación conocida como
relación “de Dependencia”, denotada mediante una línea o flecha abierta y punteada.
Dicha relación es sinónimo de que una clase determinada “utiliza” a otra clase
específica para que se realice o lleve a cabo una tarea en particular, en otras palabras,
que un elemento usa otro para que se realice una proceso específico, por lo que un
cambio en el elemento que se está usando, en este caso la Empresa (clase que es
apuntada por la flecha) afecta al elemento que lo usa (Factura o Presupuesto). Lo
inverso no necesariamente es cierto. De allí que un cambio en la interfaz de Empresa
(por ejemplo, cambio del nombre de la empresa) afectará a las otras dos clases, ya
que para que se genere una factura o presupuesto por ejemplo, estas requieren hacer
uso de este dato en cuestión.
La relación “de Asociación” es una relación que conecta dos clases, denotando
la conexión estructural entre ellas. La notación UML para una asociación es una
línea sólida que conecta las dos clases que participan en dicha conexión jugando un
rol específico. Dicha relación se pueden observar, por ejemplo, tanto entre las clases
Empresa y Usuario, así como entre las clases Usuario y la clase Cartero. En ambas
relaciones la “asociación” viene expresada mediante una línea sólida, acompañada de
un nombre que indica la relación y de las cantidades de objetos que pueden ser
conectados entre ellos, hecho conocido como cardinalidad o multiplicidad. Así por
ejemplo, las asociaciones descritas se leerían “una Empresa tiene inscrito ningún o
muchos Usuarios” y “un Usuario recibe ninguno o muchos Carteros”. De igual
modo, la relación “de Agregación”, también presente en este tipo de diagramas UML,
95
Clases del
Descripción
Dominio
Representa a cualquier compañía o
empresa (en su mayoría Estaciones de Servicio
Empresa dispensadoras de combustible) a la cual
HIDROCONS, C. A. está en capacidad de
ofrecer y prestar sus servicios.
Esta clase es la superclase de las clases
que representan los actores que normalmente
Usuario
harán uso del sistema en cuestión (Empleado,
Cliente y Cliente Prospecto).
Esta clase representa a los empleados y
Empleado directivos pertenecientes a la empresa
HIDROCONS HIDROCONS, C. A., es decir, todo aquel que
trabaja en dicha compañía.
Corresponde al otro grupo de usuarios
del sistema que trabajan o son representantes
Cliente HIDROCONS legales de las empresas inscritas a las cuales se
le venden repuestos o se les hace u ofrece
algún trabajo.
Constituye un representante autorizado
Cliente Prospecto de alguna empresa y potencial cliente a ser
registrado en el sistema.
Esta clase encierra los datos del
encabezado de los documentos denominados
“Presupuestos”, como su número de referencia,
Presupuesto
la fecha de emisión, el código del cliente al cual
va dirigido y la descripción de la obra a
ejecutar.
Esta clase posee los datos de cada uno
de los ítems o partidas propios de un
Detalle_Presupuesto
presupuesto, en donde se describe la
información del trabajo a efectuarse y se
98
Clases del
Descripción
Dominio
Do
Esta clase se encarga de enviar correo
electrónico automáticamente a los usuarios clientes
Cartero
registrados en el sistema, en los momentos que se
considere necesario.
Dicha clase registra la información de la fecha de
ingreso, la hora de entrada y salida de algún usuario
Sesión registrado al sistema, así como de las acciones
realizadas durante su estadía para efectos de
auditoría.
Dicha clase tiene que ver con todos los comentarios y
mensajes que algún usuario, esté registrado como
Comentario Cliente de HIDROCONS o no, envían al sistema para
que sea leído por cualquier Empleado de esta
empresa.
Esta es una clase auxiliar que contiene funciones útiles
comunes para varios casos de uso. No es necesario
mostrarla en el diagrama, ni instanciar esta clase para
Objeto
hacer uso de sus funciones ya que las mismas son de
Común
tipo “estático”, es decir, para usarlas sólo se menciona
esta clase en el caso de uso específico y se escoge la
función a utilizar.
SGBDD Representa la base de datos en la cual se
(Sistema registran, eliminan, modifican y consultan todos los
Gestionador de registros de las operaciones inherentes en el sistema.
99
Base de Datos)
Para la fase inicial, el flujo de trabajo de diseño es muy breve porque aún no se
poseen todos los detalles del complejo sistema que se construirá. Lo que se obtiene
de este flujo de trabajo es un bosquejo del modelo de diseño y una arquitectura inicial
estable.
Al final de esta fase se encuentra el primer y principal hito, meta u objetivo del
proyecto, llamado “Hito de Objetivos del Sistema”. En este punto se examinan,
como su nombre lo indica, los objetivos del ciclo de vida del proyecto, y de esa
manera se evalúa básicamente la viabilidad del proyecto. Fue un período breve en
cuanto a tiempo de realización, donde se hizo una sola iteración para lograr los
objetivos de la misma. En esta iteración se trabajaron y definieron los flujos de
requisitos, análisis de viabilidad y muy brevemente, el diseño. Al revisar este hito
aplicado a este proyecto en desarrollo se observaron ciertos criterios de evaluación,
arrojándose los siguientes resultados:
¾ Posteriormente se obtuvo un esbozo del sistema usando las clases hasta ahora
definidas y tablas de realizaciones de casos de uso, que guiaron al siguiente
paso: definir la arquitectura del sistema.
126
CAPÍTULO IV
FASE DE ELABORACIÓN
4.1. Introducción
los datos de manera que la redundancia de los mismos sea mínima. Considerando
que uno de los requisitos para este sistema es que sea una aplicación Web, se
seleccionó WebML, una herramienta novedosa que ofrece modelos para representar
sistemas basados en Web, y que integrando dicha herramienta con el proceso
unificado RUP, se obtendrá un buen soporte en la modelación e implementación del
área Web del proyecto. Estos modelos serán de gran ayuda al momento de describir
de manera sencilla el funcionamiento de las páginas Web del sistema, y los mismos
colaboran significativamente en el proceso de codificación de las páginas e interfaces
que se realizarán de forma definitiva en la fase siguiente a la presente.
4.3. Requisitos
Se debe recordar que existe un esquema gráfico del modelo de casos de uso que
es general y único, del cual se derivan, por limitaciones de tamaño, los demás casos
de uso de una manera más detallada y específica. Para esta sección de requisitos de la
actual fase de desarrollo de RUP se han de considerar los casos de uso conseguidos
previamente, pero obteniéndose un esquema general modificado, el cual se muestra
en la figura 4.1, en una versión mejorada, añadiéndole además los nuevos casos de
uso conseguidos en esta fase. Durante el nuevo estudio de requerimientos y de
necesidades del sistema propios de esta fase de elaboración se determinaron dos (2)
nuevos casos de uso generales: Administración de Repuestos (Véase Figura 4.2) y
Administración de Servicios (Véase Figura 4.3), sin olvidar todos los nuevos casos de
uso particulares y propios que se derivan de estos dos nuevos amplios casos.
130
inicio. Al igual que en los modelos de casos de uso obtenidos, también este diagrama
presenta nuevos elementos, constituidos por las clases que tienen que ver con los
repuestos y los servicios que la empresa ofrece a su clientela, las cuales se describen
en la tabla 4.1 que se muestra a continuación:
Clases del
Descripción
Dominio
Representa a todos los servicios y
actividades clasificadas, que puede ser inclusive
Servicio una obra ejecutada y facturada, que
HIDROCONS, C. A. pone a la disposición de sus
clientes.
Clase correspondiente a los repuestos o
equipos que pone en venta HIDROCONS o que
Repuesto
incluye como complemento de la mano de obra
en sus presupuestos o facturas.
Representa las solicitudes de repuestos,
conocidas también como cotizaciones, que los
Solicitud_Repuestos
clientes registrados hacen a la empresa
HIDROCONS, C. A.
Constituye cada uno de los repuestos
Repuesto_Solicitado que solicitó el cliente en una cotización o
solicitud de repuestos determinada.
Toda relación “de Asociación” tiene incluida una relación “de Agregación”, por
lo que en la nueva relación presente entre las clases Repuesto_Solicitado y
Solicitud_Repuestos impera una relación “de Agregación” de tipo compuesto,
denotada por el diamante relleno colocado cerca de la clase que representa el “todo”,
que sería Solicitud_Repuestos, lo que se refiere a que si es eliminado una solicitud de
repuestos automáticamente todos sus repuestos solicitados dejan de existir. Mientras
que la agregación entre las clases Repuesto y Detalle_Presupuesto o Detalle_Factura
es simple, indicada por un diamante vacío colocado cerca de la clase base Repuesto.
De este modo las relaciones indicadas se pueden leer “uno o muchos
Repuesto_Solicitado son parte de una Solicitud_Repuestos”, o en sentido inverso,
“una Solicitud_Repuestos tiene uno o varios Repuesto_Solicitado”. Igual ocurre
entre las otras clases mencionadas, donde la relación de agregación se leería “un
Repuesto es parte de ningún o de muchos Detalle_Presupuesto o Detalle_Factura”, o
lo que es igual, “un Detalle_Presupuesto o Detalle_Factura tiene ningún o varios
Repuestos”. En la figura 4.4 siguiente se muestra el diagrama de dominio definitivo:
136
dichos casos de uso se desarrollan otros diagramas vitales para la continuidad de este
proyecto, como son los diagramas de secuencia que muestran el comportamiento y
tiempo de vida de los objetos que interactúan en estos casos, y una introducción de
algunos modelos del lenguaje WebML, para reforzar los diagramas UML de
secuencia mencionados anteriormente, además de orientarlos a la navegabilidad de
las futuras páginas Web que se han de fabricar.
demás datos presentes en la base de datos propios de dicho usuario (Cédula del
usuario, nombres, apellidos, cargo, teléfonos, correo electrónico, etc.).
Posteriormente el sistema crea un objeto SESIÓN y el objeto USUARIO le envía un
mensaje de “Iniciar Sesión” junto con el código del usuario extraído de la consulta
realizada a comienzos de este caso de uso; este último objeto a su vez le envía al
objeto SGBDD previamente creado la orden de “Registrar Datos”, acompañado de
los datos de sesión a ingresar (Código de la nueva sesión, código del usuario que
ingresa, fecha y hora de ingreso del mismo, estos últimos datos tomados directamente
del sistema operativo obviamente).
Figura 4.5. Diagrama de Secuencia del Caso de Uso “Iniciar Sesión Usuario”
Fuente: Propia, 2009
Luego el sistema crea un objeto SGBDD (el cual se encarga de gestionar todo
lo referente a transacciones que tienen que ver con la Base de Datos del sistema)
quien recibe de parte del objeto EMPRESA el mensaje “Consultar Datos”, para que
este realice la consulta en la BDD con el Código de Usuario que es facilitado
143
igualmente por parte del objeto USUARIO. Después, el objeto SGBDD le devuelve
como respuesta al objeto EMPRESA los datos de la empresa a la cual pertenece el
Cliente que hace la solicitud (Código de la empresa, nombre, RIF y NIT de la misma,
dirección completa y teléfonos registrados para su ubicación, así como su correo
electrónico), para luego ser destruido por el sistema. Este objeto EMPRESA a su vez
le devuelve toda esta información recibida del objeto SGBDD al objeto USUARIO
antes de ser igualmente destruido. Finalmente el objeto USUARIO muestra este
conjunto de datos obtenidos al Cliente en su función de actor del sistema, para ser
posteriormente destruido.
SGBDD, que haciendo uso del Código de Usuario que acompaña dicho
mensaje, modifica la situación del usuario a No Conectado, regresando al
objeto USUARIO el mensaje de “Usuario Desconectado”.
transacción realizada por el usuario. Para ello el sistema crea un objeto SESIÓN,
quien recibe de parte del objeto PRESUPUESTO la orden “Modificar Sesión”
acompañado del código de sesión asignado al usuario al momento de entrar en el
sistema. Con este código el objeto SESIÓN envía el mensaje “Modificar Datos” al
objeto SGBDD para que actualice el registro de dicha sesión, anexándole un
comentario de este proceso llevado a cabo. Una vez hecho esto el objeto SGBDD es
destruido por el sistema, el objeto SESIÓN le envía un mensaje de éxito al objeto
PRESUPUESTO, el cual se lo devuelve también al objeto USUARIO y este le indica
lo mismo al Empleado, para que finalmente los objetos SESIÓN, PRESUPUESTO y
USUARIO también sean destruidos por el sistema.
Ahora se procede a extraer los datos de los ítems o renglones que conforman el
cuerpo de la factura. El sistema crea un objeto denominado DETALLE_FACTURA
y el objeto FACTURA le envía el mensaje “Consultar Detalles de Factura” junto con
el código de la factura. Este objeto a su vez se autoenvía el mensaje “Consultar
Detalle de Factura”, es decir, un solo ítem a la vez, acompañado del código de factura
recibido. Posteriormente el objeto DETALLE_FACTURA le envía dicho código al
objeto SGBDD mediante el mensaje “Consultar Datos”, quien le devuelve a su vez
los datos del ítem esperado (cantidad, descripción, presentación o medida, formato y
precio unitario). Este mensaje igualmente es reenviado al mismo objeto
131
Ahora se procede a extraer los datos de los ítems o renglones que conforman
el cuerpo de la solicitud. El sistema crea un objeto denominado
REPUESTO_SOLICITADO y el objeto SOLICITUD_REPUESTOS le envía el
mensaje “Consultar Repuestos Solicitados” junto con el código de la solicitud. Este
objeto a su vez se envía el mensaje “Consultar Repuesto Solicitado”, es decir, un solo
137
Presupuestos ¾ Administrar
¾ Administrar Servicios Facturas
¾ Administrar
Repuestos
Tabla 4.5. Mapa del SiteView Privado “Principal para Empleados de HIDROCONS”
Nombre del
Descripción del área
Área
Se ingresan compañías al sistema, se consultan,
Empresas modifican y dan de baja a las ya registradas, y se ven
las solicitudes de afiliación.
Permite anexar un representante a una
empresa registrada, anexar otro empleado, cambiar
Usuarios
sus claves personales, consultar los clientes, consultar
sus comentarios y visitas o sesiones.
Permite manejar los datos que corresponden a
los presupuestos elaborados, tanto al registrar uno
nuevo, como consultar, modificar (eliminar o anexar
Presupuestos
ítems del presupuesto, cambiar datos del encabezado
del mismo) y anular y dar por ejecutados los ya
ingresados.
Permite manejar los datos correspondientes a
las facturas elaboradas, tanto al registrar una nueva
factura, como consultar, modificar (eliminar o anexar
Facturas
ítems de la factura, cambiar datos del encabezado de
la misma), dar por canceladas o pagadas y anular
alguna ya ingresada.
Permite registrar, consultar, modificar y eliminar
datos relacionados con los servicios y actividades que
Servicios
presta u ofrece la empresa HIDROCONS, C. A. a las
empresas clientes.
Permite gestionar los procesos relacionados con
lo que tiene que ver con repuestos que HIDROCONS,
Repuestos
C. A. tiene a la venta, como registrar, consultar,
modificar y eliminar dichos repuestos.
Módulo de ayuda al servicio del empleado, en
Ayuda caso de que este tenga alguna duda acerca del uso de
algún proceso del sistema.
4.5. Diseño
estos esquemas una vez se hayan descritos todos los casos de uso del sistema, en otras
palabras, que se hayan definido la mayoría de los requerimientos, los usuarios que
interactuarán con el sistema y la forma en que interactuarán con el mismo,
respectivamente.
servicio. Representa un
resumen o título del
mismo.
Descripción del servicio o
actividad que se presta.
DescripcnServicio Texto(1200) Es un poco más detallada,
específica y extensa que
el campo anterior.
Tabla 4.12. Tabla SERVICIOS y sus respectivos campos (Continuación)
marcas de los
dispensadores para
los cuales están
diseñados estos
repuestos, tales como
WAYNE, GILBARCO
H-111 y LEGACY.
• OTROS: se
refiere los repuestos
que no entran en
ninguno de los tipos
de repuestos
descritos
anteriormente. Sus
opciones son
CONSUMIBLE,
ELECTRICIDAD,
PLOMERÍA, SISTEMA
CONTRA INCENDIO y
OTROS.
Descripción
DescripcDetallPres Texto(1500) propia y completa del
ítem del presupuesto.
Cantidad de
unidades del ítem en
cuestión. Si la
CantidDetallePres Flotante medida del ítem es
“PG”, este campo
toma el valor de uno
(1).
Precio unitario
asignado al ítem o
PrecioDetallePres Flotante
renglón del
presupuesto.
Indica la
presentación y
formato del ítem.
FormatoDetallePres Texto(10)
Sus valores son:
NORMAL, NEGRITA y
CURSIVA.
registrarse.
Lugar de emisión
LugarFactura Texto(35)
de la factura.
Fecha de
FechaFactura Texto(10)
elaboración de la factura.
Tabla 4.16. Tabla FACTURAS y sus respectivos campos (Continuación)
donde cada uno de ellos emplea la sentencia “CREATE TABLE” seguido del nombre
de la tabla a crear, acompañado por sus respectivos campos en orden de aparición y
colocación dentro de la tabla, así como el tipo de dato que impera en ese campo, bien
sea cadena de caracteres corta (CHAR), cadena de caracteres larga (VARCHAR),
incluyendo la longitud de cada uno de ellos, y punto flotante (FLOAT) entre otros
tipos de datos. También se indica cuales campos representan tanto clave primaria
(PRIMARY KEY) como claves foráneas (FOREIGN KEY) en la tabla.
, CorreoUsuario CHAR(50)
, UsernameUsuario CHAR(20)
, ClaveUsuario CHAR(20)
, TipoUsuario CHAR(12)
, SituacionUsuario CHAR(10)
, EstaConectado CHAR(5)
, PRIMARY KEY (CodUsuario)
, FOREIGN KEY (CodEmpresa) REFERENCES H.EMPRESAS (CodEmpresa));
• Lógica del Negocio: maneja las reglas, políticas y procesos del negocio al
cual es destinado esta aplicación en cuestión. Permite que el sistema
automatizado refleje y asemeje el comportamiento de los procesos
administrativos de la empresa HIDROCONS, C. A. Esta capa posee todas
las clases descritas previamente y que interactúan en el software.
• Servicios de Infraestructura: proporciona funcionalidades adicionales
requeridas por los componentes de la aplicación, como mensajería y
transacciones.
esté Activo y no esté conectado. Esto es llevado a cabo utilizando una unidad
de consulta sencilla o simple encargada de buscar dichos datos en la tabla
USUARIOS. En caso de que no se cumpla alguna de estas condiciones se
muestra un mensaje de rechazo y se vuelve a mostrar la interfaz externa. De
lo contrario, si cumple todos los requisitos y es un usuario registrado y
autentificado, automáticamente se le abrirán las puertas e ingresará al sistema
para iniciar una sesión.
Figura 4.21. Diagrama de Composición del Caso de Uso “Iniciar Sesión Usuario”
Fuente: Propia, 2009
Todo actor del sistema que actúe como cliente de HIDROCONS está asociado
obligatoriamente con alguna empresa en particular, de allí que no es posible el caso
de que no exista la empresa a la cual pertenece el cliente. Posteriormente, después de
conseguida la empresa en cuestión, el sistema devuelve todos los datos de dicha
empresa extraídos de la base de datos y los coloca en los campos respectivos de un
formulario adaptado para ello de la nueva interfaz de consulta de empresa, los cuales
son finalmente visualizados por el Cliente solicitante. En caso de que ocurriese algún
error o inconveniente durante la consulta de estos datos, se mostrará al usuario el
mensaje respectivo, indicando tal anomalía.
183
repuesto con código distinto al del repuesto recién modificado pero con igual
nombre de repuesto. De ser así se observa el mensaje de duplicación de
repuestos (el repuesto ya existe). Esto con la finalidad de evitar que se use
nuevamente el nombre de un equipo ya utilizado previamente y que genere
confusiones a los usuarios al momento de hacer uso de ellos. De lo contrario
una unidad de modificación de datos recibe los datos substitutivos, y dicha
unidad se encarga de realizar el cambio de la información en la tabla
REPUESTOS de la base de datos, para luego devolverlos a la interfaz del
sistema y ser colocados nuevamente en sus campos respectivos.
Figura 4.25. Diagrama de Composición del Caso de Uso “Dar de Baja Usuario”
Fuente: Propia, 2009
190
SERVIDOR
CLIENTES
Sistema
SIADCON
Internet Interfaz
SIADCON
Servidor 1 *
WebSphere
Navegador
Web
BDD
IBM DB2
¾ Son aceptables los gastos actuales de recursos versus los gastos planeados con
anterioridad.
¾ Se logró hacer un diseño efectivo de las páginas Web que conformarán el
sistema mediante el uso del modelo Estructural y los modelos de Navegación
de WebML.
FASE DE CONSTRUCCIÓN
5.1. Introducción
5.3. Diseño
Para la fase de construcción del desarrollo del proyecto se salta toda etapa de
análisis para pasar directamente a una etapa de diseño, ya que se procede a la
construcción de la aplicación en sí. Por otra parte, en esta etapa de la construcción ya
se habla de manera más formal de las herramientas a emplear para el desarrollo y
construcción de la aplicación como tal.
192
Para el diseño del software se hizo uso de las siguientes herramientas. Cada
una contribuye al buen desempeño del proyecto en cuestión, y son piezas
fundamentales para el correcto funcionamiento del mismo. Entre ellas se encuentran:
5.4. Implementación
Las páginas Web que han sido mostradas se deben implementar en código
fuente. Para la codificación de las páginas se usará el lenguaje de programación Java
a través del ambiente de desarrollo que ofrece el Software de computación
distribuida IBM RATIONAL 6.0. Las operaciones de base datos serán gestionadas
por el Sistema Manejador de Base de Datos Relacionales IBM DB2 Versión 9. La
integración de todos estos elementos formará la arquitectura de trabajo estable que se
diseñó en la fase de Elaboración de RUP.
para el procesamiento de datos y las interacciones entre todos los objetos codificados
que intervienen en este caso de uso.
JavaScript.js
/********************************************************************
*Esta función cuenta el número de caracteres que ingresan en un cuadro de texto*
*determinado y acepta una cantidad de caracteres hasta un máximo permitido,*
*indicado por una variable recibida como argumento. Si se ingresa uno o varios*
*caracteres más de lo permitido, los mismos desaparecen. Recibe de argumentos*
*el texto completo (objeto) y la cantidad permitida de caracteres (cantidad). *
********************************************************************/
function contarCaracteres(objeto, cantidad)
{var q = objeto.value;
a = q.length;
if (a == cantidad-1)
valor_listo = q;
if (a > cantidad-1)
objeto.value = valor_listo;
}
/********************************************************************
*Se pregunta al usuario si efectivamente desea salir de alguna sección determinada*
de la aplición. No recibe argumento alguno, mientras que devuelve una valiable*
booleana cuyo valor depende de la opción del usuario al confirmar la orden de salida*
********************************************************************/
function permisoSalirSeccion()
{var resp = false;
if(confirm('¿Desea salir de esta sección?\nPerderá todos los datos ingresados en
esta vista'))
resp = true;
return resp;
}
/********************************************************************
*Esta función permite que al seleccionar una foto de un servicio, automáticamente*
*se visualize la imagen y se escriba el URL de dicha foto en un cuadro de texto*
*determinado. Recibe como argumentos el documento o página Web completo, el*
*valor del URL de la foto y el lugar o posición de la foto seleccionada *
********************************************************************/
202
imagen[puesto].src = valor.toString();
direccion[puesto].value = valor;
comentario[puesto].focus();
}
/********************************************************************
*Limpia todo rastro de alguna foto de servicio seleccionada previamente, tanto en la*
*imagen como en el cuadro de texto del URL. Recibe como argumentos el*
*documento Web y la posición de la imagen a limpiar o borrar *
********************************************************************/
function borrarFotoServ(doc, lugar)
{var imagen = doc.getElementsByName("ImgRepuesto");
var direccion = doc.getElementsByName("TxtFileFoto");
var comentario = doc.getElementsByName("txtComentario");
imagen[lugar].src = 'imagenes/Servicios/ImagenNoDisponible.jpg';
direccion[lugar].value = "";
comentario[lugar].value = "";
}
/********************************************************************
*Verifica que todos los campos que reciben los datos respectivos a un servicio*
*específico (enunciado del servicio, descripción del mismo, sus fotos, etc.) estén*
*completa y adecuadamente llenos. Recibe como argumentos el documento y el*
*formulario Web, mientras que devuelve un mensaje en caso de faltar algún dato *
********************************************************************/
function validarServicioServ(doc, formul)
{var direccion = doc.getElementsByName("TxtFileFoto");
var comentario = doc.getElementsByName("txtComentario");
var resp = false, entro = true, existe = false;
if(formul.cmbPresupuestos.selectedIndex != 0)
if(formul.txtEnunciado.value.length != 0 &&
!/^\s+$/.test(formul.txtEnunciado.value))
if(formul.txtDescripcion.value.length != 0 &&
!/^\s+$/.test(formul.txtDescripcion.value))
if(entro)
if(existe)
{if(confirm('¿Los datos ingresados son los correctos?'))
resp = true;
}
else
{alert('Ingrese al menos una foto que refleje el servicio en cuestión');
direccion[0].focus();
}
else
{alert('Ingrese el comentario de la foto N°. ' + (i + 1));
comentario[i].focus();
}
else
{alert('Ingrese una descripción completa y detallada del servicio');
formul.txtDescripcion.focus();
}
else
{alert('Ingrese un encabezado o enunciado del servicio');
formul.txtEnunciado.focus();
}
else
{alert('Seleccione un código de presupuesto');
formul.cmbPresupuestos.focus();
}
return resp;
}
TodosEstilos.css
/********************************************************************
*Este estilo es asignado a ciertos botones de formulario Web, de modo que el título*
*de los mismos sean de ocho (8) pixeles, esté alineado verticalmente en la mitad,*
*posea un color de código específico y el tipo de letra sea uno de los indicados *
********************************************************************/
.boton8
{FONT-SIZE: 8px; VERTICAL-ALIGN: middle;
204
COLOR: #663333;
FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
/********************************************************************
*Este estilo es asignado a ciertos botones de formulario Web, de modo que el título*
*de los mismos sean de doce (12) pixeles, esté alineado verticalmente en la mitad,*
*posea un color de código específico y el tipo de letra sea uno de los mencionados *
********************************************************************/
.boton12
{FONT-WEIGHT: bold; FONT-SIZE: 12px;
VERTICAL-ALIGN: middle; COLOR: #663333;
FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
/********************************************************************
*Estilo que se le asigna a determinadas celdas de algunas tablas Web. Las letras de*
*dicha celda son gruesas y de 10 pixeles, la alineación de la misma es centrada *
********************************************************************/
.celdaGrizCent10b
{FONT-SIZE: 10px; FONT-FAMILY: Verdana, Arial;
TEXT-ALIGN: center; BACKGROUND: #D7D7D2;
COLOR: #663333; FONT-WEIGHT: bold
}
/********************************************************************
*Estilo que se le asigna a determinadas celdas de algunas tablas Web. Las letras de*
*dicha celda son de doce (12) pixeles, la alineación de la misma es centrada, un*
*color de fondo indicado, así como tipo y color de letras según las opciones vistas *
********************************************************************/
.celdaGrizCent12
{FONT-SIZE: 12px; FONT-FAMILY: Verdana, Arial;
TEXT-ALIGN: center; BACKGROUND: #D7D7D2;
COLOR: #663333
}
/********************************************************************
*Estilo que se le asigna a determinadas celdas de algunas tablas Web. Las letras de*
*dicha celda son gruesas y de 10 pixeles, la alineación de la misma es a la izquierda *
********************************************************************/
.celdaGrizIzq10
{FONT-SIZE: 10px; FONT-FAMILY: Verdana, Arial;
TEXT-ALIGN: left; BACKGROUND: #D7D7D2;
COLOR: #663333
205
/********************************************************************
*Estilo que se le asigna a ciertos cuadros de texto. Especifica los colores de borde,*
*la alineación de su contenido y características de las letras que ingresan al cuadro *
********************************************************************/
.textboxIzq11
{BORDER-RIGHT: #663333 1px solid; BORDER-TOP: #663333 1px solid;
FONT-WEIGHT: bold; FONT-SIZE: 11px;
BORDER-LEFT: #663333 1px solid; COLOR: #663333;
BORDER-BOTTOM: #663333 1px solid; TEXT-DECORATION: none;
FONT-FAMILY: Times-New-Roman, Arial, Helvetica, sans-serif;
TEXT-ALIGN: left
}
/********************************************************************
*Estilo que se le asigna a ciertos cuadros de texto. Especifica los colores de borde,*
*la alineación de su contenido y características de las letras que ingresan al cuadro *
********************************************************************/
.textoCent14b
{TEXT-ALIGN: center; FONT-SIZE: 14px;
FONT-WEIGHT: bold; FONT-FAMILY: Verdana, Arial;
COLOR: #663333
}
/********************************************************************
*Estilo que se le asigna a ciertos cuadros de texto. Especifica los colores de borde,*
*la alineación de su contenido y características de las letras que ingresan al cuadro *
********************************************************************/
.textoIzq12
{FONT-SIZE: 12px; FONT-FAMILY: Verdana, Arial;
TEXT-ALIGN: left; COLOR: #663333
}
/********************************************************************
*Estilo que se le asigna a ciertos cuadros de texto. Especifica los colores de borde,*
*la alineación de su contenido y características de las letras que ingresan al cuadro,*
*como letra gruesa, de un color y tipo específico y con un tamaño de 12 pixeles *
********************************************************************/
.textoIzq12b
{FONT-SIZE: 12px; FONT-FAMILY: Verdana, Arial;
TEXT-ALIGN: left; FONT-WEIGHT: bold;
COLOR: #663333
}
206
SGBDD.java
package modelo;
/********************************************************************
*Las siguientes son las librerías que se importan o incluyen para que esta clase o*
*función se lleve a cabo con total normalidad y sin inconvenientes *
********************************************************************/
import javax.naming.*;
import java.io.Serializable;
import java.sql.*;
import javax.sql.DataSource;
import javax.swing.JOptionPane;
/********************************************************************
*Esta función representa la clase SGBDD, la cual es pública, implementa la interfaz*
*“Serializable” y presenta atributos privados para otras clase. Dicha clase se refiere *
*a ciertos objetos que sirven para la conexión con la Base de Datos *
********************************************************************/
public class SGBDD implements Serializable
{private DataSource ds = null;
private ResultSet rs = null;
private Connection con = null;
/********************************************************************
*Esta función representa el constructor de la clase SGBDD. La sección “try” evalúa*
*si alguna de sus sentencias genera algún error y “catch”, qué hacer en dicho error *
********************************************************************/
public SGBDD()
{super();
try
{InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/BaseDeDatos");
}
catch (NamingException e)
{JOptionPane.showMessageDialog(null, "ERROR EN LA CONEXIÓN A
LA BASE DE DATOS", "ERROR", JOptionPane.WARNING_MESSAGE);
}
}
/********************************************************************
*Función pública que no recibe argumento alguno, mas devuelve un objeto de tipo*
*RestultSes, es decir, el resultado de una consulta a la base de datos del sistema *
207
********************************************************************/
public ResultSet getRs()
{return rs;
}
/********************************************************************
*Función pública re recibe una cadena de caracteres con una sentencia SQL (varsql)*
*la cual permite el registro de algunos datos en la BDD, y un mensaje (mensaje) que*
*señala el éxito de tal acción. También se vé secciones “try” y “catch” *
********************************************************************/
public void RegistrarDatos(String varsql, String mensaje)
{try
{con = ds.getConnection("db2admin", "db2admin");
Statement stm = con.createStatement();
boolean flag = stm.execute(varsql);
if(!mensaje.equalsIgnoreCase(""))
JOptionPane.showMessageDialog(null, mensaje, "REGISTRO DE
DATOS", JOptionPane.WARNING_MESSAGE);
}
catch (SQLException e)
{JOptionPane.showMessageDialog(null, "ERROR EN EL REGISTRO DE
DATOS", "ERROR", JOptionPane.WARNING_MESSAGE);
}
finally
{if(con != null)
{try
{con.close();
}
catch (SQLException e1)
{JOptionPane.showMessageDialog(null, "NO SE CERRÓ
CORRECTAMENTE LA BASE DE DATOS", "ERROR",
JOptionPane.WARNING_MESSAGE);
}
}
}
/********************************************************************
*Esta función pública recibe una sentencia SQL que consulta ciertos datos propios*
*la base de datos. La sección “try” presenta setencias que permiten la conexión con*
*la BDD, y si alguna de éstas genera cierta excepción, el “catch” indica que hacer *
********************************************************************/
public void ConsultarDatos(String varsql)
208
{boolean flag;
try
{con = ds.getConnection("db2admin", "db2admin");
Statement stm = con.createStatement();
flag = stm.execute(varsql);
if(flag)
rs = stm.getResultSet();
}
catch (SQLException e)
{JOptionPane.showMessageDialog(null, "ERROR EN LA CONSULTA DE
DATOS", "ERROR", JOptionPane.WARNING_MESSAGE);
}
}
/********************************************************************
*Esta función pública recibe una sentencia SQL que consulta en la base de datos*
*todos los registros presentes en cualquier tabla, de manera que con la sentencia*
*“while” presente en esta función se cuente la cantidad de registros devueltos y así *
*determinar el código del próximo registro a ingresar *
********************************************************************/
public int DeterminarCodigo(String sqlvar)
{boolean flag;
int cantidades = 0;
/********************************************************************
*La sección “try” presenta setencias que permiten la conexión con la BDD, con la*
*finalidad de hacer una consulta determinada, y si alguna de estas sentencias genera*
*cierta excepción, el “catch” indica que hacer en dicho caso *
********************************************************************/
try
{con = ds.getConnection("db2admin", "db2admin");
Statement stm = con.createStatement();
flag = stm.execute(sqlvar);
if(flag)
{rs = stm.getResultSet();
while(rs.next())
{cantidades++;
}
}
}
catch (SQLException e)
{JOptionPane.showMessageDialog(null, "ERROR AL CONSULTAR LOS
209
/********************************************************************
*Esta función pública presente en la clase SGBDD no recibe argumentos alguno ni*
*devulve algún valor. La misma tiene la función de cerrar la conexión con la BDD*
*Si ocurre un error en la zona del “try”, muestra el mensaje de la zona del “catch”*
********************************************************************/
public void CerrarBDD()
{if(con != null)
{try
{con.close();
System.out.println("SE CERRO LA BASE DE DATOS");
}
catch (SQLException e1)
{JOptionPane.showMessageDialog(null, "NO SE CERRÓ
CORRECTAMENTE LA BASE DE DATOS", "ERROR",
JOptionPane.WARNING_MESSAGE);
}
}
}
}
ObjetoComun.java
package modelo;
/********************************************************************
*Librería que es importada por esta clase o archivo para su normal funcionamiento *
********************************************************************/
import java.text.DecimalFormat;
/********************************************************************
*Clase pública que contiene ciertas funciones Java comunes para otras clases, de*
*manera que puedan ser solicitadas en cualquier instante que se necesite *
********************************************************************/
public class ObjetoComun
{public ObjetoComun()
{super();
}
/********************************************************************
*Esta función altera el orden de colocación de los caracteres de un dato tipo “fecha”,*
*de manera que en la interfaz de usuario se muestre ordenada, y en la BDD, al revés *
210
********************************************************************/
public static String cambioFechas(String fecha)
{String nuevaFecha[] = null;
if(fecha.length() > 0)
{nuevaFecha = fecha.split("/");
nuevaFecha[2] += "/" + nuevaFecha[1];
nuevaFecha[2] += "/" + nuevaFecha[0];
return nuevaFecha[2];
}
else
return fecha;
}
/********************************************************************
*Esta función determina la longitud del argumento recibido (valor), y de acuerdo a*
*dicha longitud, se le anexa ceros a dicha variable para completar seis dígitos. Al *
*final devuelve la misma variable recibida (valor) pero modificada *
********************************************************************/
public static String codigos(String valor)
{switch(valor.length())
{case 1: valor = "00000" + valor; break;
case 2: valor = "0000" + valor; break;
case 3: valor = "000" + valor; break;
case 4: valor = "00" + valor; break;
case 5: valor = "0" + valor;
}
return valor;
}
}
Usuario.java
package modelo;
/********************************************************************
*Librerías que son importadas por esta clase o archivo para su normal desempeño *
********************************************************************/
import java.io.Serializable;
import java.sql.SQLException;
import java.util.Date;
import java.util.Random;
/********************************************************************
211
*Esta es una clase pública que implementa la interfaz “Serializable”, que comienza*
*con el conjunto de variables protegidas, ya que de esta se derivan otras clases, son*
*heredadas por las clases que extienden de esta, de allí su carácter protegido *
********************************************************************/
public class Usuario implements Serializable
{protected String CodUsuario;
protected String CodEmpresa;
protected String DireccionUsuario;
protected String CedulaUsuario;
protected String NombresUsuario;
protected String ApellidosUsuario;
protected String FechaRegistroUsuario;
protected String CodTlfUsuario1;
protected String TelefonoUsuario1;
protected String CodTlfUsuario2;
protected String TelefonoUsuario2;
protected String LoginUsuario;
protected String ClaveUsuario;
protected String CargoUsuario;
protected String CorreoUsuario;
protected String TipoUsuario;
protected String SituacionUsuario;
protected String CodVisita;
protected boolean EstaConectado;
/********************************************************************
*Esta función pública representa el constructor de la clase Usuario, no recibe algún*
*argumento, tampoco devuelve resultado alguno, y se inicializan los valores de los*
*diversos atributos mencionados en la sección anterior, con un valor acoorde con su*
*tipo de variable asignado *
********************************************************************/
public Usuario()
{super();
CodUsuario = "";
CodEmpresa = "";
DireccionUsuario = "";
CedulaUsuario = "";
NombresUsuario = "";
ApellidosUsuario = "";
FechaRegistroUsuario = "";
CodTlfUsuario1 = "";
TelefonoUsuario1 = "";
CodTlfUsuario2 = "";
TelefonoUsuario2 = "";
212
LoginUsuario = "";
ClaveUsuario = "";
CargoUsuario = "";
CorreoUsuario = "";
TipoUsuario = "";
SituacionUsuario = "ACTIVO";
CodVisita = "";
EstaConectado = false;
}
/********************************************************************
*Estas dos funciones siguientes se encargan exclusivamente de recibir y enviar el*
*valor de la variable codVisita. Se conocen en Java como funciones getter y setter*
*respectivamente, las cuales permiten el encapsulamiento de los datos como*
*propiedad característica de la programación orientada a objetos *
********************************************************************/
public String getCodVisita()
{return CodVisita;
}
/********************************************************************
*Esta clase pública es la precursora del objeto Sesión, implementa la interfaz*
*”Serializable”, y presenta algunas variables privadas de tipo caracter propias de el*
*objeto Sesión en cuestión *
********************************************************************/
public class Sesion implements Serializable
{private String CodSesion;
private String CodUsuario;
213
/********************************************************************
*Esta función es el constructor de la clase Sesion. Es pública para que pueda ser*
*accedida por cualquier otra clase desde otro lugar del entorno Web. Se observa la*
*inicialización de todas las variables mencionadas en la sección anterior, además de*
*nombrarse otras nuevas variables *
********************************************************************/
public Sesion()
{super();
DateFormat fecha =
DateFormat.getDateInstance(java.text.DateFormat.DEFAULT);
DateFormat hora =
DateFormat.getTimeInstance(java.text.DateFormat.DEFAULT);
CodSesion = "";
CodUsuario = "000000";
FechaSesion = ObjetoComun.cambioFechas(fecha.format(new Date()));
HoraEntradaSesion = hora.format(new Date());
HoraSalidaSesion = HoraEntradaSesion;
AccionesSesion = "";
}
/********************************************************************
*Estas son las funciones getter y setter de las variables privadas de la clase Sesion *
********************************************************************/
public String getCodSesion()
{return CodSesion;
}
/********************************************************************
*En esta función se hace un llamado de forma estática a la función presente en la*
*clase ObjetoComun, es decir, sin instanciar el objeto llamado “ObjetoComun” *
********************************************************************/
public void setFechaSesion(String fechaSesion)
{FechaSesion = ObjetoComun.cambioFechas(fechaSesion);
}
/********************************************************************
*Esta función recibe como argumento una variable que posee el código de sesión*
*a modificarse, mientras que no devuelve resultado alguno (void). La misma busca*
*dicha sesión en la tabla SESIONES y la modifica posteriormente según se necesita *
********************************************************************/
public void ModificarSesion(String sesion)
215
Servicio.java
package modelo;
/********************************************************************
*Las siguientes representan las librerías que son importadas por la clase Servicio*
*para su normal funcionamiento *
********************************************************************/
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
/********************************************************************
*Clase pública precursora del objeto Servicio, implementa la interfaz ”Serializable”,*
*y presenta algunas variables privadas de tipo carácter propias del objeto Servicio *
********************************************************************/
public class Servicio implements Serializable
{private String CodServicio;
private String CodFactura;
private String EnunciadoServicio;
private String DescripcionServicio;
private String SituacionServicio;
private String[] FotosServicios = {"", "", "", "", ""};
private String[] ComentarioFoto = {"", "", "", "", ""};
/********************************************************************
*Constructor de la clase Servicio, donde se inicializan las variables de la misma *
********************************************************************/
public Servicio()
{super();
216
CodServicio = "";
CodFactura = "";
EnunciadoServicio = "";
DescripcionServicio = "";
SituacionServicio = "ACTIVO";
}
/********************************************************************
*Estas son las funciones getter y setter de las variables privadas de la clase Servicio *
********************************************************************/
public String getCodServicio()
{return CodServicio;
}
codigo = cdbdd.DeterminarCodigo(varsql);
cdbdd.CerrarBDD();
return ++codigo;
}
/********************************************************************
*Esta función se encarga de ingresar los datos de un servicio o actividad en la BDD.*
*Recibe una variable de tipo cadena de caracteres y no devuelve variable alguna.*
218
*Posee una sentencia SQL que registra en la tabla SERVICIOS los datos del mismo *
********************************************************************/
public void RegistrarServicio(String mensaje)
{SGBDD cdbdd = new SGBDD();
String varsql = "INSERT INTO H.SERVICIOS VALUES ('" + this.CodServicio
+ "', '" + this.CodFactura + "', '" + this.EnunciadoServicio + "', '" +
this.DescripcionServicio + "', '" + this.SituacionServicio + "', '" +
this.FotosServicios[0] + "', '" + this.FotosServicios[1] + "', '" +
this.FotosServicios[2] + "', '" + this.FotosServicios[3] + "', '" +
this.FotosServicios[4] + "', '" + this.ComentarioFoto[0] + "', '" +
this.ComentarioFoto[1] + "', '" + this.ComentarioFoto[2] + "', '" +
this.ComentarioFoto[3] + "', '" + this.ComentarioFoto[4] + "');";
cdbdd.RegistrarDatos(varsql, mensaje);
}
/********************************************************************
*Esta función se encarga de consultar datos propios de la tabla SERVICIOS usando*
*una sentencia SQL recibida como argumento. Devuelve un objeto de tipo Servicio.*
*Presenta ciertas nuevas varibles, y secciones “try” y “catch” para resolver errores *
********************************************************************/
public Servicio ConsultarServicio(String varsql)
{SGBDD cdbdd = new SGBDD();
Servicio servicio = null;
String direcciones[] = new String[5], comentarios[] = new String[5];
int i;
cdbdd.ConsultarDatos(varsql);
try
{if(cdbdd.getRs().next())
{servicio = new Servicio();
servicio.setCodServicio(cdbdd.getRs().getString(1).trim());
servicio.setCodFactura(cdbdd.getRs().getString(2).trim());
servicio.setEnunciadoServicio(cdbdd.getRs().getString(3).trim());
servicio.setDescripcionServicio(cdbdd.getRs().getString(4).trim());
servicio.setSituacionServicio(cdbdd.getRs().getString(5).trim());
for(i = 6; i < 11; i++)
{direcciones[i-6] = cdbdd.getRs().getString(i).trim();
comentarios[i-6] = cdbdd.getRs().getString(i+5).trim();
}
servicio.setFotosServicios(direcciones);
servicio.setComentarioFoto(comentarios);
}
}
catch (SQLException e)
219
{e.printStackTrace();
}
cdbdd.CerrarBDD();
return servicio;
}
}
Factura.java
package modelo;
/********************************************************************
*Librerías que son importadas por esta clase o archivo para su normal desempeño *
********************************************************************/
import java.io.Serializable;
import java.sql.SQLException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
/********************************************************************
*Clase pública precursora del objeto Factura, implementa la interfaz ”Serializable”,*
*y presenta algunas variables privadas de tipo carácter propias de el objeto Factura *
********************************************************************/
public class Factura implements Serializable
{private String CodFactura;
private String OrigenFactura;
private String ProcedenciaFactura;
private String LugarFactura;
private String FechaFactura;
private String EdSFactura;
private String SituacionFactura;
private String FormaPagoFactura[];
private String PagoOtraFormaFactura;
private double IVAFactura;
/********************************************************************
*Este es el constructor de la clase Factura, es de caracter público, y se observa la*
*inicialización de todos las variables mencionadas en la sección anterior, además de*
*nombrarse otras nuevas variables *
********************************************************************/
public Factura()
{super();
DateFormat fecha = DateFormat.getDateInstance(DateFormat.DEFAULT);
220
CodFactura = "";
OrigenFactura = "nueva";
ProcedenciaFactura = "000000";
LugarFactura = "Puerto La Cruz";
FechaFactura = fecha.format(new Date());
EdSFactura = "-";
SituacionFactura = "POR CANCELAR";
PagoOtraFormaFactura = "-";
IVAFactura = 0.0;
}
/********************************************************************
*Estas son las funciones getter y setter de las variables privadas de la clase Factura *
********************************************************************/
public String getEdSFactura()
{return EdSFactura;
}
/********************************************************************
*Esta función consulta los datos propios de la tabla FACTURAS mediante una*
*sentencia SQL recibida como argumento. Devuelve un objeto de tipo Factura *
********************************************************************/
public Factura ConsultarFactura(String varsql)
{SGBDD cdbdd = new SGBDD();
String valor;
Factura factura = null;
cdbdd.ConsultarDatos(varsql);
try
{if(cdbdd.getRs().next())
{factura = new Factura();
factura.setCodFactura(cdbdd.getRs().getString(1).trim());
factura.setEdSFactura(cdbdd.getRs().getString(2).trim());
factura.setLugarFactura(cdbdd.getRs().getString(3).trim());
factura.setFechaFactura(cdbdd.getRs().getString(4).trim());
factura.setSituacionFactura(cdbdd.getRs().getString(5).trim());
factura.setIVAFactura(cdbdd.getRs().getFloat(6));
factura.setFormaPagoFactura(cdbdd.getRs().getString(7).trim().split(","));
factura.setPagoOtraFormaFactura(cdbdd.getRs().getString(8).trim());
}
}
catch (SQLException e)
{e.printStackTrace();
}
cdbdd.CerrarBDD();
return factura;
}
/********************************************************************
*Esta función se encarga de consultar datos propios de la tabla FACTURAS usando*
*una sentencia SQL recibida como argumento. Devuelve un objeto de tipo*
223
* ArrayList, es decir, una lista de objetos, que en este caso son de tipo Factura *
********************************************************************/
public ArrayList ConsultarFacturas(String varsql)
{SGBDD cdbdd = new SGBDD();
ArrayList FacturaList = new ArrayList();
Factura factura = null;
cdbdd.ConsultarDatos(varsql);
try
{while(cdbdd.getRs().next())
{factura = new Factura();
factura.setCodFactura(cdbdd.getRs().getString(1).trim());
varsql = "SELECT * FROM H.FACTURAS WHERE CodFactura = '" +
factura.getCodFactura() + "';";
factura = factura.ConsultarFactura(varsql);
FacturaList.add(factura);
}
}
catch (SQLException e)
{e.printStackTrace();
}
cdbdd.CerrarBDD();
return FacturaList;
}
}
Servicios.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv = "Content-Type" content = "text/html;
charset=ISO-8859-1">
<META NAME = "GENERATOR" CONTENT = "IBM Software Development
Platform">
<META http-equiv = "Content-Style-Type" content = "text/css">
<LINK HREF = 'CSS/TodosEstilos.css' TYPE = 'text/css' REL = 'stylesheet'>
<TITLE>EMPRESAS.html</TITLE>
</HEAD>
<BODY>
<!-- Aquí se muestra el código HTML que genera una página Web sencilla y de
contenido estático, es decir, que no cambia con el tiempo ni según el usuario que la
solicita o consulta, y que muestra una imagen informativa que hace alusión a los
Servicios y Actividades que ofrece la empresa HIDROCONS, C. A. a su clientela.
224
Posee etiquetas propias de este lenguaje para formar tablas, imágenes, así como
enlaces hacia otros archivos para la buena presentación de la página en cuestión -->
<TABLE BORDER = "1">
<TR>
<TD WIDTH = "623">
<IMG BORDER = '0' SRC = imagenes/Repuestos/SERVICIOS.jpg'
WIDTH = '615' HEIGHT = '165'>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
NewServicioEmpl.java
package vista;
/********************************************************************
*Las siguientes representan las librerías que son importadas por este servlet*
*(un servlet es un generador dinámico Java de páginas y respuestas a solicitudes*
*Web) para su normal funcionamiento *
********************************************************************/
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import modelo.Factura;
import modelo.ObjetoComun;
import modelo.Servicio;
/********************************************************************
*Esta es una clase muy diferente a las que hasta ahora se han diseñado, ya que la*
*misma implementa y hereda interfaces que tienen quer ver con el concepto de*
*“Servlet”, además de trabajar con protocolo HTTP *
225
********************************************************************/
public class NewServicioEmpl extends HttpServlet implements Servlet
{public NewServicioEmpl()
{super();
}
/********************************************************************
*Esta función propia de un servlet, se encarga de procesar solicitudes Web del tipo*
*GET, es decir, no tienen ningún contenido de cuerpo, de manera que dichos datos*
*se pasan al servidor como cadena de consulta en el URL. Tiene dos argumentos*
*(req) que representa la solicitud, y (resp) la respuesta. Dicha función se encarga de*
*generar de forma dinámica, es decir, cambiante, de acuerdo a ciertas condiciones,*
*la página de respuesta a alguna solicitud elaborada por algún usuario autentificado *
********************************************************************/
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException
{HttpSession session = req.getSession(false);
ServletContext context = this.getServletContext();
RequestDispatcher rd = null;
PrintWriter out = resp.getWriter();
Servicio servicio = new Servicio();
ArrayList listaPresupuestos;
Iterator iter = null;
Factura factura = new Factura();
Usuario usuario = (Usuario) session.getAttribute("UsuarioSes");
Sesion sesion = new Sesion();
String varsql, comando = req.getParameter("comando"), direcciones[],
comentarios[];
String direcciones1[] = {"", "", "", "", ""}, comentarios1[] = {"", "", "", "", ""};
int i, numero = 0, a, posicion = 267, p = 0;
numero = servicio.DeterminarCodigo();
if(comando != null)
if(comando.equalsIgnoreCase("REGISTRAR"))
{servicio.setCodServicio(ObjetoComun.codigos(String.valueOf(numero)));
servicio.setCodFactura(req.getParameter("cmbPresupuestos"));
servicio.setEnunciadoServicio(req.getParameter("txtEnunciado"));
servicio.setDescripcionServicio(req.getParameter("txtDescripcion"));
direcciones = req.getParameterValues("TxtFileFoto");
comentarios = req.getParameterValues("txtComentario");
{direcciones1[p] = direcciones[i];
comentarios1[p++] = comentarios[i];
}
}
servicio.setFotosServicios(direcciones1);
servicio.setComentarioFoto(comentarios1);
servicio.RegistrarServicio("SERVICIO REGISTRADO CON ÉXITO");
numero++;
sesion.setAccionesSesion("INGRESAR SERVICIO");
sesion.ModificarSesion(usuario.getCodVisita());
servicio = new Servicio();
}
else
{rd = context.getRequestDispatcher("SERVICIOS.html");
rd.forward(req, resp);
}
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01
Transitional//EN'>"
+"<HTML><HEAD><META http-equiv='Content-Type' content='text/html;
charset=ISO-8859-1'>"
+"<META NAME = 'GENERATOR' CONTENT = 'IBM Software
Development Platform'><TITLE>NuevoCliente.html</TITLE>"
+"<SCRIPT LANGUAGE = 'JavaScript' SRC =
'JavaScripts/JavaScript.js'></SCRIPT>"
+"<LINK HREF = 'CSS/TodosEstilos.css' TYPE = 'text/css'
REL = 'stylesheet'></HEAD>"
+"<BODY BGCOLOR = '#FFFFCC'><FORM NAME = 'formul' METHOD =
'POST' ACTION = 'NewServicioEmpl' TARGET = 'principal'>"
+"<TABLE BORDER = '0'><TR><TD COLSPAN = '2' WIDTH = '623'
CLASS = 'textoCent14b'>DATOS DEL SERVICIO QUE PRESTA LA
EMPRESA</TD></TR>"
+"<TR><TD HEIGHT = '10' COLSPAN = '2'></TD></TR></TABLE>"
+"<TABLE BORDER = '0'><TR><TD WIDTH = '90'
227
while(iter.hasNext())
{factura = (Factura) iter.next();
varsql = "SELECT * FROM H.SERVICIOS WHERE CodFactura = '" +
factura.getCodFactura() + "' AND CodFactura <> '000000';";
servicio = new Servicio();
servicio = servicio.ConsultarServicio(varsql);
if(servicio == null)
out.println("<OPTION VALUE = '" + factura.getCodFactura() + "'>" +
factura.getCodFactura() + "</OPTION>");
}
out.println("</SELECT></TD></TR>"
+"<TR><TD CLASS = 'celdaGrizIzq10'>Enunciado</TD><TD
COLSPAN = '4'><TEXTAREA ROWS = '2' COLS = '82'
NAME = 'txtEnunciado'
CLASS = 'textoIzq12' OnChange = 'contarCaracteres(this, 500);'
OnKeyUp = 'contarCaracteres(this, 500);'></TEXTAREA></TD></TR>"
+"<TR><TD CLASS = 'celdaGrizIzq10'>Descripción</TD><TD
COLSPAN = '4'><TEXTAREA ROWS = '5' COLS = '82'
NAME = 'txtDescripcion' CLASS = 'textoIzq12'
OnChange = 'contarCaracteres(this, 1200);'
OnKeyUp = 'contarCaracteres(this, 1200);'></TEXTAREA></TD></TR>
</TABLE>"
+"<P><TABLE BORDER = '0'><TR><TD COLSPAN = '2'
CLASS = 'celdaGrizCent12'>FOTOS</TD></TR>");
5.5. Pruebas
Las pruebas constituyen una de las etapas más importantes del ciclo de vida de
desarrollo de software. Un producto de software que se desarrolla se debe entregar al
cliente libre de defectos y de errores. La prueba es el proceso de ejecutar un
programa con la intención de descubrir defectos en el mismo. De allí que el objetivo
de esta etapa es detectar en la aplicación cualquier posible funcionamiento erróneo
antes de entregarlo a los usuarios definitivos.
Clase de
Nombre del No
Caso de Prueba Válido Equiv.
Campo Válido
Cubierto
10/07/2009 1
12345678 2
Nombre de Usuario 1234,56 3
o Login ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Contraseña o 1234,56 3
Password ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
La tabla 5.3 siguiente muestra las pruebas del caso de uso “Registrar Empresa”.
Clase de
Nombre del Válid No
Caso de Prueba Equiv.
Campo o Válido
Cubierto
10/07/2009 1
12345678 2
Nombre de la 1234,56 3
Empresa ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
RIF de la Empresa
?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
NIT de la Empresa
?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Dirección Fiscal
1234,56 3
donde reside la
Empresa ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Ciudad de ubicación 1234,56 3
de la Empresa ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
Tabla 5.3. Caso de Prueba de Caja Negra “Registrar Empresa” (Continuación)
234
Clase de
Nombre del Válid No
Caso de Prueba Equiv.
Campo o Válido
Cubierto
10/07/2009 1
12345678 2
Correo Electrónico 1234,56 3
de la Empresa ¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
No Clase de
Nombre del Válid
Caso de Prueba Válid Equiv.
Campo o
o Cubierto
10/07/2009 1
12345678 2
1234,56 3
Nombres del Usuario
¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
Apellidos del Usuario
¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Cédula de Identidad 1234,56 3
del Usuario ¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
235
No Clase de
Nombre del Válid
Caso de Prueba Válid Equiv.
Campo o
o Cubierto
10/07/2009 1
12345678 2
1234,56 3
Dirección del Usuario
¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
2do Teléfono del 1234,56 3
Usuario ¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
E-Mail del Usuario
¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
No Clase de
Nombre del Válid
Caso de Prueba Válid Equiv.
Campo o
o Cubierto
Número de la 10/07/2009 1
Factura 12345678 2
1234,56 3
¿LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
236
“” 6
Tabla 5.5. Caso de Prueba de Caja Negra “Registrar Factura” (Continuación)
No Clase de
Nombre del Válid
Caso de Prueba Válid Equiv.
Campo o
o Cubierto
10/07/2009 1
12345678 2
1234,56 3
Lugar de emisión
?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Impuesto al Valor 1234,56 3
Agregado (IVA) ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
Descripción del ítem
?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
1234,56 3
Cantidad del ítem
?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
10/07/2009 1
12345678 2
Precio unitario del 1234,56 3
ítem ?LU”IS_car’los/3 4
Ab-2@kmn3.xyz 5
“” 6
237
Prueba
Otro de los casos de prueba que puede realizar un usuario del tipo Empleado de
HIDROCONS con la empresa ingresada anteriormente puede ser el que consiste en
redactar una nueva factura a dicha empresa, acreditándosela a sus cuentas por cobrar.
necesite.
10. Presionar el botón para ingresar finalmente la
factura.
11. Confirmar el mensaje de solicitud de
procesamiento que el sistema presenta.
12. La factura ha sido registrada exitosamente.
Situación del
Caso de EXITOSO
Prueba
o Cantidad Repuesto 2: 20 UN
o Cantidad Repuesto 3: 5 UN
o Cantidad Repuesto 4: 10 UN
o Cantidad Repuesto 5: 15 UN
La solicitud de la lista de repuestos se registra en la
Resultado
Base de Datos del sistema
¾ El Cliente de HIDROCONS debe estar registrado en
Condiciones el sistema como usuario activo.
¾ El Cliente debe estar previamente autentificado.
1. Seleccionar la opción Consultar Repuestos en el
menú desplegable del lado izquierdo de la vista
principal del cliente autentificado.
2. Seleccionar qué tipo de accesorio va a solicitar
(Eléctrico, Electrónico o Hidráulico).
3. Escojer el repuesto de su preferencia propio del tipo
de repuesto que está actualmente escogido.
Procedimient
4. Indicar la cantidad requerida de dicho repuesto.
o
5. Repetir los pasos 2, 3 y 4 tantas veces como sea
necesario.
6. Presionar el botón indicado para visualizar la
cotización definitiva y totalizada sin impuesto (IVA).
7. Confirmar el mensaje de solicitud de procesamiento.
8. La solicitud de repuestos ha sido generada
exitosamente.
Situación del
Caso de EXITOSO
Prueba
Supóngase que la empresa cliente en cuestión, así como tuvo una factura
acreditada a su cuenta, también ha de tener un presupuesto en situación de espera de
algún trabajo que se le ha de realizar por parte de la compañía HIDROCONS, C. A.
Pues igualmente el usuario Cliente HIDROCONS o representante legal de dicha
empresa puede proceder a realizar la aprobación o rechazo del presupuesto en
cuestión. A continuación se muestra el procedimiento que realizaría el cliente para
llevar a cabo el caso de prueba de integración de aprobación de un presupuesto.
N°. Caso de
Caso de 07 Prueba Aceptar Presupuesto
Prueba
¾ Referencia del presupuesto como criterio de
Entrada
búsqueda: 001-09
El presupuesto que cumple con los requisitos de
Resultado búsqueda indicados es mostrado en la pantalla, y
posteriormente es aprobado para su próxima ejecución.
¾ El usuario debe estar registrado previamente en la
BDD.
Condiciones ¾ El usuario debe estar en situación o estado
ACTIVO.
¾ El usuario no debe haber iniciado sesión alguna.
1. Seleccionar la opción Consultar Presupuestos en el
menú desplegable.
2. Aparece una ventana modal donde se ingresará en
el campo adecuado como criterio de búsqueda el
número de referencia del presupuesto a consultar.
3. Presionar el botón de consulta.
4. Aparece un solo presupuesto que es el que
satisface el criterio de búsqueda, y algunos datos
de información adicionales para corroborar la
Procedimient pertenencia y procedencia del mismo, tales como
o fecha del presupuesto, cliente al cual va dirigido,
situación y monto del mismo, entre otros.
5. Presionar en el enlace del código o referencia del
presupuesto que aparece en la pantalla.
6. En la ventana emergente se procede a presionar el
botón que aceptará dicho presupuesto, colocando
su situación como “APROBADO”.
7. Confirmar el mensaje de solicitud de
procesamiento que el sistema presenta.
8. El presupuesto ha sido aprobado exitosamente.
Situación del
Caso de EXITOSO
Prueba
5.6. Evaluación de la fase de construcción
247
¾ Ahora que se obtuvo una versión funcional del producto, se sigue a la fase
que determinará si la transición de dicha versión es hacia otro ciclo de
desarrollo, es decir, hacia otra iteración, o hacia los usuarios finales del
mismo.
248
CAPÍTULO VI
FASE DE TRANSICIÓN
6.1. Introducción
Al final de la fase de transición los objetivos del ciclo de vida deben haber sido
alcanzados y el proyecto debería estar en posición de ser cerrado. El fin del actual
ciclo de vida puede coincidir con el inicio de otro ciclo de vida, sobre el mismo
producto, dirigiéndose a la próxima generación o versión del producto. Los
principales objetivos de esta fase están constituidos por:
¾ Una prueba beta, para validar el nuevo sistema contra las expectativas del
usuario y la operación en paralelo con los sistemas heredados que dicho
sistema reemplazará.
Se estima que la duración de esta fase sea más corta que la anterior, ya que la
realización de actividades en cualquier flujo de trabajo (requisitos, análisis, diseño,
implementación o pruebas) depende del resultado que arroje las pruebas sobre la
versión beta del software. La corrección de todos los posibles errores y
modificaciones que aparezcan sugeridas por los usuarios es lo que determinará la
calidad funcional del software, debido a que son los usuarios finales los que
reportarán las fallas o modificaciones aceptables en pro del mejoramiento del
producto final que utilizarán.
6.3. Implementación
130
Horas Totales … 220 minutos
minutos
Durante el transcurso de las pruebas hechas por los usuarios, se les impartieron
instrucciones para que fueran accediendo a las diferentes partes que conforman el
software, para así poder diagnosticar las posibles fallas que se puedan presentar con
respecto a la funcionalidad del mismo.
CONCLUSIONES
RECOMENDACIONES
BIBLIOGRAFÍA
[4] Ceri S., Fraternali P., Bongio A. y Brambilla M., “Designing Data-Intensive
Web Applications”. Morgan Kaufmann Publishers. Primera Edición. (2003).
el 23 de Noviembre de 2007.
Diciembre de 2007.
1/5
SUBTÍTULO
AUTOR (ES):
ÀREA SUBÀREA
Ingeniería en Computación
Ingeniería y Ciencias Aplicadas
RESUMEN (ABSTRACT):
CONTRIBUIDORES:
APELLIDOS Y NOMBRES ROL / CÓDIGO CVLAC / E_MAIL
ROL CA AS TU JU
X
Torrealba, Aquiles. CVLAC: 7.385.840
E_MAIL tmar1966@hotmail.com
E_MAIL
ROL CA AS TU JU
X
Veracierta, Gabriela. CVLAC: 14.616.683
E_MAIL gveracierta@hotmail.com
E_MAIL
ROL CA AS TU JU
X
Saettone, Mónica. CVLAC: 10.948.010
E_MAIL msaettone@yahoo.com
E_MAIL
ROL CA AS TU JU
CVLAC:
E_MAIL
E_MAIL
2009 10 16
AÑO MES DÍA
LENGUAJE. SPA
U
4/5
ARCHIVO (S):
NOMBRE DE ARCHIVO TIPO MIME
TESIS.SistDeInformWeb_SIADCON.doc Application/msword
ALCANCE
ÁREA DE ESTUDIO:
Departamento de Computación y Sistemas
INSTITUCIÓN:
Universidad de Oriente – Núcleo Anzoátegui
¡Error!
Marcador no
definido.
5/5
DERECHOS
AUTOR