public void Execute(Documento documento, ImagemReconhecida imagemReconhecida)
        {
            if (!this.PodeFazerClassificacao(documento.TipoDocumento))
            {
                return;
            }

            //// verifica se o OCR reconheceu o tipo do documento.
            var valorReconhecidoTipo = imagemReconhecida.ValoresReconhecidos.FirstOrDefault(x => x.CampoTemplate.ToLower() == "tipo");

            if (valorReconhecidoTipo == null || string.IsNullOrEmpty(valorReconhecidoTipo.Value))
            {
                return;
            }

            Log.Application.InfoFormat("Tentativa de classificação do documento {0}", documento.Id);

            //// carregar tags e montar listas para cada tipo
            int tipoDocumentoId = this.DefinirTipoPorTags(valorReconhecidoTipo.Value);

            if (tipoDocumentoId != TipoDocumento.CodigoNaoIdentificado)
            {
                documento.TipoDocumento = this.tipoDocumentoRepositorio.ObterPorCodigo(tipoDocumentoId);
                this.documentoRepositorio.Salvar(documento);
                this.gravaLogDocumentoServico.Executar(
                    LogDocumento.AcaoDocumentoOcr,
                    documento.Id,
                    string.Format("Documento reclassificado para [{0}] pelo OCR.", tipoDocumentoId));
                Log.Application.InfoFormat("Documento [{0}] reclassificado para [{1}] pelo OCR.", documento.Id, tipoDocumentoId);
            }
        }
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, ResultadoBatimentoDocumento resultadoBatimento)
        {
            Log.Application.InfoFormat("Inicio do batimento do documento {0}", documento.Id);

            if (this.TipoPodeFazerBatimento(documento.TipoDocumento))
            {
                return;
            }

            switch (documento.TipoDocumento.Id)
            {
            ////Por enquanto, no projeto Banco Original, não há necessidade de analisar por tipo de doc.
            ////case TipoDocumento.CodigoComprovanteDeResidencia:
            ////    this.batimentoEComplementacaoDocumentoServico =
            ////    IoC.Current.Resolve<BatimentoEComplementacaoComprovanteResidenciaServico>();
            ////    break;
            default:
                this.batimentoEComplementacaoDocumentoServico =
                    IoC.Current.Resolve <BatimentoEComplementacaoDocumentoServico>();
                break;
            }

            var camposJaBatidosId = (from x in resultadoBatimento.Campos where x.Batido select x.Indexacao.Campo.Id).ToList();

            this.batimentoEComplementacaoDocumentoServico.Execute(documento, imagemReconhecida, camposJaBatidosId);

            this.documentoRepositorio.Salvar(documento);
        }
Пример #3
0
        protected virtual bool PodeComplementarIndexacao(Documento documento, ImagemReconhecida imagemReconhecida)
        {
            if (imagemReconhecida == null)
            {
                return(false);
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return(false);
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            if (camposDoDocumento == null)
            {
                return(false);
            }

            if (camposDoDocumento.Count == 0)
            {
                return(false);
            }

            return(true);
        }
Пример #4
0
        public ResultadoBatimentoDocumento Iniciar(
            Documento documento,
            ImagemReconhecida imagemReconhecida)
        {
            IBatimentoDocumento batimentoDocumento = IoC
                                                     .Current
                                                     .Resolve <BatimentoDocumento <QualquerDocumentoBatimento> >();

            //// batimento por campos (RECVALUE)
            var resultadoBatimento = batimentoDocumento.Entre(documento, imagemReconhecida);

            var camposNaoBatidos = resultadoBatimento
                                   .Campos
                                   .Where(x => x.Batido == false)
                                   .ToList();

            //// batimento por fulltext (PALAVRARECONHECIDA ou REDIS)
            resultadoBatimento = this.RealizarBatimentoPorCampoNaoBatido(
                imagemReconhecida,
                resultadoBatimento,
                camposNaoBatidos);

            var resultadoBatimentoValidade = this.validarResultadoBatimento
                                             .ValidarNumeroDocumentoIdentificacao(resultadoBatimento, documento);

            return(resultadoBatimentoValidade);
        }
Пример #5
0
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null || valoresReconhecidos.Count == 0)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio
                                    .ObterPorTipoDocumento(documento.TipoDocumento);

            foreach (var campoDoDocumento in camposDoDocumento)
            {
                var indexacao = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);

                if (!campoDoDocumento.PodeInserirPeloOcr)
                {
                    continue;
                }

                if (indexacao == null)
                {
                    indexacao = new Indexacao
                    {
                        Campo     = campoDoDocumento,
                        Documento = documento,
                    };

                    documento.Indexacao.Add(indexacao);
                }
                else
                {
                    //// ja possui indexacao cadastrada, verificar se ja tem conteudo
                    if (!string.IsNullOrEmpty(indexacao.PrimeiroValor))
                    {
                        continue;
                    }
                }

                this.SalvarIndexacaoSemComparacao(indexacao, valoresReconhecidos);
            }
        }
