scieee AI-readable full text Open interactive document viewer

Congrest: administración y gestión de congresos

Cueto Orrico, Sergio del

Full text

CONGREST. ADMINISTRACIÓN Y GESTIÓN DE CONGRESOS Directora: Ángeles Calduch Losa Titulación: ITIG 28/09/2011 Autor: Sergio del Cueto Orrico 2 ÍNDICE 1. Introducción 3 2. Objetivos 5 3. Descripción de la memoria 7 4. Preparación del servidor 8 4.1. Elección del servidor 8 4.2. Instalación del servidor 9 5. Instalación de Servicios de Internet Information Server 10 6. Asignar la IP a una DNS 15 7. Guía de usuario 18 7.1. Portada 19 7.2. Creación del congreso 21 7.3. Acceso a zona de gestión 23 7.4. Inscripciones 25 7.5. Hoteles 26 7.6. Habitaciones 28 7.7. Servicios 31 7.8. Talleres 32 7.9. Informes 33 7.10. Otras funciones 34 7.10.1.1. Contacto 35 7.10.1.2. Ubicación 36 7.10.1.3. Programa 37 8. Guía para el usuario avanzado 39 8.1. Estructura y creación de la Base de Datos 40 8.2. Hoteles 45 8.3. Habitaciones 49 8.4. Calendario 56 8.5. Informes 61 8.6. Mailing 70 3 INTRODUCCIÓN Para este Proyecto Final de Carrera se ha elegido realizar una aplicación integral para la creación y mantenimiento de congresos. Con ella se pueden crear congresos y sus participantes, tanto ponentes como asistentes. Además existe la posibilidad de dar de alta alojamientos para los participantes, servicios, talleres… así como la opción de realizar informes acerca de los participantes. Todo esto se explicará en los siguientes puntos con mas profundidad. En la realización del proyecto, se ha utilizado el programa Adobe Dreamweaver CS3, realizando toda la aplicación a partir de líneas de código. La plataforma elegida ha sido esta en lugar de otras opciones de desarrollo como Drupal o Plone, con el fin de aumentar los conocimientos del alumno y poder realizar un programa completo para que pueda estar mejor preparado para el mundo laboral. 4 5 OBJETIVOS El objetivo de este Proyecto Final de Carrera es poder hacer una aplicación integral online, y puesto que el alumno ha realizado la intensificación de Web, se han querido aplicar los conocimientos y aumentar la formación que se imparte actualmente en la Escuela de Informática, y obtener más competencias de tal forma que el alumno salga mejor preparado cuando acabe la carrera universitaria. De este modo se pretende tanto aplicar estos nuevos conocimientos en la vida laboral, como tener la posibilidad de buscar toda la información necesaria para realizar esta aplicación Web. 6 7 DESCRIPCIÓN DE LA MEMORIA En este Proyecto Final de Carrera se ha realizado un programa de gestión de congresos. Con esta aplicación Web, se pretende que se pueda englobar todos los aspectos del congreso. Este proyecto no es una página Web, como tantas otras, donde se pueda obtener información del congreso, como congresistas, obtener o visualizar el programa, información sobre la fecha, hora y el lugar… esta aplicación va más encaminada a la administración de cualquier tipo de congreso, desde un congreso de médicos a un congreso de franquicias. Al ser tan genérico, la gran mayoría de las características pueden ser usadas siempre independientemente del tipo de congreso. Otra característica de este proyecto es la posibilidad de ser una aplicación en dos sentidos, es decir que puede ser usada tanto para los organizadores del congreso como para los participantes en el mismo. Mientras los organizadores pueden ir introduciendo la inscripción por asistente o el precio de algún tipo de servicio (restaurante, cursos…), un ponente se puede dar de alta para asistir al congreso. Entre las funcionalidades que tiene esta aplicación cabe destacar las siguientes: • Creación automática de toda la Base de Datos. • Mantenimiento de las personas que asistirán al congreso, diferenciando entre congresistas o asistentes. • Mantenimiento de los hoteles y habitaciones para el congreso. • Posibilidad de ofrecer tanto a los congresistas como a los asistentes la realización de cursos y talleres. 8 PREPARACIÓN DEL SERVIDOR ELECCIÓN DEL SERVIDOR Para que funcione esta aplicación Web en el servidor hay varios sistemas, los cuales se clasifican en dos tipos bien diferenciados: - Un servidor que no esté físicamente al alcance. - Un servidor que si esté físicamente al alcance. Para hablar con más profundidad de estos dos sistemas, entendemos que los servidores están físicamente al alcance cuando éste se puede tocar, ya sea en una casa, un ordenador propio, el de algún conocido… mientras que los que no están al alcance se refiere a servidores que se compre o se alquile y se pueda usar como mejor convenga. Servidor que no esté físicamente al alcance. Este tipo de servidor funciona prácticamente igual que uno al que se puede acceder físicamente, con la ventaja de que quien suministra el ordenador te da fiabilidad siempre de red, más velocidad de la que puedas acceder en tu hogar, y siempre está encendido y en funcionamiento. Servidor que sí esté físicamente al alcance. Por el contrario, en un ordenador que esté al alcance se podrá tener más control sobre el mismo y tiene la ventaja de ser más barato. En el caso concreto de la aplicación desarrollada en este trabajo que es una aplicación Web que estará en funcionamiento cuando el administrador lo desee, es suficiente con este tipo de servidor, así que cuando más adelante se empiece a explicar la instalación del servidor en el siguiente apartado, se referirá a la instalación del servidor en un ordenador convencional. 9 INSTALACIÓN DEL SERVIDOR Al igual que ha pasado con la elección del servidor, aquí también se ha de escoger un servidor Web y sobre qué plataforma instalarlo, para ello se explicará la diferencia entre 2 servidores Web: Apache y el SIIS de Windows. - Apache: se puede instalar tanto en Linux como en Windows, si bien es cierto que es el servidor Web más reconocido y que más usuarios usa para poder administrar su sitio Web, sus características de seguridad dan muchísima diversidad a la hora de poder configurarlo como sitio Web. - SIIS. Este servidor Web sólo funciona en Windows, y es una utilidad que tiene Windows (en este caso Windows XP), tan sólo hay que instalarla mediante el CD de instalación. Se ha elegido el servidor Web de SIIS por varias razones, primero porque el alumno nunca ha tenido la oportunidad de usar este servidor Web al contrario que el Apache, y al ser una aplicación en la que no se va a necesitar un nombre de dominio (este punto se explicará mas adelante como tener un nombre asignado a una IP sin tener nombre de dominio), se ha creído mas conveniente usar esta plataforma. Este servidor Web es usado por varias Webs, aquí un ejemplo, la página Web de un famoso periodista deportivo. 16 El programa una vez ejecutado es el siguiente: De esta forma se obtiene de forma totalmente automática, y sin necesidad de preocuparse, la dirección IP asignada a la DNS elegida. 17 18 GUÍA DE USUARIO En este apartado se llevará a cabo una guía de usuario explicando todo el funcionamiento de este Proyecto Final de Carrera, tanto el funcionamiento principal como cosas más concretas. En esta guía de usuario se tratará exclusivamente de explicar todo el proyecto a nivel de usuario, no se tratará nada la cuestión de código ni funciones avanzadas, ya que este punto se explicará posteriormente. Para la realización de esta guía de usuario se creará un congreso desde el principio, añadiendo todas las funcionalidades que permite esta aplicación. 19 PORTADA Esta es la portada principal de la aplicación Web, desde aquí se puede crear un nuevo congreso, entrar y modificar un congreso actual creando talleres, habitaciones, acompañantes… y también se puede acceder a la zona privada. Otra opción es que al elegir un congreso se puede incluir a un asistente y clasificarlo dependiendo de las categorías que hayamos creado, y luego también está la posibilidad de modificar este registro a partir de un usuario y una contraseña que se decidirá si se le ofrece a los usuarios o no. 20 CREACIÓN DEL CONGRESO Para empezar con esta guía, cómo no, hay que crear el congreso, para ello sólo hay que darle al botón de CREAR CONGRESO. Después de rellenar todos los datos del congreso como hacemos a continuación y darle al botón de CREAR CONGRESO, nuestro congreso estará automáticamente creado. 21 Como se puede ver, el nombre del congreso se llama proyecto, los campos a rellenar son: - Nombre del congreso. - Sede donde se va a realizar. - Quien lo organiza. - Banco para transferencias. - Cuenta del Banco. - Código para transferencias. - Fecha de inicio. - Fecha de fin. - Nombre Base de Datos. Una vez creado el congreso, se crea automáticamente en la carpeta Congresos\BD una Base de Datos con el nombre que le hemos puesto .mdb, tal y como se puede observar a continuación. Automáticamente, al rellenar este formulario se crean varias tablas dentro de la Base de Datos para alojar toda la información que añadiremos más tarde, como los acompañantes, habitaciones, talleres, servicios… Esta es la estructura de la Base de Datos en cuanto a tablas se refiere, todas creadas automáticamente al dar de alta la Base de Datos. 22 En cuanto a los campos o la estructura interna de cada tabla, se comentará en la otra guía para usuarios avanzados. En esta guía solo se tratará el pleno funcionamiento de la aplicación sin entrar en ningún detalle de implementación o desarrollo. 23 ACCESO A ZONA DE GESTIÓN Desde este apartado podemos crear los servicios propios de este congreso, como son dar de alta hoteles, servicios, talleres… Para ello, sólo tenemos que seleccionar el congreso que queremos gestionar. Una vez seleccionado el congreso hay que pulsar sobre el botón de ACCESO A LA ZONA DE GESTIÓN. De este modo sale un panel de gestión en el que se puede dar de alta todos los servicios relacionados con nuestro congreso creado anteriormente. Desde la pantalla principal sólo hay que seleccionar el congreso y pulsar sobre el botón de ACCESO A LA ZONA DE GESTIÓN: Una vez hecho esto, nos saldrá esta pantalla de la que se explicará cada punto con más detalle. A la hora de explicar como añadir ciertos complementos al congreso, se limitará a exponer como añadir y como listar cada elemento, a no ser que haya alguna funcionalidad que se deba ver más detalladamente. 24 25 INSCRIPCIONES En la siguiente imagen se muestra el menú de inscripciones, donde podremos dar de alta, modificar, borrar… Para insertar una inscripción sólo hay que añadir una serie de campos, y automáticamente se añadirá en la Base de Datos de este congreso. Luego, estas inscripciones se asignaran a los ponentes, congresistas o asistentes para que cada uno de ellos tenga una inscripción y por lo tanto un importe distinto. Más adelante veremos cómo relacionar estas inscripciones con los asistentes y como podemos filtrar por inscripción para buscar cualquier asistente. 32 TALLERES En este apartado se explicarán los talleres. Esta sección está pensada para poder relacionar para el congreso los talleres que se quiera ofrecer o contratar a los congresistas o participantes en el congreso. Tal y como se ha hecho anteriormente tanto la inserción como el listado se realiza de forma similar, de esta forma es mucho más fácil para el usuario si ve que el sistema es similar en todos los casos y la interfaz la misma. En este caso en concreto se ha insertado un taller para la conversación en público, tal y como se muestra en esta imagen. Y una vez insertado se pueden visualizar todos los talleres o filtrarlos por hotel. 33 INFORMES En cuanto a los informes sí que se le dedicará algunas líneas más, puesto que no es como anteriormente que se crean diferentes registros y luego se visualizan. En este caso, esta característica es para sacar informes en Excel sobre los participantes del congreso. Una vez que se selecciona esta opción, se puede filtrar lo que se quiere que se visualice en el informe. Seleccionando los campos de datos personales que se desea, automáticamente se abre un fichero Excel con los participantes de la Base de Datos y los campos seleccionados anteriormente. Una muestra sería: Después de seleccionar los campos que necesitemos y darle al botón de Aceptar se muestra en la misma pantalla la hoja Excel. 34 OTRAS FUNCIONES Ora de las características es la el apartado de otras funciones, donde podemos consultar tanto la información del contacto del congreso, la ubicación de mismo o los programas tanto en formato word como en pdf, tal y como se puede ver a continuación. 35 CONTACTO Este subapartado que se puede encontrar en el “Otras funciones” tenemos el teléfono de contacto y la dirección de correo electrónica para mandar cual duda o cualquier pregunta sobre el congreso. 36 UBICACIÓN Aquí se puede encontrar la ubicación del congreso tanto la dirección como un mapa con la ubicación exacta. 37 PROGRAMA Aquí se puede encontrar el programa del congreso, tanto el horario de las actividades como el horario de los actos. 38 39 GUIA PARA EL USUARIO AVANZADO Ahora se va a pasar a la parte de la guía para el usuario avanzado. Con esta guía se tratará desde la estructura de la Base de Datos, al código necesario para la creación de la misma como explicación de distintos apartados mediante las líneas de código. 40 ESTRUCTURA Y CREACIÓN DE LA BASE DE DATOS Desde aquí se puede ver la estructura con las tablas de la Base de Datos, a partir de estas tablas se obtiene toda la información relativa por cada congreso y las relaciones entre ellas. Las tablas tienen las relaciones necesarias entre ellas para que toda la información que se introduzca para cada congreso quede bien reflejada y bien relacionada, de tal forma que por ejemplo desde la reserva de una habitación o del taller se sabe quien es la persona que lo ha hecho, todo desde las claves primarias entre las tablas. 41 Al ver la estructura de alguna tabla se puede observar lo dicho anteriormente, como el identificador del usuario esta presente en la gran mayoría de las tablas, en este caso es la tabla de la reserva de las habitaciones. De la creación automática de la Base de Datos se encarga el fichero crea_basededatos.asp. Cada vez que un congreso se crea desde cero, se llama a este fichero donde genera, con comandos SQL, todas las tablas necesarias. Para cada congreso se crea un fichero .mdb con la misma estructura, el nombre del fichero es el que se inserta en el formulario de creación del congreso. Este es el contenido completo del fichero crea_basededatos.asp. <% Function crea_basedatos (congreso) Set basedatos = CreateObject("ADOX.Catalog") basedatos.Create "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=" & Server.MapPath("/CONGRESOS/BD/"&congreso&".mdb") Set basedatos = Nothing Set Conector = Server.CreateObject("ADODB.Connection") Conector.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/CONGRESOS/BD/"&congreso&".mdb")) 'Crea la tabla de acompanyants sql = "CREATE TABLE acompanyantes " sql = sql & "(id AUTOINCREMENT PRIMARY KEY, " 48 %> </TABLE> <% Response.ContentType = "application/vnd.ms-excel" %> Como se acaba de comentar, se crea una tabla, y en cada columna se escribe la información relativa a cada campo de los hoteles de la Base de Datos. Al hacer un SELECT se obtienen todos los datos, así que se crea un bucle y por cada hotel obtenido en el bucle se escribe en la tabla creada. Por último queda hablar de la eliminación de los hoteles, para ello, al igual que se hizo con la actualización de los datos, hay que seleccionar el hotel que se quiere borrar de la Base de Datos. Para la realización de esto usamos esta sintaxis de SQL: sql = "DELETE FROM hoteles WHERE id = "&Request.Form("select")&"" 49 HABITACIONES Ahora se va a proceder a comentar el funcionamiento en cuanto al código y a la lógica empleada para el desarrollo de esta parte del Proyecto Final de Carrera. La inserción en la Base de Datos de las habitaciones es muy parecida a la de los hoteles, aunque la gran diferencia es que toda habitación está asociada a un hotel. A la hora de insertar una habitación hay que seleccionar un hotel, por lo que esto incluye una consulta SQL. Estos nombres de hoteles se insertan en un formulario de tipo “select” y se introducen todos los demás datos. Después de comprobación de ciertos datos, como validar que no estén vacíos los campos obligatorios, se inserta en la Base de Datos mediante una sentencia INSERT <% congreso=Request.QueryString("congreso") hotel=Ucase(Request.Form("hotel")) tipo=Ucase(Request.Form("tipo")) numero=Request.Form("numero") fechai=Request.Form("fechai") fechaf=Request.Form("fechaf") precio=Request.Form("precio") fechai=DateValue(fechai) fechaf=DateValue(fechaf) 'COMPROBAR DATES if not isDate(fechai) = True or not isDate (fechaf) = True or fechai >= fechaf then call Error("Introduzca correctamente las fechas") End if 'COMPROBAR CAMPOS OBLIGATORIOS If hotel="" or tipo="" or numero="" or precio="" Then Error("Rellene todos los campos") Else 'COMPROBAR CAMPOS NUMERICOS (numero y precio) If not isNumeric(numero) or not isNumeric(precio) Then 'es numerico call Error("Introducir valores numéricos en los campos Numero y Precio") Else 50 Set Conex=Server.CreateObject("ADODB.Connection") Conex.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/CONGRESOS/BD/"&congreso&".mdb")) 'Insertar hotel en BD sql = "INSERT INTO habitaciones (nombre,tipo,numero,disponibles,fechai,fechaf,precio) VALUES ('"&hotel&"','"&tipo&"','"&numero&"','"&numero&"','"&fechai&"','"&fechaf&"' ,'"&precio&"')" Conex.Execute sql Set Conex = Nothing End If End If Response.Redirect("habitaciones.asp?congreso="&congreso&"") %> En cuanto al resto de las funcionalidades de las habitaciones, cabe decir que la mayoría están en otro fichero aparte. En este caso, el fichero se llama general.asp y se encuentra en el directorio habitaciones, al igual que los demás ficheros correspondientes a este apartado. <% public x(100) public num(100) public i Function leer () Set Conex=Server.CreateObject("ADODB.Connection") Conex.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/CONGRESOS/BD/"&congreso&".mdb")) Set RS = Server.CreateObject("ADODB.RecordSet") sql= "SELECT nombre FROM hoteles" RS.open sql,Conex,1 i=0 While not RS.EOF x(i) = RS("nombre") RS.Movenext i=i+1 WEnd Set RS = Nothing Set Conex = Nothing End Function %> <% Function seleccion_habitacion ( valor,congreso ) 51 if StrComp(valor,"borrar") = 0 Then pagina = "desa_habitaciones.asp?congreso="&congreso&"" Else if Strcomp(valor,"habilitar") = 0 Then pagina = "habi_habitaciones.asp?congreso="&congreso&"" Else if strcomp(valor,"eliminar") = 0 then pagina = "borrar_habitaciones.asp?congreso="&congreso&"" else if strcomp(valor,"modificar") = 0 Then pagina= "modificar.asp?congreso="&congreso&"" else pagina = "busqueda.asp?congreso="&congreso&"" End if End if End if End if %> <html> <head> <title>Documento sin título</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script language="JavaScript"> function goToUrl( congreso ) { window.location="habitaciones.asp?congreso="+congreso+""; } </script> <link href="../adjuntos/estilo.css" rel="stylesheet" type="text/css"> </head> <body> <form name="form1" method="post" action="<%=pagina%>"> <table width="100%" border="0" cellspacing="0"> <tr> <td width="16%"><p>Hotel</p> </td> <td width="84%"><select name="select"> <option value="*">Todos</option> <%call leer For j=0 To i-1 step 1%> <option value="<%=x(j)%>"> <%=x(j)%> </option> <%Next%> </select></td> </tr> <tr> <td>Tipo Hab. </td> <td><select name="select2"> <option value="*">Todas</option> <option value="Individual">Individual</option> 52 <option value="Doble">Doble</option> <option value="DUI">DUI</option> <option value="Triple">Triple</option> <option value="Suite Junior">Suite Junior</option> <option value="Suite">Suite</option> </select></td> </tr> <%If Strcomp(valor,"listar") = 0 Then%> <tr> <td>Mostrar no habilitadas</td> <td><input name="habilitadas" type="checkbox" id="habilitadas" value="Verdadero"></td> </tr> <%End If%> <tr> <td></td> <td><input name="Buscar" type="submit" id="Buscar" value="Buscar"></td> </tr> </table> </form> <% End Function Function mostrar (valor,congreso) Set Conex=Server.CreateObject("ADODB.Connection") Conex.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/CONGRESOS/BD/"&congreso&".mdb")) Set RS = Server.CreateObject("ADODB.RecordSet") hotel= Request.Form("select") tipo = Request.Form("select2") hab = Request.Form("habilitadas") pagina = "habitaciones1.asp?congreso="&congreso&"" if strcomp(valor,"modificar") = 0 Then pagina = "modificar1.asp?congreso="&congreso&"" End if if strcomp(valor,"habilitar") = 0 or strcomp(valor,"eliminar") = 0 or strcomp(valor,"modificar") = 0 then hab= "Verdadero" End if primero1 = "HOTEL" segundo1 = "TIPO" primero = "NOMBRE" segundo = "TIPO" If hotel <> "*" Then 53 primero1 = "HOTEL" segundo1 = "TIPO" primero = "NOMBRE" segundo = "TIPO" If tipo <> "*" Then sql= "SELECT * FROM habitaciones WHERE nombre='"&hotel&"' AND tipo='"&tipo&"'" Else sql= "SELECT * FROM habitaciones WHERE nombre='"&hotel&"'" End If Else If tipo <> "*" Then primero1 = "TIPO" segundo1 = "HOTEL" primero = "TIPO" segundo = "NOMBRE" sql= "SELECT * FROM habitaciones WHERE tipo='"&tipo&"'" Else sql= "SELECT * FROM habitaciones " End If End If RS.open sql,Conex,1 %> <table width="100%" border="2" align="center" cellspacing="1" bordercolor="#FFFFFF"> <tr> <td class="sidebarHeader"><div align="center">NUMERO</div></td> <td class="sidebarHeader"><div align="center"><%=primero1%></div></td> <td class="sidebarHeader"><div align="center"><%=segundo1%></div></td> <td class="sidebarHeader"><div align="center">TOTAL</div></td> <td class="sidebarHeader"><div align="center">DISPONIBLES</div></td> <td class="sidebarHeader"><div align="center">FECHA INICIO</div></td> <td class="sidebarHeader"><div align="center">FECHA FIN</div></td> <td class="sidebarHeader"><div align="center">IMPORTE</div></td> <td class="sidebarHeader"><div align="center">ESTADO</div></td> </tr> <% for z=0 to 99 step 1 num(z)= null next i=0 54 While not RS.EOF if strcomp(hab,"Verdadero") <> 0 and strcomp(RS ("habilitada"), "Verdadero") <> 0 then Else If strcomp(valor,"habilitar") = 0 and strcomp(RS ("habilitada"), "Verdadero") = 0 then Else num(i)= RS ("id") i=i+1 if i MOD 2 <> 0 then color = "CCCCCC" else color = "DCDCDC" end if%> <form name="form<%=i%>" method="post" action="<%=pagina%>"> <tr bgcolor="#<%=color%>" class="big"> <td><div align="center"> <input name="select" type="text" value="<%=RS("id")%>" readonly="true" size="5" align="middle"> <%if Strcomp(valor,"listar") <> 0 Then%> <input name="oculto" type="hidden" value="<%=valor%>"> <input name="Aceptar" type="submit" id="Aceptar2" value="Aceptar"> <%Else i=i+1 End If%> </div></td> <td><div align="center"><%=RS (""&lcase(primero)&"")%></div></td> <td><div align="center"><%=RS (""&lcase(segundo)&"")%></div></td> <td><div align="center"><%=RS ("numero")%></div></td> <td><div align="center"><%=RS ("disponibles")%></div></td> <td><div align="center"><%=RS ("fechai")%></div></td> <td><div align="center"><%=RS ("fechaf")%></div></td> <td><div align="center"><%=RS ("precio")%></div></td> <%If StrComp(RS ("habilitada"),"Verdadero") = 0 Then%> <td><div align="center" class="<%=estilo%>">ACTIVA</div></td> <%Else%> <td><div align="center" class="<%=estilo%>">NO ACTIVA</div></td> <%End If%> </tr> <%End if End if i=i+1 RS.Movenext%> </form> <%WEnd%> 55 </table> <% RS.close Conex.close Set RS = Nothing Set Conex = Nothing End Function %> </body> </html> 56 CALENDARIO El calendario que sale cuando, por ejemplo, se va a insertar una habitación, se obtiene mediante javascript. A continuación se puede ver una captura de dicho calendario. 57 El código para implementar este calendario es el siguiente: function show_calendar(str_target, str_datetime) { var arr_months = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]; var week_days = ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]; var n_weekstart = 1; // day week starts from (normally 0 or 1) var dt_datetime = (str_datetime == null || str_datetime =="" ? new Date() : str2dt2(str_datetime)); var dt_prev_month = new Date(dt_datetime); dt_prev_month.setMonth(dt_datetime.getMonth()-1); var dt_next_month = new Date(dt_datetime); dt_next_month.setMonth(dt_datetime.getMonth()+1); var dt_firstday = new Date(dt_datetime); dt_firstday.setDate(1); dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7); var dt_lastday = new Date(dt_next_month); dt_lastday.setDate(0); // html generation (feel free to tune it for your particular application) // print calendar header var str_buffer = new String ( "<html>\n"+ "<head>\n"+ " <title>Calendario</title>\n"+ "</head>\n"+ "<body bgcolor=\"White\">\n"+ "<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+ "<tr><td bgcolor=\"#4682B4\">\n"+ "<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">\n"+ "<tr>\n <td bgcolor=\"#4682B4\"><a href=\"javascript:window.opener.show_calendar('"+ str_target+"', '"+ dt2dtstr2(dt_prev_month)+"');\">"+ "<img src=\"/congresos/gestion/calendario/prev.gif\" width=\"16\" height=\"16\" border=\"0\""+ " alt=\"previous month\"></a></td>\n"+ " <td bgcolor=\"#4682B4\" colspan=\"5\">"+ "<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">" +arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</font></td>\n"+ 64 <% end if if not servicios = "" then %> <TH>Servicios <% end if if not talleres = "" then %> <TH>Talleres <% end if if not estado = "" then %> <TH>Estado Inscrip. <% end if if not tipo = "" then %> <TH>Tipo Inscrip. <% end if if not pago = "" then %> <TH>Pago Realizado <% end if if not total = "" then %> <TH>Total <% end if if not observaciones = "" then %> <TH>Observaciones <% end if %> </TR> <% congreso=Request.QueryString ("congreso") Set Conex=Server.CreateObject("ADODB.Connection") Conex.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/congresos/BD/"&congreso&".mdb")) Set RS = Server.CreateObject("ADODB.RecordSet") sql = "SELECT * FROM inscripciones" RS.open sql,Conex,1 i=0 While not RS.EOF if not fini="" and not ffin="" then fecha=RS.Fields("Idinscripcion") fecha=left(fecha,8) 65 if fecha < ffin and fecha > fini then tip=RS.Fields("tipo") tot=RS.Fields("precio_ins_final") obser=RS.Fields("observacionesfact") %> <TR> <%if not nombre = "" then%> <TD><%=RS.Fields("nombre")%></TD><% end if if not ape = "" then%> <TD><%=RS.Fields("apellido1")%> <%=RS.Fields("apellido2")% ></TD><% end if if not cargo = "" then%> <TD><%=RS.Fields("cargo")%></TD><% end if if not empresa = "" then If tipo="ESTUDIANTE" Then %> <TD><%=RS.Fields("centro")%></TD> <% Else %> <TD><%=RS.Fields("empresa")%></TD> <% End If end if if not cif = "" then%> <TD><%=RS.Fields("ciffact")%></TD><% end if if not dir = "" then%> <TD><%=RS.Fields("direccion")%></TD><% end if if not cp = "" then%> <TD><%=RS.Fields("cp")%></TD><% end if if not loc = "" then%> <TD><%=RS.Fields("ciudad")%></TD><% end if if not prov = "" then%> <TD><%=RS.Fields("provincia")%></TD><% end if if not telf = "" then%> <TD><%=RS.Fields("telf1")%></TD><% end if if not fax = "" then%> <TD><%=RS.Fields("fax")%></TD><% end if if not mov = "" then%> 66 <TD><%=RS.Fields("telf2")%></TD><% end if if not mail = "" then%> <TD><%=RS.Fields("email")%></TD><% end if if not servicios = "" then Set RS2 = Server.CreateObject("ADODB.RecordSet") sql2 = "SELECT nombre FROM reserva_servicio WHERE usuario ='"&RS.Fields("usuario")&"'" RS2.open sql2,Conex,1 %><TD>A <% While not RS2.EOF %><%=RS2.Fields("nombre")&" - "%><% RS2.MoveNext Wend %></TD><% RS2.close end if if not talleres = "" then Set RS2 = Server.CreateObject("ADODB.RecordSet") sql2 = "SELECT nombre FROM reserva_taller WHERE usuario ='"&RS.Fields("usuario")&"'" RS2.open sql2,Conex,1 %><TD><% While not RS2.EOF %><%=RS2.Fields("nombre")&" - "%><% RS2.MoveNext Wend %></TD><% RS2.close end if if not estado = "" then%> <TD><%=RS.Fields("estado")%></TD><% end if if not tipo = "" then%> <TD><%=tip%></TD><% end if if not pago = "" then if RS.Fields("estado")="CONFIRMADO" then%> <TD>Si</TD><% else%><TD>No</TD><% end if end if if not total = "" then%> <TD><%=tot%></TD><% 67 end if if not observaciones = "" then%> <TD><%=obser%></TD><% end if %> </TR> <% RS.Movenext else if not RS.EOF then RS.Movenext end if end if else tip=RS.Fields("tipo") tot=RS.Fields("precio_ins_final") obser=RS.Fields("observacionesfact") %> <TR> <%if not nombre = "" then%> <TD><%=RS.Fields("nombre")%></TD><% end if if not ape = "" then%> <TD><%=RS.Fields("apellido1")%> <%=RS.Fields("apellido2")% ></TD><% end if if not cargo = "" then%> <TD><%=RS.Fields("cargo")%></TD><% end if if not empresa = "" then If tipo="ESTUDIANTE" Then %> <TD><%=RS.Fields("centro")%></TD> <% Else %> <TD><%=RS.Fields("empresa")%></TD> <% End If end if if not cif = "" then%> <TD><%=RS.Fields("ciffact")%></TD><% end if if not dir = "" then%> <TD><%=RS.Fields("direccion")%></TD><% end if if not cp = "" then%> <TD><%=RS.Fields("cp")%></TD><% end if 68 if not loc = "" then%> <TD><%=RS.Fields("ciudad")%></TD><% end if if not prov = "" then%> <TD><%=RS.Fields("provincia")%></TD><% end if if not telf = "" then%> <TD><%=RS.Fields("telf1")%></TD><% end if if not fax = "" then%> <TD><%=RS.Fields("fax")%></TD><% end if if not mov = "" then%> <TD><%=RS.Fields("telf2")%></TD><% end if if not mail = "" then%> <TD><%=RS.Fields("email")%></TD><% end if if not servicios = "" then Set RS2 = Server.CreateObject("ADODB.RecordSet") sql2 = "SELECT nombre FROM reserva_servicio WHERE usuario ='"&RS.Fields("usuario")&"'" RS2.open sql2,Conex,1 %><TD><% While not RS2.EOF %><%=RS2.Fields("nombre")&" - "%><% RS2.MoveNext Wend %></TD><% RS2.close end if if not talleres = "" then Set RS2 = Server.CreateObject("ADODB.RecordSet") sql2 = "SELECT nombre FROM reserva_taller WHERE usuario ='"&RS.Fields("usuario")&"'" RS2.open sql2,Conex,1 %><TD><% While not RS2.EOF %><%=RS2.Fields("nombre")&" - "%><% RS2.MoveNext Wend %></TD><% RS2.close end if if not estado = "" then%> 69 <TD><%=RS.Fields("estado")%></TD><% end if if not tipo = "" then%> <TD><%=tip%></TD><% end if if not pago = "" then if RS.Fields("estado")="CONFIRMADO" then%> <TD>Si</TD><% else%><TD>No</TD><% end if end if if not total = "" then%> <TD><%=tot%></TD><% end if if not observaciones = "" then%> <TD><%=obser%></TD><% end if %> </TR> <% i=i+1 RS.MoveNext end if Wend RS.close Conex.close Set RS = Nothing Set Conex = Nothing %> </TABLE> <% Response.ContentType = "application/vnd.ms-excel" %> 70 MAILING Ahora se va a exponer el funcionamiento del mailing. Esta característica consiste en mandar correos electrónicos a los participantes del congreso. Se puede tanto enviar correos electrónicos a las personas que se desee o bien mandar correos masivos a todos los participantes del congreso seleccionado. El código necesario para el envío de estos mails en el siguiente: <% Function envia_mail (destinatario,asunto,cuerpo,de,adjunto,congreso) Dim Mail set Mail=Server.CreateObject("Persits.MailSender") Set Con_mail = Server.CreateObject("ADODB.Connection") Set RS_mail = Server.CreateObject("ADODB.Recordset") Con_mail.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/CONGRESOS/BD/central.mdb")) sql_mail= "SELECT * FROM congresos WHERE nombrecongreso='"&congreso&"'" RS_mail.open sql_mail,Con_mail,1 emailcongreso=RS_mail.Fields("emailcongreso") Con_mail.Close Set RS_mail = Nothing Set Con_mail = Nothing Mail.Host = "mail.aztess.com" Mail.From= emailcongreso Mail.FromName = de Mail.AddAddress destinatario Mail.Subject = asunto Mail.Body = cuerpo if not adjunto="" then Mail.AddAttachment "c:\Inetpub\wwwroot\CONGRESOS\adjuntos\"&adjunto end if Mail.Send On Error Resume Next if Err <> 0 Then Response.Write ( "Error: " & Err.Description ) 71 End if End Function %> Para el envío de correos electrónicos mediante una búsqueda previa de las personas a las que se quiera mandarles el mail se hace mediante este código: <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%> <!-- #include file="envia_mail.asp" --> <!-- #include file="upload.asp" --> <% uploadsDirVar = "C:\inetpub\wwwroot\CONGRESOS\adjuntos\" congreso= request.QueryString("congreso") Set Conex=Server.CreateObject("ADODB.Connection") Conex.Open ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source= "& Server.MapPath("/congresos/BD/"&congreso&".mdb")) Set RS = Server.CreateObject("ADODB.RecordSet") criterio1 = request.QueryString("c1") criterio2 = request.QueryString("c2") criterio3 = request.QueryString("c3") criterio4 = request.QueryString("c4") criterio5 = request.QueryString("c5") criterio6 = request.QueryString("c6") criterio7 = request.QueryString("c7") if criterio1 = "" then criterio1= "%" End if if criterio2 = "" then criterio2= "%" End if if criterio3 = "" then criterio3= "%" End if if criterio4 = "" then criterio4= "%" End if if criterio5 = "" then criterio5= "%" End if if criterio6 = "" then criterio6= "%" End if 72 if criterio7 = "" then criterio7= "%" End if sql = "SELECT * FROM inscripciones WHERE nombre LIKE'"&criterio1&"%' AND apellido1 LIKE '"&criterio2&"%' AND dni LIKE '"&criterio3&"%' AND empresa LIKE '"&criterio4&"%' AND ciudad LIKE '"&criterio5&"%' AND tipo LIKE '"&criterio6&"' AND estado LIKE '"&criterio7&"' " RS.open sql,Conex,1 Dim Upload, fileName, fileSize, ks, i, fileKey, resumen Set Upload = New FreeASPUpload Upload.Save(uploadsDirVar) ' If something fails inside the script, but the exception is handled If Err.Number <> 0 then Response.Write "Error="&salida SaveFiles = "" ks = Upload.UploadedFiles.keys if (UBound(ks) <> -1) then resumen = "<B>Archivos subidos:</B> " for each fileKey in Upload.UploadedFiles.keys adjunto = Upload.UploadedFiles(fileKey).FileName next else if not adjunto = "" then Response.Write "El nombre del archivo especificado en el formulario no es valido en el sistema." end if end if While not RS.EOF 'Correu de=Upload.Form("de") destinatario=RS("email") asunto=Upload.Form("asunto") cuerpo=Upload.Form("cuerpo") call envia_mail (destinatario,asunto,cuerpo,de,adjunto,congreso) RS.MoveNext Wend 'Eliminar archivo adjunto del servidor Set fs = Server.CreateObject("Scripting.FileSystemObject") if fs.FileExists("c:\inetpub\wwwroot\CONGRESOS\adjuntos\"&adjunto) then fs.DeleteFile("c:\inetpub\wwwroot\CONGRESOS\adjuntos\"&adjunto) Set fs = Nothing Response.Write ( "Mail enviado." ) 'Eixidad per al txt 'Response.ContentType = "application/msword" 73 Set ff = Nothing RS.close Conex.close Set RS = Nothing Set Conex = Nothing %>