/// <summary>
        /// Valida se a nota de compra está pronta para a aprovação
        /// </summary>
        /// <param name="idNotaCompra">id da nota de compra</param>
        /// <param name="tokenCancelamento">O token de cancelamento para a operação assíncrona</param>
        /// <returns>Retorna true na execução normal</returns>
        private async Task ValidarAprovacaoNotaDeCompraAsync(long idNotaCompra, CancellationToken tokenCancelamento = default)
        {
            NotaDeCompra notaDeCompra = await unitOfWork.NotaDeCompraRepositorio.PrimeiroOuDefaultAsync(predicado : x => x.Id == idNotaCompra,
                                                                                                        carregamentoAntecipado : x => x.Include(v => v.HistoricoAprovacoes),
                                                                                                        tokenCancelamento : tokenCancelamento);

            Configuracoes configuracoes = ObterConfiguracoes(notaDeCompra.ValorTotal);

            if (notaDeCompra.HistoricoAprovacoes.Count(x => x.Operacao == "A") == configuracoes.Aprovacoes)
            {
                notaDeCompra.Status = true;
                unitOfWork.NotaDeCompraRepositorio.Atualizar(notaDeCompra);

                await unitOfWork.PersistirAsync(tokenCancelamento);
            }
        }
        /// <summary>
        /// Registra os vistos nas notas de compra
        /// </summary>
        /// <param name="idUsuario">id de usuário</param>
        /// <param name="idNotaCompra">id da nota de compra</param>
        /// <param name="tokenCancelamento">O token de cancelamento para a operação assíncrona</param>
        /// <returns>Retorna true na execução normal</returns>
        public async Task <bool> RegistrarVistoAsync(long idUsuario, long idNotaCompra, CancellationToken tokenCancelamento = default)
        {
            try
            {
                UsuarioModel usuario = await usuarioServices.ObterAsync(idUsuario);

                NotaDeCompra notaDeCompra = await unitOfWork.NotaDeCompraRepositorio.PrimeiroOuDefaultAsync(predicado : x => x.Id == idNotaCompra,
                                                                                                            carregamentoAntecipado : x => x.Include(v => v.HistoricoAprovacoes)
                                                                                                            .ThenInclude(u => u.Usuario),
                                                                                                            tokenCancelamento : tokenCancelamento);

                foreach (var item in notaDeCompra.HistoricoAprovacoes)
                {
                    if (item.Usuario.Id == usuario.Id)
                    {
                        break;
                    }
                }

                HistoricoAprovacoes historicoAprovacoes = new HistoricoAprovacoes
                {
                    Data         = DateTime.Now,
                    NotaDeCompra = notaDeCompra,
                    Operacao     = "V",
                    Usuario      = await unitOfWork.UsuarioRepositorio.PrimeiroOuDefaultAsync(x => x.Id == idUsuario, tokenCancelamento : tokenCancelamento)
                };

                await unitOfWork.HistoricoAprovacoesRepositorio.IncluirAsync(historicoAprovacoes, tokenCancelamento);

                await unitOfWork.PersistirAsync(tokenCancelamento);

                await ValidarAprovacaoNotaDeCompraAsync(idNotaCompra, tokenCancelamento);

                return(true);
            }
            catch (Exception erro)
            {
                return(false);
                // Todo Giulliano: Gerar log
                // throw;
            }
        }
        /// <summary>
        /// Valida o status da nota de compra
        /// </summary>
        /// <param name="notaDeCompra">nota de compra a ser validada</param>
        /// <returns>Status da nota de compra</returns>
        private StatusNotaDeCompra ValidarStatusNotaDeCompra(NotaDeCompra notaDeCompra)
        {
            int qtdVistos     = notaDeCompra.HistoricoAprovacoes.Count(x => x.Operacao == "V");
            int qtdAprovacoes = notaDeCompra.HistoricoAprovacoes.Count(x => x.Operacao == "A");

            Configuracoes configuracoes = ObterConfiguracoes(notaDeCompra.ValorTotal);

            if (qtdAprovacoes == configuracoes.Aprovacoes && qtdVistos == configuracoes.Vistos)
            {
                return(StatusNotaDeCompra.Aprovada);
            }
            else if (qtdVistos == configuracoes.Vistos)
            {
                return(StatusNotaDeCompra.AguardandoAprovacao);
            }
            else
            {
                return(StatusNotaDeCompra.Pendente);
            }
        }