/// <summary>
        /// Actualiza un PlanifAgendaCat a partir del id
        /// </summary>
        internal int Update(Models.PlanifAgendaCat oPlanifAgendaCat)
        {
            try
            {
                SqlParameter[] dbparams = new SqlParameter[11] {
                    Param(enumDBFields.IDEvento, oPlanifAgendaCat.ID),
                    Param(enumDBFields.IDFicepi, oPlanifAgendaCat.Idficepi),
                    Param(enumDBFields.IDFicepiMod, oPlanifAgendaCat.IdficepiMod),
                    Param(enumDBFields.StartTime, oPlanifAgendaCat.StartTime),
                    Param(enumDBFields.EndTime, oPlanifAgendaCat.EndTime),
                    Param(enumDBFields.FechaMod, oPlanifAgendaCat.FechaMod),
                    Param(enumDBFields.IdTarea, oPlanifAgendaCat.IdTarea),
                    Param(enumDBFields.Asunto, oPlanifAgendaCat.Asunto),
                    Param(enumDBFields.Motivo, oPlanifAgendaCat.Motivo),
                    Param(enumDBFields.Privado, oPlanifAgendaCat.Privado),
                    Param(enumDBFields.Observaciones, oPlanifAgendaCat.Observaciones)
                };

                return((int)cDblib.Execute("SUP_PLANIFAGENDA_U", dbparams));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 2
0
        public int updateEvento(Models.PlanifAgendaCat evento)
        {
            OpenDbConn();

            DAL.PlanifAgendaCat cPlanifAgendaCat = new DAL.PlanifAgendaCat(cDblib);
            int result = cPlanifAgendaCat.Update(evento);

            return(result);
        }
Ejemplo n.º 3
0
        private static string[] crearCorreoEliminacionEvento(Models.PlanifAgendaCat evento, string codRed)
        {
            #region Creación de correo
            string sAsuntoCita = "";
            string sTexto      = "";
            string sTextoInt   = "";
            string sTO         = "";
            string sFecIni;
            string sFecFin;
            string sFichero = "";

            var sAsuntoMail = (evento.Asunto == "") ? evento.DesTarea : evento.Asunto;
            sAsuntoCita = "(Agenda SUPER) " + Utilidades.unescape(sAsuntoMail);

            sFecIni = evento.StartTime.ToString();
            if (sFecIni.Length == 19)
            {
                sFecIni = sFecIni.Substring(0, 16);
            }
            else
            {
                sFecIni = sFecIni.Substring(0, 15);
            }
            sFecFin = evento.EndTime.ToString();
            if (sFecFin.Length == 19)
            {
                sFecFin = sFecFin.Substring(0, 16);
            }
            else
            {
                sFecFin = sFecFin.Substring(0, 15);
            }

            sTexto = @"La cita para: <br><br>
                        <b>Profesional:</b> " + HttpContext.Current.Session["DES_EMPLEADO_IAP"].ToString() + @"<br>
						<b><span style='width:40px'>Inicio:</span></b> "                         + sFecIni + @" <br>
						<b><span style='width:40px'>Fin:</span></b> "                         + sFecFin + @"
						<br><br><b>Motivo de la cita:</b> "                         + Utilidades.unescape(evento.Motivo).Replace(((char)10).ToString(), "<br>") + @"<br><br>
						Ha sido eliminada por "                         + HttpContext.Current.Session["DES_EMPLEADO_ENTRADA"].ToString() + @".<br><br>
						<br><br><b>Motivo de eliminación:</b> "                         + Utilidades.unescape(evento.MotivoEliminacion).Replace(((char)10).ToString(), "<br>") + @"<br><br><br>";

            sTextoInt = sTexto + @"<span style='color:blue'>En el caso de que tuvieras alguna anotación registrada en tu agenda, motivada por alguna notificación de esta misma cita, deberás proceder a su eliminación de forma manual.</span>";
            if (codRed != null)
            {
                sTO = codRed.ToString();
            }
            else
            {
                sTO = HttpContext.Current.Session["IDRED_IAP"].ToString();
            }
            string[] aMail = { sAsuntoCita, sTextoInt, sTO, sFichero };

            return(aMail);

            #endregion
        }
        /// <summary>
        /// Obtiene un PlanifAgendaCat a partir del id
        /// </summary>
        internal Models.PlanifAgendaCat Select(Int32 idEvento)
        {
            Models.PlanifAgendaCat oPlanifAgendaCat = null;
            IDataReader            dr = null;

            try
            {
                SqlParameter[] dbparams = new SqlParameter[1] {
                    Param(enumDBFields.IDEvento, idEvento)
                };

                dr = cDblib.DataReader("SUP_PLANIFAGENDA_O", dbparams);

                if (dr.Read())
                {
                    oPlanifAgendaCat        = new Models.PlanifAgendaCat();
                    oPlanifAgendaCat.ID     = Convert.ToInt32(dr["t458_idPlanif"]);
                    oPlanifAgendaCat.Motivo = Convert.ToString(dr["t458_motivo"]);
                    oPlanifAgendaCat.Asunto = Convert.ToString(dr["t458_asunto"]);
                    if (!Convert.IsDBNull(dr["t332_idtarea"]))
                    {
                        oPlanifAgendaCat.IdTarea = Convert.ToInt32(dr["t332_idtarea"]);
                    }
                    oPlanifAgendaCat.DesTarea          = Convert.ToString(dr["t332_destarea"]);
                    oPlanifAgendaCat.Privado           = Convert.ToString(dr["t458_privado"]);
                    oPlanifAgendaCat.Observaciones     = Convert.ToString(dr["t458_observaciones"]);
                    oPlanifAgendaCat.Profesional       = Convert.ToString(dr["Profesional"]);
                    oPlanifAgendaCat.Promotor          = Convert.ToString(dr["Promotor"]);
                    oPlanifAgendaCat.CodRedProfesional = Convert.ToString(dr["codred_profesional"]);
                    oPlanifAgendaCat.CodRedPromotor    = Convert.ToString(dr["codred_promotor"]);
                    oPlanifAgendaCat.StartTime         = Convert.ToDateTime(dr["t458_fechoraini"]);
                    oPlanifAgendaCat.EndTime           = Convert.ToDateTime(dr["t458_fechorafin"]);
                }
                return(oPlanifAgendaCat);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    if (!dr.IsClosed)
                    {
                        dr.Close();
                    }
                    dr.Dispose();
                }
            }
        }
Ejemplo n.º 5
0
        private static string[] crearCorreoEliminacionEventoPorSolapamiento(Models.PlanifAgendaCat evento)
        {
            #region Creación de correo
            string sAsuntoCita = "";
            string sTexto      = "";
            string sTextoInt   = "";
            string sTO         = "";
            string sFecIni;
            string sFecFin;
            string sFichero = "";

            var sAsuntoMail = (evento.Asunto == "") ? evento.DesTarea : evento.Asunto;
            sAsuntoCita = "(Agenda SUPER) Eliminación cita agenda.";
            sFecIni     = evento.StartTime.ToString();
            if (sFecIni.Length == 19)
            {
                sFecIni = sFecIni.Substring(0, 16);
            }
            else
            {
                sFecIni = sFecIni.Substring(0, 15);
            }
            sFecFin = evento.EndTime.ToString();
            if (sFecFin.Length == 19)
            {
                sFecFin = sFecFin.Substring(0, 16);
            }
            else
            {
                sFecFin = sFecFin.Substring(0, 15);
            }

            sTexto = @"La cita para: <br><br>
                            <b>Profesional:</b> " + evento.Profesional + @"<br>
						    <b><span style='width:40px'>Inicio:</span></b> "                         + sFecIni + @" <br>
						    <b><span style='width:40px'>Fin:</span></b> "                         + sFecFin + @"
						    <br><br><b>Motivo de la cita:</b> "                         + (evento.Motivo) + "<br>" + @"<br><br>
						    Ha sido eliminada debido a solapamiento de una nueva cita creada por "                         + HttpContext.Current.Session["DES_EMPLEADO_ENTRADA"].ToString() + @".<br><br>";

            sTextoInt = sTexto + @"<span style='color:blue'>En el caso de que tuvieras alguna anotación registrada en tu agenda, motivada por alguna notificación de esta misma cita, deberás proceder a su eliminación de forma manual.</span>";
            sTO       = evento.CodRedPromotor;
            string[] aMail = { sAsuntoCita, sTextoInt, sTO, sFichero };

            return(aMail);

            #endregion
        }
Ejemplo n.º 6
0
        private static Models.PlanifAgendaCat duplicarEvento(Models.PlanifAgendaCat evento)
        {
            Models.PlanifAgendaCat nuevoEvento = new Models.PlanifAgendaCat();
            nuevoEvento.IdficepiMod   = evento.IdficepiMod;
            nuevoEvento.Idficepi      = evento.Idficepi;
            nuevoEvento.FechaMod      = evento.FechaMod;
            nuevoEvento.StartTime     = evento.StartTime;
            nuevoEvento.EndTime       = evento.EndTime;
            nuevoEvento.IdTarea       = evento.IdTarea;
            nuevoEvento.DesTarea      = evento.DesTarea;
            nuevoEvento.Asunto        = evento.Asunto;
            nuevoEvento.Motivo        = evento.Motivo;
            nuevoEvento.Privado       = evento.Privado;
            nuevoEvento.Observaciones = evento.Observaciones;

            return(nuevoEvento);
        }
Ejemplo n.º 7
0
        public int eliminarEvento(Models.PlanifAgendaCat evento, bool enviarMail, bool solapamiento)
        {
            OpenDbConn();
            int       result      = 0;
            ArrayList aListCorreo = new ArrayList();

            try
            {
                DAL.PlanifAgendaCat cPlanifAgendaCat = new DAL.PlanifAgendaCat(cDblib);
                result = cPlanifAgendaCat.Delete(evento.ID);
                if (enviarMail)
                {
                    if (!solapamiento)
                    {
                        aListCorreo.Add(crearCorreoEliminacionEvento(evento, evento.CodRedProfesional));
                        if (evento.CodRedProfesional != evento.CodRedPromotor)
                        {
                            aListCorreo.Add(crearCorreoEliminacionEvento(evento, evento.CodRedPromotor));
                        }
                    }
                    else
                    {
                        aListCorreo.Add(crearCorreoEliminacionEventoPorSolapamiento(evento));
                    }
                }
            }catch (Exception ex) {
                IB.SUPER.Shared.LogError.LogearError("Error al elminar el evento", ex);
            }

            try
            {
                if (aListCorreo.Count > 0)
                {
                    Correo.EnviarCorreosCita(aListCorreo);
                }
            }
            catch (Exception ex)
            {
                IB.SUPER.Shared.LogError.LogearError("Error al enviar los mails de convocatoria:", ex);
            }

            return(result);
        }
        /// <summary>
        /// Obtiene todos los PlanifAgendaCat
        /// </summary>
        internal List <Models.PlanifAgendaCat> Catalogo(Int32 idficepi, DateTime fechaInicio, DateTime fechaFin)
        {
            Models.PlanifAgendaCat        oPlanifAgendaCat = null;
            List <Models.PlanifAgendaCat> lst = new List <Models.PlanifAgendaCat>();
            IDataReader dr = null;

            try
            {
                SqlParameter[] dbparams = new SqlParameter[3] {
                    Param(enumDBFields.IDFicepi, idficepi),
                    Param(enumDBFields.StartTime, fechaInicio),
                    Param(enumDBFields.EndTime, fechaFin)
                };

                dr = cDblib.DataReader("SUP_PLANIFAGENDA_CAT", dbparams);
                while (dr.Read())
                {
                    oPlanifAgendaCat           = new Models.PlanifAgendaCat();
                    oPlanifAgendaCat.ID        = Convert.ToInt32(dr["ID"]);
                    oPlanifAgendaCat.Asunto    = Convert.ToString(dr["Motivo"]);
                    oPlanifAgendaCat.StartTime = Convert.ToDateTime(dr["StartTime"]);
                    oPlanifAgendaCat.EndTime   = Convert.ToDateTime(dr["EndTime"]);

                    lst.Add(oPlanifAgendaCat);
                }
                return(lst);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    if (!dr.IsClosed)
                    {
                        dr.Close();
                    }
                    dr.Dispose();
                }
            }
        }
