public override Task <bool> ValidateModelAsync(CriarProcessoCommand model)
        {
            var result = this.Validate(model);

            if (!result.IsValid)
            {
                foreach (var error in result.Errors)
                {
                    this.AddError(error.ErrorCode, error.ErrorMessage);
                }

                return(Task.FromResult(false));
            }

            Util.NumeroProcesso numeroProcesso = model.NumeroProcesso;
            var processo = this.processoRepository.Obter(p => p.NumeroProcesso == numeroProcesso.ToString()).FirstOrDefault();

            if (processo != null)
            {
                this.AddError(NotificationKeys.AlreadyExists, string.Format(ErrorMessages.ProcessoJaExiste, model.NumeroProcesso));
                return(Task.FromResult(false));
            }

            var situacaoProcesso = this.situacaoProcessoRepository.ObterPorId(model.SituacaoProcessoId.Value);

            if (situacaoProcesso == null)
            {
                this.AddError(NotificationKeys.NotFound, string.Format(ErrorMessages.SituacaoNaoEncontrada, model.SituacaoProcessoId));
                return(Task.FromResult(false));
            }

            var responsaveisNaoEncontrados = model.ResponsaveisIds.Where(rId => this.responsavelRepository.ObterPorId(rId) == null);

            if (responsaveisNaoEncontrados?.Any() == true)
            {
                this.AddError(NotificationKeys.NotFound, ErrorMessages.ResponsavelNaoEncontrado);
                return(Task.FromResult(false));
            }

            processo = new Processo {
                ProcessoVinculadoId = model.ProcessoVinculadoId
            };

            if (!this.processoDomainService.ValidarHierarquiaQuantidade(processo))
            {
                this.AddError(NotificationKeys.InvalidArgument, ErrorMessages.ProcessoQuantidadeHierarquiaExcedido);
                return(Task.FromResult(false));
            }

            if (!this.processoDomainService.ValidarNaoExistenteNaHierarquia(processo))
            {
                this.AddError(NotificationKeys.InvalidArgument, ErrorMessages.ProcessoJaConstaNaHierarquia);
                return(Task.FromResult(false));
            }

            return(Task.FromResult(true));
        }
 public void ValidarNumeroProcesso(string numeroProcesso, string numeroProcessoEsperado)
 {
     Util.NumeroProcesso nProcesso = numeroProcesso;
     nProcesso.ToString().Should().Be(numeroProcessoEsperado);
 }
        public override async Task <RequestResponseWrapper <PagedList <ProcessoDto> > > Handle(ObterProcessosQuery request, CancellationToken cancellationToken)
        {
            try
            {
                if (await this.ValidateAsync(request))
                {
                    var query = this.processoRepository.Query();

                    if (!string.IsNullOrEmpty(request.NumeroProcesso))
                    {
                        Util.NumeroProcesso numeroProcesso = request.NumeroProcesso;
                        query = query.Where(p => p.NumeroProcesso == numeroProcesso.ToString());
                    }

                    if (request.DataDistribuicaoInicio.HasValue)
                    {
                        query = query.Where(p => p.DataDistribuicao >= request.DataDistribuicaoInicio);
                    }

                    if (request.DataDistribuicaoFim.HasValue)
                    {
                        query = query.Where(p => p.DataDistribuicao <= request.DataDistribuicaoFim);
                    }

                    if (request.SegredoJustica.HasValue)
                    {
                        query = query.Where(p => p.SegredoJustica == request.SegredoJustica.Value);
                    }

                    if (!string.IsNullOrEmpty(request.PastaFisicaCliente))
                    {
                        query = query.Where(p => p.PastaFisicaCliente.ContainsIgnoreCase(request.PastaFisicaCliente));
                    }

                    if (request.SituacaoProcessoId.HasValue)
                    {
                        query = query.Where(p => p.SituacaoId == request.SituacaoProcessoId);
                    }

                    if (!string.IsNullOrEmpty(request.NomeResponsavel))
                    {
                        query = query.Where(p => p.ProcessoResponsaveis.Any(r => r.Responsavel.Nome.ToLower().Contains(request.NomeResponsavel.ToLower())));
                    }

                    var pagedList = PagedList <Processo> .Create(query, request.PageNumber, request.PageSize);

                    var processoDtos = pagedList.Select(p => new ProcessoDto
                    {
                        Id                 = p.Id,
                        NumeroProcesso     = p.NumeroProcesso,
                        DataDistribuicao   = p.DataDistribuicao,
                        SegredoJustica     = p.SegredoJustica,
                        PastaFisicaCliente = p.PastaFisicaCliente,
                        Descricao          = p.Descricao,
                        SituacaoProcessoId = p.SituacaoId,
                        Responsaveis       = p.Responsaveis?.Select(r => new ResponsavelDto
                        {
                            Id    = r.Id,
                            Cpf   = r.Cpf,
                            Email = r.Email,
                            Nome  = r.Nome,
                            Foto  = r.Foto
                        })
                    });

                    var pagedResult = PagedList <ProcessoDto> .Create(processoDtos.ToList(), pagedList.TotalCount, request.PageNumber, request.PageSize);

                    return(new RequestResponseWrapper <PagedList <ProcessoDto> >(true, pagedResult));
                }
            }
            catch (System.Exception e)
            {
                this.logger.LogError(e, "Erro Inesperado");
                this.NotificationContext.Add(NotificationKeys.UnexpectedError, "Erro inesperado.");
            }

            return(new RequestResponseWrapper <PagedList <ProcessoDto> >(false, null));
        }