public async Task <ActionResult> Edit(RequestUserDataForm data)
        {
            var original = await db.RequestUser.FindAsync(data.Id);

            if (original == null)
            {
                ModelState.AddModelError(string.Empty, "Solicitud no registrada.");
            }

            if (ModelState.IsValid)
            {
                //Agrega los cambios de formulario
                original.Response = data.Response;
                original.State    = data.State;

                //Agrega metadatos del usuario actual
                var adminUser = await userManager.FindByNameAsync(User.Identity.Name);

                original.AdminName      = adminUser.Nombre + " " + adminUser.Apellido;
                original.ValidationDate = DateTime.Now;

                //Cambia las alertyas
                original.AlertAdmin = false;
                original.AlertUser  = true;

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

                return(RedirectToAction("IndexAdmin"));
            }

            var estados = new Dictionary <int, string> {
                { RequestUser.ESTADO_NUEVA, "Nuevo" },
                { RequestUser.ESTADO_EN_PROCESO, "En proceso" },
                { RequestUser.ESTADO_SOLUCIONADA, "Terminado" },
                { RequestUser.ESTADO_CANCELADA, "Cancelado" },
            };

            ViewBag.Estados = new SelectList(estados, "Key", "Value", data.State);

            ViewBag.Solicitud = original;

            var user = await userManager.FindByIdAsync(original.IdUser);

            ViewBag.User = user;

            Formalization formalizacion = null;

            if (original.FormalizationId > 0)
            {
                formalizacion = await db.Formalization.FindAsync(original.FormalizationId);
            }
            ViewBag.Formalizacion = formalizacion;

            return(View(data));
        }
        public async Task <ActionResult> Create(int id = 0)
        {
            Formalization formalizacion = null;

            if (id > 0)
            {
                formalizacion = await db.Formalization.FindAsync(id);
            }
            ViewBag.Formalizacion = formalizacion;
            return(View());
        }
        public async Task <ActionResult> Details(int id)
        {
            var user = await userManager.FindByNameAsync(User.Identity.Name);

            var solicitud = await db.RequestUser.Where(n => n.Id == id && n.IdUser == user.Id).FirstOrDefaultAsync();

            if (solicitud == null)
            {
                return(NotFound());
            }

            Formalization formalizacion = null;

            if (solicitud.FormalizationId > 0)
            {
                formalizacion = await db.Formalization.FindAsync(solicitud.FormalizationId);
            }
            ViewBag.Formalizacion = formalizacion;

            return(View(solicitud));
        }
        public async Task <ActionResult> Edit(int id)
        {
            var solicitud = await db.RequestUser.FindAsync(id);

            if (solicitud == null)
            {
                return(NotFound());
            }

            var dataForm = new RequestUserDataForm {
                Id = solicitud.Id, Response = solicitud.Response, State = solicitud.State
            };

            var estados = new Dictionary <int, string> {
                { RequestUser.ESTADO_NUEVA, "Nuevo" },
                { RequestUser.ESTADO_EN_PROCESO, "En proceso" },
                { RequestUser.ESTADO_SOLUCIONADA, "Completo" },
                { RequestUser.ESTADO_CANCELADA, "Cancelado" },
            };

            ViewBag.Estados = new SelectList(estados, "Key", "Value", solicitud.State);

            ViewBag.Solicitud = solicitud;

            var user = await userManager.FindByIdAsync(solicitud.IdUser);

            ViewBag.User = user;

            Formalization formalizacion = null;

            if (solicitud.FormalizationId > 0)
            {
                formalizacion = await db.Formalization.FindAsync(solicitud.FormalizationId);
            }
            ViewBag.Formalizacion = formalizacion;

            return(View(dataForm));
        }
        public async Task <RespuestaAccion> LoadFormalizacion(string idKobo, string identity = null)
        {
            var r = new RespuestaAccion();

            var previo = await db.Formalization.Where(n => n.IdKobo == idKobo).FirstOrDefaultAsync();

            if (previo != null)
            {
                r.Url     = "Formalizacion/Edit/" + previo.Id;
                r.Success = true;
                return(r);
            }

            //Carga los datos de conexión desde la configuración
            var config = await db.Configuracion.FirstOrDefaultAsync();

            var configFormalizacion = await db.FormalizationConfig.Where(n => n.Group == 1 && n.Field != "" && n.Value != "").ToListAsync();

            var fields = JsonConvert.SerializeObject(configFormalizacion.Select(n => n.Value).ToArray());
            var query  = JsonConvert.SerializeObject(new { _id = idKobo });

            var url = config.KoboKpiUrl + "/assets/" + config.KoboAssetUid + "/submissions/?format=json" +
                      "&query=" + HttpUtility.UrlEncode(query) +
                      "&fields=" + HttpUtility.UrlEncode(fields);

            dynamic result = null;

            try
            {
                //Consulta la información
                var client = new HttpClient();
                client.DefaultRequestHeaders.Add("Authorization", "Token " + config.KoboApiToken);
                HttpResponseMessage response = await client.GetAsync(url);

                response.EnsureSuccessStatusCode();

                string responseBody = await response.Content.ReadAsStringAsync();

                dynamic data = JsonConvert.DeserializeObject(responseBody);
                //Valida que se cargaran resultados
                if (data == null)
                {
                    r.Message = "ERROR: No fue posible recuperar la información"; return(r);
                }
                result = data[0];
            }
            catch (HttpRequestException e) { r.Message = e.Message; return(r); }

            if (result != null)
            {
                var username = identity != null ? identity : User.Identity.Name;
                var user     = await userManager.FindByNameAsync(username);

                var responsable = user.IDDependencia;
                //Mapea los resultados
                var formalizacion = new Formalization()
                {
                    Estado           = Formalization.ESTADO_BORRADOR,
                    CreateDate       = DateTime.Now,
                    LastEditDate     = DateTime.Now,
                    IdResponsable    = responsable,
                    IdCreateByUser   = user.Id,
                    IdLastEditByUser = user.Id
                };

                //folder para los adjunto

                var _path     = Path.Combine(_env.ContentRootPath, "Storage", "Formalizacion", idKobo);
                var _relative = Path.Combine("Formalizacion", idKobo);
                var remoteUri = config.KoboAttachment + config.KoboUsername + "/attachments/";

                if (!Directory.Exists(_path))
                {
                    Directory.CreateDirectory(_path);
                }
                var imageErrors = false;

                //variables de formalizacion
                var artes = await db.FormalizationVariable.Where(n => n.Group == "Arte")
                            .ToDictionaryAsync(n => n.Key, n => n.Value);

                var zonas = await db.FormalizationVariable.Where(n => n.Group == "Zona")
                            .ToDictionaryAsync(n => n.Key, n => n.Value);

                var configZonas = await db.FormalizationConfig.Where(n => n.Group == 2 && n.Field != "" && n.Value != "").ToListAsync();

                var czTipo   = configZonas.Where(n => n.Field == "zonaTipo").Select(n => n.Value).FirstOrDefault();
                var czNombre = configZonas.Where(n => n.Field == "zonaNombre").Select(n => n.Value).FirstOrDefault();

                var map = configFormalizacion.ToDictionary(n => n.Field, n => n.Value);


                var oType = typeof(Formalization);
                foreach (var oProperty in oType.GetProperties())
                {
                    var name  = oProperty.Name;
                    var value = "";
                    if (map.ContainsKey(name))
                    {
                        var fieldName = map[name];
                        if (name == "AreaPesca")
                        {
                            var arrZona = result[fieldName];
                            if (arrZona != null)
                            {
                                var listResult = new List <string>();
                                foreach (var a in arrZona)
                                {
                                    var zonaAux = "";

                                    var tipoZona = (String)a[czTipo];
                                    zonaAux = tipoZona != null && tipoZona != "" ? GetValueForVariables(tipoZona, zonas) + " " : "";

                                    var nombreZona = (String)a[czNombre];
                                    zonaAux += nombreZona != null && nombreZona != "" ? "'" + nombreZona + "'" : "";

                                    if (zonaAux != "")
                                    {
                                        listResult.Add(zonaAux);
                                    }
                                }
                                value = listResult.Count > 0 ? String.Join(", ", listResult) : "";
                            }
                        }
                        else if (name == "ArtesPesca")
                        {
                            var auxValue = (String)result[fieldName];
                            if (auxValue != null & auxValue != "")
                            {
                                var idsList    = auxValue.Split(' ').ToList();
                                var listResult = new List <string>();
                                foreach (var idArte in idsList)
                                {
                                    listResult.Add(GetValueForVariables(idArte, artes));
                                }
                                value = listResult.Count > 0 ? String.Join(", ", listResult) : "";
                            }
                        }
                        else
                        {
                            value = (String)result[fieldName];

                            //Si es una campo de imagen descarga el adjunto
                            if (name.StartsWith("Img") && value != null && value != "")
                            {
                                var filePath = DownloadFile(remoteUri, value, _path, _relative, config.KoboApiToken);
                                if (filePath == "")
                                {
                                    imageErrors = true;
                                    break;
                                }
                                value = filePath;
                            }
                        }

                        oProperty.SetValue(formalizacion, value == null ? "" : value, null);
                    }
                }

                //Valida los adjuntos
                if (imageErrors)
                {
                    r.Message = "ERROR: El servidor esta bloqueado, intente más tarde."; return(r);
                }

                //Consulta la dependencia del encuestador
                if (formalizacion.Encuestador != null && formalizacion.Encuestador != "")
                {
                    int numId       = Int32.Parse(formalizacion.Encuestador);
                    var encuestador = await db.Pollster.Where(n => n.DNI == numId).FirstOrDefaultAsync();

                    formalizacion.IdResponsable = encuestador != null ? encuestador.IdResponsable : responsable;
                }

                var log = new Logger(db);
                try
                {
                    //Departamento
                    var municipio = await db.Location.Where(n => n.Code2 == formalizacion.Municipio).FirstOrDefaultAsync();

                    if (municipio != null)
                    {
                        formalizacion.Municipio    = municipio.Name;
                        formalizacion.Departamento = municipio.LocationParent != null ? municipio.LocationParent.Name : formalizacion.Departamento;
                    }

                    //Validación formalización previo a guardar
                    previo = await db.Formalization.Where(n => n.IdKobo == idKobo).FirstOrDefaultAsync();

                    if (previo != null)
                    {
                        r.Url     = "Formalizacion/Edit/" + previo.Id;
                        r.Success = true;
                        return(r);
                    }

                    //Guarda la formalización
                    db.Formalization.Add(formalizacion);
                    await db.SaveChangesAsync();

                    r.Url     = "Formalizacion/Edit/" + formalizacion.Id;
                    r.Success = true;

                    var registro = new RegistroLog {
                        Usuario = identity, Accion = "Create", Modelo = "Formalization", ValNuevo = formalizacion
                    };
                    await log.Registrar(registro, typeof(Formalization), formalizacion.Id);
                }
                catch (Exception e) { r.Message = e.InnerException.Message; return(r); }
            }
            else
            {
                r.Message = "ERROR: No se encuentran resultados."; return(r);
            }

            return(r);
        }