Пример #6
0
        private ResultadoBatimentoDocumento RealizarBatimentoPorCampoNaoBatido(
            ImagemReconhecida imagemReconhecida,
            ResultadoBatimentoDocumento resultadoBatimento,
            List <CampoBatido> camposNaoBatidos)
        {
            foreach (var campoNaoBatido in camposNaoBatidos)
            {
                var batimentoCampo = this.batimentoCampoFactory.Criar(campoNaoBatido.Indexacao);

                var resultadoDoCampo = batimentoCampo.Entre(campoNaoBatido.Indexacao, imagemReconhecida.Palavras);

                resultadoBatimento.AdicionarOuEditar(resultadoDoCampo);
            }

            return(resultadoBatimento);
        }
        public bool Verificar(string palavra, ImagemReconhecida imagemReconhecida)
        {
            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            palavra = palavra.ToUpper() + " ";
            foreach (var valorReconhecido in valoresReconhecidos.Where(x => string.IsNullOrEmpty(x.Value) == false))
            {
                var textoReconhecido = valorReconhecido.Value.ToUpper() + " ";
                if (textoReconhecido.IndexOf(palavra, System.StringComparison.Ordinal) > 0)
                {
                    return(true);
                }
            }

            return(this.batimentoFullText.Batido(palavra, imagemReconhecida.Palavras));
        }
Пример #8
0
        protected override bool PodeComplementarIndexacao(
            Documento documento,
            ImagemReconhecida imagemReconhecida)
        {
            var camposDoDocumento = this.campoRepositorio
                                    .ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            if (camposDoDocumento == null)
            {
                return(false);
            }

            if (camposDoDocumento.Count == 0)
            {
                return(false);
            }

            return(true);
        }
        public ImagemReconhecida Obter(Documento documento)
        {
            var imagemReconhecida = new ImagemReconhecida
            {
                ValoresReconhecidos = this.valorReconhecidoRepositorio.ObtemPorDocumento(documento.Id)
            };

            if ((documento.TipoDocumento.Id == TipoDocumento.CodigoDocumentoGeral || documento.EhPac) == false)
            {
                if (Contexto.UsarBatimentoAntigo)
                {
                    imagemReconhecida.Palavras = this.palavraReconhecidaRepositorio
                                                 .ObterPorDocumentoId(documento.Id);
                }
                else
                {
                    imagemReconhecida.Palavras = this.palavraReconhecidaStorage.Obter(documento.Id);
                }
            }

            return(imagemReconhecida);
        }
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var campoDoDocumento in camposDoDocumento)
            {
                if (this.mapeamentoCampoRepositorio.ExisteMapeamentoParaCampo(campoDoDocumento.Id) == false)
                {
                    Log.Application.DebugFormat("ALERTA: campo {0} não está mapeado para nenhum template", campoDoDocumento.Description);
                    continue;
                }

                var indexacao = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);

                //// tenta bater com ancoragem ABBYY
                if (this.BatimentoAncoragemDeCnh(indexacao, campoDoDocumento, valoresReconhecidos, documento))
                {
                    this.gravaLogDocumentoServico.Executar(
                        LogDocumento.AcaoDocumentoOcr,
                        documento.Id,
                        string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", indexacao.Campo.Description, BatimentoFullText.LimitaString(indexacao.SegundoValor.Trim(), 99)));
                    this.indexacaoRepositorio.Salvar(indexacao);
                }
            }
        }
