public async Task <IActionResult> Put(int id, [FromBody] DespesaDTO dto)
        {
            if (id != dto.Id)
            {
                return(new StatusCodeResult(StatusCodes.Status400BadRequest));
            }
            if (ModelState.IsValid)
            {
                //corrige fuso horario do js
                dto.DataDaCompra = dto.DataDaCompra.AddHours(-dto.DataDaCompra.Hour);
                Usuario user = await _userManager.GetUserAsync(HttpContext.User);

                Despesa despesa = _context.Despesa.SingleOrDefault(q => q.Id == id);
                if (despesa == null)
                {
                    return(new BadRequestResult());
                }
                Item item = _context.Item.SingleOrDefault(q => q.Id == dto.Item.Id);
                if (item == null)
                {
                    ModelState.AddModelError("Item", "Item inválido");
                    return(new BadRequestObjectResult(ModelState));
                }
                double diferencaQuantidade = despesa.Quantidade - dto.Quantidade;
                despesa.Item          = item;
                despesa.Quantidade    = dto.Quantidade;
                despesa.ValorUnitario = dto.ValorUnitario;
                despesa.Usuario       = user;


                if (despesa.GetType() == typeof(DespesaAssociacao))
                {
                    DespesaAssociacao desp = (DespesaAssociacao)despesa;
                    //nenhum outro campo para atualizar
                    try
                    {
                        _context.SaveChanges();
                        return(new ObjectResult(dto));
                    }
                    catch
                    {
                        return(new BadRequestObjectResult(ModelState));
                    }
                }
                else if (despesa.GetType() == typeof(DespesaFavorecido))
                {
                    DespesaFavorecido desp = (DespesaFavorecido)despesa;

                    try
                    {
                        Favorecido f = _context.Favorecido.Single(q => q.CodFavorecido == dto.Favorecido.Id);
                        _context.SaveChanges();
                        return(new ObjectResult(dto));
                    }
                    catch
                    {
                        ModelState.AddModelError("Favorecido", "Favorecido incorreto");
                        return(new BadRequestObjectResult(ModelState));
                    }
                }
                else if (despesa.GetType() == typeof(DespesaSopa))
                {
                    DespesaSopa desp = (DespesaSopa)despesa;
                    //nenhum outro campo para atualizar
                    try
                    {
                        _context.SaveChanges();
                        //atualiza o estoque
                        if (diferencaQuantidade > 0)
                        {
                            _estoqueManager.DarSaida(user, item, diferencaQuantidade);
                        }
                        else if (diferencaQuantidade < 0)
                        {
                            _estoqueManager.DarEntrada(user, item, -diferencaQuantidade);
                        }


                        return(new ObjectResult(dto));
                    }
                    catch
                    {
                        return(new BadRequestObjectResult(ModelState));
                    }
                }

                return(new ObjectResult(dto));
            }
            else
            {
                return(new BadRequestObjectResult(ModelState));
            }
        }
        public async Task <IActionResult> Post([FromBody] DespesaDTO dto)
        {
            if (ModelState.IsValid && (dto.Tipo.ToUpper() == "ASSOCIACAO" || dto.Tipo.ToUpper() == "FAVORECIDO" || dto.Tipo.ToUpper() == "SOPA"))
            {
                Usuario user = await _userManager.GetUserAsync(HttpContext.User);

                //corrige fuso horario do js
                dto.DataDaCompra = dto.DataDaCompra.AddHours(-dto.DataDaCompra.Hour);
                switch (dto.Tipo)
                {
                case "ASSOCIACAO":
                    try
                    {
                        ItemAssociacao    ia = _context.ItemAssociacao.Single(q => q.Id == dto.Item.Id);
                        DespesaAssociacao da = new DespesaAssociacao
                        {
                            DataDaCompra  = dto.DataDaCompra,
                            Descricao     = dto.Descricao,
                            Quantidade    = dto.Quantidade,
                            ValorUnitario = dto.ValorUnitario,
                            Item          = ia,
                            Usuario       = user
                        };
                        _context.DespesaAssociacao.Add(da);
                        _context.SaveChanges();
                        dto.Id = da.Id;
                    }
                    catch
                    {
                        //ModelState.AddModelError("Item", "Este item já está cadastrado");
                        return(new BadRequestObjectResult(ModelState));
                    }
                    break;

                case "FAVORECIDO":
                    try
                    {
                        ItemFavorecido    ifavorecido = _context.ItemFavorecido.Single(q => q.Id == dto.Item.Id);
                        Favorecido        favorecido  = _context.Favorecido.Single(q => q.CodFavorecido == dto.Favorecido.Id);
                        DespesaFavorecido df          = new DespesaFavorecido
                        {
                            DataDaCompra  = dto.DataDaCompra,
                            Descricao     = dto.Descricao,
                            Quantidade    = dto.Quantidade,
                            ValorUnitario = dto.ValorUnitario,
                            Item          = ifavorecido,
                            Favorecido    = favorecido,
                            Usuario       = user
                        };
                        _context.DespesaFavorecido.Add(df);
                        _context.SaveChanges();
                        dto.Id = df.Id;
                    }
                    catch
                    {
                        ModelState.AddModelError("Favorecido", "Este favorecido não existe mais");
                        return(new BadRequestObjectResult(ModelState));
                    }

                    break;

                case "SOPA":
                    try
                    {
                        ItemSopa    isopa = _context.ItemSopa.Single(q => q.Id == dto.Item.Id);
                        DespesaSopa ds    = new DespesaSopa
                        {
                            DataDaCompra  = dto.DataDaCompra,
                            Descricao     = dto.Descricao,
                            Quantidade    = dto.Quantidade,
                            ValorUnitario = dto.ValorUnitario,
                            Item          = isopa,
                            Usuario       = user
                        };
                        _context.DespesaSopa.Add(ds);
                        _context.SaveChanges();
                        //atualiza o estoque

                        _estoqueManager.DarEntrada(user, isopa, ds.Quantidade);
                        dto.Id = ds.Id;
                    }
                    catch
                    {
                        //ModelState.AddModelError("Item", "Este item já está cadastrado");
                        return(new BadRequestObjectResult(ModelState));
                    }
                    break;
                }
                return(new ObjectResult(dto));
            }
            else
            {
                if (ModelState.IsValid)
                {
                    ModelState.AddModelError("Tipo", "Valores aceitados = ['ASSOCIACAO','FAVORECIDO','SOPA']");
                }
                return(new BadRequestObjectResult(ModelState));
            }
        }