public Task <int> Handle(UpdateProcedimentoTipoCommand request, CancellationToken cancellationToken)
        {
            if (!request.IsValid())
            {
                NotifyValidationErrors(request);
                return(Task.FromResult(0));
            }

            var procedimentoTipo         = new ProcedimentoTipo(request.Id, request.Sigla, request.Descricao);
            var existingProcedimentoTipo = _procedimentoTipoRepository.GetAsNoTracking(x => x.Id == procedimentoTipo.Id);

            if (existingProcedimentoTipo != null)
            {
                if (!existingProcedimentoTipo.Equals(procedimentoTipo))
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Sigla ou Descrição já está sendo usada."));
                    return(Task.FromResult(0));
                }
            }

            _procedimentoTipoRepository.Update(procedimentoTipo);

            if (Commit())
            {
                // TO DO: Raise Event
            }

            return(Task.FromResult(procedimentoTipo.Id));
        }
        public Task <int> Handle(RegisterNewProcedimentoTipoCommand request, CancellationToken cancellationToken)
        {
            if (!request.IsValid())
            {
                NotifyValidationErrors(request);
                return(Task.FromResult(0));
            }

            var procedimentoTipo = new ProcedimentoTipo(request.Sigla, request.Descricao);

            if (_procedimentoTipoRepository.Exists(procedimentoTipo.Sigla))
            {
                Bus.RaiseEvent(new DomainNotification(request.MessageType, "A sigla já está sendo usada."));
                return(Task.FromResult(0));
            }

            _procedimentoTipoRepository.Add(procedimentoTipo);

            if (Commit())
            {
                // TO DO: Raise Event
            }

            return(Task.FromResult(procedimentoTipo.Id));
        }
        public Task <int> Handle(RegisterNewProcedimentoCommand request, CancellationToken cancellationToken)
        {
            if (!request.IsValid())
            {
                NotifyValidationErrors(request);
                return(Task.FromResult(0));
            }

            if (!string.IsNullOrEmpty(request.NumeroProcessual))
            {
                if (_procedimentoRepository.Exists(request.NumeroProcessual))
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Número Processual já está sendo usado."));
                    return(Task.FromResult(0));
                }
            }

            ProcedimentoTipo tipoProcedimento = null;

            if (request.TipoProcedimentoId.HasValue)
            {
                tipoProcedimento = _procedimentoTipoRepository.GetById(request.TipoProcedimentoId.Value);

                if (tipoProcedimento == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Tipo de Procedimento não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Artigo artigo = null;

            if (request.ArtigoId.HasValue)
            {
                artigo = _artigoRepository.GetById(request.ArtigoId.Value);

                if (artigo == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Artigo não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Assunto assunto = null;

            if (request.AssuntoId.HasValue)
            {
                assunto = _assuntoRepository.GetById(request.AssuntoId.Value);

                if (assunto == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Assunto não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Municipio municipio = null;

            if (request.ComarcaId.HasValue)
            {
                municipio = _municipioRepository.GetById(request.ComarcaId.Value);

                if (municipio == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Comarca não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            VaraCriminal varaCriminal = null;

            if (request.VaraCriminalId.HasValue)
            {
                varaCriminal = _varaCriminalRepository.GetById(request.VaraCriminalId.Value);

                if (varaCriminal == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Vara Criminal não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            UnidadePolicial unidadePolicial = null;

            if (request.DelegaciaOrigemId.HasValue)
            {
                unidadePolicial = _unidadePolicialRepository.GetById(request.DelegaciaOrigemId.Value);

                if (unidadePolicial == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Delegacia de Origem não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            var situacao = _situacaoRepository.GetById(1);

            var procedimento = new Procedimento(request.BoletimUnificado, request.BoletimOcorrencia, request.NumeroProcessual, request.Gampes,
                                                request.Anexos, request.LocalFato, request.DataFato, request.DataInstauracao, request.AndamentoProcessual,
                                                tipoProcedimento, varaCriminal, municipio, assunto, artigo, unidadePolicial, situacao);

            _procedimentoRepository.Add(procedimento);

            var situacaoProcedimento = new SituacaoProcedimento(procedimento, situacao);

            _situacaoProcedimentoRepository.Add(situacaoProcedimento);

            if (request.Movimentacoes != null)
            {
                var movimentacoes = request.Movimentacoes.Select(m => new Movimentacao(m.Destino, m.Data, procedimento));

                _movimentacaoRepository.AddRange(movimentacoes);
            }

            if (Commit())
            {
                // TO DO: Raise Event
            }

            return(Task.FromResult(procedimento.Id));
        }
        public Task <int> Handle(UpdateProcedimentoCommand request, CancellationToken cancellationToken)
        {
            if (!request.IsValid())
            {
                NotifyValidationErrors(request);
                return(Task.FromResult(0));
            }

            ProcedimentoTipo tipoProcedimento = null;

            if (request.TipoProcedimentoId.HasValue)
            {
                tipoProcedimento = _procedimentoTipoRepository.GetById(request.TipoProcedimentoId.Value);

                if (tipoProcedimento == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Tipo de Procedimento não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Artigo artigo = null;

            if (request.ArtigoId.HasValue)
            {
                artigo = _artigoRepository.GetById(request.ArtigoId.Value);

                if (artigo == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Artigo não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Assunto assunto = null;

            if (request.AssuntoId.HasValue)
            {
                assunto = _assuntoRepository.GetById(request.AssuntoId.Value);

                if (assunto == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "O Assunto não foi encontrado."));
                    return(Task.FromResult(0));
                }
            }

            Municipio municipio = null;

            if (request.ComarcaId.HasValue)
            {
                municipio = _municipioRepository.GetById(request.ComarcaId.Value);

                if (municipio == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Comarca não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            VaraCriminal varaCriminal = null;

            if (request.VaraCriminalId.HasValue)
            {
                varaCriminal = _varaCriminalRepository.GetById(request.VaraCriminalId.Value);

                if (varaCriminal == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Vara Criminal não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            UnidadePolicial unidadePolicial = null;

            if (request.DelegaciaOrigemId.HasValue)
            {
                unidadePolicial = _unidadePolicialRepository.GetById(request.DelegaciaOrigemId.Value);

                if (unidadePolicial == null)
                {
                    Bus.RaiseEvent(new DomainNotification(request.MessageType, "A Delegacia de Origem não foi encontrada."));
                    return(Task.FromResult(0));
                }
            }

            Procedimento existingProcedimento = null;

            if (!string.IsNullOrEmpty(request.NumeroProcessual))
            {
                existingProcedimento = _procedimentoRepository.GetAsNoTracking(x => x.NumeroProcessual.Contains(request.NumeroProcessual) &&
                                                                               x.Id != request.Id);
            }

            if (existingProcedimento != null)
            {
                Bus.RaiseEvent(new DomainNotification(request.MessageType, "O número processual já está sendo usado."));
                return(Task.FromResult(0));
            }

            existingProcedimento = _procedimentoRepository.GetAsNoTracking(x => x.Id == request.Id);

            if (existingProcedimento == null)
            {
                Bus.RaiseEvent(new DomainNotification(request.MessageType, "O procedimento não foi encontrado."));
                return(Task.FromResult(0));
            }

            var situacaoAtual = _situacaoRepository.GetById(existingProcedimento.SituacaoAtualId);

            var procedimento = new Procedimento(request.Id, request.BoletimUnificado, request.BoletimOcorrencia, request.NumeroProcessual, request.Gampes,
                                                request.Anexos, request.LocalFato, request.DataFato, request.DataInstauracao, request.AndamentoProcessual,
                                                tipoProcedimento, varaCriminal, municipio, assunto, artigo, unidadePolicial, situacaoAtual);

            _procedimentoRepository.Update(procedimento);

            if (Commit())
            {
                // TO DO: Raise Event
            }

            return(Task.FromResult(procedimento.Id));
        }