Пример #11
0
        public ResultadoBatimentoDocumento Entre(Documento documento, ImagemReconhecida imagemReconhecida)
        {
            var indexacoesMapeadas = this.indexacaoMapeada.ComValoresReconhecidos(
                documento.Indexacao.ToList(),
                imagemReconhecida.ValoresReconhecidos);

            var resultadoBatimento = new ResultadoBatimentoDocumento();

            var batimento = IoC.Current.Resolve(typeof(TBatimentoIndexacaoMapeada));

            var batimentoResidencia = ((IBatimentoIndexacaoMapeada)batimento)
                                      .ProximaTentativa(IoC.Current.Resolve <ComprovanteResidenciaConsultaCepBatimento>());

            ////Caso haja a necessidade de incluir mais classes de batimento pode-se hierarquizar como abaixo:
            //// var batimentoRg = ((IBatimentoIndexacaoMapeada)batimento)
            ////    .ProximaTentativa(IoC.Current.Resolve<RgBatimento>());
            ////
            //// var batimentoRgReceita = ((IBatimentoIndexacaoMapeada)batimento)
            ////    .ProximaTentativa(IoC.Current.Resolve<RgConsultaReceitaBatimento>());

            foreach (var mapeada in indexacoesMapeadas)
            {
                var batido = ((IBatimentoIndexacaoMapeada)batimento).EstaBatido(mapeada);

                var campoBatido = new CampoBatido
                {
                    Indexacao     = mapeada.Indexacao,
                    Batido        = batido,
                    TipoBatimento = TipoBatimento.Template
                };

                resultadoBatimento.AdicionarOuEditar(campoBatido);
            }

            return(resultadoBatimento);
        }
        //// customização para "batimento" direto do OCR, sem informação para comparar, confiando no que o OCR leu.
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidos)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var campoAtual in camposDoDocumento)
            {
                //// verifica se ja foi preenchido via batimento normal (evitar inserir linha duplicada)
                if (camposBatidos != null && camposBatidos.Any(x => x == campoAtual.Id))
                {
                    continue;
                }

                if (!campoAtual.PodeInserirPeloOcr)
                {
                    continue;
                }

                //// Há casos em que o Fluxo retorna para batimento depois da Identificação, e o documento já tem campos preenchidos
                //// se for um desses casos, não deve acrescentar batimento duplicado
                var indexacaoCampoAtual = this.indexacaoRepositorio.ObterPorTipoCampoDeUmDocumento(documento.Id, campoAtual.TipoCampo).FirstOrDefault();
                if (this.VerificaSeJaBateuCampoAtual(indexacaoCampoAtual))
                {
                    continue;
                }

                Indexacao indexacao          = null;
                var       encontrouIndexacao = false;
                foreach (var valorReconhecido in valoresReconhecidos)
                {
                    if (string.IsNullOrEmpty(valorReconhecido.Value))
                    {
                        continue;
                    }

                    if (campoAtual.EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                    {
                        continue;
                    }

                    if (this.ConteudoEncontradoValido(ref indexacao, campoAtual, valorReconhecido))
                    {
                        encontrouIndexacao = true;
                        Log.Application.InfoFormat("Bateu TdCampo_code[{0}] do mdoc[{1}]. Conteudo:[{2}]", campoAtual.Id, documento.Id, indexacao.PrimeiroValor);
                        //// Se for uma data de nascimento, continuar buscando por data mais antiga
                        if (!this.DeveContinuarProcurando(campoAtual))
                        {
                            break;
                        }
                    }
                }

                if (encontrouIndexacao)
                {
                    if (indexacaoCampoAtual != null)
                    {
                        indexacaoCampoAtual.PrimeiroValor = indexacao.PrimeiroValor;
                        indexacao = indexacaoCampoAtual;
                    }
                    else
                    {
                        indexacao.Documento = documento;
                        documento.Indexacao.Add(indexacao);
                    }

                    indexacao.DataPrimeiraDigitacao = DateTime.Now;
                    this.gravaLogDocumentoServico.Executar(
                        LogDocumento.AcaoDocumentoOcr,
                        documento.Id,
                        string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", indexacao.Campo.Description, BatimentoFullText.LimitaString(indexacao.PrimeiroValor.Trim(), 99)));
                    this.indexacaoRepositorio.Salvar(indexacao);
                }
            }
        }
Пример #13
0
        public virtual void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (this.PodeComplementarIndexacao(documento, imagemReconhecida) == false)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio
                                    .ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id)
                                    .OrderBy(campo => campo.PodeInserirPeloOcr);

            foreach (var campoDoDocumento in camposDoDocumento)
            {
                var indexacao           = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);
                var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

                if (this.ExistemValoresReconhecidos(valoresReconhecidos) == false)
                {
                    if (this.CampoPodeSerInseridoMesmoQuandoNaoHaReconhecimento(indexacao, campoDoDocumento))
                    {
                        indexacao = this.AdicionaNovaIndexacaoParaCampoReconhecido(
                            documento,
                            null,
                            campoDoDocumento);

                        this.gravaLogDocumentoServico.Executar(
                            LogDocumento.AcaoDocumentoOcr,
                            documento.Id,
                            string.Format("Campo [{0}] inserido pelo ocr.", campoDoDocumento.Description));

                        this.indexacaoRepositorio.Salvar(indexacao);
                    }

                    continue;
                }

                foreach (var valorReconhecido in valoresReconhecidos)
                {
                    if (string.IsNullOrEmpty(valorReconhecido.Value))
                    {
                        continue;
                    }

                    if (campoDoDocumento.EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                    {
                        continue;
                    }

                    indexacao = this.AlterarIndexacao(
                        documento,
                        valorReconhecido,
                        campoDoDocumento,
                        indexacao,
                        imagemReconhecida.Palavras);

                    if (indexacao != null)
                    {
                        Log.Application.DebugFormat(
                            "BatimentoEComplementacaoDocumentoBase::Salvou indexacao?? Documento {0} Indexacao {1}",
                            indexacao.Documento.Id,
                            indexacao.Id);

                        this.indexacaoRepositorio.Salvar(indexacao);
                    }
                }
            }
        }
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var valorReconhecido in valoresReconhecidos)
            {
                if (camposDoDocumento == null)
                {
                    break;
                }

                if (camposDoDocumento.Count == 0)
                {
                    break;
                }

                if (string.IsNullOrEmpty(valorReconhecido.Value))
                {
                    continue;
                }

                var encontrouMapeamento = false;
                foreach (var campoDoDocumento in camposDoDocumento)
                {
                    if (campoDoDocumento
                        .EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                    {
                        continue;
                    }

                    encontrouMapeamento = true;
                    Log.Application.DebugFormat("Campo {0} mapeado para campo {1} do template {2}",
                                                campoDoDocumento.Description,
                                                valorReconhecido.CampoTemplate,
                                                valorReconhecido.TemplateName);

                    var indexacao = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);

                    if (string.IsNullOrEmpty(indexacao.ValorFinal) == false || string.IsNullOrWhiteSpace(indexacao.ValorFinal) == false)
                    {
                        continue;
                    }

                    var campoReconhecido = valorReconhecido.Value;

                    if (indexacao.Campo.TipoDado == TipoDado.DateTime)
                    {
                        campoReconhecido = campoReconhecido.FormatarData();

                        if (string.IsNullOrEmpty(campoReconhecido))
                        {
                            continue;
                        }
                    }

                    if (indexacao.BateCom(campoReconhecido))
                    {
                        indexacao.PrimeiroValor = indexacao.SegundoValor;
                        indexacao.ValorFinal    = indexacao.SegundoValor;
                        indexacao.ValorUtilizadoParaValorFinal = ValorUtilizadoParaValorFinal.SegundoValor;
                        indexacao.OcrComplementou       = true;
                        indexacao.DataPrimeiraDigitacao = DateTime.Now;

                        this.gravaLogDocumentoServico.Executar(
                            LogDocumento.AcaoDocumentoOcr,
                            documento.Id,
                            string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", campoDoDocumento.Description, BatimentoFullText.LimitaString(indexacao.SegundoValor.Trim(), 99)));
                    }
                    else
                    {
                        indexacao.PrimeiroValor         = string.Empty;
                        indexacao.ValorFinal            = string.Empty;
                        indexacao.DataPrimeiraDigitacao = DateTime.Now;
                    }

                    this.indexacaoRepositorio.Salvar(indexacao);
                }
            }
        }
