Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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
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
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
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.
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.
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
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
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
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
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
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
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
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
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.
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.
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.
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.
1 CAPÍTULO I
EL PROBLEMA
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
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
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.
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.
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.
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
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
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.
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.
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.
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
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.
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.
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
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
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
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
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
2 CAPÍTULO II
MARCO TEÓRICO
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.
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
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
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.
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
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
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.
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.
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
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
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/
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
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.
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
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.
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
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
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.
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.
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).
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.
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.
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.
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,
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.
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.
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
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
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.
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.
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.
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.
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
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
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.
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.
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
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).
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
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.
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.
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. …
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?
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.
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
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.
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.
3 CAPÍTULO III
METODOLOGÍA
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í.
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
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
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
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.
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
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
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:
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
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
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
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
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
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
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
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
102
estos casos corresponden a teléfonos detectables por el sistema pero invalidados en el
momento de intentar el envío del contenido multimedia.
4 CAPÍTULO IV
MARCO ADMINISTRATIVO
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.
105
106
De acuerdo al cronograma anteriormente detallado, se generó el siguiente diagrama de Gantt.
107
108
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.
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
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.
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
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.
5 CAPÍTULO V
CONCLUSIONES Y RECOMENDACIONES
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.
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.
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.
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.
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
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
- 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
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
6 ANEXOS
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.
- 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
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.
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?
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.
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
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
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
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
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
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
1 MODELOS DE PROCESOS
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
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
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
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
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.
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
2 DESCRIPCIÓN DE ESTRUCTURAS DE DATOS
15
2.1 DIAGRAMA DEL MODELO ENTIDAD-RELACIÓN
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
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
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,
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
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
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).
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).
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
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.
3 MODELOS ORIENTADOS A OBJETOS
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
27
3.2 DIAGRAMAS DE CLASES
3.2.1 Clases POJOs de entidades. (com.jabluecatch.entidades)
28
3.2.2 Clases POJOs para objetos de transferencia de datos (com.jabluecatch.dto)
29
3.2.3 Clases para objetos de acceso a datos (com.jabluecatch.dao)
30
31
3.2.4 Clases para objetos de negocio (com.jabluecatch.bo)
32
33
3.2.5 Clases para objetos de operaciones de comunicación (com.jabluecatch.comm)
34
35
3.2.6 Clases para objetos de utilería general (com.jabluecatch.util)
36
37
3.2.7 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de sistema
(com.jabluecatch.gui.sistema)
38
39
3.2.8 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de Campaña
(com.jabluecatch.gui.campania)
40
41
3.2.9 Clases para objetos de interfaz gráfica de usuario correspondientes al menú de Reportes
(com.jabluecatch.gui.reportes)
42
43
3.2.10 Clases para objetos de interfaz gráfica de usuario generales (com.jabluecatch.gui)
4 CÓDIGO FUENTE DE LA APLICACIÓN
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;
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; }
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; } }
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;
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; }
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
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; }
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
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() {
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; }
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;
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
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; }
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; /**
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() {
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; }
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 {
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; } /**
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; } }
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;
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;
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() {
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; }
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());
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, "
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()));
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 {
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());
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, "
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 = ? "
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()) {
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));
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());
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;
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 {
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;
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, "
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, "
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 {
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, "
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 + "%");
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;
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();
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) {
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());
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 {
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);
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()); } }
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'");
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) {
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 {
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)); }
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()); }
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 {
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();
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()); } }
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, "
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()) {
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();
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;
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());
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
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");
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); }
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();
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
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()); }
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 {
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;
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 {
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; /**
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());
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
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 */
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;
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);
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() {
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(),
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;
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 {
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(),
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) {
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.
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.
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;
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);
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 {
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 {
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 {
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) {
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";
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()); }
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;
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); }
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]))
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);
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) {
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`");
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");
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) , "
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', "
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; }
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; } }
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; }
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() {
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();
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() {
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)
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) {
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());
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) {
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); } });
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)
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();
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) {
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() {
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.
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);
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)
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)
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;
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++) {
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 {
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:");
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)
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)
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) {
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(),
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)); }
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
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); } });
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)
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");
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); }
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));
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)
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))
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) {
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;
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:");
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); } });
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(
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());
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");
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) {
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); }
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;
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();
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);
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:");
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); } });
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);
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)
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)
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))))
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)
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)
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;
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");
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("")) {
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());
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());
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) {
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);
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;
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() {
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: ");
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);
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); } });
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) {
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()
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)
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))))
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)
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)
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) {
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; }
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;
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);
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);
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) { }
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());
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) {
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;
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);
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:");
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:");
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 ($):");
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()
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)
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)
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)
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()));
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;
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
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:");
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)
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)) );
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) {
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;
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) {
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)
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) {
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;
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);
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))
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; }
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
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:");
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(
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());
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); }
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");
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;
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();
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)
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;
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);
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)
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); }
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;
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();
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);
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() {
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);
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));
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)
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)
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) {
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();
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) {
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) {
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();
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;
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);
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; }
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
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">
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>
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>
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>
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>
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
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>
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"/>
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">
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>
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
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>
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>
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>
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
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>
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>
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/>
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>
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
1 INSTALACIÓN
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.
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.
2 ORGANIZACIÓN DEL MENU
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
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
3 OPCIONES DEL SISTEMA
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
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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.
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.
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.
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.
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
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
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
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.
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.
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.
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.
4 REPORTES
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.
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.
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.
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.
5 ANEXOS
5.1 INSTALACIÓN DE JAVA RUNTIME ENVIROMENT
5.2 INSTALACIÓN DE BASE DE DATOS MYSQL