Example #1
0
        public static List <CorrespondenciaDocs> GetSuggestions(List <DocumentoExterno> deList)
        {
            var ticks = DateTime.Now.Ticks;

            var raes = new HashSet <RegistoAutoridadeExterno>();
            var decs = new HashSet <DocumentoComposto>();
            var deas = new HashSet <DocumentoAnexo>();
            var des  = new HashSet <DocumentoSimples>();

            foreach (var de in deList.OfType <DocumentoSimples>())
            {
                des.Add(de);

                if (de.Tipologia != null)
                {
                    raes.Add(de.Tipologia);
                }
                if (de.Onomastico != null)
                {
                    raes.Add(de.Onomastico);
                }
                if (de.Toponimia != null)
                {
                    raes.Add(de.Toponimia);
                }
                if (de.Ideografico != null)
                {
                    raes.Add(de.Ideografico);
                }
                if (de.TecnicoDeObra != null)
                {
                    raes.Add(de.TecnicoDeObra);
                }
            }

            foreach (var de in deList.OfType <DocumentoAnexo>())
            {
                deas.Add(de);
            }

            foreach (var de in deList.OfType <DocumentoComposto>())
            {
                decs.Add(de);
                if (de.Produtor != null)
                {
                    raes.Add(de.Produtor);
                }
                if (de.Tipologia != null)
                {
                    raes.Add(de.Tipologia);
                }
                de.LocalizacoesObraDesignacaoActual.ToList().ForEach(g => raes.Add(g.LocalizacaoObraDesignacaoActual));
                de.TecnicosDeObra.ToList().ForEach(o => raes.Add(o));
            }

            Dictionary <DocumentoSimples, DocumentoGisa>  docsComCorrespAnteriores;
            Dictionary <DocumentoAnexo, DocumentoGisa>    docsAnexosComCorrespAnteriores;
            Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosComCorrespAnteriores;
            Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasComCorrespAnteriores;
            Dictionary <DocumentoSimples, DocumentoGisa>  docsComNovasCorrespEncontradas;
            Dictionary <DocumentoAnexo, DocumentoGisa>    docsAnexosComNovasCorrespEncontradas;
            Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosComNovasCorrespEncontradas;
            Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasComNovasCorrespEncontradas;
            Dictionary <DocumentoSimples, DocumentoGisa>  docsSimplesNovos;
            Dictionary <DocumentoAnexo, DocumentoGisa>    docsAnexosNovos;
            Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosNovos;
            Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasNovos;

            var ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());

            try
            {
                GisaDataSetHelper.ManageDatasetConstraints(false);

                //obter dados gisa, com base nos dados externos
                docsComCorrespAnteriores =
                    Database.Database.GetDocsCorrespondenciasAnteriores(des.Distinct().ToList(), ho.Connection);
                docsAnexosComCorrespAnteriores =
                    Database.Database.GetDocsCorrespondenciasAnteriores(deas.Distinct().ToList(), ho.Connection);
                docsCompostosComCorrespAnteriores =
                    Database.Database.GetDocsCorrespondenciasAnteriores(decs.Distinct().ToList(), ho.Connection);
                rasComCorrespAnteriores =
                    Database.Database.GetRAsCorrespondenciasAnteriores(raes.Distinct().ToList(), ho.Connection);

                //recolher lista dos que nao têm match
                List <DocumentoSimples> docsSemCorrespAnteriores =
                    des.Where(doc => !docsComCorrespAnteriores.ContainsKey(doc)).ToList();
                List <DocumentoAnexo> docsAnexosSemCorrespAnteriores =
                    deas.Where(doc => !docsAnexosComCorrespAnteriores.ContainsKey(doc)).ToList();
                List <DocumentoComposto> docsCompostosSemCorrespAnteriores =
                    decs.Where(doc => !docsCompostosComCorrespAnteriores.ContainsKey(doc)).ToList();
                List <RegistoAutoridadeExterno> rasSemCorrespAnteriores =
                    raes.Where(rae => !rasComCorrespAnteriores.ContainsKey(rae)).ToList();

                //criar correspondencias com documentos já existentes
                docsComNovasCorrespEncontradas =
                    Database.Database.GetDocsCorrespondenciasNovas(docsSemCorrespAnteriores, ho.Connection);
                docsAnexosComNovasCorrespEncontradas =
                    Database.Database.GetDocsCorrespondenciasNovas(docsAnexosSemCorrespAnteriores, ho.Connection);
                docsCompostosComNovasCorrespEncontradas =
                    Database.Database.GetDocsCorrespondenciasNovas(docsCompostosSemCorrespAnteriores, ho.Connection);
                rasComNovasCorrespEncontradas =
                    Database.Database.GetRAsCorrespondenciasNovas(rasSemCorrespAnteriores, ho.Connection);

                //recolher lista dos que nao têm match
                List <DocumentoSimples> docsSemCorrespNovasEncontradas =
                    des.Where(doc => !docsComCorrespAnteriores.ContainsKey(doc) && !docsComNovasCorrespEncontradas.ContainsKey(doc)).ToList();
                List <DocumentoAnexo> docsAnexosSemCorrespNovasEncontradas =
                    deas.Where(doc => !docsAnexosComCorrespAnteriores.ContainsKey(doc) && !docsAnexosComNovasCorrespEncontradas.ContainsKey(doc)).ToList();
                List <DocumentoComposto> docsCompostosSemCorrespNovasEncontradas =
                    decs.Where(doc => !docsCompostosComCorrespAnteriores.ContainsKey(doc) && !docsCompostosComNovasCorrespEncontradas.ContainsKey(doc)).ToList();
                List <RegistoAutoridadeExterno> rasSemCorrespNovasEncontradas =
                    raes.Where(ra => !rasComCorrespAnteriores.ContainsKey(ra) && !rasComNovasCorrespEncontradas.ContainsKey(ra)).ToList();

                //criar documentos novos para os que não tinham match
                var docsNovos = InternalEntitiesFactory.CreateInternalEntities(docsSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList());
                docsSimplesNovos   = docsNovos.ToDictionary(doc => (DocumentoSimples)doc.Key, doc => (DocumentoGisa)doc.Value);
                docsNovos          = InternalEntitiesFactory.CreateInternalEntities(docsAnexosSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList());
                docsAnexosNovos    = docsNovos.ToDictionary(doc => (DocumentoAnexo)doc.Key, doc => (DocumentoGisa)doc.Value);
                docsNovos          = InternalEntitiesFactory.CreateInternalEntities(docsCompostosSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList());
                docsCompostosNovos = docsNovos.ToDictionary(doc => (DocumentoComposto)doc.Key, doc => (DocumentoGisa)doc.Value);
                rasNovos           = InternalEntitiesFactory.CreateInternalEntities(rasSemCorrespNovasEncontradas);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                throw;
            }
            finally
            {
                GisaDataSetHelper.ManageDatasetConstraints(true);
                ho.Dispose();
            }

            var dis = new List <DocumentoGisa>();

            dis.AddRange(docsComCorrespAnteriores.Values.ToArray());
            dis.AddRange(docsComNovasCorrespEncontradas.Values.ToArray());
            dis.AddRange(docsSimplesNovos.Values.ToArray());

            var rais = new List <RegistoAutoridadeInterno>();

            rais.AddRange(rasComCorrespAnteriores.Values.ToArray());
            rais.AddRange(rasComNovasCorrespEncontradas.Values.ToArray());
            rais.AddRange(rasNovos.Values.ToArray());

            // Dependências existentes entre objectos correspondencia:
            //  - o objecto correspondencia referente à tipologia do processo é a mesma no objectos correspondencia desse processo referenciados nos documentos simples
            //  - em cada documento simples, o objecto correspondencia referente ao produtor é o mesmo referenciado no seu processo
            //  - cada documento simples ou composto tem na sua propriedade 'Processo' a referência para o 'CorrespondenciaDocs' do seu processo
            var correspondenciasDocs = new List <CorrespondenciaDocs>();
            var tipologias           = new Dictionary <DocumentoComposto, CorrespondenciaRAs>();
            var processos            = new Dictionary <DocumentoComposto, CorrespondenciaDocs>();

            foreach (var de in decs)
            {
                CorrespondenciaDocs correspondenciaDocComposto =
                    (CorrespondenciaDocs)AssembleCorrespondencia(de, docsCompostosComCorrespAnteriores, docsCompostosComNovasCorrespEncontradas, docsCompostosNovos, CreateCorrespondenciaDocsCompostos);
                correspondenciasDocs.Add(correspondenciaDocComposto);
                processos.Add(de, correspondenciaDocComposto);

                foreach (var rae in de.RegistosAutoridade)
                {
                    CorrespondenciaRAs correspondenciaRAs =
                        (CorrespondenciaRAs)AssembleCorrespondencia(rae, rasComCorrespAnteriores, rasComNovasCorrespEncontradas, rasNovos, CreateCorrespondenciaRAs);
                    correspondenciaDocComposto.AddCorrespondenciaRA(correspondenciaRAs);

                    DefineStatesCorrespondenciaRAs(correspondenciaDocComposto, correspondenciaRAs);
                }

                var correspTipologia = correspondenciaDocComposto.CorrespondenciasRAs.SingleOrDefault(c => ((RegistoAutoridadeInterno)c.EntidadeInterna).TipoNoticiaAut == TipoNoticiaAut.TipologiaInformacional);
                if (correspTipologia != null)
                {
                    tipologias.Add(de, correspTipologia);
                }

                // definir entidades internas para a tipologia que já esteja associada ao documento (se existir alguma associada)
                if (correspondenciaDocComposto.EntidadeInterna.Id > 0 && docsCompostosComNovasCorrespEncontradas.ContainsKey((DocumentoComposto)correspondenciaDocComposto.EntidadeExterna))
                {
                    Database.Database.AddTipologiaOriginal(correspondenciaDocComposto);
                }
            }

            //documentos simples
            foreach (var de in des)
            {
                CorrespondenciaDocs correspondenciaDocs =
                    (CorrespondenciaDocs)AssembleCorrespondencia(de, docsComCorrespAnteriores, docsComNovasCorrespEncontradas, docsSimplesNovos, CreateCorrespondenciaDocs);
                correspondenciasDocs.Add(correspondenciaDocs);

                ((DocumentoGisa)correspondenciaDocs.EntidadeInterna).Processo = processos[de.Processo];

                foreach (var rae in de.RegistosAutoridade)
                {
                    CorrespondenciaRAs correspondenciaRAs =
                        (CorrespondenciaRAs)AssembleCorrespondencia(rae, rasComCorrespAnteriores, rasComNovasCorrespEncontradas, rasNovos, CreateCorrespondenciaRAs);
                    correspondenciaDocs.AddCorrespondenciaRA(correspondenciaRAs);

                    DefineStatesCorrespondenciaRAs(correspondenciaDocs, correspondenciaRAs);
                }

                if (correspondenciaDocs.TipoSugestao != TipoSugestao.Historico)
                {
                    // definir entidades internas para a tipologia que já esteja associada ao documento (se existir alguma associada)
                    if (correspondenciaDocs.EntidadeInterna.Id > 0 && docsComNovasCorrespEncontradas.ContainsKey((DocumentoSimples)correspondenciaDocs.EntidadeExterna))
                    {
                        Database.Database.AddTipologiaOriginal(correspondenciaDocs);
                    }
                }
            }

            //anexos
            foreach (var de in deas)
            {
                CorrespondenciaDocs correspondenciaDocsAnexos =
                    (CorrespondenciaDocs)AssembleCorrespondencia(de, docsAnexosComCorrespAnteriores, docsAnexosComNovasCorrespEncontradas, docsAnexosNovos, CreateCorrespondenciaDocsAnexos);
                correspondenciasDocs.Add(correspondenciaDocsAnexos);

                ((DocumentoGisa)correspondenciaDocsAnexos.EntidadeInterna).Processo = processos[de.Processo];
            }

            System.Diagnostics.Debug.WriteLine(">> " + new TimeSpan(DateTime.Now.Ticks - ticks).ToString());

            return(correspondenciasDocs);
        }
Example #2
0
 public EntidadeInterna AddInternalEntity <X>(X InternalEntity) where X : EntidadeInterna
 {
     return(InternalEntitiesFactory.AddEntidade(lstEntidadesInternas, InternalEntity));
 }