Пример #15
0
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var valorReconhecido in valoresReconhecidos)
            {
                if (camposDoDocumento == null)
                {
                    break;
                }

                if (camposDoDocumento.Count == 0)
                {
                    break;
                }

                if (string.IsNullOrEmpty(valorReconhecido.Value))
                {
                    continue;
                }

                var encontrouMapeamento = false;
                foreach (var campoDoDocumento in camposDoDocumento)
                {
                    if (campoDoDocumento
                        .EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                    {
                        continue;
                    }

                    encontrouMapeamento = true;
                    Log.Application.DebugFormat("Campo {0} mapeado para campo {1} do template {2}",
                                                campoDoDocumento.Description,
                                                valorReconhecido.CampoTemplate,
                                                valorReconhecido.TemplateName);

                    var indexacao   = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);
                    var deveInserir = false;

                    if (indexacao == null)
                    {
                        if (campoDoDocumento.PodeInserirPeloOcr && string.IsNullOrEmpty(valorReconhecido.Value) == false)
                        {
                            deveInserir = true;
                        }
                        else
                        {
                            continue;
                        }
                    }

                    if (deveInserir)
                    {
                        //// TODO: revisar -2
                        indexacao = new Indexacao()
                        {
                            Campo                 = campoDoDocumento,
                            Documento             = documento,
                            PrimeiroValor         = valorReconhecido.Value,
                            OcrComplementou       = true,
                            DataPrimeiraDigitacao = DateTime.Now,
                            UsuarioPrimeiroValor  = -2
                        };

                        documento.Indexacao.Add(indexacao);
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(indexacao.ValorFinal) == false || string.IsNullOrWhiteSpace(indexacao.ValorFinal) == false)
                        {
                            continue;
                        }

                        if (indexacao.BateCom(valorReconhecido.Value))
                        {
                            indexacao.PrimeiroValor = indexacao.SegundoValor;
                            indexacao.ValorFinal    = indexacao.SegundoValor;
                            indexacao.ValorUtilizadoParaValorFinal = ValorUtilizadoParaValorFinal.SegundoValor;
                            indexacao.OcrComplementou       = true;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;

                            this.gravaLogDocumentoServico.Executar(
                                LogDocumento.AcaoDocumentoOcr,
                                documento.Id,
                                string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", campoDoDocumento.Description, BatimentoFullText.LimitaString(indexacao.SegundoValor.Trim(), 99)));
                        }
                        else
                        {
                            indexacao.PrimeiroValor         = string.Empty;
                            indexacao.ValorFinal            = string.Empty;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;
                        }
                    }

                    this.indexacaoRepositorio.Salvar(indexacao);
                }

                if (encontrouMapeamento == false)
                {
                    Log.Application.DebugFormat("ALERTA: campo {0} do template {1} não está mapeado para nenhum campo",
                                                valorReconhecido.CampoTemplate,
                                                valorReconhecido.TemplateName);
                }
            }

            ////batimento especial para campos de data (validade e emissao)
            try
            {
                this.BatimentoDatasDoAtestado(documento, valoresReconhecidos, camposDoDocumento);
            }
            catch (Exception exception)
            {
                Log.Application.Error(string.Format("Erro ao processar batimento de data do Atestado de Matricula- Documento #{0} ", documento.Id), exception);
            }

            ////batimento com fullTExt
            try
            {
                this.BaterUsandoFullText(documento, imagemReconhecida.Palavras);
            }
            catch (Exception exception)
            {
                Log.Application.Error(string.Format("Erro ao processar batimento full text de Atestado de Matricula - Documento #{0} ", documento.Id), exception);
            }
        }
