// GET: ActividadCumplimiento/Create
        public ActionResult Crear(int idPlanDeTrabajo)
        {
            var list = db.Tb_ObjEmpresa.Where(c => c.Empr_Nit == AccountData.NitEmpresa).Select(o => new { Id = o.Oemp_Id, Value = o.Oemp_Nombre }).ToList();

            ViewBag.objetivosEmpresa = new SelectList(list, "Id", "Value");
            Empresa         empresa   = db.Tb_Empresa.Where(e => e.Empr_Nit == AccountData.NitEmpresa).FirstOrDefault();
            ApplicationUser usuario   = db.Users.Find(AccountData.UsuarioId);
            var             listusers = db.Users.Where(c => c.Empr_Nit == AccountData.NitEmpresa).Select(o => new { Id = o.Id, Value = o.Pers_Nom1 }).ToList();

            ViewBag.users = new SelectList(listusers, "Id", "Value");
            PlandeTrabajo planT = db.Tb_PlandeTrabajo.Find(idPlanDeTrabajo);

            ViewBag.datestart = planT.FechaInicio;
            ViewBag.dateend   = planT.FechaFin;
            ViewModelActividadCumplimiento model = new ViewModelActividadCumplimiento();

            ViewBag.ReturnUrl = Request.UrlReferrer;
            ViewBag.idptrab   = idPlanDeTrabajo;
            return(View(model));
        }
        public ActionResult Crear([Bind(Include = "NombreActividad,Meta,FechaInicial,FechaFinal,hora,Frecuencia,idObjetivo,Frecuencia_desc,period,weekly_0,weekly_1,weekly_2,weekly_3,weekly_4,weekly_5,weekly_6,retornar,asigrecursos,IdUser,idPlanDeTrabajo")] ViewModelActividadCumplimiento model)
        {
            // TODO: Add insert logic here
            Empresa empresa = db.Tb_Empresa.Where(e => e.Empr_Nit == AccountData.NitEmpresa).FirstOrDefault();

            ApplicationUser usuario = db.Users.Find(AccountData.UsuarioId);
            // resolvemos el dia de la semana segun el checkbox seleccionado
            string dias = "";

            if (model.weekly_0 != null)
            {
                dias += "lunes,";
            }
            if (model.weekly_1 != null)
            {
                dias += "martes,";
            }
            if (model.weekly_2 != null)
            {
                dias += "miercoles,";
            }
            if (model.weekly_3 != null)
            {
                dias += "jueves,";
            }
            if (model.weekly_4 != null)
            {
                dias += "viernes,";
            }
            if (model.weekly_5 != null)
            {
                dias += "sabado,";
            }
            if (model.weekly_6 != null)
            {
                dias += "domingo,";
            }

            // TODO: Add insert logic here
            ActiCumplimiento actcumplimiento = new ActiCumplimiento
            {
                Acum_Desc       = model.NombreActividad,
                Acum_Porcentest = model.Meta,
                Acum_IniAct     = model.FechaInicial,
                Acum_FinAct     = model.FechaFinal,
                Oemp_Id         = model.idObjetivo,
                Acum_Registro   = DateTime.Now,
                Id           = model.IdUser,
                Frec_Id      = Convert.ToInt32(model.Frecuencia),
                Peri_Id      = 6,
                Empr_Nit     = empresa.Empr_Nit,
                Repeticiones = model.period,
                DiasSemana   = dias,
                HoraAct      = model.hora,
                Finalizada   = false,
                asigrecursos = model.asigrecursos
            };

            db.Tb_ActiCumplimiento.Add(actcumplimiento);

            db.SaveChanges();
            /// adicionamos el usuario asignado responsable para la actividad
            UsuariosPlandetrabajo user = new UsuariosPlandetrabajo
            {
                Acum_Id = actcumplimiento.Acum_Id,
                Plat_Id = model.idPlanDeTrabajo,
                Emp_Id  = AccountData.NitEmpresa,
                Id      = model.IdUser
            };

            db.Tb_UsersPlandeTrabajo.Add(user);
            db.SaveChanges();
            //Generamos la programacion de tareas en el tiempo.
            generateAppoiment(model, actcumplimiento.Acum_Id);

            var link = model.retornar;

            return(Redirect(link));
        }
        // GET: ActividadCumplimiento/Edit/5
        /// <summary>
        /// Lista la actividad si es encontrado mediante el id que recibe si no es nullable
        /// </summary>
        /// <param name="id">id actividad si no es nullable</param>
        /// <returns>retorna la actividad a editar</returns>
        public ActionResult Edit(int id)
        {
            var listfrec = db.Tb_Frecuencia.Select(o => new { Id = o.Frec_Id, Value = o.Frec_Descripcion }).ToList();

            ViewBag.frecuenciaEmpresa = new SelectList(listfrec, "Id", "Value");
            var list = db.Tb_ObjEmpresa.Where(c => c.Empr_Nit == AccountData.NitEmpresa).Select(o => new { Id = o.Oemp_Id, Value = o.Oemp_Nombre }).ToList();

            ViewBag.objetivosEmpresa = new SelectList(list, "Id", "Value");
            Empresa empresa             = db.Tb_Empresa.Where(e => e.Empr_Nit == AccountData.NitEmpresa).FirstOrDefault();
            UsuariosPlandetrabajo upt   = db.Tb_UsersPlandeTrabajo.Where(e => e.Acum_Id == id).FirstOrDefault();
            PlandeTrabajo         planT = db.Tb_PlandeTrabajo.Find(upt.Plat_Id);

            ViewBag.datestart = planT.FechaInicio;
            ViewBag.dateend   = planT.FechaFin;
            ApplicationUser usuario   = db.Users.Find(AccountData.UsuarioId);
            var             listusers = db.Users.Where(c => c.Empr_Nit == AccountData.NitEmpresa).Select(o => new { Id = o.Id, Value = o.Pers_Nom1 }).ToList();

            ViewBag.users = new SelectList(listusers, "Id", "Value");
            var model2 = db.Tb_ActiCumplimiento.Find(id);
            ViewModelActividadCumplimiento model = new ViewModelActividadCumplimiento
            {
                IdActiCumplimiento = model2.Acum_Id,
                IdEmpresa          = model2.Empr_Nit,
                NombreActividad    = model2.Acum_Desc,
                Meta         = model2.Acum_Porcentest,
                idObjetivo   = model2.Oemp_Id,
                FechaInicial = model2.Acum_IniAct,
                FechaFinal   = model2.Acum_FinAct,
                hora         = model2.HoraAct,
                Frecuencia   = Convert.ToString(model2.Frec_Id),
                period       = model2.Repeticiones,
                Finalizada   = model2.Finalizada,
                asigrecursos = model2.asigrecursos,
                IdUser       = model2.Id
            };

            if (model2.DiasSemana != null)
            {
                var lunes     = model2.DiasSemana.Contains("lunes");
                var martes    = model2.DiasSemana.Contains("martes");
                var miercoles = model2.DiasSemana.Contains("miercoles");
                var jueves    = model2.DiasSemana.Contains("jueves");
                var viernes   = model2.DiasSemana.Contains("viernes");
                var sabado    = model2.DiasSemana.Contains("sabado");
                var domingo   = model2.DiasSemana.Contains("domingo");
                if (lunes)
                {
                    ViewData["lunes"] = "checked";
                }

                if (martes)
                {
                    ViewData["martes"] = "checked";
                }

                if (miercoles)
                {
                    ViewData["miercoles"] = "checked";
                }

                if (jueves)
                {
                    ViewData["jueves"] = "checked";
                }

                if (viernes)
                {
                    ViewData["viernes"] = "checked";
                }

                if (sabado)
                {
                    ViewData["sabado"] = "checked";
                }

                if (domingo)
                {
                    ViewData["domingo"] = "checked";
                }
            }
            ViewData["userid"] = model2.Id;
            return(View(model));
        }
        public ActionResult Edit([Bind(Include = "IdEmpresa,IdActiCumplimiento,NombreActividad,Meta,FechaInicial,FechaFinal,hora,Frecuencia,idObjetivo,Frecuencia_desc,period,weekly_0,weekly_1,weekly_2,weekly_3,weekly_4,weekly_5,weekly_6,retornar,asigrecursos,Finalizada,IdUser")] ViewModelActividadCumplimiento model)
        {
            UsuariosPlandetrabajo uplant = db.Tb_UsersPlandeTrabajo.Where(e => e.Acum_Id == model.IdActiCumplimiento).FirstOrDefault();
            Empresa empresa = db.Tb_Empresa.Where(e => e.Empr_Nit == AccountData.NitEmpresa).FirstOrDefault();

            ApplicationUser usuario        = db.Users.Find(AccountData.UsuarioId);
            string          dias           = "";
            string          periodo        = model.Frecuencia;
            string          frecuenciadesc = "";

            if (model.weekly_0 != null)
            {
                dias += "lunes,";
            }
            if (model.weekly_1 != null)
            {
                dias += "martes,";
            }
            if (model.weekly_2 != null)
            {
                dias += "miercoles,";
            }
            if (model.weekly_3 != null)
            {
                dias += "jueves,";
            }
            if (model.weekly_4 != null)
            {
                dias += "viernes,";
            }
            if (model.weekly_5 != null)
            {
                dias += "sabado,";
            }
            if (model.weekly_6 != null)
            {
                dias += "domingo,";
            }

            if (periodo == "1")
            {
                frecuenciadesc = "norepeat";
            }
            else if (periodo == "2")
            {
                frecuenciadesc = "daily";
            }
            else if (periodo == "3")
            {
                frecuenciadesc = "weekly";
            }
            else if (periodo == "4")
            {
                frecuenciadesc = "monthly";
            }
            else if (periodo == "8")
            {
                frecuenciadesc = "bimestral";
            }
            else if (periodo == "9")
            {
                frecuenciadesc = "trimestral";
            }
            else if (periodo == "10")
            {
                frecuenciadesc = "semestral";
            }
            model.Frecuencia_desc = frecuenciadesc;

            // TODO: Add insert logic here
            ActiCumplimiento actcumplimiento = new ActiCumplimiento
            {
                Acum_Id         = model.IdActiCumplimiento,
                Acum_Ejec       = null,
                Acum_Desc       = model.NombreActividad,
                Acum_Porcentest = model.Meta,
                Acum_IniAct     = model.FechaInicial,
                Acum_FinAct     = model.FechaFinal,
                Oemp_Id         = model.idObjetivo,
                Acum_Registro   = DateTime.Now,
                Id           = model.IdUser,
                Frec_Id      = Convert.ToInt32(model.Frecuencia),
                Peri_Id      = 6,
                Empr_Nit     = empresa.Empr_Nit,
                Repeticiones = model.period,
                DiasSemana   = dias,
                HoraAct      = model.hora,
                asigrecursos = model.asigrecursos,
                Finalizada   = model.Finalizada
            };


            db.Entry(actcumplimiento).State = EntityState.Modified;
            db.SaveChanges();

            var prog = db.Tb_ProgamacionTareas.Where(e => e.ActiCumplimiento_Id == actcumplimiento.Acum_Id).ToList();

            foreach (var program in prog)
            {
                program.Estado = false;
            }

            db.SaveChanges();
            generateAppoiment(model, actcumplimiento.Acum_Id);



            //Generamos la programacion de tareas en el tiempo.

            return(RedirectToAction("Index"));
        }
        private void generateAppoiment(ViewModelActividadCumplimiento model, int idActcumplimiento)
        {
            //// se asigna fecha inicial a la fecha final para tener solo una fecha de ejecucion
            //model.FechaFinal = model.FechaInicial;
            List <Schedule> schedules = new List <Schedule>();

            if (model.Frecuencia_desc == "norepeat")
            {
                SingleSchedule single1 = new SingleSchedule
                {
                    Name      = model.NombreActividad,
                    TimeOfDay = model.hora, //new TimeSpan(19, 30, 0),
                    Date      = model.FechaInicial.Date
                };
                schedules.Add(single1);
            }
            else if (model.Frecuencia_desc == "daily")
            {
                SimpleRepeatingSchedule simple = new SimpleRepeatingSchedule
                {
                    Name            = model.NombreActividad,
                    TimeOfDay       = model.hora,//new TimeSpan(10, 0, 0),
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                    //DaysBetween = model.period
                };
                schedules.Add(simple);
            }
            else if (model.Frecuencia_desc == "weekly")
            {
                WeeklySchedule weekly = new WeeklySchedule
                {
                    Name            = model.NombreActividad,
                    TimeOfDay       = model.hora,//TimeSpan(8, 0, 0),
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                };

                //Seteamos loas dias de la semana seleccionados.
                int i = 0;
                List <DayOfWeek> dayOfWeeks = new List <DayOfWeek>();
                if (model.weekly_0 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Monday);
                    i++;
                }

                if (model.weekly_1 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Tuesday);
                    i++;
                }

                if (model.weekly_2 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Wednesday);
                    i++;
                }

                if (model.weekly_3 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Thursday);
                    i++;
                }

                if (model.weekly_4 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Friday);
                    i++;
                }

                if (model.weekly_5 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Saturday);
                    i++;
                }

                if (model.weekly_6 != null)
                {
                    dayOfWeeks.Add(DayOfWeek.Sunday);
                    i++;
                }

                weekly.SetDays(dayOfWeeks);

                schedules.Add(weekly);
            }
            else if (model.Frecuencia_desc == "monthly")
            {
                MonthlySchedule monthly = new MonthlySchedule
                {
                    Name            = model.NombreActividad,
                    TimeOfDay       = model.hora,//TimeSpan(8, 0, 0),
                    DayOfMonth      = model.period,
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                };
                schedules.Add(monthly);
            }
            else if (model.Frecuencia_desc == "bimestral")
            {
                EveryXMonthsSchedule everyxMonths = new EveryXMonthsSchedule
                {
                    Name            = model.NombreActividad,
                    MonthsBetween   = 2, //Cada dos meses
                    TimeOfDay       = model.hora,
                    DayOfMonth      = model.period,
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                };
                schedules.Add(everyxMonths);
            }
            else if (model.Frecuencia_desc == "trimestral")
            {
                EveryXMonthsSchedule everyxMonths = new EveryXMonthsSchedule
                {
                    Name            = model.NombreActividad,
                    MonthsBetween   = 3, //Cada tres meses
                    TimeOfDay       = model.hora,
                    DayOfMonth      = model.period,
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                };
                schedules.Add(everyxMonths);
            }
            else if (model.Frecuencia_desc == "semestral")
            {
                EveryXMonthsSchedule everyxMonths = new EveryXMonthsSchedule
                {
                    Name            = model.NombreActividad,
                    MonthsBetween   = 6, //Cada Seis meses
                    TimeOfDay       = model.hora,
                    DayOfMonth      = model.period,
                    SchedulingRange = new Period(model.FechaInicial.Date, model.FechaFinal.Date),
                };
                schedules.Add(everyxMonths);
            }

            CalendarGenerator         generator    = new CalendarGenerator();
            Period                    period       = new Period(model.FechaInicial.Date, model.FechaFinal.Date);
            IEnumerable <Appointment> appointments = generator.GenerateCalendar(period, schedules);

            foreach (var app in appointments)
            {
                db.Tb_ProgamacionTareas.Add(
                    new ProgamacionTareas
                {
                    ActiCumplimiento_Id = idActcumplimiento,
                    Descripcion         = app.Name,
                    //FechaHora = new DateTime(model.FechaInicial.Year, model.FechaInicial.Month, model.FechaInicial.Day, model.hora.Hours, model.hora.Minutes, model.hora.Seconds),
                    FechaHora  = app.Time,
                    Estado     = true,
                    Finalizada = false,
                }
                    );
            }
            db.SaveChanges();
        }