tomo i línea de investigación nombre del egresado ... -...

473
i TOMO I Línea de Investigación Redes y Sistemas Operativos Nombre del Egresado Fausto Stanley Almeida Campos Nombre del Tema Implementación de un prototipo de sistema de envío de publicidad vía Bluetooth para un almacén de música, como aplicación del concepto de marketing de proximidad Número de Proyecto 10 Nombre del Tutor Ing. David Benavides

Upload: others

Post on 04-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

i

TOMO I

Línea de Investigación

Redes y Sistemas Operativos

Nombre del Egresado

Fausto Stanley Almeida Campos

Nombre del Tema

Implementación de un prototipo de sistema de envío de

publicidad vía Bluetooth para un almacén de música,

como aplicación del concepto de marketing de

proximidad

Número de Proyecto

10

Nombre del Tutor

Ing. David Benavides

Page 2: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

ii

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS

COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE

ENVÍO DE PUBLICIDAD VÍA BLUETOOTH PARA UN

ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL

CONCEPTO DE MARKETING DE PROXIMIDAD

TESIS DE GRADO

Previa a la obtención del Título de:

INGENIERO EN SISTEMAS COMPUTACIONALES

AUTOR: FAUSTO STANLEY ALMEIDA CAMPOS

TUTOR: ING. DAVID BENAVIDES

GUAYAQUIL – ECUADOR

2011

Page 3: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

iii

Guayaquil, 09 de marzo del 2011

APROBACION DEL TUTOR

En mi calidad de Tutor del trabajo de investigación, “IMPLEMENTACIÓN DE UN

PROTOTIPO DE SISTEMA DE ENVÍO DE PUBLICIDAD VÍA BLUETOOTH

PARA UN ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL CONCEPTO DE

MARKETING DE PROXIMIDAD” elaborado por el Sr. FAUSTO STANLEY

ALMEIDA CAMPPOS, egresado de la Carrera de Ingeniería en Sistemas

Computacionales, Facultad de Ciencias Matemáticas y Físicas de la Universidad de

Guayaquil, previo a la obtención del Título de Ingeniero en Sistemas, me permito

declarar que luego de haber orientado, estudiado y revisado, la Apruebo en todas sus

partes.

Atentamente

………………………………….

Ing. DAVID BENAVIDES

TUTOR

Page 4: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

iv

DEDICATORIA

A mi padre, que en paz descanse, y a mi madre, por su inquebrantable voluntad para

apoyarme inmensurablemente durante todos los proyectos que emprendo en mi vida.

Page 5: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

v

AGRADECIMIENTO

Agradezco en primera instancia a Dios por haber tomado en sus manos el rumbo de

mi vida y todas mis decisiones, por haberme bendecido con una madre ejemplar, que

a pesar de lo duro de las circunstancias, nunca permitió que sus hijos se privasen de

cualquier oportunidad en la vida. Le agradezco en segunda instancia a Dios por

haberme dado a una hermana sensata e inteligente, segundo pilar más importante en

nuestra familia, que ha sabido ser el perfecto complemento para mi madre para

formarme como un hombre de bien. Y por último, le agradezco a Dios por los

familiares y amigos que se ha encargado de poner en mi vida, apoyo de gran

importancia para lograr llevar a cabo esta dura carrera, compañeros de estudio,

colegas, al final siempre se trató de trabajo en equipo.

Page 6: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

vi

TRIBUNAL DE GRADO

Ing. Fernando Abad Montero

DECANO DE LA FACULTAD

CIENCIAS MATEMÁTICAS Y

FÍSICAS

Ing. Juan Chanabá Alcócer

DIRECTOR

Ing. David Benavides

TUTOR

Ing. Milton Maridueña

PROFESOR DEL ÁREA -

TRIBUNAL

Ab. Juan Chávez A.

SECRETARIO

Page 7: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

vii

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE ENVÍO DE

PUBLICIDAD VÍA BLUETOOTH PARA UN ALMACÉN DE MÚSICA,

COMO APLICACIÓN DEL CONCEPTO DE MARKETING DE

PROXIMIDAD

Proyecto de trabajo de grado que se presenta como requisito para optar por el título en

INGENIERO en SISTEMAS COMPUTACIONALES.

Autor: Fausto Stanley Almeida Campos

C.I.: 0918146127

Tutor: Ing. David Benavides

Page 8: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

viii

Guayaquil, 09 de marzo del 2011

CERTIFICADO DE ACEPTACIÓN DEL TUTOR

En mi calidad de Tutor del Primer Curso de Fin de Carrera, nombrado por el

Departamento de Graduación y la Dirección de la Carrera de Ingeniería en Sistemas

Computacionales de la Universidad de Guayaquil,

CERTIFICO:

Que he analizado el Proyecto de Grado presentado por el egresado

Fausto Stanley Almeida Campos, como requisito previo para optar por el título de

Ingeniero cuyo problema es:

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE ENVÍO DE

PUBLICIDAD VÍA BLUETOOTH PARA UN ALMACÉN DE MÚSICA,

COMO APLICACIÓN DEL CONCEPTO DE MARKETING DE

PROXIMIDAD.

Considero aprobado el trabajo en su totalidad.

Presentado por:

Fausto Stanley Almeida Campos 0918146127

Apellidos y Nombres completos Cédula de ciudadanía N°

Tutor: Ing. David Benavides

Page 9: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

ix

Guayaquil, 09 de marzo del 2011

ÍNDICE GENERAL

1 CAPÍTULO I EL PROBLEMA ....................................................................... 18

1.1 PLANTEAMIENTO DEL PROBLEMA ........................................................ 19

1.1.1 Ubicación del Problema en un Contexto ..................................................... 19

1.1.2 Situación Conflicto Nudos Críticos ............................................................ 21

1.1.3 Causas y Consecuencias del Problema ....................................................... 22

1.1.4 Delimitación del Problema .......................................................................... 23

1.1.5 Formulación del Problema .......................................................................... 24

1.1.6 Evaluación del Problema............................................................................. 24

1.2 OBJETIVOS ...................................................................................................... 27

1.2.1 Objetivo General. ........................................................................................ 27

1.2.2 Objetivos Específicos. ................................................................................. 27

1.3 ALCANCE DEL PROTOTIPO ....................................................................... 28

1.3.1 Descripción funcional ................................................................................. 28

1.3.2 Módulo Operativo ....................................................................................... 29

1.3.3 Limitaciones ................................................................................................ 31

1.3.4 Adicionales al alcance inicial ...................................................................... 31

1.4 JUSTIFICACION E IMPORTANCIA ........................................................... 33

2 CAPÍTULO II MARCO TEÓRICO ............................................................... 37

2.1 ANTECEDENTES DEL ESTUDIO ................................................................ 38

2.2 FUNDAMENTACIÓN TEÓRICA .................................................................. 38

2.2.1 El Marketing................................................................................................ 38

2.2.2 Tecnología Bluetooth .................................................................................. 49

2.2.3 Otras tecnologías de proximidad ................................................................. 65

2.2.4 Lenguaje de programación Java .................................................................. 68

2.2.5 Especificación JSR-82 ................................................................................ 71

2.2.6 Librería BlueCove ....................................................................................... 75

2.2.7 Librerías Auxiliares ..................................................................................... 78

Page 10: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

x

2.3 FUNDAMENTACIÓN LEGAL ...................................................................... 79

2.3.1 Constitución del Ecuador, Capítulo Segundo, Sección Segunda ................ 79

2.3.2 Constitución del Ecuador, Capítulo Segundo, Sección Tercera ................. 79

2.3.3 Constitución del Ecuador, Capítulo Tercero, Sección Novena ................... 80

2.4 PREGUNTAS A CONTESTARSE ................................................................. 80

2.5 VARIABLES DE LA INVESTIGACIÓN ...................................................... 81

2.5.1 La Tecnología.............................................................................................. 81

2.5.2 El Mercado .................................................................................................. 82

2.5.3 El Producto .................................................................................................. 83

2.6 DEFINICIONES CONCEPTUALES ............................................................. 83

2.6.1 Marketing de proximidad ............................................................................ 83

2.6.2 Marketing permisivo ................................................................................... 84

2.6.3 Spam ............................................................................................................ 84

2.6.4 OBEX .......................................................................................................... 84

3 CAPÍTULO III METODOLOGÍA ................................................................. 85

3.1 DISEÑO DE LA INVESTIGACIÓN .............................................................. 86

3.1.1 Modalidad de la Investigación .................................................................... 86

3.1.2 Tipo de la Investigación .............................................................................. 87

3.1.3 Población y Muestra .................................................................................... 88

3.1.4 Operacionalización de las Variables ........................................................... 90

3.1.5 Instrumentos de la Recolección de Datos ................................................... 91

3.1.6 Instrumentos de la Investigación ................................................................. 92

3.1.7 Procedimientos de la Investigación ............................................................. 93

3.1.8 Recolección de la Información ................................................................... 95

3.2 PROCESAMIENTO Y ANÁLISIS ................................................................. 95

3.2.1 Criterios para la Elaboración de la Propuesta ............................................. 99

3.2.2 Criterios para la Validación de la Propuesta ............................................. 100

4 CAPÍTULO IV MARCO ADMINISTRATIVO .......................................... 103

4.1 CRONOGRAMA ............................................................................................ 104

4.2 PRESUPUESTO .............................................................................................. 109

4.2.1 Estimación de costos ................................................................................. 109

Page 11: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xi

4.2.2 Presupuesto ............................................................................................... 110

4.2.3 Evaluación financiera ................................................................................ 112

5 CAPÍTULO V CONCLUSIONES Y RECOMENDACIONES .................. 114

5.1 CONCLUSIONES ........................................................................................... 115

5.2 RECOMENDACIONES ................................................................................. 117

5.3 BIBLIOGRAFÍA ............................................................................................. 119

5.3.1 LIBROS .................................................................................................... 119

5.3.2 PUBLICACIONES WEB ......................................................................... 120

Page 12: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xii

ÍNDICE DE CUADROS

CUADRO NO. 01 CLASIFICACIÓN DE LOS DISPOSITIVOS BLUETOOTH

..................................................................................................................................... 53

CUADRO NO. 02 ANCHO DE BANDA DE LOS DISPOSITIVOS

BLUETOOTH ........................................................................................................... 54

CUADRO NO. 03 COMPARACIÓN ENTRE TECNOLOGÍAS DE

PROXIMIDAD .......................................................................................................... 67

CUADRO NO. 04 DEPRECIACIÓN EQUIPO DE CÓMPUTO ....................... 110

CUADRO NO. 05 COSTO DE EQUIPO DE COMUNICACIÓN BLUETOOTH

................................................................................................................................... 110

CUADRO NO. 06 LISTADO Y COSTEO DE RECURSOS DEL PROYECTO

DE TESIS ................................................................................................................. 110

CUADRO NO. 07 PRESUPUESTO DEL PROYECTO DE TESIS .................. 111

CUADRO NO. 08 EVALUACIÓN FINANCIERA DEL PROYECTO ............ 113

Page 13: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xiii

ÍNDICE DE GRÁFICOS

GRÁFICO NO. 01 PILA DE PROTOCOLOS BLUETOOTH POR GRUPO ... 55

GRÁFICO NO. 02 PILA DE PROTOCOLOS BLUETOOTH ............................ 56

GRÁFICO NO. 03 PRINCIPALES PERFILES BLUETOOTH .......................... 62

GRÁFICO NO. 04 ESTADOS DE UN DISPOSITIVO BLUETOOTH .............. 64

GRÁFICO NO. 05 PROCESO DE COMPILACIÓN Y EJECUCIÓN DE UNA

APLICACÍON JAVA ............................................................................................... 69

GRÁFICO NO. 06 FUNCIONALIDAD OFRECIDA POR JSR-82 .................... 72

GRÁFICO NO. 07 ESTRUCTURA DE PAQUETES DE LA API DE JSR-82 .. 73

GRÁFICO NO. 08 INTERACCIÓN ENTRE LA APLICACIÓN. BLUECOVE,

EL SISTEMA OPERATIVO Y EL CONTROLADOR BLUETOOTH ............. 76

GRÁFICO NO. 09 CONOCIMIENTO PREVIO ACERCA DE LA

PUBLICIDAD VÍA BLUETOOTH ........................................................................ 96

GRÁFICO NO. 10 CONOCIMIENTO ACERCA DE EMPRESAS QUE

BRINDEN ESTE SERVICIO .................................................................................. 97

GRÁFICO NO. 11 CONFORMIDAD CON RECEPCIONES DE CONTENIDO

MULTIMEDIA EN LUGARES PÚBLICOS ......................................................... 98

GRÁFICO NO. 12 CONFORMIDAD CON LA INVERSIÓN DE LA

IMPLEMENTACIÓN DE ESTOS SISTEMAS ..................................................... 99

Page 14: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xiv

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS

COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE

ENVÍO DE PUBLICIDAD VÍA BLUETOOTH PARA UN

ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL

CONCEPTO DE MARKETING DE PROXIMIDAD

Autor: Fausto Stanley Almeida Campos

Tutor: Ing. David Benavides

RESUMEN

Durante el desarrollo de este documento de tesis se abordarán temas

relacionados a las tendencias del marketing actual. Específicamente,

acerca del marketing de proximidad y de cómo las herramientas

tecnológicas que se encuentran masificadas en el mercado nos

pueden ayudar de una manera significativa en la implementación de

sistemas de última generación que se encarguen de automatizar los

procesos más comunes del marketing tradicional, trayendo ventajas

tanto operativas como administrativas para las marcas que tengan el

deseo de mantener un nivel competitivo frente al resto en este

mundo globalizado. Se implementará un prototipo de sistema de

envío de publicidad vía Bluetooth, destinado a funcionar en una

tienda de álbumes musicales ficticia; abarcando con los documentos

anexos, las fases de análisis, diseño y desarrollo del mismo.

Page 15: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xv

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS

COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE

ENVÍO DE PUBLICIDAD VÍA BLUETOOTH PARA UN

ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL

CONCEPTO DE MARKETING DE PROXIMIDAD

Autor: Fausto Stanley Almeida Campos

Tutor: Ing. David Benavides

ABSTRACT

During the development of this thesis document will address issues

related to current marketing trends. Specifically, about proximity

marketing and how the technological tools that are overcrowded in

the market can help us in a meaningful way in the implementation

of next-generation systems that can automatically handle the most

common processes of traditional marketing, bringing operational

and administrative advantages to trademarks that have the desire to

maintain a competitive edge over the rest in this globalized world.

We will implement a prototype system for sending advertisements

via Bluetooth protocol, designed to work in a fictional store music

albums; covering with attached documents, the phases of analysis,

design and development.

Page 16: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xvi

INTRODUCCIÓN

En la actualidad, el aplicar técnicas de marketing para cualquier empresa que se desee

plantear competentemente frente a otras firmas, sea cual sea el mercado en el que se

desenvuelvan, ha dejado de ser una opción para convertirse en una necesidad.

Procesos a escala mundial, como por ejemplo la globalización, obligan a las

compañías a estar siempre un paso delante de su competencia, sobre todo en puntos

críticos como lo son las herramientas que poseen para poder llegar a establecer una

relación más directa con sus clientes así como las que permiten capturar los

denominados clientes potenciales.

Es exactamente en ese campo en donde se intentará ahondar durante este estudio,

planteando la idea de Marketing de Proximidad como una metodología para

distribuir masivamente información de interés hacia clientes potenciales dentro de un

radio determinado.

Las posibilidades de capturar clientes se ven incrementadas exponencialmente al

aplicar una campaña publicitaria de proximidad. Clientes, que sin necesidad de entrar

en un local comercial podrán conocer información de su interés como por ejemplo: la

lista productos que están actualmente en descuento, una volante digital que anuncie

las promociones de la semana, fragmentos de canciones que se ubican entre las más

escuchadas, etc.

Page 17: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

xvii

Debido a la agilidad que nos brinda implementar una solución de este tipo, se suele

caer en el error de ahogar a los clientes con publicidad no deseada, es decir, enviar

cantidades desmedidas de información hacia los clientes, el estudio también plantea la

revisión del término Permission Marketing (marketing por autorización), que llega a

jugar un papel sumamente importante como complemento del Marketing de

proximidad y que, básicamente, le da la potestad al cliente de poder elegir que

contenido desea recibir y cuál no.

Actualizar hacia el siguiente escalón las técnicas de mercadeo de una compañía

aplicando la solución expuesta, incluso influye en el impacto ambiental que se ve

disminuido en gran manera gracias a que las campañas de distribución de volantes

físicas (hojas impresas en editoriales) se tornan completamente obsoletas e

innecesarias.

Se ha escrito esta tesis con la finalidad de mostrar tan solo unas cuantas de todas las

herramientas tecnológicas con las que podemos contar al momento de pensar en

diseñar y desarrollar una solución de este tipo.

Page 18: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

1 CAPÍTULO I

EL PROBLEMA

Page 19: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

19

1.1 PLANTEAMIENTO DEL PROBLEMA

Implementación de un prototipo de sistema de envío de publicidad vía Bluetooth para

un almacén de música, como aplicación del concepto de marketing de proximidad.

1.1.1 Ubicación del Problema en un Contexto

La dificultad que posee cualquier empresa para implementar una solución de

Marketing de Proximidad y llevar hacia el siguiente escalón sus técnicas de mercadeo

de acuerdo a las tendencias tecnológicas actuales, puede parecer, en primera

instancia, sumamente alta, sin embargo existen alternativas modernas, que no

requieren de una gran inversión inicial y que permitirán a las compañías adoptar

nuevas estrategias de mercadeo permitiéndoles ubicarse con autoridad en la

competencia por posicionarse en el top-of-mind de sus clientes.

Muchas empresas sueñan con una estrategia innovadora y de bajo costo, que permita

establecer relaciones de mercadeo cada vez más directas con la mayor cantidad de

clientes potenciales posibles.

El Marketing de Proximidad no es un concepto nuevo, ha sido la técnica de marketing

más utilizada durante años, desde sus propios inicios. Sugiriendo la utilización de

Page 20: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

20

folletos, volantes, panfletos, etc. todos con la finalidad de hacer llegar al cliente

información que podría ser de su interés, siendo actualmente, tan costosa como

ineficiente.

Las posibilidades reales de capturar clientes se ven incrementadas exponencialmente

al aplicar campañas publicitarias de proximidad aprovechando dos objetos cuyos

términos resultan sumamente comunes en nuestros tiempos: dispositivo móvil y

conectividad Bluetooth.

La Secretaría Nacional de Telecomunicaciones (SENATEL)

informó que el mercado de telefonía móvil celular tiene un

“crecimiento sostenido”. Las estadísticas de esta entidad indican

que la densidad celular en el país es del 90%.[1]

Las campañas de publicidad de este tipo van dirigidas hacia clientes que sin

necesidad de tener contacto personal con un asesor de ventas o entrar en un local

comercial podrán conocer información de su interés como por ejemplo: la lista de

productos que están actualmente en descuento, una volante digital que anuncie las

promociones de la semana, fragmentos de canciones que se ubican entre las más

escuchadas, etc.

1 Redacción SENATEL, con fecha 18 de agosto del 2009. http://www.conatel.gov.ec/site_conatel/inde

x.php?option=com_content&view=article&id=530:senatel-la-penetracion-movil-en-el-pais-llega-al-90

&catid=46:noticias-articulos&temid=310

Page 21: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

21

1.1.2 Situación Conflicto Nudos Críticos

La problemática surge y se torna mucho más notable en lugares en donde la

concurrencia del público es sumamente alta, como pueden ser los centros

comerciales, patios de comida, conciertos, centros de exposición, etc.

Cualquiera de los lugares nombrados anteriormente, se convierte en un nicho de

mercado al reunir de una forma masiva clientes potenciales para una determinada

firma o empresa, clientes cuyos intereses y gustos tienden a ser similares. Atacar

dicho lugar con la distribución de volantes impresas en papel sencillamente no

permitiría captar la atención más allá de un pequeño porcentaje de personas.

Lamentablemente se cae en el error de continuar aplicando técnicas de mercadeo

obsoletas cuando el personal responsable de ventas y marketing de una empresa posee

un conocimiento insuficiente sobre nuevas tecnologías de conectividad que pudieren

servir como canales de comunicación entre la empresa y el cliente, o sencillamente, la

compañía no ve la necesidad de aplicar cambios o actualizaciones de este tipo, ni las

enormes ventajas que esto le pudiere aportar.

Page 22: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

22

1.1.3 Causas y Consecuencias del Problema

La forma más común de publicidad que suele encontrarse en la actualidad en locales

comerciales es la de distribución de volantes físicas, folletos o panfletos. Esto

lamentablemente acarrea, entre otros, el problema de la utilización excesiva de papel,

sin contar con todo el gasto que representa la impresión de los mismos en las

editoriales, y el desperdicio de recursos que se genera cuando el cliente no se siente

atraído o persuadido por el informe o anuncio y decide deshacerse de él.

A todos estos aspectos negativos se les suma la inversión adquirida por parte de la

empresa para poder cancelar los respectivos honorarios a la persona encargada de

distribuir dichas volantes, una inversión que muy pocas veces se ve recuperada, y por

medio de la cual, nunca queda una constancia de que efectivamente el talento humano

responsable, ha hecho la entrega de los folletos de una manera honrada, ya que es

muy común encontrarse con el caso de que el empleado sencillamente ha disminuido

su carga operativa deshaciéndose de los folletos que tiene como deber entregar.

Por otra parte, las consecuencias de la utilización desmedida del papel, se ven

directamente reflejadas en el impacto ambiental que nuestro ecosistema está

recibiendo. Así como la idea de una oficina sin papeles se vuelve cada vez más real y

aplicable a nuestro medio gracias a los imparables adelantos tecnológicos, la idea de

seguir utilizando el papel como medio publicitario también se vuelve cada vez más

obsoleta.

Page 23: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

23

1.1.4 Delimitación del Problema

Se desea plantear la implementación de un sistema de envío de publicidad vía

Bluetooth para una tienda musical, es decir, un negocio ficticio cuyo principal ingreso

representa la venta de álbumes e instrumentos musicales.

Esta empresa tiene, entre otras necesidades, la de dar a conocer a sus clientes los

productos que se encuentran actualmente en oferta. Así como también promocionar

de una manera amigable los nuevos álbumes que llegan a la tienda, e incentivar la

compra de los mismos distribuyendo porciones de canciones, aprovechando las

capacidades tecnológicas de los dispositivos móviles de los clientes.

Las campañas publicitarias, como tales, deberían poder ser configuradas desde el

sistema, estableciendo, entre otros, valores como la fecha inicio y la fecha fin de cada

una de ellas, los archivos multimedia que se distribuirán a los dispositivos

electrónicos que detectase, etc.

Además de poder llegar al cliente de una manera más directa con la distribución de

contenido multimedia, se necesitaría también conocer información estadística acerca

del proceso de entrega de este contenido, por ejemplo, cuántos dispositivos aceptaron

el contenido digital durante una campaña, cuántos lo rechazaron, etc. Permitiendo la

generación de criterios para posteriores tomas de decisiones.

Page 24: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

24

1.1.5 Formulación del Problema

¿Las técnicas de marketing utilizadas por la empresa están logrando establecer un

contacto directo con los clientes potenciales?

¿La inversión realizada por la empresa para el mercadeo se ve recuperada a corto o

mediano plazo?

¿La empresa está logrando el incremento de los niveles de ventas deseados?

¿Con las herramientas de marketing implementadas en la empresa se obtienen los

beneficios deseados?

1.1.6 Evaluación del Problema

Delimitado.- Como se ha mencionado anteriormente, el problema está delimitado

hacia las necesidades de un local comercial que se dedica a la venta de álbumes de

música. Negocio que precisa de un sistema que le permita manejar ágilmente

campañas publicitarias vía Bluetooth con la posibilidad de poder ofrecer a sus

potenciales clientes distintos tipos de contenido multimedia relativa a promociones y

ofertas.

Relevante.- El adecuar una solución tecnológica para el problema en cuestión

adquiere real importancia si se toman en cuenta las ganancias directas que podrían

Page 25: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

25

derivar del aplicar una campaña de publicidad exitosa y además, el beneficio

ecológico que implica la reducción significativa del impacto ambiental que se logra al

prescindir totalmente de la utilización del papel impreso.

Original.- La solución que se plantea para el problema resulta original e innovadora

debido a que se ha escogido como tecnología de comunicación la especificación de

Bluetooth, una tecnología de proximidad que dentro del contexto de desarrollo de

aplicaciones se encuentra muy poco explotada, cuya implementación no representa

gastos excesivos y permite establecer una conexión con una amplia gama de

dispositivos, ya que la mayoría de terminales móviles soportan la comunicación por

esta vía desde hace ya mucho tiempo.

Factible.- El desarrollo del prototipo que se planea implementar como respuesta a las

necesidades del negocio, se muestra factible en términos de la duración de cada tarea,

el tiempo necesario para las etapas de análisis, diseño, desarrollo y pruebas se ajusta

correctamente, así como los recursos tecnológicos que se piensan utilizar y el

intelecto humano que será el encargado de la implementación del mismo.

Contextual.- Como se ha visto durante muchas ocasiones, al dirigir un concepto

tradicional como el Marketing de Proximidad hacia un contexto tecnológico

Page 26: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

26

aprovechando las ventajas que éste último nos pudiere aportar, se pueden lograr

resultados sumamente satisfactorios. Ésta no es la excepción ya que el problema nace

por la desmedida utilización de técnicas tradicionales para llevar a cabo campañas de

mercadeo, técnicas que ya no logran sorprender a clientes modernos, clientes que

avanzan al ritmo que lo hace la tecnología, y por ende, clientes a los que se debe

persuadir actualmente con todo el arsenal que la tecnología misma pone a nuestra

disposición.

Identifica los productos esperados.- Los beneficios que se logran con la

implementación de un sistema de publicidad vía Bluetooth saltan a simple vista. No

sólo se habla de los resultados a corto plazo, como por ejemplo: el establecer una

relación más directa con clientes potenciales, darle un valor agregado a nuestro

servicio para con los consumidores, dar al personal encargado la capacidad de

personalizar y establecer la información que queremos comunicarles a nuestros

clientes, etc. Sino también de resultados a mediano y largo plazo como incrementos

en las ventas de productos en general y el lograr ubicarse en el top of mind de las

personas, asegurando la fidelidad de los clientes y un valor agregado a nuestro

potencial de marketing, que es la propaganda que un cliente satisfecho puede hacer a

favor de nuestra empresa, tan sólo al hablar bien de nuestro servicio a sus conocidos.

Page 27: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

27

1.2 OBJETIVOS

1.2.1 Objetivo General.

Implementar un prototipo de sistema para distribuir publicidad vía Bluetooth,

presentando los beneficios que supone la implementación de una solución de este

tipo, y las múltiples ventajas que se obtienen derivadas de su aplicación.

1.2.2 Objetivos Específicos.

Promover la utilización de herramientas tecnológicas para llevar a cabo campañas

publicitarias libres del uso del papel (panfletos, volantes, entre otros).

Proveer de un sistema piloto que permita el envío de publicidad vía Bluetooth

aplicando reglas de negocio básicas para un almacén de música.

Aprovechar las capacidades multimedia de las terminales móviles de los clientes

actuales y potenciales, estableciendo un contacto más efectivo y directo con los

mismos.

Lograr incrementos constantes en los niveles de rentabilidad del negocio, como

consecuencia de un incremento en las ventas de los productos promocionados.

El configurar y campañas de publicidad innovadoras para sus clientes, dándole un

importante valor agregado al servicio que se ofrece.

Page 28: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

28

1.3 ALCANCE DEL PROTOTIPO

El prototipo del sistema de envío de publicidad vía Bluetooth estará orientado a una

empresa ficticia de venta de álbumes musicales. Se pretende implantar sobre una

computadora con Windows, utilizando una base de datos MySQL y el lenguaje de

programación Java.

1.3.1 Descripción funcional

El sistema permitirá la configuración de campañas publicitarias, es decir, periodos de

tiempo durante los cuales el proceso principal comenzará a detectar dispositivos

compatibles e intentará enviar el contenido multimedia hacia los dispositivos. Estos

periodos, que pueden durar horas o días, se configuran con una fecha inicial y una

fecha final. El contenido multimedia será archivos de imagen o archivos de audio

cuya ruta en el disco duro de la computadora se configurará como parámetro en el

sistema.

El proceso principal, estará constantemente explorando su radio de alcance en busca

de nuevos dispositivos. Por cada dispositivo encontrado, el proceso identificará si

dicho dispositivo no se encuentra en un estado de restricción, para proceder a enviarle

la solicitud de recepción de contenido vía Bluetooth. Si el cliente acepta la solicitud

entonces se procederá a enviar el contenido.

Page 29: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

29

Existen dos motivos o eventos por los que el dispositivo de un cliente puede entrar al

estado de restricción:

- Cuando un cliente rechaza la solicitud de envío de contenido.

- Cuando un cliente ha recibido satisfactoriamente un contenido.

El tiempo que el dispositivo de un cliente tarde en salir del estado de restricción será

configurable.

El sistema estará compuesto por los siguientes módulos:

1.3.2 Módulo Operativo

- Permitirá crear y configurar las fechas de inicio y fin de una campaña

publicitaria.

- Permitirá especificar parámetros generales del proceso para una determinada

campaña. Tendrá las siguientes opciones:

o Tiempo de restricción que tendrá cada cliente una vez que haya

ingresado a la cola de restricción cada vez que haya aceptado o

rechazado el envío de publicidad.

- Permitirá definir los contenidos multimedia que se enviarán a los clientes

durante una determinada campaña. Tendrá las siguientes opciones:

o Archivos de audio: Permitirá escoger hasta tres archivos

simultáneamente. Archivos que representarán versiones cortas de

Page 30: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

30

canciones que se encuentren consideradas como con altos niveles de

popularidad.

o Archivos de imagen: Permitirá escoger hasta tres archivos

simultáneamente. Archivos que representarán volantes digitales con

información referente a los álbumes que se encuentren en promoción.

- Proceso de envío de publicidad. Este proceso constará de los siguientes

componentes:

o Proceso de Búsqueda de Dispositivos y Servicios. Como su nombre lo

indica, este proceso se encargará de hacer una búsqueda de

dispositivos nuevos dentro del rango de proximidad y posteriormente,

procederá a hacer la detección de servicios Bluetooth disponibles de

cada dispositivo encontrado, identificando seguidamente, si dicho

dispositivo se encuentra o no en la Lista de Restricción del sistema.

o Proceso de envío de contenido. Este proceso detectará si el cliente

aceptó la Solicitud de Envío del contenido, si ese es el caso, el

contenido será enviado y a continuación el dispositivo se registrará en

la Lista de Restricción. Si ocurriese el caso contrario, es decir, que el

dispositivo no aceptó la Solicitud de Envío, pasará directamente a la

fase de registro en la Lista de Restricción.

Page 31: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

31

- Reportes.

o El sistema podrá generar un reporte de la cantidad de dispositivos que

se detectaron durante toda una campaña, y además, de esos

dispositivos, cuántos aceptaron el contenido, y cuántos no.

1.3.3 Limitaciones

Debido a las diferencias de políticas de seguridad que plantean los principales

sistemas operativos para móviles que se encuentran en nuestro mercado: BlackBerry

OS (terminales BlackBerry), iOS (terminales iPhone) y Symbian (terminales Nokia);

se determina que el sistema sólo tendrá compatibilidad de envío de contenido con

terminales Nokia, ya que el resto de sistemas operativos, por sus políticas,

arquitectura cerrada y medidas de seguridad, no permiten que se les realice una

operación de inyección de contenido.

1.3.4 Adicionales al alcance inicial

1.3.4.1 Módulo de Seguridad

Se agregaron las opciones necesarias al sistema para poder manejar usuarios y roles;

el rol de cada usuario podrá ser el rol de Administrador o el rol de Operador.

Page 32: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

32

Así mismo se incorporó la respectiva pantalla de inicio de sesión (autenticación) y la

funcionalidad necesaria para habilitar las opciones por rol (autorización).

1.3.4.2 Módulo de configuración de campañas

Se extendió el módulo de campañas a una administración más completa, que permite

hacer consultas específicas, modificar, y eliminar campañas de marketing. También

se dividió el comportamiento lógico de las campañas, pudiéndolas configurar como

Campañas Operativas o Campañas Permanentes.

1.3.4.3 Módulo de reportes

Se agregaron reportes administrativos como el Reporte de Impacto de Campaña y el

Reporte de Costos de Campañas.

1.3.4.3.1 Reporte de Impacto de Campaña

Permite medir y visualizar por medio de un diagrama circular cuántos dispositivos

recibieron satisfactoriamente el contenido multimedia, cuántos dispositivos

rechazaron el contenido y cuántos dispositivos aceptaron el contenido pero tuvieron

algún tipo de inconveniente durante la transferencia.

1.3.4.3.2 Reporte de Costos de Campañas.

Permite visualizar fácilmente los costos que han tenido las campañas que se han

ejecutado durante un rango determinado de fechas. El costo que ha tenido cada

campaña se calculará a partir del número de mensajes de contenido multimedia que se

Page 33: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

33

hayan transferido satisfactoriamente, y el valor del costo referencial del mensaje que

se haya ingresado al momento de configurar la campaña.

1.4 JUSTIFICACION E IMPORTANCIA

La importancia de llevar hacia un nuevo escalón las técnicas de mercadeo de una

empresa radica en tres puntos sumamente significativos: el ahorro de recursos, la

rentabilidad y la gestión de información. A continuación analizaremos cada uno de

estos puntos, explicándolos en relación al contexto planteado, el implementar un

sistema de publicidad vía Bluetooth.

Ahorro de recursos.- Obviamente este punto se ve reflejado en muchos aspectos al

comparar un sistema de publicidad vía Bluetooth contra una campaña de publicidad

por un medio tradicional. Hablando del aspecto del contenido, nos damos cuenta de

que al no necesitar de volantes o panfletos físicos, los gastos generados por la

impresión en papel de los mismos, y más aún, el impacto ambiental que recibe a

mediano y largo plazo nuestro ecosistema se ve disminuido considerablemente.

La basura y el mal uso de los recursos naturales se han

convertido en un terrible problema que está contaminando los

recursos naturales y afectando negativamente al ecosistema y a

la humanidad. La basura aparte de contaminar el ambiente,

dar mal aspecto y producir malos olores, es también foco de

infección y lugar de reproducción de bacterias, hongos y otros

Page 34: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

34

microorganismos, además es la fuente alimenticia y de

reproducción para cientos de roedores los cuales son portadores

de otros organismos los cuales son a su vez portadores de

vectores para ciertas enfermedades perjudiciales para el

hombre.[2]

Así como el contenido, también tenemos el aspecto de la distribución, un aspecto que

en los ejemplos de marketing tradicional representa la carga operativa sobre el talento

humano de la empresa y obviamente, el pago de los honorarios del mismo. Un talento

humano que podría muy bien ser utilizados en otras tareas u operaciones que

requieran un nivel intelectual un tanto superior, asignando las tareas de distribución a

la tecnología, aprovechando al máximo los recursos de la empresa.

Rentabilidad.- Como es de esperarse, la ejecución óptima de una campaña de

publicidad, se traduce en rentabilidad. Cuando un cliente recibe satisfactoriamente el

mensaje que le quiere comunicar una marca, una firma o una empresa en general, se

inicia una relación con la misma, una relación que con la suma de un buen servicio y

una compra agradable, crea un nivel de fidelidad que puede resultar incluso en una

campaña de publicidad hacia sus conocidos, sin costo extra para la empresa.

2 Proyecto para Concientización del Reciclaje. ESPOL. http://www.dspace.espol.edu.ec/bitstream/12

3456789/6948/2/Indice,%20Anexos%20y%20conclusiones.pdf

Page 35: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

35

Como un claro ejemplo de esto, a principios del año 2007, Microsoft decidió poner en

práctica la publicidad vía Bluetooth para dar a conocer al público su nuevo sistema

operativo para móviles (Windows Mobile); desde algunas lonas gigantes instaladas en

lugares estratégicos de Madrid, se envió contenido multimedia hacia 100.000

dispositivos móviles compatibles aproximadamente.

Creas un vínculo más directo con el cliente y, además, tienes un

conocimiento mucho más preciso de la rentabilidad de tu

inversión publicitaria.[3]

Al hablar de rentabilidad, no se puede evitar tocar el punto de la inversión, lo que

normalmente se suele presentar como alternativas para lograr una rentabilidad alta, se

caracteriza por su elevado costo de inversión. En el caso de la publicidad vía

Bluetooth, esto es relativo. Si bien en el mercado internacional existen appliances

dedicados para el envío de contenido vía Bluetooth, que de acuerdo al número

máximo de conexiones que pudiere manejar simultáneamente, pueden llegar a

cotizarse por algunos cientos de dólares, la idea que este proyecto plantea, es

efectivamente, el implementar un prototipo de sistema de publicidad vía Bluetooth,

montado sobre una pc de escritorio con el sistema operativo Windows. Es decir, la

única inversión que una empresa tendría que tomar sería el licenciamiento del

software y la adquisición de una terminal Bluetooth USB.

3 Rodrigo Martínez. Director de Marketing Corporativo. Microsoft. http://proximidad-bluetooth.es/Ne

ws.aspx?newsId=01

Page 36: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

36

Gestión de información.- Como tercer punto, tenemos a uno de los más importantes,

porque: ¿para qué sirven los sistemas informáticos sino para procesar y generar

información?

Este caso no es la excepción, además de todas las ventajas destacadas en puntos

anteriores, el sistema también nos permitirá llevar un conteo por ejemplo, de todos los

dispositivos detectados durante un día o durante una campaña, de ese número,

cuántos aceptaron un contenido específico, etc.

A simple vista, ésta información puede parecer una tanto irrelevante, pero desde el

punto de vista de un funcionario administrativo, puede representar el conocer qué

contenido o tipo de contenido es el más aceptado por las personas, se puede conocer

los gustos e intereses de un determinado segmento de clientes, etc. Hablar de este

tipo de información nos acerca un poco más al fondo del asunto y la ventaja de hecho,

que es el facilitar la toma de decisiones.

Este tipo de publicidad ofrece una gran oportunidad de negocio

porque puedes segmentar a los clientes atendiendo a criterios

geográficos, temporales e incluso de perfil sociocultural: quién

pasa, por dónde pasa, a qué hora, con qué tipo de móvil.[4]

4 Mercedes Fernández. Gerente de Innovación. Telefónica. http://proximidad-bluetooth.es/News.aspx?

newsId=01

Page 37: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

2 CAPÍTULO II

MARCO TEÓRICO

Page 38: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

38

2.1 ANTECEDENTES DEL ESTUDIO

El desarrollo de aplicaciones en el ámbito de la comunicación inalámbrica para

dispositivos de corto alcance no se encuentra tan explotado en el Ecuador como en

otros países del mundo, ni siquiera comparándolo con otros de Latinoamérica.

Ésta puede ser una razón por la cual no se encuentran suficientes fuentes de

información afines en medios locales y por lo que, en su defecto, se ha tenido que

llevar esta investigación a partir de información y bibliografía de aspectos

específicos, tales como: el marketing, el protocolo de comunicación Bluetooth, el

lenguaje de programación Java, etc. Para lograr así, modelar y definir poco a poco

una idea combinada de lo que vendría a ser la nueva publicidad de proximidad vista

desde un aspecto tecnológico, detectando los posibles recursos necesarios para su

aplicación y las numerosas ventajas que se puedan llegar a alcanzar.

2.2 FUNDAMENTACIÓN TEÓRICA

2.2.1 El Marketing

Muchos autores coinciden en que el origen del marketing se remonta a los inicios de

la propia humanidad, basándonos en la idea del intercambio de bienes y servicios que

siempre ha existido.

Page 39: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

39

A manera de ejemplo, podemos señalar cómo las actividades de marketing se

llevaban a cabo y se aplicaban al momento de comercializar los libros durante el siglo

XV. Según Rassuli, como uno de los autores del libro Periodization in Marketing

History (Periodización en la Historia del Marketing), desde esa época los editores de

libros que se desenvolvían en el mercado inglés estaban obligados a buscar sus nichos

de mercado, diseñar su producto y adaptar sus herramientas y recursos (lo que se

conoce con el nombre de marketing mix) para ajustarse a las necesidades del

mercado, realizando tareas muy parecidas a lo que se hace hoy en día. Deseaban

niveles de venta altos y sabían que para ello debían concentrar su atención en el tipo y

naturaleza de los consumidores y de los competidores.

A continuación se cita un concepto más elaborado de marketing:

Es una filosofía de dirección de marketing según la cual el logro

de las metas de la organización depende de la determinación de

las necesidades y deseos de los mercados meta y de la

satisfacción de los deseos de forma más eficaz y eficiente que los

competidores.[5]

Como se ha visto, se puede decir que el marketing es una forma de actuar que adopta

una empresa, y dicta que se deben encontrar las necesidades y tendencias de los

clientes y satisfacerlas, sólo así se asegura lograr las metas de la organización,

generalmente niveles altos de ventas, que a su vez generen una gran utilidad y

5 Philip Kotler, Gary Armstrong. Fundamentos de Marketing. http://www.marketing-free.com/articulos

/concepto-marketing.html

Page 40: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

40

beneficios para la compañía. Esta filosofía debe ser adoptada por todas las áreas de la

empresa y no solo por el Departamento de Marketing.

Basándonos en el mismo texto de Kotler y Armstrong, se debe hacer hincapié en la

diferencia que existe entre el concepto de marketing y el concepto de venta, ya que al

contrario de lo que se podría llegar a pensar, están en contextos completamente

diferentes.

Según ellos, el concepto de venta "adopta una perspectiva de adentro hacia

afuera. (Por tanto), el punto de partida es la fábrica y requiere de muchas ventas

y promoción para obtener ventas rentables".[6]

Por otra parte, la idea de marketing "adopta una perspectiva de afuera hacia

adentro. (Por tanto), el punto de partida es un mercado bien definido y el

enfoque es hacia las necesidades del cliente. Así, bajo el concepto de marketing,

la orientación hacia el cliente y el valor son el camino que lleva a las ventas y las

utilidades".[7]

6 Philip Kotler, Gary Armstrong. Fundamentos de Marketing. http://www.marketing-free.com/articulos

/concepto-marketing.html 7 Philip Kotler, Gary Armstrong. Fundamentos de Marketing. http://www.marketing-free.com/articulos

/concepto-marketing.html

Page 41: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

41

2.2.1.1 El marketing de Proximidad

Al escuchar la expresión “Marketing de Proximidad” muy probablemente se nos

venga a la mente un concepto moderno y tecnológico, tal vez que conjugue algún tipo

de comunicación no físico ni presencial con el concepto que conocemos de

marketing.

Esto sería caer en un error muy común, ya que a diferencia de lo que se pueda creer,

el marketing de proximidad también es un concepto plenamente conocido y aplicado

desde hace ya muchos años.

El marketing de proximidad hace referencia cualquier modelo de marketing en el cual

se necesite acercarse o “aproximarse” hacia el cliente potencial para poder inducirle

el aviso o promoción. Entre los modelos de marketing de proximidad más conocidos

tenemos: la entrega de volantes, folletos, material POP (cualquier artículo obsequiado

al cliente que le ayude a recordar la empresa o firma de manera permanente).

Uno de los principales objetivos del marketing de proximidad es el de llegar al cliente

en un lugar y momento preciso, para poder de esta manera, realizar publicidad de una

manera más eficiente y segmentada.

Page 42: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

42

2.2.1.2 El nuevo Marketing de Proximidad

En una sociedad en que los mecanismos clásicos de publicidad

están obsoletos, el marketing de proximidad permite maximizar

la calidad y la cantidad de los impactos, ya que son los propios

usuarios los que van a buscar la interacción con la marca

anunciante.[8]

Un concepto un poco más actualizado y acorde a nuestro presente tecnológico nos

indica que el marketing de proximidad es:

La distribución inalámbrica localizada de contenido

publicitario asociado a un determinado lugar. Las

transmisiones pueden ser recibidas por las personas en ese

lugar siempre y cuando lo deseen y tengan el equipo necesario

para hacerlo.[9]

Es precisamente bajo esta nueva idea que la tecnología conocida como Bluetooth

comienza a reemplazar rápidamente a cada uno de los modelos descritos

anteriormente. Esta tecnología es por mucho, la más adecuada para este tipo de

comunicación o distribución de contenido, ya que se encuentra ampliamente

soportada por la mayoría de equipos celulares, equipos de reproducción multimedia

portátiles, consolas portátiles de videojuegos, etc.

8 Redacción Empresa MensajeAzul. Marketing de Proximidad. http://www.marketingdeproximidad.es/

index.php?option=com_content&task=view&id=13&Itemid=34 9 Traducido de: Redacción Wikipedia.org. Proximity Marketing. http://en.wikipedia.org/wiki/Proximi

ty_marketing

Page 43: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

43

En Europa un 90% de la población dispone de un teléfono

móvil. De éstos, más del 75% cuentan con la tecnología

Bluetooth para establecer comunicaciones inalámbricas de

proximidad.

Cada día recibimos 2.000 impactos publicitarios no deseados, de

los que retenemos apenas un 0,5% En el caso del marketing de

proximidad, el usuario es el que decide interactuar con las

marca.[10

]

Un estudio más a fondo referente a esta tecnología, revisando sus principales

características y aspectos, será abordado más adelante.

Esta manera de asociar la tecnología difundida actualmente con la actividad misma de

la distribución de publicidad permite alcanzar rápidamente resultados efectivos, sin

altos costes de implementación y ejecución como puede resultar al trabajar con

modelos anticuados de marketing de proximidad.

Ventajas del marketing de proximidad

Entre las principales ventajas que se obtienen al implementar una solución de este

tipo tenemos las siguientes.

1. Segmentación y localización.- Este tipo de marketing permite delimitar

nuestro objetivo (el público en general o clientes potenciales) ya que está

compuesto por un componente de distribución con una localización específica

y estática durante el tiempo que se considere necesario.

10

Redacción Empresa MensajeAzul. Marketing de Proximidad. http://www.marketingdeproximidad.es

/index.php

Page 44: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

44

2. Es permisivo.- Antes de que el cliente potencial pueda comenzar a recibir el

contenido de la publicidad, éste debe aceptar la transferencia primero, si el

cliente no acepta el contenido, no se le debe volver a insistir.

3. Calidad de cada impacto.- Los clientes irán tras las marcas que consume,

psicológicamente se hace que el usuario busque por sí mismo el contacto con

la publicidad, y por ende, con la firma, maximizando automáticamente los

niveles de fidelidad.

4. Interactividad.- La tecnología implementada permite que el cliente interactúe

con sistemas que si bien requieren un desarrollo un poco más elaborado,

pueden llegar a tener resultados extraordinarios, reforzando la calidad del

impacto recibido.

5. Flexibilidad.- La modificación, configuración y eliminación de los mensajes

y el contenido a enviar se realiza de una manera flexible e inmediata.

6. Costo reducido.- El tipo y formato del contenido multimedia enviado sólo es

restringido por la capacidad tecnológica del dispositivo que lo receptará, sin

costo adicional al de implementación por envío de mensaje.

Page 45: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

45

Desventajas del marketing de proximidad

Entre los posibles inconvenientes que puedan surgir al montar una campaña de

Marketing de Proximidad, encontramos los descritos a continuación.

1. Aunque cada día es mayor el número de personas que posee un teléfono

celular, no todos poseen un equipo con las características tecnológicas

necesarias.

2. Muchos usuarios con un sentido de la prevención relativamente alto, pasean

por las calles con sin tener activado el receptor Bluetooth de sus dispositivos.

3. Una práctica del punto anterior puede derivar en que el usuario rechace los

mensajes de contenido enviados por temor natural a recibir algún virus o

sencillamente a que desconocidos puedan acceder a la información del

dispositivo del usuario.

Una posible solución para los dos últimos puntos expuestos podría ser la publicación

de uno o más afiches en la cercanía del local, o dentro del rango de alcance de la

antena Bluetooth, que indique que si desea tener acceso a promociones u ofertas

exclusivas, encienda el receptor Bluetooth de su terminal y acepte las solicitudes de

envío de contenido que le puedan llegar.

Page 46: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

46

Al estar hablando de Marketing de Proximidad, sobre todo al orientar dicho concepto

hacia las tecnologías actuales, como lo es por ejemplo el Bluetooth, muchas personas

pensarán que esta metodología tiende muy fácilmente a convertirse en campañas de

spam, o campañas sofocantes de contenido hacia usuarios que no desean recibir

notificaciones cada minuto ofreciendo productos o servicios que resultan de su

indiferencia total. Este aspecto tan importante de la publicidad, lo veremos a

continuación.

2.2.1.3 Marketing Permisivo vs Marketing Interruptivo

El Permission Marketing o Marketing Permisivo, por su significado en español, es un

concepto relativamente moderno, acuñado en el ámbito del e-marketing por Seth

Godin a través del libro de su autoría que lleva el mismo nombre. Se trata

básicamente de obtener el permiso del cliente antes de avanzar hacia el siguiente paso

en el proceso de difusión de publicidad, o en el proceso de venta mismo.

Este concepto se nota ampliamente aplicado en todo lo que se refiere a publicidad vía

internet, por ejemplo: es muy común que los sitios web actuales, durante el proceso

de registro de usuarios o clientes potenciales pregunte si el cliente desea recibir

noticias acerca de productos nuevos o promociones vía correo electrónico.

Los comerciantes saben que el uso de ésta manera de realizar publicidad permite una

utilización mucho más eficiente de los recursos, ya que solamente se invierte en

Page 47: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

47

material publicitario con los clientes potenciales que están interesados en el producto

o servicio o simplemente con aquellos que si deseen prestarnos atención.

El concepto de Marketing Interruptivo es completamente opuesto al del Marketing

Permisivo, y es justamente al que la mayoría de clientes estamos acostumbrados. Un

ejemplo claro de este tipo de marketing es la publicidad que recibimos por televisión,

es decir, nos encontramos disfrutando de nuestro programa favorito cuando de

repente nos inundan con comerciales de distintos productos, en algunos casos afines a

la idea del programa televisivo y en otros casos, no.

Nosotros no interrumpimos al posible comprador, sino que nos

acercamos como una solución a un problema que tenga ahora,

generamos confianza y autoridad mediante contenido o

productos (ebooks, plugins, etc) de calidad, gratis y luego

pedimos “permiso” mediante una suscripción voluntaria a un

newsletter (o algún otro medio) para enviar más contenido y a

su debido momento también ofertas.

La gran diferencia es que ahora es el posible cliente el que está

interesado en seguir escuchando sobre nosotros, no estrellamos

un producto que no le interesa en su cara, sino que él nos pide

más información sobre nuestro producto o servicio.[11

]

Un sistema de envío de publicidad vía Bluetooth, por su diseño de implementación y

funcionamiento, es muy susceptible a convertirse en un distribuidor de olas de

información que los clientes no deseen obtener, incluso pudiendo llegar a confundirse

con spam.

11

Guillermo Pareja. Permission Marketing vs. Interruption Marketing. http://guillermopareja.com/tags/

marketing-permisivo

Page 48: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

48

Es por esa razón que en el momento de la implementación de un sistema de

publicidad vía Bluetooth se debe tener la debida consideración de los aspectos del

Marketing Permisivo, sino puede hacer que la empresa reciba un impacto sumamente

negativo por parte de los clientes, obteniendo resultados muy perjudiciales en vez de

las enormes ventajas que se podrían obtener.

Los anunciantes van a tener que aprender a transmitir

mensajes con frecuencia y bajo costo para que puedan hacer

frente a la creciente competencia por la atención del

consumidor.[12

]

Godin y sus colegas están trabajando para convencer a algunas

de las empresas más poderosas del mundo para reinventar su

relación con sus clientes. Su argumento es tan marcado como

radical: La publicidad simplemente no funciona tan bien como

antes, en parte porque hay mucho de ella, en parte porque la

gente ha aprendido a ignorarla, en parte porque el crecimiento

de la Red permite que las empresas puedan ir más allá.[13

]

Entonces, ¿de qué manera podemos evitar caer en un marketing interruptivo cuando

tenemos un sistema que envía contenido multimedia a cualquier dispositivo que

detecta en un radio a la redonda? Pues la respuesta a esta inquietud no es tan

complicada de implementar como se podría pensar en un principio.

12

Traducido de: Robert Tercek. SVP Digital Media. Sony Pictures Entertainment. http://www.sethgodi

n.com/permission/ 13

Traducido de: William C. Faylor. Editor Fundador. Fast Company. http://www.sethgodin.co

m/permission/

Page 49: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

49

Lo que se debe hacer es establecer dentro de la funcionalidad como mínimo los dos

aspectos detallados a continuación.

1. Una solicitud de envío de contenido, que será enviada a cada cliente antes de

iniciar la transferencia de la publicidad.

2. Un tiempo de baneo o restricción a para cada cliente, luego de que haya

recibido satisfactoriamente la publicidad o luego de que haya rechazado la

solicitud de envío.

2.2.2 Tecnología Bluetooth

Es una especificación de transmisión de información, especialmente pensada para

Redes de Área Personal Inalámbricas (WPANs, Wireless Personal Area Network).

Permite conexiones de voz y datos entre dispositivos a un bajo coste y corto alcance.

Debido a sus características, la tecnología Bluetooth es la más adecuada para la

conexión entre dispositivos portátiles como consolas portátiles de videojuegos,

cámaras fotográficas digitales, etc.

Uno de los campos en donde se ha masificado su producción con más fuerza es

efectivamente el de los teléfonos celulares. En la actualidad el 90% de los

dispositivos móviles se fabrica con una antena Bluetooth integrada, permitiendo así

aminorar sus costos propios de producción así como aumentar significativamente la

Page 50: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

50

funcionalidad de dichos terminales celulares al poner a disposición del público un

canal de transferencia de información gratuito entre los dispositivos.

2.2.2.1 Objetivos

A continuación nombraremos algunos de los objetivos de esta especificación:

1. Facilitar en gran manera la comunicación entre dispositivos móviles y fijos.-

Hasta la creación de esta tecnología, no existía ninguna otra que permitiera

una transferencia cómoda de datos de una manera inalámbrica entre

dispositivos móviles.

2. Suprimir por completo el uso de cables durante la comunicación.- Tecnologías

anteriores, como la de rayos infrarrojos (IR), cuyas características

estudiaremos y compararemos más adelante, aunque también eran

inalámbricas, requerían una alineación directa entre los dispositivos,

reduciendo en gran manera la usabilidad de la misma.

3. Permitir la transferencia de datos y audio entre terminales portátiles.- Además

de poder transmitir datos, esta tecnología también fue diseñada para transmitir

audio con una calidad aceptable, un ejemplo de esto son los conocidos manos-

libres Bluetooth.

Page 51: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

51

2.2.2.2 Breve reseña histórica

Todo inicia durante el transcurso del año de 1994, cuando la compañía, en ese

entonces llamada Ericsson, decide comenzar una investigación con una idea en

mente: una interfaz vía radio, de bajo costo y de bajo consumo eléctrico, para poder

integrarla en sus dispositivos y así lograr una interconexión gratuita entre los mismos

y otros dispositivos heterogéneos, como por ejemplo los manos-libres, eliminando

por completo la utilización de cables.

Esta investigación partía de un largo estudio acerca de multicomunicadores

conectados a una red celular que desembocó en un enlace de radio de corto alcance

bautizado como MC Link. Conforme se iba avanzando en esta investigación, ya se

podían identificar sus futuras ventajas, una de ellas era precisamente que se basaba en

un chip de radio considerado relativamente barato para la funcionalidad que podía

ofrecer.

Como era de esperarse, algunas empresas líderes en comunicaciones y microchips,

comenzaron a despertar su interés por dicha tecnología y llegaron a la conclusión de

que el futuro éxito de la misma dependía de su velocidad de crecimiento y

masificación entre los dispositivos móviles del mercado. Esta fue uno de los

principales motivos por los que en el año de 1998, se creó un Grupo Especial de

Interés en Bluetooth (SIG: Bluetooth Special Interest Group).

Este grupo formado por: dos líderes en el mercado de las telecomunicaciones y

dispositivos móviles, dos líderes en el mercado de las computadoras y un líder en el

Page 52: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

52

mercado de la fabricación de microchips; tenía como principal objetivo establecer un

estándar para una interfaz de comunicación y un software base y común para que

todos los dispositivos que contasen con dicha tecnología indiferentemente de su

fabricante, fueran cien por ciento compatibles.

Con la finalidad de que dicha especificación cumpliera con la premisa de que el

sistema debería operar en cualquier parte del mundo, se determinó que se necesitaría

una banda de frecuencia abierta para cualquier sistema de radio que funcionara sin

importar el lugar del planeta en donde nos encontremos. Este fue el principal motivo

por el cual se especificó que trabajaría sobre la banda Médico-Científica Industrial

(ISM: Industrial, Scientific and Medical), que opera sobre los 2.45 GHz. Esto

implicaba también que se debía tener en cuenta las posibles interferencias que

pudieran ocurrir durante la comunicación por la banda mencionada.

Para cubrir esta necesidad, la tecnología Bluetooth implementó la técnica de Saltos de

Frecuencia (FHSS, Frequency Hopping Spread Spectrum), que consiste básicamente

en dividir la banda en 79 canales, con un ancho de banda de 1 MHz cada uno y

realizar 1600 saltos pseudoaleatorios por segundo entre los canales durante la

comunicación. De esta manera se logra que el ancho de banda transitorio sea bastante

pequeño pero así también una gran inmunidad ante las interferencias.

Page 53: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

53

En la actualidad el SIG cuenta con miembros tales como

Motorola, 3Com, Lucent y Microsoft, el respaldo de 1900

empresas de tecnología y 2000 empleados (delegados en el

Congreso convocado por el SIG) de otras tantas empresas que

investigan productos y servicios con aplicaciones Bluetooth.[14

]

2.2.2.3 Clasificación

Los dispositivos Bluetooth en la actualidad se clasifican en tres grupos de acuerdo a

su potencia neta de transmisión. Este aspecto no impide desde ningún punto de vista

la compatibilidad de comunicación entre dispositivos Bluetooth de distinta clase.

CUADRO NO. 01

CLASIFICACIÓN DE LOS DISPOSITIVOS BLUETOOTH

Clase Potencia Máxima

Permitida (mW)

Potencia Máxima

Permitida (dBm)

Rango

(aproximado)

Clase 1 100 mW 20 dBm ~ 100 metros

Clase 2 2.5 mW 4 dBm ~ 10 metros

Clase 3 1 mW 0 dBm ~ 1 metro Elaboración: Redacción Wikipedia

Fuente: Wikipedia.org

En la mayoría de los casos, la cobertura efectiva de un

dispositivo de clase 2 se extiende cuando se conecta a un

transceptor de clase 1. Esto es así gracias a la mayor

sensibilidad y potencia de transmisión del dispositivo de clase 1,

es decir, la mayor potencia de transmisión del dispositivo de

clase 1 permite que la señal llegue con energía suficiente hasta el

de clase 2. Por otra parte la mayor sensibilidad del dispositivo

de clase 1 permite recibir la señal del otro pese a ser más

débil.[15

]

14

Humberto Becerra López. Redacción Revista GiGA MasterMagazine.

http://www.mastermagazine.info/articulo/3125.php 15

Redacción Wikipedia.org. Bluetooth. http://es.wikipedia.org/wiki/Bluetooth

Page 54: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

54

También podemos clasificar a los dispositivos Bluetooth de acuerdo a su ancho de

banda.

CUADRO NO. 02

ANCHO DE BANDA DE LOS DISPOSITIVOS BLUETOOTH

Versión Ancho de Banda

Versión 1.2 1 Mbit/s

Versión 2.0 + EDR 3 Mbit/s

UWB Bluetooth

(propuesto) 53 – 480 Mbit/s

Elaboración: Redacción Wikipedia

Fuente: Wikipedia.org

El 28 de marzo de 2006, el Bluetooth SIG anunció su intención

de utilizar Ultra-Wideband/MB-OFDM como capa física para

futuras versiones de Bluetooth.

La integración de UWB creará una versión de la tecnología

Bluetooth con opción a grandes anchos de banda. Esta nueva

versión permitirá alcanzar los requisitos de sincronización y

transferencia de grandes cantidades de datos así como de

contenidos de alta definición para dispositivos portátiles,

proyectores multimedia, televisores y teléfonos VOIP.

Al mismo tiempo, la tecnología Bluetooth continuará

satisfaciendo las necesidades de aplicaciones de muy bajo

consumo como ratones, teclados o auriculares mono

permitiendo a los dispositivos seleccionar la capa física más

apropiada para sus requisitos.[16

]

2.2.2.4 Pila de protocolos

La tecnología Bluetooth se soporta en una bien definida Pila de Protocolos

clasificados en dos grupos. El primer grupo denominado de protocolos específicos

16

Redacción Wikipedia.org. Bluetooth. http://es.wikipedia.org/wiki/Bluetooth

Page 55: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

55

está implementado por todos aquellos protocolos propios de Bluetooth, y el segundo

grupo se encuentra conformado por todos aquellos protocolos adoptados e

implementados de otras especificaciones.

GRÁFICO NO. 01

PILA DE PROTOCOLOS BLUETOOTH POR GRUPO

Elaboración: Fausto Almeida

Fuente: Desarrollo de Aplicaciones Bluetooth Utilizando el API Java JSR-82.

El gráfico No. 01, nos detalla la pila de protocolos en la que se basa Bluetooth,

mostrándonos en un tono verde los protocolos pertenecientes al grupo de los no

específicos y en un tono azul los protocolos específicos.

Page 56: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

56

Otra ilustración que podemos ver, nos muestra cómo estos protocolos interactúan en

el momento de su funcionamiento.

GRÁFICO NO. 02

PILA DE PROTOCOLOS BLUETOOTH

Elaboración: Fausto Almeida

Fuente: Marketing de Proximidad y OpenSource.

A continuación estudiaremos los más importantes de ellos a fin de conocer las

principales funciones de cada componente.

Page 57: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

57

2.2.2.4.1 RF

El componente de radiofrecuencia define los requerimientos para transceptor

Bluetooth que opera en la banda ISM de 2.4 GHz.

2.2.2.4.2 Baseband

Es la banda de comunicación más baja, implementa el canal físico real. Tiene como

principal característica la utilización de la técnica de Saltos de Frecuencia descrita

anteriormente. También es la encargada de controlar la sincronización entre los

dispositivos Bluetooth; así como para el reconocimiento, control de flujo y

caracterización de la carga útil.

En general, describe las especificaciones del Controlador de Enlace Bluetooth (BLC,

Bluetooth Link Controller), que lleva a cabo los protocolos de enlace para la banda

base además de otras rutinas de bajo nivel. Un dispositivo Bluetooth puede manejar

distintos estados de conexión que serán descritos y estudiados más adelante.

Durante la etapa de establecimiento de la conexión, existen dos casos que se pueden

dar:

1. Que el dispositivo conozca los parámetros del otro: Continuará con el proceso

de paginación (Paging).

2. Que el dispositivo no conozca al otro: Continuará con el proceso de

inspección (Inquiry) y luego el proceso de paginación (Paging).

Page 58: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

58

2.2.2.4.3 Link Manager Protocol (LMP)

Es el protocolo de gestión de enlace, y es usado por los gestores de enlace de cada

dispositivo (de cada lado) para el establecimiento y control del enlace.

Es el encargado de la autenticación y configuración del enlace, así como para el

manejo de los modos y consumo de potencia. El control del canal consiste en:

1. El dispositivo maestro siempre es aquel que inicia la conexión.

2. El dispositivo maestro de la conexión es el encargado de la gestión del canal,

se maneja bajo un sistema de encuestas (polling) hacia el dispositivo esclavo.

2.2.2.4.4 Host Controller Interface (HCI)

Es la interfaz del controlador de servidor y provee de una interfaz de comandos para

el controlador de enlace y el gestor de enlace, así como también de acceso hacia el

estado del hardware y los registros de control.

2.2.2.4.5 Logical Link Control And Adaptation Protocol (L2CAP)

El protocolo de control y adaptación del enlace lógico soporta la multiplexación de

los protocolos de capas superiores, con el objetivo de trabajar con varios protocolos

sobre un mismo canal de banda base.

Es el encargado de la segmentación y ensamblaje de los paquetes enviados y

recibidos en el dispositivo emisor y en el dispositivo receptor respectivamente.

Page 59: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

59

Además transmite la información referente a la calidad de servicio de la conexión

actual.

2.2.2.4.6 Audio

La capa de audio es una capa especial que se utiliza exclusivamente para transmitir

audio sobre Bluetooth. Como muestra el Gráfico No. 03, las transmisiones de audio

no pasan por la capa L2CAP, sino directamente después de haber establecido la

conexión.

2.2.2.4.7 RFCOMM

Este componente ofrece la emulación de un puerto serie inalámbrico sobre el

protocolo L2CAP. Ofrece principalmente capacidades de transporte a servicios en las

capas superiores que por definición usan una línea serial como mecanismo nativo de

transporte.

2.2.2.4.8 Service Discovery Protocol (SDP)

El protocolo de detección de servicios es usado por las aplicaciones clientes

Bluetooth para descubrir qué servicios son proporcionados o están disponibles en un

dispositivo Bluetooth (servidor). También ofrece un mecanismo para detectar las

características de los servicios disponibles.

Page 60: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

60

2.2.2.4.9 Telephony Control Specification (TCS)

El control de telefonía binario es un protocolo cuya principal tarea es la señalización

y control de llamadas de datos, así como para el establecimiento o finalización de las

mismas.

A continuación revisaremos las funciones de algunos componentes específicos de la

pila.

2.2.2.4.10 Attention Commands (AT)

La especificación Bluetooth soporta comandos AT para el control de telefonía a

través de RFCOMM, su característica de emulación de puerto serial.

2.2.2.4.11 Point to Point Protocol (PPP)

Debido a que este protocolo es orientado a paquetes, necesita implementar un flujo

serial para poder convertir un flujo de paquetes de datos en una corriente de datos

seriales, para ello se apoya también en RFCOMM.

2.2.2.4.12 User Datagram Protocol / Transmission Control Protocol – Internet

Protocol (UDP/TCP-IP)

La implementación de estos protocolos permiten a las unidades Bluetooth conectarse

a Internet a través de otras unidades conectadas.

Page 61: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

61

2.2.2.4.13 Wireless Application Protocol (WAP)

El protocolo de aplicaciones inalámbricas es una especificación que se apoya en

muchas tecnologías de conexión inalámbricas para ofrecer a los dispositivos móviles

conexión a internet.

2.2.2.4.14 Object Exchange Protocol (OBEX)

Se trata de un protocolo muy similar a HTTP, funciona a nivel de aplicación. Al igual

que este último, el protocolo OBEX se basa en tramas compuestas por cabeceras de

mensaje y de un cuerpo de mensaje (opcional). Además los mensajes de respuesta

que el servidor indica poseen un código de respuesta indicando el éxito o error de la

transmisión. Este protocolo usa RFCOMM como principal capa de transporte.

2.2.2.5 Perfiles Bluetooth

Un perfil Bluetooth es una especificación de un nivel superior que describen

comportamientos generales y estandarizados para lograr su utilización de manera

unificada entre distintos dispositivos.

Los perfiles Bluetooth permiten que varios dispositivos Bluetooth con diferentes

capacidades puedan cooperar e interactuar. Cada perfil es un caso de uso que define

una funcionalidad para un propósito específico. Por ejemplo, si se desea dar una orde

de impresión de un documento desde un dispositivo Bluetooth hacia la impresora,

Page 62: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

62

ambos dispositivos deben implementar el perfil básico de impresión (BPP, Basic

Printing Profile). O, si se desea sincronizar la lista de contactos entre un PDA y la PC,

ambos dispositivos deben implementar necesariamente el perfil de sincronización

(SYP, Synchronization Profile).

GRÁFICO NO. 03

PRINCIPALES PERFILES BLUETOOTH

Elaboración: Fausto Almeida

Fuente: Bluetooth SGI.

Así como podemos observar, existen una cantidad considerable de perfiles Bluetooth,

cada uno con objetivos específicos que nombraremos a continuación.

Page 63: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

63

2.2.2.5.1 Perfil de Telefonía Inalámbrica (CTP)

Describe una funcionalidad de un teléfono inalámbrico conectado a su base por medio

de algún enlace inalámbrico Bluetooth.

2.2.2.5.2 Perfil de Acceso Genérico (GAP)

Es la base sobre la cual se apoyan el resto de perfiles especializados y describe los

pasos que deben seguir dos dispositivos Bluetooth para lograr una conexión exitosa.

2.2.2.5.3 Perfil de Detección de Servicios (SDP)

Es comúnmente utilizado por las aplicaciones cliente Bluetooth para averiguar los

servicios que posee o tiene disponibles u servidor Bluetooth. En el caso de nuestro

prototipo, el sistema de envío de publicidad se convierte en un cliente Bluetooth que

tratará de encontrar en los dispositivos que detecte, si poseen o no un servicio de

recepción de datos activo.

2.2.2.5.4 Perfil de Intercambio de Objetos

Por último tenemos el perfil de intercambio de objetos que utiliza el protocolo OBEX

para poder establecer un tipo de comunicación cliente-servidor, un tanto

independiente. Bajo este perfil, es el cliente quién realiza una solicitud para iniciar

una sesión de transferencia de objetos con otro dispositivo.

Page 64: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

64

Dentro de este perfil, el servicio que nos interesa y el que debemos utilizar para un

sistema de marketing de proximidad es el de poder inyectar un objeto de datos sobre

un dispositivo remoto (OPP, Object Push Profile).

2.2.2.6 Comportamiento de un Dispositivo Bluetooth

GRÁFICO NO. 04

ESTADOS DE UN DISPOSITIVO BLUETOOTH

Elaboración: Fausto Almeida

Fuente: Marketing de Proximidad y OpenSource.

Cuando un Dispositivo A empieza a inspeccionar qué otros dispositivos se encuentran

a su alcance, qué direcciones Bluetooth poseen y con qué servicios disponibles cuenta

cada dispositivo encontrado, se dice que el Dispositivo A está en un estado de

inspección (Inquiry). Una vez armada la piconet se debe establecer un canal de

comunicación. Un dispositivo de la piconet debe asumir el rol de Maestro para poder

controlar el tráfico de dicho canal. Dentro de una piconet, sólo puede existir un

Page 65: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

65

dispositivo con el rol de Maestro, es decir que todos los dispositivos restantes

asumirán el rol de Esclavos.

Cuando un dispositivo que desee establecer una conexión con otro dispositivo debe

entrar en el estado de paginación (Paging). El dispositivo entrará al estado de

conectado (Connected) cuando los datos se comiencen a transmitir efectivamente con

otro dispositivo Bluetooth. Una vez que la transferencia de datos ha finalizado, los

dispositivos entraran en estado de espera (Standby) otra vez. O en su defecto, podrán

entrar en cualquiera de los tres estados de espera pero con ahorro de energía.

1. SNIFF.- Durante este estado, tanto el maestro como el esclavo se pondrán de

acuerdo para enviar y recibir información en slots de tiempo determinado.

2. HOLD.- Durante este estado, el dispositivo permanecerá inactivo sin importar

que llegue o no información. Se maneja con un parámetro que representa el

tiempo que el dispositivo permanecerá así.

3. PARK.- Durante este estado, el dispositivo deja de ser un miembro activo de

la piconet, pero se mantiene a escucha de cualquier evento para poder

responder.

2.2.3 Otras tecnologías de proximidad

En el punto anterior abarcamos las principales características técnicas de la tecnología

Bluetooth como principal opción para la implementación de un sistema de marketing

de proximidad. Sin embargo también existen algunas tecnologías de proximidad

Page 66: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

66

cuyas características podrían, algún día, permitirles ser candidatas para los sistemas

de envío de publicidad automatizados.

2.2.3.1 WLAN (Wireless Local Area Network – Red inalámbrica de área local )

Esta tecnología, a diferencia de la tecnología Bluetooth, no es invasiva, es decir, que

el usuario debe buscar e ingresar a la red por su propia cuenta. Una implementación

de este tipo de red permite una conexión sencilla de cada dispositivo registrado hacia

internet, si la configuración así lo permite.

Generalmente posee un alcance de 100 metros, sin tomar en cuenta las paredes que

pudieran existir entre el dispositivo conectado y el punto de acceso; si ese fuera el

caso, la distancia máxima de comunicación se vería mermada.

Existen cada vez más dispositivos que cuentan con esta tecnología. Aunque

obviamente aún no superan al total de dispositivos que posee compatibilidad con la

tecnología Bluetooth.

2.2.3.2 UWB (Ultra Wide Band – Banda ultra ancha)

Se lo ve como la próxima generación de la tecnología Bluetooth, ya que trabajará

sobre el mismo protocolo. Aunque tiene pocos metros de alcance, su velocidad de

transferencia supera por mucho a la velocidad con la que se transfieren los archivos

entre dispositivos Bluetooth. UWB maneja velocidades de hasta 480 Mbits/s.

Se planea que UWB sea el sustituto de Bluetooth en lo que respecta a la conexión sin

cables de periféricos al computador.

Page 67: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

67

2.2.3.3 RFID (Radio Frequency IDentification – Identificación por radiofrecuencia)

Esta tecnología se basa en el uso de pequeñas etiquetas electrónicas alojadas en los

dispositivos. A estas etiquetas también se las conoce como RFID tags, y pueden

llegar a tener el tamaño de una moneda de diez centavos de dólar. Debido a que su

capacidad de almacenamiento suele ser muy pequeña y su rango de alcance tan solo

puede ser desde diez centímetros hasta unos cuantos metros, su principal utilidad se la

encuentra en la identificación de artículos de inventarios de grandes empresas

comerciales.

2.2.3.4 Comparación entre las tecnologías de proximidad

A continuación se muestra un cuadro en donde se ven distintos aspectos que

considero necesarios para que una de estas tecnologías pueda servir para sistemas de

marketing de proximidad.

CUADRO NO. 03

COMPARACIÓN ENTRE TECNOLOGÍAS DE PROXIMIDAD

WLAN UWB RFID BLUETOOTH

¿Es necesaria la conexión previa del

nodo a la red? SI NO NO NO

¿Cumple con el promedio de rango

de alcance necesario? (30-40

metros)

SI NO NO SI

Promedio de dispositivos

electrónicos que presentan

compatibilidad con esta tecnología.

MEDIA MUY

BAJA

MUY

BAJA ALTA

Elaboración: Fausto Almeida C.

Fuente: Marketing de Proximidad y OpenSource.

Page 68: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

68

2.2.4 Lenguaje de programación Java

2.2.4.1 Reseña histórica

Java en un lenguaje de programación orientado a objetos que fue creado

aproximadamente en el año 1994 por una pequeña división de Sun Microsystems,

liderada por James Gosling.

Nació con el nombre de Oak, y se desarrolló a partir de C++, con la finalidad de crear

un lenguaje fácil de aprender y utilizar en sistemas empotrados. Por cuestiones de

propiedad intelectual, más tarde cambiaría su nombre a Java.

2.2.4.2 Características

Una de sus principales características es que compila su código con una

independencia total de la arquitectura del microprocesador o del sistema operativo. El

programa generado por su proceso de compilación es un bytecode que es interpretado

por la Máquina Virtual de Java (JVM).

Existe una versión distinta de la Máquina Virtual de Java casi para cada sistema

operativo que se encuentra en el mercado actualmente, incluyendo los sistemas

operativos para dispositivos móviles.

Una aplicación compilada en Java no depende del sistema operativo en que se

encuentre corriendo, sólo de la versión de la JVM que se encuentre instalada en dicho

sistema operativo. Esto les da alas aplicaciones desarrolladas en Java una alta

calificación en el aspecto de la portabilidad.

Page 69: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

69

GRÁFICO NO. 05

PROCESO DE COMPILACIÓN Y EJECUCIÓN DE UNA APLICACÍON JAVA

Elaboración: Fausto Almeida

Fuente: Fausto Almeida

2.2.4.3 Ventajas y desventajas de usar el lenguaje de programación Java

A continuación citamos algunas ventajas expuestas por personal con experiencia en el

desarrollo de aplicaciones con Java.

1. No debes volver a escribir el código si quieres ejecutar el programa en

otra máquina. Un solo código funciona para todos los browsers

compatibles con Java o donde se tenga una Máquina Virtual de Java

(Mac's, PC's, Sun's, etc).

2. Java es un lenguaje de programación orientado a objetos, y tiene todos

los beneficios que ofrece esta metodología de programación.

3. Un browser compatible con Java deberá ejecutar cualquier programa

hecho en Java, esto ahorra a los usuarios tener que estar insertando

"plug-ins" y demás programas que a veces nos quitan tiempo y espacio

en disco.

Page 70: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

70

4. Java es un lenguaje y por lo tanto puede hacer todas las cosas que puede

hacer un lenguaje de programación: Cálculos matemáticos, procesadores

de palabras, bases de datos, aplicaciones gráficas, animaciones, sonido,

hojas de cálculo, etc.

5. Si lo que me interesa son las páginas de Web, ya no tienen que ser

estáticas, se le pueden poner toda clase de elementos multimedia y

permiten un alto nivel de interactividad, sin tener que gastar en paquetes

carísimos de multimedia.[17

]

Así mismo, se exponen algunas desventajas del mismo.

1. Los programas hechos en Java no tienden a ser muy rápidos,

supuestamente se está trabajando en mejorar esto. Como los programas

de Java son interpretados nunca alcanzan la velocidad de un verdadero

ejecutable.

2. Java es un lenguaje de programación. Esta es otra gran limitante, por

más que digan que es orientado a objetos y que es muy fácil de aprender

sigue siendo un lenguaje y por lo tanto aprenderlo no es cosa fácil.

Especialmente para los no programadores.

3. Java es nuevo. En pocas palabras todavía no se conocen bien todas sus

capacidades.[18

]

2.2.4.4 Java para móviles

La distribución de Java más conocida es la J2SE (Java 2 Standard Edition), ésta

distribución contiene todo el API (Application Programming Interface), es decir, el

conjunto de clases y librerías, necesarias para el desarrollo de aplicaciones de

escritorio, sean éstas stand-alone o cliente-servidor.

17

Curso de Java. Lucas Morea. Webmaster. http://www.monografias.com/trabajos/java/java.shtml 18

Curso de Java. Lucas Morea. Webmaster. http://www.monografias.com/trabajos/java/java.shtml

Page 71: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

71

Pero también existe otra distribución de Java destinada al desarrollo de aplicaciones

para dispositivos móviles, llamada J2ME (Java 2 Micro Edition). Ésta distribución

tiene un API un tanto distinto al de J2SE, con el objetivo de que las aplicaciones

desarrolladas en J2ME no tengan ningún tipo de inconveniente al correr en equipos

con una cantidad de memoria mucho más baja que un pc de escritorio y con una

capacidad de procesamiento muy inferior también, características que son comunes

en los dispositivos móviles.

2.2.5 Especificación JSR-82

2.2.5.1 Introducción

No es de expertos saber que uno de los campos en donde se ha desarrollado más

ampliamente la tecnología Bluetooth es efectivamente en el de los dispositivos

móviles, tales como teléfonos celulares, PDAs, teléfonos inteligentes, etc.

Es el mismo caso de las aplicaciones Java diseñadas para este tipo de dispositivos. En

la actualidad la mayoría de teléfonos celulares vienen diseñados para que sean

compatibles y puedan ejecutar sin ningún problema aplicaciones desarrolladas en

J2ME.

JSR-82 es una especificación para J2ME desarrollada por un amplio grupo de

expertos tales como: IBM, Mitsubishi, Research In Motion, Nokia, etc. Y define una

interfaz de programación de alto nivel, que se encarga de encapsular todas las

Page 72: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

72

operaciones de bajo nivel necesarias para establecer comunicación entre dispositivos

Bluetooth.

2.2.5.2 Arquitectura

Todas las clases y librerías que componen ésta especificación se pueden dividir en

tres categorías.

GRÁFICO NO. 06

FUNCIONALIDAD OFRECIDA POR JSR-82

Elaboración: Fausto Almeida

Fuente: Desarrollo de Aplicaciones Bluetooth Utilizando el API Java JSR-82.

2.2.5.2.1 Descubrimiento

Esta funcionalidad encapsula las rutinas necesarias para el descubrimiento del

dispositivo, descubrimiento de los servicios y registro de los servicios.

Page 73: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

73

2.2.5.2.2 Comunicación

Esta funcionalidad encapsula las rutinas necesarias para el establecimiento de las

conexiones entre los distintos dispositivos y el uso apropiado de estas conexiones

para la comunicación entre el Bluetooth y las aplicaciones desarrolladas.

2.2.5.2.3 Gestión de Dispositivos

Esta funcionalidad encapsula las rutinas necesarias para controlar y manejar las

conexiones establecidas en un determinado momento.

2.2.5.3 Paquetes incluidos

La jerarquía de las clases incluidas en la especificación JSR-82 se encuentra

distribuida en dos paquetes, independientes entre sí para su utilización pero

dependientes del paquete de comunicación estándar de JSME.

GRÁFICO NO. 07

ESTRUCTURA DE PAQUETES DE LA API DE JSR-82

Elaboración: Fausto Almeida

Fuente: Desarrollo de Aplicaciones Bluetooth Utilizando el API Java JSR-82.

Page 74: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

74

2.2.5.3.1 El paquete javax.bluetooth

Este paquete provee las funciones necesarias para la detección de dispositivos

Bluetooth remotos, para la detección de cada uno de sus servicios y para la

transferencia de información por medio de flujos de datos (streamings).

2.2.5.3.2 El paquete javax.obex

Este paquete provee las funciones necesarias para la comunicación entre dispositivos

Bluetooth por medio del protocolo de intercambio de objetos (OBEX).

Aunque el pensamiento inicial era definir un API basado en los

perfiles de Bluetooth, el grupo de expertos JSR-82 pensó que el

número de los perfiles de Bluetooth estaría creciendo

constantemente. El grupo de expertos decidió entonces

proporcionar solo el soporte para los protocolos y los perfiles

básicos en lugar de introducir nuevos elementos al API para

cada perfil de Bluetooth. Aunque es difícil predecir las

necesidades de los perfiles futuros de Bluetooth, la esperanza es

que el diseño del JSR-82 permitirá que los perfiles de Bluetooth

sean escritos en el lenguaje de programación Java.[19

]

19

Desarrollo de Aplicaciones Bluetooth Utilizando el API Java JSR-82. Mary Luz Chicangana

Figueroa. Universidad del Cauca.

ftp://jano.unicauca.edu.co/cursos/Electiva_ApliMovil/documentos/java-bluetooth-jidtel.pdf

Page 75: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

75

2.2.6 Librería BlueCove

2.2.6.1 Introducción

Como hemos visto, la especificación JSR-82 fue concebida para trabajar en la

distribución J2ME. Éste gran salto le permite al programador interactuar con el

dispositivo Bluetooth integrado en cualquier entorno en donde se estuviese corriendo

una máquina virtual de Java para J2ME. Esto implica que el API del JSR-82 es

completamente inaccesible desde las aplicaciones J2SE, es decir, que cualquier

aplicación concebida para trabajar en un PC, stand-alone o cliente-servidor, no puede

hacer el uso de la funcionalidad que el JSR-82 nos brinda.

Es aquí en donde entra el proyecto llamado BlueCove, iniciado en el año 2004 por el

laboratorio de investigación de Intel en Cambridge. BlueCove no es otra cosa que una

implementación OpenSource del famoso API de JSR-82 desarrollado en Java. Esta

implementación se distribuye de manera gratuita como un archivo de java (JAR) que

contiene el API necesario para que cualquier aplicación desarrollada en J2SE pueda

tener acceso a funcionalidades orientadas a la interacción con el dispositivo Bluetooth

que hasta ahora sólo eran posibles desde aplicaciones J2ME.

2.2.6.2 Características

Su versión actual es la v.2.1.0 y se distribuye en su página oficial

(http://bluecove.org/) como bluecove-2.1.0.jar, con un peso aproximado de 520 KB.

BlueCove está licenciado bajo Library General Public License v3 (LGPLv3).

Page 76: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

76

Soporta las pilas Bluetooth de los principales sistemas operativos:

1. En Windows y Macintosh: Mac OS X, Widcomm, BlueSoleil y Microsoft.

2. En Linux: BlueZ (GPL).

Además provee interfaces Java de JSR-82 para algunos perfiles Bluetooth, como por

ejemplo: SDAP, RFCOMM, L2CAP y OBEX.

GRÁFICO NO. 08

INTERACCIÓN ENTRE LA APLICACIÓN. BLUECOVE, EL SISTEMA

OPERATIVO Y EL CONTROLADOR BLUETOOTH

Elaboración: BlueCove.org

Fuente: BlueCove.org

Page 77: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

77

Como podemos darnos cuenta en la figura anterior, el API que reside en la

implementación BlueCove hace de intermediario entre la aplicación y la pila

Bluetooth nativa del sistema operativo. Ésta pila Bluetooth es la encargada de

manejar al más bajo nivel la comunicación por medio de los protocolos antes

estudiados hacia el dispositivo Bluetooth conectado al PC.

2.2.6.3 Funciones que permite realizar esta implementación

1. Anuncia el dispositivo Bluetooth local y sus servicios.

2. Maneja las conexiones que existen entre distintos dispositivos Bluetooth.

3. Detecta dispositivos Bluetooth remotos y sus servicios.

4. Permite el intercambio de datos o flujos de datos entre dispositivos Bluetooth,

siempre usando un protocolo y perfil Bluetooth específico.

2.2.6.4 Funciones que no permite realizar esta implementación

1. La creación de nuevos protocolos.

2. Elusión de los protocolos de seguridad utilizando fuerza bruta.

3. Trabajar fuera de los estándares que se encuentran definidos en la

especificación JSR-82.

Page 78: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

78

2.2.7 Librerías Auxiliares

2.2.7.1 Librería JasperReports

JasperReports es un conjunto de librerías desarrolladas en Java que en la actualidad se

ha convertido en el motor de reportes OpenSource más ampliamente utilizado cuando

se trata del desarrollo de aplicaciones J2S. El API de JasperReports me provee de las

siguientes funcionalidades.

1. Desarrollar reportes profesionales a partir de configuraciones realizadas en

ficheros xml.

2. Ejecutar los reportes desarrollados y presentarlos en una vista agradable para

su análisis.

3. Exportar los reportes generados en archivos de visualización universal como

el formato PDF, por ejemplo, para su posterior estudio.

2.2.7.2 Librería log4j

La bitacorización de las operaciones de un sistema siempre ha representado un reto

para los programadores. Gracias a ésta librería, podemos manejar en nuestra

aplicación toda la bitacorización de eventos de una manera muy sencilla, además de

eso, podemos escoger distintos niveles de severidad de cada evento generado y

también nos permite definir distintos tipos de salida para los logs generados, es decir,

un archivo de texto plano, un tabla en la base de datos o incluso la consola de la

máquina virtual de Java.

Page 79: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

79

2.3 FUNDAMENTACIÓN LEGAL

2.3.1 Constitución del Ecuador, Capítulo Segundo, Sección Segunda

De acuerdo a la Constitución del Ecuador, Título II (Derechos), Capítulo Segundo

(Derechos del buen vivir), Sección segunda (Ambiente sano).

Art. 15.‐ El Estado promoverá, en el sector público y privado, el

uso de tecnologías ambientalmente limpias y de energías

alternativas no contaminantes y de bajo impacto. …

2.3.2 Constitución del Ecuador, Capítulo Segundo, Sección Tercera

De acuerdo a la Constitución del Ecuador, Título II (Derechos), Capítulo Segundo

(Derechos del buen vivir), Sección tercera (Comunicación e información).

Art. 16.‐ Todas las personas en forma individual o colectiva,

tienen derecho a:

1. Una comunicación libre, intercultural, incluyente, diversa y

participativa, en todos los ámbitos de la interacción social, por

cualquier medio y forma, en su propia lengua y con sus propios

símbolos.

2. El acceso universal a las tecnologías de información y

comunicación.

3. La creación de medios de comunicación social, y al acceso en

igualdad de condiciones al uso de las frecuencias del espectro

radioeléctrico para la gestión de estaciones de radio y televisión

públicas, privadas y comunitarias, y a bandas libres para la

explotación de redes inalámbricas. …

Page 80: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

80

Art. 18.‐ Todas las personas, en forma individual o colectiva,

tienen derecho a:

1. Buscar, recibir, intercambiar, producir y difundir

información veraz, verificada, oportuna, contextualizada,

plural, sin censura previa acerca de los hechos, acontecimientos

y procesos de interés general, y con responsabilidad ulterior. …

2.3.3 Constitución del Ecuador, Capítulo Tercero, Sección Novena

De acuerdo a la Constitución del Ecuador, Título II (Derechos), Capítulo Tercero

(Derechos de las personas y grupos de atención prioritaria), Sección novena (Personas

usuarias y consumidoras).

Art. 53.- Las personas tienen derecho a disponer de bienes y

servicios de óptima calidad y a elegirlos con libertad, así como a

una información precisa y no engañosa sobre su contenido y

características. …

Art. 54.- Las empresas, instituciones y organismos que presten

servicios públicos deberán incorporar sistemas de medición de

satisfacción de las personas usuarias y poner en práctica

sistemas de atención y reparación a las personas consumidoras

o usuarias. …

2.4 PREGUNTAS A CONTESTARSE

¿Se están consiguiendo establecer un contacto directo con los clientes con las técnicas

de marketing utilizadas actualmente?

¿Realmente se están alcanzando los niveles de ventas deseados?

Page 81: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

81

¿Se ve reflejada en las ganancias la inversión que la empresa está realizando en la

publicidad de los productos?

2.5 VARIABLES DE LA INVESTIGACIÓN

2.5.1 La Tecnología

La tecnología es sin duda una de las variables más significativas para un proyecto de

este tipo. Va a convertirse en el pilar sobre el cual apoyaremos la idea misma de la

innovación al transformar tareas que hasta ahora requerían de una persona o talento

humano para poder llevarse a cabo, en una tarea automatizada y configurable para

cualquier tipo de necesidad.

Al hablar de un sistema de envío de publicidad por Bluetooth, la tecnología va a ser el

factor que nos indique exactamente hasta qué nivel de funcionalidad podremos,

llegar, ya sea refiriéndonos a las características técnicas que deberá poseer el

computador sobre el cual va a estar instalado el sistema, o ya sea refiriéndonos a la

clase del dispositivo Bluetooth USB que utilicemos para realizar el envío de la

información. Como vimos en el apartado acerca de la tecnología Bluetooth,

actualmente contamos con clases de dispositivos que pueden llegar hasta los 100

metros de alcance sin paredes, claro está con un costo un tanto más elevado que los

dispositivos de clases inferiores.

Page 82: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

82

La tecnología puede considerarse desde dos ángulos diferentes

como una variable ambiental externa o coma una variable

organizacional interna:

1. La tecnología como variable ambiental.- La tecnología es un

componente del medio ambiente en la medida en que las

empresas adquieren, incorporan y utilizan sus sistemas, las

tecnologías creadas y desarrolladas por otras empresas

pertenecientes a su ambiente de tarea.

2. La tecnología como variable organizacional.- La tecnología

es un componente organizacional en la medida que se hace

parte del sistema interno de la organización y por tanto

influye en el y su ambiente de tarea.[20

]

2.5.2 El Mercado

Es otra de las variables que adquieren importancia e igual relevancia al momento de

la implementación de un sistema de publicidad vía Bluetooth. Definiremos el

mercado desde el punto de vista físico, es decir el tipo de localidad en donde se

planeará efectuar la publicidad.

Como se ha explicado en los capítulos anteriores, una de las principales ventajas de

este tipo de sistemas es sin lugar a duda la flexibilidad que presentan para poder

adaptarse casi a cualquier tipo de mercado. Existen muchos casos de éxito de

implementaciones de estos sistemas en lugares diversos como: centros comerciales,

patios de comida, cines, conciertos, ferias de exposiciones, etc. Casi cualquier lugar

que se sabe tendrá una concurrencia moderada de gente, se convertirá en un buen

mercado para aplicar el nuevo marketing de proximidad.

20

Tecnología. José Roberto Chin Rosado. http://www.monografias.com/trabajos11/tecnol/tecnol.shtml

Page 83: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

83

2.5.3 El Producto

El producto, en nuestro contexto, se convertirá en el contenido que nosotros deseemos

distribuir a través de nuestro sistema. Para un sistema completo de envío de

publicidad vía Bluetooth, podrá ser cualquier tipo de archivo que sepamos será

compatible con los dispositivos móviles destino. Esto nos permite una comunicación

con el cliente mucho más amigable a la vista e interactiva gracias a la amplia gama de

formatos de archivos de imagen, archivos de sonido, archivos de texto, programas

ejecutables en móviles (archivos Java como: JARs o JADs), etc que pudieran ser

visualizados, escuchados o incluso ejecutados (el caso de los juegos) dentro del

dispositivo móvil. Fácilmente podemos traer a colación ejemplos de contenido de

imagen como: volantes, panfletos, cupones de promociones o descuentos, etc.;

ejemplos de contenido de sonido como: jingles promocionales, sonidos que

fácilmente le recuerden al cliente sobre un tema en específico como una película o

una serie animada, porciones pequeñas de los nuevos singles promocionales de las

bandas musicales de moda, etc.; y ejemplos de programas ejecutables en móviles

como: juegos, aplicaciones informativas, o pequeños utilitarios.

2.6 DEFINICIONES CONCEPTUALES

2.6.1 Marketing de proximidad

Es la técnica de marketing en cuyo escenario, el cliente necesita estar cerca para

poder inducirle la publicidad.

Page 84: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

84

2.6.2 Marketing permisivo

Es el tipo de marketing que pide una confirmación por parte del cliente, antes de

entrar en el siguiente paso en el proceso de venta.

2.6.3 Spam

Son los mensajes no solicitados, no deseados o de remitente desconocido que suelen

ser replicados de una manera automática y masiva.

2.6.4 OBEX

Protocolo de intercambio de archivos, utilizado para enviar información entre varios

dispositivos Bluetooth.

Page 85: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

3 CAPÍTULO III

METODOLOGÍA

Page 86: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

86

3.1 DISEÑO DE LA INVESTIGACIÓN

3.1.1 Modalidad de la Investigación

La modalidad de la investigación que se ha seguido para la ejecución de este proyecto

es la de Proyecto Factible, es decir, se ha decidido demostrar que el desarrollo de un

sistema de envío de publicidad vía Bluetooth no debería suponer mayor dificultad

para un profesional con conocimientos intermedios acerca del protocolo, el API que

interactúa con el dispositivo y el lenguaje de programación Java. Se ha logrado

implementar un sistema prototipo bastante fácil de configurar y de operar y que puede

trabajar tranquilamente con un dispositivo Bluetooth USB estándar de Clase 2.

Se ha escogido esta modalidad debido a que los temas de investigación fueron

sumamente puntuales: conceptos básicos del marketing que me permiten establecer

políticas de negocio para mi sistema que no permitan que los clientes se sientan

abrumados con la cantidad de publicidad que pudiera recibir; conceptos básicos

acerca de la tecnología Bluetooth y de qué manera podemos utilizarla y controlarla

desde aplicaciones J2SE. Y por el otro lado, el nivel de funcionalidad, bastante

aceptable, que se pudo alcanzar durante el desarrollo del sistema prototipo,

permitiendo configuración de usuarios para roles, administración de campañas de

marketing, control del proceso y por último, reportes con información útil acerca

tanto del sistema, como del proceso de marketing en sí.

Page 87: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

87

La relación que existe entre la cantidad de bibliografía consultada y el desarrollo del

software como tal, ubican a este proyecto de grado con la modalidad de Proyecto

Factible cuyo principal objetivo es demostrar las enormes ventajas que se pudieran

alcanzar en los aspectos mencionados en capítulos anteriores.

3.1.2 Tipo de la Investigación

A continuación veremos algunas características que posee este proyecto determinado

como factible y que lo ayudan a describirse un poco más a fondo:

3.1.2.1 Aplicada

Es una investigación aplicada ya que se revisaron algunos conceptos puntuales, se

adquirió cierto nivel de experiencia en el uso de una determinada herramienta y luego

se aplicaron tanto la teoría como la práctica en el desarrollo de un sistema prototipo

con la finalidad de resolver un problema, que en este caso, se trata de llegar hacia el

siguiente nivel tecnológico en lo que a estrategias de marketing se refiere.

3.1.2.2 De laboratorio

De acuerdo al lugar en el que se ha desarrollado este proyecto, se puede decir que esta

investigación es de laboratorio, ya que el sistema no ha sido probado en un ambiente

Page 88: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

88

de producción real, sino más bien llevando a cabo una serie de pruebas funcionales y

de stress pero en un ambiente que se podría igualar a un ambiente de desarrollo o

pre-producción.

3.1.2.3 Descriptiva

La investigación que se llevó a cabo durante la ejecución de este proyecto, se puede

caracterizar también como descriptiva, ya que fue principalmente basada en hechos

reales, es decir, en los numerosos casos de éxito que han tenido las implementaciones

de sistemas de envío de publicidad vía Bluetooth en otros países desde hace ya

muchos años. Campañas de publicidad vía Bluetooth llevadas a cabo por grandes

compañías de distintos áreas de la informática, comunicaciones, entretenimiento, etc.

Así también, se tomó como punto referencial una encuesta realizada con la finalidad

de sondear el nivel de conocimiento de las personas del medio acerca de este tema y

una que otra opinión de aprobación o desaprobación acerca del funcionamiento del

mismo.

3.1.3 Población y Muestra

Para la realización de la encuesta referencial a cerca del marketing vía Bluetooth, se

tomó como una pequeña muestra a algunos profesionales en áreas de ocupación

Page 89: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

89

distintas tales como: marketing, ingeniería civil, economía, etc. de la ciudad de

Guayaquil.

3.1.3.1 Detalle de la encuesta realizada

A continuación presento las preguntas que se elaboraron para la Encuesta Sobre La

Publicidad Vía Bluetooth En El Ecuador:

- ¿Ha escuchado usted acerca de los sistemas de envío de archivos multimedia

publicitarios vía Bluetooth?

- ¿Se ha enterado usted de alguna empresa que haya implementado uno de estos

sistemas en el Ecuador?

- Usted como cliente, ¿aceptaría una solicitud de recepción de algún archivo

multimedia publicitario en su dispositivo móvil mientras camina por un centro

comercial, sabiendo que podría hacerse acreedor a una promoción u oferta

especial?

- A usted como empresario o micro-empresario, ¿le interesaría la

implementación de un sistema de este tipo en su negocio, sabiendo que puede

llegar a más clientes potenciales sin necesidad de invertir en volantes o

panfletos impresos?

- ¿Considera usted que al enviar archivos de contenido multimedia

abiertamente en algún lugar público, enviando una solicitud de envío previa a

Page 90: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

90

casa cliente, el proceso se pudiera confundir con envío de spam (contenidos o

mensajes basura) hacia los clientes? ¿Por qué?

3.1.4 Operacionalización de las Variables

Variables Dimensiones Indicadores Técnicas y/o

Instrumentos

La Tecnología

Lenguaje de

Programación Java

Lenguaje robusto,

mundialmente

aceptado y

ampliamente

estandarizado en

innumerables

implementaciones

de software.

Experiencia propia,

investigaciones y

casos de éxito.

Tecnología

Bluetooth

Tecnología

orientada a

servicios

implementada en

más del 80% de los

teléfonos móviles

del mundo.

Sondeos e informes

realizados por

compañías líderes

en

telecomunicaciones.

Page 91: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

91

El Mercado

Localización

geográfica

Puede tratarse de

cualquier zona

pública con una

densidad

poblacional

relevante.

Encuestas y casos

de éxito en otros

países.

El Producto

Formatos de

archivo soportados

La mayoría de

teléfonos celulares

poseen

compatibilidad con

los formatos

estándar de audio

(mp3), imagen

(jpg) y texto (txt).

Investigación

3.1.5 Instrumentos de la Recolección de Datos

Los instrumentos que se utilizaron para recoger la información necesaria para poder

llevar a cabo este proyecto de grado fueron dos: la lectura de contenido y la encuesta.

Básicamente se utilizó la lectura de contenido como una técnica de investigación

documental, y por medio de ésta se realizó la mayor parte de la recolección de

información necesaria. Se revisaron distintos libros acerca de aspectos puntuales del

Page 92: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

92

marketing, páginas web y artículos escritos por los mismos autores de los libros. El

mismo caso ocurrió para todos los temas concernientes a la tecnología Bluetooth y el

lenguaje de programación Java. Se revisaron distintas publicaciones hechas por

desarrolladores profesionales que poseen vastos años de experiencia desarrollando

aplicaciones para móviles, que es en donde más frecuentemente se mezclan la

tecnología Bluetooth con el lenguaje Java.

Para la investigación acerca de las librerías de Java, los documentos en donde se

buscó la información relevante fue directamente la documentación oficial que provee

cada una de las páginas oficiales de los proyectos.

Y con la finalidad de medir la posible aceptación del público hacia los sistemas de

envío de publicidad vía Bluetooth, se determinó el realizar una pequeña encuesta para

la medición de éste y otros factores relacionados.

3.1.6 Instrumentos de la Investigación

De acuerdo a las técnicas mencionadas anteriormente, los instrumentos utilizados

fueron, básicamente, fuentes bibliográficas, internet y un cuestionario corto.

Las fuentes bibliográficas consultadas comprenden desde libros de historia y

conceptos modernos de marketing, especificaciones de tecnologías inalámbricas,

conceptos y prácticas del JSR-82, todos escritos por profesionales y expertos en su

Page 93: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

93

respectiva área como por ejemplo Philip Kotler, Gary Armstrong y Bruce Hopkins;

hasta artículos publicados en internet por compañías y empresas que cuentan como

casos de éxito para implementaciones de sistemas de marketing vía Bluetooth en

otros países.

El cuestionario consistía en cinco preguntas que tocaban 5 aspectos diferentes acerca

de este tipo de marketing. Los aspectos se referían a: el nivel de conocimiento que se

posee acerca de este tipo de marketing, el nivel de conocimiento que se posee acerca

de empresas que podrían estar ya ofreciendo este tipo de servicio, el nivel de

aceptación que tendría una implementación del sistema desde el punto de vista de un

cliente potencial, el nivel de aceptación que tendría una implementación del sistema

desde el punto de vista de un gerente o administrador de un negocio, y la probabilidad

de que la interacción con estos sistemas se pueda confundir con un envío desmedido y

descontrolado de spam.

3.1.7 Procedimientos de la Investigación

A continuación se nombrarán secuencialmente los pasos que se siguieron para

desarrollar la investigación:

Page 94: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

94

3.1.7.1 El problema

Planteamiento del problema

Objetivos de la investigación

Justificación e importancia de la investigación

3.1.7.2 Marco teórico

Obtener información detallada acerca de Marketing de Proximidad y Marketing por

Autorización

Investigar información conceptual de la especificación Bluetooth

Obtener información de los principales protocolos del esquema de Bluetooth

Revisar definiciones y usos de los diferentes perfiles Bluetooth

Recopilar información conceptual de Java como ventajas y desventajas frente a otros

lenguajes

Revisar la especificación JSR-82, concepto, reseña, utilidades

Obtener información acerca del API para realizar conexiones vía Bluetooth

Fundamentación legal

Preguntas a contestarse

Definiciones conceptuales

3.1.7.3 Metodología

Diseño de la investigación

Tipo de investigación

Población y muestra

Page 95: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

95

Instrumentos para la recolección de datos

Procedimiento de la investigación

Criterios para la elaboración de la propuesta

3.1.8 Recolección de la Información

El proceso de recolección de información se realizó utilizando las herramientas

descritas en el punto21

anteriormente mencionado; cubriendo básicamente,

actividades de búsqueda de información relevante en páginas de empresas que se

dedican a la implementación de este tipo de sistemas en otros países y búsqueda de

libros publicados en formato digital en internet.

3.2 PROCESAMIENTO Y ANÁLISIS

Durante el procesamiento de la información recolectada por medio de internet y de

fuentes bibliográficas, se fue determinando que la información que no pertenecía a

fuentes bibliográficas revisadas y publicadas por editoriales, debía ser validada y

comprobada, por lo menos encontrando algunas fuentes acerca del mismo tema y que

coincidieran con la idea expuesta. Con lo referente a la información extraída de

publicaciones revisadas por editoriales, se procedía directamente a la lectura de la

misma y a su posterior análisis.

21

3.1.5 Instrumentos de la Recolección de Datos

Page 96: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

96

Una vez que las encuestas fueron tomadas a los profesionales del campo, se procedió

con la tabulación de los datos recolectados en cada una de las opiniones, para su

posterior diseño y elaboración de los gráficos estadísticos resultantes del

procesamiento de los mismos.

A continuación se muestran los resultados obtenidos de la encuesta.

GRÁFICO NO. 09

CONOCIMIENTO PREVIO ACERCA DE LA PUBLICIDAD VÍA BLUETOOTH

Elaboración: Fausto Almeida

Fuente: Encuesta Sobre La Publicidad Vía Bluetooth En El Ecuador.

Análisis.-

Como podemos apreciar en el gráfico, el conocimiento que se posee sobre la

utilización de ésta tecnología en el campo del marketing es casi nulo en nuestro

0

0,5

1

1,5

2

2,5

3

3,5

4

4,5

5

Si No

Page 97: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

97

entorno. Al ser un campo poco explorado se convierte en una gran oportunidad de

innovación para las empresas que se decidan a implementar uno de estos sistemas.

GRÁFICO NO. 10

CONOCIMIENTO ACERCA DE EMPRESAS QUE BRINDEN ESTE SERVICIO

Elaboración: Fausto Almeida

Fuente: Encuesta Sobre La Publicidad Vía Bluetooth En El Ecuador.

Análisis.-

Así también la mayoría de personas no ha escuchado o no conoce acerca de alguna

empresa en nuestro medio que se dedique a la implementación de sistemas de

publicidad vía Bluetooth. Esto puede convertir al desarrollo de aplicaciones de este

tipo en una línea de negocio innovadora para cualquier empresa que se dedique al

desarrollo de sistemas a medida.

0

0,5

1

1,5

2

2,5

3

3,5

4

4,5

5

Si No

Page 98: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

98

GRÁFICO NO. 11

CONFORMIDAD CON RECEPCIONES DE CONTENIDO MULTIMEDIA EN

LUGARES PÚBLICOS

Elaboración: Fausto Almeida

Fuente: Encuesta Sobre La Publicidad Vía Bluetooth En El Ecuador.

Análisis.-

En este gráfico podemos darnos cuenta de que las personas estarían muy dispuestas a

poder recibir contenido multimedia. Esto significa que la hipótesis que se posee

acerca del acogimiento que tenga una campaña de marketing vía Bluetooth en los

clientes es sumamente confiable, ya que la mayoría de personas estaría dispuesta a

recibir ofertas y promociones por este medio tan innovador.

0

0,5

1

1,5

2

2,5

3

3,5

4

4,5

5

Si No

Page 99: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

99

GRÁFICO NO. 12

CONFORMIDAD CON LA INVERSIÓN DE LA IMPLEMENTACIÓN DE ESTOS

SISTEMAS

Elaboración: Fausto Almeida

Fuente: Encuesta Sobre La Publicidad Vía Bluetooth En El Ecuador.

Análisis.-

En este gráfico indica que las personas evidentemente estarían dispuestas a realizar

una inversión determinada para poder implementar un sistema de envío de publicidad

vía Bluetooth. Sabiendo que esto representara en mediano plazo muchas ventajas

tanto en ahorro de recursos como en aumento de niveles de ventas.

3.2.1 Criterios para la Elaboración de la Propuesta

La propuesta fundamental de este proyecto se centra en la elaboración de un sistema

prototipo de envío de publicidad vía Bluetooth para una tienda de álbumes musicales.

Ésta propuesta se basa en todos los conceptos anteriormente revisados en la sección

0

0,5

1

1,5

2

2,5

3

3,5

4

4,5

5

Si No

Page 100: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

100

de fundamentación teórica, es decir, que es un sistema específicamente direccionado

hacia el marketing de una empresa o firma y trabajará bajo el paradigma de

Marketing Permisivo.

Como se ha mencionado anteriormente, se implementará el prototipo utilizando como

medio de comunicación inalámbrico la tecnología Bluetooth; y así mismo, debido a

su alta compatibilidad será desarrollado en el lenguaje de programación Java,

haciendo uso de librerías e implementaciones de especificaciones oficiales de Oracle

(anteriormente Sun Microsystems) para el uso del API necesario para poder tener la

interacción entre el dispositivo Bluetooth de la pc en la cual se encontrará instalado el

prototipo y todos los dispositivos o terminales móviles que se fueren detectando

durante el proceso de envío de publicidad.

Esta aplicación prototipo tendrá comunicación con una base de datos MySQL

instalada en la misma pc, cuyo sistema operativo será Windows XP.

3.2.2 Criterios para la Validación de la Propuesta

La aplicación del concepto de marketing permisivo en este tipo de sistemas, resulta de

vital importancia a la hora de que los clientes, al estar constantemente recibiendo

archivos de contenido de audio o imagen, no se sientan víctimas de un ataque de

spam.

La tecnología Bluetooth se ha convertido desde hace ya mucho tiempo en un

completo sistema orientado a servicios, cada vez más común entre los distintos

Page 101: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

101

dispositivos que se siguen fabricando a diario y con constantes avances tecnológicos

en cuanto a distancias y tasas de transferencia se refiere.

El lenguaje de programación Java, además de tener la cualidad apreciable de ser

OpenSource, cuenta en la actualidad con una gama sumamente amplia de recursos

(APIs para comunicación Bluetooth, APIs para manejo de logs, APIs para

administración de reportes, etc.) que pueden ayudar a complementar un sistema de

este tipo con una curva de aprendizaje sumamente baja con relación a otros lenguajes.

El sistema operativo fue escogido por ser el más ampliamente distribuido e instalado

en las computadoras, además de proveer un servicio de pila de Bluetooth, estable y

compatible con la mayoría de APIs, necesario para establecer un puente entre la

aplicación prototipo desarrollada y la interfaz del dispositivo propiamente dicha.

Cabe recalcar que el perfil Bluetooth que está implementando nuestra aplicación de

envío de publicidad, es decir, el Perfil de Intercambio de Objetos (OBEX), sólo ha

presentado casos de éxito con terminales móviles de marca Nokia. De todas las

pruebas realizadas del sistema contra distintos dispositivos celulares, solamente

ocurrieron transferencias exitosas con dispositivos Nokia. Con otras marcas como los

iPhones y Blackberries, debido a su arquitectura cerrada y en extremo segura, realizar

cualquier push de información resultó inútil. En dispositivos de otras marcas como

Samsung, LG, Sony Ericsson, el perfil OBEX ni siquiera se pudo encontrar. Todos

Page 102: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

102

estos casos corresponden a teléfonos detectables por el sistema pero invalidados en el

momento de intentar el envío del contenido multimedia.

Page 103: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

4 CAPÍTULO IV

MARCO ADMINISTRATIVO

Page 104: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

104

4.1 CRONOGRAMA

A continuación se procederá a detallar las actividades realizadas desde la fase inicial del proyecto de grado, cada una con su

respectiva duración y fecha de inicio. Actividades entre las cuales también constan los hitos del proyecto determinados por el

Departamento de Graduación.

Page 105: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

105

Page 106: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

106

De acuerdo al cronograma anteriormente detallado, se generó el siguiente diagrama de Gantt.

Page 107: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

107

Page 108: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

108

Page 109: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

109

4.2 PRESUPUESTO

El cálculo realizado para preparar el siguiente presupuesto tomó en cuenta el caso de

que se realice un desarrollo del sistema desde cero, así mismo tomando en cuenta que

los recursos de hardware necesarios para la implantación del sistema sólo consistían

en los que explícitamente utilizará nuestro sistema, es decir, asumiendo que en el

local comercial o punto donde se desee implementar dicho sistema ya se encuentre

operativa una computadora con prestaciones regulares y con el sistema operativo

Windows XP Service Pack 3 previamente instalado y licenciado.

4.2.1 Estimación de costos

Para el desarrollo de este proyecto se necesitó de un programador con un nivel de

conocimiento intermedio-avanzado en el desarrollo de aplicaciones J2SE. El

desarrollo se realizará con la herramienta de software NetBeans versión 6.8, que es un

entorno de desarrollo integrado cuya licencia tiene un costo nulo al tratarse de una

herramienta OpenSource. El mismo caso ocurre con la herramienta de diseño de

reportes Jasper, llamada iReport, cuya versión utilizada fue la 3.7.3.

También se detallan los costos que resultan del uso del equipo de computación del

que se hará uso durante el proyecto, así como la inversión del equipo de

comunicación de Bluetooth.

Page 110: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

110

CUADRO NO. 04

DEPRECIACIÓN EQUIPO DE CÓMPUTO

Costo (C) $ 600,00

Valor Residual (VR) $ 400,00

Años vida útil (AVU) 3

Depreciación Anual (DA = C – VR / AVU) $ 66,67

Depreciación Mensual (DM = DA / 12) $5,56 Elaboración: Fausto Almeida C.

Fuente: Fausto Almeida C.

CUADRO NO. 05

COSTO DE EQUIPO DE COMUNICACIÓN BLUETOOTH

Dispositivo Bluetooth USB – 100 metros $ 7,00 Elaboración: Fausto Almeida C.

Fuente: Fausto Almeida C.

Todos los gastos operativos generales, tales como: luz eléctrica, movilización, etc. Se

detallan en el rubro Otros Gastos.

4.2.2 Presupuesto

A continuación se exponen los valores correspondientes a los costos de todo el

proyecto de implementación del sistema de publicidad vía Bluetooth, tomando en

cuenta que el programador trabajará durante los 80 días estipulados en el cronograma

del proyecto.

CUADRO NO. 06

LISTADO Y COSTEO DE RECURSOS DEL PROYECTO DE TESIS

Rubro Valor Meses Subtotal

Programador avanzado J2SE $ 420,00 3 $ 1260,00

Equipo de cómputo para el desarrollo $ 5,56 3 $ 16,68

Herramientas de desarrollo $ 0,00 3 $ 0,00

Equipo USB Bluetooth clase 2 $ 7,00 - $ 7,00

Page 111: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

111

Otros Gastos $ 35,00 3 $ 105,00

Costo Total del Proyecto $ 1388,68 Elaboración: Fausto Almeida C.

Fuente: Fausto Almeida C.

La duración del proyecto de desarrollo es de 3 meses aproximadamente, tiempo que

iniciará el martes 18 de mayo del año 2010 hasta el jueves 05 de agosto del año 2010.

A continuación se detallan los rubros y la cantidad de dinero que se invertirán

mensualmente en los mismos, indicando que el valor del software se pagará en los

porcentajes de 40%, 30% y 30%, que corresponden al transcurso de los meses de

junio, julio y agosto respectivamente.

CUADRO NO. 07

PRESUPUESTO DEL PROYECTO DE TESIS

Junio Julio Agosto

Ingresos

Venta de software $ 555,46 $ 416,61 $ 416,61

Total Ingresos $ 555,46 $ 416,61 $ 416,61

Egresos

Salario programador avanzado J2SE $ 420,00 $ 420,00 $ 420,00

Equipo de cómputo para el desarrollo $ 5,56 $ 5,56 $ 5,56

Herramientas de desarrollo $ 0,00 $ 0,00 $ 0,00

Equipo USB Bluetooth clase 2 $ 7,00 $ 0,00 $ 0,00

Otros Gastos $ 35,00 $ 35,00 $ 35,00

Total Gastos $ 467,56 $ 460,56 $ 460,56

Saldo de Caja $ 87,90 $ 43,95 $ 0,00 Elaboración: Fausto Almeida C.

Fuente: Fausto Almeida C.

Page 112: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

112

Podemos darnos cuenta de que el saldo de la caja queda efectivamente en $ 0,00

debido a que se trata de un proyecto de tesis y no se ha registrado en el presupuesto

un porcentaje de utilidad.

4.2.3 Evaluación financiera

Estimaremos que la vida útil del proyecto es de 2 años, debido a las constantes

actualizaciones tecnológicas a las que se ve sujeto el sistema. A continuación

detallaremos los costos que se deberán tener en cuenta durante toda su vida útil.

Costo de Inversión: $1388,68

Costo de Operación y Mantenimiento

Costo fijo (estimación mensual)

o Energía eléctrica: $9,00

o Comisión Operador del Sistema: $30,00

Total mensual: $39,00

Total anual: $468,00

Costo variable (estimación anual)

o Mantenimiento del sistema (cada tres meses): $25,00

o Mantenimiento equipo de cómputo (cada seis meses): $28,00

Total mensual: $13,00

Total anual: $156,00

Total costo fijo y variable anual: $624,00

Page 113: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

113

Para este caso de estudio asumiremos un incremento hipotético que como mínimo

será de 8% en las ventas netas de la empresa de comercialización de álbumes

musicales. Si decimos que en promedio, la empresa posee un rubro de ingresos de

$25920,00 al año, el 8% de incremento en los ingresos correspondería a la cantidad

de $2073,60.

De acuerdo a la tasa de inflación anual actual, que es de 3.82%, podemos generar el

siguiente cuadro de Evaluación Financiera de nuestro proyecto.

CUADRO NO. 08

EVALUACIÓN FINANCIERA DEL PROYECTO

Año Ingresos Costos Flujos Netos

0 0,00 1388,88 -1388,88

1 2073,60 624,00 1449,60

2 2152,81 647,84 1504,97

Valor Actual Neto $ 2.792,53

Tasa de Inversión de Retorno 69% Elaboración: Fausto Almeida C.

Fuente: Fausto Almeida C.

Como podemos apreciar, el proyecto resulta muy factible económicamente hablando,

debido a que con una inversión relativamente pequeña la rentabilidad obtenida es

muy considerable.

Page 114: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5 CAPÍTULO V

CONCLUSIONES Y RECOMENDACIONES

Page 115: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.1 CONCLUSIONES

Durante los capítulos iniciales se citaron sobre-manera los casos de éxito que han

tenido las implementaciones de los sistemas de envío de publicidad vía Bluetooth en

otros países, tanto europeos como americanos. A pesar de las obvias diferencias no

solo demográficas, sino también culturales (tecnológicamente hablando) que pudieren

existir, se puede concluir que la ayuda que ofrece un sistema de este tipo en el

proceso de marketing de cualquier firma resulta sencillamente notable. Hemos podido

aproximar el costo que representaría el desarrollo de un sistema informático

configurable, que por su misma naturaleza genérica, en lo que respecta a tipos de

contenido multimedia que se pueden enviar, serviría para poder implementar un

emisor de publicidad casi en cualquier punto en donde se pudiera conectar una

computadora. Tomando en cuenta este dato, y llevándolo a la realidad de una empresa

de desarrollo de software de nuestro medio, se ubica como un proyecto factible el

desarrollo de este sistema, al tener un costo de desarrollo relativamente bajo y al ser

lo suficientemente configurable como para abarcar la mayoría de contextos

comerciales en donde se lo pudiera ubicar, adquiriendo de una manera fluida los

honorarios por cada implementación del servicio en un local comercial o empresa

distinto; sin tomar en cuenta las ventajas subsecuentes que se generarían cuando

alguno de nuestros clientes (empresas que han implementado un sistema de envío de

publicidad vía Bluetooth), necesitaran algún tipo de contenido más sofisticado como

lo pudieren ser un juego o aplicaciones específicas para su necesidad que funcionaran

en terminales móviles con capacidad Java.

Page 116: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

Uno de los objetivos específicos de este proyecto fue el de promover el uso de

herramientas tecnológicas en actividades ligadas al marketing empresarial que

actualmente se llevan de una manera operativa y análoga. Una de las principales

bases para la ejecución del proyecto además de la tecnología Bluetooth, lo fue sin

duda el lenguaje de programación utilizado. El haber escogido el lenguaje Java como

plataforma para la aplicación, resultó en algo muy positivo al momento de adherir

funcionalidad extra al sistema, como por ejemplo el manejo de registros (logs) de los

procesos, diseño y ejecución de reportes estadísticos, etc. Java demostró una vez más

ser un lenguaje potente, con gran potencial de escalabilidad y sobre todo OpenSource.

Tal vez al inicio, el que los clientes o usuarios se adapten a la cultura de recepción de

contenido multimedia en lugares públicos, resulte en un proceso lento, conforme vaya

avanzando el tiempo y los casos de éxito locales se vayan dando a conocer entre las

marcas o firmas nacionales, de acuerdo a las opiniones estudiadas en los capítulos

anteriores hechas por expertos en áreas de tecnología y marketing, las

implementaciones de sistemas de envío de publicidad vía Bluetooth serán cada vez

más usadas como reemplazo de las técnicas de marketing tradicionales.

Page 117: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.2 RECOMENDACIONES

Como principal recomendación se expone el punto de que la Universidad de

Guayaquil, hablando específicamente de la Carrera de Ingeniería en Sistemas debería

pensar muy seriamente en implementar un sistema de este tipo, tal vez no orientado

estrictamente hacia publicidad de alguna firma comercial, pero si a compartir

contenido multimedia útil para los estudiantes por medio de ésta vía.

Tanto el sistema prototipo presentado, como su motor de comunicación Bluetooth

pueden ser de gran utilidad para la investigación y posterior implementación de

sistemas más avanzados que permitan explotar aún más la utilidad de todos los

perfiles que corresponden a la especificación del Bluetooth.

Es muy importante saber que en el momento que se deseara realizar la

implementación del sistema se deberá la adquisición de un dispositivo Bluetooth

cuyas características estén de acuerdo a los avances tecnológicos de la época, con la

finalidad de que la experiencia del sistema resulte óptima. Como se explica en un

capítulo anterior, el prototipo fue desarrollado y probado con un dispositivo

Bluetooth USB de clase 2. Si deseara tener un máximo rendimiento del sistema, en

cuanto a velocidad de transferencia y rango de alcance a la redonda se refiere, se

debería optar por la compra de un dispositivo Bluetooth de clase 1, por ejemplo.

Page 118: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

Como último punto, podemos decir que se debe tener muy en cuenta que un sistema

de envío de publicidad vía Bluetooth, sólo es una herramienta más para el proceso de

marketing como tal. Una herramienta que aprovecha estratégicamente la madurez que

posee en estos tiempos la tecnología Bluetooth, la masificación de dispositivos

móviles compatibles con ésta tecnología y las interfaces de desarrollo modernas que

nos ofrecen lenguajes de programación robustos como lo es Java, pero una

herramienta al fin y al cabo, que debe ser correctamente apalancada con una campaña

de marketing analizada y diseñada por gente o personal operativo con el

conocimiento y experiencia necesaria en el campo del Marketing. Al final, es la

combinación entre la estrategia de Marketing y una herramienta que permita

ejecutarla, lo que llevará a una compañía a alcanzar sus metas y objetivos

empresariales.

Page 119: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.3 BIBLIOGRAFÍA

5.3.1 LIBROS

- Título: Proyecto de desarrollo e implementación de un plan de marketing para

la concienciación del reciclaje en colegios particulares del cantón Guayaquil

Autor/es: Oliver D. Holguín Álvarez, Germán P. Puertas Carrión

Año: 2006

- Título: Periodization in Marketing History (Periodización en la Historia del

Marketing)

Autor/es: Stanley C. Hollander, Kathleen M. Rassuli, D. G. Brian Jones, and

Laura Farlow Dix

Año: 2005

- Título: Permission Marketing (Marketing Permisivo)

Autor/es: Seth Godin

Año: 1999

- Título: Bluetooth for Java (Bluetooth para Java)

Autor/es: Bruce Hopkins, Ranjith Antony

Año: 2003

Page 120: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.3.2 PUBLICACIONES WEB

- Título: SENATEL: La penetración móvil en el país llega al 90%

Autor o Entidad: CONATEL

Dirección web: http://www.conatel.gov.ec/site_conatel/index.php?option=co

m_content&view=article&id=530:senatel-la-penetracion-movil-en-el-pais-lle

ga-al-90&catid=46:noticias-articulos&Itemid=310

- Título: Las grandes marcas comerciales se lanzan a la publicidad por el móvil

Autor o Entidad: Marketing de Proximidad, Publicidad por bluetooth

Dirección web: http://proximidad-bluetooth.es/News.aspx?newsId=01

- Título: Concepto de Marketing

Autor o Entidad: Marketing-Free.com

Dirección web: http://www.marketing-free.com/articulos/concepto-marketing.

html

- Título: ¿Qué es el marketing de proximidad?

Autor o Entidad: MensajeAzul

Dirección web:

http://www.marketingdeproximidad.es/index.php?option=com_content&task=

view&id=13&Itemid=34

Page 121: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

- Título: Proximity Marketing (Marketing de Proximidad)

Autor o Entidad: Wikipedia.org

Dirección web: http://en.wikipedia.org/wiki/Proximity_marketing

- Título: Permission Marketing vs. Interruption Marketing (Marketing

Permisivo vs Marketing Interruptivo)

Autor o Entidad: Guillermo Pareja

Dirección web: http://guillermopareja.com/tags/marketing-permisivo/

- Título: Permission Marketing - Rave reviews (Marketing Permisivo - Críticas

favorables)

Autor o Entidad: Sethgodin.com

Dirección web: http://www.sethgodin.com/permission/

- Título: Los Orígenes de Bluetooth – La Historia de Bluetooth

Autor o Entidad: MasterMagazine

Dirección web: http://www.mastermagazine.info/articulo/3125.php

- Título: Bluetooth

Autor o Entidad: Wikipedia.org

Dirección web: http://es.wikipedia.org/wiki/Bluetooth

- Título: Curso de Java

Page 122: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

Autor o Entidad: Monografias.com

Dirección web: http://www.monografias.com/trabajos/java/java.shtml

- Título: Desarrollo de Aplicaciones Bluetooth Utilizando el API Java JSR-82

Autor o Entidad: Mary Luz Chicangana Figueroa - Universidad del Cauca

Dirección web: ftp://jano.unicauca.edu.co/cursos/Electiva_ApliMovil/docume

ntos/java-bluetooth-jidtel.pdf

- Título: Using the JSR-82 API for OBEX Image Transfers (Usando el API

JSR-82 para transferencia de imágenes vía OBEX)

Autor o Entidad: Bruce Hopkins

Dirección web: http://developers.sun.com/mobility/apis/articles/bluetoothobex

Page 123: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

6 ANEXOS

Page 124: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

6.1 GLOSARIO

- Appliance.- Equipo de cómputo que funciona como servidor utilizado para

monitorear hardware.

- Banda ISM.- (Industrial, Scientific and Medical) son bandas reservadas

internacionalmente para uso no comercial de radiofrecuencia electromagnética

en el área industrial, científica y médica. En la actualidad estas bandas han

sido popularizadas por su uso en comunicaciones WLAN (Wi-Fi) o WPAN

(Bluetooth).

- Baneo.- En la jerga informática, se llama ban a una restricción; ya sea total,

parcial, temporal o permanente, de un usuario dentro de un sistema

informático, generalmente una red. Al igual que muchos otros términos de la

jerga informática, ban proviene del inglés y significa "prohibición".

- Bluetooth SIG.- El grupo de interés especial (SIG) de Bluetooth Es una

asociación privada sin ánimo de lucro con sede en Bellevue, Washington. A

fecha de septiembre de 2007, el SIG estaba formado por más de 9000

compañías de telecomunicaciones, informática, automovilismo, música, textil,

automatización industrial y tecnologías de red.

Page 125: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

- Comandos AT.- Son instrucciones codificadas que conforman un lenguaje de

comunicación entre el hombre y un terminal modem.

- E-Marketing.- El e-Marketing es la utilización de Internet para el marketing

directo con el fin de entrar en contacto con los potenciales clientes,

convertirlos en clientes y fidelizarlos.

- IR.- Infrarrojo, tecnología inalámbrica mediante rayos que permite la

conexión entre diferentes equipos, por ejemplo entre teléfonos. Tiene un

alcance mucho menor que el Bluetooth.

- Marketing mix.- Se denomina Mezcla de Mercadotecnia (llamado también

Marketing Mix, Mezcla Comercial, Mix Comercial, etc.) a las herramientas o

variables de las que dispone el responsable de la mercadotecnia para cumplir

con los objetivos de la compañía.

- Material POP.- (Point Of Purchase). Es el material promocional colocado en

las tiendas para captar la atención del consumidor e impulsarlo a comprar.

Incluye los letreros que se colocan en los estantes, anuncios en las ventanas,

módulos de demostración, etc.

- Spam.- Se llama spam, correo basura o sms basura a los mensajes no

solicitados, no deseados o de remitente desconocido, habitualmente de tipo

Page 126: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

publicitario, enviados en grandes cantidades (incluso masivas) que perjudican

de alguna o varias maneras al receptor.

- Top of mind.- Posicionamiento, top of mind, lealtad de marca, intención de

compra. Marca que primero le viene a la mente a un consumidor, también se

conoce como primera mención.

Page 127: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

6.2 MODELO DE ENCUESTA REALIZADA

Universidad de Guayaquil

Facultad de Ciencias Matemáticas y Físicas

Carrera de Ingeniería en Sistemas Computacionales

ENCUESTA SOBRE LA PUBLICIDAD VÍA BLUETOOTH EN EL

ECUADOR

Nombre: Ocupación:

Fecha: 05/09/2010

Conteste las siguientes preguntas marcando con una x en el casillero correspondiente a su respuesta

1.- ¿Ha escuchado usted acerca de los sistemas de envío de archivos multimedia publicitarios vía Bluetooth?

SI

NO

2.- ¿Se ha enterado usted de alguna empresa que haya implementado uno de estos sistemas en el Ecuador? Si la respuesta es afirmativa, porfavor nombre la empresa.

SI

NO

3.- Usted como cliente, ¿aceptaría una solicitud de recepción de algún archivo multimedia publicitario en su dispositivo móvil mientras camina por un centro comercial, sabiendo que podría hacerse acreedor a una promoción u oferta especial?

Page 128: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

SI

NO

4.- A usted como empresario o micro-empresario, ¿le interesaría la implementación de un sistema de este tipo en su negocio, sabiendo que puede llegar a más clientes potenciales sin necesidad de invertir en volantes o panfletos impresos?

SI

NO

Muchas gracias por la atención prestada. Que tenga un excelente día.

Page 129: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

TOMO II

Línea de Investigación

Redes y Sistemas Operativos

Nombre del Egresado

Fausto Stanley Almeida Campos

Nombre del Tema

Implementación de un prototipo de sistema de envío de

publicidad vía Bluetooth para un almacén de música,

como aplicación del concepto de marketing de

proximidad

Número de Proyecto

10

Nombre del Tutor

Ing. David Benavides

Page 130: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

Guayaquil, 09 de marzo del 2011

ÍNDICE DEL MANUAL TÉCNICO

1 MODELOS DE PROCESOS ............................................................................. 7

1.1 PROCESOS PARA EL MANTENIMIENTO DEL SISTEMA ..................... 8

1.2 PROCESOS PARA LA EJECUCIÓN DE REPORTES ............................... 10

1.3 PROCESOS PARA EL ENVÍO DE CONTENIDO ...................................... 12

2 DESCRIPCIÓN DE ESTRUCTURAS DE DATOS ...................................... 14

2.1 DIAGRAMA DEL MODELO ENTIDAD-RELACIÓN ............................... 15

2.2 DICCIONARIO DE DATOS ........................................................................... 16

3 MODELOS ORIENTADOS A OBJETOS ..................................................... 25

3.1 DIAGRAMA DE CASOS DE USO ................................................................. 26

3.2 DIAGRAMAS DE CLASES ............................................................................ 27

3.2.1 Clases POJOs de entidades. (com.jabluecatch.entidades) .......................... 27

3.2.2 Clases POJOs para objetos de transferencia de datos (com.jabluecatch.dto)

28

3.2.3 Clases para objetos de acceso a datos (com.jabluecatch.dao) ..................... 29

3.2.4 Clases para objetos de negocio (com.jabluecatch.bo) ................................. 31

3.2.5 Clases para objetos de operaciones de comunicación

(com.jabluecatch.comm) ......................................................................................... 33

3.2.6 Clases para objetos de utilería general (com.jabluecatch.util) .................... 35

3.2.7 Clases para objetos de interfaz gráfica de usuario correspondientes al menú

de sistema (com.jabluecatch.gui.sistema) ............................................................... 37

3.2.8 Clases para objetos de interfaz gráfica de usuario correspondientes al menú

de Campaña (com.jabluecatch.gui.campania) ......................................................... 39

3.2.9 Clases para objetos de interfaz gráfica de usuario correspondientes al menú

de Reportes (com.jabluecatch.gui.reportes) ............................................................ 41

Page 131: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

3.2.10 Clases para objetos de interfaz gráfica de usuario generales

(com.jabluecatch.gui) .............................................................................................. 43

4 CÓDIGO FUENTE DE LA APLICACIÓN ................................................... 44

4.1 CLASES E INTERFACES JAVA ................................................................... 45

4.1.1 Paquete com.jabluecatch.entidades ............................................................. 45

4.1.2 Paquete com.jabluecatch.dto ....................................................................... 61

4.1.3 Paquete com.jabluecatch.dao ...................................................................... 68

4.1.4 Paquete com.jabluecatch.bo ...................................................................... 103

4.1.5 Paquete com.jabluecatch.comm ................................................................ 121

4.1.6 Paquete com.jabluecatch.util ..................................................................... 135

4.1.7 Paquete com.jabluecatch.gui.sistema ........................................................ 151

4.1.8 Paquete com.jabluecatch.gui.campania..................................................... 183

4.1.9 Paquete com.jabluecatch.gui.reportes ....................................................... 239

4.1.10 Paquete com.jabluecatch.gui ................................................................. 259

4.1.11 Paquete raiz ........................................................................................... 279

4.2 ARCHIVOS DE PROPIEDADES ................................................................. 281

4.2.1 Paquete raíz ............................................................................................... 281

4.3 REPORTES JASPER ..................................................................................... 282

4.3.1 Paquete com.jabluecatch.recursos.reportes ............................................... 282

Page 132: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

Guayaquil, 09 de marzo del 2011

ÍNDICE DEL MANUAL DE USUARIO

1 INSTALACIÓN .............................................................................................. 302

1.1 REQUERIMIENTOS RECOMENDADOS DE HARDWARE ................. 303

1.2 REQUERIMIENTOS DE SOFTWARE ....................................................... 303

1.3 PASOS DE INSTALACIÓN .......................................................................... 304

2 ORGANIZACIÓN DEL MENU .................................................................... 305

2.1 ROL ADMINISTRADOR .............................................................................. 306

2.1.1 Sistema ...................................................................................................... 306

2.1.2 Campaña .................................................................................................... 306

2.1.3 Reportes..................................................................................................... 306

2.2 ROL OPERADOR .......................................................................................... 307

2.2.1 Sistema ...................................................................................................... 307

2.2.2 Campaña .................................................................................................... 307

2.2.3 Reportes..................................................................................................... 307

3 OPCIONES DEL SISTEMA .......................................................................... 308

3.1 INICIO DEL SISTEMA ................................................................................. 309

3.1.1 Login ......................................................................................................... 309

3.2 ROL ADMINISTRADOR .............................................................................. 309

3.2.1 Menú: Sistema ........................................................................................... 309

3.2.2 Menú: Campaña ........................................................................................ 315

3.2.3 Menú: Reportes ......................................................................................... 321

3.3 ROL OPERADOR .......................................................................................... 322

3.3.1 Menú: Sistema ........................................................................................... 322

3.3.2 Menú: Campaña ........................................................................................ 323

3.3.3 Menú: Reportes ......................................................................................... 326

Page 133: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

4 REPORTES ..................................................................................................... 331

4.1 REPORTES ADMINISTRATIVOS ............................................................. 332

4.1.1 Reporte de usuarios ................................................................................... 332

4.1.2 Reporte de Bitácora de Campaña .............................................................. 333

4.2 REPORTES OPERATIVOS .......................................................................... 334

4.2.1 Reporte de Impacto de Campaña .............................................................. 334

4.2.2 Reporte de Costos de Campañas ............................................................... 335

5 ANEXOS .......................................................................................................... 336

5.1 INSTALACIÓN DE JAVA RUNTIME ENVIROMENT ........................... 337

5.2 INSTALACIÓN DE BASE DE DATOS MYSQL........................................ 339

Page 134: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS

COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE

ENVÍO DE PUBLICIDAD VÍA BLUETOOTH PARA UN

ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL

CONCEPTO DE MARKETING DE PROXIMIDAD

MANUAL TÉCNICO

AUTOR: FAUSTO STANLEY ALMEIDA CAMPOS

TUTOR: ING. DAVID BENAVIDES

GUAYAQUIL – ECUADOR

2010

Guayaquil, 16 de agosto del 2010

Page 135: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

1 MODELOS DE PROCESOS

Page 136: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

8

1.1 PROCESOS PARA EL MANTENIMIENTO DEL SISTEMA

Adm

inis

trad

or

Necesidad de crear un

usuario

Ingresar datos del

nuevo usuario

Almacenar el

nuevo usuario

Usuarios

Necesidad de administrar

los usuarios

Ingresar criterios

para la consulta

de usuarios

Ejecutar consulta

de usuarios

Tratamiento de

los resultados

obtenidos

¿Qué desea

realizar?

Ver datos del

usuario

Actualizar datos

del usuario

Eliminar usuario

Usuarios

Usuarios

Usuarios

Usuarios

Necesidad de editar los

parámetros generales

Editar los valores

de los parámetros

Almacenar los

nuevos

parámetros

Parámetros

Generales

Page 137: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

9

Adm

inis

trad

or

Necesidad de crear una

campaña

Ingresar

configuración de

la campaña

Almacenar la

nueva campaña

Campañas

Necesidad de administrar

las campañas

Ingresar criterios

para la consulta

de campañas

Ejecutar consulta

de campañas

Tratamiento de

los resultados

obtenidos

¿Qué desea

realizar?

Ver datos de la

campaña

Actualizar datos

de la campaña

Eliminar campaña

Campañas

Campañas

Campañas

Campañas

Page 138: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

10

1.2 PROCESOS PARA LA EJECUCIÓN DE REPORTES

Ad

min

istr

ado

r

Necesidad de conocer el

listado de usuarios

Ejecutar el

Reporte de

Usuarios

Usuarios

Necesidad de conocer la

bitácora de una campaña

Seleccionar la

campaña

requerida

Ejecutar el

Reporte de

Bitácora de

Campaña

Bitácora de

Campañas

Reporte generado

Reporte generado

Page 139: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

11

O

per

ador

/ A

dm

inis

trad

or

Necesidad de conocer el

impacto de una campaña

Seleccionar la

campaña

requerida

Ejecutar el

Reporte de

Impacto de

Campaña

Bitácora de

Campañas

Reporte generado

Necesidad de conocer los

costos de las campañas

Ingresar el rango

de fechas deseado

Ejecutar el

Reporte de Costos

de Campañas

Bitácora de

Campañas

Reporte generado

Page 140: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

12

1.3 PROCESOS PARA EL ENVÍO DE CONTENIDO

O

per

ador

/

Adm

inis

trad

or

Necesidad de ejecutar la

campaña activa

Ejecutar el inicio

de la campaña

activa

Subproceso

de envío de

contenido vía

Bluetooth

¿Está

pausado? Si

No

A continuación detallaremos como un subproceso, todas las actividades y evaluación de condiciones que ocurren durante el

envío de contenido Bluetooth.

Page 141: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

13

Oper

ador

/ A

dm

inis

trad

or

Subproceso de envío de

contenido iniciado

Búsqueda de

dispositivos

Registrar nueva

tarea pendiente

1

¿Ha detectado un

dispositivo?

¿El dispositivo

está autorizado?Si Si

1

No

2

2

No

2Búsqueda de

servicios

¿Existen tareas

pendientes?

¿Posee perfil

OBEX?Solicitud de envío

¿Aceptó la

solicitud?

3

3

Si

No

Si

No

2

4

4

3No

Enviar archivo de

contenido

multimedia

Registrar como no

autorizado

Registrar como no

autorizado

Page 142: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

2 DESCRIPCIÓN DE ESTRUCTURAS DE DATOS

Page 143: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

15

2.1 DIAGRAMA DEL MODELO ENTIDAD-RELACIÓN

Page 144: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

16

2.2 DICCIONARIO DE DATOS

CAMPANIAS

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_CAMPANIA

CLAVE FORÁNEA N/A

OBJETIVO Almacenar la configuración inicial para cada

campaña de marketing vía Bluetooth creada.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_CAMPANIA INT NO Identificación

única para cada

campaña de

marketing

configurada.

CAMPANIA VARCHAR(200) NO Nombre de la

campaña de

marketing

configurada.

DESCRIPCION VARCHAR(500) NO Descripción

detallada o

características de

la campaña de

marketing

configurada.

TIPO VARCHAR(1) NO Tipo de campaña

de acuerdo a su

ejecución.

(O=Operacional,

P=Permanente).

COSTO_REF_MENSAJE FLOAT NO Precio referencia

que tendrá cada

mensaje de

contenido enviado

por el sistema.

Necesario para

reportes

estadísticos.

FECHA_INICIO DATETIME NO Fecha y hora de

Page 145: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

17

inicio de la

campaña de

marketing

configurada.

FECHA_FIN DATETIME SI Fecha y hora de

finalización de la

campaña de

marketing

configurada. Si la

campaña es de

tipo Permanente,

este valor no será

necesario.

ESTADO VARCHAR(1) NO Estado del

registro de la

campaña de

marketing.

(A=Activa,

I=Inactiva).

DETALLE_CAMPANIAS

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_DETALLE_CAMPANIA

CLAVE FORÁNEA ID_CAMPANIA

OBJETIVO Almacenar las rutas de los archivos que se enviarán

como publicidad durante una determinada campaña

de marketing vía Bluetooth.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_DETALLE_CAMPA

NIA

INT NO Identificación

única para cada

detalle de

campaña

configurado.

ID_CAMPANIA INT NO Identificación

referencial de la

campaña de

marketing.

RUTA VARCHAR(256) NO Ruta absoluta de

Page 146: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

18

la ubicación del

archivo en el

disco duro.

TIPO VARCHAR(1) NO Tipo de archivo.

(A=Audio,

I=Imagen)

ESTADO VARCHAR(1) NO Estado del

registro de detalle

de campaña.

(A=Activo,

I=Inactivo).

DISPOSITIVOS

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_DISPOSITIVO

CLAVE FORÁNEA N/A

OBJETIVO Almacenar los dispositivos y sus respectivos

estados cada vez que se detecten durante la

ejecución de las campañas publicitarias.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_DISPOSITIVO INT NO Identificación

única para cada

dispositivo

configurado en el

sistema.

DIRECCION_BT VARCHAR(40) NO Dirección

Bluetooth del

dispositivo

detectado.

NOMBRE_BT VARCHAR(100) SI Nombre que

posea el

dispositivo

detectado.

ESTADO_BLOQUEADO VARCHAR(1) NO Determina si el

dispositivo se

encuentra o no en

un estado

bloqueado. (S=Si,

Page 147: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

19

N=No).

FECHA_ULTIMO_BLO

QUEO

DATETIME SI Fecha y hora en

que el dispositivo

fue bloqueado por

última vez.

ESTADO VARCHAR(1) NO Estado del

dispositivo en el

sistema.

(A=Activo,

I=Inactivo).

BITACORA_CAMPANIAS

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_BITACORA_CAMPANIA

CLAVE FORÁNEA ID_CAMPANIA, ID_USUARIO

OBJETIVO Registrar cada uno de los eventos que se generan

como producto del proceso de envío de un archivo

de publicidad hacia un dispositivo remoto.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_BITACORA_CAMPA

NIA

INT NO Identificación

única para cada

registro de

bitácora

generado.

ID_DETALLE_CAMPA

NIA

INT NO Identificación

referencial del

detalle de

campaña de

marketing.

ID_USUARIO INT NO Identificación

referencial del

usuario conectado

al sistema.

ID_DISPOSITIVO_DEST

INO

INT NO Identificación

referencial al

dispositivo.

FECHA_REGISTRO DATETIME NO Fecha y hora en

que se registra el

Page 148: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

20

evento.

EVENTO VARCHAR(1) NO Evento registrado.

(I=Inicio de

transmisión,

E=Transmisión

exitosa,

X=Transmisión

fallida,

C=Transmisión

cancelada por el

cliente)

OBSERVACIÓN VARCHAR(500) NO Cualquier

novedad que

ocurra durante el

proceso

correspondiente.

ESTADO VARCHAR(1) NO Estado del

registro de

bitácora.

(A=Activo,

I=Inactivo).

USUARIOS

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_USUARIO

CLAVE FORÁNEA ID_ROL

OBJETIVO Almacenar la información de todos los usuarios

administradores y operadores configurados en el

sistema.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_USUARIO INT NO Identificación

única para cada

usuario

configurado en el

sistema.

ID_ROL INT NO Identificación

referencial del rol

que posee el

Page 149: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

21

usuario.

USUARIO VARCHAR(20) NO Nombre del

usuario

configurado.

CLAVE VARCHAR(32) NO Contraseña para

inicio de sesión

para el usuario.

NOMBRES VARCHAR(60) NO Nombres de la

persona.

APELLIDOS VARCHAR(60) Apellidos de la

persona.

IDENTIFICACION VARCHAR(20) NO Identificación de

la persona.

Cédula.

ESTADO VARCHAR(1) NO Estado del

registro de

usuario de

sistema.

(A=Activo,

I=Inactivo).

ROLES

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_ROL

CLAVE FORÁNEA N/A

OBJETIVO Almacenar la información de todos los roles

configurados en el sistema.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_ROL INT NO Identificación

única para cada rol

configurado en el

sistema.

ROL VARCHAR(40) NO Nombre del rol

configurado.

ESTADO VARCHAR(1) NO Estado del registro

de rol de sistema.

(A=Activo,

I=Inactivo).

Page 150: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

22

PARAMETROS_GENERALES

ESQUEMA BLUECATCH

CLAVE PRIMARIA ID_PARAMETRO_GENERAL

CLAVE FORÁNEA N/A

OBJETIVO Almacenar temporalmente los dispositivos que

hayan pasado a un estado de bloqueo o restricción

hasta que el sistema se encargue de desbloquearlos.

CAMPO TIPO PERMITE

NULO

OBSERVACION

ID_PARAMETRO_GEN

ERAL

INT NO Identificación

única para cada

parámetro

configurado en el

sistema.

PARAMETRO VARCHAR(30) NO Nombre del

parámetro general

configurado.

DESCRIPCION VARCHAR(500) NO Descripción u

objetivo del

parámetro general

configurado.

VALOR VARCHAR(500) NO Valor del

parámetro

generado

configurado.

TIPO VARCHAR(1) NO Tipo del

parámetro

configurado.

(V=Valor,

M=Mensaje).

ESTADO VARCHAR(1) NO Estado del

registro de

parámetro de

sistema.

(A=Activo,

I=Inactivo).

Page 151: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

23

2.3 ESPACIO EN DISCO NECESARIO

Tomando en cuenta las tablas principales que intervienen en el proceso de creación,

modificación y ejecución de las campañas, se ha realizado una proyección para

calcular el espacio necesario en disco con el que s edeberá contar asumiendo que cada

uno de los campos de las tablas mencionadas esté lleno en su totalidad y que en la

ejecución de dicha campaña se cuente con las cantidades de dispositivos y eventos

referenciales aquí tomados en cuenta.

1 registro de campaña:

ID_CAMPANIA INT 4

CAMPANIA VARCHAR(200) 202

DESCRIPCION VARCHAR(500) 502

TIPO VARCHAR(1) 3

COSTO_REF_MENSAJE FLOAT 4

FECHA_INICIO DATETIME 8

FECHA_FIN DATETIME 8

ESTADO VARCHAR(1) 3

734 bytes

6 registros de detalles:

ID_DETALLE_CAMPANIA INT 4

ID_CAMPANIA INT 4

RUTA VARCHAR(256) 258

TIPO VARCHAR(1) 3

ESTADO VARCHAR(1) 3

6 x 272 bytes

1632 bytes

Page 152: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

24

100 resgistros de dispositivos:

ID_DISPOSITIVO INT 4

DIRECCION_BT VARCHAR(40) 42

NOMBRE_BT VARCHAR(100) 102

ESTADO_BLOQUEADO VARCHAR(1) 3

FECHA_ULTIMO_BLOQUEO DATETIME 8

ESTADO VARCHAR(1) 3

100 x 162 bytes

16200 bytes

600 resgistros de bitacora:

ID_BITACORA_CAMPANIA INT 4

ID_DETALLE_CAMPANIA INT 4

ID_USUARIO INT 4

ID_DISPOSITIVO_DESTINO INT 4

FECHA_REGISTRO DATETIME 8

EVENTO VARCHAR(1) 3

OBSERVACIÓN VARCHAR(500) 502

ESTADO VARCHAR(1) 3

600 x 532 bytes

319200 bytes

Total por campaña: 337766 bytes

329,85 kilobytes

Como nos podemos dar cuenta, con los valores hipotéticos planteados y basados en la

cantidad de memoria en bytes que ocupa cada campo de las tablas mencionadas,

podemos concluir que cada campaña que encuentre unos 100 dispositivos y a cada

uno le realice dos ciclos de transferencia de datos, ocupara 330 kilobytes en disco

duro aproximadamente.

Page 153: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

3 MODELOS ORIENTADOS A OBJETOS

Page 154: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

26

3.1 DIAGRAMA DE CASOS DE USO

Configurar

Parámetros Generales

*

*

Sistema BlueCatch

Configurar Campaña

Nueva

*

*

Configurar Tiempo

Inicio y Fin

Configurar

Archivos a enviar

«uses» «uses»

Ejecutar Campaña

Detener Campaña

Ejecutar Reporte

Sistema

*

*

*

*

*

*

Administrador

*

*

*

*

*

*

OperadorOperador

Ejecutar Reportes

Campaña

*

*

Rechazar solicitud

de contenido*

*

Aceptar solicitud

de contenido

*

*

Cliente

Page 155: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

27

3.2 DIAGRAMAS DE CLASES

3.2.1 Clases POJOs de entidades. (com.jabluecatch.entidades)

Page 156: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

28

3.2.2 Clases POJOs para objetos de transferencia de datos (com.jabluecatch.dto)

Page 157: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

29

3.2.3 Clases para objetos de acceso a datos (com.jabluecatch.dao)

Page 158: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

30

Page 159: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

31

3.2.4 Clases para objetos de negocio (com.jabluecatch.bo)

Page 160: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

32

Page 161: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

33

3.2.5 Clases para objetos de operaciones de comunicación (com.jabluecatch.comm)

Page 162: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

34

Page 163: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

35

3.2.6 Clases para objetos de utilería general (com.jabluecatch.util)

Page 164: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

36

Page 165: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

37

3.2.7 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de sistema

(com.jabluecatch.gui.sistema)

Page 166: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

38

Page 167: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

39

3.2.8 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de Campaña

(com.jabluecatch.gui.campania)

Page 168: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

40

Page 169: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

41

3.2.9 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de Reportes

(com.jabluecatch.gui.reportes)

Page 170: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

42

Page 171: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

43

3.2.10 Clases para objetos de interfaz gráfica de usuario generales (com.jabluecatch.gui)

Page 172: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

4 CÓDIGO FUENTE DE LA APLICACIÓN

Page 173: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

45

4.1 CLASES E INTERFACES JAVA

4.1.1 Paquete com.jabluecatch.entidades

4.1.1.1 BitacoraCampania

package com.jabluecatch.entidades; import java.util.Date; /** *POJO para mapeo de la entidad BITACORA_CAMPANIAS * @author Fausto Almeida */ public class BitacoraCampania { private int idBitacoraCampania; private int idDetalleCampania; private int idUsuario; private int idDispositivoDestino; private Date fechaRegistro; private String evento; private String observacion; private String estado; public BitacoraCampania() { } public BitacoraCampania(int idDetalleCampania, int idUsuario, int idDispositivoDestino, Date fechaRegistro, String evento, String observacion, String estado) { this.idDetalleCampania = idDetalleCampania; this.idUsuario = idUsuario; this.idDispositivoDestino = idDispositivoDestino; this.fechaRegistro = fechaRegistro; this.evento = evento; this.observacion = observacion; this.estado = estado; } public BitacoraCampania(int idBitacoraCampania, int idDetalleCampania, int idUsuario, int idDispositivoDestino, Date fechaRegistro, String evento, String observacion, String estado) { this.idBitacoraCampania = idBitacoraCampania; this.idDetalleCampania = idDetalleCampania; this.idUsuario = idUsuario; this.idDispositivoDestino = idDispositivoDestino; this.fechaRegistro = fechaRegistro; this.evento = evento; this.observacion = observacion;

Page 174: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

46

this.estado = estado; } /** * @return the idBitacoraCampania */ public int getIdBitacoraCampania() { return idBitacoraCampania; } /** * @param idBitacoraCampania the idBitacoraCampania to set */ public void setIdBitacoraCampania(int idBitacoraCampania) { this.idBitacoraCampania = idBitacoraCampania; } /** * @return the idDetalleCampania */ public int getIdDetalleCampania() { return idDetalleCampania; } /** * @param idDetalleCampania the idDetalleCampania to set */ public void setIdDetalleCampania(int idDetalleCampania) { this.idDetalleCampania = idDetalleCampania; } /** * @return the idUsuario */ public int getIdUsuario() { return idUsuario; } /** * @param idUsuario the idUsuario to set */ public void setIdUsuario(int idUsuario) { this.idUsuario = idUsuario; } /** * @return the idDispositivoDestino */ public int getIdDispositivoDestino() { return idDispositivoDestino; } /** * @param idDispositivoDestino the idDispositivoDestino to set */ public void setIdDispositivoDestino(int idDispositivoDestino) { this.idDispositivoDestino = idDispositivoDestino; }

Page 175: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

47

/** * @return the fecha_registro */ public Date getFechaRegistro() { return fechaRegistro; } /** * @param fecha_registro the fecha_registro to set */ public void setFechaRegistro(Date fechaRegistro) { this.fechaRegistro = fechaRegistro; } /** * @return the evento */ public String getEvento() { return evento; } /** * @param evento the evento to set */ public void setEvento(String evento) { this.evento = evento; } /** * @return the observacion */ public String getObservacion() { return observacion; } /** * @param observacion the observacion to set */ public void setObservacion(String observacion) { this.observacion = observacion; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } }

Page 176: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

48

4.1.1.2 Campania

package com.jabluecatch.entidades; import java.util.Date; /** *POJO para mapeo de la entidad CAMPANIAS * @author Fausto Almeida */ public class Campania { private int idCampania; private String campania; private String descripcion; private String tipo; private Float costoRefMensaje; private Date fechaInicio; private Date fechaFin; private String fase; private String estado; public Campania() { } public Campania(String campania, String descripcion, String tipo, Float costoRefMensaje, Date fechaInicio, Date fechaFin, String fase, String estado) { this.campania = campania; this.descripcion = descripcion; this.tipo = tipo; this.costoRefMensaje = costoRefMensaje; this.fechaInicio = fechaInicio; this.fechaFin = fechaFin; this.fase = fase; this.estado = estado; } public Campania(int idCampania, String campania, String descripcion, String tipo, Float costoRefMensaje, Date fechaInicio, Date fechaFin, String fase, String estado) { this.idCampania = idCampania; this.campania = campania; this.descripcion = descripcion; this.tipo = tipo; this.costoRefMensaje = costoRefMensaje; this.fechaInicio = fechaInicio; this.fechaFin = fechaFin; this.fase = fase; this.estado = estado; } /** * @return the idCampania */ public int getIdCampania() { return idCampania;

Page 177: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

49

} /** * @param idCampania the idCampania to set */ public void setIdCampania(int idCampania) { this.idCampania = idCampania; } /** * @return the campania */ public String getCampania() { return campania; } /** * @param campania the campania to set */ public void setCampania(String campania) { this.campania = campania; } /** * @return the descripcion */ public String getDescripcion() { return descripcion; } /** * @param descripcion the descripcion to set */ public void setDescripcion(String descripcion) { this.descripcion = descripcion; } /** * @return the tipo */ public String getTipo() { return tipo; } /** * @param tipo the tipo to set */ public void setTipo(String tipo) { this.tipo = tipo; } /** * @return the costoRefMensaje */ public Float getCostoRefMensaje() { return costoRefMensaje; }

Page 178: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

50

/** * @param costoRefMensaje the costoRefMensaje to set */ public void setCostoRefMensaje(Float costoRefMensaje) { this.costoRefMensaje = costoRefMensaje; } /** * @return the fechaInicio */ public Date getFechaInicio() { return fechaInicio; } /** * @param fechaInicio the fechaInicio to set */ public void setFechaInicio(Date fechaInicio) { this.fechaInicio = fechaInicio; } /** * @return the fechaFin */ public Date getFechaFin() { return fechaFin; } /** * @param fechaFin the fechaFin to set */ public void setFechaFin(Date fechaFin) { this.fechaFin = fechaFin; } /** * @return the fase */ public String getFase() { return fase; } /** * @param fase the fase to set */ public void setFase(String fase) { this.fase = fase; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set

Page 179: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

51

*/ public void setEstado(String estado) { this.estado = estado; } }

4.1.1.3 DetalleCampania

package com.jabluecatch.entidades; /** *POJO para mapeo de la entidad DETALLE_CAMPANIAS * @author Fausto Almeida */ public class DetalleCampania { private int idDetalleCampania; private int idCampania; private String ruta; private String tipo; private String estado; public DetalleCampania() { } public DetalleCampania(String ruta, String tipo, String estado) { this.ruta = ruta; this.tipo = tipo; this.estado = estado; } public DetalleCampania(int idCampania, String ruta, String tipo, String estado) { this.idCampania = idCampania; this.ruta = ruta; this.tipo = tipo; this.estado = estado; } public DetalleCampania(int idDetalleCampania, int idCampania, String ruta, String tipo, String estado) { this.idDetalleCampania = idDetalleCampania; this.idCampania = idCampania; this.ruta = ruta; this.tipo = tipo; this.estado = estado; } /** * @return the idDetalleCampania */ public int getIdDetalleCampania() { return idDetalleCampania; }

Page 180: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

52

/** * @param idDetalleCampania the idDetalleCampania to set */ public void setIdDetalleCampania(int idDetalleCampania) { this.idDetalleCampania = idDetalleCampania; } /** * @return the idCampania */ public int getIdCampania() { return idCampania; } /** * @param idCampania the idCampania to set */ public void setIdCampania(int idCampania) { this.idCampania = idCampania; } /** * @return the ruta */ public String getRuta() { return ruta; } /** * @param ruta the ruta to set */ public void setRuta(String ruta) { this.ruta = ruta; } /** * @return the tipo */ public String getTipo() { return tipo; } /** * @param tipo the tipo to set */ public void setTipo(String tipo) { this.tipo = tipo; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set

Page 181: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

53

*/ public void setEstado(String estado) { this.estado = estado; } }

4.1.1.4 Dispositivo

import java.util.Date; /** *POJO para mapeo de la entidad DISPOSITIVOS * @author Fausto Almeida */ public class Dispositivo { private int idDispositivo; private String direccionBt; private String nombreBt; private String estadoBloqueado; private Date fechaUltimoBloqueo; private String estado; public Dispositivo() { } public Dispositivo(String direccionBt, String estadoBloqueado, String estado) { this.direccionBt = direccionBt; this.estadoBloqueado = estadoBloqueado; this.estado = estado; } public Dispositivo(String direccionBt, String nombreBt, String estadoBloqueado, Date fechaUltimoBloqueo, String estado) { this.direccionBt = direccionBt; this.nombreBt = nombreBt; this.estadoBloqueado = estadoBloqueado; this.fechaUltimoBloqueo = fechaUltimoBloqueo; this.estado = estado; } public Dispositivo(int idDispositivo, String direccionBt, String nombreBt, String estadoBloqueado, Date fechaUltimoBloqueo, String estado) { this.idDispositivo = idDispositivo; this.direccionBt = direccionBt; this.nombreBt = nombreBt; this.estadoBloqueado = estadoBloqueado; this.fechaUltimoBloqueo = fechaUltimoBloqueo; this.estado = estado; } /** * @return the idDispositivo */ public int getIdDispositivo() {

Page 182: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

54

return idDispositivo; } /** * @param idDispositivo the idDispositivo to set */ public void setIdDispositivo(int idDispositivo) { this.idDispositivo = idDispositivo; } /** * @return the direccionBt */ public String getDireccionBt() { return direccionBt; } /** * @param direccionBt the direccionBt to set */ public void setDireccionBt(String direccionBt) { this.direccionBt = direccionBt; } /** * @return the nombreBt */ public String getNombreBt() { return nombreBt; } /** * @param nombreBt the nombreBt to set */ public void setNombreBt(String nombreBt) { this.nombreBt = nombreBt; } /** * @return the estadoBloqueado */ public String getEstadoBloqueado() { return estadoBloqueado; } /** * @param estadoBloqueado the estadoBloqueado to set */ public void setEstadoBloqueado(String estadoBloqueado) { this.estadoBloqueado = estadoBloqueado; } /** * @return the fechaUltimoBloqueo */ public Date getFechaUltimoBloqueo() { return fechaUltimoBloqueo; }

Page 183: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

55

/** * @param fechaUltimoBloqueo the fechaUltimoBloqueo to set */ public void setFechaUltimoBloqueo(Date fechaUltimoBloqueo) { this.fechaUltimoBloqueo = fechaUltimoBloqueo; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } }

4.1.1.5 ParametroGeneral

package com.jabluecatch.entidades; /** *POJO para mapeo de la entidad PARAMETROS_GENERALES * @author Fausto Almeida */ public class ParametroGeneral { private int idParametroGeneral; private String parametro; private String descripcion; private String valor; private String tipo; private String estado; public ParametroGeneral() { } public ParametroGeneral(String parametro, String descripcion, String valor, String tipo, String estado) { this.parametro = parametro; this.descripcion = descripcion; this.valor = valor; this.tipo = tipo; this.estado = estado; } public ParametroGeneral(int idParametroGeneral, String parametro, String descripcion, String valor, String tipo, String estado) { this.idParametroGeneral = idParametroGeneral;

Page 184: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

56

this.parametro = parametro; this.descripcion = descripcion; this.valor = valor; this.tipo = tipo; this.estado = estado; } /** * @return the idParametroGeneral */ public int getIdParametroGeneral() { return idParametroGeneral; } /** * @param idParametroGeneral the idParametroGeneral to set */ public void setIdParametroGeneral(int idParametroGeneral) { this.idParametroGeneral = idParametroGeneral; } /** * @return the parametro */ public String getParametro() { return parametro; } /** * @param parametro the parametro to set */ public void setParametro(String parametro) { this.parametro = parametro; } /** * @return the descripcion */ public String getDescripcion() { return descripcion; } /** * @param descripcion the descripcion to set */ public void setDescripcion(String descripcion) { this.descripcion = descripcion; } /** * @return the valor */ public String getValor() { return valor; } /** * @param valor the valor to set

Page 185: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

57

*/ public void setValor(String valor) { this.valor = valor; } /** * @return the tipo */ public String getTipo() { return tipo; } /** * @param tipo the tipo to set */ public void setTipo(String tipo) { this.tipo = tipo; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } }

4.1.1.6 Rol

package com.jabluecatch.entidades; /** *POJO para mapeo de la entidad ROLES * @author Fausto Almeida */ public class Rol { private int idRol; private String rol; private String estado; public Rol() { } public Rol(String rol, String estado) { this.rol = rol; this.estado = estado; }

Page 186: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

58

public Rol(int idRol, String rol, String estado) { this.idRol = idRol; this.rol = rol; this.estado = estado; } /** * @return the idRol */ public int getIdRol() { return idRol; } /** * @param idRol the idRol to set */ public void setIdRol(int idRol) { this.idRol = idRol; } /** * @return the rol */ public String getRol() { return rol; } /** * @param rol the rol to set */ public void setRol(String rol) { this.rol = rol; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } }

4.1.1.7 Usuario

package com.jabluecatch.entidades; /**

Page 187: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

59

*POJO para mapeo de la entidad USUARIOS * @author Fausto Almeida */ public class Usuario { private int idUsuario; private int idRol; private String usuario; private String clave; private String nombres; private String apellidos; private String identificacion; private String estado; public Usuario() { } public Usuario(int id_rol, String usuario, String clave, String nombres, String apellidos, String identificacion, String estado) { this.idRol = id_rol; this.usuario = usuario; this.clave = clave; this.nombres = nombres; this.apellidos = apellidos; this.identificacion = identificacion; this.estado = estado; } public Usuario(int id_usuario, int id_rol, String usuario, String clave, String nombres, String apellidos, String identificacion, String estado) { this.idUsuario = id_usuario; this.idRol = id_rol; this.usuario = usuario; this.clave = clave; this.nombres = nombres; this.apellidos = apellidos; this.identificacion = identificacion; this.estado = estado; } /** * @return the id_usuario */ public int getIdUsuario() { return idUsuario; } /** * @param id_usuario the id_usuario to set */ public void setIdUsuario(int idUsuario) { this.idUsuario = idUsuario; } /** * @return the id_rol */ public int getIdRol() {

Page 188: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

60

return idRol; } /** * @param id_rol the id_rol to set */ public void setIdRol(int idRol) { this.idRol = idRol; } /** * @return the usuario */ public String getUsuario() { return usuario; } /** * @param usuario the usuario to set */ public void setUsuario(String usuario) { this.usuario = usuario; } /** * @return the clave */ public String getClave() { return clave; } /** * @param clave the clave to set */ public void setClave(String clave) { this.clave = clave; } /** * @return the nombres */ public String getNombres() { return nombres; } /** * @param nombres the nombres to set */ public void setNombres(String nombres) { this.nombres = nombres; } /** * @return the apellidos */ public String getApellidos() { return apellidos; }

Page 189: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

61

/** * @param apellidos the apellidos to set */ public void setApellidos(String apellidos) { this.apellidos = apellidos; } /** * @return the identificacion */ public String getIdentificacion() { return identificacion; } /** * @param identificacion the identificacion to set */ public void setIdentificacion(String identificacion) { this.identificacion = identificacion; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } }

4.1.2 Paquete com.jabluecatch.dto

4.1.2.1 ConsultaCampanias

package com.jabluecatch.dto; /** * POJO para representación de una consulta de campañas para la ventana de * consulta y para la lista de valores (LOV) * @author Fausto Almeida */ public class ConsultaCampanias {

Page 190: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

62

private int idCampania; private String campania; private String tipo; private String fechaInicio; private String fechaFin; private String fase; public ConsultaCampanias() { } public ConsultaCampanias(String campania, String tipo, String fechaInicio, String fechaFin, String fase) { this.campania = campania; this.tipo = tipo; this.fechaInicio = fechaInicio; this.fechaFin = fechaFin; this.fase = fase; } public ConsultaCampanias(int idCampania, String campania, String tipo, String fechaInicio, String fechaFin, String fase) { this.idCampania = idCampania; this.campania = campania; this.tipo = tipo; this.fechaInicio = fechaInicio; this.fechaFin = fechaFin; this.fase = fase; } /** * @return the idCampania */ public int getIdCampania() { return idCampania; } /** * @param idCampania the idCampania to set */ public void setIdCampania(int idCampania) { this.idCampania = idCampania; } /** * @return the campania */ public String getCampania() { return campania; } /** * @param campania the campania to set */ public void setCampania(String campania) { this.campania = campania; } /**

Page 191: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

63

* @return the tipo */ public String getTipo() { return tipo; } /** * @param tipo the tipo to set */ public void setTipo(String tipo) { this.tipo = tipo; } /** * @return the fechaInicio */ public String getFechaInicio() { return fechaInicio; } /** * @param fechaInicio the fechaInicio to set */ public void setFechaInicio(String fechaInicio) { this.fechaInicio = fechaInicio; } /** * @return the fechaFin */ public String getFechaFin() { return fechaFin; } /** * @param fechaFin the fechaFin to set */ public void setFechaFin(String fechaFin) { this.fechaFin = fechaFin; } /** * @return the fase */ public String getFase() { return fase; } /** * @param fase the fase to set */ public void setFase(String fase) { this.fase = fase; } }

Page 192: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

64

4.1.2.2 ConsultaUsuarios

package com.jabluecatch.dto; /** * POJO para representación de una consulta de usuarios para la ventana de * consulta de usuarios * @author Fausto Almeida */ public class ConsultaUsuarios { private int idUsuario; private String usuario; private String rol; private String nombres; private String apellidos; public ConsultaUsuarios() { } public ConsultaUsuarios(String usuario, String rol, String nombres, String apellidos) { this.usuario = usuario; this.rol = rol; this.nombres = nombres; this.apellidos = apellidos; } public ConsultaUsuarios(int idUsuario, String usuario, String rol, String nombres, String apellidos) { this.idUsuario = idUsuario; this.usuario = usuario; this.rol = rol; this.nombres = nombres; this.apellidos = apellidos; } /** * @return the idUsuario */ public int getIdUsuario() { return idUsuario; } /** * @param idUsuario the idUsuario to set */ public void setIdUsuario(int idUsuario) { this.idUsuario = idUsuario; } /** * @return the usuario */ public String getUsuario() { return usuario;

Page 193: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

65

} /** * @param usuario the usuario to set */ public void setUsuario(String usuario) { this.usuario = usuario; } /** * @return the rol */ public String getRol() { return rol; } /** * @param rol the rol to set */ public void setRol(String rol) { this.rol = rol; } /** * @return the nombres */ public String getNombres() { return nombres; } /** * @param nombres the nombres to set */ public void setNombres(String nombres) { this.nombres = nombres; } /** * @return the apellidos */ public String getApellidos() { return apellidos; } /** * @param apellidos the apellidos to set */ public void setApellidos(String apellidos) { this.apellidos = apellidos; } }

4.1.2.3 Tarea

package com.jabluecatch.dto;

Page 194: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

66

import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.entidades.Dispositivo; import javax.bluetooth.RemoteDevice; /** * POJO para representación de un registro de tarea en el monitor del sistema * @author Fausto Almeida */ public class Tarea { //private BitacoraCampania bitacora; private int idTarea; private RemoteDevice servidor; private Dispositivo receptor; private String urlServidor; private DetalleCampania archivoAEnviar; private String estado; private String porcentajeCompletado; public Tarea() { } public Tarea(int idTarea, RemoteDevice servidor, Dispositivo receptor, DetalleCampania archivoAEnviar, String estado, String porcentajeCompletado) { this.idTarea = idTarea; this.servidor = servidor; this.receptor = receptor; this.archivoAEnviar = archivoAEnviar; this.estado = estado; this.porcentajeCompletado = porcentajeCompletado; } /** * @return the idTarea */ public int getIdTarea() { return idTarea; } /** * @return the servidor */ public RemoteDevice getServidor() { return servidor; } /** * @param servidor the servidor to set */ public void setServidor(RemoteDevice servidor) { this.servidor = servidor; } /** * @return the receptor */ public Dispositivo getReceptor() {

Page 195: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

67

return receptor; } /** * @param receptor the receptor to set */ public void setReceptor(Dispositivo receptor) { this.receptor = receptor; } /** * @return the urlServidor */ public String getUrlServidor() { return urlServidor; } /** * @param urlServidor the urlServidor to set */ public void setUrlServidor(String urlServidor) { this.urlServidor = urlServidor; } /** * @return the archivoAEnviar */ public DetalleCampania getArchivoAEnviar() { return archivoAEnviar; } /** * @param archivoAEnviar the archivoAEnviar to set */ public void setArchivoAEnviar(DetalleCampania archivoAEnviar) { this.archivoAEnviar = archivoAEnviar; } /** * @return the estado */ public String getEstado() { return estado; } /** * @param estado the estado to set */ public void setEstado(String estado) { this.estado = estado; } /** * @return the porcentajeEnviado */ public String getPorcentajeCompletado() { return porcentajeCompletado; }

Page 196: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

68

/** * @param porcentajeEnviado the porcentajeEnviado to set */ public void setPorcentajeCompletado(String porcentajeCompletado) { this.porcentajeCompletado = porcentajeCompletado; } }

4.1.3 Paquete com.jabluecatch.dao

4.1.3.1 BitacoraCampaniaDAO

package com.jabluecatch.dao; import com.jabluecatch.entidades.BitacoraCampania; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Date; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad BITACORA_CAMPANIAS * @author Fas */ public class BitacoraCampaniaDAO { private static Logger logger = Logger.getLogger(BitacoraCampaniaDAO.class); public static void insertar(BitacoraCampania bc) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("INSERT INTO bitacora_campanias (id_detalle_campania, id_usuario, id_dispositivo_destino, fecha_registro, evento, observacion, estado) " + "VALUES (?, ?, ?, ?, ?, ?, ?)"); pst.setInt(1, bc.getIdDetalleCampania()); pst.setInt(2, bc.getIdUsuario()); pst.setInt(3, bc.getIdDispositivoDestino()); pst.setTimestamp(4, new Timestamp(bc.getFechaRegistro().getTime())); pst.setString(5, bc.getEvento()); pst.setString(6, bc.getObservacion());

Page 197: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

69

pst.setString(7, bc.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); } } public static void actualizar(BitacoraCampania bc) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE bitacora_campanias SET id_detalle_campania = ? " + ", id_usuario = ? " + ", id_dispositivo_destino = ? " + ", fecha_registro = ? " + ", evento = ? " + ", observacion = ? " + ", estado = ? WHERE id_bitacora_campania = ? "); pst.setInt(1, bc.getIdDetalleCampania()); pst.setInt(2, bc.getIdUsuario()); pst.setInt(3, bc.getIdDispositivoDestino()); pst.setTimestamp(4, new Timestamp(bc.getFechaRegistro().getTime())); pst.setString(5, bc.getEvento()); pst.setString(6, bc.getObservacion()); pst.setString(7, bc.getEstado()); pst.setInt(8, bc.getIdBitacoraCampania()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } } public static BitacoraCampania buscarPorPK(int idBitacoraCampania) throws ErrorAplicativo { BitacoraCampania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_bitacora_campania, " + "id_detalle_campania, " + "id_usuario, " + "id_dispositivo_destino, "

Page 198: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

70

+ "fecha_registro, " + "evento, " + "observacion, " + "estado " + "FROM bitacora_campanias WHERE id_bitacora_campania = ? " + "AND estado = 'A'"); pst.setInt(1, idBitacoraCampania); rs = pst.executeQuery(); while (rs.next()) { result = new BitacoraCampania(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getInt(4), rs.getTimestamp(5), rs.getString(6), rs.getString(7), rs.getString(8)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static BitacoraCampania buscarIdDispositivoDestinoYFechaRegistro(int idDispositivoDestino, Date fechaRegistro) throws ErrorAplicativo { BitacoraCampania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_bitacora_campania, " + "id_detalle_campania, " + "id_usuario, " + "id_dispositivo_destino, " + "fecha_registro, " + "evento, " + "observacion, " + "estado " + "FROM bitacora_campanias WHERE id_dispositivo_destino = ? " + "AND fecha_registro = ? " + "AND estado = 'A'"); pst.setInt(1, idDispositivoDestino); pst.setTimestamp(2, new Timestamp(fechaRegistro.getTime()));

Page 199: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

71

rs = pst.executeQuery(); while (rs.next()) { result = new BitacoraCampania(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getInt(4), rs.getTimestamp(5), rs.getString(6), rs.getString(7), rs.getString(8)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.2 CampaniaDAO

package com.jabluecatch.dao; import com.jabluecatch.entidades.Campania; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Date; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad CAMPANIAS * @author Fas */ public class CampaniaDAO { private static Logger logger = Logger.getLogger(CampaniaDAO.class); public static void insertar(Campania ca) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try {

Page 200: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

72

PreparedStatement pst = c.prepareStatement("INSERT INTO campanias (campania, descripcion, tipo, costo_ref_mensaje, fecha_inicio, fecha_fin, fase, estado) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); pst.setString(1, ca.getCampania()); pst.setString(2, ca.getDescripcion()); pst.setString(3, ca.getTipo()); pst.setFloat(4, ca.getCostoRefMensaje()); pst.setTimestamp(5, new Timestamp(ca.getFechaInicio().getTime())); pst.setTimestamp(6, (ca.getTipo().equals("O") ? new Timestamp(ca.getFechaFin().getTime()) : null)); pst.setString(7, ca.getFase()); pst.setString(8, ca.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); } } public static void actualizar(Campania ca) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE campanias SET campania = ? " + ", descripcion = ? " + ", tipo = ? " + ", costo_ref_mensaje = ? " + ", fecha_inicio = ? " + ", fecha_fin = ? " + ", fase = ? " + ", estado = ? WHERE id_campania = ? "); pst.setString(1, ca.getCampania()); pst.setString(2, ca.getDescripcion()); pst.setString(3, ca.getTipo()); pst.setFloat(4, ca.getCostoRefMensaje()); pst.setTimestamp(5, new Timestamp(ca.getFechaInicio().getTime())); pst.setTimestamp(6, (ca.getFechaFin() != null ? new Timestamp(ca.getFechaFin().getTime()) : null)); pst.setString(7, ca.getFase()); pst.setString(8, ca.getEstado()); pst.setInt(9, ca.getIdCampania()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage());

Page 201: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

73

} } public static Campania buscarPorPK(int idCampania) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE id_campania = ? " + "AND estado = 'A'"); pst.setInt(1, idCampania); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorFechaReferencial(Date fechaReferencial) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, "

Page 202: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

74

+ "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE ? " + "BETWEEN fecha_inicio AND IFNULL(fecha_fin,NOW()) " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fechaReferencial.getTime())); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaReferencial - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorFechaReferencial", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorFechaInicio(Date fechaInicio) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE fecha_inicio = ? "

Page 203: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

75

+ "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fechaInicio.getTime())); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaReferencial - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorFechaReferencial", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorIdCampaniaYFechaReferencial(int idCampania, Date fechaReferencial) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE ? " + "BETWEEN fecha_inicio AND fecha_fin " + "AND id_campania <> ? " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fechaReferencial.getTime())); pst.setInt(2, idCampania); rs = pst.executeQuery(); while (rs.next()) {

Page 204: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

76

result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorIdCampaniaYFechaReferencial - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorIdCampaniaYFechaReferencial", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorFechaInicioMasCercana() throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE fecha_inicio > NOW() " + "AND estado = 'A' " + "ORDER BY fecha_inicio DESC " + "LIMIT 1"); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9));

Page 205: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

77

} rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaInicioMasCercana - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorFechaInicioMasCercana", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorFechaInicioMasCercana(Date fecha) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE fecha_inicio > ? " + "AND estado = 'A' " + "ORDER BY fecha_inicio DESC " + "LIMIT 1"); pst.setTimestamp(1, new Timestamp(fecha.getTime())); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaInicioMasCercana - Error al ejecutar la consulta - " + sqle.getMessage());

Page 206: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

78

throw new ErrorAplicativo("CampaniaDAO", "buscarPorFechaInicioMasCercana", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Campania buscarPorOtraFechaInicioMasCercana(int idCampania, Date fecha) throws ErrorAplicativo { Campania result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE fecha_inicio > ? " + "AND id_campania <> ? " + "AND estado = 'A' " + "ORDER BY fecha_inicio DESC " + "LIMIT 1"); pst.setTimestamp(1, new Timestamp(fecha.getTime())); pst.setInt(2, idCampania); rs = pst.executeQuery(); while (rs.next()) { result = new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaInicioMasCercana - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarPorFechaInicioMasCercana", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null;

Page 207: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

79

} return result; } public static Vector buscarCampaniasRodeadas(Date fechaInicio, Date fechaFin) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE (fecha_inicio BETWEEN ? AND ? " + "OR fecha_fin BETWEEN ? AND ? ) " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fechaInicio.getTime())); pst.setTimestamp(2, new Timestamp(fechaFin.getTime())); pst.setTimestamp(3, new Timestamp(fechaInicio.getTime())); pst.setTimestamp(4, new Timestamp(fechaFin.getTime())); rs = pst.executeQuery(); while (rs.next()) { result.add(new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarCampaniasRodeadas - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarCampaniasRodeadas", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarOtrasCampaniasRodeadas(int idCampania, Date fechaInicio, Date fechaFin) throws ErrorAplicativo {

Page 208: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

80

Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE (fecha_inicio BETWEEN ? AND ? " + "OR fecha_fin BETWEEN ? AND ? ) " + "AND id_campania <> ? " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fechaInicio.getTime())); pst.setTimestamp(2, new Timestamp(fechaFin.getTime())); pst.setTimestamp(3, new Timestamp(fechaInicio.getTime())); pst.setTimestamp(4, new Timestamp(fechaFin.getTime())); pst.setInt(5, idCampania); rs = pst.executeQuery(); while (rs.next()) { result.add(new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarCampaniasRodeadas - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarCampaniasRodeadas", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarCampaniasPermanentesIniciadas(Date fecha) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null;

Page 209: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

81

try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE ? " + "BETWEEN fecha_inicio AND ? " + "AND tipo = 'P' " + "AND fase <> 'F' " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fecha.getTime())); pst.setTimestamp(2, new Timestamp(fecha.getTime())); rs = pst.executeQuery(); while (rs.next()) { result.add(new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarCampaniasPermanentesIniciadas - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarCampaniasPermanentesIniciadas", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarOtrasCampaniasPermanentesIniciadas(int idCampania, Date fecha) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, "

Page 210: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

82

+ "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, " + "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE ? " + "BETWEEN fecha_inicio AND ? " + "AND tipo = 'P' " + "AND fase <> 'F' " + "AND id_campania <> ? " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fecha.getTime())); pst.setTimestamp(2, new Timestamp(fecha.getTime())); pst.setInt(3, idCampania); rs = pst.executeQuery(); while (rs.next()) { result.add(new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarCampaniasPermanentesIniciadas - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarCampaniasPermanentesIniciadas", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarCampaniasFinalizadas(Date fecha) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_campania, " + "campania, " + "descripcion, " + "tipo, " + "costo_ref_mensaje, " + "fecha_inicio, "

Page 211: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

83

+ "fecha_fin, " + "fase, " + "estado " + "FROM campanias WHERE fecha_fin <= ? " + "AND estado = 'A'"); pst.setTimestamp(1, new Timestamp(fecha.getTime())); rs = pst.executeQuery(); while (rs.next()) { result.add(new Campania(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getFloat(5), rs.getTimestamp(6), (rs.getString(4).equals("O") ? rs.getTimestamp(7) : null), rs.getString(8), rs.getString(9))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarCampaniasFinalizadas - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaDAO", "buscarCampaniasFinalizadas", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.3 ConsultaCampaniasDAO

package com.jabluecatch.dao; import com.jabluecatch.dto.ConsultaCampanias; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad de transferencia * ConsultaCampanias * @author Fas */ public class ConsultaCampaniasDAO {

Page 212: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

84

private static Logger logger = Logger.getLogger(ConsultaCampaniasDAO.class); public static Vector buscarPorPatronCampania(String patronCampania) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT c.id_campania, " + "c.campania, " + "c.tipo, " + "DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y %H:%i:%S'), " + "DATE_FORMAT(c.fecha_fin,'%d/%m/%Y %H:%i:%S'), " + "c.fase " + "FROM campanias c WHERE c.campania LIKE ? " + "AND c.estado = 'A' " + "ORDER BY fecha_inicio"); pst.setString(1, "%" + patronCampania + "%"); rs = pst.executeQuery(); while (rs.next()) { result.add(new ConsultaCampanias(rs.getInt(1), rs.getString(2), (rs.getString(3).equals("O") ? "Operativa" : "Automática"), rs.getString(4), rs.getString(5), rs.getString(6))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPatronCampania - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaCampaniasDAO", "buscarPorPatronCampania", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarPorFechaReferencial(String fechaReferencial) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT c.id_campania, " + "c.campania, " + "c.tipo, "

Page 213: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

85

+ "DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y %H:%i:%S'), " + "DATE_FORMAT(c.fecha_fin,'%d/%m/%Y %H:%i:%S'), " + "c.fase " + "FROM campanias c WHERE DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y') LIKE ? " + "OR DATE_FORMAT(c.fecha_fin,'%d/%m/%Y') LIKE ? " + "AND c.estado = 'A' " + "ORDER BY fecha_inicio"); pst.setString(1, "%" + fechaReferencial + "%"); pst.setString(2, "%" + fechaReferencial + "%"); rs = pst.executeQuery(); while (rs.next()) { result.add(new ConsultaCampanias(rs.getInt(1), rs.getString(2), (rs.getString(3).equals("O") ? "Operativa" : "Automática"), rs.getString(4), rs.getString(5), rs.getString(6))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorFechaReferencial - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaCampaniasDAO", "buscarPorFechaReferencial", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarPorPatronCampaniaYFechaReferencial(String patronCampania, String fechaReferencial) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT c.id_campania, " + "c.campania, " + "c.tipo, " + "DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y %H:%i:%S'), " + "DATE_FORMAT(c.fecha_fin,'%d/%m/%Y %H:%i:%S'), " + "c.fase " + "FROM campanias c WHERE c.campania LIKE ? " + "AND (DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y') LIKE ? " + "OR DATE_FORMAT(c.fecha_fin,'%d/%m/%Y') LIKE ?) " + "AND c.estado = 'A' " + "ORDER BY fecha_inicio"); pst.setString(1, "%" + patronCampania + "%"); pst.setString(2, "%" + fechaReferencial + "%"); pst.setString(3, "%" + fechaReferencial + "%");

Page 214: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

86

rs = pst.executeQuery(); while (rs.next()) { result.add(new ConsultaCampanias(rs.getInt(1), rs.getString(2), (rs.getString(3).equals("O") ? "Operativa" : "Automática"), rs.getString(4), rs.getString(5), rs.getString(6))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPatronCampaniaYFechaReferencial - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaCampaniasDAO", "buscarPorPatronCampaniaYFechaReferencial", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.4 ConsultaUsuariosDAO

package com.jabluecatch.dao; import com.jabluecatch.dto.ConsultaUsuarios; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad de transferencia * ConsultaUsuarios * @author Fas */ public class ConsultaUsuariosDAO { private static Logger logger = Logger.getLogger(ConsultaUsuariosDAO.class); public static Vector buscarPorPatronUsuario(String patronUsuario) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null;

Page 215: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

87

try { PreparedStatement pst = c.prepareStatement("SELECT u.id_usuario, " + "u.usuario, " + "r.rol, " + "u.nombres, " + "u.apellidos " + "FROM usuarios u, roles r WHERE u.id_rol = r.id_rol " + "AND u.usuario LIKE ? " + "AND u.estado = 'A' " + "AND r.estado = 'A'"); pst.setString(1, "%" + patronUsuario + "%"); rs = pst.executeQuery(); while (rs.next()) { result.add(new ConsultaUsuarios(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPatronUsuario - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaUsuariosDAO", "buscarPorPatronUsuario", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarPorPatronNombreYApellido(String patronNombreYApellido) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT u.id_usuario, " + "u.usuario, " + "r.rol, " + "u.nombres, " + "u.apellidos " + "FROM usuarios u, roles r WHERE u.id_rol = r.id_rol " + "AND (u.nombres LIKE ? " + "OR u.apellidos LIKE ?) " + "AND u.estado = 'A' " + "AND r.estado = 'A'"); pst.setString(1, "%" + patronNombreYApellido + "%"); pst.setString(2, "%" + patronNombreYApellido + "%"); rs = pst.executeQuery();

Page 216: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

88

while (rs.next()) { result.add(new ConsultaUsuarios(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPatronNombreYApellido - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaUsuariosDAO", "buscarPorPatronNombreYApellido", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarPorPatronUsuarioYNombreYApellido(String patronUsuario, String patronNombreYApellido) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT u.id_usuario, " + "u.usuario, " + "r.rol, " + "u.nombres, " + "u.apellidos " + "FROM usuarios u, roles r WHERE u.id_rol = r.id_rol " + "AND u.usuario LIKE ? " + "AND (u.nombres LIKE ? " + "OR u.apellidos LIKE ?) " + "AND u.estado = 'A' " + "AND r.estado = 'A'"); pst.setString(1, "%" + patronUsuario + "%"); pst.setString(2, "%" + patronNombreYApellido + "%"); pst.setString(3, "%" + patronNombreYApellido + "%"); rs = pst.executeQuery(); while (rs.next()) { result.add(new ConsultaUsuarios(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5))); } rs.close(); } catch (SQLException sqle) {

Page 217: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

89

logger.warn("buscarPorPatronUsuarioYNombreYApellido - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ConsultaUsuariosDAO", "buscarPorPatronUsuarioYNombreYApellido", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.5 DetalleCampaniaDAO

package com.jabluecatch.dao; import com.jabluecatch.util.Conexion; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad DETALLE_CAMPANIAS * @author Fas */ public class DetalleCampaniaDAO { private static Logger logger = Logger.getLogger(DetalleCampaniaDAO.class); public static void insertar(DetalleCampania dc) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("INSERT INTO detalle_campanias (id_campania, ruta, tipo, estado) " + "VALUES (?, ?, ?, ?)"); pst.setInt(1, dc.getIdCampania()); pst.setString(2, dc.getRuta()); pst.setString(3, dc.getTipo()); pst.setString(4, dc.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("DetalleCampaniaDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage());

Page 218: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

90

} } public static void actualizar(DetalleCampania dc) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE detalle_campanias SET id_campania = ? " + ", ruta = ? " + ", tipo = ? " + ", estado = ? WHERE id_detalle_campania = ? "); pst.setInt(1, dc.getIdCampania()); pst.setString(2, dc.getRuta()); pst.setString(3, dc.getTipo()); pst.setString(4, dc.getEstado()); pst.setInt(5, dc.getIdDetalleCampania()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("DetalleCampaniaDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } } public static void eliminar(DetalleCampania dc) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("DELETE FROM detalle_campanias WHERE id_detalle_campania = ? "); pst.setInt(1, dc.getIdDetalleCampania()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("eliminar - Error al ejecutar la eliminación - " + sqle.getMessage()); throw new ErrorAplicativo("DetalleCampaniaDAO", "eliminar", "Error al ejecutar la eliminación", sqle.getMessage()); } } public static Vector buscarPorIdCampania(int idCampania) throws ErrorAplicativo { Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try {

Page 219: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

91

PreparedStatement pst = c.prepareStatement("SELECT id_detalle_campania, " + "id_campania, " + "ruta, " + "tipo, " + "estado " + "FROM detalle_campanias WHERE id_campania = ? " + "AND estado = 'A'"); pst.setInt(1, idCampania); rs = pst.executeQuery(); while (rs.next()) { result.add(new DetalleCampania(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4), rs.getString(5))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("DetalleCampaniaDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.6 DispositivoDAO

package com.jabluecatch.dao; import com.jabluecatch.entidades.Dispositivo; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad DISPOSITIVOS * @author Fas */ public class DispositivoDAO { private static Logger logger = Logger.getLogger(DispositivoDAO.class);

Page 220: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

92

public static void insertar(Dispositivo d) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("INSERT INTO dispositivos (direccion_bt, nombre_bt, estado_bloqueado, fecha_ultimo_bloqueo, estado) " + "VALUES (?, ?, ?, ?, ?)"); pst.setString(1, d.getDireccionBt()); pst.setString(2, d.getNombreBt()); pst.setString(3, d.getEstadoBloqueado()); pst.setTimestamp(4, (d.getFechaUltimoBloqueo() != null ? new Timestamp(d.getFechaUltimoBloqueo().getTime()) : null)); pst.setString(5, d.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); } } public static void actualizar(Dispositivo d) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE dispositivos SET direccion_bt = ? " + ", nombre_bt = ? " + ", estado_bloqueado = ? " + ", fecha_ultimo_bloqueo = ? " + ", estado = ? WHERE id_dispositivo = ? "); pst.setString(1, d.getDireccionBt()); pst.setString(2, d.getNombreBt()); pst.setString(3, d.getEstadoBloqueado()); pst.setTimestamp(4, (d.getFechaUltimoBloqueo() != null ? new Timestamp(d.getFechaUltimoBloqueo().getTime()) : null)); pst.setString(5, d.getEstado()); pst.setInt(6, d.getIdDispositivo()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } }

Page 221: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

93

public static Dispositivo buscarPorPK(int idDispositivo) throws ErrorAplicativo { Dispositivo result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_dispositivo, " + "direccion_bt, " + "nombre_bt, " + "estado_bloqueado, " + "fecha_ultimo_bloqueo, " + "estado " + "FROM dispositivos WHERE id_dispositivo = ? " + "AND estado = 'A'"); pst.setInt(1, idDispositivo); rs = pst.executeQuery(); while (rs.next()) { result = new Dispositivo(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getTimestamp(5), rs.getString(6)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Dispositivo buscarPorDireccionBt(String direccionBt) throws ErrorAplicativo { Dispositivo result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_dispositivo, " + "direccion_bt, " + "nombre_bt, " + "estado_bloqueado, " + "fecha_ultimo_bloqueo, " + "estado " + "FROM dispositivos WHERE direccion_bt = ? " + "AND estado = 'A'");

Page 222: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

94

pst.setString(1, direccionBt); rs = pst.executeQuery(); while (rs.next()) { result = new Dispositivo(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getTimestamp(5), rs.getString(6)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorDireccionBt - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoDAO", "buscarPorDireccionBt", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.7 GestorReportesDAO

package com.jabluecatch.dao; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para el gestor de reportes Jasper * @author Fas */ public class GestorReportesDAO { private static Logger logger = Logger.getLogger(GestorReportesDAO.class); public static JasperPrint obtenerImpresion(JasperReport reporte, Map parametros) throws ErrorAplicativo { try { return JasperFillManager.fillReport(reporte, parametros, Conexion.getConexion()); } catch (JRException jre) {

Page 223: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

95

logger.warn("obtenerImpresion - Error al obtener el Reporte - " + jre.getMessage()); throw new ErrorAplicativo("GestorReportesDAO", "obtenerImpresion", "Error al obtener la impresión del reporte", jre.getMessage()); } } }

4.1.3.8 ParametroGeneralDAO

package com.jabluecatch.dao; import com.jabluecatch.util.Conexion; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad PARAMETROS_GENERALES * @author Fas */ public class ParametroGeneralDAO { private static Logger logger = Logger.getLogger(ParametroGeneralDAO.class); public static void insertar(ParametroGeneral p) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("INSERT INTO parametros_generales (parametro, descripcion, valor, tipo, estado) " + "VALUES (?, ?, ?, ?, ?)"); pst.setString(1, p.getParametro()); pst.setString(2, p.getDescripcion()); pst.setString(3, p.getValor()); pst.setString(4, p.getTipo()); pst.setString(5, p.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("ParametroGeneralDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); } } public static void actualizar(ParametroGeneral p) throws ErrorAplicativo {

Page 224: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

96

Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE parametros_generales SET parametro = ? " + ", descripcion = ? " + ", valor = ? " + ", tipo = ? " + ", estado = ? WHERE id_parametro_general = ? "); pst.setString(1, p.getParametro()); pst.setString(2, p.getDescripcion()); pst.setString(3, p.getValor()); pst.setString(4, p.getTipo()); pst.setString(5, p.getEstado()); pst.setInt(6, p.getIdParametroGeneral()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("ParametroGeneralDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } } public static ParametroGeneral buscarPorParametro(String parametro) throws ErrorAplicativo { ParametroGeneral result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_parametro_general, " + "parametro, " + "descripcion, " + "valor, " + "tipo, " + "estado " + "FROM parametros_generales WHERE parametro = ? " + "AND estado = 'A'"); pst.setString(1, parametro); rs = pst.executeQuery(); while (rs.next()) { result = new ParametroGeneral(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6)); }

Page 225: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

97

rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorParametro - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("ParametroGeneralDAO", "buscarPorParametro", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.9 RolDAO

package com.jabluecatch.dao; import com.jabluecatch.util.Conexion; import com.jabluecatch.entidades.Rol; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad ROLES * @author Fas */ public class RolDAO { private static Logger logger = Logger.getLogger(RolDAO.class); public static void insertar(Rol r) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("INSERT INTO roles (rol, estado) " + "VALUES (?, ?)"); pst.setInt(1, r.getIdRol()); pst.setString(2, r.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("RolDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); }

Page 226: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

98

} public static void actualizar(Rol r) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE roles SET rol = ? " + ", estado = ? " + "' WHERE id_rol = ? "); pst.setString(1, r.getRol()); pst.setString(2, r.getEstado()); pst.setInt(3, r.getIdRol()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("RolDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } } public static Rol buscarPorPK(int idRol) throws ErrorAplicativo { Rol result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_rol, rol, estado FROM roles WHERE id_rol = ? AND estado = 'A'"); pst.setInt(1, idRol); rs = pst.executeQuery(); while (rs.next()) { result = new Rol(rs.getInt(1), rs.getString(2), rs.getString(3)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorPK - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("RolDAO", "buscarPorPK", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Vector buscarTodos() throws ErrorAplicativo {

Page 227: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

99

Vector result = new Vector(); Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_rol, rol, estado FROM roles ORDER BY id_rol AND estado = 'A'"); rs = pst.executeQuery(); while (rs.next()) { result.add(new Rol(rs.getInt(1), rs.getString(2), rs.getString(3))); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarTodos - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("RolDAO", "buscarTodos", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.3.10 UsuarioDAO

package com.jabluecatch.dao; import com.jabluecatch.util.Conexion; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase con lógica de acceso a datos para la entidad USUARIOS * @author Fas */ public class UsuarioDAO { private static Logger logger = Logger.getLogger(UsuarioDAO.class); public static void insertar(Usuario u) throws ErrorAplicativo { Connection c = Conexion.getConexion();

Page 228: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

100

try { PreparedStatement pst = c.prepareStatement("INSERT INTO usuarios (id_rol, usuario, clave, nombres, apellidos, identificacion, estado) " + "VALUES (?, ?, AES_ENCRYPT(?, SUBSTR(?, 1,4)), ?, ?, ?, ?)"); pst.setInt(1, u.getIdRol()); pst.setString(2, u.getUsuario()); pst.setString(3, u.getClave()); pst.setString(4, u.getUsuario()); pst.setString(5, u.getNombres()); pst.setString(6, u.getApellidos()); pst.setString(7, u.getIdentificacion()); pst.setString(8, u.getEstado()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar el ingreso - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioDAO", "insertar", "Error al ejecutar el ingreso", sqle.getMessage()); } } public static void actualizar(Usuario u) throws ErrorAplicativo { Connection c = Conexion.getConexion(); try { PreparedStatement pst = c.prepareStatement("UPDATE usuarios SET id_rol = ? " + ", usuario = ? " + ", clave = AES_ENCRYPT(?, SUBSTR(?, 1,4))" + ", nombres = ? " + ", apellidos = ? " + ", identificacion = ? " + ", estado = ? WHERE id_usuario = ? "); pst.setInt(1, u.getIdRol()); pst.setString(2, u.getUsuario()); pst.setString(3, u.getClave()); pst.setString(4, u.getUsuario()); pst.setString(5, u.getNombres()); pst.setString(6, u.getApellidos()); pst.setString(7, u.getIdentificacion()); pst.setString(8, u.getEstado()); pst.setInt(9, u.getIdUsuario()); pst.executeUpdate(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la actualizacion - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioDAO", "actualizar", "Error al ejecutar la actualizacion", sqle.getMessage()); } }

Page 229: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

101

public static Usuario buscarPorUsuario(String usuario) throws ErrorAplicativo { Usuario result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_usuario, " + "id_rol, " + "usuario, " + "AES_DECRYPT(clave, SUBSTR(usuario, 1, 4)), " + "nombres, " + "apellidos, " + "identificacion, " + "estado " + "FROM usuarios WHERE usuario = ? " + "AND estado = 'A'"); pst.setString(1, usuario); rs = pst.executeQuery(); while (rs.next()) { result = new Usuario(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorUsuario - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioDAO", "buscarPorUsuario", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Usuario buscarPorUsuarioYClave(String usuario, String clave) throws ErrorAplicativo { Usuario result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_usuario, " + "id_rol, " + "usuario, " + "AES_DECRYPT(clave, SUBSTR(usuario, 1, 4)), " + "nombres, " + "apellidos, "

Page 230: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

102

+ "identificacion, " + "estado " + "FROM usuarios WHERE usuario = ? AND AES_DECRYPT(clave,SUBSTR(usuario,1,4)) = ? " + "AND estado = 'A'"); pst.setString(1, usuario); pst.setString(2, clave); rs = pst.executeQuery(); while (rs.next()) { result = new Usuario(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorUsuarioYClave - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioDAO", "buscarPorUsuarioYClave", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } public static Usuario buscarPorIdentificacion(String identificacion) throws ErrorAplicativo { Usuario result = null; Connection c = Conexion.getConexion(); ResultSet rs = null; try { PreparedStatement pst = c.prepareStatement("SELECT id_usuario, " + "id_rol, " + "usuario, " + "AES_DECRYPT(clave, SUBSTR(usuario, 1, 4)), " + "nombres, " + "apellidos, " + "identificacion, " + "estado " + "FROM usuarios WHERE identificacion = ? " + "AND estado = 'A'"); pst.setString(1, identificacion); rs = pst.executeQuery(); while (rs.next()) {

Page 231: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

103

result = new Usuario(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8)); } rs.close(); } catch (SQLException sqle) { logger.warn("buscarPorIdentificacion - Error al ejecutar la consulta - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioDAO", "buscarPorIdentificacion", "Error al ejecutar la consulta", sqle.getMessage()); } finally { rs = null; } return result; } }

4.1.4 Paquete com.jabluecatch.bo

4.1.4.1 BitacoraCampaniaBO

package com.jabluecatch.bo; import com.jabluecatch.dao.BitacoraCampaniaDAO; import com.jabluecatch.entidades.BitacoraCampania; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad BITACORA_CAMPANIAS * @author Fausto Almeida */ public class BitacoraCampaniaBO { private static Logger logger = Logger.getLogger(BitacoraCampaniaBO.class); public static BitacoraCampania insertar(BitacoraCampania bcNueva) throws ErrorAplicativo { Connection c = Conexion.getConexion();

Page 232: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

104

BitacoraCampaniaDAO.insertar(bcNueva); try { c.commit(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaBO", "insertar", "Error al ejecutar la transacción", sqle.getMessage()); } return BitacoraCampaniaDAO.buscarIdDispositivoDestinoYFechaRegistro(bcNueva.getIdDispositivoDestino(), bcNueva.getFechaRegistro()); } public static void actualizar(BitacoraCampania bcNueva) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que la bitacora exista BitacoraCampania bc = BitacoraCampaniaDAO.buscarPorPK(bcNueva.getIdBitacoraCampania()); if (bc == null) { logger.info("actualizar - Bitácora de la campaña no existe en la base de datos"); throw new ErrorAplicativo("BitacoraCampania", "actualizar", "itácora de la campaña no existe en la base de datos", null); } BitacoraCampaniaDAO.actualizar(bcNueva); try { c.commit(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("BitacoraCampaniaBO", "actualizar", "Error al ejecutar la transacción", sqle.getMessage()); } } }

4.1.4.2 CampaniaBO

package com.jabluecatch.bo; import com.jabluecatch.dao.CampaniaDAO; import com.jabluecatch.dao.DetalleCampaniaDAO; import com.jabluecatch.entidades.Campania; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.util.Conexion;

Page 233: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

105

import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.SQLException; import java.util.Calendar; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad CAMPANIAS * @author Fausto Almeida */ public class CampaniaBO { private static Logger logger = Logger.getLogger(CampaniaBO.class); public static void insertar(Campania cNueva, Vector<DetalleCampania> detallesCampania) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que no existan campanias durante estas fechas Campania ca = CampaniaDAO.buscarPorFechaReferencial(cNueva.getFechaInicio()); if (ca != null) { logger.info("insertar - Ya existe una campania configurada durante la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "insertar", "Ya existe una campania configurada durante la fecha de inicio ingresada", null); } //Verificar que no existan campanias permanentes iniciadas para la fecha de inicio ingresada Vector campaniasPermanentesIniciadas = CampaniaDAO.buscarCampaniasPermanentesIniciadas(cNueva.getFechaInicio()); if (campaniasPermanentesIniciadas.size() > 0) { logger.info("insertar - Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "insertar", "Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada", null); } if (cNueva.getTipo().equals("O")) { //si la campania es operativa, realizar las validaciones por la fecha_fin ca = CampaniaDAO.buscarPorFechaReferencial(cNueva.getFechaFin()); if (ca != null) { logger.info("insertar - Ya existe una campania configurada durante la fecha de finalización ingresada"); throw new ErrorAplicativo("CampaniaBO", "insertar", "Ya existe una campania configurada durante la fecha de finalización ingresada", null); } //Verificar q no existan campanias rodeadeas entre la fecha inicio y la fecha fin de la campania q se va a insertar Vector campaniasRodeadas = CampaniaDAO.buscarCampaniasRodeadas(cNueva.getFechaInicio(), cNueva.getFechaFin());

Page 234: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

106

if (campaniasRodeadas.size() > 0) { logger.info("insertar - Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas"); throw new ErrorAplicativo("CampaniaBO", "insertar", "Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas", null); } } else { //si la campania es permanente, revisar q no exista otra campania en el futuro ca = CampaniaDAO.buscarPorFechaInicioMasCercana(cNueva.getFechaInicio()); if (ca != null) { logger.warn("insertar - Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente"); throw new ErrorAplicativo("CampaniaBO", "insertar", "Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente", null); } } //Insertar campaña CampaniaDAO.insertar(cNueva); ca = CampaniaDAO.buscarPorFechaInicio(cNueva.getFechaInicio()); //Insertar cada detalle for (int i = 0; i < detallesCampania.size(); i++) { detallesCampania.get(i).setIdCampania(ca.getIdCampania()); DetalleCampaniaDAO.insertar(detallesCampania.get(i)); } try { c.commit(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaBO", "insertar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static void actualizar(Campania cNueva) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que la campania exista Campania ca = CampaniaDAO.buscarPorPK(cNueva.getIdCampania()); if (ca == null) { logger.info("actualizar - Campaña no existe en la base de datos"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Campaña no existe en la base de datos", null); } //Verificar que no existan campanias durante estas fechas y q no tome en cuenta la q yo estoy enviando

Page 235: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

107

ca = CampaniaDAO.buscarPorIdCampaniaYFechaReferencial(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (ca != null) { logger.info("actualizar - Ya existe una campania configurada durante la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada durante la fecha de inicio ingresada", null); } //Verificar que no existan campanias permanentes iniciadas para la fecha de inicio ingresada y que no tome en cuenta la q yo estoy enviando Vector campaniasPermanentesIniciadas = CampaniaDAO.buscarOtrasCampaniasPermanentesIniciadas(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (campaniasPermanentesIniciadas.size() > 0) { logger.info("actualizar - Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada", null); } if (cNueva.getTipo().equals("O")) { //si la campania es operativa, realizar las validaciones por la fecha_fin ca = CampaniaDAO.buscarPorIdCampaniaYFechaReferencial(cNueva.getIdCampania(), cNueva.getFechaFin()); if (ca != null) { logger.info("actualizar - Ya existe una campania configurada durante la fecha de finalización ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada durante la fecha de finalización ingresada", null); } //Verificar q no existan campanias rodeadeas entre la fecha inicio y la fecha fin de la campania q se va a actaulizar Vector campaniasRodeadas = CampaniaDAO.buscarOtrasCampaniasRodeadas(cNueva.getIdCampania(), cNueva.getFechaInicio(), cNueva.getFechaFin()); if (campaniasRodeadas.size() > 0) { logger.info("actualizar - Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas", null); } } else { //si la campania es permanente, revisar q no exista otra campania en el futuro ca = CampaniaDAO.buscarPorOtraFechaInicioMasCercana(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (ca != null) { logger.info("actualizar - Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente");

Page 236: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

108

throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente", null); } } //Actualizar campaña CampaniaDAO.actualizar(cNueva); try { c.commit(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static void actualizar(Campania cNueva, Vector<DetalleCampania> detallesCampania) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que la campania exista Campania ca = CampaniaDAO.buscarPorPK(cNueva.getIdCampania()); if (ca == null) { logger.info("actualizar - Campaña no existe en la base de datos"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Campaña no existe en la base de datos", null); } //Verificar que no existan campanias durante estas fechas y q no tome en cuenta la q yo estoy enviando ca = CampaniaDAO.buscarPorIdCampaniaYFechaReferencial(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (ca != null) { logger.info("actualizar - Ya existe una campania configurada durante la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada durante la fecha de inicio ingresada", null); } //Verificar que no existan campanias permanentes iniciadas para la fecha de inicio ingresada y que no tome en cuenta la q yo estoy enviando Vector campaniasPermanentesIniciadas = CampaniaDAO.buscarOtrasCampaniasPermanentesIniciadas(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (campaniasPermanentesIniciadas.size() > 0) { logger.info("actualizar - Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Existen " + campaniasPermanentesIniciadas.size() + " campañas permanentes iniciadas previamente para la fecha de inicio ingresada", null); }

Page 237: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

109

if (cNueva.getTipo().equals("O")) { //si la campania es operativa, realizar las validaciones por la fecha_fin ca = CampaniaDAO.buscarPorIdCampaniaYFechaReferencial(cNueva.getIdCampania(), cNueva.getFechaFin()); if (ca != null) { logger.info("actualizar - Ya existe una campania configurada durante la fecha de finalización ingresada"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada durante la fecha de finalización ingresada", null); } //Verificar q no existan campanias rodeadeas entre la fecha inicio y la fecha fin de la campania q se va a actaulizar Vector campaniasRodeadas = CampaniaDAO.buscarOtrasCampaniasRodeadas(cNueva.getIdCampania(), cNueva.getFechaInicio(), cNueva.getFechaFin()); if (campaniasRodeadas.size() > 0) { logger.info("actualizar - Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Existen " + campaniasRodeadas.size() + " campañas rodeadas previamente configuradas durante las fechas ingresadas", null); } } else { //si la campania es permanente, revisar q no exista otra campania en el futuro ca = CampaniaDAO.buscarPorOtraFechaInicioMasCercana(cNueva.getIdCampania(), cNueva.getFechaInicio()); if (ca != null) { logger.warn("actualizar - Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente"); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Ya existe una campania configurada en el futuro, la campaña que se desea crear no puede ser permanente", null); } } //Actualizar campaña CampaniaDAO.actualizar(cNueva); //Buscar todos sus detalles y eliminarlos Vector<DetalleCampania> detallesCampaniaParaEliminar = DetalleCampaniaDAO.buscarPorIdCampania(cNueva.getIdCampania()); for (int i = 0; i < detallesCampaniaParaEliminar.size(); i++) { DetalleCampaniaDAO.eliminar(detallesCampaniaParaEliminar.get(i)); } //Insertar cada detalle con los valores actualizados for (int i = 0; i < detallesCampania.size(); i++) { detallesCampania.get(i).setIdCampania(cNueva.getIdCampania()); DetalleCampaniaDAO.insertar(detallesCampania.get(i)); } try { c.commit();

Page 238: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

110

} catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaBO", "actualizar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static void eliminar(Campania cVieja) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que la campania exista Campania ca = CampaniaDAO.buscarPorPK(cVieja.getIdCampania()); if (ca == null) { logger.info("eliminar - Campaña no existe en la base de datos"); throw new ErrorAplicativo("CampaniaBO", "eliminar", "Campaña no existe en la base de datos", null); } cVieja.setEstado("I"); //Actualizar campaña CampaniaDAO.actualizar(cVieja); //Buscar todos sus detalles e inactivarlos Vector<DetalleCampania> detallesCampaniaParaInactivar = DetalleCampaniaDAO.buscarPorIdCampania(cVieja.getIdCampania()); for (int i = 0; i < detallesCampaniaParaInactivar.size(); i++) { detallesCampaniaParaInactivar.get(i).setRuta(detallesCampaniaParaInactivar.get(i).getRuta().replace("\\", "\\\\")); detallesCampaniaParaInactivar.get(i).setEstado("I"); DetalleCampaniaDAO.actualizar(detallesCampaniaParaInactivar.get(i)); } try { c.commit(); } catch (SQLException sqle) { logger.warn("eliminar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaBO", "eliminar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static Campania buscarPorPK(int idCampania) throws ErrorAplicativo { return CampaniaDAO.buscarPorPK(idCampania); } public static void conciliarFases() throws ErrorAplicativo { Campania campaniaEnEjecucion = CampaniaDAO.buscarPorFechaReferencial(Calendar.getInstance().getTime()); Vector<Campania> campaniasFinalizadas = CampaniaDAO.buscarCampaniasFinalizadas(Calendar.getInstance().getTime()); //Actualizar la fase de la campania en ejecucion

Page 239: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

111

if ((campaniaEnEjecucion != null) ? !campaniaEnEjecucion.getFase().equals("E") : false) { campaniaEnEjecucion.setFase("E"); CampaniaBO.actualizar(campaniaEnEjecucion); } //Actualizar la fase de las campaniaa finalizadas for (int i = 0; i < campaniasFinalizadas.size(); i++) { if (!campaniasFinalizadas.get(i).getFase().equals("F")) { campaniasFinalizadas.get(i).setFase("F"); campaniasFinalizadas.get(i).setFechaFin(Calendar.getInstance().getTime()); CampaniaBO.actualizar(campaniasFinalizadas.get(i)); } } } public static Campania obtenerCampaniaEnEjecucion() throws ErrorAplicativo { Campania result = null; result = CampaniaDAO.buscarPorFechaReferencial(Calendar.getInstance().getTime()); result = (result != null ? (!result.getFase().equals("F") ? (result) : (null)) :(result)); return result; } public static Campania obtenerSiguienteCampania() throws ErrorAplicativo { return CampaniaDAO.buscarPorFechaInicioMasCercana(); } public static void conciliarFase(int idCampania) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que la campania exista Campania ca = CampaniaDAO.buscarPorPK(idCampania); if (ca == null) { logger.info("conciliarFase - Campaña no existe en la base de datos"); throw new ErrorAplicativo("CampaniaBO", "conciliarFase", "Campaña no existe en la base de datos", null); } if (ca.getFechaFin().before(Calendar.getInstance().getTime()) && !ca.getFase().equals("F")) { ca.setFase("F"); ca.setFechaFin(Calendar.getInstance().getTime()); //Actualizar campaña CampaniaDAO.actualizar(ca); } try { c.commit(); } catch (SQLException sqle) { logger.warn("conciliarFase - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("CampaniaBO", "conciliarFase", "Error al ejecutar la transacción", sqle.getMessage()); }

Page 240: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

112

} }

4.1.4.3 ConsultaCampaniasBO

package com.jabluecatch.bo; import com.jabluecatch.dao.ConsultaCampaniasDAO; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; /** * Clase que contiene la lógica de negocios para la entidad de transferencia * de consulta de campañas * @author Fausto Almeida */ public class ConsultaCampaniasBO { public static Vector buscarPorPatronCampania(String patronCampania) throws ErrorAplicativo { return ConsultaCampaniasDAO.buscarPorPatronCampania(patronCampania); } public static Vector buscarPorFechaReferencial(String fechaReferencial) throws ErrorAplicativo { return ConsultaCampaniasDAO.buscarPorFechaReferencial(fechaReferencial); } public static Vector buscarPorPatronCampaniaYFechaReferencial(String patronCampania, String fechaReferencial) throws ErrorAplicativo { return ConsultaCampaniasDAO.buscarPorPatronCampaniaYFechaReferencial(patronCampania, fechaReferencial); } }

4.1.4.4 ConsultaUsuariosBO

package com.jabluecatch.bo; import com.jabluecatch.dao.ConsultaUsuariosDAO; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; /** * Clase que contiene la lógica de negocios para la entidad de transferencia * de consulta de usuarios * @author Fausto Almeida */ public class ConsultaUsuariosBO {

Page 241: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

113

public static Vector buscarPorPatronUsuario(String patronUsuario) throws ErrorAplicativo { return ConsultaUsuariosDAO.buscarPorPatronUsuario(patronUsuario); } public static Vector buscarPorPatronNombreYApellido(String patronNombreYApellido) throws ErrorAplicativo { return ConsultaUsuariosDAO.buscarPorPatronNombreYApellido(patronNombreYApellido); } public static Vector buscarPorPatronUsuarioYNombreYApellido(String patronUsuario, String patronNombreYApellido) throws ErrorAplicativo { return ConsultaUsuariosDAO.buscarPorPatronUsuarioYNombreYApellido(patronUsuario, patronNombreYApellido); } }

4.1.4.5 DetalleCampaniaBO

package com.jabluecatch.bo; import com.jabluecatch.dao.DetalleCampaniaDAO; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad DETALLE_CAMPANIAS * @author Fausto Almeida */ public class DetalleCampaniaBO { public static Vector buscarPorIdCampania(int idCampania) throws ErrorAplicativo { return DetalleCampaniaDAO.buscarPorIdCampania(idCampania); } }

4.1.4.6 DispositivoBO

package com.jabluecatch.bo; import com.jabluecatch.dao.DispositivoDAO; import com.jabluecatch.entidades.Dispositivo; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.SQLException; import java.util.Calendar;

Page 242: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

114

import org.apache.log4j.Logger; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad DISPOSITIVOS * @author Fas */ public class DispositivoBO { private static Logger logger = Logger.getLogger(DispositivoBO.class); public static boolean autorizarParaEnvio(Dispositivo dNuevo) throws ErrorAplicativo { boolean result = true; long minutosTranscurridos = 0; ParametroGeneral tiempoBloqueo; Connection c = Conexion.getConexion(); //Saber si existe o no el dispositivo Dispositivo d = DispositivoDAO.buscarPorDireccionBt(dNuevo.getDireccionBt()); if (d == null) { DispositivoDAO.insertar(dNuevo); } else { if (d.getEstadoBloqueado().equals("S")) { minutosTranscurridos = (Calendar.getInstance().getTime().getTime() - d.getFechaUltimoBloqueo().getTime()) / (1000 * 60); tiempoBloqueo = ParametroGeneralBO.buscarPorParametroYEstado("TIEMPO_BLOQUEO","A"); if (minutosTranscurridos < Long.valueOf(tiempoBloqueo.getValor())) { result = false; } else { d.setEstadoBloqueado("N"); } } d.setNombreBt(dNuevo.getNombreBt()); DispositivoDAO.actualizar(d); } try { c.commit(); } catch (SQLException sqle) { logger.warn("autorizarParaEnvio - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoBO", "autorizarParaEnvio", "Error al ejecutar la transacción", sqle.getMessage()); } return result; } public static void actualizar(Dispositivo dNuevo) throws ErrorAplicativo {

Page 243: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

115

Connection c = Conexion.getConexion(); //Saber si existe o no el dispositivo Dispositivo d = DispositivoDAO.buscarPorDireccionBt(dNuevo.getDireccionBt()); if (d == null) { logger.info("actualizar - Dispositivo no existe en la base de datos"); throw new ErrorAplicativo("DispositivoBO", "actualizar", "Dispositivo no existe en la base de datos", null); } DispositivoDAO.actualizar(dNuevo); try { c.commit(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("DispositivoBO", "actualizar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static Dispositivo buscarPorDireccionBt(String direccionBt) throws ErrorAplicativo { return DispositivoDAO.buscarPorDireccionBt(direccionBt); } }

4.1.4.7 GestorReportesBO

package com.jabluecatch.bo; import com.jabluecatch.dao.GestorReportesDAO; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Calendar; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import net.sf.jasperreports.view.JasperViewer; import org.apache.log4j.Logger; /**

Page 244: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

116

* Clase que contiene la lógica de negocios y rutinas necesarias para la * ejecución de reportes Jasper * @author Fas */ public class GestorReportesBO { private JasperReport reporte; private JasperPrint impresion; private static Logger logger = Logger.getLogger(GestorReportesBO.class); public GestorReportesBO() { } public JasperPrint obtenerImpresion(String nombreReporte, Map parametros) throws ErrorAplicativo { try { //reporte = (JasperReport) JRLoader.loadObject(new File(getClass().getResource("/com/jabluecatch/recursos/reportes/" + nombreReporte + ".jasper").toURI())); File archivoReporte = this.obtenerReporte(nombreReporte); reporte = (JasperReport) JRLoader.loadObject(archivoReporte); archivoReporte.delete(); impresion = GestorReportesDAO.obtenerImpresion(reporte, parametros); } catch (JRException jre) { logger.warn("obtenerImpresion - Error al obtener el Reporte - " + jre.getMessage()); throw new ErrorAplicativo("GestorReportesBO", "obtenerImpresion", "Error al obtener el reporte", jre.getMessage()); } return impresion; } public File obtenerReporte(String nombreReporte) throws ErrorAplicativo { InputStream is = getClass().getResourceAsStream("/com/jabluecatch/recursos/reportes/" + nombreReporte + ".jasper"); File result = new File(System.getProperty("java.io.tmpdir") + "tmp.jasper"); try { OutputStream os = new FileOutputStream(result); byte buffer[] = new byte[1024]; int longitud; while ((longitud = is.read(buffer)) > 0) { os.write(buffer, 0, longitud); } os.close(); is.close(); } catch (FileNotFoundException jre) { logger.warn("obtenerReporte - Error al obtener el Reporte - " + jre.getMessage());

Page 245: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

117

throw new ErrorAplicativo("GestorReportesBO", "obtenerImpresion", "Error al obtener el reporte", jre.getMessage()); } catch (IOException jre) { logger.warn("obtenerReporte - Error al obtener el Reporte - " + jre.getMessage()); throw new ErrorAplicativo("GestorReportesBO", "obtenerImpresion", "Error al obtener el reporte", jre.getMessage()); } return result; } public void mostrarReporte(String nombreReporte, boolean exportarPDF, Map parametros) throws ErrorAplicativo { JasperViewer.viewReport(this.obtenerImpresion(nombreReporte, parametros), false); if (exportarPDF) { try { ParametroGeneral rutaReportes = ParametroGeneralBO.buscarPorParametro("RUTA_REPORTES"); File directorioReportes = new File(rutaReportes.getValor()); if (!directorioReportes.exists()) { directorioReportes.mkdir(); } directorioReportes = null; String instancia = FormateadorFecha.aFileDateTimeString(Calendar.getInstance().getTime()); logger.debug("mostrarReporte - Ruta a exportar: " + rutaReportes.getValor() + "/" + nombreReporte + ".pdf"); JasperExportManager.exportReportToPdfFile(this.impresion, rutaReportes.getValor() + "\\" + nombreReporte + instancia + ".pdf"); } catch (JRException jre) { logger.warn("mostrarReporte - Error al exportar el Reporte - " + jre.getMessage()); throw new ErrorAplicativo("GestorReportesBO", "mostrarReporte", "Error al exportar el reporte", jre.getMessage()); } } } }

4.1.4.8 ParametroGeneralBO

package com.jabluecatch.bo; import com.jabluecatch.dao.ParametroGeneralDAO; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase que contiene la lógica de negocios y validaciones contra datos

Page 246: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

118

* para la entidad PARAMETROS_GENERALES * @author Fas */ public class ParametroGeneralBO { private static Logger logger = Logger.getLogger(ParametroGeneralBO.class); public static void insertar(ParametroGeneral p) throws ErrorAplicativo { Connection c = Conexion.getConexion(); ParametroGeneralDAO.insertar(p); try { c.commit(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("ParametroGeneralBO", "insertar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static void actualizar(ParametroGeneral p) throws ErrorAplicativo { Connection c = Conexion.getConexion(); ParametroGeneralDAO.actualizar(p); try { c.commit(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("ParametroGeneralBO", "insertar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static ParametroGeneral buscarPorParametroYEstado(String parametro, String estado) throws ErrorAplicativo { return ParametroGeneralDAO.buscarPorParametroYEstado(parametro, estado); } }

4.1.4.9 RolBO

package com.jabluecatch.bo; import com.jabluecatch.dao.RolDAO; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad ROLES * @author Fas */

Page 247: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

119

public class RolBO { public static Vector buscarPorEstado(String estado) throws ErrorAplicativo { return RolDAO.buscarPorEstado(estado); } }

4.1.4.10 UsuarioBO

package com.jabluecatch.bo; import com.jabluecatch.dao.UsuarioDAO; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.Conexion; import com.jabluecatch.util.ErrorAplicativo; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase que contiene la lógica de negocios y validaciones contra datos * para la entidad USUARIOS * @author Fausto Almeida */ public class UsuarioBO { private static Logger logger = Logger.getLogger(UsuarioBO.class); public static Usuario validarInicioSesion(String nombreUsuario, String clave) throws ErrorAplicativo { Usuario result = null; //Verificar que el usuario exista result = UsuarioDAO.buscarPorUsuario(nombreUsuario); if (result == null) { //Usuario no existe logger.info("validarInicioSesion - Usuario no existe"); throw new ErrorAplicativo("UsuarioBO", "validarInicioSesion", "Usuario no existe", null); } Usuario usuarioCompara = UsuarioDAO.buscarPorUsuarioYClave(nombreUsuario, clave); if (usuarioCompara == null) { //Clave incorrecta logger.info("validarInicioSesion - Clave incorrecta "); throw new ErrorAplicativo("UsuarioBO", "validarInicioSesion", "Clave incorrecta", null); } //Login correcto logger.info("validarInicioSesion - Login correcto <" + nombreUsuario + ">"); return result;

Page 248: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

120

} public static void insertar(Usuario uNuevo) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que no exista Usuario u = UsuarioDAO.buscarPorUsuario(uNuevo.getUsuario()); if (u != null) { logger.info("insertar - Usuario ya existe en la base de datos "); throw new ErrorAplicativo("UsuarioBO", "insertar", "Usuario ya existe en la base de datos", null); } u = UsuarioDAO.buscarPorIdentificacion(uNuevo.getIdentificacion()); if (u != null) { logger.info("insertar - Identificacion ya existe en la base de datos "); throw new ErrorAplicativo("UsuarioBO", "insertar", "Identificacion ya existe en la base de datos", null); } UsuarioDAO.insertar(uNuevo); try { c.commit(); } catch (SQLException sqle) { logger.warn("insertar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioBO", "insertar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static void actualizar(Usuario uNuevo) throws ErrorAplicativo { Connection c = Conexion.getConexion(); //Verificar que exista Usuario u = UsuarioDAO.buscarPorUsuario(uNuevo.getUsuario()); if (u == null) { logger.info("actualizar - Usuario no existe en la base de datos "); throw new ErrorAplicativo("UsuarioBO", "actualizar", "Usuario no existe en la base de datos", null); } UsuarioDAO.actualizar(uNuevo); try { c.commit(); } catch (SQLException sqle) { logger.warn("actualizar - Error al ejecutar la transacción - " + sqle.getMessage()); throw new ErrorAplicativo("UsuarioBO", "actualizar", "Error al ejecutar la transacción", sqle.getMessage()); } } public static Usuario buscarPorUsuario(String usuario) throws ErrorAplicativo { return UsuarioDAO.buscarPorUsuario(usuario);

Page 249: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

121

} }

4.1.5 Paquete com.jabluecatch.comm

4.1.5.1 ClienteOBEX

package com.jabluecatch.comm; import com.jabluecatch.bo.BitacoraCampaniaBO; import com.jabluecatch.bo.DispositivoBO; import com.jabluecatch.dto.Tarea; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.BitacoraCampania; import com.jabluecatch.util.ErrorAplicativo; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import javax.bluetooth.BluetoothConnectionException; import javax.microedition.io.Connector; import javax.obex.ClientSession; import javax.obex.HeaderSet; import javax.obex.Operation; import javax.obex.ResponseCodes; import org.apache.log4j.Logger; /** * Clase que se encarga de comenzar y finalizar la tarea de transferencia * de contenido hacia el dispositivo correspondiente * @author Fausto Almeida */ public class ClienteOBEX extends Thread { private PantallaPrincipal padre; private Tarea tarea; private BitacoraCampania bitacora; private boolean finalizado; private static Logger logger = Logger.getLogger(ClienteOBEX.class); public ClienteOBEX(PantallaPrincipal padre, Tarea tarea) { this.padre = padre; this.tarea = tarea; this.finalizado = false; } @Override public void run() {

Page 250: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

122

/* * Proceso hilado que se encarga de la ejecución de la tarea (envío * del contenido multimedia) hacia el dsipositivo Bluetooth * correspondiente. */ try { logger.info("run: Verificando que el archivo a enviar exista."); File f = new File(this.tarea.getArchivoAEnviar().getRuta()); /* * Verificar que el archivo a enviar exista. */ if (!f.exists()) { logger.warn("run - El archivo <" + this.tarea.getArchivoAEnviar().getRuta().replace("\\\\", "\\") + "> no existe."); //Guardar la bitácora en la base bitacora = new BitacoraCampania(this.tarea.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(), this.tarea.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "X", "Transmisión fallida porque el archivo a enviar no existe.", "A"); try { BitacoraCampaniaBO.insertar(bitacora); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.tarea.setEstado("X"); this.padre.actualizarRegistroMonitor(this.tarea); //this.tarea.getReceptor() this.finalizado = true; return; } logger.info("run: Estableciendo conexión con el dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " con nombre <" + this.tarea.getReceptor().getNombreBt() + ">"); ClientSession sesion = (ClientSession) Connector.open(this.tarea.getUrlServidor()); HeaderSet hsRespuestaConexion = sesion.connect(null); if (hsRespuestaConexion.getResponseCode() != ResponseCodes.OBEX_HTTP_OK) { logger.warn("run: Conexión negada el dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " con nombre <" + this.tarea.getReceptor().getNombreBt() + ">"); return; } /* * Guardar la bitácora en la base. */ bitacora = new BitacoraCampania(this.tarea.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(),

Page 251: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

123

this.tarea.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "I", "Inicio transmisión", "A"); try { BitacoraCampaniaBO.insertar(bitacora); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.tarea.setEstado("I"); this.padre.actualizarRegistroMonitor(this.tarea); HeaderSet hsOperacion = sesion.createHeaderSet(); logger.debug(this.tarea.getReceptor().getDireccionBt() + " - " + this.tarea.getArchivoAEnviar().getRuta()); String nombreArchivo = this.tarea.getArchivoAEnviar().getRuta().substring(this.tarea.getArchivoAEnviar().getRuta().lastIndexOf("\\") + 1, this.tarea.getArchivoAEnviar().getRuta().length()); logger.debug(this.tarea.getReceptor().getDireccionBt() + " - " + nombreArchivo); hsOperacion.setHeader(HeaderSet.NAME, nombreArchivo); logger.debug("Creando operacion de PUT"); Operation operacionPUT = sesion.put(hsOperacion); logger.debug("Inicio de carga de archivo para calcular el numero de paquetes a enviar. Archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " Destinatario: " + this.tarea.getReceptor().getDireccionBt()); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(this.tarea.getArchivoAEnviar().getRuta())); /* * Bucle para leer de un fichero y contar las tramas. */ byte[] bufer = new byte[1000]; int cantidadBytesLeidos = bis.read(bufer); double cantidadPaquetes = 0; while (cantidadBytesLeidos > 0) { cantidadPaquetes++; cantidadBytesLeidos = bis.read(bufer); } logger.debug("Finalización de carga de archivo para calcular el numero de paquetes a enviar. Archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " Destinatario: " + this.tarea.getReceptor().getDireccionBt()); bis.close(); logger.debug("Inicio de envío de archivo. Archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " Destinatario: " + this.tarea.getReceptor().getDireccionBt()); bis = new BufferedInputStream(new FileInputStream(this.tarea.getArchivoAEnviar().getRuta())); OutputStream os = operacionPUT.openOutputStream(); bufer = new byte[1000]; cantidadBytesLeidos = bis.read(bufer); double paqueteActual = 1; int porcentajeCompletado = 0;

Page 252: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

124

logger.debug("Num paquetes totales: " + cantidadPaquetes + " Archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " Destinatario: " + this.tarea.getReceptor().getDireccionBt()); /* * Bucle para enviar cada trama del archivo hacia el dispositivo.. */ while (cantidadBytesLeidos > 0) { porcentajeCompletado = (int) (paqueteActual / cantidadPaquetes * 100); //logger.debug("Porcentaje: " + porcentajeCompletado + " para: " +this.tarea.getReceptor().getDireccionBt()); if ((porcentajeCompletado % 16 == 0) || porcentajeCompletado == 100) { this.tarea.setPorcentajeCompletado(String.valueOf(porcentajeCompletado)); this.padre.actualizarRegistroMonitor(this.tarea); } os.write(bufer); cantidadBytesLeidos = bis.read(bufer); paqueteActual++; } logger.debug("Finalización de envío de archivo. Archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " Destinatario: " + this.tarea.getReceptor().getDireccionBt()); bis.close(); os.close(); operacionPUT.close(); sesion.disconnect(null); sesion.close(); /* * Guardar la bitácora en la base. */ bitacora = new BitacoraCampania(this.tarea.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(), this.tarea.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "E", "Transmisión exitosa", "A"); try { BitacoraCampaniaBO.insertar(bitacora); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.tarea.setEstado("E"); this.padre.actualizarRegistroMonitor(this.tarea); /* * Actualizar bloqueo de equipo. */ this.tarea.getReceptor().setEstadoBloqueado("S"); this.tarea.getReceptor().setFechaUltimoBloqueo(Calendar.getInstance().getTime()); try {

Page 253: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

125

DispositivoBO.actualizar(this.tarea.getReceptor()); } catch (ErrorAplicativo ea) { logger.warn("run - Error al actualizar el estado de bloqueo del dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " - " + ea.getErrorTecnico()); } logger.info("deviceDiscovered - Dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " ha entrado en la cola de bloqueo"); this.finalizado = true; } catch (BluetoothConnectionException bce) { logger.warn("run - El cliente no acepto archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " hacia el dispositivo: " + this.tarea.getReceptor().getDireccionBt()); logger.warn(bce.toString()); //Guardar la bitácora en la base bitacora = new BitacoraCampania(this.tarea.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(), this.tarea.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "C", "Transmisión cancelada por el usuario", "A"); try { BitacoraCampaniaBO.insertar(bitacora); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.tarea.setEstado("C"); this.padre.actualizarRegistroMonitor(this.tarea); /* * Actualizar bloqueo de equipo. */ this.tarea.getReceptor().setEstadoBloqueado("S"); this.tarea.getReceptor().setFechaUltimoBloqueo(Calendar.getInstance().getTime()); try { DispositivoBO.actualizar(this.tarea.getReceptor()); } catch (ErrorAplicativo ea) { logger.warn("run - Error al actualizar el estado de bloqueo del dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " - " + ea.getErrorTecnico()); } logger.info("deviceDiscovered - Dispositivo: " + this.tarea.getReceptor().getDireccionBt() + " ha entrado en la cola de bloqueo"); this.finalizado = true; return; } catch (IOException ioe) { logger.warn("run - Error en el hilo de envío del archivo: " + this.tarea.getArchivoAEnviar().getRuta() + " hacia el dispositivo: " + this.tarea.getReceptor().getDireccionBt()); logger.warn(ioe.toString()); /* * Guardar la bitácora en la base. */ bitacora = new BitacoraCampania(this.tarea.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(),

Page 254: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

126

this.tarea.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "X", "Transmisión fallida debido a un error inesperado", "A"); try { BitacoraCampaniaBO.insertar(bitacora); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.tarea.setEstado("X"); this.padre.actualizarRegistroMonitor(this.tarea); this.finalizado = true; return; } } /** * @return the finalizado */ public boolean isFinalizado() { return finalizado; } }

4.1.5.2 Despachador

package com.jabluecatch.comm; import com.jabluecatch.bo.BitacoraCampaniaBO; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.dto.Tarea; import com.jabluecatch.entidades.BitacoraCampania; import com.jabluecatch.entidades.Campania; import com.jabluecatch.util.ErrorAplicativo; import java.util.Calendar; import java.util.List; import java.util.Vector; import org.apache.log4j.Logger; /** * Clase que se encarga de manejar todos los hilos de ejecución de tareas * @author Fausto Almeida */ public class Despachador extends Thread { private PantallaPrincipal padre; private DetectorDispositivosRemotos detectorDispositivosRemotos; private boolean continuar; private boolean debeInformarPausa; private Campania campania; private Vector<DetalleCampania> detallesCampania; private static Logger logger = Logger.getLogger(Despachador.class); public Despachador(PantallaPrincipal padre, Campania campania, Vector detallesCampania) {

Page 255: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

127

this.padre = padre; this.cambiarCampania(campania, detallesCampania); this.continuar = false; this.debeInformarPausa = false; this.detectorDispositivosRemotos = new DetectorDispositivosRemotos(padre); } @Override @SuppressWarnings("static-access") public void run() { while (true) { while (continuar) { /* * Si la campaña es operativa, asegurarse de que siga activa. */ if ( !campania.getTipo().equals("O") ? false : campania.getFechaFin().before(Calendar.getInstance().getTime()) ) { try { CampaniaBO.conciliarFase(campania.getIdCampania()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } this.setContinuar(false); this.padre.reiniciarBotones(); this.padre.mostrarMensaje("La campaña actual se ha detenido"); continue; } this.debeInformarPausa = true; /* * Iniciar la detección de dispositivos. */ try { this.detectorDispositivosRemotos.detectar(this.detallesCampania); } catch (ErrorAplicativo ea) { this.setContinuar(false); logger.warn(ea.getErrorTecnico()); this.padre.reiniciarBotones(); this.padre.mostrarMensaje("La campaña actual se ha detenido"); } /* * Recorrer el vector de tareas, y ejecutar cada una con un hilo */ logger.debug("Inicia a recorrer las tareas."); List<Tarea> tareas = this.padre.getMonitor(); Vector<ClienteOBEX> hilosTareas = new Vector(); DetectorServicio ds; String url; /* * De cada tarea generada (dispositivo encontrado), detectar si * posee el servicio OBEX necesario.

Page 256: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

128

*/ for (Tarea t : tareas) { if (t.getEstado().equals("P")) { url = null; ds = new DetectorServicio(t.getServidor()); try { url = ds.buscarServicio(); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } if (url == null || url.equals("")) { logger.info("No se ha encontrado el servicio en el dispositivo " + t.getReceptor().getDireccionBt() + ". Envío fallido."); /* * Guardar la bitácora en la base. */ BitacoraCampania bc = new BitacoraCampania(t.getArchivoAEnviar().getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(), t.getReceptor().getIdDispositivo(), Calendar.getInstance().getTime(), "X", "No se ha encontrado el servicio en el dispositivo " + t.getReceptor().getDireccionBt() + ". Envío fallido.", "A"); try { bc = BitacoraCampaniaBO.insertar(bc); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); return; } t.setEstado("X"); this.padre.actualizarRegistroMonitor(t); } else { logger.debug("Tarea con: " + t.getReceptor().getDireccionBt() + " iniciada."); t.setUrlServidor(url); ClienteOBEX hiloTarea = new ClienteOBEX(this.padre, t); hilosTareas.add(hiloTarea); } } } /* * Recorrer iterativamente mi vector de hilos y comenzar a * lanzar uno por uno. */ for (ClienteOBEX c : hilosTareas) { c.start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException ie) { logger.debug("run - Error al intentar pausar la ejecución para el lanzamiento de hilos"); } } /* * Recorrer iterativamente mi vector de hilos y salir del * bucle solo cuando el estado de todos este en terminado.

Page 257: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

129

*/ boolean terminados = false; while (!terminados) { terminados = true; for (ClienteOBEX c : hilosTareas) { /* * Si encuentro alguino diferente de terminado. */ if (!c.isFinalizado()) { terminados = false; } } } logger.debug("Todas las tareas han finalizado."); } if (debeInformarPausa) { logger.info("btnIniciarActionPerformed - Detenido proceso de envío de publicidad."); this.debeInformarPausa = false; } } } public void cambiarCampania(Campania campania, Vector detallesCampania) { this.campania = campania; this.detallesCampania = detallesCampania; } /** * @return the continuar */ public boolean isContinuar() { return continuar; } /** * @param continuar the continuar to set */ public void setContinuar(boolean continuar) { this.continuar = continuar; } }

4.1.5.3 DetectorDispositivosRemotos

package com.jabluecatch.comm; import com.jabluecatch.bo.BitacoraCampaniaBO; import com.jabluecatch.bo.DispositivoBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.BitacoraCampania; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.entidades.Dispositivo; import com.jabluecatch.dto.Tarea; import com.jabluecatch.util.ErrorAplicativo;

Page 258: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

130

import com.jabluecatch.util.ValidadorNombreDispositivo; import java.io.IOException; import java.util.Calendar; import java.util.Vector; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import org.apache.log4j.Logger; /** * Clase que se encarga de detectar dispositivos Bluetooth y atar cada * dispositivo con una url y un archivo a enviar, generando así una tarea. * @author Fausto Almeida */ public class DetectorDispositivosRemotos implements DiscoveryListener { private PantallaPrincipal padre; private Vector<Dispositivo> dispositivosDetectados; private final Object eventoDeteccionCompletada = new Object(); private Vector<DetalleCampania> detallesCampania; private static Logger logger = Logger.getLogger(DetectorDispositivosRemotos.class); public DetectorDispositivosRemotos() { } public DetectorDispositivosRemotos(PantallaPrincipal padre) { this.padre = padre; } public void iniciar() throws ErrorAplicativo { try { LocalDevice.getLocalDevice().getDiscoveryAgent(); } catch (BluetoothStateException bse) { logger.warn("run - Error: " + bse.getMessage()); throw new ErrorAplicativo("DetectorDispositivosRemotos", "iniciar", "No se encuentra el dispositivo Bluetooth, favor conectarlo", bse.getMessage()); } } public void detectar(Vector detallesCampania) throws ErrorAplicativo { this.detallesCampania = detallesCampania; this.dispositivosDetectados = new Vector(); /* * Inicia el proceso de detección que por convención y metodología * debe tratarse como un proceso sincronizado. */ synchronized (this.eventoDeteccionCompletada) { try { boolean iniciado = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, this);

Page 259: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

131

if (iniciado) { logger.info("detectar - Detección de dispositivos INICIADA..."); this.eventoDeteccionCompletada.wait(); logger.info(getDispositivosDetectados().size() + " dispositivo(s) encontrado(s)"); } } catch (BluetoothStateException bse) { logger.warn("run - Error: " + bse.getMessage()); throw new ErrorAplicativo("DetectorDispositivosRemotos", "detectar", "Error de comunicación", bse.getMessage()); } catch (InterruptedException ie) { logger.warn("run - Error: " + ie.getMessage()); throw new ErrorAplicativo("DetectorDispositivosRemotos", "detectar", "Error de interrupción", ie.getMessage()); } } } public void deviceDiscovered(RemoteDevice rd, DeviceClass dc) { /* * Método que se lanza cada vez que el proceso detecta un nuevo * dispositivo. */ boolean autorizadoParaEnvio = false; boolean realizarCambioDeNombre = false; /* * Llenar los datos del dispositivo. */ Dispositivo d = new Dispositivo(); d.setDireccionBt(rd.getBluetoothAddress()); logger.info("deviceDiscovered - Dispositivo encontrado: " + rd.getBluetoothAddress()); try { d.setNombreBt(rd.getFriendlyName(false).replace("\\", "").replace("/", "")); logger.info("deviceDiscovered - Nombre dispositivo encontrado: " + d.getNombreBt()); } catch (IOException ioe) { d.setNombreBt("N/A"); logger.warn("deviceDiscovered - Error: " + ioe.getMessage()); } /* * Validacion de nombre con caracteres especiales. */ if (!ValidadorNombreDispositivo.esValido(d.getNombreBt())) { d.setNombreBt("Dispositivo"); realizarCambioDeNombre = true; } d.setEstadoBloqueado("N"); d.setEstado("A"); /* * Insertar o actualizar el dispositivo. */ try {

Page 260: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

132

autorizadoParaEnvio = DispositivoBO.autorizarParaEnvio(d); d = DispositivoBO.buscarPorDireccionBt(d.getDireccionBt()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } /* * De contener el nombre caracteres especiales, se actualizara su nombre. */ if (realizarCambioDeNombre) { d.setNombreBt(d.getNombreBt() + " " + d.getIdDispositivo()); try { DispositivoBO.actualizar(d); d = DispositivoBO.buscarPorDireccionBt(d.getDireccionBt()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } } //if (rd.getBluetoothAddress().equals("001DFD9F56F4")) { /* * Guardar la referencia del dispositivo en nuestro vector. */ if (autorizadoParaEnvio) { logger.info("deviceDiscovered - Dispositivo: " + rd.getBluetoothAddress() + " ha sido autorizado para el envío"); this.getDispositivosDetectados().addElement(d); DetalleCampania archivoAleatorio = this.obtenerArchivoAleatorio(); /* * Cargar el id_dispositivo desde la base. */ try { d = DispositivoBO.buscarPorDireccionBt(d.getDireccionBt()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); return; } /* * Guardar la bitácora en la base. */ BitacoraCampania bc = new BitacoraCampania(archivoAleatorio.getIdDetalleCampania(), this.padre.getUsuarioSesion().getIdUsuario(), d.getIdDispositivo(), Calendar.getInstance().getTime(), "P", "Dispositivo detectado", "A"); try { bc = BitacoraCampaniaBO.insertar(bc); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); return; } /* * Mostrar la tarea en el monitor. */ this.padre.agregarRegistroMonitor(new Tarea(bc.getIdBitacoraCampania(), rd, d, archivoAleatorio, "P", "N/A")); logger.debug("deviceDiscovered - Tarea creada con el código: " + bc.getIdBitacoraCampania()); } else {

Page 261: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

133

logger.info("deviceDiscovered - Dispositivo: " + rd.getBluetoothAddress() + " no ha sido autorizado para el envío"); } //} } public void inquiryCompleted(int i) { logger.info("Detección de dispositivos FINALIZADA"); synchronized (this.eventoDeteccionCompletada) { this.eventoDeteccionCompletada.notifyAll(); } } private DetalleCampania obtenerArchivoAleatorio() { int indiceAleatorio = (int) (Math.random() * (this.detallesCampania.size())); return this.detallesCampania.get(indiceAleatorio); } public void servicesDiscovered(int i, ServiceRecord[] srs) { } public void serviceSearchCompleted(int i, int i1) { } /** * @return the dispositivosDetectados */ public Vector<Dispositivo> getDispositivosDetectados() { return dispositivosDetectados; } }

4.1.5.4 DetectorServicio

package com.jabluecatch.comm; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DataElement; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import org.apache.log4j.Logger; /** * Clase que se encarga de detectar si el servicio OBEX se encuentra activo * en el dispositivo encontrado (servidor) * @author Fausto Almeida */ public class DetectorServicio implements DiscoveryListener {

Page 262: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

134

private static final UUID[] SERVICIOS_BUSCAR = new UUID[]{new UUID(0x1105)}; private static final int[] ATRIBUTOS_BUSCAR = new int[]{0x0100}; private RemoteDevice servidor; private Vector<String> serviciosEncontrados = new Vector(); private final Object eventoDeteccionCompletada = new Object(); private static Logger logger = Logger.getLogger(DetectorServicio.class); public DetectorServicio() { } public DetectorServicio(RemoteDevice servidor) { this.servidor = servidor; } public String buscarServicio() throws ErrorAplicativo { this.serviciosEncontrados.clear(); /* * Inicia el proceso de detección que por convención y metodología * debe tratarse como un proceso sincronizado. */ synchronized (this.eventoDeteccionCompletada) { try { logger.debug("Detección de servicios en " + this.servidor.getBluetoothAddress() + " INICIADA... "); LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(ATRIBUTOS_BUSCAR, SERVICIOS_BUSCAR, this.servidor, this); this.eventoDeteccionCompletada.wait(); } catch (BluetoothStateException bse) { logger.warn("DetectorServicio.run - Error: " + bse.getMessage()); throw new ErrorAplicativo("DetectorServicio", "buscarServicio", "Error de comunicación", bse.getMessage()); } catch (InterruptedException ie) { logger.warn("DetectorServicio.run - Error: " + ie.getMessage()); throw new ErrorAplicativo("DetectorServicio", "buscarServicio", "Error de interrupción", ie.getMessage()); } } if (serviciosEncontrados.size() > 0) { return serviciosEncontrados.get(0); } else { return null; } } public void servicesDiscovered(int transID, ServiceRecord[] sr) { /* * Método que se lanza cada vez que el proceso detecta un conjunto * de servicios en el dispositivo. */ for (int i = 0; i < sr.length; i++) { String url = sr[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); if (url == null) {

Page 263: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

135

continue; } this.serviciosEncontrados.add(url); DataElement nombreServicio = sr[i].getAttributeValue(0x0100); logger.debug("URL: " + url); if (nombreServicio != null) { logger.debug("Servicio " + nombreServicio.getValue() + " encontrado. URL: " + url); } else { logger.debug("Servicio encontrado. URL: " + url); } } } public void serviceSearchCompleted(int i, int i1) { logger.info("Detección de servicios FINALIZADA"); synchronized (eventoDeteccionCompletada) { eventoDeteccionCompletada.notifyAll(); } } public void deviceDiscovered(RemoteDevice rd, DeviceClass dc) { } public void inquiryCompleted(int i) { } }

4.1.6 Paquete com.jabluecatch.util

4.1.6.1 Conexión

package com.jabluecatch.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.apache.log4j.Logger; /** * Clase necesaria para la conexión de base de datos de acuerdo al patrón de * diseño: Singleton * @author Fas */ public class Conexion { private static Connection conexion = null; private static Connection conexionGenerica = null; private static String bd = "bluecatch"; private static String usuario = "root";

Page 264: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

136

private static String clave = "mysql"; private static String url = "jdbc:mysql://localhost/" + bd; private static String urlGenerica = "jdbc:mysql://localhost/"; private static Logger logger = Logger.getLogger(Conexion.class); public static Connection getConexion() throws ErrorAplicativo { if (conexion == null) { conexionGenerica = null; inicializaConexion(); } return conexion; } protected static void inicializaConexion() throws ErrorAplicativo { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); conexion = DriverManager.getConnection(url, usuario, clave); conexion.setAutoCommit(false); } catch (SQLException sqle) { logger.warn("inicializaConexion - Hubo un problema al intentar conectarse con la base de datos - " + sqle.getMessage()); throw new ErrorAplicativo("Conexion", "inicializaConexion", "Hubo un problema al intentar conectarse con la base de datos", sqle.getMessage()); } catch (Exception e) { logger.warn("inicializaConexion - Hubo un problema al intentar conectarse con la base de datos - " + e.getMessage()); throw new ErrorAplicativo("Conexion", "inicializaConexion", "Hubo un problema al intentar conectarse con la base de datos", e.getMessage()); } logger.info("inicializaConexion - Sesión iniciada con la base de datos"); } public static Connection getConexionGenerica() throws ErrorAplicativo { if (conexionGenerica == null) { conexion = null; inicializaConexionGenerica(); } return conexionGenerica; } protected static void inicializaConexionGenerica() throws ErrorAplicativo { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); conexionGenerica = DriverManager.getConnection(urlGenerica, usuario, clave); conexionGenerica.setAutoCommit(false); } catch (SQLException sqle) { logger.warn("inicializaConexionGenerica - Hubo un problema al intentar conectarse con la base de datos - " + sqle.getMessage()); throw new ErrorAplicativo("Conexion", "inicializaConexionGenerica", "Hubo un problema al intentar conectarse con la base de datos", sqle.getMessage()); } catch (Exception e) { logger.warn("inicializaConexionGenerica - Hubo un problema al intentar conectarse con la base de datos - " + e.getMessage()); throw new ErrorAplicativo("Conexion", "inicializaConexionGenerica", "Hubo un problema al intentar conectarse con la base de datos", e.getMessage()); }

Page 265: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

137

logger.info("inicializaConexionGenerica - Sesión iniciada con la base de datos"); } }

4.1.6.2 ErrorAplicativo

package com.jabluecatch.util; /** * Clase que representa un error generado en cualquier instancia en la * aplicación y que será propagado hacia la capa más externa (vista) * @author Fausto Almeida */ public class ErrorAplicativo extends Exception { private String clase; private String metodo; private String tecnico; public ErrorAplicativo(String clase, String metodo, String message, String tecnico) { super(message); this.clase = clase; this.metodo = metodo; this.tecnico = tecnico; } public String getError() { return this.getMessage(); } public String getErrorTecnico() { return this.clase + "." + this.metodo + " - " + this.tecnico; } /** * @return the clase */ public String getClase() { return clase; } /** * @param clase the clase to set */ public void setClase(String clase) { this.clase = clase; } /** * @return the metodo */ public String getMetodo() { return metodo;

Page 266: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

138

} /** * @param metodo the metodo to set */ public void setMetodo(String metodo) { this.metodo = metodo; } /** * @return the tecnico */ public String getTecnico() { return tecnico; } /** * @param tecnico the tecnico to set */ public void setTecnico(String tecnico) { this.tecnico = tecnico; } }

4.1.6.3 FormateadorDocumento

package com.jabluecatch.util; import java.util.Vector; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * Clase que me permite cambiar el formato de ingreso de las cadenas de * caracteres en los componentes de entrada de texto de la interfaz de usuario * @author Fausto Almeida */ public class FormateadorDocumento extends PlainDocument { private int longitudMaxima; private boolean conLongitudMaxima; private int modo; private Vector vecLetras; private Vector vecNumeros; public FormateadorDocumento(int longitudMaxima, int modo) { super(); this.longitudMaxima = longitudMaxima; this.conLongitudMaxima = true; this.modo = modo; vecLetras = new Vector(); for (int i = 97; i < 123; i++) { vecLetras.addElement((char) i); }

Page 267: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

139

for (int i = 65; i < 91; i++) { vecLetras.addElement((char) i); } vecLetras.addElement('ñ'); vecLetras.addElement('Ñ'); vecNumeros = new Vector(); for (int i = 48; i < 58; i++) { vecNumeros.addElement((char) i); } } public void setLongitudMaxima(int longitudMaxima) { this.longitudMaxima = longitudMaxima; this.conLongitudMaxima = true; } public void setLongitudMaxima(boolean conLongitudMaxima) { this.conLongitudMaxima = conLongitudMaxima; } @Override public void insertString(int inicio, String strCadena, AttributeSet astAtributos) throws BadLocationException { //Convertir a arreglo la cadena ingresada char[] cadena; cadena = strCadena.toCharArray(); //Recorre todos los caracteres ingresados //for (int i = 0; i < cadena.length; i++) { for (int i = cadena.length - 1; i >= 0; i--) { if (this.modo == 1) { //Solo numeros if (this.conLongitudMaxima) { if (vecNumeros.contains(cadena[i]) && this.getContent().length() <= this.longitudMaxima) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } else { if (vecNumeros.contains(cadena[i])) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } else if (this.modo == 2) { //Solo letras minusculas y numeros if (this.conLongitudMaxima) { if (this.getContent().length() <= this.longitudMaxima) { if ((vecLetras.contains(cadena[i]) || vecNumeros.contains(cadena[i])) && cadena[i] != 'ñ' && cadena[i] != 'Ñ') { super.insertString(inicio, String.valueOf(cadena[i]).toLowerCase(), astAtributos); } } } else { if ((vecLetras.contains(cadena[i]) || vecNumeros.contains(cadena[i]))

Page 268: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

140

&& cadena[i] != 'ñ' && cadena[i] != 'Ñ') { super.insertString(inicio, String.valueOf(cadena[i]).toLowerCase(), astAtributos); } } } else if (this.modo == 3) { ////Solo letras, Numeros (1-9) y Espacios en blanco if (this.conLongitudMaxima) { if (this.getContent().length() <= this.longitudMaxima) { if (vecLetras.contains(cadena[i]) || vecNumeros.contains(cadena[i]) || Character.isSpaceChar(cadena[i])) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } else { if (vecLetras.contains(cadena[i]) || vecNumeros.contains(cadena[i]) || Character.isSpaceChar(cadena[i])) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } else if (this.modo == 4) { ////Solo numeros y "/", para fechas if (this.conLongitudMaxima) { if ((vecNumeros.contains(cadena[i]) || (cadena[i] == '/')) && this.getContent().length() <= this.longitudMaxima) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } else { if (vecNumeros.contains(cadena[i]) || (cadena[i] == '/')) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } else if (this.modo == 5) { ////Solo numeros y ":", para horas if (this.conLongitudMaxima) { if ((vecNumeros.contains(cadena[i]) || (cadena[i] == ':')) && this.getContent().length() <= this.longitudMaxima) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } else { if (vecNumeros.contains(cadena[i]) || (cadena[i] == ':')) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } else { if (this.conLongitudMaxima) { if (this.getContent().length() <= this.longitudMaxima) { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos);

Page 269: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

141

} } else { super.insertString(inicio, String.valueOf(cadena[i]), astAtributos); } } } } }

4.1.6.4 FormateadorFecha

package com.jabluecatch.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; /** * Clase que me permite cambiar de formato a las fechas, realizar conversiones * de tipo fecha hacia tipo cadena de caracteres, en formatos de base de datos * y formatos de lenguaje de programación. * @author Fas */ public class FormateadorFecha { private static final SimpleDateFormat DATE_JAVA = new SimpleDateFormat("dd/MM/yyyy"); private static final SimpleDateFormat DATETIME_JAVA = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); private static final SimpleDateFormat HOUR_JAVA = new SimpleDateFormat("HH"); private static final SimpleDateFormat MINUTE_JAVA = new SimpleDateFormat("mm"); private static final SimpleDateFormat DATETIME_FILE = new SimpleDateFormat("-ddMMyyyy-HHmmss"); private static Logger logger = Logger.getLogger(FormateadorFecha.class); public static String aJavaDateString(Date fecha) { return DATE_JAVA.format(fecha); } public static String aJavaDateTimeString(Date fecha) { return DATETIME_JAVA.format(fecha); } public static String aJavaHourString(Date fecha) { return HOUR_JAVA.format(fecha); } public static String aJavaMinuteString(Date fecha) { return MINUTE_JAVA.format(fecha); } public static String aFileDateTimeString(Date fecha) {

Page 270: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

142

return DATETIME_FILE.format(fecha); } public static Date aJavaDateTimeDate(String fecha) throws ErrorAplicativo { try { return DATETIME_JAVA.parse(fecha); } catch (ParseException pe) { logger.warn("FormateadorFecha.aJavaDateDate - Error al convertir la fecha - " + pe.getMessage()); throw new ErrorAplicativo("FormateadorFecha", "aJavaDateDate", "La fecha no está en el formato correcto", pe.getMessage()); } } }

4.1.6.5 Instalador

package com.jabluecatch.util; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.apache.log4j.Logger; /** * * @author Fas */ public class Instalador { private static Logger logger = Logger.getLogger(Instalador.class); public static void ejecutar() throws ErrorAplicativo { logger.info("ejecutar - Instalación iniciada"); Connection c = Conexion.getConexionGenerica(); Statement t; try { t = c.createStatement(); t.executeUpdate("SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0"); t.executeUpdate("SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0"); t.executeUpdate("SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'"); t.executeUpdate("CREATE SCHEMA IF NOT EXISTS `bluecatch` DEFAULT CHARACTER SET latin1"); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("USE `bluecatch`"); //Tablas `bluecatch`.`roles` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`roles`");

Page 271: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

143

t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`roles` ( " + "`id_rol` INT NOT NULL AUTO_INCREMENT , " + "`rol` VARCHAR(40) NOT NULL , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_rol`) ) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`usuarios` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`usuarios` "); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`usuarios` ( " + "`id_usuario` INT NOT NULL AUTO_INCREMENT , " + "`id_rol` INT NOT NULL , " + "`usuario` VARCHAR(20) NOT NULL , " + "`clave` VARCHAR(32) NOT NULL , " + "`nombres` VARCHAR(60) NOT NULL , " + "`apellidos` VARCHAR(60) NOT NULL , " + "`identificacion` VARCHAR(20) NOT NULL , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_usuario`) , " + "INDEX `usuarios_fk2` (`id_rol` ASC) , " + "CONSTRAINT `usuarios_fk2` " + "FOREIGN KEY (`id_rol` ) " + "REFERENCES `bluecatch`.`roles` (`id_rol` ) " + "ON DELETE NO ACTION " + "ON UPDATE NO ACTION) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`campanias` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`campanias` "); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`campanias` ( " + "`id_campania` INT NOT NULL AUTO_INCREMENT , " + "`campania` VARCHAR(200) NOT NULL , " + "`descripcion` VARCHAR(500) NOT NULL , " + "`tipo` VARCHAR(1) NOT NULL COMMENT 'O=Operacional\nP=Permanente' , " + "`costo_ref_mensaje` FLOAT NOT NULL , " + "`fecha_inicio` DATETIME NOT NULL , " + "`fecha_fin` DATETIME NULL , " + "`fase` VARCHAR(1) NOT NULL COMMENT 'P=Pendiente\nE=Ejecucion\nF=Finalizada' , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_campania`) ) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`detalle_campanias` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`detalle_campanias` "); t.executeUpdate("SHOW WARNINGS");

Page 272: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

144

t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`detalle_campanias` ( " + "`id_detalle_campania` INT NOT NULL AUTO_INCREMENT , " + "`id_campania` INT NOT NULL , " + "`ruta` VARCHAR(256) NOT NULL , " + "`tipo` VARCHAR(1) NOT NULL COMMENT 'A=Audio\nI=Imagen' , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_detalle_campania`) , " + "INDEX `detalle_campanias_fk2` (`id_campania` ASC) , " + "CONSTRAINT `detalle_campanias_fk2` " + "FOREIGN KEY (`id_campania` ) " + "REFERENCES `bluecatch`.`campanias` (`id_campania` ) " + "ON DELETE NO ACTION " + "ON UPDATE NO ACTION) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`dispositivos` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`dispositivos`"); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`dispositivos` ( " + "`id_dispositivo` INT NOT NULL AUTO_INCREMENT , " + "`direccion_bt` VARCHAR(20) NOT NULL , " + "`nombre_bt` VARCHAR(100) NULL , " + "`estado_bloqueado` VARCHAR(1) NOT NULL COMMENT 'N=No esta bloqueado\nS=Si esta bloqueado' , " + "`fecha_ultimo_bloqueo` DATETIME NULL , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_dispositivo`) ) " + "ENGINE = InnoDB " + "DEFAULT CHARACTER SET = big5 " + "COLLATE = big5_bin"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`bitacora_campanias` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`bitacora_campanias` "); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`bitacora_campanias` ( " + "`id_bitacora_campania` INT NOT NULL AUTO_INCREMENT , " + "`id_detalle_campania` INT NOT NULL , " + "`id_usuario` INT NOT NULL , " + "`id_dispositivo_destino` INT NOT NULL , " + "`fecha_registro` DATETIME NOT NULL , " + "`evento` VARCHAR(1) NOT NULL COMMENT 'P=Pendiente\nI=Inicio transmision\nE=Transmision exitosa\nX=Transmision fallida\nC=Transmision cancelada' , " + "`observacion` VARCHAR(500) NOT NULL , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_bitacora_campania`) , " + "INDEX `bitacora_campanias_fk3` (`id_usuario` ASC) , " + "INDEX `bitacora_campanias_fk2` (`id_detalle_campania` ASC) , "

Page 273: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

145

+ "INDEX `bitacora_campanias_fk4` (`id_dispositivo_destino` ASC) , " + "CONSTRAINT `bitacora_campanias_fk3` " + "FOREIGN KEY (`id_usuario` ) " + "REFERENCES `bluecatch`.`usuarios` (`id_usuario` ) " + "ON DELETE NO ACTION " + "ON UPDATE NO ACTION, " + "CONSTRAINT `bitacora_campanias_fk2` " + "FOREIGN KEY (`id_detalle_campania` ) " + "REFERENCES `bluecatch`.`detalle_campanias` (`id_detalle_campania` ) " + "ON DELETE NO ACTION " + "ON UPDATE NO ACTION, " + "CONSTRAINT `bitacora_campanias_fk4` " + "FOREIGN KEY (`id_dispositivo_destino` ) " + "REFERENCES `bluecatch`.`dispositivos` (`id_dispositivo` ) " + "ON DELETE NO ACTION " + "ON UPDATE NO ACTION) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); //Tabla `bluecatch`.`parametros_generales` t.executeUpdate("DROP TABLE IF EXISTS `bluecatch`.`parametros_generales` "); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("CREATE TABLE IF NOT EXISTS `bluecatch`.`parametros_generales` ( " + "`id_parametro_general` INT NOT NULL AUTO_INCREMENT , " + "`parametro` VARCHAR(30) NOT NULL , " + "`descripcion` VARCHAR(500) NOT NULL , " + "`valor` VARCHAR(500) NOT NULL , " + "`tipo` VARCHAR(1) NOT NULL COMMENT 'V=Valor\nM=Mensaje' , " + "`estado` VARCHAR(1) NOT NULL COMMENT 'A=Activo\nI=Inactivo' , " + "PRIMARY KEY (`id_parametro_general`) ) " + "ENGINE = InnoDB"); t.executeUpdate("SHOW WARNINGS"); t.executeUpdate("SET SQL_MODE=@OLD_SQL_MODE"); t.executeUpdate("SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS"); t.executeUpdate("SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS"); // Registros necesarios para la ejecución t.executeUpdate("INSERT INTO roles (rol, estado) VALUES ('Administrador', 'A')"); t.executeUpdate("INSERT INTO roles (rol, estado) VALUES ('Operador', 'A');"); t.executeUpdate("INSERT INTO usuarios (id_rol, usuario, clave, nombres, apellidos, identificacion, estado) " + "VALUES (1, 'admin', AES_ENCRYPT('admin','admi'), 'Nombre Administrador', 'Apellido Administrador', '0000000000', 'A');"); t.executeUpdate("INSERT INTO parametros_generales (parametro, descripcion, valor, tipo, estado) " + "VALUES ('TIEMPO_BLOQUEO', " + "'Tiempo que un dispositivo no podrá recibir un archivo de publicidad luego de haber recibio uno satisfactoriamente', " + "'10', "

Page 274: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

146

+ "'V', " + "'A')"); t.executeUpdate("INSERT INTO parametros_generales (parametro, descripcion, valor, tipo, estado) " + "VALUES ('RUTA_REPORTES', " + "'Ruta en donde se exportarán los reportes del sistema en formato PDF', " + "'C:\\\\Reportes BlueCatch', " + "'C', " + "'A');"); t.executeUpdate("INSERT INTO parametros_generales (parametro, descripcion, valor, tipo, estado) " + "VALUES ('INSTALADO', " + "'Parametro que determina si la instalacion se realizó correctamente', " + "'S', " + "'V', " + "'A')"); c.commit(); logger.info("ejecutar - Instalación finalizada correctamente"); } catch (SQLException sqle) { logger.warn("ejecutar - Error al ejecutar la instalación - " + sqle.getMessage()); throw new ErrorAplicativo("Instalador", "ejecutar", "Error al ejecutar la instalación", sqle.getMessage()); } } }

4.1.6.6 ModeloTablaCampanias

package com.jabluecatch.util; import com.jabluecatch.dto.ConsultaCampanias; import java.util.Vector; import javax.swing.table.AbstractTableModel; /** * Clase que representa el modelo para armar las tablas en donde se muestran * instancias de las campañas * @author Fausto Almeida */ public class ModeloTablaCampanias extends AbstractTableModel { Vector<ConsultaCampanias> filas; public ModeloTablaCampanias() { filas = new Vector(); } public ModeloTablaCampanias(Vector filas) { this.filas = filas; }

Page 275: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

147

public Vector getFilas() { return filas; } public void setFilas(Vector filas) { this.filas = filas; } public int getRowCount() { return this.filas.size(); } public int getColumnCount() { return 6; } public Object getValueAt(int rowIndex, int columnIndex) { ConsultaCampanias c = this.filas.get(rowIndex); Object result = null; if (columnIndex == 0) { result = c.getIdCampania(); } else if (columnIndex == 1) { result = c.getCampania(); } else if (columnIndex == 2) { result = c.getTipo(); } else if (columnIndex == 3) { result = c.getFechaInicio(); } else if (columnIndex == 4) { result = c.getFechaFin(); } else if (columnIndex == 5) { result = (c.getFase().equals("P") ? "Pendiente" : (c.getFase().equals("E") ? "Ejecución" : "Finalizada")); } return result; } @Override public String getColumnName(int columnIndex) { String result = null; if (columnIndex == 0) { result = "Id"; } else if (columnIndex == 1) { result = "Campaña"; } else if (columnIndex == 2) { result = "Tipo"; } else if (columnIndex == 3) { result = "Fecha de inicio"; } else if (columnIndex == 4) { result = "Fecha de finalización"; } else if (columnIndex == 5) { result = "Fase"; } return result; } }

Page 276: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

148

4.1.6.7 ModeloTablaMonitor

package com.jabluecatch.util; import com.jabluecatch.dto.Tarea; import java.util.Vector; import javax.swing.table.AbstractTableModel; /** * Clase que representa el modelo para armar las tablas en donde se muestran * instancias de las tareas, es decir el monitor de la pantalla principal * @author Fausto Almeida */ public class ModeloTablaMonitor extends AbstractTableModel { Vector<Tarea> filas; public ModeloTablaMonitor() { filas = new Vector(); } public ModeloTablaMonitor(Vector filas) { this.filas = filas; } public Vector getFilas() { return filas; } public void setFilas(Vector filas) { this.filas = filas; } public int getRowCount() { return this.filas.size(); } public int getColumnCount() { return 4; } public Object getValueAt(int rowIndex, int columnIndex) { Object result = null; Tarea rm = this.filas.get(rowIndex); if (columnIndex == 0) { result = rm.getReceptor().getNombreBt(); } else if (columnIndex == 1) { result = rm.getArchivoAEnviar().getRuta(); } else if (columnIndex == 2) { result = rm.getEstado(); } else if (columnIndex == 3) { result = rm.getPorcentajeCompletado(); } return result; }

Page 277: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

149

@Override public String getColumnName(int columnIndex) { String result = ""; if (columnIndex == 0) { result = "Nombre dispositivo"; } else if (columnIndex == 1) { result = "Archivo a enviar"; } else if (columnIndex == 2) { result = "Estado"; } else if (columnIndex == 3) { result = "Porcentaje completado"; } return result; } }

4.1.6.8 ModeloTablaUsuarios

package com.jabluecatch.util; import com.jabluecatch.dto.ConsultaUsuarios; import java.util.Vector; import javax.swing.table.AbstractTableModel; /** * Clase que representa el modelo para armar las tablas en donde se muestran * instancias de los usuarios * @author Fausto Almeida */ public class ModeloTablaUsuarios extends AbstractTableModel { Vector<ConsultaUsuarios> filas; public ModeloTablaUsuarios() { filas = new Vector(); } public ModeloTablaUsuarios(Vector filas) { this.filas = filas; } public Vector getFilas() { return filas; } public void setFilas(Vector filas) { this.filas = filas; } public int getRowCount() { return this.filas.size(); } public int getColumnCount() {

Page 278: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

150

return 5; } public Object getValueAt(int rowIndex, int columnIndex) { ConsultaUsuarios u = this.filas.get(rowIndex); Object result = null; if (columnIndex == 0) { result = u.getIdUsuario(); } else if (columnIndex == 1) { result = u.getUsuario(); } else if (columnIndex == 2) { result = u.getRol(); } else if (columnIndex == 3) { result = u.getNombres(); } else if (columnIndex == 4) { result = u.getApellidos(); } return result; } @Override public String getColumnName(int columnIndex) { String result = null; if (columnIndex == 0) { result = "Id"; } else if (columnIndex == 1) { result = "Usuario"; } else if (columnIndex == 2) { result = "Rol"; } else if (columnIndex == 3) { result = "Nombres"; } else if (columnIndex == 4) { result = "Apellidos"; } return result; } }

4.1.6.9 ValidadorNombreDispositivo

package com.jabluecatch.util; /** * Clase que permite validar si el nombre de un dispositivo encontrado posee o * no caracteres especiales * @author Fausto Almeida */ public class ValidadorNombreDispositivo { public static boolean esValido(String nombreDispositivo) { boolean result = true; char caracteres[] = nombreDispositivo.toCharArray();

Page 279: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

151

for (char c : caracteres){ if (!(Character.isLetterOrDigit(c) || Character.isSpaceChar(c))) { result = false; } } return result; } }

4.1.7 Paquete com.jabluecatch.gui.sistema

4.1.7.1 CambiarClave

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de cambio de clave * @author Fausto Almeida */ public class CambiarClave extends javax.swing.JDialog { /** Creates new form CambiarClave */ public CambiarClave(PantallaPrincipal padre, boolean modal, String nombreUsuario) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(nombreUsuario); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {

Page 280: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

152

lblClave = new javax.swing.JLabel(); lblReClave = new javax.swing.JLabel(); txtClave = new javax.swing.JPasswordField(); txtReClave = new javax.swing.JPasswordField(); btnGuardar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); lblClave1 = new javax.swing.JLabel(); txtClaveActual = new javax.swing.JPasswordField(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Cambiar clave"); setBounds(new java.awt.Rectangle(175, 225, 400, 415)); setResizable(false); lblClave.setText("Nueva clave:"); lblReClave.setText("Reingrese la clave:"); txtClave.setColumns(12); txtClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtReClave.setColumns(12); txtReClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt); } }); lblClave1.setText("Clave actual:"); txtClaveActual.setColumns(12); txtClaveActual.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap(78, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 281: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

153

.addComponent(lblClave) .addComponent(lblReClave) .addComponent(lblClave1)) .addGap(24, 24, 24)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(btnGuardar) .addGap(23, 23, 23))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtClaveActual, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnCancelar)) .addGap(70, 70, 70)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(28, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtClaveActual, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblClave1)) .addGap(12, 12, 12) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblClave) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblReClave) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(27, 27, 27) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnGuardar) .addComponent(btnCancelar)) .addGap(25, 25, 25)) ); pack(); }// </editor-fold> private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {

Page 282: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

154

this.dispose(); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de actualizar su clave. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); //logger.warn(acepta); if (acepta == 0) { //Validaciones if (new String(this.txtClaveActual.getPassword()).trim().equals("")) { logger.info("La clave actual no puede ser nula"); JOptionPane.showMessageDialog(this, "La clave actual no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (!new String(this.txtClaveActual.getPassword()).trim().equals(this.usuario.getClave())) { logger.info("La clave actual es incorrecta"); JOptionPane.showMessageDialog(this, "La clave actual es incorrecta", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (new String(this.txtClave.getPassword()).trim().equals("")) { logger.info("La nueva clave no puede ser nula"); JOptionPane.showMessageDialog(this, "La nueva clave no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (new String(this.txtClave.getPassword()).trim().length() < 4) { logger.info("La nueva clave debe tener al menos 4 caracteres"); JOptionPane.showMessageDialog(this, "La nueva clave debe tener al menos 4 caracteres", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (!new String(this.txtClave.getPassword()).equals(new String(this.txtReClave.getPassword()))) { logger.info("Las claves ingresadas no coinciden"); JOptionPane.showMessageDialog(this, "Las claves ingresadas no coinciden", "Información", JOptionPane.INFORMATION_MESSAGE); return; } Usuario nuevoUsuario = new Usuario(this.usuario.getIdUsuario(), this.usuario.getIdRol(), this.usuario.getUsuario(), new String(this.txtClave.getPassword()), this.usuario.getNombres(), this.usuario.getApellidos(), this.usuario.getIdentificacion(), this.usuario.getEstado()); try { UsuarioBO.actualizar(nuevoUsuario); logger.info("Los datos se han guardado correctamente"); JOptionPane.showMessageDialog(this, "Los datos se han guardado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico());

Page 283: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

155

JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } } private void cargaDatos(String nombreUsuario) { //Carga usuario try { this.usuario = UsuarioBO.buscarPorUsuario(nombreUsuario); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError()); this.setVisible(false); return; } } // Variables declaration - do not modify private javax.swing.JButton btnCancelar; private javax.swing.JButton btnGuardar; private javax.swing.JLabel lblClave; private javax.swing.JLabel lblClave1; private javax.swing.JLabel lblReClave; private javax.swing.JPasswordField txtClave; private javax.swing.JPasswordField txtClaveActual; private javax.swing.JPasswordField txtReClave; // End of variables declaration private Usuario usuario; private static Logger logger = Logger.getLogger(CambiarClave.class); }

4.1.7.2 ConsultarUsuarios

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.ConsultaUsuariosBO; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.dto.ConsultaUsuarios; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.ModeloTablaUsuarios; import java.util.Vector; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de consulta de usuarios * @author Fausto Almeida */ public class ConsultarUsuarios extends javax.swing.JDialog { /** Creates new form ConsultarUsuarios */ public ConsultarUsuarios(PantallaPrincipal padre, boolean modal) {

Page 284: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

156

super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblUsuario = new javax.swing.JLabel(); lblNombre = new javax.swing.JLabel(); txtUsuario = new javax.swing.JTextField(); txtNombre = new javax.swing.JTextField(); btnConsultar = new javax.swing.JButton(); btnCerrar = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jScrollPane1 = new javax.swing.JScrollPane(); tabConsultaUsuarios = new javax.swing.JTable(); btnVer = new javax.swing.JButton(); btnEditar = new javax.swing.JButton(); btnEliminar = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Consultar usuarios"); setBounds(new java.awt.Rectangle(175, 225, 600, 400)); setResizable(false); lblUsuario.setText("Usuario:"); lblNombre.setText("Nombres o Apellidos:"); txtUsuario.setColumns(12); txtUsuario.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,2)); txtUsuario.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsuarioActionPerformed(evt); } }); txtNombre.setColumns(20); txtNombre.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); btnConsultar.setText("Consultar"); btnConsultar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnConsultarActionPerformed(evt); } });

Page 285: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

157

btnCerrar.setText("Cerrar"); btnCerrar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCerrarActionPerformed(evt); } }); tabConsultaUsuarios.setModel(new com.jabluecatch.util.ModeloTablaUsuarios()); tabConsultaUsuarios.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane1.setViewportView(tabConsultaUsuarios); btnVer.setText("Ver"); btnVer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnVerActionPerformed(evt); } }); btnEditar.setText("Editar"); btnEditar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnEditarActionPerformed(evt); } }); btnEliminar.setText("Eliminar"); btnEliminar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnEliminarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(btnVer) .addGap(18, 18, 18) .addComponent(btnEditar) .addGap(18, 18, 18) .addComponent(btnEliminar)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 562, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(20, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(107, 107, 107)

Page 286: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

158

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblUsuario) .addComponent(lblNombre)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(32, 32, 32) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnCerrar) .addComponent(btnConsultar)) .addContainerGap(112, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(25, 25, 25) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblUsuario) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnConsultar)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblNombre) .addComponent(txtNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnCerrar)) .addGap(18, 18, 18) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 230, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnVer) .addComponent(btnEditar) .addComponent(btnEliminar)) .addContainerGap(16, Short.MAX_VALUE)) ); pack();

Page 287: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

159

}// </editor-fold> private void txtUsuarioActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) { Vector usuarios = null; try { if (!this.txtUsuario.getText().trim().equals("") && this.txtNombre.getText().trim().equals("")) { //Solo por usuario //logger.warn("Solo por usuario"); usuarios = ConsultaUsuariosBO.buscarPorPatronUsuario(this.txtUsuario.getText().trim()); } else if (this.txtUsuario.getText().trim().equals("") && !this.txtNombre.getText().trim().equals("")) { //Solo por nombres //logger.warn("Solo por nombres"); usuarios = ConsultaUsuariosBO.buscarPorPatronNombreYApellido(this.txtNombre.getText().trim()); } else { //Por ambos //logger.warn("Por ambos"); usuarios = ConsultaUsuariosBO.buscarPorPatronUsuarioYNombreYApellido(this.txtUsuario.getText().trim(), this.txtNombre.getText().trim()); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } this.resultadoConsulta = usuarios; this.tabConsultaUsuarios.setModel(new ModeloTablaUsuarios(usuarios)); this.seteaAnchoColumnas(); } public void ejecutarConsulta() { this.btnConsultar.doClick(); } private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaUsuarios.getSelectedRow() >= 0) {

Page 288: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

160

new EditarDatosUsuario(this, true, ((ConsultaUsuarios) this.resultadoConsulta.get(this.tabConsultaUsuarios.getSelectedRow())).getUsuario()).setVisible(true); } } private void btnVerActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaUsuarios.getSelectedRow() >= 0) { new VerDatosUsuario(this, true, ((ConsultaUsuarios) this.resultadoConsulta.get(this.tabConsultaUsuarios.getSelectedRow())).getUsuario()).setVisible(true); } } private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaUsuarios.getSelectedRow() >= 0) { String nombreUsuario = ((ConsultaUsuarios) this.resultadoConsulta.get(this.tabConsultaUsuarios.getSelectedRow())).getUsuario(); if (nombreUsuario.equals("admin")) { logger.info("El usuario <admin> no puede ser eliminado"); JOptionPane.showMessageDialog(this, "El usuario <admin> no puede ser eliminado", "Información", JOptionPane.INFORMATION_MESSAGE); return; } int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de eliminar al usuario <" + nombreUsuario + ">. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); //logger.warn(acepta); if (acepta == 0) { Usuario usuario = null; //Carga usuario y lo inactiva try { usuario = UsuarioBO.buscarPorUsuario(nombreUsuario); usuario.setEstado("I"); UsuarioBO.actualizar(usuario); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } logger.info("El usuario se ha eliminado correctamente"); JOptionPane.showMessageDialog(this, "El usuario se ha eliminado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.btnConsultar.doClick(); } } } private void seteaAnchoColumnas() { this.tabConsultaUsuarios.getColumn("Id").setPreferredWidth(72); this.tabConsultaUsuarios.getColumn("Usuario").setPreferredWidth(120); this.tabConsultaUsuarios.getColumn("Rol").setPreferredWidth(120); this.tabConsultaUsuarios.getColumn("Nombres").setPreferredWidth(180); this.tabConsultaUsuarios.getColumn("Apellidos").setPreferredWidth(180); } private void cargaDatos() {

Page 289: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

161

this.seteaAnchoColumnas(); this.btnConsultar.doClick(); } // Variables declaration - do not modify private javax.swing.JButton btnCerrar; private javax.swing.JButton btnConsultar; private javax.swing.JButton btnEditar; private javax.swing.JButton btnEliminar; private javax.swing.JButton btnVer; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel lblNombre; private javax.swing.JLabel lblUsuario; private javax.swing.JTable tabConsultaUsuarios; private javax.swing.JTextField txtNombre; private javax.swing.JTextField txtUsuario; // End of variables declaration private Vector resultadoConsulta; private static Logger logger = Logger.getLogger(ConsultarUsuarios.class); }

4.1.7.3 CrearUsuario

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.RolBO; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.Rol; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de creación de usuarios * @author Fas */ public class CrearUsuario extends javax.swing.JDialog { /** Creates new form CrearUsuario */ public CrearUsuario(PantallaPrincipal padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor.

Page 290: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

162

*/ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblUsuario = new javax.swing.JLabel(); lblRol = new javax.swing.JLabel(); lblClave = new javax.swing.JLabel(); lblReClave = new javax.swing.JLabel(); lblNombres = new javax.swing.JLabel(); lblApellidos = new javax.swing.JLabel(); lblIdentificacion = new javax.swing.JLabel(); lblEstado = new javax.swing.JLabel(); txtUsuario = new javax.swing.JTextField(); cmbRol = new javax.swing.JComboBox(); txtClave = new javax.swing.JPasswordField(); txtReClave = new javax.swing.JPasswordField(); txtNombres = new javax.swing.JTextField(); txtApellidos = new javax.swing.JTextField(); txtIdentificacion = new javax.swing.JTextField(); cmbEstado = new javax.swing.JComboBox(); btnGuardar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Crear usuario"); setBounds(new java.awt.Rectangle(175, 225, 400, 415)); setResizable(false); lblUsuario.setText("Nombre de usuario: "); lblRol.setText("Rol:"); lblClave.setText("Clave:"); lblReClave.setText("Reingrese la clave:"); lblNombres.setText("Nombres:"); lblApellidos.setText("Apellidos:"); lblIdentificacion.setText("Identificación:"); lblEstado.setText("Estado:"); txtUsuario.setColumns(12); txtUsuario.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,2)); txtUsuario.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsuarioActionPerformed(evt); } }); txtClave.setColumns(12); txtClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtReClave.setColumns(12);

Page 291: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

163

txtReClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtNombres.setColumns(20); txtNombres.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtApellidos.setColumns(20); txtApellidos.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtIdentificacion.setColumns(15); txtIdentificacion.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,1)); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(65, 65, 65) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblClave) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblUsuario) .addComponent(lblRol) .addComponent(lblNombres) .addComponent(lblApellidos) .addComponent(lblIdentificacion) .addComponent(lblEstado) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(btnGuardar) .addComponent(lblReClave))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnCancelar)

Page 292: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

164

.addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap(54, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(44, 44, 44) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblUsuario) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblRol) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblClave) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblReClave) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

Page 293: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

165

.addComponent(lblNombres) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblApellidos) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblIdentificacion) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblEstado) .addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnGuardar) .addComponent(btnCancelar)) .addGap(27, 27, 27)) ); pack(); }// </editor-fold> private void txtUsuarioActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { //Validaciones if (this.txtUsuario.getText().trim().equals("")) { logger.info("El nombre de usuario no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre de usuario no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (new String(this.txtClave.getPassword()).trim().equals("")) { logger.info("La clave no puede ser nulo"); JOptionPane.showMessageDialog(this, "La clave no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return;

Page 294: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

166

} else if (new String(this.txtClave.getPassword()).trim().length() < 4) { logger.info("La clave debe tener al menos 4 caracteres"); JOptionPane.showMessageDialog(this, "La clave debe tener al menos 4 caracteres", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (!new String(this.txtClave.getPassword()).equals(new String(this.txtReClave.getPassword()))) { logger.info("Las claves ingresadas no coinciden"); JOptionPane.showMessageDialog(this, "Las claves ingresadas no coinciden", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtNombres.getText().trim().equals("")) { logger.info("El nombre no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtApellidos.getText().trim().equals("")) { logger.info("El apellido no puede ser nulo"); JOptionPane.showMessageDialog(this, "El apellido no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtIdentificacion.getText().trim().equals("")) { logger.info("La identificación no puede ser nula"); JOptionPane.showMessageDialog(this, "La identificación no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } int idRol = (this.cmbRol.getSelectedIndex() == 0 ? 1 : 2); String estado = (this.cmbEstado.getSelectedIndex() == 0 ? "A" : "I"); Usuario nuevoUsuario = new Usuario(idRol, this.txtUsuario.getText().trim(), new String(this.txtClave.getPassword()), this.txtNombres.getText().trim(), this.txtApellidos.getText().trim(), this.txtIdentificacion.getText().trim(), estado); try { UsuarioBO.insertar(nuevoUsuario); logger.info("Los datos se han guardado correctamente"); JOptionPane.showMessageDialog(this, "Los datos se han guardado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } private void cargaDatos() { //Carga combo de roles Vector roles = null; try { roles = RolBO.buscarPorEstado("A"); for (int i = 0; i < roles.size(); i++) {

Page 295: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

167

this.cmbRol.addItem(((Rol) roles.get(i)).getRol()); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de estados this.cmbEstado.addItem("Activo"); this.cmbEstado.addItem("Inactivo"); } // Variables declaration - do not modify private javax.swing.JButton btnCancelar; private javax.swing.JButton btnGuardar; private javax.swing.JComboBox cmbEstado; private javax.swing.JComboBox cmbRol; private javax.swing.JLabel lblApellidos; private javax.swing.JLabel lblClave; private javax.swing.JLabel lblEstado; private javax.swing.JLabel lblIdentificacion; private javax.swing.JLabel lblNombres; private javax.swing.JLabel lblReClave; private javax.swing.JLabel lblRol; private javax.swing.JLabel lblUsuario; private javax.swing.JTextField txtApellidos; private javax.swing.JPasswordField txtClave; private javax.swing.JTextField txtIdentificacion; private javax.swing.JTextField txtNombres; private javax.swing.JPasswordField txtReClave; private javax.swing.JTextField txtUsuario; // End of variables declaration private static Logger logger = Logger.getLogger(CrearUsuario.class); }

4.1.7.4 EditarDatosUsuario

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.RolBO; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.entidades.Rol; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de edición de usuarios * @author Fas */ public class EditarDatosUsuario extends javax.swing.JDialog {

Page 296: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

168

/** Creates new form EditarDatosUsuario */ public EditarDatosUsuario(ConsultarUsuarios padre, boolean modal, String nombreUsuario) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(padre, nombreUsuario); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblUsuario = new javax.swing.JLabel(); lblRol = new javax.swing.JLabel(); lblClave = new javax.swing.JLabel(); lblReClave = new javax.swing.JLabel(); lblNombres = new javax.swing.JLabel(); lblApellidos = new javax.swing.JLabel(); lblIdentificacion = new javax.swing.JLabel(); lblEstado = new javax.swing.JLabel(); txtUsuario = new javax.swing.JTextField(); cmbRol = new javax.swing.JComboBox(); txtClave = new javax.swing.JPasswordField(); txtReClave = new javax.swing.JPasswordField(); txtNombres = new javax.swing.JTextField(); txtApellidos = new javax.swing.JTextField(); txtIdentificacion = new javax.swing.JTextField(); cmbEstado = new javax.swing.JComboBox(); btnGuardar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Editar datos usuario"); setBounds(new java.awt.Rectangle(680, 220, 400, 415)); setResizable(false); lblUsuario.setText("Nombre de usuario: "); lblRol.setText("Rol:"); lblClave.setText("Clave:"); lblReClave.setText("Reingrese la clave:"); lblNombres.setText("Nombres:"); lblApellidos.setText("Apellidos:"); lblIdentificacion.setText("Identificación:");

Page 297: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

169

lblEstado.setText("Estado:"); txtUsuario.setColumns(12); txtUsuario.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,2)); txtUsuario.setEditable(false); txtUsuario.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsuarioActionPerformed(evt); } }); txtClave.setColumns(12); txtClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtReClave.setColumns(12); txtReClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtNombres.setColumns(20); txtNombres.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtApellidos.setColumns(20); txtApellidos.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtIdentificacion.setColumns(15); txtIdentificacion.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,1)); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(65, 65, 65) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblClave) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 298: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

170

.addComponent(lblUsuario) .addComponent(lblRol) .addComponent(lblNombres) .addComponent(lblApellidos) .addComponent(lblIdentificacion) .addComponent(lblEstado) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(btnGuardar) .addComponent(lblReClave))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnCancelar) .addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap(54, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(44, 44, 44) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblUsuario) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblRol) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18)

Page 299: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

171

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblClave) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblReClave) .addComponent(txtReClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblNombres) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblApellidos) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblIdentificacion) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblEstado) .addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnGuardar) .addComponent(btnCancelar)) .addGap(27, 27, 27)) ); pack(); }// </editor-fold> private void txtUsuarioActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {

Page 300: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

172

this.dispose(); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de actualizar los datos del usuario. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); //logger.warn(acepta); if (acepta == 0) { //Validaciones if (this.txtUsuario.getText().trim().equals("")) { logger.info("El nombre de usuario no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre de usuario no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (new String(this.txtClave.getPassword()).trim().equals("")) { logger.info("La clave no puede ser nulo"); JOptionPane.showMessageDialog(this, "La clave no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (new String(this.txtClave.getPassword()).trim().length() < 4) { logger.info("La clave debe tener al menos 4 caracteres"); JOptionPane.showMessageDialog(this, "La clave debe tener al menos 4 caracteres", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (!new String(this.txtClave.getPassword()).equals(new String(this.txtReClave.getPassword()))) { logger.info("Las claves ingresadas no coinciden"); JOptionPane.showMessageDialog(this, "Las claves ingresadas no coinciden", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtNombres.getText().trim().equals("")) { logger.info("El nombre no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtApellidos.getText().trim().equals("")) { logger.info("El apellido no puede ser nulo"); JOptionPane.showMessageDialog(this, "El apellido no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtIdentificacion.getText().trim().equals("")) { logger.info("La identificación no puede ser nula"); JOptionPane.showMessageDialog(this, "La identificación no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } int idRol = (this.cmbRol.getSelectedIndex() == 0 ? 1 : 2); String estado = (this.cmbEstado.getSelectedIndex() == 0 ? "A" : "I"); Usuario nuevoUsuario = new Usuario(this.usuario.getIdUsuario(), idRol, this.txtUsuario.getText().trim(), new String(this.txtClave.getPassword()), this.txtNombres.getText().trim(), this.txtApellidos.getText().trim(), this.txtIdentificacion.getText().trim(),

Page 301: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

173

estado); try { UsuarioBO.actualizar(nuevoUsuario); logger.info("Los datos se han actualizado correctamente"); JOptionPane.showMessageDialog(this, "Los datos se han actualizado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.padre.ejecutarConsulta(); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } } private void cargaDatos(ConsultarUsuarios padre, String nombreUsuario) { this.padre = padre; //Carga usuario try { this.usuario = UsuarioBO.buscarPorUsuario(nombreUsuario); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError()); this.setVisible(false); return; } //Carga combo de roles Vector roles = null; try { roles = RolBO.buscarPorEstado("A"); for (int i = 0; i < roles.size(); i++) { this.cmbRol.addItem(((Rol) roles.get(i)).getRol()); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de estados this.cmbEstado.addItem("Activo"); this.cmbEstado.addItem("Inactivo"); //Cargar datos del usuario this.txtUsuario.setText(this.usuario.getUsuario()); this.cmbRol.setSelectedIndex(this.usuario.getIdRol() - 1); this.txtClave.setText(this.usuario.getClave()); this.txtReClave.setText(this.usuario.getClave()); this.txtNombres.setText(this.usuario.getNombres()); this.txtApellidos.setText(this.usuario.getApellidos()); this.txtIdentificacion.setText(this.usuario.getIdentificacion()); this.cmbEstado.setSelectedIndex((this.usuario.getEstado().equals("A") ? 0 : 1)); }

Page 302: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

174

// Variables declaration - do not modify private javax.swing.JButton btnCancelar; private javax.swing.JButton btnGuardar; private javax.swing.JComboBox cmbEstado; private javax.swing.JComboBox cmbRol; private javax.swing.JLabel lblApellidos; private javax.swing.JLabel lblClave; private javax.swing.JLabel lblEstado; private javax.swing.JLabel lblIdentificacion; private javax.swing.JLabel lblNombres; private javax.swing.JLabel lblReClave; private javax.swing.JLabel lblRol; private javax.swing.JLabel lblUsuario; private javax.swing.JTextField txtApellidos; private javax.swing.JPasswordField txtClave; private javax.swing.JTextField txtIdentificacion; private javax.swing.JTextField txtNombres; private javax.swing.JPasswordField txtReClave; private javax.swing.JTextField txtUsuario; // End of variables declaration private Usuario usuario; private ConsultarUsuarios padre; private static Logger logger = Logger.getLogger(EditarDatosUsuario.class); }

4.1.7.5 ParametrosGenerales

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.ParametroGeneralBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.util.ErrorAplicativo; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de configuración de parametros generales * @author Fas */ public class ParametrosGenerales extends javax.swing.JDialog { /** Creates new form ParametrosGenerales */ public ParametrosGenerales(PantallaPrincipal padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to

Page 303: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

175

* initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblTiempoBloqueo = new javax.swing.JLabel(); txtTiempoBloqueo = new javax.swing.JTextField(); btnGuardar = new javax.swing.JButton(); btnCerrar = new javax.swing.JButton(); lblRutaReportes = new javax.swing.JLabel(); txtRutaReportes = new javax.swing.JTextField(); btnRutaReportes = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Parametros generales"); setBounds(new java.awt.Rectangle(175, 225, 350, 150)); setResizable(false); lblTiempoBloqueo.setText("Tiempo de bloqueo (min.): "); txtTiempoBloqueo.setColumns(12); txtTiempoBloqueo.setDocument(new com.jabluecatch.util.FormateadorDocumento(4,1)); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCerrar.setText("Cerrar"); btnCerrar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCerrarActionPerformed(evt); } }); lblRutaReportes.setText("Ruta de reportes exportados: "); txtRutaReportes.setColumns(12); txtRutaReportes.setEditable(false); txtRutaReportes.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtRutaReportesActionPerformed(evt); } }); btnRutaReportes.setText("..."); btnRutaReportes.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnRutaReportesActionPerformed(evt); } });

Page 304: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

176

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(101, Short.MAX_VALUE) .addComponent(btnGuardar) .addGap(18, 18, 18) .addComponent(btnCerrar) .addGap(155, 155, 155)) .addGroup(layout.createSequentialGroup() .addGap(48, 48, 48) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(txtRutaReportes, javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblTiempoBloqueo) .addComponent(lblRutaReportes)) .addGap(18, 18, 18) .addComponent(txtTiempoBloqueo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(btnRutaReportes) .addContainerGap(38, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(44, 44, 44) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblTiempoBloqueo) .addComponent(txtTiempoBloqueo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(lblRutaReportes) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtRutaReportes, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnRutaReportes)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

Page 305: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

177

.addComponent(btnGuardar) .addComponent(btnCerrar)) .addGap(23, 23, 23)) ); pack(); }// </editor-fold> private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { //Guardamos el parametro TIEMPO_BLOQUEO int lTiempoBloqueo = 0; try { lTiempoBloqueo = Integer.parseInt(this.txtTiempoBloqueo.getText()); } catch (NumberFormatException nfe) { logger.warn(nfe.getMessage()); JOptionPane.showMessageDialog(this, "El parametro ingresado no es un valor numérico válido", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (lTiempoBloqueo <= 0) { logger.info("El parametro ingresado debe ser mayor que 0"); JOptionPane.showMessageDialog(this, "El parametro ingresado debe ser mayor que 0", "Información", JOptionPane.INFORMATION_MESSAGE); return; } this.tiempoBloqueo.setValor(String.valueOf(lTiempoBloqueo)); this.rutaReportes.setValor(this.txtRutaReportes.getText().replace("\\", "\\\\")); try { //Actualizar el valor de la BD ParametroGeneralBO.actualizar(this.tiempoBloqueo); ParametroGeneralBO.actualizar(this.rutaReportes); logger.info("Los datos se han guardado correctamente"); JOptionPane.showMessageDialog(this, "Los datos se han guardado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } } private void btnRutaReportesActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorRutaReportes.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File ruta = this.selectorRutaReportes.getSelectedFile(); if (!ruta.isDirectory()) { logger.debug("btnRutaReportesActionPerformed - La ruta seleccionada no es un directorio");

Page 306: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

178

JOptionPane.showMessageDialog(this, "La ruta seleccionada no es un directorio", "Error", JOptionPane.ERROR_MESSAGE); return; } if (!ruta.canWrite()) { logger.debug("btnRutaReportesActionPerformed - La ruta seleccionada no tiene permiso de escritura"); JOptionPane.showMessageDialog(this, "La ruta seleccionada no tiene permiso de escritura", "Error", JOptionPane.ERROR_MESSAGE); return; } this.txtRutaReportes.setText(ruta.getAbsolutePath()); } } private void txtRutaReportesActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void cargaDatos() { try { this.tiempoBloqueo = ParametroGeneralBO.buscarPorParametroYEstado("TIEMPO_BLOQUEO","A"); this.rutaReportes = ParametroGeneralBO.buscarPorParametroYEstado("RUTA_REPORTES","A"); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } this.txtTiempoBloqueo.setText(this.tiempoBloqueo.getValor()); this.txtTiempoBloqueo.setToolTipText(this.tiempoBloqueo.getDescripcion()); this.txtRutaReportes.setText(this.rutaReportes.getValor()); this.txtRutaReportes.setToolTipText(this.rutaReportes.getDescripcion()); this.selectorRutaReportes = new JFileChooser(); this.selectorRutaReportes.setAcceptAllFileFilterUsed(false); this.selectorRutaReportes.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } // Variables declaration - do not modify private javax.swing.JButton btnCerrar; private javax.swing.JButton btnGuardar; private javax.swing.JButton btnRutaReportes; private javax.swing.JLabel lblRutaReportes; private javax.swing.JLabel lblTiempoBloqueo; private javax.swing.JTextField txtRutaReportes; private javax.swing.JTextField txtTiempoBloqueo; // End of variables declaration private ParametroGeneral tiempoBloqueo; private ParametroGeneral rutaReportes; private JFileChooser selectorRutaReportes; private static Logger logger = Logger.getLogger(ParametrosGenerales.class); }

Page 307: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

179

4.1.7.6 VerDatosUsuario

package com.jabluecatch.gui.sistema; import com.jabluecatch.bo.RolBO; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.entidades.Rol; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import java.util.Vector; import javax.swing.JDialog; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de ver los datos de un usuario * @author Fas */ public class VerDatosUsuario extends javax.swing.JDialog { /** Creates new form VerDatosUsuario */ public VerDatosUsuario(JDialog padre, boolean modal, String nombreUsuario) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(nombreUsuario); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblUsuario = new javax.swing.JLabel(); lblRol = new javax.swing.JLabel(); lblNombres = new javax.swing.JLabel(); lblApellidos = new javax.swing.JLabel(); lblIdentificacion = new javax.swing.JLabel(); lblEstado = new javax.swing.JLabel(); txtUsuario = new javax.swing.JTextField(); cmbRol = new javax.swing.JComboBox(); txtNombres = new javax.swing.JTextField(); txtApellidos = new javax.swing.JTextField(); txtIdentificacion = new javax.swing.JTextField(); cmbEstado = new javax.swing.JComboBox(); btnAceptar = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Ver datos del usuario"); setBounds(new java.awt.Rectangle(680, 225, 400, 317));

Page 308: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

180

setResizable(false); lblUsuario.setText("Nombre de usuario: "); lblRol.setText("Rol:"); lblNombres.setText("Nombres:"); lblApellidos.setText("Apellidos:"); lblIdentificacion.setText("Identificación:"); lblEstado.setText("Estado:"); txtUsuario.setColumns(12); txtUsuario.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,2)); txtUsuario.setEditable(false); txtUsuario.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsuarioActionPerformed(evt); } }); cmbRol.setEnabled(false); txtNombres.setColumns(20); txtNombres.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtNombres.setEditable(false); txtApellidos.setColumns(20); txtApellidos.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtApellidos.setEditable(false); txtIdentificacion.setColumns(15); txtIdentificacion.setDocument(new com.jabluecatch.util.FormateadorDocumento(20,1)); txtIdentificacion.setEditable(false); cmbEstado.setEnabled(false); btnAceptar.setText("Aceptar"); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAceptarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(65, 65, 65)

Page 309: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

181

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblUsuario) .addComponent(lblRol) .addComponent(lblNombres) .addComponent(lblApellidos) .addComponent(lblIdentificacion) .addComponent(lblEstado)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(54, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(144, 144, 144) .addComponent(btnAceptar, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE) .addGap(176, 176, 176)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(44, 44, 44) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblUsuario) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cmbRol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblRol)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtNombres, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblNombres))

Page 310: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

182

.addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblApellidos)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtIdentificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblIdentificacion)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cmbEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblEstado)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE) .addComponent(btnAceptar) .addContainerGap()) ); pack(); }// </editor-fold> private void txtUsuarioActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void cargaDatos(String nombreUsuario) { //Carga usuario try { this.usuario = UsuarioBO.buscarPorUsuario(nombreUsuario); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de roles Vector roles = null; try { roles = RolBO.buscarPorEstado("A"); for (int i = 0; i < roles.size(); i++) { this.cmbRol.addItem(((Rol) roles.get(i)).getRol()); } } catch (ErrorAplicativo ea) {

Page 311: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

183

logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de estados this.cmbEstado.addItem("Activo"); this.cmbEstado.addItem("Inactivo"); //Cargar datos del usuario this.txtUsuario.setText(this.usuario.getUsuario()); this.cmbRol.setSelectedIndex(this.usuario.getIdRol() - 1); this.txtNombres.setText(this.usuario.getNombres()); this.txtApellidos.setText(this.usuario.getApellidos()); this.txtIdentificacion.setText(this.usuario.getIdentificacion()); this.cmbEstado.setSelectedIndex((this.usuario.getEstado().equals("A") ? 0 : 1)); } // Variables declaration - do not modify private javax.swing.JButton btnAceptar; private javax.swing.JComboBox cmbEstado; private javax.swing.JComboBox cmbRol; private javax.swing.JLabel lblApellidos; private javax.swing.JLabel lblEstado; private javax.swing.JLabel lblIdentificacion; private javax.swing.JLabel lblNombres; private javax.swing.JLabel lblRol; private javax.swing.JLabel lblUsuario; private javax.swing.JTextField txtApellidos; private javax.swing.JTextField txtIdentificacion; private javax.swing.JTextField txtNombres; private javax.swing.JTextField txtUsuario; // End of variables declaration private Usuario usuario; private static Logger logger = Logger.getLogger(VerDatosUsuario.class); }

4.1.8 Paquete com.jabluecatch.gui.campania

4.1.8.1 ConsultarCampanias

package com.jabluecatch.gui.campania; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.ConsultaCampaniasBO; import com.jabluecatch.dao.CampaniaDAO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.Campania; import com.jabluecatch.dto.ConsultaCampanias;

Page 312: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

184

import com.mydatepicker.main.DatePicker; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.ModeloTablaCampanias; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.Vector; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de consulta de campañas * @author Fas */ public class ConsultarCampanias extends javax.swing.JDialog { /** Creates new form ConsultarCampanias */ public ConsultarCampanias(PantallaPrincipal padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(padre); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblCampania = new javax.swing.JLabel(); lblFechaReferencial = new javax.swing.JLabel(); txtCampania = new javax.swing.JTextField(); btnConsultar = new javax.swing.JButton(); btnCerrar = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jScrollPane1 = new javax.swing.JScrollPane(); tabConsultaCampanias = new javax.swing.JTable(); dtfFechaReferencial = new com.jabluecatch.util.DateTextField(); btnVer = new javax.swing.JButton(); btnEditar = new javax.swing.JButton(); btnEliminar = new javax.swing.JButton(); btnFinalizarCampania = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Consultar campañas"); setBounds(new java.awt.Rectangle(175, 225, 720, 440)); setResizable(false); lblCampania.setText("Nombre Campaña:"); lblFechaReferencial.setText("Fecha Referencial:");

Page 313: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

185

txtCampania.setColumns(20); txtCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtCampaniaActionPerformed(evt); } }); btnConsultar.setText("Consultar"); btnConsultar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnConsultarActionPerformed(evt); } }); btnCerrar.setText("Cerrar"); btnCerrar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCerrarActionPerformed(evt); } }); tabConsultaCampanias.setModel(new com.jabluecatch.util.ModeloTablaCampanias()); tabConsultaCampanias.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane1.setViewportView(tabConsultaCampanias); dtfFechaReferencial.setColumns(10); dtfFechaReferencial.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaReferencialMouseReleased(evt); } }); btnVer.setText("Ver"); btnVer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnVerActionPerformed(evt); } }); btnEditar.setText("Editar"); btnEditar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnEditarActionPerformed(evt); } }); btnEliminar.setText("Eliminar"); btnEliminar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnEliminarActionPerformed(evt); } });

Page 314: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

186

btnFinalizarCampania.setText("Finalizar campaña"); btnFinalizarCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnFinalizarCampaniaActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGap(163, 163, 163) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblCampania) .addComponent(lblFechaReferencial)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaReferencial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(35, 35, 35) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnConsultar) .addComponent(btnCerrar)) .addContainerGap(163, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(btnVer) .addGap(18, 18, 18) .addComponent(btnEditar) .addGap(18, 18, 18) .addComponent(btnEliminar) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnFinalizarCampania)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 682, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(20, Short.MAX_VALUE)) ); layout.setVerticalGroup(

Page 315: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

187

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCampania) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnConsultar)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaReferencial) .addComponent(dtfFechaReferencial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnCerrar)) .addGap(18, 18, 18) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 268, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnVer) .addComponent(btnEditar) .addComponent(btnEliminar) .addComponent(btnFinalizarCampania)) .addContainerGap(12, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void txtCampaniaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) { Vector campanias = null; try { if (!this.txtCampania.getText().trim().equals("") && this.dtfFechaReferencial.getText().trim().equals("")) { //Solo por campania //logger.info("Ejecuta consulta solo por campaña"); campanias = ConsultaCampaniasBO.buscarPorPatronCampania(this.txtCampania.getText().trim());

Page 316: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

188

} else if (this.txtCampania.getText().trim().equals("") && !this.dtfFechaReferencial.getText().trim().equals("")) { //Solo por fecha referencial //logger.info("Ejecuta consulta solo por fecha referencial"); campanias = ConsultaCampaniasBO.buscarPorFechaReferencial(this.dtfFechaReferencial.getText().trim()); } else { //Por ambos //logger.info("Ejecuta consulta por campaña y fecha referencial"); campanias = ConsultaCampaniasBO.buscarPorPatronCampaniaYFechaReferencial(this.txtCampania.getText().trim(), this.dtfFechaReferencial.getText().trim()); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } this.resultadoConsulta = campanias; this.tabConsultaCampanias.setModel(new ModeloTablaCampanias(campanias)); this.seteaAnchoColumnas(); } public void ejecutarConsulta() { this.btnConsultar.doClick(); } private void btnVerActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaCampanias.getSelectedRow() >= 0) { new VerDatosCampania(this, true, ((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow())).getIdCampania()).setVisible(true); } } private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaCampanias.getSelectedRow() >= 0) { //Verificar que la fecha de inicio no haya pasado Campania c = null; try { c = CampaniaDAO.buscarPorPK(((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow())).getIdCampania()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } if (c.getFechaInicio().before(Calendar.getInstance().getTime())) { logger.info("No se puede editar una campaña cuya fecha de inicio ya haya pasado");

Page 317: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

189

JOptionPane.showMessageDialog(this, "No se puede editar una campaña cuya fecha de inicio ya haya pasado", "Información", JOptionPane.INFORMATION_MESSAGE); return; } new EditarDatosCampania(this, true, ((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow())).getIdCampania()).setVisible(true); } } private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaCampanias.getSelectedRow() >= 0) { //Verificar que la fecha de inicio no haya pasado Campania c = null; try { c = CampaniaDAO.buscarPorPK(((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow())).getIdCampania()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } if (c.getFechaInicio().before(Calendar.getInstance().getTime())) { logger.info("No se puede eliminar una campaña cuya fecha de inicio ya haya pasado"); JOptionPane.showMessageDialog(this, "No se puede eliminar una campaña cuya fecha de inicio ya haya pasado", "Información", JOptionPane.INFORMATION_MESSAGE); return; } int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de eliminar la campaña <" + c.getCampania() + ">. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (acepta == 0) { try { CampaniaBO.eliminar(c); logger.info("La campaña se ha eliminado correctamente"); JOptionPane.showMessageDialog(this, "La campaña se ha eliminado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.btnConsultar.doClick(); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } } } private void btnFinalizarCampaniaActionPerformed(java.awt.event.ActionEvent evt) {

Page 318: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

190

if (this.tabConsultaCampanias.getSelectedRow() >= 0) { //Cargar campania Campania c = null; try { c = CampaniaDAO.buscarPorPK(((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow())).getIdCampania()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } if (c.getFase().equals("F")) { logger.info("La campaña ya se encuentra finalizada"); JOptionPane.showMessageDialog(this, "La campaña ya se encuentra finalizada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (c.getFechaInicio().after(Calendar.getInstance().getTime())) { logger.info("No se puede finalizar una campaña que no haya iniciado"); JOptionPane.showMessageDialog(this, "No se puede finalizar una campaña que no haya iniciado", "Información", JOptionPane.INFORMATION_MESSAGE); return; } int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de finalizar la campaña <" + c.getCampania() + ">. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (acepta == 0) { c.setFase("F"); c.setFechaFin(Calendar.getInstance().getTime()); try { CampaniaBO.actualizar(c); JOptionPane.showMessageDialog(this, "La campaña se ha finalizado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.btnConsultar.doClick(); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } } } private void dtfFechaReferencialMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaReferencial, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaReferencial.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaReferencial); }

Page 319: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

191

private void seteaAnchoColumnas() { this.tabConsultaCampanias.getColumn("Id").setPreferredWidth(72); this.tabConsultaCampanias.getColumn("Campaña").setPreferredWidth(300); this.tabConsultaCampanias.getColumn("Tipo").setPreferredWidth(100); this.tabConsultaCampanias.getColumn("Fecha de inicio").setPreferredWidth(160); this.tabConsultaCampanias.getColumn("Fecha de finalización").setPreferredWidth(160); this.tabConsultaCampanias.getColumn("Fase").setPreferredWidth(80); } private void cargaDatos(PantallaPrincipal padre) { if (padre.getUsuarioSesion().getIdRol() != 1) { this.btnEditar.setEnabled(false); this.btnEliminar.setEnabled(false); } this.seteaAnchoColumnas(); this.btnConsultar.doClick(); } // Variables declaration - do not modify private javax.swing.JButton btnCerrar; private javax.swing.JButton btnConsultar; private javax.swing.JButton btnEditar; private javax.swing.JButton btnEliminar; private javax.swing.JButton btnFinalizarCampania; private javax.swing.JButton btnVer; private com.jabluecatch.util.DateTextField dtfFechaReferencial; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblFechaReferencial; private javax.swing.JTable tabConsultaCampanias; private javax.swing.JTextField txtCampania; // End of variables declaration private Vector resultadoConsulta; private static Logger logger = Logger.getLogger(ConsultarCampanias.class); }

4.1.8.2 CrearCampania

package com.jabluecatch.gui.campania; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.gui.PantallaPrincipal; import com.jabluecatch.entidades.Campania; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import com.mydatepicker.main.DatePicker; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.Vector; import javax.swing.JFileChooser;

Page 320: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

192

import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.log4j.Logger; /** * Clase que representa la ventana de creación de campañas * @author Fas */ public class CrearCampania extends javax.swing.JDialog { private final int PESO_MAXIMO_KB = 500; /** Creates new form CrearCampania */ public CrearCampania(PantallaPrincipal padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jFileChooser1 = new javax.swing.JFileChooser(); jFileChooser2 = new javax.swing.JFileChooser(); lblCampania = new javax.swing.JLabel(); lblDescripcion = new javax.swing.JLabel(); lblTipo = new javax.swing.JLabel(); lblFechaInicio = new javax.swing.JLabel(); lblFechaFin = new javax.swing.JLabel(); txtCampania = new javax.swing.JTextField(); btnGuardar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); tarDescripcion = new javax.swing.JTextArea(); cmbTipo = new javax.swing.JComboBox(); lblHoraInicio = new javax.swing.JLabel(); lblHoraFin = new javax.swing.JLabel(); lblDetalleAudio = new javax.swing.JLabel(); lblAudio1 = new javax.swing.JLabel(); txtAudio1 = new javax.swing.JTextField(); btnAudio1 = new javax.swing.JButton(); txtAudio2 = new javax.swing.JTextField(); txtAudio3 = new javax.swing.JTextField(); lblImagen1 = new javax.swing.JLabel(); lblAudio2 = new javax.swing.JLabel(); lblDetalleImagen = new javax.swing.JLabel(); btnAudio2 = new javax.swing.JButton(); lblAudio3 = new javax.swing.JLabel(); btnAudio3 = new javax.swing.JButton();

Page 321: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

193

txtImagen1 = new javax.swing.JTextField(); btnImagen1 = new javax.swing.JButton(); lblImagen2 = new javax.swing.JLabel(); btnImagen2 = new javax.swing.JButton(); btnImagen3 = new javax.swing.JButton(); txtImagen2 = new javax.swing.JTextField(); txtImagen3 = new javax.swing.JTextField(); lblImagen3 = new javax.swing.JLabel(); dtfFechaInicio = new com.jabluecatch.util.DateTextField(); dtfFechaFin = new com.jabluecatch.util.DateTextField(); spiHoraInicio = new javax.swing.JSpinner(); spiMinutoInicio = new javax.swing.JSpinner(); spiHoraFin = new javax.swing.JSpinner(); spiMinutoFin = new javax.swing.JSpinner(); btnXAudio1 = new javax.swing.JButton(); btnXAudio2 = new javax.swing.JButton(); btnXAudio3 = new javax.swing.JButton(); btnXImagen1 = new javax.swing.JButton(); btnXImagen2 = new javax.swing.JButton(); btnXImagen3 = new javax.swing.JButton(); lblCostoRefMensaje = new javax.swing.JLabel(); spiCostoRefMensaje = new javax.swing.JSpinner(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Crear campaña"); setBounds(new java.awt.Rectangle(350, 100, 570, 690)); setResizable(false); lblCampania.setText("Nombre de la campaña: "); lblDescripcion.setText("Descripción:"); lblTipo.setText("Tipo de la campaña:"); lblFechaInicio.setText("Fecha inicio (dd/mm/yyyy):"); lblFechaFin.setText("Fecha fin (dd/mm/yyyy):"); txtCampania.setColumns(30); txtCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(180,3)); txtCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtCampaniaActionPerformed(evt); } }); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt);

Page 322: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

194

} }); tarDescripcion.setColumns(30); tarDescripcion.setDocument(new com.jabluecatch.util.FormateadorDocumento(450,0)); tarDescripcion.setFont(new java.awt.Font("Tahoma", 0, 11)); tarDescripcion.setLineWrap(true); tarDescripcion.setRows(4); tarDescripcion.setWrapStyleWord(true); jScrollPane1.setViewportView(tarDescripcion); cmbTipo.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cmbTipoItemStateChanged(evt); } }); cmbTipo.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { cmbTipoFocusLost(evt); } }); cmbTipo.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { cmbTipoPropertyChange(evt); } }); cmbTipo.addVetoableChangeListener(new java.beans.VetoableChangeListener() { public void vetoableChange(java.beans.PropertyChangeEvent evt)throws java.beans.PropertyVetoException { cmbTipoVetoableChange(evt); } }); lblHoraInicio.setText("Hora (hh24 mi):"); lblHoraFin.setText("Hora (hh24 mi):"); lblDetalleAudio.setText("Archivos de audio a enviar:"); lblAudio1.setText("Archivo 1:"); txtAudio1.setColumns(30); txtAudio1.setEditable(false); btnAudio1.setText("Examinar"); btnAudio1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio1ActionPerformed(evt); } }); txtAudio2.setEditable(false); txtAudio3.setEditable(false); lblImagen1.setText("Archivo 1:");

Page 323: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

195

lblAudio2.setText("Archivo 2:"); lblDetalleImagen.setText("Archivos de imagen a enviar:"); btnAudio2.setText("Examinar"); btnAudio2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio2ActionPerformed(evt); } }); lblAudio3.setText("Archivo 3:"); btnAudio3.setText("Examinar"); btnAudio3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio3ActionPerformed(evt); } }); txtImagen1.setColumns(30); txtImagen1.setEditable(false); btnImagen1.setText("Examinar"); btnImagen1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen1ActionPerformed(evt); } }); lblImagen2.setText("Archivo 2:"); btnImagen2.setText("Examinar"); btnImagen2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen2ActionPerformed(evt); } }); btnImagen3.setText("Examinar"); btnImagen3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen3ActionPerformed(evt); } }); txtImagen2.setEditable(false); txtImagen3.setEditable(false); lblImagen3.setText("Archivo 3:"); dtfFechaInicio.setColumns(10); dtfFechaInicio.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaInicioMouseReleased(evt); } });

Page 324: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

196

dtfFechaFin.setColumns(10); dtfFechaFin.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaFinMouseReleased(evt); } }); dtfFechaFin.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { dtfFechaFinActionPerformed(evt); } }); dtfFechaFin.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { dtfFechaFinFocusLost(evt); } }); spiHoraInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"})); spiMinutoInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"})); spiHoraFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", " "})); spiMinutoFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", " "})); btnXAudio1.setText("X"); btnXAudio1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXAudio1ActionPerformed(evt); } }); btnXAudio2.setText("X"); btnXAudio2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXAudio2ActionPerformed(evt); } }); btnXAudio3.setText("X"); btnXAudio3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXAudio3ActionPerformed(evt);

Page 325: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

197

} }); btnXImagen1.setText("X"); btnXImagen1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen1ActionPerformed(evt); } }); btnXImagen2.setText("X"); btnXImagen2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen2ActionPerformed(evt); } }); btnXImagen3.setText("X"); btnXImagen3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen3ActionPerformed(evt); } }); lblCostoRefMensaje.setText("Costo ref. por mensaje ($):"); spiCostoRefMensaje.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(2.0f), Float.valueOf(0.1f))); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(32, 32, 32) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblCostoRefMensaje) .addGap(18, 18, 18) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 322, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDetalleImagen) .addGroup(layout.createSequentialGroup() .addComponent(lblDetalleAudio)

Page 326: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

198

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 323, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblAudio1) .addComponent(lblAudio2) .addComponent(lblAudio3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtAudio2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE) .addComponent(txtAudio1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE) .addComponent(txtAudio3, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE))) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblImagen1) .addComponent(lblImagen2) .addComponent(lblImagen3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtImagen2, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE) .addComponent(txtImagen1, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE) .addComponent(txtImagen3, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(btnGuardar) .addGap(75, 75, 75) .addComponent(btnCancelar))))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnAudio2) .addComponent(btnAudio1) .addComponent(btnAudio3) .addComponent(btnImagen1) .addComponent(btnImagen2) .addComponent(btnImagen3)))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnXAudio1)

Page 327: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

199

.addComponent(btnXAudio2) .addComponent(btnXAudio3) .addComponent(btnXImagen1) .addComponent(btnXImagen2) .addComponent(btnXImagen3))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblFechaFin) .addComponent(lblFechaInicio) .addComponent(lblTipo) .addComponent(lblDescripcion) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtCampania, javax.swing.GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lblHoraInicio) .addComponent(lblHoraFin)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))

Page 328: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

200

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE)) .addGap(77, 77, 77)))) .addGap(27, 27, 27)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(30, 30, 30) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDescripcion) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblTipo)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaInicio) .addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHoraInicio)) .addGap(9, 9, 9) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaFin) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHoraFin)) .addGap(18, 18, 18)

Page 329: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

201

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCostoRefMensaje) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) .addComponent(lblDetalleAudio) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblAudio1) .addComponent(txtAudio1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnAudio1) .addComponent(btnXAudio1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnAudio2) .addComponent(txtAudio2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio2) .addComponent(btnXAudio2)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnAudio3) .addComponent(txtAudio3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio3) .addComponent(btnXAudio3)) .addGap(33, 33, 33) .addComponent(lblDetalleImagen) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen1) .addComponent(txtImagen1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen1) .addComponent(btnXImagen1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen2) .addComponent(txtImagen2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen2) .addComponent(btnXImagen2)) .addGap(18, 18, 18)

Page 330: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

202

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen3) .addComponent(txtImagen3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen3) .addComponent(btnXImagen3)) .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnGuardar) .addComponent(btnCancelar)) .addGap(28, 28, 28)) ); pack(); }// </editor-fold> private void txtCampaniaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { //Validar nulos if (this.txtCampania.getText().trim().equals("")) { logger.info("El nombre de la campaña no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre de la campaña no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.tarDescripcion.getText().trim().equals("")) { logger.info("La descripcion no puede ser nulo"); JOptionPane.showMessageDialog(this, "La descripcion no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.dtfFechaInicio.getText().trim().equals("")) { logger.info("La fecha de inicio no puede ser nula"); JOptionPane.showMessageDialog(this, "La fecha de inicio no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.dtfFechaFin.getText().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) { logger.info("La fecha de finalización no puede ser nula a menos que la campaña sea permanente"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser nula a menos que la campaña sea permanente", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.spiHoraFin.getValue().toString().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) { logger.info("La hora de finalización no puede ser nula"); JOptionPane.showMessageDialog(this, "La hora de finalización no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return;

Page 331: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

203

} else if (this.spiMinutoFin.getValue().toString().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) { logger.info("El minuto de finalización no puede ser nula a menos que la campaña sea permanente"); JOptionPane.showMessageDialog(this, "El minuto de finalización no puede ser nula a menos que la campaña sea permanente", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtAudio1.getText().trim().equals("") && this.txtAudio2.getText().trim().equals("") && this.txtAudio3.getText().trim().equals("") && this.txtImagen1.getText().trim().equals("") && this.txtImagen2.getText().trim().equals("") && this.txtImagen3.getText().trim().equals("")) { logger.info("Debe configurar al menos un archivo para su envío"); JOptionPane.showMessageDialog(this, "Debe configurar al menos un archivo para su envío", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (this.cmbTipo.getSelectedIndex() != 0) { int confirma = JOptionPane.showConfirmDialog(this, "Ud ha escogido crear una campaña permanente, de ser así, la fecha de finalización ingresada no será tomada en cuenta. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (confirma != 0) { return; } } //Convertir las fechas String sFechaInicio = this.dtfFechaInicio.getText() + " " + this.spiHoraInicio.getValue() + ":" + this.spiMinutoInicio.getValue() + ":00"; String sFechaFin = this.dtfFechaFin.getText() + " " + this.spiHoraFin.getValue() + ":" + this.spiMinutoFin.getValue() + ":00"; Date fechaInicio = null; Date fechaFin = null; try { fechaInicio = FormateadorFecha.aJavaDateTimeDate(sFechaInicio); if (this.cmbTipo.getSelectedIndex() == 0) { fechaFin = FormateadorFecha.aJavaDateTimeDate(sFechaFin); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (fechaInicio.before(Calendar.getInstance().getTime())) { logger.info("La fecha de inicio no puede ser menor a la fecha actual"); JOptionPane.showMessageDialog(this, "La fecha de inicio no puede ser menor a la fecha actual", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (this.cmbTipo.getSelectedIndex() == 0) { if (fechaFin.before(fechaInicio)) { logger.info("La fecha de finalización no puede ser menor a la fecha de inicio");

Page 332: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

204

JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser menor a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (fechaFin.equals(fechaInicio)) { logger.info("La fecha de finalización no puede ser igual a la fecha de inicio"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser igual a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } //Revisar que los archivos existan Vector<DetalleCampania> detallesCampania = new Vector(); if (!this.txtAudio1.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio1.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio1 = new File(this.txtAudio1.getText().trim()); if (!this.filAudio1.exists()) { logger.info("El archivo de audio <" + this.filAudio1.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio1.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtAudio2.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio2.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio2 = new File(this.txtAudio2.getText().trim()); if (!this.filAudio2.exists()) { logger.info("El archivo de audio <" + this.filAudio2.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio2.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtAudio3.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio3.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio3 = new File(this.txtAudio3.getText().trim()); if (!this.filAudio3.exists()) { logger.info("El archivo de audio <" + this.filAudio3.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio3.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtImagen1.getText().trim().equals("")) {

Page 333: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

205

detallesCampania.add(new DetalleCampania(this.txtImagen1.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen1 = new File(this.txtImagen1.getText().trim()); if (!this.filImagen1.exists()) { logger.info("El archivo de imagen <" + this.filImagen1.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen1.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtImagen2.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtImagen2.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen2 = new File(this.txtImagen2.getText().trim()); if (!this.filImagen2.exists()) { logger.info("El archivo de imagen <" + this.filImagen2.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen2.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtImagen3.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtImagen3.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen3 = new File(this.txtImagen3.getText().trim()); if (!this.filImagen3.exists()) { logger.info("El archivo de imagen <" + this.filImagen3.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen3.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } String tipo = this.cmbTipo.getSelectedIndex() == 0 ? "O" : "P"; Campania nuevaCampania = new Campania(this.txtCampania.getText().trim(), this.tarDescripcion.getText().trim(), tipo, (Float) this.spiCostoRefMensaje.getValue(), fechaInicio, this.cmbTipo.getSelectedIndex() == 0 ? fechaFin : null, "P", "A"); try { CampaniaBO.insertar(nuevaCampania, detallesCampania); logger.info("Los datos se han guardado correctamente"); JOptionPane.showMessageDialog(this, "Los datos se han guardado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico());

Page 334: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

206

JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } private void btnAudio2ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); this.txtAudio2.setText(fichero.getAbsolutePath()); } } private boolean archivoExcedePesoMaximo(File fichero) { if ((fichero.length() / 1024) > this.PESO_MAXIMO_KB) { logger.info("El archivo <" + fichero.getName() + "> excede el peso máximo permitido (" + this.PESO_MAXIMO_KB + " KB)"); JOptionPane.showMessageDialog(this, "El archivo <" + fichero.getName() + "> excede el peso máximo permitido (" + this.PESO_MAXIMO_KB + " KB)", "Información", JOptionPane.INFORMATION_MESSAGE); return true; } return false; } private void btnAudio3ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtAudio3.setText(fichero.getAbsolutePath()); } } private void btnAudio1ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtAudio1.setText(fichero.getAbsolutePath()); logger.debug("Archivo: " + fichero.getAbsolutePath()); } } private void btnImagen1ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen1.setText(fichero.getAbsolutePath());

Page 335: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

207

} } private void btnImagen2ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen2.setText(fichero.getAbsolutePath()); } } private void btnImagen3ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen3.setText(fichero.getAbsolutePath()); } } private void btnXAudio1ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio1.setText(""); } private void btnXAudio2ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio2.setText(""); } private void btnXAudio3ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio3.setText(""); } private void btnXImagen1ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void btnXImagen2ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void btnXImagen3ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void dtfFechaFinFocusLost(java.awt.event.FocusEvent evt) { } private void cmbTipoFocusLost(java.awt.event.FocusEvent evt) { // TODO add your handling code here: } private void cmbTipoItemStateChanged(java.awt.event.ItemEvent evt) { if (this.cmbTipo.getSelectedIndex() != 0) {

Page 336: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

208

this.dtfFechaFin.setEnabled(false); this.spiHoraFin.setEnabled(false); this.spiMinutoFin.setEnabled(false); } else { this.dtfFechaFin.setEnabled(true); this.spiHoraFin.setEnabled(true); this.spiMinutoFin.setEnabled(true); } } private void cmbTipoPropertyChange(java.beans.PropertyChangeEvent evt) { } private void cmbTipoVetoableChange(java.beans.PropertyChangeEvent evt)throws java.beans.PropertyVetoException { } private void dtfFechaInicioMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaInicio, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaInicio.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaInicio); } private void dtfFechaFinActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void dtfFechaFinMouseReleased(java.awt.event.MouseEvent evt) { if (this.dtfFechaFin.isEnabled()) { DatePicker dp = new DatePicker(dtfFechaFin, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaFin.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaFin); } } private void cargaDatos() { //Carga combo de tipos this.cmbTipo.addItem("Operativa"); this.cmbTipo.addItem("Permanente"); this.dtfFechaInicio.setText(FormateadorFecha.aJavaDateString(Calendar.getInstance().getTime())); this.spiHoraInicio.setValue("08"); this.spiMinutoInicio.setValue("30"); this.dtfFechaFin.setText(FormateadorFecha.aJavaDateString(Calendar.getInstance().getTime())); this.spiHoraFin.setValue("17"); this.spiMinutoFin.setValue("30"); this.selectorArchivoAudio = new JFileChooser(); this.selectorArchivoAudio.setAcceptAllFileFilterUsed(false); this.selectorArchivoAudio.setFileFilter(new FileNameExtensionFilter("Audio: MP3 & WMA", "mp3", "wma")); this.selectorArchivoImagen = new JFileChooser(); this.selectorArchivoImagen.setAcceptAllFileFilterUsed(false);

Page 337: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

209

this.selectorArchivoImagen.setFileFilter(new FileNameExtensionFilter("Imágenes: JPG & GIF", "jpg", "gif")); } // Variables declaration - do not modify private javax.swing.JButton btnAudio1; private javax.swing.JButton btnAudio2; private javax.swing.JButton btnAudio3; private javax.swing.JButton btnCancelar; private javax.swing.JButton btnGuardar; private javax.swing.JButton btnImagen1; private javax.swing.JButton btnImagen2; private javax.swing.JButton btnImagen3; private javax.swing.JButton btnXAudio1; private javax.swing.JButton btnXAudio2; private javax.swing.JButton btnXAudio3; private javax.swing.JButton btnXImagen1; private javax.swing.JButton btnXImagen2; private javax.swing.JButton btnXImagen3; private javax.swing.JComboBox cmbTipo; private com.jabluecatch.util.DateTextField dtfFechaFin; private com.jabluecatch.util.DateTextField dtfFechaInicio; private javax.swing.JFileChooser jFileChooser1; private javax.swing.JFileChooser jFileChooser2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblAudio1; private javax.swing.JLabel lblAudio2; private javax.swing.JLabel lblAudio3; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblCostoRefMensaje; private javax.swing.JLabel lblDescripcion; private javax.swing.JLabel lblDetalleAudio; private javax.swing.JLabel lblDetalleImagen; private javax.swing.JLabel lblFechaFin; private javax.swing.JLabel lblFechaInicio; private javax.swing.JLabel lblHoraFin; private javax.swing.JLabel lblHoraInicio; private javax.swing.JLabel lblImagen1; private javax.swing.JLabel lblImagen2; private javax.swing.JLabel lblImagen3; private javax.swing.JLabel lblTipo; private javax.swing.JSpinner spiCostoRefMensaje; private javax.swing.JSpinner spiHoraFin; private javax.swing.JSpinner spiHoraInicio; private javax.swing.JSpinner spiMinutoFin; private javax.swing.JSpinner spiMinutoInicio; private javax.swing.JTextArea tarDescripcion; private javax.swing.JTextField txtAudio1; private javax.swing.JTextField txtAudio2; private javax.swing.JTextField txtAudio3; private javax.swing.JTextField txtCampania; private javax.swing.JTextField txtImagen1; private javax.swing.JTextField txtImagen2; private javax.swing.JTextField txtImagen3; // End of variables declaration private JFileChooser selectorArchivoAudio; private JFileChooser selectorArchivoImagen; private File filAudio1; private File filAudio2;

Page 338: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

210

private File filAudio3; private File filImagen1; private File filImagen2; private File filImagen3; private static Logger logger = Logger.getLogger(CrearCampania.class); }

4.1.8.3 EditarDatosCampania

package com.jabluecatch.gui.campania; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.DetalleCampaniaBO; import com.jabluecatch.entidades.Campania; import com.jabluecatch.entidades.DetalleCampania; import com.mydatepicker.main.DatePicker; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.Vector; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.log4j.Logger; /** * Clase que representa la ventana de edición de campañas * @author Fas */ public class EditarDatosCampania extends javax.swing.JDialog { private final int PESO_MAXIMO_KB = 500; /** Creates new form CrearCampania */ public EditarDatosCampania(ConsultarCampanias padre, boolean modal, int idCampania) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(padre, idCampania); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {

Page 339: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

211

jFileChooser1 = new javax.swing.JFileChooser(); jFileChooser2 = new javax.swing.JFileChooser(); lblCampania = new javax.swing.JLabel(); lblDescripcion = new javax.swing.JLabel(); lblTipo = new javax.swing.JLabel(); lblFechaInicio = new javax.swing.JLabel(); lblFechaFin = new javax.swing.JLabel(); txtCampania = new javax.swing.JTextField(); btnGuardar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); tarDescripcion = new javax.swing.JTextArea(); cmbTipo = new javax.swing.JComboBox(); lblHoraInicio = new javax.swing.JLabel(); lblHoraFin = new javax.swing.JLabel(); lblDetalleAudio = new javax.swing.JLabel(); lblAudio1 = new javax.swing.JLabel(); txtAudio1 = new javax.swing.JTextField(); btnAudio1 = new javax.swing.JButton(); txtAudio2 = new javax.swing.JTextField(); txtAudio3 = new javax.swing.JTextField(); lblImagen1 = new javax.swing.JLabel(); lblAudio2 = new javax.swing.JLabel(); lblDetalleImagen = new javax.swing.JLabel(); btnAudio2 = new javax.swing.JButton(); lblAudio3 = new javax.swing.JLabel(); btnAudio3 = new javax.swing.JButton(); txtImagen1 = new javax.swing.JTextField(); btnImagen1 = new javax.swing.JButton(); lblImagen2 = new javax.swing.JLabel(); btnImagen2 = new javax.swing.JButton(); btnImagen3 = new javax.swing.JButton(); txtImagen2 = new javax.swing.JTextField(); txtImagen3 = new javax.swing.JTextField(); lblImagen3 = new javax.swing.JLabel(); dtfFechaInicio = new com.jabluecatch.util.DateTextField(); dtfFechaFin = new com.jabluecatch.util.DateTextField(); spiHoraInicio = new javax.swing.JSpinner(); spiMinutoInicio = new javax.swing.JSpinner(); spiHoraFin = new javax.swing.JSpinner(); spiMinutoFin = new javax.swing.JSpinner(); btnXAudio1 = new javax.swing.JButton(); btnXAudio2 = new javax.swing.JButton(); btnXAudio3 = new javax.swing.JButton(); btnXImagen1 = new javax.swing.JButton(); btnXImagen2 = new javax.swing.JButton(); btnXImagen3 = new javax.swing.JButton(); lblCostoRefMensaje = new javax.swing.JLabel(); spiCostoRefMensaje = new javax.swing.JSpinner(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Editar datos campaña"); setBounds(new java.awt.Rectangle(350, 100, 540, 690)); setResizable(false); lblCampania.setText("Nombre de la campaña: ");

Page 340: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

212

lblDescripcion.setText("Descripción:"); lblTipo.setText("Tipo de la campaña:"); lblFechaInicio.setText("Fecha inicio (dd/mm/yyyy):"); lblFechaFin.setText("Fecha fin (dd/mm/yyyy):"); txtCampania.setColumns(30); txtCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(180,3)); txtCampania.setEditable(false); txtCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtCampaniaActionPerformed(evt); } }); btnGuardar.setText("Guardar"); btnGuardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGuardarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt); } }); tarDescripcion.setColumns(30); tarDescripcion.setDocument(new com.jabluecatch.util.FormateadorDocumento(450,0)); tarDescripcion.setFont(new java.awt.Font("Tahoma", 0, 11)); tarDescripcion.setLineWrap(true); tarDescripcion.setRows(4); tarDescripcion.setWrapStyleWord(true); jScrollPane1.setViewportView(tarDescripcion); cmbTipo.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cmbTipoItemStateChanged(evt); } }); lblHoraInicio.setText("Hora (hh24 mi):"); lblHoraFin.setText("Hora (hh24 mi):"); lblDetalleAudio.setText("Archivos de audio a enviar:"); lblAudio1.setText("Archivo 1:"); txtAudio1.setColumns(30); txtAudio1.setEditable(false);

Page 341: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

213

btnAudio1.setText("Examinar"); btnAudio1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio1ActionPerformed(evt); } }); txtAudio2.setEditable(false); txtAudio3.setEditable(false); lblImagen1.setText("Archivo 1:"); lblAudio2.setText("Archivo 2:"); lblDetalleImagen.setText("Archivos de imagen a enviar:"); btnAudio2.setText("Examinar"); btnAudio2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio2ActionPerformed(evt); } }); lblAudio3.setText("Archivo 3:"); btnAudio3.setText("Examinar"); btnAudio3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAudio3ActionPerformed(evt); } }); txtImagen1.setColumns(30); txtImagen1.setEditable(false); btnImagen1.setText("Examinar"); btnImagen1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen1ActionPerformed(evt); } }); lblImagen2.setText("Archivo 2:"); btnImagen2.setText("Examinar"); btnImagen2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen2ActionPerformed(evt); } }); btnImagen3.setText("Examinar"); btnImagen3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnImagen3ActionPerformed(evt); } });

Page 342: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

214

txtImagen2.setEditable(false); txtImagen3.setEditable(false); lblImagen3.setText("Archivo 3:"); dtfFechaInicio.setColumns(10); dtfFechaInicio.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaInicioMouseReleased(evt); } }); dtfFechaFin.setColumns(10); dtfFechaFin.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaFinMouseReleased(evt); } }); dtfFechaFin.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { dtfFechaFinFocusLost(evt); } }); spiHoraInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"})); spiMinutoInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"})); spiHoraFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"})); spiMinutoFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"})); btnXAudio1.setText("X"); btnXAudio1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXAudio1ActionPerformed(evt); } }); btnXAudio2.setText("X"); btnXAudio2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {

Page 343: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

215

btnXAudio2ActionPerformed(evt); } }); btnXAudio3.setText("X"); btnXAudio3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXAudio3ActionPerformed(evt); } }); btnXImagen1.setText("X"); btnXImagen1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen1ActionPerformed(evt); } }); btnXImagen2.setText("X"); btnXImagen2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen2ActionPerformed(evt); } }); btnXImagen3.setText("X"); btnXImagen3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnXImagen3ActionPerformed(evt); } }); lblCostoRefMensaje.setText("Costo ref. por mensaje ($):"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblCostoRefMensaje) .addGap(18, 18, 18) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 320, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDetalleImagen) .addGroup(layout.createSequentialGroup()

Page 344: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

216

.addComponent(lblDetalleAudio) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 321, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblAudio1) .addComponent(lblAudio2) .addComponent(lblAudio3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtAudio2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) .addComponent(txtAudio1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) .addComponent(txtAudio3, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE))) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblImagen1) .addComponent(lblImagen2) .addComponent(lblImagen3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtImagen2, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) .addComponent(txtImagen1, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) .addComponent(txtImagen3, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(btnGuardar) .addGap(75, 75, 75) .addComponent(btnCancelar))))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnAudio2) .addComponent(btnAudio1) .addComponent(btnAudio3) .addComponent(btnImagen1) .addComponent(btnImagen2) .addComponent(btnImagen3)))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 345: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

217

.addComponent(btnXAudio1) .addComponent(btnXAudio2) .addComponent(btnXAudio3) .addComponent(btnXImagen1) .addComponent(btnXImagen2) .addComponent(btnXImagen3))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblFechaFin) .addComponent(lblFechaInicio) .addComponent(lblTipo) .addComponent(lblDescripcion) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtCampania, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lblHoraInicio) .addComponent(lblHoraFin)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))

Page 346: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

218

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE)) .addGap(77, 77, 77)))) .addGap(30, 30, 30)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDescripcion) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblTipo)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaInicio) .addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHoraInicio)) .addGap(9, 9, 9) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaFin) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHoraFin)) .addGap(18, 18, 18)

Page 347: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

219

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCostoRefMensaje) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) .addComponent(lblDetalleAudio) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblAudio1) .addComponent(txtAudio1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnAudio1) .addComponent(btnXAudio1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnAudio2) .addComponent(txtAudio2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio2) .addComponent(btnXAudio2)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnAudio3) .addComponent(txtAudio3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio3) .addComponent(btnXAudio3)) .addGap(33, 33, 33) .addComponent(lblDetalleImagen) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen1) .addComponent(txtImagen1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen1) .addComponent(btnXImagen1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen2) .addComponent(txtImagen2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen2) .addComponent(btnXImagen2)) .addGap(18, 18, 18)

Page 348: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

220

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImagen3) .addComponent(txtImagen3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen3) .addComponent(btnXImagen3)) .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnGuardar) .addComponent(btnCancelar)) .addGap(23, 23, 23)) ); pack(); }// </editor-fold> private void txtCampaniaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { this.dispose(); } private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) { int acepta = JOptionPane.showConfirmDialog(this, "Esta a punto de actualizar los datos de la campaña. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (acepta == 0) { //Validar nulos if (this.txtCampania.getText().trim().equals("")) { logger.info("El nombre de la campaña no puede ser nulo"); JOptionPane.showMessageDialog(this, "El nombre de la campaña no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.tarDescripcion.getText().trim().equals("")) { logger.info("La descripcion no puede ser nulo"); JOptionPane.showMessageDialog(this, "La descripcion no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.dtfFechaInicio.getText().trim().equals("")) { logger.info("La fecha de inicio no puede ser nula"); JOptionPane.showMessageDialog(this, "La fecha de inicio no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.dtfFechaFin.getText().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) { logger.info("La fecha de finalización no puede ser nula a menos que la campaña sea permanente"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser nula a menos que la campaña sea permanente", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.spiHoraFin.getValue().toString().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) {

Page 349: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

221

logger.info("La hora de finalización no puede ser nula"); JOptionPane.showMessageDialog(this, "La hora de finalización no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.spiMinutoFin.getValue().toString().trim().equals("") && this.cmbTipo.getSelectedIndex() == 0) { logger.info("El minuto de finalización no puede ser nula a menos que la campaña sea permanente"); JOptionPane.showMessageDialog(this, "El minuto de finalización no puede ser nula a menos que la campaña sea permanente", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.txtAudio1.getText().trim().equals("") && this.txtAudio2.getText().trim().equals("") && this.txtAudio3.getText().trim().equals("") && this.txtImagen1.getText().trim().equals("") && this.txtImagen2.getText().trim().equals("") && this.txtImagen3.getText().trim().equals("")) { logger.info("Debe configurar al menos un archivo para su envío"); JOptionPane.showMessageDialog(this, "Debe configurar al menos un archivo para su envío", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (this.cmbTipo.getSelectedIndex() != 0) { int confirma = JOptionPane.showConfirmDialog(this, "Ud ha escogido actualizar a una campaña permanente, de ser así, la fecha de finalización ingresada no será tomada en cuenta. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (confirma != 0) { return; } } //Convertir las fechas String sFechaInicio = this.dtfFechaInicio.getText() + " " + this.spiHoraInicio.getValue() + ":" + this.spiMinutoInicio.getValue() + ":00"; String sFechaFin = this.dtfFechaFin.getText() + " " + this.spiHoraFin.getValue() + ":" + this.spiMinutoFin.getValue() + ":00"; Date fechaInicio = null; Date fechaFin = null; try { fechaInicio = FormateadorFecha.aJavaDateTimeDate(sFechaInicio); if (this.cmbTipo.getSelectedIndex() == 0) { fechaFin = FormateadorFecha.aJavaDateTimeDate(sFechaFin); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (fechaInicio.before(Calendar.getInstance().getTime())) { logger.info("La fecha de inicio no puede ser menor a la fecha actual"); JOptionPane.showMessageDialog(this, "La fecha de inicio no puede ser menor a la fecha actual", "Información", JOptionPane.INFORMATION_MESSAGE); return; }

Page 350: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

222

if (this.cmbTipo.getSelectedIndex() == 0) { if (fechaFin.before(fechaInicio)) { logger.info("La fecha de finalización no puede ser menor a la fecha de inicio"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser menor a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (fechaFin.equals(fechaInicio)) { logger.info("La fecha de finalización no puede ser igual a la fecha de inicio"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser igual a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } //Revisar que los archivos existan Vector<DetalleCampania> detallesCampania = new Vector(); if (!this.txtAudio1.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio1.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio1 = new File(this.txtAudio1.getText().trim()); if (!this.filAudio1.exists()) { logger.info("El archivo de audio <" + this.filAudio1.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio1.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtAudio2.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio2.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio2 = new File(this.txtAudio2.getText().trim()); if (!this.filAudio2.exists()) { logger.info("El archivo de audio <" + this.filAudio2.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio2.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtAudio3.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtAudio3.getText().trim().replace("\\", "\\\\"), "A", "A")); this.filAudio3 = new File(this.txtAudio3.getText().trim()); if (!this.filAudio3.exists()) { logger.info("El archivo de audio <" + this.filAudio3.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de audio <" + this.filAudio3.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return;

Page 351: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

223

} } if (!this.txtImagen1.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtImagen1.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen1 = new File(this.txtImagen1.getText().trim()); if (!this.filImagen1.exists()) { logger.info("El archivo de imagen <" + this.filImagen1.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen1.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtImagen2.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtImagen2.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen2 = new File(this.txtImagen2.getText().trim()); if (!this.filImagen2.exists()) { logger.info("El archivo de imagen <" + this.filImagen2.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen2.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } if (!this.txtImagen3.getText().trim().equals("")) { detallesCampania.add(new DetalleCampania(this.txtImagen3.getText().trim().replace("\\", "\\\\"), "I", "A")); this.filImagen3 = new File(this.txtImagen3.getText().trim()); if (!this.filImagen3.exists()) { logger.info("El archivo de imagen <" + this.filImagen3.getName() + "> no existe en la tuta especificada"); JOptionPane.showMessageDialog(this, "El archivo de imagen <" + this.filImagen3.getName() + "> no existe en la tuta especificada", "Información", JOptionPane.INFORMATION_MESSAGE); return; } } String tipo = this.cmbTipo.getSelectedIndex() == 0 ? "O" : "P"; Campania nuevaCampania = new Campania(this.campania.getIdCampania(), this.txtCampania.getText().trim(), this.tarDescripcion.getText().trim(), tipo, (Float) this.spiCostoRefMensaje.getValue(), fechaInicio, this.cmbTipo.getSelectedIndex() == 0 ? fechaFin : null, "P", "A"); try { CampaniaBO.actualizar(nuevaCampania, detallesCampania); JOptionPane.showMessageDialog(this, "Los datos se han actualizado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE);

Page 352: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

224

this.padre.ejecutarConsulta(); this.setVisible(false); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } } } private boolean archivoExcedePesoMaximo(File fichero) { if ((fichero.length() / 1024) > this.PESO_MAXIMO_KB) { logger.info("El archivo <" + fichero.getName() + "> excede el peso máximo permitido (" + this.PESO_MAXIMO_KB + " KB)"); JOptionPane.showMessageDialog(this, "El archivo <" + fichero.getName() + "> excede el peso máximo permitido (" + this.PESO_MAXIMO_KB + " KB)", "Información", JOptionPane.INFORMATION_MESSAGE); return true; } return false; } private void btnAudio2ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtAudio2.setText(fichero.getAbsolutePath()); } } private void btnAudio3ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtAudio3.setText(fichero.getAbsolutePath()); } } private void btnAudio1ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoAudio.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoAudio.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtAudio1.setText(fichero.getAbsolutePath()); } } private void btnImagen1ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this);

Page 353: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

225

if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen1.setText(fichero.getAbsolutePath()); } } private void btnImagen2ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen2.setText(fichero.getAbsolutePath()); } } private void btnImagen3ActionPerformed(java.awt.event.ActionEvent evt) { int seleccion = this.selectorArchivoImagen.showOpenDialog(this); if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = this.selectorArchivoImagen.getSelectedFile(); if (this.archivoExcedePesoMaximo(fichero)) { return; } this.txtImagen3.setText(fichero.getAbsolutePath()); } } private void btnXAudio1ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio1.setText(""); } private void btnXAudio2ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio2.setText(""); } private void btnXAudio3ActionPerformed(java.awt.event.ActionEvent evt) { this.txtAudio3.setText(""); } private void btnXImagen1ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void btnXImagen2ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void btnXImagen3ActionPerformed(java.awt.event.ActionEvent evt) { this.txtImagen1.setText(""); } private void dtfFechaFinFocusLost(java.awt.event.FocusEvent evt) { }

Page 354: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

226

private void cmbTipoItemStateChanged(java.awt.event.ItemEvent evt) { if (this.cmbTipo.getSelectedIndex() != 0) { this.dtfFechaFin.setEnabled(false); this.spiHoraFin.setEnabled(false); this.spiMinutoFin.setEnabled(false); } else { this.dtfFechaFin.setEnabled(true); this.spiHoraFin.setEnabled(true); this.spiMinutoFin.setEnabled(true); } } private void dtfFechaInicioMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaInicio, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaInicio.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaInicio); } private void dtfFechaFinMouseReleased(java.awt.event.MouseEvent evt) { if (this.dtfFechaFin.isEnabled()) { DatePicker dp = new DatePicker(dtfFechaFin, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaFin.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaFin); } } private void cargaDatos(ConsultarCampanias padre, int idCampania) { this.padre = padre; //Carga campania try { this.campania = CampaniaBO.buscarPorPK(idCampania); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga detalles Vector<DetalleCampania> detalles = new Vector(); try { detalles = DetalleCampaniaBO.buscarPorIdCampania(idCampania); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de tipos this.cmbTipo.addItem("Operativa"); this.cmbTipo.addItem("Permanente"); //Carga datos de la campania this.txtCampania.setText(this.campania.getCampania()); this.tarDescripcion.setText(this.campania.getDescripcion());

Page 355: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

227

this.cmbTipo.setSelectedIndex((this.campania.getTipo().equals("O") ? 0 : 1)); this.dtfFechaInicio.setText(FormateadorFecha.aJavaDateString(this.campania.getFechaInicio())); this.spiHoraInicio.setValue(FormateadorFecha.aJavaHourString(this.campania.getFechaInicio())); this.spiMinutoInicio.setValue(FormateadorFecha.aJavaMinuteString(this.campania.getFechaInicio())); if (this.campania.getFechaFin() != null) { this.dtfFechaFin.setText(FormateadorFecha.aJavaDateString(this.campania.getFechaFin())); this.spiHoraFin.setValue(FormateadorFecha.aJavaHourString(this.campania.getFechaFin())); this.spiMinutoFin.setValue(FormateadorFecha.aJavaMinuteString(this.campania.getFechaFin())); } else { this.dtfFechaFin.setText(""); this.spiHoraFin.setValue("00"); this.spiMinutoFin.setValue("00"); } this.spiCostoRefMensaje.setValue(this.campania.getCostoRefMensaje()); //Carga cada uno de los detalles Vector<String> rutasAudio = new Vector(); Vector<String> rutasImagen = new Vector(); for (int i = 0; i < detalles.size(); i++) { if (detalles.get(i).getTipo().equals("A")) { rutasAudio.add(detalles.get(i).getRuta()); } else { rutasImagen.add(detalles.get(i).getRuta()); } } if (rutasAudio.size() > 0) { this.txtAudio1.setText(rutasAudio.get(0)); } if (rutasAudio.size() > 1) { this.txtAudio2.setText(rutasAudio.get(1)); } if (rutasAudio.size() > 2) { this.txtAudio3.setText(rutasAudio.get(2)); } if (rutasImagen.size() > 0) { this.txtImagen1.setText(rutasImagen.get(0)); } if (rutasImagen.size() > 1) { this.txtImagen1.setText(rutasImagen.get(1)); } if (rutasImagen.size() > 2) {

Page 356: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

228

this.txtImagen1.setText(rutasImagen.get(2)); } this.selectorArchivoAudio = new JFileChooser(); this.selectorArchivoAudio.setAcceptAllFileFilterUsed(false); this.selectorArchivoAudio.setFileFilter(new FileNameExtensionFilter("Audio: MP3 & WMA", "mp3", "wma")); this.selectorArchivoImagen = new JFileChooser(); this.selectorArchivoImagen.setAcceptAllFileFilterUsed(false); this.selectorArchivoImagen.setFileFilter(new FileNameExtensionFilter("Imágenes: JPG & GIF", "jpg", "gif")); } // Variables declaration - do not modify private javax.swing.JButton btnAudio1; private javax.swing.JButton btnAudio2; private javax.swing.JButton btnAudio3; private javax.swing.JButton btnCancelar; private javax.swing.JButton btnGuardar; private javax.swing.JButton btnImagen1; private javax.swing.JButton btnImagen2; private javax.swing.JButton btnImagen3; private javax.swing.JButton btnXAudio1; private javax.swing.JButton btnXAudio2; private javax.swing.JButton btnXAudio3; private javax.swing.JButton btnXImagen1; private javax.swing.JButton btnXImagen2; private javax.swing.JButton btnXImagen3; private javax.swing.JComboBox cmbTipo; private com.jabluecatch.util.DateTextField dtfFechaFin; private com.jabluecatch.util.DateTextField dtfFechaInicio; private javax.swing.JFileChooser jFileChooser1; private javax.swing.JFileChooser jFileChooser2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblAudio1; private javax.swing.JLabel lblAudio2; private javax.swing.JLabel lblAudio3; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblCostoRefMensaje; private javax.swing.JLabel lblDescripcion; private javax.swing.JLabel lblDetalleAudio; private javax.swing.JLabel lblDetalleImagen; private javax.swing.JLabel lblFechaFin; private javax.swing.JLabel lblFechaInicio; private javax.swing.JLabel lblHoraFin; private javax.swing.JLabel lblHoraInicio; private javax.swing.JLabel lblImagen1; private javax.swing.JLabel lblImagen2; private javax.swing.JLabel lblImagen3; private javax.swing.JLabel lblTipo; private javax.swing.JSpinner spiCostoRefMensaje; private javax.swing.JSpinner spiHoraFin; private javax.swing.JSpinner spiHoraInicio; private javax.swing.JSpinner spiMinutoFin; private javax.swing.JSpinner spiMinutoInicio; private javax.swing.JTextArea tarDescripcion; private javax.swing.JTextField txtAudio1; private javax.swing.JTextField txtAudio2; private javax.swing.JTextField txtAudio3;

Page 357: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

229

private javax.swing.JTextField txtCampania; private javax.swing.JTextField txtImagen1; private javax.swing.JTextField txtImagen2; private javax.swing.JTextField txtImagen3; // End of variables declaration private ConsultarCampanias padre; private Campania campania; private JFileChooser selectorArchivoAudio; private JFileChooser selectorArchivoImagen; private File filAudio1; private File filAudio2; private File filAudio3; private File filImagen1; private File filImagen2; private File filImagen3; private static Logger logger = Logger.getLogger(EditarDatosCampania.class); }

4.1.8.4 VerDatosCampania

package com.jabluecatch.gui.campania; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.DetalleCampaniaBO; import com.jabluecatch.entidades.Campania; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import java.util.Vector; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana para ver los datos de una campaña * @author Fausto Almeida */ public class VerDatosCampania extends javax.swing.JDialog { /** Creates new form CrearCampania */ public VerDatosCampania(JDialog padre, boolean modal, int idCampania) { super(padre, modal); initComponents(); cargaDatos(idCampania); } /** Creates new form CrearCampania */ public VerDatosCampania(JFrame padre, boolean modal, int idCampania) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(idCampania);

Page 358: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

230

} /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jFileChooser1 = new javax.swing.JFileChooser(); jFileChooser2 = new javax.swing.JFileChooser(); lblCampania = new javax.swing.JLabel(); lblDescripcion = new javax.swing.JLabel(); lblTipo = new javax.swing.JLabel(); lblFechaInicio = new javax.swing.JLabel(); lblFechaFin = new javax.swing.JLabel(); txtCampania = new javax.swing.JTextField(); btnAceptar = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); tarDescripcion = new javax.swing.JTextArea(); cmbTipo = new javax.swing.JComboBox(); lblHoraInicio = new javax.swing.JLabel(); lblHoraFin = new javax.swing.JLabel(); lblDetalleAudio = new javax.swing.JLabel(); lblAudio1 = new javax.swing.JLabel(); txtAudio1 = new javax.swing.JTextField(); txtAudio2 = new javax.swing.JTextField(); txtAudio3 = new javax.swing.JTextField(); lblImagen1 = new javax.swing.JLabel(); lblAudio2 = new javax.swing.JLabel(); lblDetalleImagen = new javax.swing.JLabel(); lblAudio3 = new javax.swing.JLabel(); txtImagen1 = new javax.swing.JTextField(); lblImagen2 = new javax.swing.JLabel(); txtImagen2 = new javax.swing.JTextField(); txtImagen3 = new javax.swing.JTextField(); lblImagen3 = new javax.swing.JLabel(); ftxFechaInicio = new javax.swing.JFormattedTextField(); ftxFechaFin = new javax.swing.JFormattedTextField(); spiHoraInicio = new javax.swing.JSpinner(); spiMinutoInicio = new javax.swing.JSpinner(); spiHoraFin = new javax.swing.JSpinner(); spiMinutoFin = new javax.swing.JSpinner(); spiCostoRefMensaje = new javax.swing.JSpinner(); lblCostoRefMensaje = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Ver datos campaña"); setBounds(new java.awt.Rectangle(350, 100, 500, 670)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setResizable(false); lblCampania.setText("Nombre de la campaña: "); lblDescripcion.setText("Descripción:");

Page 359: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

231

lblTipo.setText("Tipo de la campaña:"); lblFechaInicio.setText("Fecha inicio (dd/mm/yyyy):"); lblFechaFin.setText("Fecha fin (dd/mm/yyyy):"); txtCampania.setColumns(30); txtCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(180,3)); txtCampania.setEditable(false); txtCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtCampaniaActionPerformed(evt); } }); btnAceptar.setText("Aceptar"); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAceptarActionPerformed(evt); } }); jScrollPane1.setEnabled(false); tarDescripcion.setColumns(30); tarDescripcion.setDocument(new com.jabluecatch.util.FormateadorDocumento(450,0)); tarDescripcion.setEditable(false); tarDescripcion.setFont(new java.awt.Font("Tahoma", 0, 11)); tarDescripcion.setLineWrap(true); tarDescripcion.setRows(4); tarDescripcion.setWrapStyleWord(true); jScrollPane1.setViewportView(tarDescripcion); cmbTipo.setEnabled(false); lblHoraInicio.setText("Hora (hh24 mi):"); lblHoraFin.setText("Hora (hh24 mi):"); lblDetalleAudio.setText("Archivos de audio a enviar:"); lblAudio1.setText("Archivo 1:"); txtAudio1.setColumns(50); txtAudio1.setEditable(false); txtAudio2.setEditable(false); txtAudio3.setEditable(false); lblImagen1.setText("Archivo 1:"); lblAudio2.setText("Archivo 2:"); lblDetalleImagen.setText("Archivos de imagen a enviar:");

Page 360: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

232

lblAudio3.setText("Archivo 3:"); txtImagen1.setColumns(30); txtImagen1.setEditable(false); lblImagen2.setText("Archivo 2:"); txtImagen2.setEditable(false); txtImagen3.setEditable(false); lblImagen3.setText("Archivo 3:"); ftxFechaInicio.setColumns(10); ftxFechaInicio.setEditable(false); ftxFechaInicio.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.DateFormatter(java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM)))); ftxFechaFin.setColumns(10); ftxFechaFin.setEditable(false); ftxFechaFin.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.DateFormatter(java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM)))); spiHoraInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"})); spiHoraInicio.setEnabled(false); spiMinutoInicio.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"})); spiMinutoInicio.setEnabled(false); spiHoraFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"})); spiHoraFin.setEnabled(false); spiMinutoFin.setModel(new javax.swing.SpinnerListModel(new String[] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"})); spiMinutoFin.setEnabled(false); spiCostoRefMensaje.setEnabled(false); lblCostoRefMensaje.setText("Costo ref. por mensaje ($):");

Page 361: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

233

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(210, 210, 210) .addComponent(btnAceptar) .addContainerGap(219, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblCostoRefMensaje) .addGap(18, 18, 18) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblFechaFin) .addComponent(lblFechaInicio) .addComponent(lblTipo) .addComponent(lblDescripcion) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(ftxFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(ftxFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lblHoraInicio) .addComponent(lblHoraFin)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup()

Page 362: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

234

.addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addComponent(txtCampania)) .addContainerGap(37, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDetalleImagen) .addGroup(layout.createSequentialGroup() .addComponent(lblDetalleAudio) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 301, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblAudio1) .addComponent(lblAudio2) .addComponent(lblAudio3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtAudio2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) .addComponent(txtAudio3, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) .addComponent(txtAudio1, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE))) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblImagen1) .addComponent(lblImagen2) .addComponent(lblImagen3)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

Page 363: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

235

.addComponent(txtImagen2, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) .addComponent(txtImagen1, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) .addComponent(txtImagen3, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE))))) .addGap(37, 37, 37))))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(26, 26, 26) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblCampania)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblDescripcion) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblTipo)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaInicio) .addComponent(spiHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(ftxFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHoraInicio)) .addGap(9, 9, 9) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaFin) .addComponent(ftxFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiHoraFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spiMinutoFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

Page 364: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

236

.addComponent(lblHoraFin)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCostoRefMensaje) .addComponent(spiCostoRefMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(21, 21, 21) .addComponent(lblDetalleAudio) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblAudio1) .addComponent(txtAudio1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtAudio2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio2)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtAudio3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblAudio3)) .addGap(33, 33, 33) .addComponent(lblDetalleImagen) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtImagen1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtImagen2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen2)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtImagen3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblImagen3)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) .addComponent(btnAceptar)

Page 365: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

237

.addContainerGap()) ); pack(); }// </editor-fold> private void txtCampaniaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void cargaDatos(int idCampania) { //Carga campania try { this.campania = CampaniaBO.buscarPorPK(idCampania); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga detalles Vector<DetalleCampania> detalles = new Vector(); try { detalles = DetalleCampaniaBO.buscarPorIdCampania(idCampania); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.setVisible(false); return; } //Carga combo de tipos this.cmbTipo.addItem("Operativa"); this.cmbTipo.addItem("Permanente"); //Carga datos de la campania this.txtCampania.setText(this.campania.getCampania()); this.tarDescripcion.setText(this.campania.getDescripcion()); this.cmbTipo.setSelectedIndex((this.campania.getTipo().equals("O") ? 0 : 1)); this.ftxFechaInicio.setText(FormateadorFecha.aJavaDateString(this.campania.getFechaInicio())); this.spiHoraInicio.setValue(FormateadorFecha.aJavaHourString(this.campania.getFechaInicio())); this.spiMinutoInicio.setValue(FormateadorFecha.aJavaMinuteString(this.campania.getFechaInicio())); if (this.campania.getFechaFin() != null) { this.ftxFechaFin.setText(FormateadorFecha.aJavaDateString(this.campania.getFechaFin()));

Page 366: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

238

this.spiHoraFin.setValue(FormateadorFecha.aJavaHourString(this.campania.getFechaFin())); this.spiMinutoFin.setValue(FormateadorFecha.aJavaMinuteString(this.campania.getFechaFin())); } else { this.ftxFechaFin.setText(""); this.spiHoraFin.setValue("00"); this.spiMinutoFin.setValue("00"); } this.spiCostoRefMensaje.setValue(this.campania.getCostoRefMensaje()); Vector<String> rutasAudio = new Vector(); Vector<String> rutasImagen = new Vector(); for (int i = 0; i < detalles.size(); i++) { if (detalles.get(i).getTipo().equals("A")) { rutasAudio.add(detalles.get(i).getRuta()); } else { rutasImagen.add(detalles.get(i).getRuta()); } } if (rutasAudio.size() > 0) { this.txtAudio1.setText(rutasAudio.get(0)); } if (rutasAudio.size() > 1) { this.txtAudio2.setText(rutasAudio.get(1)); } if (rutasAudio.size() > 2) { this.txtAudio3.setText(rutasAudio.get(2)); } if (rutasImagen.size() > 0) { this.txtImagen1.setText(rutasImagen.get(0)); } if (rutasImagen.size() > 1) { this.txtImagen1.setText(rutasImagen.get(1)); } if (rutasImagen.size() > 2) { this.txtImagen1.setText(rutasImagen.get(2)); } } // Variables declaration - do not modify private javax.swing.JButton btnAceptar; private javax.swing.JComboBox cmbTipo; private javax.swing.JFormattedTextField ftxFechaFin; private javax.swing.JFormattedTextField ftxFechaInicio; private javax.swing.JFileChooser jFileChooser1; private javax.swing.JFileChooser jFileChooser2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblAudio1; private javax.swing.JLabel lblAudio2; private javax.swing.JLabel lblAudio3; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblCostoRefMensaje; private javax.swing.JLabel lblDescripcion;

Page 367: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

239

private javax.swing.JLabel lblDetalleAudio; private javax.swing.JLabel lblDetalleImagen; private javax.swing.JLabel lblFechaFin; private javax.swing.JLabel lblFechaInicio; private javax.swing.JLabel lblHoraFin; private javax.swing.JLabel lblHoraInicio; private javax.swing.JLabel lblImagen1; private javax.swing.JLabel lblImagen2; private javax.swing.JLabel lblImagen3; private javax.swing.JLabel lblTipo; private javax.swing.JSpinner spiCostoRefMensaje; private javax.swing.JSpinner spiHoraFin; private javax.swing.JSpinner spiHoraInicio; private javax.swing.JSpinner spiMinutoFin; private javax.swing.JSpinner spiMinutoInicio; private javax.swing.JTextArea tarDescripcion; private javax.swing.JTextField txtAudio1; private javax.swing.JTextField txtAudio2; private javax.swing.JTextField txtAudio3; private javax.swing.JTextField txtCampania; private javax.swing.JTextField txtImagen1; private javax.swing.JTextField txtImagen2; private javax.swing.JTextField txtImagen3; // End of variables declaration private Campania campania; private static Logger logger = Logger.getLogger(VerDatosCampania.class); }

4.1.9 Paquete com.jabluecatch.gui.reportes

4.1.9.1 CampaniaParametrizable

package com.jabluecatch.gui.reportes; import com.jabluecatch.dto.ConsultaCampanias; /** * Interface necesaria para reutilizar la lista de valores (LOV) de campañas. * @author Fausto Almeida */ public interface CampaniaParametrizable { public void setCampania(ConsultaCampanias campania); }

4.1.9.2 LOVCampanias

Page 368: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

240

package com.jabluecatch.gui.reportes; import com.jabluecatch.bo.ConsultaCampaniasBO; import com.jabluecatch.dto.ConsultaCampanias; import com.mydatepicker.main.DatePicker; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.ModeloTablaCampanias; import java.util.Date; import java.util.Locale; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de lista de valores (LOV) de selección * de campañas * @author Fas */ public class LOVCampanias extends javax.swing.JDialog { /** Creates new form ConsultarCampanias */ public LOVCampanias(JFrame padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(padre); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblCampania = new javax.swing.JLabel(); lblFechaReferencial = new javax.swing.JLabel(); txtCampania = new javax.swing.JTextField(); btnConsultar = new javax.swing.JButton(); btnCerrar = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jScrollPane1 = new javax.swing.JScrollPane(); tabConsultaCampanias = new javax.swing.JTable(); dtfFechaReferencial = new com.jabluecatch.util.DateTextField(); btnSeleccionar = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Lista de campañas"); setBounds(new java.awt.Rectangle(175, 225, 720, 440)); setResizable(false); lblCampania.setText("Nombre Campaña:");

Page 369: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

241

lblFechaReferencial.setText("Fecha Referencial:"); txtCampania.setColumns(20); txtCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(60,3)); txtCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtCampaniaActionPerformed(evt); } }); btnConsultar.setText("Consultar"); btnConsultar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnConsultarActionPerformed(evt); } }); btnCerrar.setText("Cerrar"); btnCerrar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCerrarActionPerformed(evt); } }); tabConsultaCampanias.setModel(new com.jabluecatch.util.ModeloTablaCampanias()); tabConsultaCampanias.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane1.setViewportView(tabConsultaCampanias); dtfFechaReferencial.setColumns(10); dtfFechaReferencial.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaReferencialMouseReleased(evt); } }); btnSeleccionar.setText("Seleccionar"); btnSeleccionar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnSeleccionarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGap(163, 163, 163) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblCampania)

Page 370: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

242

.addComponent(lblFechaReferencial)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaReferencial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(35, 35, 35) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnConsultar) .addComponent(btnCerrar)) .addContainerGap(163, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnSeleccionar) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 682, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(20, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCampania) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnConsultar)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaReferencial) .addComponent(dtfFechaReferencial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnCerrar)) .addGap(18, 18, 18) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 268, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(btnSeleccionar) .addContainerGap(12, Short.MAX_VALUE)) );

Page 371: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

243

pack(); }// </editor-fold> private void txtCampaniaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) { Vector campanias = null; try { if (!this.txtCampania.getText().trim().equals("") && this.dtfFechaReferencial.getText().trim().equals("")) { //Solo por campania logger.info("Ejecuta consulta solo por usuario"); campanias = ConsultaCampaniasBO.buscarPorPatronCampania(this.txtCampania.getText().trim()); } else if (this.txtCampania.getText().trim().equals("") && !this.dtfFechaReferencial.getText().trim().equals("")) { //Solo por fecha referencial logger.info("Ejecuta consulta solo por nombre"); campanias = ConsultaCampaniasBO.buscarPorFechaReferencial(this.dtfFechaReferencial.getText().trim()); } else { //Por ambos logger.info("Ejecuta consulta por usuario y nombre"); campanias = ConsultaCampaniasBO.buscarPorPatronCampaniaYFechaReferencial(this.txtCampania.getText().trim(), this.dtfFechaReferencial.getText().trim()); } } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); return; } this.resultadoConsulta = campanias; this.tabConsultaCampanias.setModel(new ModeloTablaCampanias(campanias)); this.seteaAnchoColumnas(); } public void ejecutarConsulta() { this.btnConsultar.doClick(); } private void btnSeleccionarActionPerformed(java.awt.event.ActionEvent evt) { if (this.tabConsultaCampanias.getSelectedRow() >= 0) {

Page 372: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

244

CampaniaParametrizable cs = (CampaniaParametrizable) this.padre; cs.setCampania(((ConsultaCampanias) this.resultadoConsulta.get(this.tabConsultaCampanias.getSelectedRow()))); this.dispose(); } } private void dtfFechaReferencialMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaReferencial, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaReferencial.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaReferencial); } private void seteaAnchoColumnas() { this.tabConsultaCampanias.getColumn("Id").setPreferredWidth(72); this.tabConsultaCampanias.getColumn("Campaña").setPreferredWidth(300); this.tabConsultaCampanias.getColumn("Tipo").setPreferredWidth(100); this.tabConsultaCampanias.getColumn("Fecha de inicio").setPreferredWidth(160); this.tabConsultaCampanias.getColumn("Fecha de finalización").setPreferredWidth(160); this.tabConsultaCampanias.getColumn("Fase").setPreferredWidth(80); } private void cargaDatos(JFrame padre) { this.padre = padre; this.seteaAnchoColumnas(); this.btnConsultar.doClick(); } // Variables declaration - do not modify private javax.swing.JButton btnCerrar; private javax.swing.JButton btnConsultar; private javax.swing.JButton btnSeleccionar; private com.jabluecatch.util.DateTextField dtfFechaReferencial; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblFechaReferencial; private javax.swing.JTable tabConsultaCampanias; private javax.swing.JTextField txtCampania; // End of variables declaration private JFrame padre; private Vector resultadoConsulta; private static Logger logger = Logger.getLogger(LOVCampanias.class); }

4.1.9.3 ReporteBitacoraCampania

package com.jabluecatch.gui.reportes; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.GestorReportesBO; import com.jabluecatch.dto.ConsultaCampanias; import com.jabluecatch.entidades.Campania;

Page 373: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

245

import com.jabluecatch.util.ErrorAplicativo; import java.util.HashMap; import java.util.Map; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de ejecución del reporte de bitácora de * campaña * @author Fas */ public class ReporteBitacoraCampania extends javax.swing.JFrame implements CampaniaParametrizable { /** Creates new form ReporteUsuarios */ public ReporteBitacoraCampania() { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { btnGenerarReporte = new javax.swing.JButton(); lblIdCampania = new javax.swing.JLabel(); txtIdCampania = new javax.swing.JTextField(); btnLOVCampania = new javax.swing.JButton(); txtCampania = new javax.swing.JTextField(); lblCampania = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Reporte de Bitácora de Campaña"); setBounds(new java.awt.Rectangle(350, 100, 370, 150)); btnGenerarReporte.setText("Generar Reporte"); btnGenerarReporte.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerarReporteActionPerformed(evt); } }); lblIdCampania.setText("Id campaña:"); txtIdCampania.setColumns(20); txtIdCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(5,1)); txtIdCampania.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) {

Page 374: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

246

txtIdCampaniaPropertyChange(evt); } }); txtIdCampania.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { txtIdCampaniaKeyReleased(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { txtIdCampaniaKeyTyped(evt); } }); btnLOVCampania.setText("..."); btnLOVCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnLOVCampaniaActionPerformed(evt); } }); txtCampania.setEditable(false); lblCampania.setText("Campaña:"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(51, 51, 51) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblIdCampania) .addComponent(lblCampania)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnGenerarReporte) .addGroup(layout.createSequentialGroup() .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(btnLOVCampania)) .addComponent(txtIdCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(56, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblIdCampania)

Page 375: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

247

.addComponent(txtIdCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnLOVCampania) .addComponent(lblCampania)) .addGap(33, 33, 33) .addComponent(btnGenerarReporte) .addContainerGap(23, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void btnGenerarReporteActionPerformed(java.awt.event.ActionEvent evt) { if (this.txtIdCampania.getText().trim().equals("")) { logger.info("El id de la campaña no puede ser nulo"); JOptionPane.showMessageDialog(this, "El id de la campaña no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } Campania c = null; try { c = CampaniaBO.buscarPorPK(Integer.parseInt(this.txtIdCampania.getText())); } catch (ErrorAplicativo ea) { ea.printStackTrace(); } if (c == null) { JOptionPane.showMessageDialog(this, "La campaña ingresada no existe.", "Información", JOptionPane.INFORMATION_MESSAGE); return; } Map parametros = new HashMap(); parametros.put("P_ID_CAMPANIA", Integer.parseInt(this.txtIdCampania.getText())); try { logger.info("Inicio de ejecución Reporte de Bitácora de Camapaña"); this.gestorReportes.mostrarReporte("ReporteBitacoraCampania", true, parametros); logger.info("Fin de ejecución Reporte de Bitácora de Camapaña"); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } } private void btnLOVCampaniaActionPerformed(java.awt.event.ActionEvent evt) {

Page 376: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

248

new LOVCampanias(this, true).setVisible(true); } private void txtIdCampaniaKeyReleased(java.awt.event.KeyEvent evt) { if (this.txtIdCampania.getText().equals("")) { return; } Campania c = null; try { c = CampaniaBO.buscarPorPK(Integer.parseInt(this.txtIdCampania.getText())); } catch (ErrorAplicativo ea) { ea.printStackTrace(); } if (c != null) { this.txtIdCampania.setText(String.valueOf(c.getIdCampania())); this.txtCampania.setText(c.getCampania()); } else { this.txtCampania.setText(""); } } private void txtIdCampaniaKeyTyped(java.awt.event.KeyEvent evt) { } private void txtIdCampaniaPropertyChange(java.beans.PropertyChangeEvent evt) { } public void setCampania(ConsultaCampanias campania) { this.campania = campania; this.txtIdCampania.setText(String.valueOf(this.campania.getIdCampania())); this.txtCampania.setText(this.campania.getCampania()); } private void cargaDatos() { //Carga Gestor de Reportes this.gestorReportes = new GestorReportesBO(); } // Variables declaration - do not modify private javax.swing.JButton btnGenerarReporte; private javax.swing.JButton btnLOVCampania; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblIdCampania; private javax.swing.JTextField txtCampania; private javax.swing.JTextField txtIdCampania; // End of variables declaration private ConsultaCampanias campania; private GestorReportesBO gestorReportes; private static Logger logger = Logger.getLogger(ReporteBitacoraCampania.class); }

4.1.9.4 ReporteCostosCampanias

package com.jabluecatch.gui.reportes;

Page 377: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

249

import com.jabluecatch.bo.GestorReportesBO; import com.mydatepicker.main.DatePicker; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de ejecución del reporte de costos de * campañas * @author Fas */ public class ReporteCostosCampanias extends javax.swing.JFrame { /** Creates new form ReporteUsuarios */ public ReporteCostosCampanias() { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { btnGenerarReporte = new javax.swing.JButton(); lblFechaInicio = new javax.swing.JLabel(); dtfFechaInicio = new com.jabluecatch.util.DateTextField(); lblFechaFin = new javax.swing.JLabel(); dtfFechaFin = new com.jabluecatch.util.DateTextField(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Reporte de Costos de Campaña"); setBounds(new java.awt.Rectangle(350, 100, 370, 150)); btnGenerarReporte.setText("Generar Reporte"); btnGenerarReporte.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerarReporteActionPerformed(evt); } }); lblFechaInicio.setText("Fecha inicio (dd/mm/yyyy):"); dtfFechaInicio.setColumns(10);

Page 378: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

250

dtfFechaInicio.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaInicioMouseReleased(evt); } }); lblFechaFin.setText("Fecha fin (dd/mm/yyyy):"); dtfFechaFin.setColumns(10); dtfFechaFin.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { dtfFechaFinMouseReleased(evt); } }); dtfFechaFin.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { dtfFechaFinFocusLost(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(121, 121, 121) .addComponent(btnGenerarReporte)) .addGroup(layout.createSequentialGroup() .addGap(64, 64, 64) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblFechaFin) .addComponent(lblFechaInicio)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap(72, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaInicio) .addComponent(dtfFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

Page 379: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

251

.addGap(9, 9, 9) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblFechaFin) .addComponent(dtfFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(26, 26, 26) .addComponent(btnGenerarReporte) .addContainerGap(23, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void btnGenerarReporteActionPerformed(java.awt.event.ActionEvent evt) { if (this.dtfFechaInicio.getText().trim().equals("")) { logger.info("La fecha de inicio no puede ser nula"); JOptionPane.showMessageDialog(this, "La fecha de inicio no puede ser nula", "Información", JOptionPane.INFORMATION_MESSAGE); return; } else if (this.dtfFechaFin.getText().trim().equals("")) { this.dtfFechaFin.setText(FormateadorFecha.aJavaDateString(Calendar.getInstance().getTime())); } //Convertir las fechas String sFechaInicio = this.dtfFechaInicio.getText() + " 00:00:00"; String sFechaFin = this.dtfFechaFin.getText() + " 23:59:59"; Date dFechaInicio = null; Date dFechaFin = null; try { dFechaInicio = FormateadorFecha.aJavaDateTimeDate(sFechaInicio); dFechaFin = FormateadorFecha.aJavaDateTimeDate(sFechaFin); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (dFechaFin.before(dFechaInicio)) { logger.info("La fecha de finalización no puede ser menor a la fecha de inicio"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser menor a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; } if (dFechaFin.equals(dFechaInicio)) { logger.info("La fecha de finalización no puede ser igual a la fecha de inicio"); JOptionPane.showMessageDialog(this, "La fecha de finalización no puede ser igual a la fecha de inicio", "Información", JOptionPane.INFORMATION_MESSAGE); return; }

Page 380: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

252

Timestamp fechaInicio = new Timestamp(dFechaInicio.getTime()); Timestamp fechaFin = new Timestamp(dFechaFin.getTime()); Map parametros = new HashMap(); parametros.put("P_FECHA_INICIO", fechaInicio); parametros.put("P_FECHA_FIN", fechaFin); try { logger.info("Inicio de ejecución Reporte de Costos de Camapañas"); this.gestorReportes.mostrarReporte("ReporteCostosCampanias", true, parametros); logger.info("Fin de ejecución Reporte de Costos de Camapañas"); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } } private void dtfFechaFinFocusLost(java.awt.event.FocusEvent evt) { } private void dtfFechaInicioMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaInicio, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaInicio.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaInicio); } private void dtfFechaFinMouseReleased(java.awt.event.MouseEvent evt) { DatePicker dp = new DatePicker(dtfFechaFin, new Locale("ES")); Date fechaSeleccionada = dp.parseDate(dtfFechaFin.getText()); dp.setSelectedDate(fechaSeleccionada); dp.start(dtfFechaFin); } private void cargaDatos() { //Carga Gestor de Reportes this.gestorReportes = new GestorReportesBO(); this.dtfFechaInicio.setText("01/01/2010"); this.dtfFechaFin.setText(FormateadorFecha.aJavaDateString(Calendar.getInstance().getTime())); } // Variables declaration - do not modify private javax.swing.JButton btnGenerarReporte; private com.jabluecatch.util.DateTextField dtfFechaFin; private com.jabluecatch.util.DateTextField dtfFechaInicio; private javax.swing.JLabel lblFechaFin; private javax.swing.JLabel lblFechaInicio; // End of variables declaration private GestorReportesBO gestorReportes; private static Logger logger = Logger.getLogger(ReporteCostosCampanias.class); }

4.1.9.5 ReporteImpactoCampania

Page 381: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

253

package com.jabluecatch.gui.reportes; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.GestorReportesBO; import com.jabluecatch.dto.ConsultaCampanias; import com.jabluecatch.entidades.Campania; import com.jabluecatch.util.ErrorAplicativo; import java.util.HashMap; import java.util.Map; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de ejecución del reporte de impacto de * campaña * @author Fas */ public class ReporteImpactoCampania extends javax.swing.JFrame implements CampaniaParametrizable { /** Creates new form ReporteUsuarios */ public ReporteImpactoCampania() { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { btnGenerarReporte = new javax.swing.JButton(); lblIdCampania = new javax.swing.JLabel(); txtIdCampania = new javax.swing.JTextField(); btnLOVCampania = new javax.swing.JButton(); txtCampania = new javax.swing.JTextField(); lblCampania = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Reporte de Impacto de Campaña"); setBounds(new java.awt.Rectangle(350, 100, 370, 150)); btnGenerarReporte.setText("Generar Reporte"); btnGenerarReporte.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerarReporteActionPerformed(evt); } }); lblIdCampania.setText("Id campaña:");

Page 382: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

254

txtIdCampania.setColumns(20); txtIdCampania.setDocument(new com.jabluecatch.util.FormateadorDocumento(5,1)); txtIdCampania.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { txtIdCampaniaPropertyChange(evt); } }); txtIdCampania.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { txtIdCampaniaKeyReleased(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { txtIdCampaniaKeyTyped(evt); } }); btnLOVCampania.setText("..."); btnLOVCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnLOVCampaniaActionPerformed(evt); } }); txtCampania.setEditable(false); lblCampania.setText("Campaña:"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(51, 51, 51) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblIdCampania) .addComponent(lblCampania)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnGenerarReporte) .addGroup(layout.createSequentialGroup() .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(btnLOVCampania)) .addComponent(txtIdCampania, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(56, Short.MAX_VALUE)) ); layout.setVerticalGroup(

Page 383: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

255

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblIdCampania) .addComponent(txtIdCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampania, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnLOVCampania) .addComponent(lblCampania)) .addGap(33, 33, 33) .addComponent(btnGenerarReporte) .addContainerGap(23, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void btnGenerarReporteActionPerformed(java.awt.event.ActionEvent evt) { if (this.txtIdCampania.getText().trim().equals("")) { logger.info("El id de la campaña no puede ser nulo"); JOptionPane.showMessageDialog(this, "El id de la campaña no puede ser nulo", "Información", JOptionPane.INFORMATION_MESSAGE); return; } Campania c = null; try { c = CampaniaBO.buscarPorPK(Integer.parseInt(this.txtIdCampania.getText())); } catch (ErrorAplicativo ea) { ea.printStackTrace(); } if (c == null) { JOptionPane.showMessageDialog(this, "La campaña ingresada no existe.", "Información", JOptionPane.INFORMATION_MESSAGE); return; } Map parametros = new HashMap(); parametros.put("P_ID_CAMPANIA", Integer.parseInt(this.txtIdCampania.getText())); try { logger.info("Inicio de ejecución Reporte de Impacto de Camapaña"); this.gestorReportes.mostrarReporte("ReporteImpactoCampania", true, parametros); logger.info("Fin de ejecución Reporte de Impacto de Camapaña"); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico());

Page 384: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

256

JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } } private void btnLOVCampaniaActionPerformed(java.awt.event.ActionEvent evt) { new LOVCampanias(this, true).setVisible(true); } private void txtIdCampaniaKeyReleased(java.awt.event.KeyEvent evt) { if (this.txtIdCampania.getText().equals("")) { return; } Campania c = null; try { c = CampaniaBO.buscarPorPK(Integer.parseInt(this.txtIdCampania.getText())); } catch (ErrorAplicativo ea) { ea.printStackTrace(); } if (c != null) { this.txtIdCampania.setText(String.valueOf(c.getIdCampania())); this.txtCampania.setText(c.getCampania()); } else { this.txtCampania.setText(""); } } private void txtIdCampaniaKeyTyped(java.awt.event.KeyEvent evt) { } private void txtIdCampaniaPropertyChange(java.beans.PropertyChangeEvent evt) { } public void setCampania(ConsultaCampanias campania) { this.campania = campania; this.txtIdCampania.setText(String.valueOf(this.campania.getIdCampania())); this.txtCampania.setText(this.campania.getCampania()); } private void cargaDatos() { //Carga Gestor de Reportes this.gestorReportes = new GestorReportesBO(); } // Variables declaration - do not modify private javax.swing.JButton btnGenerarReporte; private javax.swing.JButton btnLOVCampania; private javax.swing.JLabel lblCampania; private javax.swing.JLabel lblIdCampania; private javax.swing.JTextField txtCampania; private javax.swing.JTextField txtIdCampania; // End of variables declaration private ConsultaCampanias campania; private GestorReportesBO gestorReportes; private static Logger logger = Logger.getLogger(ReporteImpactoCampania.class); }

Page 385: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

257

4.1.9.6 ReporteUsuarios

package com.jabluecatch.gui.reportes; import com.jabluecatch.bo.GestorReportesBO; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import java.util.Calendar; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de ejecución del reporte de usuarios del * sistema * @author Fausto Almeida */ public class ReporteUsuarios extends javax.swing.JDialog { /** Creates new form ReporteUsuarios */ public ReporteUsuarios() { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { btnGenerarReporte = new javax.swing.JButton(); lblReporteHasta = new javax.swing.JLabel(); lblHasta = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Reporte de Usuarios"); setBounds(new java.awt.Rectangle(350, 100, 355, 155)); btnGenerarReporte.setText("Generar Reporte"); btnGenerarReporte.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerarReporteActionPerformed(evt); } }); lblReporteHasta.setText("Reporte de usuarios hasta:"); lblHasta.setText("l");

Page 386: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

258

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(29, 29, 29) .addComponent(lblReporteHasta) .addGap(18, 18, 18) .addComponent(lblHasta) .addContainerGap(175, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(123, Short.MAX_VALUE) .addComponent(btnGenerarReporte) .addGap(119, 119, 119)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblReporteHasta) .addComponent(lblHasta)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 46, Short.MAX_VALUE) .addComponent(btnGenerarReporte) .addGap(27, 27, 27)) ); pack(); }// </editor-fold> private void btnGenerarReporteActionPerformed(java.awt.event.ActionEvent evt) { try { logger.info("Inicio de ejecución Reporte de Usuarios"); this.gestorReportes.mostrarReporte("ReporteUsuarios", true, null); logger.info("Fin de ejecución Reporte de Usuarios"); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } } private void cargaDatos() { //Carga Gestor de Reportes this.gestorReportes = new GestorReportesBO(); this.lblHasta.setText(FormateadorFecha.aJavaDateString(Calendar.getInstance().getTime())); } // Variables declaration - do not modify private javax.swing.JButton btnGenerarReporte; private javax.swing.JLabel lblHasta;

Page 387: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

259

private javax.swing.JLabel lblReporteHasta; // End of variables declaration private GestorReportesBO gestorReportes; private static Logger logger = Logger.getLogger(ReporteUsuarios.class); }

4.1.10 Paquete com.jabluecatch.gui

4.1.10.1 AcercaDe

package com.jabluecatch.gui; import javax.swing.JFrame; /** * Clase que representa la ventana de Acerca de * @author Fausto Almeida */ public class AcercaDe extends javax.swing.JDialog { /** Creates new form AcercaDe */ public AcercaDe(JFrame padre, boolean modal) { super(padre, modal); initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); jLabel9 = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel(); btnAceptar = new javax.swing.JButton();

Page 388: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

260

setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("BlueCatch v0.1 - Acerca de"); setBounds(new java.awt.Rectangle(390, 390, 400, 320)); setResizable(false); jLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); jLabel1.setText("BlueCatch v0.1"); jLabel2.setFont(new java.awt.Font("Tahoma", 0, 12)); jLabel2.setText("Prototipo de Sistema de Envío de Publicidad Vía Bluetooth"); jLabel3.setFont(new java.awt.Font("Tahoma", 0, 12)); jLabel3.setText("Proyecto de Curso de Graduación"); jLabel4.setText("Institución:"); jLabel5.setText("Desarrollado por:"); jLabel6.setText("Profesor Guía:"); jLabel7.setText("Fecha:"); jLabel8.setText("Fausto S. Almeida Campos"); jLabel9.setText("Universidad de Guayaquil - CISC"); jLabel10.setText("Ing. David Benavides"); jLabel11.setText("Marzo 2011"); btnAceptar.setText("Aceptar"); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAceptarActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel2) .addComponent(jLabel1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel5)

Page 389: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

261

.addComponent(jLabel4) .addComponent(jLabel6) .addComponent(jLabel7)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel11) .addComponent(jLabel10) .addComponent(jLabel9) .addComponent(jLabel8))))) .addGroup(layout.createSequentialGroup() .addGap(152, 152, 152) .addComponent(btnAceptar))) .addContainerGap(44, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(27, 27, 27) .addComponent(jLabel1) .addGap(18, 18, 18) .addComponent(jLabel2) .addGap(18, 18, 18) .addComponent(jLabel3) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(jLabel9)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(jLabel8)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(jLabel10)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(jLabel11)) .addGap(26, 26, 26) .addComponent(btnAceptar) .addContainerGap(28, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { this.setVisible(false); } // Variables declaration - do not modify private javax.swing.JButton btnAceptar; private javax.swing.JLabel jLabel1;

Page 390: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

262

private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; // End of variables declaration }

4.1.10.2 Login

package com.jabluecatch.gui; import com.jabluecatch.bo.UsuarioBO; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de login * @author Fas */ public class Login extends javax.swing.JFrame { /** Creates new form Login */ public Login() { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { lblUsuario = new javax.swing.JLabel(); lblClave = new javax.swing.JLabel(); txtUsuario = new javax.swing.JTextField(); btnAceptar = new javax.swing.JButton(); btnCancelar = new javax.swing.JButton(); txtClave = new javax.swing.JPasswordField(); lblLogo = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

Page 391: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

263

setTitle("BlueCatch v0.1 - Login"); setBounds(new java.awt.Rectangle(300, 300, 320, 150)); setResizable(false); lblUsuario.setText("Usuario:"); lblClave.setText("Clave:"); txtUsuario.setColumns(12); txtUsuario.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,2)); txtUsuario.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsuarioActionPerformed(evt); } }); btnAceptar.setText("Aceptar"); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnAceptarActionPerformed(evt); } }); btnCancelar.setText("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCancelarActionPerformed(evt); } }); txtClave.setColumns(12); txtClave.setDocument(new com.jabluecatch.util.FormateadorDocumento(15,0)); txtClave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtClaveActionPerformed(evt); } }); lblLogo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/login.png"))); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(28, 28, 28) .addComponent(lblLogo) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblClave) .addComponent(lblUsuario)) .addGap(18, 18, 18)

Page 392: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

264

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(37, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(79, Short.MAX_VALUE) .addComponent(btnAceptar) .addGap(18, 18, 18) .addComponent(btnCancelar) .addGap(64, 64, 64)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(33, 33, 33) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblUsuario) .addComponent(txtUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(8, 8, 8) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblClave) .addComponent(txtClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() .addGap(25, 25, 25) .addComponent(lblLogo))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnCancelar) .addComponent(btnAceptar)) .addContainerGap(25, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void txtUsuarioActionPerformed(java.awt.event.ActionEvent evt) { btnAceptar.doClick(); } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); }

Page 393: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

265

private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { try { final Usuario result = UsuarioBO.validarInicioSesion(this.txtUsuario.getText(), new String(this.txtClave.getPassword())); if (result != null) { //abrir ventana principal java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new PantallaPrincipal(result).setVisible(true); } }); this.dispose(); } } catch (ErrorAplicativo ea) { if (ea.getTecnico() != null) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } else { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, "El usuario o la contraseña ingresada no son válidas.", "Error", JOptionPane.ERROR_MESSAGE); } this.txtClave.setText(""); } } private void txtClaveActionPerformed(java.awt.event.ActionEvent evt) { this.btnAceptar.doClick(); } // Variables declaration - do not modify private javax.swing.JButton btnAceptar; private javax.swing.JButton btnCancelar; private javax.swing.JLabel lblClave; private javax.swing.JLabel lblLogo; private javax.swing.JLabel lblUsuario; private javax.swing.JPasswordField txtClave; private javax.swing.JTextField txtUsuario; // End of variables declaration private static Logger logger = Logger.getLogger(Login.class); }

4.1.10.3 PantallaPrincipal

package com.jabluecatch.gui; import com.jabluecatch.bo.CampaniaBO; import com.jabluecatch.bo.DetalleCampaniaBO; import com.jabluecatch.comm.DetectorDispositivosRemotos; import com.jabluecatch.comm.Despachador; import com.jabluecatch.gui.campania.ConsultarCampanias; import com.jabluecatch.gui.campania.CrearCampania;

Page 394: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

266

import com.jabluecatch.gui.campania.VerDatosCampania; import com.jabluecatch.gui.sistema.CambiarClave; import com.jabluecatch.gui.sistema.ConsultarUsuarios; import com.jabluecatch.gui.sistema.ParametrosGenerales; import com.jabluecatch.gui.sistema.CrearUsuario; import com.jabluecatch.entidades.Campania; import com.jabluecatch.dto.Tarea; import com.jabluecatch.entidades.Usuario; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.FormateadorFecha; import com.jabluecatch.gui.reportes.ReporteBitacoraCampania; import com.jabluecatch.gui.reportes.ReporteUsuarios; import com.jabluecatch.entidades.DetalleCampania; import com.jabluecatch.gui.reportes.ReporteCostosCampanias; import com.jabluecatch.gui.reportes.ReporteImpactoCampania; import com.jabluecatch.util.ModeloTablaMonitor; import java.io.File; import java.util.Vector; import javax.swing.JOptionPane; import org.apache.log4j.Logger; /** * Clase que representa la ventana de la pantalla principal, el monitor de * tareas * @author Fas */ public class PantallaPrincipal extends javax.swing.JFrame { /** Creates new form PantallaPrincipal */ public PantallaPrincipal(Usuario usuarioSesion) { initComponents(); this.setIconImage(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/logo.png")).getImage()); this.usuarioSesion = usuarioSesion; cargaDatos(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { txtCampaniaCA = new javax.swing.JTextField(); lblCampaniaCA = new javax.swing.JLabel(); lblDesdeCA = new javax.swing.JLabel(); txtDesdeCA = new javax.swing.JTextField(); lblHastaCA = new javax.swing.JLabel(); txtHastaCA = new javax.swing.JTextField(); btnMasCA = new javax.swing.JButton(); lblCampaniaSC = new javax.swing.JLabel(); txtCampaniaSC = new javax.swing.JTextField(); lblDesdeSC = new javax.swing.JLabel(); txtDesdeSC = new javax.swing.JTextField();

Page 395: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

267

lblHastaSC = new javax.swing.JLabel(); txtHastaSC = new javax.swing.JTextField(); btnMasSC = new javax.swing.JButton(); btnIniciar = new javax.swing.JButton(); btnDetener = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); tabMonitor = new javax.swing.JTable(); btnRecargar = new javax.swing.JButton(); chkReenviarExitosos = new javax.swing.JCheckBox(); jMenuBar1 = new javax.swing.JMenuBar(); mnuSistema = new javax.swing.JMenu(); mitCrearUsuario = new javax.swing.JMenuItem(); mitConsultarUsuarios = new javax.swing.JMenuItem(); mitCambiarClave = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JPopupMenu.Separator(); mitParametrosGen = new javax.swing.JMenuItem(); mitSalir = new javax.swing.JMenuItem(); mnuCampania = new javax.swing.JMenu(); mitCrearCampania = new javax.swing.JMenuItem(); mitConsultarCampanias = new javax.swing.JMenuItem(); mnuReportes = new javax.swing.JMenu(); mitReporteUsuarios = new javax.swing.JMenuItem(); mitReporteBitacoraCampania = new javax.swing.JMenuItem(); mitReporteImpactoCampania = new javax.swing.JMenuItem(); mitReporteCostosCampanias = new javax.swing.JMenuItem(); mnuAyuda = new javax.swing.JMenu(); mitAcercaDe = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("BlueCatch v0.1"); setBounds(new java.awt.Rectangle(150, 150, 800, 600)); setResizable(false); txtCampaniaCA.setFocusable(false); lblCampaniaCA.setText("Campaña activa:"); lblDesdeCA.setText("Desde:"); txtDesdeCA.setColumns(13); txtDesdeCA.setFocusable(false); lblHastaCA.setText("Hasta:"); txtHastaCA.setColumns(13); txtHastaCA.setFocusable(false); btnMasCA.setText("+"); btnMasCA.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnMasCAActionPerformed(evt); } }); lblCampaniaSC.setText("Siguiente campaña:"); txtCampaniaSC.setFocusable(false);

Page 396: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

268

lblDesdeSC.setText("Desde:"); txtDesdeSC.setColumns(13); txtDesdeSC.setFocusable(false); lblHastaSC.setText("Hasta:"); txtHastaSC.setColumns(13); txtHastaSC.setFocusable(false); btnMasSC.setText("+"); btnMasSC.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnMasSCActionPerformed(evt); } }); btnIniciar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/run.png"))); // NOI18N btnIniciar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnIniciarActionPerformed(evt); } }); btnDetener.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/stop.png"))); // NOI18N btnDetener.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnDetenerActionPerformed(evt); } }); tabMonitor.setModel(new ModeloTablaMonitor()); jScrollPane1.setViewportView(tabMonitor); btnRecargar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jabluecatch/recursos/imagenes/reload.png"))); // NOI18N btnRecargar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnRecargarActionPerformed(evt); } }); chkReenviarExitosos.setText("Reenvio constante de contenido a dispositivos."); chkReenviarExitosos.setToolTipText("Reenviar contenido multimedia a los dispositivos que ya lo han recibido satisfactoriamente."); mnuSistema.setText("Sistema"); mnuSistema.setMaximumSize(new java.awt.Dimension(58, 32767)); mnuSistema.setPreferredSize(new java.awt.Dimension(59, 19)); mitCrearUsuario.setText("Crear usuario"); mitCrearUsuario.addActionListener(new java.awt.event.ActionListener() {

Page 397: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

269

public void actionPerformed(java.awt.event.ActionEvent evt) { mitCrearUsuarioActionPerformed(evt); } }); mnuSistema.add(mitCrearUsuario); mitConsultarUsuarios.setText("Consultar usuarios"); mitConsultarUsuarios.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitConsultarUsuariosActionPerformed(evt); } }); mnuSistema.add(mitConsultarUsuarios); mitCambiarClave.setText("Cambiar clave"); mitCambiarClave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitCambiarClaveActionPerformed(evt); } }); mnuSistema.add(mitCambiarClave); mnuSistema.add(jSeparator1); mitParametrosGen.setText("Parámetros generales"); mitParametrosGen.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitParametrosGenActionPerformed(evt); } }); mnuSistema.add(mitParametrosGen); mitSalir.setText("Salir"); mitSalir.setPreferredSize(new java.awt.Dimension(59, 19)); mitSalir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitSalirActionPerformed(evt); } }); mnuSistema.add(mitSalir); jMenuBar1.add(mnuSistema); mnuCampania.setText("Campaña"); mnuCampania.setMaximumSize(new java.awt.Dimension(65, 32767)); mnuCampania.setPreferredSize(new java.awt.Dimension(69, 19)); mitCrearCampania.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); mitCrearCampania.setText("Crear campaña"); mitCrearCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitCrearCampaniaActionPerformed(evt); } }); mnuCampania.add(mitCrearCampania);

Page 398: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

270

mitConsultarCampanias.setText("Consultar campañas"); mitConsultarCampanias.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitConsultarCampaniasActionPerformed(evt); } }); mnuCampania.add(mitConsultarCampanias); jMenuBar1.add(mnuCampania); mnuReportes.setText("Reportes"); mnuReportes.setMaximumSize(new java.awt.Dimension(65, 32767)); mitReporteUsuarios.setText("Reporte de usuarios"); mitReporteUsuarios.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitReporteUsuariosActionPerformed(evt); } }); mnuReportes.add(mitReporteUsuarios); mitReporteBitacoraCampania.setText("Reporte de Bitácora por Campaña"); mitReporteBitacoraCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitReporteBitacoraCampaniaActionPerformed(evt); } }); mnuReportes.add(mitReporteBitacoraCampania); mitReporteImpactoCampania.setText("Reporte de Impacto de Campaña"); mitReporteImpactoCampania.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitReporteImpactoCampaniaActionPerformed(evt); } }); mnuReportes.add(mitReporteImpactoCampania); mitReporteCostosCampanias.setText("Reporte de Costos de Campañas"); mitReporteCostosCampanias.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitReporteCostosCampaniasActionPerformed(evt); } }); mnuReportes.add(mitReporteCostosCampanias); jMenuBar1.add(mnuReportes); mnuAyuda.setText("Ayuda"); mnuAyuda.setMaximumSize(new java.awt.Dimension(58, 32767)); mnuAyuda.setPreferredSize(new java.awt.Dimension(59, 19)); mitAcercaDe.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));

Page 399: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

271

mitAcercaDe.setText("Acerca de..."); mitAcercaDe.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mitAcercaDeActionPerformed(evt); } }); mnuAyuda.add(mitAcercaDe); jMenuBar1.add(mnuAyuda); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(51, 51, 51) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblCampaniaCA) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createSequentialGroup() .addComponent(txtCampaniaCA) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnMasCA)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(btnDetener) .addGroup(layout.createSequentialGroup() .addComponent(lblDesdeCA) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtDesdeCA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(24, 24, 24) .addComponent(lblHastaCA) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtHastaCA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 58, Short.MAX_VALUE) .addComponent(btnRecargar) .addGap(51, 51, 51)

Page 400: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

272

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblCampaniaSC) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createSequentialGroup() .addComponent(txtCampaniaSC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnMasSC)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(lblDesdeSC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtDesdeSC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(lblHastaSC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtHastaSC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(chkReenviarExitosos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGap(55, 55, 55)) .addGroup(layout.createSequentialGroup() .addComponent(btnIniciar) .addContainerGap(794, Short.MAX_VALUE)))) .addGroup(layout.createSequentialGroup() .addGap(32, 32, 32) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 835, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(35, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(24, 24, 24) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(lblCampaniaCA) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampaniaCA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnMasCA)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

Page 401: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

273

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblDesdeCA) .addComponent(lblHastaCA) .addComponent(txtDesdeCA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtHastaCA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() .addComponent(lblCampaniaSC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnRecargar) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtCampaniaSC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnMasSC)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblDesdeSC) .addComponent(txtDesdeSC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHastaSC) .addComponent(txtHastaSC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(btnIniciar) .addComponent(btnDetener) .addComponent(chkReenviarExitosos)) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(28, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void mitSalirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: System.exit(0); } private void mitConsultarCampaniasActionPerformed(java.awt.event.ActionEvent evt) {

Page 402: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

274

//abrir ventana new ConsultarCampanias(this, true).setVisible(true); } private void mitParametrosGenActionPerformed(java.awt.event.ActionEvent evt) { new ParametrosGenerales(this, true).setVisible(true); } private void mitCrearUsuarioActionPerformed(java.awt.event.ActionEvent evt) { //abrir ventana new CrearUsuario(this, true).setVisible(true); } private void mitCambiarClaveActionPerformed(java.awt.event.ActionEvent evt) { //abrir ventana new CambiarClave(this, true, this.usuarioSesion.getUsuario()).setVisible(true); } private void mitConsultarUsuariosActionPerformed(java.awt.event.ActionEvent evt) { //abrir ventana new ConsultarUsuarios(this, true).setVisible(true); } private void mitCrearCampaniaActionPerformed(java.awt.event.ActionEvent evt) { //abrir ventana new CrearCampania(this, true).setVisible(true); } private void mitAcercaDeActionPerformed(java.awt.event.ActionEvent evt) { //abrir ventana new AcercaDe(this, true).setVisible(true); } private void btnMasCAActionPerformed(java.awt.event.ActionEvent evt) { new VerDatosCampania(this, false, this.campaniaCA.getIdCampania()).setVisible(true); } private void btnMasSCActionPerformed(java.awt.event.ActionEvent evt) { new VerDatosCampania(this, false, this.campaniaSC.getIdCampania()).setVisible(true); } private void btnRecargarActionPerformed(java.awt.event.ActionEvent evt) { this.btnRecargar.setEnabled(false); this.cargarCampanias(); this.procesoEnvio.cambiarCampania(this.campaniaCA, this.detallesCampania); this.btnRecargar.setEnabled(true); } private void btnIniciarActionPerformed(java.awt.event.ActionEvent evt) { this.btnRecargar.doClick();

Page 403: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

275

if (this.detallesCampania == null) { logger.warn("btnIniciarActionPerformed - No se puede iniciar el envío de contenido porque no existe una campaña activa."); JOptionPane.showMessageDialog(this, "No se puede iniciar el envío de contenido porque no existe una campaña activa", "Error", JOptionPane.ERROR_MESSAGE); return; } //Verificar que los archivos a enviar existan for (DetalleCampania dc : this.detallesCampania) { File f = new File(dc.getRuta()); if (!f.exists()) { logger.warn("btnIniciarActionPerformed - El archivo <" + dc.getRuta().replace("\\\\", "\\") + "> no existe."); JOptionPane.showMessageDialog(this, "El archivo <" + dc.getRuta().replace("\\\\", "\\") + "> no existe", "Error", JOptionPane.ERROR_MESSAGE); return; } } this.btnIniciar.setEnabled(false); try { new DetectorDispositivosRemotos().iniciar(); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); this.btnIniciar.setEnabled(true); return; } logger.info("btnIniciarActionPerformed - Reanudando proceso de envío de publicidad."); this.procesoEnvio.setContinuar(true); this.btnDetener.setEnabled(true); } private void btnDetenerActionPerformed(java.awt.event.ActionEvent evt) { logger.info("btnIniciarActionPerformed - Deteniendo proceso de envío de publicidad."); this.btnDetener.setEnabled(false); this.procesoEnvio.setContinuar(false); this.btnIniciar.setEnabled(true); } private void mitReporteUsuariosActionPerformed(java.awt.event.ActionEvent evt) { new ReporteUsuarios().setVisible(true); } private void mitReporteBitacoraCampaniaActionPerformed(java.awt.event.ActionEvent evt) {

Page 404: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

276

new ReporteBitacoraCampania().setVisible(true); } private void mitReporteImpactoCampaniaActionPerformed(java.awt.event.ActionEvent evt) { new ReporteImpactoCampania().setVisible(true); } private void mitReporteCostosCampaniasActionPerformed(java.awt.event.ActionEvent evt) { new ReporteCostosCampanias().setVisible(true); } private void seteaAnchoColumnas() { this.tabMonitor.getColumn("Nombre dispositivo").setPreferredWidth(100); this.tabMonitor.getColumn("Archivo a enviar").setPreferredWidth(350); this.tabMonitor.getColumn("Estado").setPreferredWidth(150); this.tabMonitor.getColumn("Porcentaje completado").setPreferredWidth(100); } public synchronized void actualizarRegistroMonitor(Tarea rm) { for (Tarea t : this.getMonitor()) { if (rm.getIdTarea() == t.getIdTarea()) { t.setPorcentajeCompletado(rm.getPorcentajeCompletado()); t.setEstado(rm.getEstado()); } } this.tabMonitor.setModel(new ModeloTablaMonitor(this.getMonitor())); this.seteaAnchoColumnas(); } public void agregarRegistroMonitor(Tarea rm) { for (Tarea t : this.getMonitor()) { if (rm.getIdTarea() == t.getIdTarea()) { return; } } this.getMonitor().add(rm); this.tabMonitor.setModel(new ModeloTablaMonitor(this.getMonitor())); this.seteaAnchoColumnas(); } public void reiniciarBotones() { this.btnIniciar.setEnabled(true); this.btnDetener.setEnabled(false); } public boolean reenviarExitosos(){ return this.chkReenviarExitosos.isSelected(); } public void cargarCampanias() { //Cargar campania actual y campania siguiente try { CampaniaBO.conciliarFases(); this.campaniaCA = CampaniaBO.obtenerCampaniaEnEjecucion(); this.campaniaSC = CampaniaBO.obtenerSiguienteCampania(); } catch (ErrorAplicativo ea) {

Page 405: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

277

logger.warn(ea.getErrorTecnico()); JOptionPane.showMessageDialog(this, ea.getError(), "Error", JOptionPane.ERROR_MESSAGE); } //Cargar sus datos this.txtCampaniaCA.setText((this.campaniaCA != null) ? this.campaniaCA.getCampania() : "N/A"); this.txtDesdeCA.setText((this.campaniaCA != null) ? FormateadorFecha.aJavaDateTimeString(this.campaniaCA.getFechaInicio()) : "N/A"); this.txtHastaCA.setText((this.campaniaCA != null) ? (this.campaniaCA.getFechaFin() != null ? FormateadorFecha.aJavaDateTimeString(this.campaniaCA.getFechaFin()) : "N/A") : "N/A"); this.btnMasCA.setEnabled(this.campaniaCA != null); this.btnIniciar.setEnabled(this.campaniaCA != null); this.btnDetener.setEnabled(false); this.txtCampaniaSC.setText((this.campaniaSC != null) ? this.campaniaSC.getCampania() : "N/A"); this.txtDesdeSC.setText((this.campaniaSC != null) ? FormateadorFecha.aJavaDateTimeString(this.campaniaSC.getFechaInicio()) : "N/A"); this.txtHastaSC.setText((this.campaniaSC != null) ? (this.campaniaSC.getFechaFin() != null ? FormateadorFecha.aJavaDateTimeString(this.campaniaSC.getFechaFin()) : "N/A") : "N/A"); this.btnMasSC.setEnabled(this.campaniaSC != null); if (this.campaniaCA != null) { try { this.detallesCampania = DetalleCampaniaBO.buscarPorIdCampania(this.campaniaCA.getIdCampania()); } catch (ErrorAplicativo ea) { logger.warn(ea.getErrorTecnico()); } } else { this.detallesCampania = null; } } public void mostrarMensaje(String mensaje) { JOptionPane.showMessageDialog(this, mensaje, "Información", JOptionPane.ERROR_MESSAGE); } private void cargaDatos() { //Inhabilitar opciones por rol if (this.usuarioSesion.getIdRol() != 1) { this.mitCrearUsuario.setEnabled(false); this.mitConsultarUsuarios.setEnabled(false); this.mitParametrosGen.setEnabled(false); this.mitCrearCampania.setEnabled(false); this.mitReporteUsuarios.setEnabled(false); this.mitReporteBitacoraCampania.setEnabled(false); } this.monitor = new Vector();

Page 406: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

278

this.seteaAnchoColumnas(); //Carga los datos de las campanias actual y siguiente this.cargarCampanias(); //Configurar proceso this.procesoEnvio = new Despachador(this, this.campaniaCA, this.detallesCampania); this.procesoEnvio.start(); } /** * @return the usuarioSesion */ public Usuario getUsuarioSesion() { return usuarioSesion; } /** * @param usuarioSesion the usuarioSesion to set */ public void setUsuarioSesion(Usuario usuarioSesion) { this.usuarioSesion = usuarioSesion; } /** * @return the monitor */ public Vector<Tarea> getMonitor() { return monitor; } // Variables declaration - do not modify private javax.swing.JButton btnDetener; private javax.swing.JButton btnIniciar; private javax.swing.JButton btnMasCA; private javax.swing.JButton btnMasSC; private javax.swing.JButton btnRecargar; private javax.swing.JCheckBox chkReenviarExitosos; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JPopupMenu.Separator jSeparator1; private javax.swing.JLabel lblCampaniaCA; private javax.swing.JLabel lblCampaniaSC; private javax.swing.JLabel lblDesdeCA; private javax.swing.JLabel lblDesdeSC; private javax.swing.JLabel lblHastaCA; private javax.swing.JLabel lblHastaSC; private javax.swing.JMenuItem mitAcercaDe; private javax.swing.JMenuItem mitCambiarClave; private javax.swing.JMenuItem mitConsultarCampanias; private javax.swing.JMenuItem mitConsultarUsuarios; private javax.swing.JMenuItem mitCrearCampania; private javax.swing.JMenuItem mitCrearUsuario; private javax.swing.JMenuItem mitParametrosGen; private javax.swing.JMenuItem mitReporteBitacoraCampania; private javax.swing.JMenuItem mitReporteCostosCampanias;

Page 407: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

279

private javax.swing.JMenuItem mitReporteImpactoCampania; private javax.swing.JMenuItem mitReporteUsuarios; private javax.swing.JMenuItem mitSalir; private javax.swing.JMenu mnuAyuda; private javax.swing.JMenu mnuCampania; private javax.swing.JMenu mnuReportes; private javax.swing.JMenu mnuSistema; private javax.swing.JTable tabMonitor; private javax.swing.JTextField txtCampaniaCA; private javax.swing.JTextField txtCampaniaSC; private javax.swing.JTextField txtDesdeCA; private javax.swing.JTextField txtDesdeSC; private javax.swing.JTextField txtHastaCA; private javax.swing.JTextField txtHastaSC; // End of variables declaration private Usuario usuarioSesion; private Campania campaniaCA; private Vector<DetalleCampania> detallesCampania; private Campania campaniaSC; private Despachador procesoEnvio; private Vector<Tarea> monitor; private static Logger logger = Logger.getLogger(PantallaPrincipal.class); }

4.1.11 Paquete raiz

4.1.11.1 Main

import com.jabluecatch.bo.ParametroGeneralBO; import com.jabluecatch.entidades.ParametroGeneral; import com.jabluecatch.gui.Login; import com.jabluecatch.util.ErrorAplicativo; import com.jabluecatch.util.Instalador; import java.io.IOException; import java.net.ServerSocket; import javax.swing.JOptionPane; import javax.swing.UIManager; import org.apache.log4j.Logger; /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * * @author Fas */ public class Main { private static Logger logger = Logger.getLogger(Main.class);

Page 408: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

280

private static void setearApariencia() { //setear look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { setearApariencia(); //Verificar que no exista otra instancia de la aplicación try { ServerSocket ss = new ServerSocket(2806); } catch (IOException ioe) { logger.warn("La aplicación BlueCatch ya se está ejecutando. Error: " + ioe.getMessage()); JOptionPane.showMessageDialog(null, "La aplicación BlueCatch ya se está ejecutando", "Error", JOptionPane.ERROR_MESSAGE); return; } //Verificar que BlueCatch se pueda comunicar con la base de datos boolean seDebeInstalar = false; ParametroGeneral pInstalado = null; try { pInstalado = ParametroGeneralBO.buscarPorParametro("INSTALADO"); } catch (ErrorAplicativo ea) { if (!ea.getErrorTecnico().equals("Conexion.inicializaConexion - Unknown database 'bluecatch'")) { logger.warn("Error de conexión a la base de datos. Error: " + ea.getErrorTecnico()); JOptionPane.showMessageDialog(null, "Error de conexión a la base de datos", "Error", JOptionPane.ERROR_MESSAGE); return; } else { seDebeInstalar = true; } } if (pInstalado == null) { seDebeInstalar = true; } else if (!pInstalado.getValor().equals("S")) { seDebeInstalar = true; } if (seDebeInstalar) { int acepta = JOptionPane.showConfirmDialog(null, "El sistema no parece estar instalado.\n " + "Se procederá a instalar el mismo. Todos los datos se reiniciarán. Desea continuar?", "Confirmación", JOptionPane.YES_NO_OPTION); if (acepta != 0) { return; }

Page 409: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

281

try { Instalador.ejecutar(); } catch (ErrorAplicativo ea) { logger.warn("Error al instalar el sistema. Error: " + ea.getErrorTecnico()); JOptionPane.showMessageDialog(null, "Error al instalar el sistema", "Error", JOptionPane.ERROR_MESSAGE); return; } JOptionPane.showMessageDialog(null, "El sistema se ha instalado correctamente", "Información", JOptionPane.INFORMATION_MESSAGE); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Login().setVisible(true); } }); } }

4.2 ARCHIVOS DE PROPIEDADES

4.2.1 Paquete raíz

4.2.1.1 log4j.properties

#Para dirigir mensajes a la salida estandar log4j.appender.pantalla=org.apache.log4j.ConsoleAppender log4j.appender.pantalla.Target=System.out log4j.appender.pantalla.layout=org.apache.log4j.PatternLayout log4j.appender.pantalla.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n #Para dirigir mensajes a un archivo log4j.appender.archivo=org.apache.log4j.DailyRollingFileAppender log4j.appender.archivo.DatePattern=dd-MM-yyyy'.' log4j.appender.archivo.File=./logs/JABlueCatch.log log4j.appender.archivo.layout=org.apache.log4j.PatternLayout log4j.appender.archivo.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n #Root logger log4j.rootLogger=info, archivo #Configurar otros loggers log4j.logger.com.jabluecatch=debug, pantalla

Page 410: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

282

4.3 REPORTES JASPER

4.3.1 Paquete com.jabluecatch.recursos.reportes

4.3.1.1 ReporteBitacoraCampania.jrxml

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ReporteBitacoraCampania" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.3310000000000084"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <parameter name="P_ID_CAMPANIA" class="java.lang.Integer" isForPrompting="false"/> <queryString> <![CDATA[SELECT c.campania, c.descripcion, dc.ruta, DATE_FORMAT(bc.fecha_registro,'%d/%m/%Y %H:%i:%S') fecha_registro, d.nombre_bt, d.direccion_bt, bc.observacion, u.usuario FROM bitacora_campanias bc, detalle_campanias dc, campanias c, usuarios u, dispositivos d WHERE dc.id_campania = $P{P_ID_CAMPANIA} AND dc.id_detalle_campania = bc.id_detalle_campania AND c.id_campania = dc.id_campania AND u.id_usuario = bc.id_usuario AND d.id_dispositivo = bc.id_dispositivo_destino AND bc.estado = 'A' ORDER BY dc.id_detalle_campania, d.nombre_bt, bc.fecha_registro;]]> </queryString> <field name="campania" class="java.lang.String"/> <field name="descripcion" class="java.lang.String"/> <field name="ruta" class="java.lang.String"/> <field name="fecha_registro" class="java.lang.String"/> <field name="nombre_bt" class="java.lang.String"/> <field name="direccion_bt" class="java.lang.String"/> <field name="observacion" class="java.lang.String"/> <field name="usuario" class="java.lang.String"/> <group name="campania">

Page 411: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

283

<groupExpression><![CDATA[$F{campania}]]></groupExpression> <groupHeader> <band height="8"> <line> <reportElement x="-20" y="-4" width="842" height="1" forecolor="#666666"/> </line> </band> </groupHeader> <groupFooter> <band/> </groupFooter> </group> <group name="ruta"> <groupExpression><![CDATA[$F{ruta}]]></groupExpression> <groupHeader> <band height="35"> <textField> <reportElement x="100" y="0" width="722" height="32" forecolor="#006699"/> <textElement> <font size="14" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{ruta}]]></textFieldExpression> </textField> <staticText> <reportElement x="0" y="1" width="100" height="31" forecolor="#666666"/> <textElement> <font size="12"/> </textElement> <text><![CDATA[Archivo de contenido:]]></text> </staticText> </band> </groupHeader> <groupFooter> <band/> </groupFooter> </group> <background> <band/> </background> <title> <band height="81"> <frame> <reportElement mode="Opaque" x="-20" y="-20" width="842" height="92" backcolor="#006699"/> <staticText> <reportElement x="20" y="20" width="385" height="43" forecolor="#FFFFFF"/> <textElement> <font size="24" isBold="true"/> </textElement> <text><![CDATA[Reporte de bitácora de Campaña]]></text> </staticText> <staticText>

Page 412: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

284

<reportElement x="552" y="20" width="270" height="53" forecolor="#FFFFFF"/> <textElement textAlignment="Right" verticalAlignment="Middle"> <font size="14"/> </textElement> <text><![CDATA[Eventos generados durante la transmisión de los archivos a los clientes]]></text> </staticText> </frame> </band> </title> <pageHeader> <band height="60"> <staticText> <reportElement mode="Opaque" x="0" y="0" width="100" height="28" forecolor="#666666" backcolor="#E6E6E6"/> <textElement> <font size="12"/> </textElement> <text><![CDATA[Campaña]]></text> </staticText> <textField> <reportElement mode="Opaque" x="100" y="0" width="702" height="28" forecolor="#006699" backcolor="#E6E6E6"/> <textElement> <font size="18" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{campania}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="0" y="28" width="802" height="28" forecolor="#000000" backcolor="#E6E6E6"/> <textElement> <font size="10" isBold="false"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{descripcion}]]></textFieldExpression> </textField> </band> </pageHeader> <columnHeader> <band height="24"> <line> <reportElement x="-20" y="-4" width="842" height="1" forecolor="#666666"/> </line> <staticText> <reportElement mode="Opaque" x="0" y="0" width="148" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Fecha Registro]]></text> </staticText> <staticText>

Page 413: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

285

<reportElement mode="Opaque" x="148" y="0" width="149" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Nombre Dispositivo]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="297" y="0" width="121" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Dirección]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="691" y="0" width="111" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Usuario]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="418" y="1" width="273" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Observación]]></text> </staticText> </band> </columnHeader> <detail> <band height="20"> <line> <reportElement positionType="FixRelativeToBottom" x="0" y="18" width="822" height="1"/> </line> <textField isStretchWithOverflow="true"> <reportElement x="0" y="0" width="148" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{fecha_registro}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="148" y="0" width="149" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{nombre_bt}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="297" y="0" width="121" height="18"/> <textElement>

Page 414: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

286

<font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{direccion_bt}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="418" y="0" width="273" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{observacion}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="691" y="0" width="111" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{usuario}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band/> </columnFooter> <pageFooter> <band height="20"> <textField> <reportElement mode="Opaque" x="0" y="4" width="762" height="13" backcolor="#E6E6E6"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression> </textField> <textField evaluationTime="Report"> <reportElement mode="Opaque" x="762" y="4" width="40" height="13" backcolor="#E6E6E6"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> <textField pattern="EEEEE dd MMMMM yyyy"> <reportElement x="0" y="4" width="100" height="13"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression> </textField> </band> </pageFooter> <summary> <band/> </summary> </jasperReport>

Page 415: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

287

4.3.1.2 ReporteCostosCampanias.jrxml

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ReporteCostosCampanias" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.4641000000000022"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="88"/> <parameter name="P_FECHA_INICIO" class="java.sql.Timestamp" isForPrompting="false"/> <parameter name="P_FECHA_FIN" class="java.sql.Timestamp" isForPrompting="false"/> <queryString> <![CDATA[SELECT c.campania, c.descripcion, c.fecha_inicio f_fecha_inicio, DATE_FORMAT(c.fecha_inicio,'%d/%m/%Y %H:%i:%S') s_fecha_inicio, DATE_FORMAT(c.fecha_fin,'%d/%m/%Y %H:%i:%S') s_fecha_fin, (SELECT IFNULL(COUNT(*),0) CANTIDAD FROM bitacora_campanias bc2, detalle_campanias dc2, campanias c2 WHERE dc2.id_detalle_campania = bc2.id_detalle_campania AND dc2.id_campania = c.id_campania AND c2.id_campania = dc2.id_campania AND bc2.evento = 'E' AND bc2.estado = 'A') MENSAJES_ENVIADOS, LPAD(FORMAT(c.costo_ref_mensaje, 2), 4, '0') S_COSTO_MENSAJE, lpad(format(((SELECT IFNULL(COUNT(*),0) FROM bitacora_campanias bc2, detalle_campanias dc2, campanias c2 WHERE dc2.id_detalle_campania = bc2.id_detalle_campania AND dc2.id_campania = c.id_campania AND c2.id_campania = dc2.id_campania AND bc2.evento = 'E' AND bc2.estado = 'A') * c.costo_ref_mensaje), 2), 4, '0') TOTAL, ((SELECT IFNULL(COUNT(*),0) FROM bitacora_campanias bc2, detalle_campanias dc2, campanias c2 WHERE dc2.id_detalle_campania = bc2.id_detalle_campania AND dc2.id_campania = c.id_campania AND c2.id_campania = dc2.id_campania

Page 416: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

288

AND bc2.evento = 'E' AND bc2.estado = 'A') * c.costo_ref_mensaje) TOTAL_NUM FROM campanias c WHERE c.estado = 'A' AND c.fecha_inicio > $P{P_FECHA_INICIO} AND IFNULL(c.fecha_fin,now()) <= $P{P_FECHA_FIN} ORDER BY c.fecha_inicio ASC;]]> </queryString> <field name="campania" class="java.lang.String"/> <field name="descripcion" class="java.lang.String"/> <field name="f_fecha_inicio" class="java.sql.Timestamp"/> <field name="s_fecha_inicio" class="java.lang.String"/> <field name="s_fecha_fin" class="java.lang.String"/> <field name="MENSAJES_ENVIADOS" class="java.lang.Long"/> <field name="S_COSTO_MENSAJE" class="java.lang.String"/> <field name="TOTAL" class="java.lang.String"/> <field name="TOTAL_NUM" class="java.lang.Double"/> <background> <band/> </background> <title> <band height="72"> <frame> <reportElement mode="Opaque" x="-20" y="-20" width="842" height="92" backcolor="#006699"/> <staticText> <reportElement x="20" y="20" width="399" height="43" forecolor="#FFFFFF"/> <textElement> <font size="24" isBold="true"/> </textElement> <text><![CDATA[Reporte de Costos de Campañas]]></text> </staticText> <staticText> <reportElement x="642" y="20" width="180" height="43" forecolor="#FFFFFF"/> <textElement textAlignment="Right"> <font size="14" isBold="false"/> </textElement> <text><![CDATA[Reporte histórico de los costos de las campañas]]></text> </staticText> </frame> </band> </title> <pageHeader> <band height="13"/> </pageHeader> <columnHeader> <band height="56"> <line> <reportElement x="-20" y="44" width="822" height="1" forecolor="#666666"/> </line> <staticText>

Page 417: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

289

<reportElement mode="Opaque" x="0" y="0" width="150" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Campaña]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="314" y="0" width="150" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Fecha de inicio]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="464" y="0" width="150" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Fecha de fin]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="614" y="0" width="62" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Mensajes Enviados]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="676" y="0" width="56" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Costo Mensaje]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="732" y="0" width="70" height="40" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Total]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="150" y="0" width="164" height="40" forecolor="#006699" backcolor="#E6E6E6"/>

Page 418: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

290

<textElement textAlignment="Center" verticalAlignment="Middle"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Descripción de la Campaña]]></text> </staticText> </band> </columnHeader> <detail> <band height="21"> <line> <reportElement positionType="FixRelativeToBottom" x="0" y="19" width="802" height="1"/> </line> <textField isStretchWithOverflow="true"> <reportElement x="0" y="0" width="150" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{campania}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="314" y="0" width="150" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{s_fecha_inicio}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="464" y="0" width="150" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{s_fecha_fin}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="614" y="0" width="62" height="18"/> <textElement textAlignment="Center"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.Long"><![CDATA[$F{MENSAJES_ENVIADOS}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="676" y="0" width="56" height="18"/> <textElement textAlignment="Right" verticalAlignment="Middle"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["\$ " + $F{S_COSTO_MENSAJE}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true">

Page 419: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

291

<reportElement x="732" y="0" width="70" height="18"/> <textElement textAlignment="Right" verticalAlignment="Middle"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["\$ " + $F{TOTAL}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="150" y="1" width="164" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{descripcion}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band/> </columnFooter> <pageFooter> <band height="17"> <textField> <reportElement mode="Opaque" x="0" y="4" width="762" height="13" backcolor="#E6E6E6"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression> </textField> <textField evaluationTime="Report"> <reportElement mode="Opaque" x="762" y="4" width="40" height="13" backcolor="#E6E6E6"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> <textField pattern="EEEEE dd MMMMM yyyy"> <reportElement x="0" y="4" width="100" height="13"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression> </textField> </band> </pageFooter> <summary> <band height="292"> <timeSeriesChart> <chart theme="eye.candy.sixties"> <reportElement x="13" y="52" width="775" height="229"/> <chartTitle/> <chartSubtitle/> <chartLegend/> </chart> <timeSeriesDataset timePeriod="Minute"> <timeSeries>

Page 420: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

292

<seriesExpression><![CDATA["Costos de Campañas"]]></seriesExpression> <timePeriodExpression><![CDATA[$F{f_fecha_inicio}]]></timePeriodExpression> <valueExpression><![CDATA[$F{TOTAL_NUM}]]></valueExpression> </timeSeries> </timeSeriesDataset> <timeSeriesPlot> <plot/> <timeAxisFormat> <axisFormat> <labelFont/> <tickLabelFont/> </axisFormat> </timeAxisFormat> <valueAxisFormat> <axisFormat> <labelFont/> <tickLabelFont/> </axisFormat> </valueAxisFormat> </timeSeriesPlot> </timeSeriesChart> </band> </summary> </jasperReport>

4.3.1.3 ReporteImpactoCampania.jrxml

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ReporteImpactoCampania" language="groovy" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.000000000000001"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="19"/> <parameter name="P_ID_CAMPANIA" class="java.lang.Integer" isForPrompting="false"/> <queryString> <![CDATA[SELECT c.campania, c.descripcion, 'Transferencias exitosas' GRUPO, IFNULL(COUNT(*),0) CANTIDAD FROM bitacora_campanias bc, detalle_campanias dc, campanias c WHERE dc.id_detalle_campania = bc.id_detalle_campania AND dc.id_campania = $P{P_ID_CAMPANIA} AND c.id_campania = dc.id_campania AND bc.evento = 'E' AND bc.estado = 'A' UNION

Page 421: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

293

SELECT c.campania, c.descripcion, 'Transferencias canceladas' GRUPO, IFNULL(COUNT(*),0) CANTIDAD FROM bitacora_campanias bc, detalle_campanias dc, campanias c WHERE dc.id_detalle_campania = bc.id_detalle_campania AND dc.id_campania = $P{P_ID_CAMPANIA} AND c.id_campania = dc.id_campania AND bc.evento = 'C' AND bc.estado = 'A' UNION SELECT c.campania, c.descripcion, 'Transferencias fallidas' GRUPO, IFNULL(COUNT(*),0) CANTIDAD FROM bitacora_campanias bc, detalle_campanias dc, campanias c WHERE dc.id_detalle_campania = bc.id_detalle_campania AND dc.id_campania = $P{P_ID_CAMPANIA} AND c.id_campania = dc.id_campania AND bc.evento = 'X' AND bc.observacion NOT LIKE '%No se ha encontrado el servicio%' AND bc.estado = 'A';]]> </queryString> <field name="campania" class="java.lang.String"/> <field name="descripcion" class="java.lang.String"/> <field name="GRUPO" class="java.lang.String"/> <field name="CANTIDAD" class="java.lang.Long"/> <group name="campania"> <groupExpression><![CDATA[$F{campania}]]></groupExpression> <groupHeader> <band height="9"> <line> <reportElement x="-20" y="-28" width="595" height="1" forecolor="#666666"/> </line> </band> </groupHeader> <groupFooter> <band/> </groupFooter> </group> <background> <band/> </background> <title> <band height="129"> <frame> <reportElement mode="Opaque" x="-20" y="-20" width="595" height="111" backcolor="#006699"/> <staticText> <reportElement x="20" y="20" width="555" height="43" forecolor="#FFFFFF"/> <textElement> <font size="24" isBold="true"/> </textElement> <text><![CDATA[Reporte de Impacto de Campaña]]></text> </staticText>

Page 422: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

294

<staticText> <reportElement x="20" y="63" width="554" height="48" forecolor="#FFFFFF"/> <textElement> <font size="14" isBold="false"/> </textElement> <text><![CDATA[Impacto que ha tenido la campaña de acuerdo a las cantidades de mensajes aceptados, rechazados y cancelados]]></text> </staticText> </frame> </band> </title> <pageHeader> <band height="81"> <staticText> <reportElement mode="Opaque" x="0" y="1" width="99" height="28" forecolor="#666666" backcolor="#E6E6E6"/> <textElement> <font size="12"/> </textElement> <text><![CDATA[Campaña]]></text> </staticText> <textField> <reportElement mode="Opaque" x="99" y="1" width="456" height="28" forecolor="#006699" backcolor="#E6E6E6"/> <textElement> <font size="18" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{campania}]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="0" y="29" width="555" height="48" forecolor="#000000" backcolor="#E6E6E6"/> <textElement> <font size="10" isBold="false"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{descripcion}]]></textFieldExpression> </textField> </band> </pageHeader> <columnHeader> <band height="24"> <line> <reportElement x="-20" y="20" width="595" height="1" forecolor="#666666"/> </line> <staticText> <reportElement mode="Opaque" x="0" y="0" width="277" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Grupo]]></text> </staticText> <staticText>

Page 423: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

295

<reportElement mode="Opaque" x="277" y="0" width="277" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Cantidad]]></text> </staticText> </band> </columnHeader> <detail> <band height="21"> <line> <reportElement positionType="FixRelativeToBottom" x="0" y="18" width="555" height="1"/> </line> <textField isStretchWithOverflow="true"> <reportElement x="0" y="0" width="277" height="18"/> <textElement textAlignment="Center"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{GRUPO}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="277" y="0" width="277" height="18"/> <textElement textAlignment="Center"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.Long"><![CDATA[$F{CANTIDAD}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band/> </columnFooter> <pageFooter> <band height="20"> <textField> <reportElement mode="Opaque" x="0" y="4" width="515" height="13" backcolor="#E6E6E6"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression> </textField> <textField evaluationTime="Report"> <reportElement mode="Opaque" x="515" y="4" width="40" height="13" backcolor="#E6E6E6"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> <textField pattern="EEEEE dd MMMMM yyyy"> <reportElement x="0" y="4" width="100" height="13"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression>

Page 424: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

296

</textField> </band> </pageFooter> <summary> <band height="303"> <pie3DChart> <chart theme="default"> <reportElement x="22" y="44" width="514" height="245"/> <chartTitle> <titleExpression><![CDATA["Impacto de la Campaña: "+$F{campania}]]></titleExpression> </chartTitle> <chartSubtitle/> <chartLegend/> </chart> <pieDataset> <keyExpression><![CDATA[$F{GRUPO}]]></keyExpression> <valueExpression><![CDATA[$F{CANTIDAD}]]></valueExpression> </pieDataset> <pie3DPlot isCircular="false"> <plot/> <itemLabel color="#000000" backgroundColor="#FFFFFF"/> </pie3DPlot> </pie3DChart> </band> </summary> </jasperReport>

4.3.1.4 ReporteUsuarios.jrxml

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ReporteUsuarios" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.1000000000000016"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <queryString language="SQL"> <![CDATA[SELECT usuarios.`id_usuario` AS usuarios_id_usuario, usuarios.`usuario` AS usuarios_usuario, roles.`rol` AS roles_rol, usuarios.`nombres` AS usuarios_nombres, usuarios.`apellidos` AS usuarios_apellidos, usuarios.`identificacion` AS usuarios_identificacion FROM

Page 425: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

297

`roles` roles INNER JOIN `usuarios` usuarios ON roles.`id_rol` = usuarios.`id_rol` WHERE usuarios.estado = 'A' AND roles.estado = 'A']]> </queryString> <field name="usuarios_id_usuario" class="java.lang.Integer"/> <field name="usuarios_usuario" class="java.lang.String"/> <field name="roles_rol" class="java.lang.String"/> <field name="usuarios_nombres" class="java.lang.String"/> <field name="usuarios_apellidos" class="java.lang.String"/> <field name="usuarios_identificacion" class="java.lang.String"/> <background> <band/> </background> <title> <band height="56"> <frame> <reportElement mode="Opaque" x="-20" y="-20" width="842" height="75" backcolor="#006699"/> <staticText> <reportElement x="20" y="21" width="332" height="43" forecolor="#FFFFFF"/> <textElement> <font size="24" isBold="true"/> </textElement> <text><![CDATA[Reporte de usuarios]]></text> </staticText> <staticText> <reportElement x="596" y="27" width="226" height="37" forecolor="#FFFFFF"/> <textElement textAlignment="Right"> <font size="14" isBold="false"/> </textElement> <text><![CDATA[Listado de los usuarios del sistema]]></text> </staticText> </frame> </band> </title> <pageHeader> <band height="10"/> </pageHeader> <columnHeader> <band height="21"> <line> <reportElement x="-20" y="20" width="822" height="1" forecolor="#666666"/> </line> <staticText> <reportElement mode="Opaque" x="0" y="0" width="92" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Id]]></text> </staticText> <staticText>

Page 426: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

298

<reportElement mode="Opaque" x="92" y="0" width="111" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Usuario]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="203" y="0" width="110" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Rol]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="313" y="0" width="180" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Nombres]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="493" y="0" width="180" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Apellidos]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="673" y="0" width="129" height="20" forecolor="#006699" backcolor="#E6E6E6"/> <textElement textAlignment="Center"> <font size="12" isBold="true"/> </textElement> <text><![CDATA[Identificación]]></text> </staticText> </band> </columnHeader> <detail> <band height="20"> <line> <reportElement positionType="FixRelativeToBottom" x="0" y="17" width="802" height="1"/> </line> <textField isStretchWithOverflow="true"> <reportElement x="0" y="0" width="92" height="18"/> <textElement textAlignment="Center"> <font size="10"/> </textElement> <textFieldExpression class="java.lang.Integer"><![CDATA[$F{usuarios_id_usuario}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="92" y="0" width="111" height="18"/> <textElement>

Page 427: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

299

<font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{usuarios_usuario}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="203" y="0" width="110" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{roles_rol}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="313" y="0" width="180" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{usuarios_nombres}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="493" y="0" width="180" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{usuarios_apellidos}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true"> <reportElement x="673" y="0" width="129" height="18"/> <textElement> <font size="10"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{usuarios_identificacion}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band/> </columnFooter> <pageFooter> <band height="17"> <textField> <reportElement mode="Opaque" x="0" y="4" width="762" height="13" backcolor="#E6E6E6"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression> </textField> <textField evaluationTime="Report"> <reportElement mode="Opaque" x="762" y="4" width="40" height="13" backcolor="#E6E6E6"/> <textElement/>

Page 428: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

300

<textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> <textField pattern="EEEEE dd MMMMM yyyy"> <reportElement x="0" y="4" width="100" height="13"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression> </textField> </band> </pageFooter> <summary> <band/> </summary> </jasperReport>

Page 429: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMATICAS Y FISICAS

CARRERA DE INGENIERIA EN SISTEMAS

COMPUTACIONALES

IMPLEMENTACIÓN DE UN PROTOTIPO DE SISTEMA DE

ENVÍO DE PUBLICIDAD VÍA BLUETOOTH PARA UN

ALMACÉN DE MÚSICA, COMO APLICACIÓN DEL

CONCEPTO DE MARKETING DE PROXIMIDAD

MANUAL DE USUARIO

AUTOR: FAUSTO STANLEY ALMEIDA CAMPOS

TUTOR: ING. DAVID BENAVIDES

GUAYAQUIL – ECUADOR

2010

Guayaquil, 16 de agosto del 2010

Page 430: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

1 INSTALACIÓN

Page 431: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

303

1.1 REQUERIMIENTOS RECOMENDADOS DE HARDWARE

Si el computador solamente se encargará de ejecutar y mantener en línea el sistema

BlueCatch, se recomiendan los siguiente requerimientos de hardware:

- Procesador: Pentium Dual Core 2 GHz o equivalente.

- Memoria RAM: 1 Gb.

- Disco duro: 40 Mb (sólo el software1).

- Dispositivo transmisor de datos vía Bluetooth (USB)

1.2 REQUERIMIENTOS DE SOFTWARE

El computador deberá poseer los siguientes requisitos en cuanto a software se refiere:

- Sistema Operativo: Microsoft Windows XP Service Pack 3.

- Microsoft Bluetooth Stack (o algún software similar de terceros).

- Java Runtime Enviroment v.1.6 update 20 o superior.

- Base de datos MySQL v.5.1.46 o superior. Con una cuenta root y contraseña

mysql.

- Visor de archivos PDF. Por ejemplo: Adobe Reader.

Los pasos de instalación del Java Runtime Enviroment y la base de datos MySQL se

detallan como anexos a este documento.

1 Este espacio es necesario para la instalación del software únicamente. El espacio en disco duro

necesario para los datos que genere el sistema por la ejecución de las campañas se detalla en al Manual

Técnico del sistema.

Page 432: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

304

1.3 PASOS DE INSTALACIÓN

Para poder instalar el software solo es necesario seguir los siguientes pasos:

- Copiar la carpeta BlueCatch en el directorio raíz: C:\.

- Crear un acceso directo del archivo JABlueCatch.jar en el escritorio.

- Ejecutar desde el acceso directo creado.

Page 433: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

2 ORGANIZACIÓN DEL MENU

Page 434: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

306

2.1 ROL ADMINISTRADOR

2.1.1 Sistema

Menú que contiene las principales funciones administrativas del sistema.

- Crear usuario

- Consultar usuarios

- Parámetros generales

2.1.2 Campaña

Menú que contiene las principales funciones para administrar todas las campañas

publicitarias que se ejecuten desde el sistema.

- Crear campaña

- Consultar campañas

2.1.3 Reportes

Menú que contiene las opciones necesarias para ejecutar los reportes administrativos

y operativos del sistema.

- Reporte de usuarios

- Reporte de Bitácora por Campaña

Page 435: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

307

2.2 ROL OPERADOR

2.2.1 Sistema

Menú que contiene la función de cambio de clave del usuario respectivo.

- Cambiar clave

- Salir

2.2.2 Campaña

Menú que contiene las principales funciones para consultar todas las campañas

publicitarias que se ejecuten desde el sistema.

- Consultar campañas

2.2.3 Reportes

Menú que contiene las opciones necesarias para ejecutar los reportes operativos del

sistema.

- Reporte de Impacto de Campaña

- Reporte de Costos de Campañas

Page 436: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

3 OPCIONES DEL SISTEMA

Page 437: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

309

3.1 INICIO DEL SISTEMA

3.1.1 Login

Esta es la primera pantalla en aparecer. Sirve para ingresar las credenciales de inicio

de sesión de cada usuario. Dependiendo del rol que posea el usuario con el que se

inicia la sesión en el sistema, se activarán las opciones dentro del sistema.

Nombre de Campo Descripción del Campo

Usuario Nombre de usuario.

Clave Contraseña respectiva al usuario.

Botón Aceptar Inicia la sesión del sistema.

Botón Cancelar Cancela el inicio de sesión y finaliza el sistema.

Características

Se debe ingresar un usuario y una clave previamente configurados en el sistema.

3.2 ROL ADMINISTRADOR

3.2.1 Menú: Sistema

Page 438: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

310

3.2.1.1 Opción: Crear usuario

Esta opción dentro del menú Sistema permite al usuario administrador del sistema

crear nuevos usuarios administradores u operadores del sistema, con sus respectivos

datos personales.

Nombre de Campo Descripción del Campo

Nombre de usuario Nombre de usuario. Sólo se permiten letras en minúscula

y dígitos del 0 al 9.

Rol Rol que va a poseer el usuario que se está creando.

Clave Contraseña respectiva al usuario.

Reingrese la clave Aquí se vuelve a escribir la contraseña respectiva a

manera de confirmación.

Nombres Nombres del usuario respectivo.

Page 439: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

311

Apellidos Apellidos del usuario respectivo.

Identificación Número de cédula o pasaporte del usuario respectivo.

Estado Estado del usuario.

Botón Guardar Realiza las validaciones necesarias y guarda el nuevo

usuario en la base de datos.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

Un usuario creado como inactivo no podrá iniciar sesión en el sistema mientras el

administrador no lo active explícitamente.

3.2.1.2 Opción: Consultar usuarios

Esta opción dentro del menú Sistema permite al usuario administrador del sistema

consultar lo usuarios que se encuentran creados en el sistema.

Page 440: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

312

Nombre de Campo Descripción del Campo

Usuario Nombre de usuario completo o fracción del mismo. Se

utiliza para realizar la búsqueda por un patrón.

Nombres o Apellidos Nombres o apellidos completos del usuario o fracciones

de los mismos. Se utilizan para realizar la búsqueda por

un patrón.

Id Código del usuario.

Usuario Nombre de usuario.

Rol Rol que posee el usuario.

Nombres Nombres del usuario respectivo.

Apellidos Apellidos del usuario respectivo.

Botón Consultar Realiza la consulta de los usuarios de acuerdo a los

criterios ingresados.

Botón Cerrar Cierra la ventana y descarta cualquier cambio realizado.

Botón Ver Abre una ventana que permite visualizar los datos del

usuario seleccionado.

Botón Editar Abre una ventana que permite editar los datos del usuario

seleccionado.

Botón Eliminar Permite eliminar el usuario del sistema, previa

confirmación.

Características

El campo del formulario de criterios de búsqueda que quede vacío no se tomará en

cuenta para realizar la consulta.

3.2.1.2.1 Opción: Ver datos del usuario

Permite visualizar el detalle de los datos del usuario seleccionado.

Page 441: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

313

Nombre de Campo Descripción del Campo

Nombre de usuario Nombre de usuario. Sólo se permiten letras en minúscula

y dígitos del 0 al 9.

Rol Rol que va a poseer el usuario que se está creando.

Nombres Nombres del usuario respectivo.

Apellidos Apellidos del usuario respectivo.

Identificación Número de cédula o pasaporte del usuario respectivo.

Estado Estado del usuario.

Características

No aplica.

3.2.1.2.2 Opción: Editar datos del usuario

Permite editar el detalle de los datos del usuario seleccionado.

Page 442: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

314

Nombre de Campo Descripción del Campo

Nombre de usuario Nombre de usuario. Sólo se permiten letras en minúscula

y dígitos del 0 al 9.

Rol Rol que va a poseer el usuario que se está creando.

Clave Contraseña respectiva al usuario.

Reingrese la clave Aquí se vuelve a escribir la contraseña respectiva a

manera de confirmación.

Nombres Nombres del usuario respectivo.

Apellidos Apellidos del usuario respectivo.

Identificación Número de cédula o pasaporte del usuario respectivo

Estado Estado del usuario.

Botón Guardar Realiza las validaciones necesarias y guarda los cambios

realizados sobre el usuario en la base de datos.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

Un usuario con estado inactivo no podrá iniciar sesión en el sistema mientras el

administrador no lo active explícitamente.

Page 443: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

315

3.2.1.3 Opción: Parámetros generales

Esta opción dentro del menú Sistema permite al usuario administrador del sistema

modificar los valores de los parámetros del sistema.

Nombre de Campo Descripción del Campo

Tiempo de bloqueo

(min.)

Tiempo en minutos que deberá estar un dispositivo con

un estado de bloqueado antes de poder recibir otro

archivo de contenido nuevamente. Tiempo de restricción

después de cada envío exitoso hacia un dispositivo.

Ruta de reportes

exportados

Ruta del disco duro en donde se guardarán los reportes

generados por el sistema.

Botón Guardar Realiza las validaciones necesarias y guarda los cambios

realizados sobre los parámetros modificados.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

Ambos parámetros son obligatorios.

3.2.2 Menú: Campaña

Page 444: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

316

3.2.2.1 Opción: Crear campaña

Esta opción dentro del menú Campaña permite al usuario administrador del sistema

configurar una nueva campaña de marketing, así como sus principales parámetros de

envío y ejecución.

Page 445: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

317

Nombre de Campo Descripción del Campo

Nombre de la campaña Nombre que tendrá la nueva campaña que se está

configurando.

Descripción Descripción textual general o detallada acerca de la

campaña que se está configurando.

Tipo de la campaña Tipo de la campaña que se está creando. Puede ser

Operativa o Permanente. Una campaña Operativa

necesariamente debe tener una fecha de finalización. Por

el contrario, una campaña Permanente sólo toma en

cuenta la fecha de inicio configurada, ya que deberá ser

finalizada explícitamente por el administrador del

sistema.

Fecha inicio

(dd/mm/yyyy)

Fecha de inicio de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de inicio de la campaña, en el formato especificado.

Fecha fin (dd/mm/yyyy) Fecha de finalización de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de finalización de la campaña, en el formato

especificado.

Costo ref. por mensaje

($)

Costo referencial que tendrá cada mensaje de contenido

multimedia enviado. Este costo referencial es necesario

para poder tener un estimado del costo total de la

campaña que se reflejará en el reporte estadístico

correspondiente.

Archivos de audio a

enviar

En esta sección se agregan uno por uno los archivos de

audio (*.mp3) que se desean enviar durante la ejecución

de la campaña.

Archivos de imagen a

enviar

En esta sección se agregan uno por uno los archivos de

imagen (*.jpg) que se desean enviar durante la ejecución

de la campaña.

Botón Examinar Este botón abre un cuadro de selección de archivo. Sirve

para escoger cada uno de los archivos a enviar.

Botón X Este botón elimina la entrada correspondiente en la lista

de archivos a enviar.

Botón Guardar Realiza las validaciones necesarias y guarda la

configuración de la campaña creada.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

No se podrá crear una campaña mientras se encuentre en ejecución una campaña

permanente, así como no se podrá crear una campaña permanente mientras existan

configuradas campañas operativas que vayan a comenzar luego de la fecha de inicio

de la campaña que se está creando.

Como mínimo se deberá configurar un archivo de contenido a enviar, sea de audio o

de imagen.

Page 446: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

318

3.2.2.2 Opción: Consultar campañas

Esta opción dentro del menú Campaña permite al usuario administrador del sistema

consultar las campañas que se encuentran configuradas en el sistema.

Nombre de Campo Descripción del Campo

Nombre Campaña Nombre de la campaña completo o fracción del mismo.

Se utiliza para realizar la búsqueda por un patrón.

Fecha Referencial Fecha referencial de la campaña. Se utilizan para realizar

la búsqueda por un patrón.

Id Código de la campaña.

Campaña Nombre de la campaña.

Tipo Tipo de la campaña. Operativa o Permanente.

Fecha Inicio Fecha de inicio respectiva.

Fecha Fin Fecha de finalización respectiva.

Fase Fase en la que se encuentra actualmente la campaña.

Botón Consultar Realiza la consulta de las campañas de acuerdo a los

criterios ingresados.

Page 447: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

319

Botón Cerrar Cierra la ventana y descarta cualquier cambio realizado.

Botón Ver Abre una ventana que permite visualizar los datos de la

campaña seleccionada.

Botón Editar Abre una ventana que permite editar los datos de la

campaña seleccionada.

Botón Eliminar Permite eliminar la campaña del sistema, previa

confirmación.

Botón Finalizar Permite finalizar una campaña, guardando como fecha de

finalización la fecha actual. Se usa para terminar las

campañas permanentes explícitamente.

Características

El campo del formulario de criterios de búsqueda que quede vacío no se tomará en

cuenta para realizar la consulta.

No se puede editar una campaña que ya ha iniciado.

No se puede eliminar una campaña que ya ha iniciado.

No se puede finalizar una campaña que no ya ha iniciado

3.2.2.2.1 Opción: Editar configuración de la campaña

Page 448: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

320

Nombre de Campo Descripción del Campo

Nombre de la campaña Nombre que tendrá la nueva campaña que se está

configurando.

Descripción Descripción textual general o detallada acerca de la

campaña que se está configurando.

Tipo de la campaña Tipo de la campaña que se está creando. Puede ser

Operativa o Permanente. Una campaña Operativa

necesariamente debe tener una fecha de finalización. Por

el contrario, una campaña Permanente sólo toma en

cuenta la fecha de inicio configurada, ya que deberá ser

finalizada explícitamente por el administrador del

sistema.

Fecha inicio

(dd/mm/yyyy)

Fecha de inicio de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de inicio de la campaña, en el formato especificado.

Fecha fin (dd/mm/yyyy) Fecha de finalización de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de finalización de la campaña, en el formato

especificado.

Costo ref. por mensaje

($)

Costo referencial que tendrá cada mensaje de contenido

multimedia enviado. Este costo referencial es necesario

para poder tener un estimado del costo total de la

campaña que se reflejará en el reporte estadístico

correspondiente.

Archivos de audio a

enviar

En esta sección se agregan uno por uno los archivos de

audio (*.mp3) que se desean enviar durante la ejecución

de la campaña.

Archivos de imagen a

enviar

En esta sección se agregan uno por uno los archivos de

imagen (*.jpg) que se desean enviar durante la ejecución

de la campaña.

Botón Examinar Este botón abre un cuadro de selección de archivo. Sirve

para escoger cada uno de los archivos a enviar.

Botón X Este botón elimina la entrada correspondiente en la lista

de archivos a enviar.

Botón Guardar Realiza las validaciones necesarias y guarda la

configuración de la campaña creada.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

No se podrá cambiar el nombre de la campaña. No se podrá cambiar a una campaña permanente mientras existan configuradas

campañas operativas que vayan a comenzar luego de la fecha de inicio de la campaña

que se está modificando.

Como mínimo se deberá configurar un archivo de contenido a enviar, sea de audio o

de imagen.

Page 449: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

321

3.2.3 Menú: Reportes

3.2.3.1 Opción: Reporte de usuarios

Esta opción dentro del menú Reportes permite al usuario administrador del sistema

generar un reporte de todos los usuarios que se encuentran ingresados en el sistema,

así como también sus respectivos datos personales.

Nombre de Campo Descripción del Campo

Reporte de usuarios

hasta

Fecha actual del sistema. Los usuarios que se mostrarán

en el reporte serán todos aquellos creados hasta este

fecha.

Botón Generar Reporte Abre la ventana de visualización del reporte, desde donde

se podrá imprimir o guardar en algún dispositivo externo.

Características

No aplica.

3.2.3.2 Opción: Reporte de Bitácora por Campaña

Esta opción dentro del menú Reportes permite al usuario administrador del sistema

generar un reporte la bitácora de eventos de transferencia de contenido hacia los

dispositivos móviles que han ocurrido durante una determinada campaña.

Page 450: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

322

Nombre de Campo Descripción del Campo

Id campaña Código de identificación único de la campaña. Se lo

puede ingresar manualmente, o buscarlo por medio de la

lista de valores

Campaña Nombre de la campaña seleccionada.

Botón … Abre una lista de valores con las campañas que existen en

el sistema, que permitirá buscar fácilmente la campaña

necesaria y seleccionarla.

Botón Generar Reporte Abre la ventana de visualización del reporte, desde donde

se podrá imprimir o guardar en algún dispositivo externo.

Características

Es necesario escoger una campaña para poder ejecutar el reporte.

3.3 ROL OPERADOR

3.3.1 Menú: Sistema

3.3.1.1 Opción: Cambiar clave

Esta opción dentro del menú Sistema permite al usuario operador del sistema cambiar

su clave de ingreso, cambio que se hará efectivo instantáneamente.

Page 451: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

323

Nombre de Campo Descripción del Campo

Clave actual: Contraseña respectiva al usuario.

Nueva clave Nueva contraseña que el usuario desea establecer.

Reingrese la clave Aquí se vuelve a escribir la contraseña respectiva a

manera de confirmación.

Botón Guardar Realiza las validaciones necesarias y establece la nueva

contraseña para el usuario en la base de datos.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

No aplica.

3.3.2 Menú: Campaña

3.3.2.1 Opción: Consultar campañas

Esta opción dentro del menú Campaña permite al usuario operador del sistema

consultar las campañas que se encuentran configuradas en el sistema.

Page 452: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

324

Nombre de Campo Descripción del Campo

Nombre Campaña Nombre de la campaña completo o fracción del mismo.

Se utiliza para realizar la búsqueda por un patrón.

Fecha Referencial Fecha referencial de la campaña. Se utilizan para realizar

la búsqueda por un patrón.

Id Código de la campaña.

Campaña Nombre de la campaña.

Tipo Tipo de la campaña. Operativa o Permanente.

Fecha Inicio Fecha de inicio respectiva.

Fecha Fin Fecha de finalización respectiva.

Fase Fase en la que se encuentra actualmente la campaña.

Botón Consultar Realiza la consulta de las campañas de acuerdo a los

criterios ingresados.

Botón Cerrar Cierra la ventana y descarta cualquier cambio realizado.

Botón Ver Abre una ventana que permite visualizar los datos de la

campaña seleccionada.

Botón Finalizar Permite finalizar una campaña, guardando como fecha de

finalización la fecha actual. Se usa para terminar las

campañas permanentes explícitamente.

Características

El campo del formulario de criterios de búsqueda que quede vacío no se tomará en

cuenta para realizar la consulta.

No se puede finalizar una campaña que no ya ha iniciado

Page 453: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

325

3.3.2.1.1 Opción: Ver configuración de la campaña

Permite visualizar el detalle de la configuración de la campaña seleccionada.

Nombre de Campo Descripción del Campo

Nombre de la campaña Nombre que tendrá la nueva campaña que se está

configurando.

Descripción Descripción textual general o detallada acerca de la

campaña que se está configurando.

Tipo de la campaña Tipo de la campaña que se está creando. Puede ser

Operativa o Permanente. Una campaña Operativa

Page 454: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

326

necesariamente debe tener una fecha de finalización. Por

el contrario, una campaña Permanente sólo toma en

cuenta la fecha de inicio configurada, ya que deberá ser

finalizada explícitamente por el administrador del

sistema.

Fecha inicio

(dd/mm/yyyy)

Fecha de inicio de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de inicio de la campaña, en el formato especificado.

Fecha fin (dd/mm/yyyy) Fecha de finalización de la campaña, en el formato

especificado.

Hora (hh24 mi) Hora de finalización de la campaña, en el formato

especificado.

Costo ref. por mensaje

($)

Costo referencial que tendrá cada mensaje de contenido

multimedia enviado. Este costo referencial es necesario

para poder tener un estimado del costo total de la

campaña que se reflejará en el reporte estadístico

correspondiente.

Archivos de audio a

enviar

En esta sección se agregan uno por uno los archivos de

audio (*.mp3) que se desean enviar durante la ejecución

de la campaña.

Archivos de imagen a

enviar

En esta sección se agregan uno por uno los archivos de

imagen (*.jpg) que se desean enviar durante la ejecución

de la campaña.

Botón Examinar Este botón abre un cuadro de selección de archivo. Sirve

para escoger cada uno de los archivos a enviar.

Botón X Este botón elimina la entrada correspondiente en la lista

de archivos a enviar.

Botón Guardar Realiza las validaciones necesarias y guarda la

configuración de la campaña creada.

Botón Cancelar Cierra la ventana y descarta cualquier cambio realizado.

Características

No aplica.

3.3.3 Menú: Reportes

3.3.3.1 Opción: Reporte de Impacto de Campaña

Page 455: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

327

Esta opción dentro del menú Reportes permite al usuario operador del sistema generar

un reporte que presenta un resumido de la cantidad de transferencias exitosas durante

una campaña, permite medir el novel de efectividad de la campaña frente a los

clientes por medio de un gráfico circular dividido en secciones.

Nombre de Campo Descripción del Campo

Id campaña Código de identificación único de la campaña. Se lo

puede ingresar manualmente, o buscarlo por medio de la

lista de valores

Campaña Nombre de la campaña seleccionada.

Botón … Abre una lista de valores con las campañas que existen en

el sistema, que permitirá buscar fácilmente la campaña

necesaria y seleccionarla.

Botón Generar Reporte Abre la ventana de visualización del reporte, desde donde

se podrá imprimir o guardar en algún dispositivo externo.

Características

Es necesario escoger una campaña para poder ejecutar el reporte.

3.3.3.2 Opción: Reporte de Costos de Campañas

Esta opción dentro del menú Reportes permite al usuario operador del sistema generar

un reporte que presenta un gráfico de los costos que han tenido las campañas que se

han ejecutado en el rango especificado de fechas.

Page 456: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

328

Nombre de Campo Descripción del Campo

Fecha inicio

(dd/mm/yyyy)

Fecha de inicio del rango determinado, en el formato

especificado.

Fecha fin (dd/mm/yyyy) Fecha fin del rango determinado, en el formato

especificado.

Botón Generar Reporte Abre la ventana de visualización del reporte, desde donde

se podrá imprimir o guardar en algún dispositivo externo.

Características

Es necesario escoger una campaña para poder ejecutar el reporte.

3.4 MONITOR PRINCIPAL DEL SISTEMA

Esta es la pantalla principal del sistema y está habilitada tanto para los usuarios con

rol de Operador como para los usuarios con rol de Administrador.

Por medio de ella se podrá comenzar y detener la ejecución de una campaña de

marketing previamente configurada. También permite previsualizar los datos de la

campaña de marketing más próxima.

Page 457: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

329

Durante la jecución de la campaña, irá mostrando todos los dispositivos que va

encontrando así como también los estados correspondientes de cada transeferencia de

contenido multimedia hacia cada uno de estos dispositivos.

Una vez que exista una campaña cuya fecha de inicio haya iniciado, se podrá

comenzar a correr la ejecución de dicha campaña.

Page 458: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

330

Nombre de Campo Descripción del Campo

Campaña activa Nombre de la campaña activa.

Desde Fecha de inicio de la campaña activa.

Hasta Fecha de finalización programada para la campaña activa.

Si se trata de una campaña de tipo permanente, este

campo no aplica.

Siguiente campaña Nombre de la campaña configurada m;as próxima.

Desde Fecha de inicio de la campaña configurada m;as próxima.

Hasta Fecha de finalización programada para la campaña

configurada m;as próxima. Si se trata de una campaña de

tipo permanente, este campo no aplica.

CheckBox Forzar

reenvío

Si está activado, forza el reenvio de contenido multimedia

a los dispositivos sin tomar en cuenta si poseen o no un

estado bloqueado.

Botón Refrescar Vuelve a cargar las campañas en el monitor, actualizando

su ubicación, ya sea en el panel de Campaña Activa, o en

el panel de Siguiente Campaña.

Botón Iniciar campaña Inicia el proceso de envío de contenido para la campaña

activa.

Botón Detener campaña Pausa el proceso de envío de contenido para la campaña

activa.

Características

No aplica.

Page 459: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

4 REPORTES

Page 460: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

332

4.1 REPORTES ADMINISTRATIVOS

4.1.1 Reporte de usuarios

Nombre de Campo Descripción del Campo

Id Código del usuario.

Usuario Nombre de usuario.

Rol Rol que posee el usuario.

Nombres Nombres del usuario respectivo.

Apellidos Apellidos del usuario respectivo.

Identificación Número de cédula o pasaporte del usuario respectivo.

Características

No aplica.

Page 461: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

333

4.1.2 Reporte de Bitácora de Campaña

Nombre de Campo Descripción del Campo

Campaña Nombre de la campaña correspondiente.

Fecha Registro Fecha y hora en que se sucitó el evento de bitácora.

Nombre Dispositivo Nombre del dispositivo móvil sobre el cual ocurrió el

evento.

Dirección Dirección Bluetooth única del dispositivo móvil sobre el

cual ocurrió el evento de bitácora.

Observación Observación del evento de bitácora.

Usuario Usuario en cuya sesión ocurrió el evento de bitácora.

Archivo de contenido Ruta y nombre del archivo de contenido acerca de cuya

transferencia se registró el evento.

Características

A continuación de cada descripción de archivo de contenido, se mostrarán todos los

registros de eventos de bitácora correspondientes.

Page 462: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

334

4.2 REPORTES OPERATIVOS

4.2.1 Reporte de Impacto de Campaña

Nombre de Campo Descripción del Campo

Campaña Nombre y descripción de la campaña correspondiente.

Grupo Descripción de cada agrupación por tipo de transferencia.

Cantidad Cantidad de trasferencias de cada agrupación.

Características

Este reporte presenta un gráfico circular que permite demostrar de una manera más

amigable el resultado del impacto que ha tenido la campaña sobre los clientes.

Page 463: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

335

4.2.2 Reporte de Costos de Campañas

Nombre de Campo Descripción del Campo

Campaña Nombre de la campaña correspondiente.

Descripción Descripción de la campaña correspondiente.

Fecha de inicio Fecha de inicio de la campaña correspondiente.

Fecha de finalización Fecha de finalización de la campaña correspondiente.

Mensajes enviados Número total de mensajes enviados exitosamente durante

la campaña correspondiente.

Costo mensaje Costo referencial en dólares que tiene cada mensaje en la

campaña correspondiente.

Total Total de costo de la campaña correspondiente.

Características

Este reporte presenta un gráfico vectorial que permite demostrar de una manera más

precisa la variación de los costos de la campañas a tavés del tiempo.

Page 464: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5 ANEXOS

Page 465: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.1 INSTALACIÓN DE JAVA RUNTIME ENVIROMENT

Page 466: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 467: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido

5.2 INSTALACIÓN DE BASE DE DATOS MYSQL

Page 468: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 469: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 470: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 471: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 472: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido
Page 473: TOMO I Línea de Investigación Nombre del Egresado ... - UGrepositorio.ug.edu.ec/bitstream/redug/6818/1/Tesis Completa-278-20… · mi vida y todas mis decisiones, por haberme bendecido