public async Task <IActionResult> PrestarInsumos(string prestamos, string documento)
        {
            if (User.Identity.IsAuthenticated)
            {
                string permiso = Permisos("PermisoSubModulo").PSMAPB ? "PermisoSubModulo" : "PermisoModulo";
                bool   crear   = Permisos(permiso).PMMAPL.Where(w => w.Value.Contains("Crear")).Any();
                if (crear)
                {
                    dynamic prestamosJson           = JsonConvert.DeserializeObject(prestamos);
                    List <Col_Prestamos> _prestamos = new List <Col_Prestamos>();
                    foreach (dynamic item in prestamosJson)
                    {
                        Col_Prestamos _prestamo = new Col_Prestamos();
                        _prestamo.Cantidad      = item.Cantidad;
                        _prestamo.FechaPrestamo = Convert.ToDateTime(item.FechaPrestamo.ToString());
                        _prestamo.Motivo        = item.Motivo;
                        _prestamo.SuministroId  = item.SuministroId;
                        _prestamos.Add(_prestamo);
                    }
                    ApiCallResult data = await service.PrestarInsumos(_prestamos, documento);

                    return(Json(data));
                }
                else
                {
                    return(NotFound());
                }
            }
            else
            {
                return(RedirectToAction("Index", "Login"));
            }
        }
        public async Task <ApiCallResult> DevolverInsumos(List <Devoluciones> devoluciones)
        {
            try
            {
                bool   status  = false;
                string title   = "Error";
                string message = "Error al devolver el insumo";

                bool query = devoluciones.Where(w => !w.Devolver.Equals(0)).Any();
                if (query)
                {
                    foreach (Devoluciones item in devoluciones)
                    {
                        List <Col_Prestamos> _prestamos = await context.Col_Prestamos
                                                          .Where(w => w.PersonaId.Equals(item.IdPersona) &&
                                                                 w.SuministroId.Equals(item.SuministroId) && w.Estado.Equals("A"))
                                                          .ToListAsync();

                        int faltante = item.Devolver;
                        foreach (Col_Prestamos temp in _prestamos)
                        {
                            if (faltante > 0)
                            {
                                int cantidadRestar = 0;
                                for (int i = 1; i <= item.Devolver; i++)
                                {
                                    if ((temp.Cantidad - i) >= 0)
                                    {
                                        cantidadRestar = i;
                                    }
                                }
                                faltante -= cantidadRestar;
                                Col_Prestamos _prestamo = await context.Col_Prestamos
                                                          .Where(w => w.PrestamoId.Equals(temp.PrestamoId)).FirstOrDefaultAsync();

                                _prestamo.Cantidad          -= cantidadRestar;
                                _prestamo.Estado             = _prestamo.Cantidad == 0 ? "I" : "A";
                                _prestamo.FechaActualizacion = DateTime.Now;
                                context.Col_Prestamos.Update(_prestamo);
                                await context.SaveChangesAsync();
                            }
                        }
                        Col_Suministros suministro = await context.Col_Suministros
                                                     .Where(w => w.SuministroId.Equals(item.SuministroId)).FirstOrDefaultAsync();

                        suministro.Stock += item.Devolver;
                        suministro.FechaActualizacion = DateTime.Now;
                        context.Col_Suministros.Update(suministro);
                    }
                    await context.SaveChangesAsync();

                    status  = true;
                    title   = "Proceso éxitosa";
                    message = "¡Si hizo la devolución de los insumos satisfactoriamente!";
                }
                else
                {
                    status  = false;
                    title   = "Proceso incorrecto";
                    message = "¡Al menos tienes que devolver un insumo!";
                }
                return(new ApiCallResult
                {
                    Status = status,
                    Title = title,
                    Message = message
                });
            }
            #region catch
            catch (DbEntityValidationException e)
            {
                string err = "";
                foreach (DbEntityValidationResult eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                      eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (DbValidationError ve in eve.ValidationErrors)
                    {
                        err += ve.ErrorMessage;
                        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                          ve.PropertyName, ve.ErrorMessage);
                    }
                }
                return(new ApiCallResult {
                    Status = false, Title = "Error al guardar", Message = "Favor contacte éste con el administrador"
                });
            }

            catch (Exception e)
            {
                string err = "";
                if (e.InnerException != null)
                {
                    if (e.InnerException.Message != null)
                    {
                        err = (e.InnerException.Message);
                        if (e.InnerException.InnerException != null)
                        {
                            err += e.InnerException.InnerException.Message;
                        }
                    }
                }
                else
                {
                    err = (e.Message);
                }
                return(new ApiCallResult {
                    Status = false, Title = "Error al guardar", Message = "Favor contacte éste con el administrador"
                });
            }
            #endregion
        }
        public async Task <ApiCallResult> PrestarInsumos(List <Col_Prestamos> prestamos, string documento)
        {
            try
            {
                bool         status    = false;
                string       title     = "Error";
                string       message   = "Error al ingresar el prestamo";
                Col_Personas personaId = await context.Col_Personas
                                         .Where(w => w.NumeroDocumento.Equals(documento) && w.Estado.Equals("A"))
                                         .FirstOrDefaultAsync();

                if (personaId != null)
                {
                    List <Col_Suministros> suministros = await context.Col_Suministros.ToListAsync();

                    List <Col_Suministros> cantidadSuperior = suministros
                                                              .Where(w => w.Stock < prestamos.Where(p => p.SuministroId == w.SuministroId)
                                                                     .Select(s => s.Cantidad).Sum()).ToList();
                    if (cantidadSuperior.Any())
                    {
                        return(new ApiCallResult
                        {
                            Status = false,
                            Title = "Error de stock",
                            Message = "Asegurate de que la cantidad elegida del insumo quitado no sobrepase el stock",
                            Comodin = cantidadSuperior.Select(s => s.SuministroId).FirstOrDefault()
                        });
                    }
                    status  = true;
                    title   = "Proceso exitoso";
                    message = $"El prestamo se guardó correctamente al empleado con documento {documento}";
                    int?maxId = await context.Col_Prestamos.MaxAsync(m => (int?)m.PrestamoId);

                    int?id = maxId == null ? 1 : maxId + 1;
                    List <Col_Prestamos> _prestamos = new List <Col_Prestamos>();
                    foreach (Col_Prestamos item in prestamos)
                    {
                        Col_Prestamos _prestamo = new Col_Prestamos();
                        _prestamo.PrestamoId    = Convert.ToInt32(id);
                        _prestamo.PersonaId     = personaId.PersonaId;
                        _prestamo.SuministroId  = item.SuministroId;
                        _prestamo.Motivo        = item.Motivo;
                        _prestamo.FechaPrestamo = item.FechaPrestamo;
                        _prestamo.FechaCreacion = DateTime.Now;
                        _prestamo.Cantidad      = item.Cantidad;
                        _prestamo.Estado        = "A";
                        _prestamos.Add(_prestamo);
                        id++;
                        Col_Suministros _suministro = await context.Col_Suministros
                                                      .Where(w => w.SuministroId.Equals(item.SuministroId)).FirstOrDefaultAsync();

                        _suministro.Stock -= item.Cantidad;
                        context.Col_Suministros.Update(_suministro);
                    }
                    await context.AddRangeAsync(_prestamos);

                    await context.SaveChangesAsync();
                }
                return(new ApiCallResult
                {
                    Status = status,
                    Title = title,
                    Message = message
                });
            }
            #region catch
            catch (DbEntityValidationException e)
            {
                string err = "";
                foreach (DbEntityValidationResult eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                      eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (DbValidationError ve in eve.ValidationErrors)
                    {
                        err += ve.ErrorMessage;
                        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                          ve.PropertyName, ve.ErrorMessage);
                    }
                }
                return(new ApiCallResult {
                    Status = false, Title = "Error al guardar", Message = "Favor contacte éste con el administrador"
                });
            }

            catch (Exception e)
            {
                string err = "";
                if (e.InnerException != null)
                {
                    if (e.InnerException.Message != null)
                    {
                        err = (e.InnerException.Message);
                        if (e.InnerException.InnerException != null)
                        {
                            err += e.InnerException.InnerException.Message;
                        }
                    }
                }
                else
                {
                    err = (e.Message);
                }
                return(new ApiCallResult {
                    Status = false, Title = "Error al guardar", Message = "Favor contacte éste con el administrador"
                });
            }
            #endregion
        }