public async Task <ActionResult> CreateDonationOnline([FromBody] DonationCreateDto donationCreateDto)
        {
            if (donationCreateDto == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"O parâmetro, DonationCreate, não pode ser nulo.");
                return(BadRequest(error));
            }

            // Check if charity exists
            var charity = await CharitableEntityApplication.GetCharity((c) => c.Id.Equals(donationCreateDto.CharitableEntityId), true);

            if (charity == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"A entidade beneficente, {donationCreateDto.CharitableEntityId}, não foi encontrada.");
                return(NotFound(error));
            }

            // Check if user exists
            var user = await UserApplication.GetUser((u) => u.Id.Equals(donationCreateDto.UserId));

            if (user == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"O usuário, {donationCreateDto.UserId}, não foi encontrado.");
                return(NotFound(error));
            }

            if (donationCreateDto?.DonationItem.Count() > 0)
            {
                var lstItems = await ItemApplication.GetCharityItemIn(charity.Information.Id, donationCreateDto.DonationItem.Select(e => e.ItemId).ToList());

                if (lstItems.Count() != donationCreateDto.DonationItem.Count())
                {
                    ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"Existem itens inválidos.");
                    return(BadRequest(error));
                }
            }

            var donationId = await DonationApplication.CreateDonation(donationCreateDto, true);

            try
            {
                // Sent an email
                var donor = await UserApplication.GetUserOwnerDto(donationCreateDto.UserId);

                string message = string.Format(" <h1>Olá, {0}</h1><h2>Doação online realizada com sucesso no valor total de {1} reais para a entidade {2} ({3}).</h2>", donor.Name, donationCreateDto.Total.ToString("C"), charity.Name, charity.Cnpj);

                await this.EmailSender.SendEmailAsync(user.Login, $"Doa Sonhos - Doação Online", message);
            }
            catch (Exception)
            {
            }

            return(CreatedAtRoute("GetDonationById", new { id = donationId }, null));
        }
        public async Task <ActionResult> CreateDonationPresencial([FromBody] DonationCreateDto donationCreateDto)
        {
            if (donationCreateDto == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"O parâmetro, DonationCreate, não pode ser nulo.");
                return(BadRequest(error));
            }

            // Check if the charity exists
            var charity = await CharitableEntityApplication.GetCharity((c) => c.Id.Equals(donationCreateDto.CharitableEntityId), true);

            if (charity == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"A entidade beneficente, {donationCreateDto.CharitableEntityId}, não foi encontrada.");
                return(NotFound(error));
            }

            // Check if user exists
            var user = await UserApplication.GetUser((u) => u.Id.Equals(donationCreateDto.UserId));

            if (user == null)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"O usuário, {donationCreateDto.UserId}, não foi encontrado.");
                return(NotFound(error));
            }

            if (donationCreateDto.Total != 0)
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"O valor total não pode ser diferente de zero para doações presenciais.");
                return(BadRequest(error));
            }

            if (donationCreateDto?.DonationItem.Count() > 0)
            {
                var lstItems = await ItemApplication.GetCharityItemIn(charity.Information.Id, donationCreateDto.DonationItem.Select(e => e.ItemId).ToList());

                if (lstItems.Count() != donationCreateDto.DonationItem.Count())
                {
                    ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"Existem itens inválidos.");
                    return(BadRequest(error));
                }
            }
            else
            {
                ErrorMessage error = new ErrorMessage((int)HttpStatusCode.BadRequest, $"É necessário pelo menos um item válido para doações presenciais.");
                return(BadRequest(error));
            }

            var donationId = await DonationApplication.CreateDonation(donationCreateDto, false);

            try
            {
                // Sent an email
                var donor = await UserApplication.GetUserOwnerDto(donationCreateDto.UserId);

                string message = string.Format(" <h2>Olá, {0}</h2><h3>Parabéns! Você realizou uma doação presencial para a entidade {1} ({2}).</h3>", donor.Name, charity.Name, charity.Cnpj);

                await this.EmailSender.SendEmailAsync(user.Login, $"Doa Sonhos - Doação Presencial", message);
            }
            catch (Exception ex) {
                Console.WriteLine(ex);
            }

            return(CreatedAtRoute("GetDonationById", new { id = donationId }, null));
        }