public async Task <Guid> CreateCharity(CharityCreateDto charityDto)
        {
            User user = new User(Guid.NewGuid(), charityDto.Login.ToLower(), charityDto.Password.ToSHA512(),
                                 LoginType.CHARITABLE_ENTITY, Guid.NewGuid(), true);

            var charitable = this.Mapper.Map <CharitableEntity>(charityDto);

            charitable.Status       = ApproverStatus.PENDING;
            charitable.IsActive     = false;
            charitable.ApproverData = null;
            charitable.Approver     = string.Empty;
            charitable.Id           = Guid.NewGuid();
            charitable.UserId       = user.Id;

            var approval = new Approval()
            {
                Id = Guid.NewGuid(),
                CharitableEntityId = charitable.Id,
                Date    = DateTime.UtcNow.ToBrazilianTimeZone(),
                Message = "Análise Pendente",
                Status  = (int)ApproverStatus.PENDING
            };

            var lstRole = await RoleRepository.GetWhereAsync(r => r.Name.ToLower().Equals("charitable_entity"));

            if (!lstRole.Any())
            {
                throw new Exception("Cannot find role charitable_entity");
            }

            await UserRoleRepository.AddAsync(new UserRole()
            {
                User = user, RoleId = lstRole.First().Id
            });

            await this.Repository.AddAsync(charitable);

            await ApprovalRepository.AddAsync(approval);

            await this.Repository.SaveAsync();

            return(charitable.Id);
        }
        public async Task UpdateCharity(Guid id, CharityUpdateDto charityDto, bool pending_data)
        {
            var charityModel     = Repository.GetWhereAsQueryable(c => c.Id.Equals(id)).First();
            var charitableEntity = this.Mapper.Map <CharitableEntity>(charityDto);

            charitableEntity.Id           = charityModel.Id;
            charitableEntity.Status       = charityModel.Status;
            charitableEntity.Approver     = charityModel.Approver;
            charitableEntity.ApproverData = charityModel.ApproverData;
            charitableEntity.IsActive     = charityModel.IsActive;
            charitableEntity.UserId       = charityModel.UserId;

            if (pending_data)
            {
                var approval = new Approval()
                {
                    Id = Guid.NewGuid(), CharitableEntityId = charityModel.Id, Date = DateTime.UtcNow.ToBrazilianTimeZone(), Message = "Análise Pendente", Detail = string.Empty, Status = (int)ApproverStatus.PENDING
                };

                await ApprovalRepository.AddAsync(approval);

                charitableEntity.ApproverData = DateTime.UtcNow.ToBrazilianTimeZone();
                charitableEntity.Approver     = string.Empty;
                charitableEntity.Status       = ApproverStatus.PENDING;
                charitableEntity.IsActive     = false;
            }
            else
            {
                charitableEntity.Name = charityModel.Name;
                charitableEntity.Cnpj = charityModel.Cnpj;
            }

            this.Repository.Udate(charitableEntity);

            await this.Repository.SaveAsync();
        }
        public async Task UpdateCharityPending(Guid id, CharityApproveDto charityApproveDto)
        {
            var charityModel = Repository.GetWhereAsQueryable(c => c.Id.Equals(id)).First();
            var status       = (ApproverStatus)Enum.Parse(typeof(ApproverStatus), charityApproveDto.Status);

            var approval = new Approval()
            {
                Id = Guid.NewGuid(),
                CharitableEntityId = charityModel.Id,
                Date    = DateTime.UtcNow.ToBrazilianTimeZone(),
                Message = charityApproveDto.Message,
                Detail  = charityApproveDto.Detail,
                Status  = (int)status
            };

            await ApprovalRepository.AddAsync(approval);

            charityModel.ApproverData = DateTime.UtcNow.ToBrazilianTimeZone();
            charityModel.Approver     = charityApproveDto.ApproverName;
            charityModel.Status       = status;

            switch (status)
            {
            case ApproverStatus.PENDING_DATA:
            case ApproverStatus.APPROVED:
            case ApproverStatus.REPROVED:
                var lstUsers = await this.UserRepository.GetWhereAsync(u => u.Id == charityModel.UserId);

                var    user  = lstUsers.FirstOrDefault();
                string title = string.Empty;

                if (status == ApproverStatus.APPROVED)
                {
                    charityModel.IsActive = true;
                    title = "Doa Sonhos - Cadastro Aprovado";

                    if (user != null)
                    {
                        user.IsActive = true;
                        this.UserRepository.Udate(user);
                    }
                }
                else if (status == ApproverStatus.REPROVED)
                {
                    charityModel.IsActive = false;
                    title = "Doa Sonhos - Cadastro Reprovado";

                    if (user != null)
                    {
                        user.IsActive = false;
                        this.UserRepository.Udate(user);
                    }
                }
                else if (status == ApproverStatus.PENDING_DATA)
                {
                    charityModel.IsActive = false;
                    title = "Doa Sonhos - Correção Solicitada";

                    if (user != null)
                    {
                        user.IsActive = true;
                        this.UserRepository.Udate(user);
                    }
                }

                await this.SendEmail(user.Login, charityModel.Name, title, string.Format("Message: {0}\r\nDetalhes: {1}", approval.Message, string.IsNullOrWhiteSpace(approval.Detail)?"-":approval.Detail));

                break;

            default:
                charityModel.IsActive = false;
                break;
            }
            this.Repository.Udate(charityModel);

            await this.Repository.SaveAsync();
        }