public IActionResult Get(int id)
        {
            DoacaoSopa q = _context.DoacaoSopa.Include(d => d.Doador).Include(d => d.Item).SingleOrDefault(i => i.Id == id);

            if (q == null)
            {
                return(new NotFoundResult());
            }

            DoacaoSopaDTO dto = new DoacaoSopaDTO
            {
                Id           = q.Id,
                DataDaDoacao = q.Data,
                Descricao    = q.Descricao,
                Doador       = new DoadorDTOR()
                {
                    Id = q.Doador.CodDoador,
                    NomeRazaoSocial = q.Doador.GetType() == typeof(PessoaFisica) ? ((PessoaFisica)q.Doador).Nome : ((PessoaJuridica)q.Doador).RazaoSocial,
                    Tipo            = q.Doador.GetType() == typeof(PessoaFisica)?"PF":"PJ"
                },
                Quantidade = q.Quantidade,
                Item       = new ItemDTOR()
                {
                    Id              = q.Item.Id,
                    Nome            = q.Item.Nome,
                    UnidadeDeMedida = q.Item.UnidadeDeMedida
                }
            };

            return(new ObjectResult(dto));
        }
        public async Task <IActionResult> Put(int id, [FromBody] DoacaoSopaDTO dto)
        {
            if (id != dto.Id)
            {
                return(new BadRequestResult());
            }
            if (ModelState.IsValid)
            {
                //corrige fuso horario do js
                dto.DataDaDoacao = dto.DataDaDoacao.AddHours(-dto.DataDaDoacao.Hour);
                DoacaoSopa dd = _context.DoacaoSopa.Single(q => q.Id == id);

                Doador doador = _context.Doador.SingleOrDefault(q => q.CodDoador == dto.Doador.Id);
                if (doador == null)
                {
                    ModelState.AddModelError("Doador", "Doador inválido");
                    return(new BadRequestObjectResult(ModelState));
                }
                Item item = _context.Item.SingleOrDefault(q => q.Id == dto.Item.Id && q.Destino == "SOPA");
                if (item == null)
                {
                    ModelState.AddModelError("Item", "Item inválido");
                    return(new BadRequestObjectResult(ModelState));
                }
                double diferencaQuantidade = dd.Quantidade - dto.Quantidade;
                dd.Doador     = doador;
                dd.Data       = dto.DataDaDoacao;
                dd.Descricao  = dto.Descricao;
                dd.Item       = item;
                dd.Quantidade = dto.Quantidade;


                try
                {
                    _context.SaveChanges();
                    Usuario usuario = await _userManager.GetUserAsync(HttpContext.User);

                    //atualiza o estoque
                    if (diferencaQuantidade > 0)
                    {
                        _estoqueManager.DarSaida(usuario, item, diferencaQuantidade);
                    }
                    else if (diferencaQuantidade < 0)
                    {
                        _estoqueManager.DarEntrada(usuario, item, -diferencaQuantidade);
                    }
                }
                catch
                {
                    return(new BadRequestObjectResult(ModelState));
                }

                return(new ObjectResult(dto));
            }
            else
            {
                return(new BadRequestObjectResult(ModelState));
            }
        }
        public async Task <IActionResult> Post([FromBody] DoacaoSopaDTO dto)
        {
            if (ModelState.IsValid)
            {
                Doador doador = _context.Doador.SingleOrDefault(q => q.CodDoador == dto.Doador.Id);
                if (doador == null)
                {
                    ModelState.AddModelError("Doador", "Doador inválido");
                    return(new BadRequestObjectResult(ModelState));
                }

                Item item = _context.Item.SingleOrDefault(q => q.Id == dto.Item.Id && q.Destino == "SOPA");
                if (item == null)
                {
                    ModelState.AddModelError("Item", "Item inválido");
                    return(new BadRequestObjectResult(ModelState));
                }


                //corrige fuso horario do js
                dto.DataDaDoacao = dto.DataDaDoacao.AddHours(-dto.DataDaDoacao.Hour);
                DoacaoSopa novo = new DoacaoSopa()
                {
                    Doador     = doador,
                    Data       = dto.DataDaDoacao,
                    Descricao  = dto.Descricao,
                    Item       = item,
                    Quantidade = dto.Quantidade
                };
                try
                {
                    _context.DoacaoSopa.Add(novo);

                    _context.SaveChanges();
                    //atualiza o estoque
                    Usuario usuario = await _userManager.GetUserAsync(HttpContext.User);

                    _estoqueManager.DarEntrada(usuario, item, novo.Quantidade);

                    dto.Id = novo.Id;
                    return(new ObjectResult(dto));
                }
                catch
                {
                    return(new BadRequestObjectResult(ModelState));
                }
            }

            return(new BadRequestObjectResult(ModelState));
        }
        public async Task <IActionResult> Delete(int id)
        {
            DoacaoSopa ds = _context.DoacaoSopa
                            .Include(q => q.Item)
                            .Single(q => q.Id == id);
            double quantidade = ds.Quantidade;
            Item   item       = ds.Item;

            _context.DoacaoSopa.Remove(ds);
            try
            {
                _context.SaveChanges();
                //atualiza o estoque
                Usuario usuario = await _userManager.GetUserAsync(HttpContext.User);

                _estoqueManager.DarSaida(usuario, item, quantidade);

                return(new NoContentResult());
            }
            catch
            {
                return(new BadRequestResult());
            }
        }