Ejemplo n.º 9
0
        private static string[] crearCorreo(Models.PlanifAgendaCat evento, string codRed)
        {
            #region Creación de correo
            string sMotivoCita = "";
            string sAsuntoCita = "";
            string sTexto      = "";
            string sTextoInt   = "";
            string sTO         = "";
            string sFecIni;
            string sFecFin;
            string sFichero = "";

            var sAsuntoMail = (evento.Asunto == "") ? evento.DesTarea : evento.Asunto;
            sAsuntoCita = "(Agenda SUPER) " + Utilidades.unescape(sAsuntoMail);

            sFecIni = evento.StartTime.ToString();
            if (sFecIni.Length == 19)
            {
                sFecIni = sFecIni.Substring(0, 16);
            }
            else
            {
                sFecIni = sFecIni.Substring(0, 15);
            }
            sFecFin = evento.EndTime.ToString();
            if (sFecFin.Length == 19)
            {
                sFecFin = sFecFin.Substring(0, 16);
            }
            else
            {
                sFecFin = sFecFin.Substring(0, 15);
            }

            sTexto = @"Cita: <br><br>
                                <b>Promotor:</b> " + HttpContext.Current.Session["DES_EMPLEADO_ENTRADA"].ToString() + @"<br>
								<b><span style='width:40px'>Inicio:</span></b> "                                 + sFecIni + @"<br>
								<b><span style='width:40px'>Fin:</span></b> "                                 + sFecFin + @"
								<br><br><b>Motivo de la cita:</b> "                                 + Utilidades.unescape(evento.Motivo).Replace(((char)10).ToString(), "<br>") + @"<br><br><br><br>";

            sTextoInt = sTexto + @"<span style='color:blue'>Si deseas registrar la reserva en tu calendario Outlook, abre el fichero adjunto (extensión .ics) y a continuación pulsa el botón 'Guardar y cerrar'.
								<br>(Opción sólo válida para accesos desde las oficinas conectadas a la red interna de Ibermática)</span>"                                ;

            sMotivoCita = "Motivo de la cita:=0D=0A" + evento.Motivo;
            sFichero    = "";
            if (codRed != null)
            {
                sTO = codRed.ToString();
            }
            else
            {
                sTO = HttpContext.Current.Session["IDRED_IAP"].ToString();
            }
            try
            {
                sFichero = crearCitaOutlook(evento.ID, sAsuntoCita, sMotivoCita, evento.StartTime, evento.EndTime);
            }
            catch { }
            string[] aMail = { sAsuntoCita, sTextoInt, sTO, sFichero };

            return(aMail);

            #endregion
        }
