public void ProbarCorreoAsync(string remitente, string servidorSmtp, string contenido, string asunto, string destinatario)
        {
            EmailMessage email = new EmailMessage(destinatario, remitente, asunto, contenido, BodyPartFormat.Plain);

            Action generarLog = delegate()
            {
                log.InfoFormat("El callback dormira 5sec");
                System.Threading.Thread.Sleep(5000);
                log.InfoFormat("El callback desperto");

                IglesiaEntities contexto = new IglesiaEntities();

                // Actualizamos o creamos el log; para guardar cuando fue la ultima vez que se proceso dicha inscripcion y no volverla a procesar hasta dentro de una semana
                NotificacionDeAsistenciaLog notificacionLog = (from o in contexto.NotificacionDeAsistenciaLog where o.NotificacionDeAsistenciaId == -1 select o).SingleOrDefault();

                if (notificacionLog == null)
                {
                    notificacionLog = new NotificacionDeAsistenciaLog();
                }

                notificacionLog.NotificacionDeAsistenciaId = -1;
                notificacionLog.Semana = -1;
                notificacionLog.Guardar(contexto);
            };

            // Enviamos el correo
            this.EnviarCorreoAsync(email, generarLog);
        }
Exemple #2
0
        public Modelos.Retornos.AsistenciaDeCelulaPorMiembroSumarizada ObtenerAsistencia(int celulaId, DateTime fecha)
        {
            int anioSeleccionado = fecha.Year;
            int mesSeleccionado  = fecha.Month;
            int diaSeleccionado  = fecha.Day;

            IglesiaEntities contexto = new IglesiaEntities();

            List <Modelos.Retornos.AsistenciaDeCelulaPorMiembro> asistencias = (
                from m in contexto.Miembro
                join a in contexto.CelulaMiembroAsistencia on
                new { MiembroId = m.MiembroId, Anio = anioSeleccionado, Mes = mesSeleccionado, Dia = diaSeleccionado }
                equals
                new { MiembroId = a.MiembroId, Anio = a.Anio, Mes = a.Mes, Dia = a.Dia }
                into ps
                from a in ps.DefaultIfEmpty()
                where m.CelulaId == celulaId && m.Borrado == false
                orderby m.Primer_Nombre ascending, m.Apellido_Paterno ascending
                select new Modelos.Retornos.AsistenciaDeCelulaPorMiembro
            {
                Id = (a.CelulaMiembroAsistenciaId != null ? a.CelulaMiembroAsistenciaId : -1),
                MiembroId = m.MiembroId,
                PrimerNombre = m.Primer_Nombre,
                SegundoNombre = m.Segundo_Nombre,
                ApellidoPaterno = m.Apellido_Paterno,
                ApellidoMaterno = m.Apellido_Materno,
                Asistencia = (a.CelulaMiembroAsistenciaId != null ? true : false),
                Estatus =
                    (from o in contexto.ConsolidacionBoleta where o.Email == m.Email select o.Email).Any() && !(from o in contexto.CelulaMiembroAsistencia where o.CelulaId == celulaId && o.MiembroId == m.MiembroId select o.MiembroId).Any() ? "Consolidacion" :
                    (from o in contexto.CelulaMiembroAsistencia where o.CelulaId == celulaId && o.MiembroId == m.MiembroId select o.MiembroId).Count() < 4 ? "Nuevo" : null,
                Peticiones = a.Peticiones
            }).ToList <Modelos.Retornos.AsistenciaDeCelulaPorMiembro>();

            Modelos.Retornos.AsistenciaDeCelulaPorMiembroSumarizada rtn = new Modelos.Retornos.AsistenciaDeCelulaPorMiembroSumarizada();
            rtn.Asistencias           = asistencias;
            rtn.CantidadDeRegistros   = asistencias.Count();
            rtn.CantidadDeAsistencias = asistencias.Count(o => o.Asistencia == true);

            return(rtn);
        }
        public void Execute(IJobExecutionContext context)
        {
            log.Debug("Iniciando NotificacionDeFaltaDeRegistroDeAsistencia");

            IglesiaEntities contexto = new IglesiaEntities();
            ManejadorDeReportesDeAsistencias manejadorDeAsistencias = new ManejadorDeReportesDeAsistencias();
            ManejadorDeCorreos manejadorDeCorreos = new ManejadorDeCorreos();
            DateTime           fecha        = DateTime.Now;
            DateTime           fechaInicial = fecha.GetFirstDateOfWeek().AddDays(-7);
            int    semanaActual             = fecha.GetWeekNumber();
            string tituloDelReporte         = string.Format("Asistencias de Celula NO REGISTRADAS de la semana {0} ({2} a {3})", semanaActual, fecha.Year, fechaInicial.ToString("dd/MMM/yy"), fechaInicial.AddDays(7).ToString("dd/MMM/yy"));

            //Obtenemos todos los miembros inscritos a este reporte
            List <int> inscripcionesANotificar = (from inscripciones in contexto.NotificacionDeAsistenciaInscripcion
                                                  join logs in contexto.NotificacionDeAsistenciaLog on
                                                  inscripciones.Id equals logs.NotificacionDeAsistenciaId into ps
                                                  from logs in ps.DefaultIfEmpty()
                                                  where
                                                  inscripciones.Borrado == false &&
                                                  inscripciones.Miembro.Borrado == false &&
                                                  (logs.Semana != semanaActual || logs == null) &&
                                                  (((inscripciones.DiaSemanaId == (int)fecha.DayOfWeek) && ((inscripciones.HoraDiaId / 2) - .5 <= fecha.Hour)) || // Si es el mismo dia de la inscripcion valida la hora actual contra la de la inscripcion
                                                   ((int)fecha.DayOfWeek > inscripciones.DiaSemanaId))                                                            // Si ya se paso del dia de la inscipcion se manda la notificacion sin importar la hora
                                                  select inscripciones.Id).ToList <int>();

            NotificacionDeAsistenciaInscripcion notificacionInscripcion;

            if (inscripcionesANotificar.Count > 0)
            {
                log.Debug(String.Format("{0} miembros inscritos a notificaciones", inscripcionesANotificar.Count));
                foreach (int inscripcionId in inscripcionesANotificar)
                {
                    // Obtenemos el miembro suscrito y su email
                    notificacionInscripcion = (from o in contexto.NotificacionDeAsistenciaInscripcion where o.Id == inscripcionId select o).SingleOrDefault();

                    // Se mandara un correo unico por miembro; incluyendo toda la info de todas las celulas a las que es lider directo
                    EmailMessage email = manejadorDeAsistencias.GenerarCorreoSemanalDeFaltaDeAsistenciasPorRed(fechaInicial, notificacionInscripcion.Miembro, (ManejadorDeReportesDeAsistencias.TipoDeReporte)notificacionInscripcion.TipoId, tituloDelReporte);

                    // Mandaremos el correo, unicamente si se genero. Si no tenia faltas de asistencias NO se manda correo.
                    if (email != null)
                    {
                        Action generarLog = delegate()
                        {
                            // Actualizamos o creamos el log; para guardar cuando fue la ultima vez que se proceso dicha inscripcion y no volverla a procesar hasta dentro de una semana
                            NotificacionDeAsistenciaLog notificacionLog = (from o in contexto.NotificacionDeAsistenciaLog where o.NotificacionDeAsistenciaId == inscripcionId select o).SingleOrDefault();

                            if (notificacionLog == null)
                            {
                                notificacionLog = new NotificacionDeAsistenciaLog();
                            }

                            notificacionLog.NotificacionDeAsistenciaId = inscripcionId;
                            notificacionLog.Semana = semanaActual;
                            notificacionLog.Guardar(contexto);

                            log.InfoFormat("Log de notificacion generado correctamente para: {0}", notificacionLog.NotificacionDeAsistenciaInscripcion.Miembro.Email);
                        };

                        log.Debug(String.Format("Al usuario {0} se le notificara de las celulas con falta de registro de asistencia", notificacionInscripcion.Miembro.NombreCompleto));

                        // Enviamos el correo
                        manejadorDeCorreos.EnviarCorreoAsync(email, generarLog);
                    }
                }
            }

            log.Debug("Finalizando NotificacionDeFaltaDeRegistroDeAsistencia");
        }
        public void Execute(IJobExecutionContext context)
        {
            log.Debug("Iniciando NotificacionDeNuevasBoletasDeConsolidacion");
            IglesiaEntities contexto = new IglesiaEntities();

            #region Reporte de Nuevas Boletas asignadas a Miembro

            List <ConsolidacionBoleta> boletasParaMiembros = (from o in contexto.ConsolidacionBoleta where o.Modificacion >= DateTime.Today && o.AsignadaAMiembroId != null && o.Borrado == false select o).ToList <ConsolidacionBoleta>();
            log.Debug(String.Format("{0} boletas ya asignadas a algun miembro modificadas hoy", boletasParaMiembros.Count));

            Dictionary <Miembro, List <ConsolidacionBoleta> > boletasPorMiembro = new Dictionary <Miembro, List <ConsolidacionBoleta> >();
            foreach (ConsolidacionBoleta boleta in boletasParaMiembros)
            {
                if (!boletasPorMiembro.ContainsKey(boleta.Miembro))
                {
                    boletasPorMiembro.Add(boleta.Miembro, new List <ConsolidacionBoleta>());
                }
                boletasPorMiembro[boleta.Miembro].Add(boleta);
            }

            foreach (KeyValuePair <Miembro, List <ConsolidacionBoleta> > entry in boletasPorMiembro)
            {
                log.DebugFormat("Iniciando reporte de Nuevas Boletas de Consolidacion para (miembro): {0} - {1} boletas", entry.Key.NombreCompleto, entry.Value.Count);
                EmailMessage email = new EmailMessage();

                // Contenido del correo
                StringBuilder contenido = new StringBuilder(750);
                contenido.AppendFormat("<h3>Reporte de Nuevas Boletas de Consolidacion para: {0}</h3>", entry.Key.NombreCompleto);
                contenido.AppendFormat("<p>A continuacion se mostraran las nuevas boletas de consolidacion:</p>");
                contenido.AppendLine("<table border='1' width='800px'><thead><tr><td>Id</td><td>Nombre</td><td>Edad</td><td>Genero</td><td>Direccion</td><td>Telefonos</td><td>Email</td></tr></thead><tbody>");
                foreach (ConsolidacionBoleta boleta in entry.Value)
                {
                    contenido.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td><td>{6}</td></tr>",
                                           boleta.Id, boleta.PrimerNombre + " " + boleta.ApellidoPaterno, boleta.Edad, boleta.Genero.Descripcion, boleta.Direccion + ", " + boleta.UbicacionMunicipio.Descripcion + ", " + boleta.UbicacionMunicipio.UbicacionEstado.Descripcion, boleta.TelefonoCasa + "|" + boleta.TelefonoMovil + "|" + boleta.TelefonoTrabajo, boleta.Email);
                }
                contenido.AppendFormat("</tbody></table>");
                email.BodyParts.Add(contenido.ToString(), BodyPartFormat.HTML);

                email.Recipients.Add(entry.Key.Email, entry.Key.NombreCompleto, RecipientType.To);
                email.Subject = "Nuevas Boletas de Consolidacion";

                ManejadorDeCorreos manejadorDeCorreos = new ManejadorDeCorreos();
                manejadorDeCorreos.EnviarCorreoAsync(email);
            }

            #endregion

            #region Reporte de Nuevas Boletas asignadas a Celula

            int estatus = ConsolidacionBoleta.Estatus.ASIGNADO_A_CELULA.Key;
            List <ConsolidacionBoleta> boletasParaCelulas = (from o in contexto.ConsolidacionBoleta where o.Modificacion >= DateTime.Today && o.AsignadaACelulaId != null && o.BoletaEstatusId == estatus && o.Borrado == false select o).ToList <ConsolidacionBoleta>();
            log.Debug(String.Format("{0} boletas ya asignadas a alguna celula modificadas hoy", boletasParaCelulas.Count));

            Dictionary <Celula, List <ConsolidacionBoleta> > boletasPorCelula = new Dictionary <Celula, List <ConsolidacionBoleta> >();
            foreach (ConsolidacionBoleta boleta in boletasParaCelulas)
            {
                if (!boletasPorCelula.ContainsKey(boleta.Celula))
                {
                    boletasPorCelula.Add(boleta.Celula, new List <ConsolidacionBoleta>());
                }
                boletasPorCelula[boleta.Celula].Add(boleta);
            }

            foreach (KeyValuePair <Celula, List <ConsolidacionBoleta> > entry in boletasPorCelula)
            {
                log.DebugFormat("Iniciando reporte de Nuevos Miembros asignados desde Consolidacion para (celula): {0} [{1}] - {2} boletas", entry.Key.Descripcion, entry.Key.CelulaId, entry.Value.Count);
                EmailMessage email = new EmailMessage();

                // Contenido del correo
                StringBuilder contenido = new StringBuilder(750);
                contenido.AppendFormat("<h3>Reporte de Nuevos Miembros asignados desde Consolidacion para: {0}</h3>", entry.Key.Descripcion);
                contenido.AppendFormat("<p>A continuacion se mostraran los nuevos miembros asignados desde consolidacion:</p>");
                contenido.AppendLine("<table border='1' width='800px'><thead><tr><td>Id</td><td>Nombre</td><td>Edad</td><td>Genero</td><td>Direccion</td><td>Telefonos</td><td>Email</td></tr></thead><tbody>");
                foreach (ConsolidacionBoleta boleta in entry.Value)
                {
                    contenido.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td><td>{6}</td></tr>",
                                           boleta.Id, boleta.PrimerNombre + " " + boleta.ApellidoPaterno, boleta.Edad, boleta.Genero.Descripcion, boleta.Direccion + ", " + boleta.UbicacionMunicipio.Descripcion + ", " + boleta.UbicacionMunicipio.UbicacionEstado.Descripcion, boleta.TelefonoCasa + "|" + boleta.TelefonoMovil + "|" + boleta.TelefonoTrabajo, boleta.Email);
                }
                contenido.AppendFormat("</tbody></table>");
                email.BodyParts.Add(contenido.ToString(), BodyPartFormat.HTML);

                // Agregamos a todos los lideres de celula al correo
                foreach (CelulaLider celulaLider in entry.Key.CelulaLider.Where(x => x.Borrado == false))
                {
                    email.Recipients.Add(celulaLider.Miembro.Email, celulaLider.Miembro.NombreCompleto, RecipientType.To);
                }

                email.Subject = "Nuevas Miembros asignados desde Consolidacion";

                ManejadorDeCorreos manejadorDeCorreos = new ManejadorDeCorreos();
                manejadorDeCorreos.EnviarCorreoAsync(email);
            }

            #endregion

            log.Debug("Finalizando NotificacionDeNuevasBoletasDeConsolidacion");
        }
        public void BorrarCelulaPermanentemente(int celulaId)
        {
            List <int> celulas = this.ObtenerRedInferior(celulaId);

            celulas.Add(celulaId);

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 10, 0)))
            {
                foreach (int celula in celulas)
                {
                    // Se va a hacer cambios a los miembros, sin borrarlos en si
                    using (var contexto = new IglesiaEntities())
                    {
                        // Obtenemos todos los miembros de la celula
                        // List<int> miembros = (from o in contexto.Miembro where o.CelulaId == celula select o.MiembroId).Take<int>(1).ToList<int>();
                        List <int> miembros = (from o in contexto.Miembro where o.CelulaId == celula select o.MiembroId).ToList <int>();

                        foreach (int miembro in miembros)
                        {
                            // Borramos las "Fotos" de cada miembro
                            foreach (MiembroFoto aBorrar in (from o in contexto.MiembroFoto where o.MiembroId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos los "Pasos" de cada miembro
                            foreach (MiembroPaso aBorrar in (from o in contexto.MiembroPaso where o.MiembroId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos los "Roles" de cada miembro
                            foreach (MiembroRol aBorrar in (from o in contexto.MiembroRol where o.MiembroId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos las "Asistencias a las celulas" de cada miembro
                            foreach (CelulaMiembroAsistencia aBorrar in (from o in contexto.CelulaMiembroAsistencia where o.MiembroId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos las "Asistencias Registradas" de cada miembro
                            foreach (CelulaMiembroAsistencia aBorrar in (from o in contexto.CelulaMiembroAsistencia where o.MiembroQueRegistraId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos las "Asistencias de Invitados Registradas" de cada miembro
                            foreach (CelulaInvitadosAsistencia aBorrar in (from o in contexto.CelulaInvitadosAsistencia where o.MiembroQueRegistraId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos las "Cancelaciones Registradas" de cada miembro
                            foreach (CelulaCancelacionAsistencia aBorrar in (from o in contexto.CelulaCancelacionAsistencia where o.MiembroQueRegistraId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos los "Liderazgos" de cada miembro
                            foreach (CelulaLider aBorrar in (from o in contexto.CelulaLider where o.MiembroId == miembro select o))
                            {
                                contexto.DeleteObject(aBorrar);
                            }

                            // Borramos las "Notificaciones de Asistencia" de cada miembro
                            foreach (NotificacionDeAsistenciaInscripcion aBorrar in (from o in contexto.NotificacionDeAsistenciaInscripcion where o.MiembroId == miembro select o))
                            {
                                NotificacionDeAsistenciaLog log = (from o in contexto.NotificacionDeAsistenciaLog where o.NotificacionDeAsistenciaId == aBorrar.Id select o).SingleOrDefault();
                                if (log != null)
                                {
                                    contexto.DeleteObject(log);
                                }

                                contexto.DeleteObject(aBorrar);
                            }

                            // Modificamos las "Boletas de Consolidacion" asignadas a cada miembro
                            foreach (ConsolidacionBoleta aModificar in (from o in contexto.ConsolidacionBoleta where o.AsignadaAMiembroId == miembro select o))
                            {
                                aModificar.AsignadaAMiembroId = null;
                            }

                            // Modificamos las "Boletas de Consolidacion" en que cada miembro "invito"
                            foreach (ConsolidacionBoleta aModificar in (from o in contexto.ConsolidacionBoleta where o.InvitadoPorMiembroId == miembro select o))
                            {
                                aModificar.InvitadoPorMiembroId = null;
                            }

                            // Modificamos las "Conyugues" en cada miembro
                            foreach (Miembro aModificar in (from o in contexto.Miembro where o.ConyugeId == miembro select o))
                            {
                                aModificar.ConyugeId = null;
                            }
                        }

                        // Guardamos los cambios en la BD (Por miembros...)
                        contexto.SaveChanges(SaveOptions.DetectChangesBeforeSave, true);
                    }

                    // Se va a hacer cambios a los miembros, incluido borrarlos
                    using (var contexto = new IglesiaEntities()) {
                        // Obtenemos todos los miembros de la celula
                        List <int> miembros = (from o in contexto.Miembro where o.CelulaId == celula select o.MiembroId).ToList <int>();

                        foreach (int miembro in miembros)
                        {
                            // Borramos los miembros en si
                            Miembro miembroABorrar = (from o in contexto.Miembro where o.MiembroId == miembro select o).SingleOrDefault();
                            contexto.DeleteObject(miembroABorrar);
                        }

                        // Guardamos los cambios en la BD (Por miembros...)
                        contexto.SaveChanges(SaveOptions.DetectChangesBeforeSave, true);
                    }


                    // Se va a hacer cambios a las celulas, incluido borrarlas
                    using (var contexto = new IglesiaEntities())
                    {
                        // Borramos las "Asistencias" de la celula en si
                        foreach (CelulaMiembroAsistencia aBorrar in (from o in contexto.CelulaMiembroAsistencia where o.CelulaId == celula select o))
                        {
                            contexto.DeleteObject(aBorrar);
                        }

                        // Borramos las "Asistencias de Invitados" de la celula en si
                        foreach (CelulaInvitadosAsistencia aBorrar in (from o in contexto.CelulaInvitadosAsistencia where o.CelulaId == celula select o))
                        {
                            contexto.DeleteObject(aBorrar);
                        }

                        // Borramos las "Cancelaciones de Asistencia" de la celula en si
                        foreach (CelulaCancelacionAsistencia aBorrar in (from o in contexto.CelulaCancelacionAsistencia where o.CelulaId == celula select o))
                        {
                            contexto.DeleteObject(aBorrar);
                        }

                        // Borramos los "Liderazgos" de la celula en si
                        foreach (CelulaLider aBorrar in (from o in contexto.CelulaLider where o.CelulaId == celula select o))
                        {
                            contexto.DeleteObject(aBorrar);
                        }

                        // Modificamos las "Boletas de Consolidacion" asignadas a la celula en si
                        foreach (ConsolidacionBoleta aBorrar in (from o in contexto.ConsolidacionBoleta where o.AsignadaACelulaId == celula select o))
                        {
                            aBorrar.AsignadaACelulaId = null;
                        }

                        // Modificamos las "Celula Predeterminada para las Boletas de Consolidacion" asignadas a la celula en si
                        foreach (ConsolidacionBoletaCategoria aModificar in (from o in contexto.ConsolidacionBoletaCategoria where o.CelulaPredeterminadaId == celula select o))
                        {
                            aModificar.CelulaPredeterminadaId = 1;
                        }

                        // Boramos la celula en si
                        Celula celulaABorrar = (from o in contexto.Celula where o.CelulaId == celula select o).SingleOrDefault();
                        contexto.DeleteObject(celulaABorrar);

                        // Guardamos los cambios en la BD (Por celula...)
                        contexto.SaveChanges(SaveOptions.DetectChangesBeforeSave, true);
                    }
                }

                scope.Complete();
            }

            Cache.Instance.Limpiar();
        }
        private void mostrarAnunciosYAlertas()
        {
            ManejadorDeCelulas manejadorCelulas  = new ManejadorDeCelulas();
            int             miembroId            = SesionActual.Instance.UsuarioId;
            List <int>      idsCelulasPermitidas = manejadorCelulas.ObtenerCelulasPermitidasPorMiembroComoIds(SesionActual.Instance.UsuarioId);
            DateTime        fechaInicioDeSemana  = DateTime.Now.GetFirstDateOfWeek();
            DateTime        fechaFinDeSemana     = DateTime.Now.GetLastDateOfWeek();
            IglesiaEntities contexto             = SesionActual.Instance.getContexto <IglesiaEntities>();

            // Obtenemos las boletas de consolidacion sin reportes en esta semana
            int numDeBoletasSinReporteSemanal = (from o in contexto.ConsolidacionBoleta
                                                 where
                                                 o.Borrado == false &&
                                                 o.BoletaEstatusId > 100 &&
                                                 o.AsignadaACelulaId != null &&
                                                 idsCelulasPermitidas.Contains(o.AsignadaACelulaId.Value) &&
                                                 !contexto.ConsolidacionBoletaReporte.Any(t =>
                                                                                          t.Borrado == false &&
                                                                                          t.ConsolidacionBoletaId == o.Id &&
                                                                                          t.Creacion >= fechaInicioDeSemana &&
                                                                                          t.Creacion <= fechaFinDeSemana)
                                                 select o).Count();

            if (numDeBoletasSinReporteSemanal > 0)
            {
                generarAlerta(string.Format("Tienes {0} boleta(s) de consolidación sin reportar esta semana!", numDeBoletasSinReporteSemanal));
            }

            // Obtenemos las celulas directas que no tienen asistencia registrada esta semana
            int numDeCelulasSinAsistenciaSemanal = (from o in contexto.Celula
                                                    where
                                                    o.Borrado == false &&
                                                    contexto.CelulaLider.Any(t =>
                                                                             t.Borrado == false &&
                                                                             t.CelulaId == o.CelulaId &&
                                                                             t.MiembroId == miembroId
                                                                             ) &&
                                                    !contexto.CelulaMiembroAsistencia.Any(t =>
                                                                                          t.CelulaId == o.CelulaId &&
                                                                                          t.Dia >= fechaInicioDeSemana.Day &&
                                                                                          t.Mes >= fechaInicioDeSemana.Month &&
                                                                                          t.Anio >= fechaInicioDeSemana.Year &&
                                                                                          t.Dia <= fechaFinDeSemana.Day &&
                                                                                          t.Mes <= fechaFinDeSemana.Month &&
                                                                                          t.Anio <= fechaFinDeSemana.Year
                                                                                          ) &&
                                                    !contexto.CelulaCancelacionAsistencia.Any(t =>
                                                                                              t.CelulaId == o.CelulaId &&
                                                                                              t.Dia >= fechaInicioDeSemana.Day &&
                                                                                              t.Mes >= fechaInicioDeSemana.Month &&
                                                                                              t.Anio >= fechaInicioDeSemana.Year &&
                                                                                              t.Dia <= fechaFinDeSemana.Day &&
                                                                                              t.Mes <= fechaFinDeSemana.Month &&
                                                                                              t.Anio <= fechaFinDeSemana.Year
                                                                                              )
                                                    select o).Count();

            if (numDeCelulasSinAsistenciaSemanal > 0)
            {
                generarAlerta("Esta semana no has registrado asistencia en todas tus células!");
            }
        }