Пример #16
0
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var codigoDoTipoDoDocumento = this.ObterCodigoTipoDocumentoApartirValoresReconhecidos(valoresReconhecidos);

            if (this.CodigoEhValido(codigoDoTipoDoDocumento) == false)
            {
                this.gravaLogDocumentoServico.Executar(
                    LogDocumento.AcaoDocumentoOcr,
                    documento.Id,
                    "Não foi possivel reclassificar documento 'Não Identificado' no OCR.");

                Log.Application.InfoFormat("Tentiva de reclassificação do Documento #{0} falhou.", documento.Id);

                return;
            }

            TipoDocumento novoTipoDocumento;

            var cpfDocumento = documento
                               .Indexacao
                               .Where(x => x.Campo.ReferenciaArquivo == Campo.ReferenciaDeArquivoCpf);

            var documentosDoParticipante = this.documentoRepositorio
                                           .ObterDocumentosDoProcessoComCpf(
                documento.Processo.Id,
                cpfDocumento.ElementAt(0).ObterValor());

            ////if (codigoDoTipoDoDocumento == TipoDocumento.CodigoCn)
            ////{
            ////    if (this.JaPossuiDocumentoIdentificacao(documentosDoParticipante))
            ////    {
            ////        novoTipoDocumento = this.tipoDocumentoRepositorio.ObterPorCodigo(TipoDocumento.CodigoDocumentoGeral);

            ////        documento.TipoDocumento = novoTipoDocumento;
            ////        this.alteraIndexacaoServico.Alterar(documento, novoTipoDocumento);

            ////        this.gravaLogDocumentoServico.Executar(
            ////            LogDocumento.AcaoDocumentoOcr,
            ////            documento.Id,
            ////            "Documento classificado como [Documento Geral]. Documento foi reconhecido como Certidão de nascimento e já existe um documento de identificação na conta");

            ////        return;
            ////    }
            ////}

            if (this.JaPossuiDocumentoIdentificacao(documentosDoParticipante) == false)
            {
                this.gravaLogDocumentoServico.Executar(
                    LogDocumento.AcaoDocumentoOcr,
                    documento.Id,
                    "Documento não foi reclassificado. Não existe documento de identificação para este participamente");

                return;
            }

            novoTipoDocumento = this.tipoDocumentoRepositorio.ObterPorCodigo(codigoDoTipoDoDocumento);

            documento.TipoDocumento = novoTipoDocumento;

            this.alteraIndexacaoServico.Alterar(documento, novoTipoDocumento);

            this.gravaLogDocumentoServico.Executar(
                LogDocumento.AcaoDocumentoOcr,
                documento.Id,
                string.Format("Documento reclassificado para [{0}] pelo OCR.", novoTipoDocumento.Description));

            Log.Application.InfoFormat("Documento #{0} reclassificado pelo OCR para tipo #{1}", documento.Id, codigoDoTipoDoDocumento);
        }
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var campoDoDocumento in camposDoDocumento)
            {
                var indexacao   = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);
                var deveInserir = false;

                if (indexacao == null)
                {
                    if (campoDoDocumento.PodeInserirPeloOcr)
                    {
                        deveInserir = true;
                    }
                    else
                    {
                        continue;
                    }
                }

                if (deveInserir)
                {
                    indexacao = new Indexacao()
                    {
                        Campo                 = campoDoDocumento,
                        Documento             = documento,
                        OcrComplementou       = true,
                        DataPrimeiraDigitacao = DateTime.Now,
                        UsuarioPrimeiroValor  = -2
                    };

                    documento.Indexacao.Add(indexacao);
                    this.SalvarIndexacaoSemComparacao(indexacao, valoresReconhecidos);
                }
                else
                {
                    //// tratamento para validação de código de barras: se campo estiver mapeado e for um codigo válido, pode inserir o que o OCR achou!
                    foreach (var valorReconhecido in valoresReconhecidos)
                    {
                        if (campoDoDocumento.EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                        {
                            continue;
                        }

                        try
                        {
                            string linhaDigitavelLimpa;
                            if (this.ExtrairNumerosDoCodigoDeBarras(valorReconhecido.Value, out linhaDigitavelLimpa))
                            {
                                indexacao.Campo                 = campoDoDocumento;
                                indexacao.Documento             = documento;
                                indexacao.OcrComplementou       = true;
                                indexacao.DataPrimeiraDigitacao = DateTime.Now;
                                indexacao.UsuarioPrimeiroValor  = -2;

                                this.SalvarIndexacao(indexacao, linhaDigitavelLimpa);
                                break;
                            }
                        }
                        catch (Exception exception)
                        {
                            Log.Application.Error(string.Format("Erro ao processar batimento de Código de Barras de Comprovante Pagto - Documento #{0} ", documento.Id), exception);
                        }
                    }
                }
            }
        }
