public async Task <ActionResult> M_UpdateDates(string c)
        {
            Mobile   oMobile = new Mobile();
            clientes cl      = db.clientes.Where(m => m.codigo == c).FirstOrDefault();

            if (cl != null)
            {
                DateTime       today     = CurrentDate.getNow();
                venta_usuarios clientSls = await db.venta_usuarios.Where(m => m.cliente_id == cl.id_alt && m.fecha_fin > today).OrderBy(m => m.fecha_fin).FirstOrDefaultAsync();

                citas clientAppointments = await db.citas.Where(m => m.cliente_id == cl.id_alt && m.fecha > today).OrderBy(m => m.fecha).FirstOrDefaultAsync();

                Dictionary <string, object> oDict = new Dictionary <string, object>();
                oDict.Add(key: "upcoming_nut_appointment_date", value: clientAppointments != null ? clientAppointments.fecha.ToShortDateString() : null);
                oDict.Add(key: "upcoming_membership_renewal_date", value: clientSls != null ? clientSls.fecha_fin.ToShortDateString() : null);

                return(Json(
                           oMobile.GetDictForJSON(
                               message: "Usuario validado",
                               data: oDict,
                               code: MobileResponse.Success),
                           JsonRequestBehavior.AllowGet));
            }

            return(Json(
                       oMobile.GetDictForJSON(
                           message: "Error de validación de usuario.",
                           data: null,
                           code: MobileResponse.Error),
                       JsonRequestBehavior.AllowGet));
        }
        public async Task <ActionResult> Create([Bind(Include = "id,local_id,cliente_id,vendedor_id,fecha_inicio,fecha_fin,cantidad_semanas,cantidad_dias_congelamiento,semanas_precio_id,solicitud_permiso_congelamiento,tipo_ingreso,campana_marketing_id,numero_boleta,tipo_pago,monto,atendido,created_at,updated_at,deleted_at")] venta_usuarios venta_usuarios, int clientId)
        {
            bool usrIsBoss = db.vendedores.Where(m => m.usuario_id == venta_usuarios.vendedor_id).Select(m => m.jefe).FirstOrDefault() ?? false;

            if (!usrIsBoss && venta_usuarios.solicitud_permiso_congelamiento == true)
            {
                solicitud_permisos sp = new solicitud_permisos();
                sp.usuario_solicitante = venta_usuarios.vendedor_id;
                sp.usuario_jefe        = db.vendedores.Where(m => m.jefe == true).Select(m => m.usuario_id).FirstOrDefault();
                sp.valor_modificado    = venta_usuarios.cantidad_dias_congelamiento;
                sp.valor_defecto       = db.congelamiento_semanas.Where(m => venta_usuarios.cantidad_dias_congelamiento >= m.desde).Where(m => venta_usuarios.cantidad_dias_congelamiento <= m.hasta).Select(m => m.cantidad_dias).FirstOrDefault();
                sp.created_at          = DateTimeOffset.Now.Date;
                sp.updated_at          = DateTimeOffset.Now.Date;

                await backJobs.AskForPermission(sp : sp);
            }
            venta_usuarios.cliente_id = clientId;

            venta_usuarios.created_at = DateTimeOffset.Now.DateTime;
            venta_usuarios.updated_at = DateTimeOffset.Now.DateTime;

            db.venta_usuarios.Add(venta_usuarios);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
        public async Task <ActionResult> M_GetAvailableFreezingDays(string c)
        {
            clientes cl      = db.clientes.Where(m => m.codigo == c).FirstOrDefault();
            DateTime today   = CurrentDate.getNow();
            Mobile   oMobile = new Mobile();

            if (cl != null)
            {
                //select * from [dbo].[venta_usuarios] where cliente_id = 11 and fecha_inicio >= '2016-09-29 00:00:00.000' order by fecha_inicio
                venta_usuarios user_sales = await db.venta_usuarios.Where(m => m.cliente_id == cl.id_alt && m.fecha_inicio <= today && m.fecha_fin >= today).FirstOrDefaultAsync();

                Dictionary <string, object> oDict = new Dictionary <string, object>();
                oDict.Add("days", user_sales.cantidad_dias_congelamiento);

                return(Json(
                           oMobile.GetDictForJSON(
                               message: "",
                               data: oDict,
                               code: MobileResponse.Success),
                           JsonRequestBehavior.AllowGet));
            }

            return(Json(
                       oMobile.GetDictForJSON(
                           message: "Error en la solicitud",
                           data: null,
                           code: MobileResponse.Error),
                       JsonRequestBehavior.AllowGet));
        }
        public async Task <ActionResult> DeleteConfirmed(int id)
        {
            venta_usuarios venta_usuarios = await db.venta_usuarios.FindAsync(id);

            db.venta_usuarios.Remove(venta_usuarios);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
        public ActionResult M_LogInClient(string c, int k)
        {
            Mobile oMobile = new Mobile();

            clientes cl          = db.clientes.Where(m => m.codigo == c).Include(m => m.nutricionistas.usuarios).FirstOrDefault();
            int      daysInMonth = DateTime.DaysInMonth(CurrentDate.getNow().Year, CurrentDate.getNow().Month);

            DateTime firstDay = new DateTime(CurrentDate.getNow().Year, CurrentDate.getNow().Month, 1);
            DateTime lastDay  = new DateTime(CurrentDate.getNow().Year, CurrentDate.getNow().Month, daysInMonth);

            if (cl != null && k == cl.password)
            {
                DateTime          today     = CurrentDate.getNow();
                programa_clientes clientPrg = db.programa_clientes.Where(m => m.cliente_id == cl.id_alt && m.fecha_fin >= today).Include(m => m.programa).OrderBy(m => m.fecha_fin).FirstOrDefault();
                venta_usuarios    clientSls = db.venta_usuarios.Where(m => m.cliente_id == cl.id_alt && m.fecha_fin >= today).OrderBy(m => m.fecha_fin).FirstOrDefault();

                if (clientPrg == null || clientSls == null)
                {
                    return(Json(
                               oMobile.GetDictForJSON(
                                   message: "Cliente no cuenta con programa asignado o boleta vigente en el sistema.",
                                   data: null,
                                   code: MobileResponse.Success),
                               JsonRequestBehavior.AllowGet));
                }

                citas clientAppointments = db.citas.Where(m => m.cliente_id == cl.id_alt && m.fecha > today).OrderBy(m => m.fecha).FirstOrDefault();

                Dictionary <string, object> oDict = new Dictionary <string, object>();
                oDict.Add(key: "name", value: cl.nombres);
                oDict.Add(key: "last_name", value: cl.apellidos);
                oDict.Add(key: "code", value: cl.id_alt);
                oDict.Add(key: "img", value: Convert.ToBase64String(cl.foto));
                oDict.Add(key: "curr_program", value: clientPrg.programa.nombre);
                oDict.Add(key: "curr_nutritionist", value: cl.nutricionistas.usuarios.nombres ?? null);
                oDict.Add(key: "curr_ticket", value: clientSls.numero_boleta);
                oDict.Add(key: "upcoming_nut_appointment_date", value: clientAppointments != null ? clientAppointments.fecha.ToShortDateString() : null);
                oDict.Add(key: "upcoming_membership_renewal_date", value: clientSls != null ? clientSls.fecha_fin.ToShortDateString() : null);


                return(Json(
                           oMobile.GetDictForJSON(
                               message: "Inicio de sesión correcto.",
                               data: oDict,
                               code: MobileResponse.Success),
                           JsonRequestBehavior.AllowGet));
            }

            return(Json(
                       oMobile.GetDictForJSON(
                           message: "Error de inicio de sesión.",
                           data: null,
                           code: MobileResponse.Error),
                       JsonRequestBehavior.AllowGet));
        }
        // GET: VentaUsuarios/Details/5
        public async Task <ActionResult> Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            venta_usuarios venta_usuarios = await db.venta_usuarios.FindAsync(id);

            if (venta_usuarios == null)
            {
                return(HttpNotFound());
            }
            return(View(venta_usuarios));
        }
        // GET: VentaUsuarios/Edit/5
        public async Task <ActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            venta_usuarios venta_usuarios = await db.venta_usuarios.FindAsync(id);

            if (venta_usuarios == null)
            {
                return(HttpNotFound());
            }
            ViewBag.cliente_id = new SelectList(db.clientes, "id_alt", "codigo", venta_usuarios.cliente_id);
            ViewBag.local_id   = new SelectList(db.locales, "id", "nombre", venta_usuarios.local_id);
            return(View(venta_usuarios));
        }
        public async Task <int> GetUsedWeeks(int ClientId, int LastSaleId)
        {
            venta_usuarios           usrSales  = db.venta_usuarios.Where(v => v.id == LastSaleId).FirstOrDefault();
            List <programa_clientes> prgClient = await db.programa_clientes
                                                 .Where(p => p.cliente_id == ClientId && p.fecha_inicio >= usrSales.fecha_inicio && p.fecha_fin <= usrSales.fecha_fin)
                                                 .Include(p => p.programa)
                                                 .ToListAsync();

            int usedWeeks = 0;

            if (prgClient != null)
            {
                foreach (programa_clientes p in prgClient)
                {
                    usedWeeks += p.programa.semanas;
                }
            }

            return(usedWeeks);
        }
        public async Task <ActionResult> Edit([Bind(Include = "id,local_id,cliente_id,vendedor_id,fecha_inicio,fecha_fin,cantidad_semanas,cantidad_dias_congelamiento,solicitud_permiso_congelamiento,tipo_ingreso,campana_marketing_id,numero_boleta,tipo_pago,monto,atendido,created_at,updated_at,deleted_at")] venta_usuarios venta_usuarios)
        {
            if (ModelState.IsValid)
            {
                venta_usuarios vu = db.venta_usuarios.Where(m => m.id == venta_usuarios.id).FirstOrDefault();
                vu.numero_boleta = venta_usuarios.numero_boleta;
                vu.updated_at    = DateTimeOffset.Now.DateTime;
                vu.atendido      = true;

                clientes cl = db.clientes.Where(m => m.id_alt == venta_usuarios.cliente_id).FirstOrDefault();
                cl.acceso_autorizado = true;
                cl.activo            = true;

                db.Entry(cl).State = EntityState.Modified;
                db.Entry(vu).State = EntityState.Modified;
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            ViewBag.cliente_id = new SelectList(db.clientes, "id_alt", "codigo", venta_usuarios.cliente_id);
            ViewBag.local_id   = new SelectList(db.locales, "id", "nombre", venta_usuarios.local_id);
            return(View(venta_usuarios));
        }
        public async Task <ActionResult> Global(int id)
        {
            int daysInMonth = DateTime.DaysInMonth(CurrentDate.getNow().Year, CurrentDate.getNow().Month);

            DateTime today    = CurrentDate.getNow();
            DateTime firstDay = new DateTime(today.Year, today.Month, 1);
            DateTime lastDay  = new DateTime(today.Year, today.Month, daysInMonth);

            // Info General
            clientes client = await db.clientes
                              .Where(m => m.id_alt == id)
                              .Include(m => m.nutricionistas.usuarios)
                              .FirstOrDefaultAsync();

            // Info Programa
            programa_clientes program = await db.programa_clientes
                                        .Where(m => m.cliente_id == client.id_alt && m.fecha_inicio <= today && m.fecha_fin >= today)
                                        .Include(m => m.programa)
                                        .Include(m => m.horario.sala.local)
                                        .OrderBy(m => m.fecha_fin)
                                        .FirstOrDefaultAsync();

            ViewBag.ProgramId = program != null?program.id.ToString() : "";

            ViewBag.ProgramName     = program != null ? program.programa.nombre : "";
            ViewBag.ProgramInitDate = program != null?program.fecha_inicio.ToShortDateString() : "";

            ViewBag.ProgramEndDate = program != null?program.fecha_fin.ToShortDateString() : "";

            ViewBag.ProgramSchedule = program != null?program.horario.hora.ToString() : "";

            ViewBag.Gym = program != null ? program.horario.sala.local.nombre : "";

            // Info Notas del cliente
            List <clientes_notas> notes = await db.clientes_notas.Where(n => n.idCliente == id).OrderByDescending(n => n.created_at).Take(15).ToListAsync();

            ViewBag.ClientNotes = notes;

            //// Info Calendario.
            //List<pesos_medidas> clientPyM = await db.pesos_medidas.Where(m => m.clienteId == id && m.created_at >= firstDay && m.created_at <= lastDay).ToListAsync();
            //List<clientes_asistencia> clientAssistance = await db.clientes_asistencia.Where(m => m.clienteId == id && m.fecha >= firstDay && m.fecha <= lastDay).ToListAsync();
            //List<clientes_congelamientos> clientFreezing = await db.clientes_congelamientos.Where(m => m.clienteId == id && m.fecha_desde >= firstDay).ToListAsync();
            //List<citas> clientConsults = await db.citas.Where(m => m.cliente_id == id && m.fecha >= firstDay && m.fecha <= lastDay).ToListAsync();

            // Info Nutricion.

            ViewBag.AssignedNutritionist = client.nutricionistas.usuarios.nombres + " " + client.nutricionistas.usuarios.apellidos;
            if (program != null)
            {
                // Info Ficha Medica
                fichas_medicas medicalHistory = await db.fichas_medicas.Where(m => m.programa_id == program.id).Include(m => m.cardio).FirstOrDefaultAsync();

                ViewBag.MedicalId = "No ha sido creada.";
                ViewBag.Cardio    = "No se han ingresado datos.";
                if (medicalHistory != null)
                {
                    int clientCurrMedicalHistoryIdCode = 10000000 + medicalHistory.id;
                    ViewBag.MedicalId = clientCurrMedicalHistoryIdCode.ToString("FS#");

                    if (medicalHistory.cardio != null)
                    {
                        CardioInfo lastCardioResults = medicalHistory.cardio.OrderByDescending(m => m.fecha).FirstOrDefault();
                        if (lastCardioResults.cardiologia_aprobacion == CardioSuittable.Apto)
                        {
                            ViewBag.Cardio = CardioSuittable.Apto.ToString();
                        }
                        else
                        {
                            ViewBag.Cardio = CardioSuittable.NoApto.ToString();
                        }
                    }
                }

                // Info Dieta
                clientes_dietas clientDiet = await db.clientes_dietas.Where(m => m.programa_clientes_id == program.id).OrderByDescending(m => m.created_at).FirstOrDefaultAsync();

                if (clientDiet != null)
                {
                    int dietCode = 10000000 + clientDiet.id;
                    ViewBag.DietCode = dietCode.ToString("D#");
                }
            }

            // Info Ventas

            venta_usuarios usrSales = await db.venta_usuarios
                                      .Where(m => m.cliente_id == client.id_alt)
                                      .OrderByDescending(m => m.created_at)
                                      .FirstOrDefaultAsync();

            if (usrSales != null)
            {
                usuarios usr = await db.vendedores.Where(v => v.usuario_id == usrSales.vendedor_id).Include(v => v.usuarios).Select(v => v.usuarios).FirstOrDefaultAsync();

                ViewBag.Seller      = usr.nombres + " " + usr.apellidos;
                ViewBag.LastTicket  = usrSales.numero_boleta;
                ViewBag.LastRenewal = usrSales.fecha_inicio.ToShortDateString();

                semanas_precios weeks = db.semanas_precios.Where(s => s.id == usrSales.semanas_precio_id).FirstOrDefault();

                int boughtWeeks = weeks.cantidad_semanas;
                ViewBag.BoughtWeeks = boughtWeeks.ToString();
                int usedWeeks = await GetUsedWeeks(ClientId : client.id_alt, LastSaleId : usrSales.id);

                ViewBag.UsedWeeks    = usedWeeks;
                ViewBag.PendingWeeks = boughtWeeks - usedWeeks;
            }

            //ViewBag.venta_usuario = db.venta_usuarios.Where(vu => vu.cliente_id == id).FirstOrDefault();
            //ViewBag.programa_cliente = db.programa_clientes.Where(pc => pc.cliente_id == id).FirstOrDefault();

            //ViewBag.calPyM = clientPyM;
            //ViewBag.calAsist = clientAssistance;
            //ViewBag.calFrz = clientFreezing;
            //ViewBag.calCitas = clientConsults;
            //

            //ViewBag.cardioApt = cardioApt;
            //ViewBag.foto = Convert.ToBase64String(cliente.foto);

            return(View(client));
        }