public string AlertaParticipacion(ParticipacionContact contacto, int valor, string mensaje)
        {
            var db   = new edayRoomEntities();
            var mesa = db.Mesas.Single(m => m.id == contacto.IdMesa);
            var user = db.users.Single(u => u.username == User.Identity.Name);

            #region Registro la alerta

            var alerta = new ParticipacionAlerta
            {
                activa     = true,
                comentario =
                    string.Format("<li><b>{1}</b> - {0}</li>", mensaje, DateTime.Now.ToString("HH:mm")),
                fecha      = DateTime.Now,
                id_mesa    = contacto.IdMesa,
                id_testigo = contacto.IdTestigo,
                id_alerta  = valor,
                id_usuario = user.id
            };

            db.ParticipacionAlertas.AddObject(alerta);


            var messages = new List <ParticipacionAlertaMessage>();
            if (!string.IsNullOrWhiteSpace(mensaje))
            {
                var alertMessage = new ParticipacionAlertaMessage {
                    fecha = DateTime.Now, mensaje = mensaje, id_usuario = user.id
                };
                alerta.ParticipacionAlertaMessages.Add(alertMessage);
                messages.Add(alertMessage);
            }

            #endregion

            #region  Retraso de Timeline

            Alerta objetoAlerta = db.Alertas.Single(a => a.id == valor);
            if (objetoAlerta.blocking)
            {
                mesa.alertBlocked    = true;
                mesa.blockingAlertId = objetoAlerta.id;
            }
            if (objetoAlerta.regresivo)
            {
                var oldTimelines =
                    (from pt in db.ParticipacionTimelines
                     where
                     pt.activa && pt.id_mesa == contacto.IdMesa
                     //pt.id == contacto.MovilizacionTimelineId
                     select pt);
                foreach (var oldTimeline in oldTimelines)
                {
                    oldTimeline.activa = false;
                }
                //ParticipacionTimeline oldTimeline =
                //    (from pt in db.ParticipacionTimelines where pt.id == contacto.ParticipacionTimelineId select pt).
                //        Single();
                //oldTimeline.activa = false;
                DateTime newDate     = DateTime.Now.AddMinutes(objetoAlerta.tiempo);
                var      newTimeline = new ParticipacionTimeline {
                    id_mesa = contacto.IdMesa, fecha = newDate, activa = true
                };
                db.ParticipacionTimelines.AddObject(newTimeline);
            }

            #endregion

            db.SaveChanges();


            // VERIFICAR SI HAY QUE HACER TRIGGER DE ALGUNA ALERTA
            var existingAlerts = from a in db.ParticipacionAlertas
                                 where a.id_mesa == contacto.IdMesa &&
                                 a.id_alerta == valor && a.activa
                                 select a;
            var alertCount = existingAlerts.Count();
            var maxRepeats = existingAlerts.First().Alerta.maxRepeats ?? 0;
            if (maxRepeats != 0)
            {
                if (alertCount == maxRepeats)
                {
                    //LLEGUE AL LIMITE, hago el trigger de la alerta
                    var newAlerta  = existingAlerts.First().Alerta.AlertaAsociada;
                    var alertaAuto = new ParticipacionAlerta
                    {
                        activa     = true,
                        comentario =
                            string.Format("<li><b>{1}</b> - {0}</li>",
                                          "ALERTA GENERADA AUTOMATICAMENTE",
                                          DateTime.Now.ToString("HH:mm")),
                        fecha      = DateTime.Now,
                        id_mesa    = contacto.IdMesa,
                        id_testigo = contacto.IdTestigo,
                        id_alerta  = newAlerta.id,
                        id_usuario = user.id
                    };
                    db.ParticipacionAlertas.AddObject(alertaAuto);
                    if (newAlerta.blocking)
                    {
                        mesa.alertBlocked    = true;
                        mesa.blockingAlertId = newAlerta.id;
                    }
                    var alertMessage = new ParticipacionAlertaMessage {
                        fecha = DateTime.Now, mensaje = "Alerta generada por sistema", id_usuario = user.id
                    };
                    alertaAuto.ParticipacionAlertaMessages.Add(alertMessage);
                }
            }
            db.SaveChanges();
            return(new JavaScriptSerializer().Serialize("success"));
        }
        public string UpdateParticipacion(ParticipacionContact contacto, int valor, int cola = 0)
        {
            var db   = new edayRoomEntities();
            var user = db.users.Single(u => u.username == User.Identity.Name);

            //Reseteo los timelines
            var oldTimelines =
                (from pt in db.ParticipacionTimelines
                 where
                 pt.activa && pt.id_mesa == contacto.IdMesa
                 select pt);

            foreach (var oldTimeline in oldTimelines)
            {
                oldTimeline.activa = false;
            }

            //Guardar valor en timeline
            var newDate     = contacto.QuickCountActive ? DateTime.Now.AddMinutes(45) : DateTime.Now.AddMinutes(60);
            var newTimeline = new ParticipacionTimeline {
                id_mesa = contacto.IdMesa, fecha = newDate, activa = true
            };

            db.ParticipacionTimelines.AddObject(newTimeline);
            var newParticipacion = new Participacion
            {
                fecha      = DateTime.Now,
                hora       = DateTime.Now.Hour,
                min10      = DateTime.Now.Minute / 10,
                min30      = DateTime.Now.Minute / 30,
                conteo     = valor,
                id_mesa    = contacto.IdMesa,
                id_testigo = contacto.IdTestigo,
                cola       = cola,
                active     = true,
                id_parent  = null,
                id_user    = user.id
            };

            //Guardo los datos a nivel de mesa
            var mesa = db.Mesas.Single(m => m.id == contacto.IdMesa);

            mesa.participacion = valor;
            mesa.lastContact   = DateTime.Now;
            mesa.nextContact   = newDate;
            mesa.abierta       = true;


            //Proyeccion de resutados a centro
            var centro           = mesa.Centro;
            var mesasActivas     = centro.Mesas1.Where(m => m.participacion != 0).ToArray();
            var votosRegistrados = mesasActivas.Sum(m => m.participacion);
            var votantesEnMesa   = mesasActivas.Sum(m => m.votantes);
            var proyeccionCentro = centro.votantes * votosRegistrados / votantesEnMesa;


            centro.lastParticipacionContact = DateTime.Now;
            centro.participacionContada     = votosRegistrados;
            centro.participacionProyectada  = proyeccionCentro;


            //Participacion oldParticipacion = db.Participacions.Single(p => p.id == contacto.LastParticipacionId);
            //oldParticipacion.active = false;

            db.Participacions.AddObject(newParticipacion);

            IQueryable <ParticipacionAlerta> alertas = from a in db.ParticipacionAlertas
                                                       where a.activa && !a.Alerta.blocking &&
                                                       a.id_mesa == contacto.IdMesa
                                                       select a;

            foreach (ParticipacionAlerta a in alertas)
            {
                a.activa = false;
            }

            db.SaveChanges();
            return(new JavaScriptSerializer().Serialize(""));
        }