Ejemplo n.º 10
0
        public string grabarEventoProfAsignados(Models.PlanifAgendaCat evento, string[] otrosProfesionales, bool confirmarBorrado)
        {
            int    idEvento         = 0;
            string result           = "";
            string sOtrosProfNoCita = "";

            ArrayList aListCorreo = new ArrayList();

            bool bDias = false;

            bool[] bDia = new bool[7];

            bool bConTransaccion = false;
            Guid methodOwnerID   = new Guid("C9762B5E-8973-4DFC-81A6-C233F3503749");

            OpenDbConn();
            if (cDblib.Transaction.ownerID.Equals(new Guid()))
            {
                bConTransaccion = true;
            }
            if (bConTransaccion)
            {
                cDblib.beginTransaction(methodOwnerID);
            }

            try
            {
                int       idEventoProf                           = 0;
                ArrayList profesionalesNoCita                    = new ArrayList();
                int       idFicepiProf                           = 0;
                string    codRedProf                             = "";
                Models.ValidarTareaAgenda accesoATarea           = new Models.ValidarTareaAgenda();
                DAL.PlanifAgendaCat       planifAgendaCatDAL     = new DAL.PlanifAgendaCat(cDblib);
                DAL.PromotoresAgendaCat   promotoresAgendaCatDAL = new DAL.PromotoresAgendaCat(cDblib);
                DAL.ValidarTareaAgenda    validarTareaAgendaDAL  = new DAL.ValidarTareaAgenda(cDblib);


                Models.PlanifAgendaCat newEvento;
                foreach (string oProf in otrosProfesionales)
                {
                    string[] aProf = Regex.Split(oProf, "//");
                    idFicepiProf = int.Parse(aProf[0]);
                    codRedProf   = aProf[1];
                    //si la cita es a tarea, comprobar que el profesional tiene acceso a la tarea.
                    if (evento.IdTarea != null)
                    {
                        accesoATarea = validarTareaAgendaDAL.Select(idFicepiProf, (int)evento.IdTarea);
                        if (accesoATarea == null)
                        {
                            profesionalesNoCita.Add(idFicepiProf);
                            if (sOtrosProfNoCita == "")
                            {
                                sOtrosProfNoCita = idFicepiProf.ToString();
                            }
                            else
                            {
                                sOtrosProfNoCita += "," + idFicepiProf.ToString();
                            }
                            continue;
                        }
                    }

                    #region Control días de la semana

                    bDia = evento.DiasSemana;
                    if (Array.Exists(bDia, element => element == true))
                    {
                        bDias = true;
                    }
                    #endregion

                    if (bDias)
                    {
                        #region Una reserva cada día para el rango horario indicado
                        newEvento          = new Models.PlanifAgendaCat();
                        newEvento          = duplicarEvento(evento);
                        newEvento.Privado  = "";           //El campo privado que ha escrito el interesado no se inserta a los otros profesionales.
                        newEvento.Idficepi = idFicepiProf; //Se asigna el idficepi del profesional que se está tratando

                        int nDiff = IB.SUPER.Shared.Fechas.DateDiff("day", evento.StartTime, evento.EndTime);
                        for (int b = 0; b <= nDiff; b++)
                        {
                            //comprobar que el día a grabar está entre los días seleccionados
                            System.DateTime dAux = evento.StartTime.AddDays(b);
                            switch (dAux.DayOfWeek)
                            {
                            case System.DayOfWeek.Monday: if (bDia[0] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Tuesday: if (bDia[1] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Wednesday: if (bDia[2] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Thursday: if (bDia[3] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Friday: if (bDia[4] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Saturday: if (bDia[5] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Sunday: if (bDia[6] == false)
                                {
                                    continue;
                                }
                                break;
                            }

                            //Si llega aquí es que hay que grabar los datos de la reserva para ese día.
                            DateTime dFechaHoraFin = IB.SUPER.Shared.Fechas.crearDateTime(dAux.ToShortDateString(), evento.EndTime.ToShortTimeString());

                            //Antes de realizar la reserva, comprobar la disponibilidad;
                            if (planifAgendaCatDAL.getDisponibilidad(newEvento.Idficepi, dAux, dFechaHoraFin, 0))
                            {
                                //En caso de tener disponibilidad se inserta el evento en BBDD
                                // y si hay necesidad de enviar correo, se crea el correo y se añade a la lista de correos
                                newEvento.StartTime = dAux;
                                newEvento.EndTime   = dFechaHoraFin;
                                idEventoProf        = planifAgendaCatDAL.Insert(newEvento);
                                newEvento.ID        = idEventoProf;
                                aListCorreo.Add(crearCorreo(newEvento, codRedProf));
                            }
                            else
                            {
                                profesionalesNoCita.Add(idFicepiProf);
                                if (sOtrosProfNoCita == "")
                                {
                                    sOtrosProfNoCita = newEvento.Idficepi.ToString();
                                }
                                else
                                {
                                    sOtrosProfNoCita += "," + newEvento.Idficepi.ToString();
                                }
                                break;
                            }

                            #endregion
                        }    //Fin de bucle de días
                    }
                    else
                    {
                        #region Una sola reserva para el rango desde la fecha de inicio a la de fin
                        //Antes de realizar la reserva, comprobar la disponibilidad;
                        newEvento          = new Models.PlanifAgendaCat();
                        newEvento          = duplicarEvento(evento);
                        newEvento.Privado  = "";           //El campo privado que ha escrito el interesado no se inserta a los otros profesionales.
                        newEvento.Idficepi = idFicepiProf; //Se asigna el idficepi del profesional que se está tratando

                        if (planifAgendaCatDAL.getDisponibilidad(newEvento.Idficepi, evento.StartTime, evento.EndTime, 0))
                        {
                            //En caso de tener disponibilidad se inserta el evento en BBDD
                            // y si hay necesidad de enviar correo, se crea el correo y se añade a la lista de correos
                            idEventoProf = planifAgendaCatDAL.Insert(newEvento);
                            newEvento.ID = idEventoProf;
                            aListCorreo.Add(crearCorreo(newEvento, codRedProf));
                        }
                        else
                        {
                            profesionalesNoCita.Add(idFicepiProf);
                            if (sOtrosProfNoCita == "")
                            {
                                sOtrosProfNoCita = newEvento.Idficepi.ToString();
                            }
                            else
                            {
                                sOtrosProfNoCita += "," + newEvento.Idficepi.ToString();
                            }
                        }

                        #endregion
                    } //Fin de If (bDias)
                }     //Fin de bucle de profesionales



                if (sOtrosProfNoCita != "")
                {
                    throw new ValidationException("");
                }

                if (bConTransaccion)
                {
                    cDblib.commitTransaction(methodOwnerID);
                }
            }

            catch (ValidationException ex)
            {
                //rollback
                if (cDblib.Transaction.ownerID.Equals(new Guid()))
                {
                    cDblib.rollbackTransaction(methodOwnerID);
                }

                if (sOtrosProfNoCita != "")
                {
                    return(idEvento + "//" + sOtrosProfNoCita);
                }
                throw ex;
            }

            catch (Exception ex)
            {
                //rollback
                if (cDblib.Transaction.ownerID.Equals(new Guid()))
                {
                    cDblib.rollbackTransaction(methodOwnerID);
                }

                throw new Exception("La planificación para el profesional ha sido realizada con éxito. Sin embargo, se ha producido un error en la programación de las citas de los profesionales asignados: " + ex.Message);
            }

            finally
            {
            }

            try
            {
                if (aListCorreo.Count > 0)
                {
                    Correo.EnviarCorreosCita(aListCorreo);
                }
            }
            catch (Exception ex)
            {
                //sResul = "Error@#@" + Errores.mostrarError("Error al enviar el mail a los responsables del proyecto", ex);
                IB.SUPER.Shared.LogError.LogearError("Error al enviar los mails de convocatoria:", ex);
            }

            return("OK");
        }
Ejemplo n.º 11
0
        public int grabarEvento(Models.PlanifAgendaCat evento, bool confirmarBorrado)
        {
            bool bEnviarEmail    = false;
            int  idEvento        = 0;
            bool errorControlado = false;

            ArrayList aListCorreo = new ArrayList();

            bool bDias = false;

            bool[] bDia = new bool[7];

            Models.PlanifAgendaCat oEvento;

            bool bConTransaccion = false;
            Guid methodOwnerID   = new Guid("F35A931C-50C1-4FAA-B3AB-3819DE6E0C79");

            OpenDbConn();
            if (cDblib.Transaction.ownerID.Equals(new Guid()))
            {
                bConTransaccion = true;
            }
            if (bConTransaccion)
            {
                cDblib.beginTransaction(methodOwnerID);
            }

            try

            {
                DAL.PlanifAgendaCat     planifAgendaCatDAL     = new DAL.PlanifAgendaCat(cDblib);
                DAL.PromotoresAgendaCat promotoresAgendaCatDAL = new DAL.PromotoresAgendaCat(cDblib);

                evento.Idficepi    = int.Parse(HttpContext.Current.Session["IDFICEPI_IAP"].ToString());
                evento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_IAP"].ToString());

                //En caso de que el evento ya exista, hay que comprobar los datos que han sido modificados para
                //ver si es necesario enviar mail
                if (evento.ID != 0)
                {
                    #region Update del evento
                    oEvento = planifAgendaCatDAL.Select(evento.ID);

                    //comprobación de si hay que comunicar el cambio
                    if (evento.StartTime != oEvento.StartTime ||
                        evento.EndTime != oEvento.EndTime ||
                        (evento.IdTarea != -1 && evento.IdTarea != oEvento.IdTarea))
                    {
                        bEnviarEmail = true;
                    }

                    //Se comprueba si el evento tiene dsponibilidad o no
                    if (planifAgendaCatDAL.getDisponibilidad(evento.Idficepi, evento.StartTime, evento.EndTime, evento.ID))
                    {
                        //En caso de tener disponibilidad se actualiza el evento en BBDD
                        // y si hay necesidad de enviar correo, se crea el correo y se añade a la lista de correos
                        if (bEnviarEmail)
                        {
                            evento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_ENTRADA"].ToString());
                        }
                        idEvento = planifAgendaCatDAL.Update(evento);
                        if (bEnviarEmail)
                        {
                            aListCorreo.Add(crearCorreoMod(evento, oEvento, null));
                        }
                    }
                    //Si no tiene disponibilidad se manda un mensaje de error
                    else
                    {
                        throw new ValidationException("Cita denegada por solapamiento. Revisa el mapa de citas.");
                    }

                    #endregion
                }
                //El evento no existe, se debe hacer un Insert en BBDD
                else
                {
                    #region insert del evento

                    #region Control días de la semana

                    bDia = evento.DiasSemana;
                    if (Array.Exists(bDia, element => element == true))
                    {
                        bDias = true;
                    }
                    #endregion
                    if (bDias)
                    {
                        #region Una reserva cada día para el rango horario indicado
                        Models.PlanifAgendaCat newEvento = new Models.PlanifAgendaCat();
                        newEvento = duplicarEvento(evento);

                        int nDiff = IB.SUPER.Shared.Fechas.DateDiff("day", evento.StartTime, evento.EndTime);
                        for (int b = 0; b <= nDiff; b++)
                        {
                            //comprobar que el día a grabar está entre los días seleccionados
                            System.DateTime dAux = evento.StartTime.AddDays(b);
                            switch (dAux.DayOfWeek)
                            {
                            case System.DayOfWeek.Monday: if (bDia[0] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Tuesday: if (bDia[1] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Wednesday: if (bDia[2] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Thursday: if (bDia[3] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Friday: if (bDia[4] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Saturday: if (bDia[5] == false)
                                {
                                    continue;
                                }
                                break;

                            case System.DayOfWeek.Sunday: if (bDia[6] == false)
                                {
                                    continue;
                                }
                                break;
                            }

                            //Si llega aquí es que hay que grabar los datos de la reserva para ese día.
                            DateTime dFechaHoraFin = IB.SUPER.Shared.Fechas.crearDateTime(dAux.ToShortDateString(), evento.EndTime.ToShortTimeString());

                            //Antes de realizar la reserva, comprobar la disponibilidad;
                            if (planifAgendaCatDAL.getDisponibilidad(evento.Idficepi, dAux, dFechaHoraFin, 0))
                            {
                                //En caso de tener disponibilidad se inserta el evento en BBDD
                                // y si hay necesidad de enviar correo, se crea el correo y se añade a la lista de correos
                                newEvento.StartTime   = dAux;
                                newEvento.EndTime     = dFechaHoraFin;
                                newEvento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_ENTRADA"].ToString());
                                idEvento     = planifAgendaCatDAL.Insert(newEvento);
                                newEvento.ID = idEvento;
                                aListCorreo.Add(crearCorreo(newEvento, null));
                            }
                            else
                            {
                                if (evento.Idficepi != (int)HttpContext.Current.Session["IDFICEPI_ENTRADA"])
                                {
                                    throw new Exception("Cita denegada por solapamiento. Revisa el mapa de citas.");
                                }

                                if (!confirmarBorrado)
                                {
                                    Models.PromotoresAgendaCat        oPromotoresAgendaCat  = new Models.PromotoresAgendaCat();
                                    List <Models.PromotoresAgendaCat> listaPromotoresEvento = new List <Models.PromotoresAgendaCat>();
                                    oPromotoresAgendaCat.t458_idPlanif   = 0;
                                    oPromotoresAgendaCat.t458_fechoraini = dAux;
                                    oPromotoresAgendaCat.t458_fechorafin = dFechaHoraFin;
                                    oPromotoresAgendaCat.t001_idficepi   = evento.Idficepi;
                                    listaPromotoresEvento = promotoresAgendaCatDAL.Catalogo(oPromotoresAgendaCat);

                                    foreach (Models.PromotoresAgendaCat oProm in listaPromotoresEvento)
                                    {
                                        if (oProm.t001_idficepi_mod == evento.Idficepi)
                                        {
                                            throw new Exception("Cita denegada por solapamiento. Revisa el mapa de citas.");
                                        }
                                    }
                                    errorControlado = true;
                                    throw new Exception("");
                                }
                                else
                                {
                                    //Hay que borrar las citas solapadas.
                                    Models.PromotoresAgendaCat        oPromotoresAgendaCat  = new Models.PromotoresAgendaCat();
                                    List <Models.PromotoresAgendaCat> listaPromotoresEvento = new List <Models.PromotoresAgendaCat>();
                                    oPromotoresAgendaCat.t458_idPlanif   = 0;
                                    oPromotoresAgendaCat.t458_fechoraini = dAux;
                                    oPromotoresAgendaCat.t458_fechorafin = dFechaHoraFin;
                                    oPromotoresAgendaCat.t001_idficepi   = evento.Idficepi;
                                    listaPromotoresEvento = promotoresAgendaCatDAL.Catalogo(oPromotoresAgendaCat);

                                    Models.PlanifAgendaCat eventoEliminar;

                                    foreach (Models.PromotoresAgendaCat oProm in listaPromotoresEvento)
                                    {
                                        eventoEliminar                = new Models.PlanifAgendaCat();
                                        eventoEliminar.ID             = oProm.t458_idPlanif;
                                        eventoEliminar.IdficepiMod    = oProm.t001_idficepi_mod;
                                        eventoEliminar.StartTime      = oProm.t458_fechoraini;
                                        eventoEliminar.EndTime        = oProm.t458_fechorafin;
                                        eventoEliminar.Motivo         = oProm.Motivo;
                                        eventoEliminar.Profesional    = oProm.Profesional;
                                        eventoEliminar.CodRedPromotor = oProm.t001_codred_promotor;
                                        planifAgendaCatDAL.Delete(eventoEliminar.ID);
                                        aListCorreo.Add(crearCorreoEliminacionEventoPorSolapamiento(eventoEliminar));
                                    }
                                    //Una vez eliminados los eventos que generan los solapamientos se procede a insertar el evento
                                    newEvento.StartTime   = dAux;
                                    newEvento.EndTime     = dFechaHoraFin;
                                    newEvento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_ENTRADA"].ToString());
                                    newEvento.ID          = planifAgendaCatDAL.Insert(newEvento);
                                    aListCorreo.Add(crearCorreo(newEvento, null));
                                }
                            }
                        }
                        #endregion

                        if (idEvento == 0)
                        {
                            throw new ValidationException("Las fechas y/o los días de repetición seleccionados no son correctos");
                        }
                    }


                    else
                    {
                        #region Una sola reserva para el rango desde la fecha de inicio a la de fin
                        //Antes de realizar la reserva, comprobar la disponibilidad;
                        if (planifAgendaCatDAL.getDisponibilidad(evento.Idficepi, evento.StartTime, evento.EndTime, 0))
                        {
                            //En caso de tener disponibilidad se inserta el evento en BBDD
                            // y si hay necesidad de enviar correo, se crea el correo y se añade a la lista de correos
                            evento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_ENTRADA"].ToString());
                            idEvento           = planifAgendaCatDAL.Insert(evento);
                            evento.ID          = idEvento;
                            aListCorreo.Add(crearCorreo(evento, null));
                        }
                        else
                        {
                            if (evento.Idficepi != (int)HttpContext.Current.Session["IDFICEPI_ENTRADA"])
                            {
                                throw new Exception("Cita denegada por solapamiento. Revisa el mapa de citas.");
                            }

                            if (!confirmarBorrado)
                            {
                                Models.PromotoresAgendaCat        oPromotoresAgendaCat  = new Models.PromotoresAgendaCat();
                                List <Models.PromotoresAgendaCat> listaPromotoresEvento = new List <Models.PromotoresAgendaCat>();
                                oPromotoresAgendaCat.t458_idPlanif   = 0;
                                oPromotoresAgendaCat.t458_fechoraini = evento.StartTime;
                                oPromotoresAgendaCat.t458_fechorafin = evento.EndTime;
                                oPromotoresAgendaCat.t001_idficepi   = evento.Idficepi;
                                listaPromotoresEvento = promotoresAgendaCatDAL.Catalogo(oPromotoresAgendaCat);

                                foreach (Models.PromotoresAgendaCat oProm in listaPromotoresEvento)
                                {
                                    if (oProm.t001_idficepi_mod == evento.Idficepi)
                                    {
                                        break;
                                    }
                                }
                                errorControlado = true;
                                throw new Exception("");
                            }
                            //En caso de que el usuario haya decidido eliminar las citas que solapan la cita actual, se procede al borrado
                            else
                            {
                                //Hay que borrar las citas solapadas.
                                Models.PromotoresAgendaCat        oPromotoresAgendaCat  = new Models.PromotoresAgendaCat();
                                List <Models.PromotoresAgendaCat> listaPromotoresEvento = new List <Models.PromotoresAgendaCat>();
                                oPromotoresAgendaCat.t458_idPlanif   = 0;
                                oPromotoresAgendaCat.t458_fechoraini = evento.StartTime;
                                oPromotoresAgendaCat.t458_fechorafin = evento.EndTime;
                                oPromotoresAgendaCat.t001_idficepi   = evento.Idficepi;
                                listaPromotoresEvento = promotoresAgendaCatDAL.Catalogo(oPromotoresAgendaCat);

                                Models.PlanifAgendaCat eventoEliminar;

                                foreach (Models.PromotoresAgendaCat oProm in listaPromotoresEvento)
                                {
                                    eventoEliminar                = new Models.PlanifAgendaCat();
                                    eventoEliminar.ID             = oProm.t458_idPlanif;
                                    eventoEliminar.IdficepiMod    = oProm.t001_idficepi_mod;
                                    eventoEliminar.StartTime      = oProm.t458_fechoraini;
                                    eventoEliminar.EndTime        = oProm.t458_fechorafin;
                                    eventoEliminar.Motivo         = oProm.Motivo;
                                    eventoEliminar.Profesional    = oProm.Profesional;
                                    eventoEliminar.CodRedPromotor = oProm.t001_codred_promotor;
                                    planifAgendaCatDAL.Delete(eventoEliminar.ID);
                                    aListCorreo.Add(crearCorreoEliminacionEventoPorSolapamiento(eventoEliminar));
                                }
                                //Una vez eliminados los eventos que generan los solapamientos se procede a insertar el evento
                                evento.IdficepiMod = int.Parse(HttpContext.Current.Session["IDFICEPI_ENTRADA"].ToString());
                                idEvento           = planifAgendaCatDAL.Insert(evento);
                                evento.ID          = idEvento;
                                aListCorreo.Add(crearCorreo(evento, null));
                            }
                        }
                        #endregion
                    }
                    #endregion
                }
                if (bConTransaccion)
                {
                    cDblib.commitTransaction(methodOwnerID);
                }
            }

            catch (ValidationException ex)
            {
                //rollback
                if (cDblib.Transaction.ownerID.Equals(new Guid()))
                {
                    cDblib.rollbackTransaction(methodOwnerID);
                }

                throw ex;
            }
            catch (Exception ex)
            {
                //rollback
                if (cDblib.Transaction.ownerID.Equals(new Guid()))
                {
                    cDblib.rollbackTransaction(methodOwnerID);
                }

                if (!errorControlado)
                {
                    throw ex;
                }
                return(-1);
            }
            finally
            {
            }

            try
            {
                if (aListCorreo.Count > 0)
                {
                    Correo.EnviarCorreosCita(aListCorreo);
                }
            }
            catch (Exception ex)
            {
                //sResul = "Error@#@" + Errores.mostrarError("Error al enviar el mail a los responsables del proyecto", ex);
                IB.SUPER.Shared.LogError.LogearError("Error al enviar los mails de convocatoria:", ex);
            }

            return(idEvento);
        }