Пример #18
0
        public void Execute(Documento documento, ImagemReconhecida imagemReconhecida, List <int> camposBatidosId = null)
        {
            if (imagemReconhecida == null)
            {
                return;
            }

            var valoresReconhecidos = imagemReconhecida.ValoresReconhecidos;

            if (valoresReconhecidos == null)
            {
                return;
            }

            var camposDoDocumento = this.campoRepositorio.ObterPorTipoDocumentoComMapeamentoOcr(documento.TipoDocumento.Id);

            foreach (var valorReconhecido in valoresReconhecidos)
            {
                if (camposDoDocumento == null)
                {
                    break;
                }

                if (camposDoDocumento.Count == 0)
                {
                    break;
                }

                if (string.IsNullOrEmpty(valorReconhecido.Value))
                {
                    continue;
                }

                var encontrouMapeamento = false;
                foreach (var campoDoDocumento in camposDoDocumento)
                {
                    if (campoDoDocumento
                        .EstaMapeadoPara(valorReconhecido.CampoTemplate, valorReconhecido.TemplateName) == false)
                    {
                        continue;
                    }

                    encontrouMapeamento = true;
                    Log.Application.DebugFormat("Campo {0} mapeado para campo {1} do template {2}",
                                                campoDoDocumento.Description,
                                                valorReconhecido.CampoTemplate,
                                                valorReconhecido.TemplateName);

                    var indexacao = documento.Indexacao.FirstOrDefault(x => x.Campo == campoDoDocumento);

                    if (indexacao == null)
                    {
                        continue;
                    }

                    if (string.IsNullOrEmpty(indexacao.ValorFinal) == false || string.IsNullOrWhiteSpace(indexacao.ValorFinal) == false)
                    {
                        continue;
                    }

                    var listaDeCamposDataEmissaoDosBoletos = new List <int>()
                    {
                        Campo.CampoBoletoComAutenticDataEmissao,
                        Campo.CampoBoletoSemAutenticDataEmissao
                    };

                    ////tratamento especial para datas de emissao dos boletos
                    if (listaDeCamposDataEmissaoDosBoletos.Contains(campoDoDocumento.Id) && campoDoDocumento.PodeInserirPeloOcr && string.IsNullOrEmpty(valorReconhecido.Value) == false)
                    {
                        string dataEmissao;
                        if (this.ValidarDataEmissao(valorReconhecido.Value, out dataEmissao))
                        {
                            indexacao.PrimeiroValor = dataEmissao;
                            indexacao.ValorFinal    = dataEmissao;
                            indexacao.ValorUtilizadoParaValorFinal = ValorUtilizadoParaValorFinal.PrimeiroValor;
                            indexacao.OcrComplementou       = true;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;

                            this.gravaLogDocumentoServico.Executar(
                                LogDocumento.AcaoDocumentoOcr,
                                documento.Id,
                                string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", campoDoDocumento.Description, BatimentoFullText.LimitaString(dataEmissao.Trim(), 99)));
                            this.indexacaoRepositorio.Salvar(indexacao);

                            continue;
                        }
                    }

                    ////tratamento especial para campo de codigo de barras
                    if (indexacao.Campo.Id == Campo.CampoBoletoComAutenticCodBarras || indexacao.Campo.Id == Campo.CampoBoletoSemAutenticCodBarras)
                    {
                        string linhaDigitavelLimpa;
                        if (this.ExtrairNumerosDoCodigoDeBarras(valorReconhecido.Value, out linhaDigitavelLimpa))
                        {
                            indexacao.PrimeiroValor = linhaDigitavelLimpa;
                            indexacao.ValorFinal    = linhaDigitavelLimpa;
                            indexacao.ValorUtilizadoParaValorFinal = ValorUtilizadoParaValorFinal.PrimeiroValor;
                            indexacao.OcrComplementou       = true;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;

                            this.gravaLogDocumentoServico.Executar(
                                LogDocumento.AcaoDocumentoOcr,
                                documento.Id,
                                string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", campoDoDocumento.Description, BatimentoFullText.LimitaString(linhaDigitavelLimpa.Trim(), 99)));
                        }
                    }
                    else
                    {
                        if (indexacao.BateCom(valorReconhecido.Value))
                        {
                            indexacao.PrimeiroValor = indexacao.SegundoValor;
                            indexacao.ValorFinal    = indexacao.SegundoValor;
                            indexacao.ValorUtilizadoParaValorFinal = ValorUtilizadoParaValorFinal.SegundoValor;
                            indexacao.OcrComplementou       = true;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;

                            this.gravaLogDocumentoServico.Executar(
                                LogDocumento.AcaoDocumentoOcr,
                                documento.Id,
                                string.Format("Campo [{0}] complementado pelo ocr. Valor:[{1}]", campoDoDocumento.Description, BatimentoFullText.LimitaString(indexacao.SegundoValor.Trim(), 99)));
                        }
                        else
                        {
                            indexacao.PrimeiroValor         = string.Empty;
                            indexacao.ValorFinal            = string.Empty;
                            indexacao.DataPrimeiraDigitacao = DateTime.Now;
                        }
                    }

                    this.indexacaoRepositorio.Salvar(indexacao);
                }

                if (encontrouMapeamento == false)
                {
                    Log.Application.DebugFormat("ALERTA: campo {0} do template {1} não está mapeado para nenhum campo",
                                                valorReconhecido.CampoTemplate,
                                                valorReconhecido.TemplateName);
                }
            }

            ////batimento com fullTExt
            try
            {
                this.BaterUsandoFullText(documento, imagemReconhecida.Palavras);
            }
            catch (Exception exception)
            {
                Log.Application.Error(string.Format("Erro ao processar batimento full text de Atestado de Matricula - Documento #{0} ", documento.Id), exception);
            }
        }