<commit_before>﻿using MongoDB.Driver;
using Persistence.MongoDB;
using SO115App.API.Models.Classi.Organigramma;
using SO115App.Models.Classi.Condivise;
using SO115App.Models.Classi.Filtri;
using SO115App.Models.Classi.Pos;
using SO115App.Models.Servizi.CQRS.Queries.GestioneDettaglioTipologia.GetDettagliTipoligiaByIdTipologia;
using SO115App.Models.Servizi.CQRS.Queries.GestioneSoccorso.GestionePOS.RicercaElencoPOS;
using SO115App.Models.Servizi.Infrastruttura.GestioneDettaglioTipologie;
using SO115App.Models.Servizi.Infrastruttura.GestionePOS;
using SO115App.Models.Servizi.Infrastruttura.SistemiEsterni.ServizioSede;
using System.Collections.Generic;
using System.Linq;

namespace SO115App.Persistence.MongoDB.GestioneDettaglioTipologia
{
    public class GetListaDettagliTipologiaByIdTipologia : IGetListaDettagliTipologieByIdTipologia
    {
        private readonly DbContext _dbContext;
        private readonly IGetAlberaturaUnitaOperative _getAlberaturaUnitaOperative;
        private readonly IGetPOS _getPos;

        public GetListaDettagliTipologiaByIdTipologia(DbContext dbContext, IGetAlberaturaUnitaOperative getAlberaturaUnitaOperative, IGetPOS getPos)
        {
            _dbContext = dbContext;
            _getAlberaturaUnitaOperative = getAlberaturaUnitaOperative;
            _getPos = getPos;
        }

        public List<TipologiaDettaglio> Get(GetDettagliTipoligiaByIdTipologiaQuery query)
        {
            var CodTipologia = query.CodiceTipologia;

            var listaPin = GetGerarchia(query.IdSede);

            var lstCodiciPin = listaPin.Select(c => c.Codice).ToList();
            var lstEnti = new List<TipologiaDettaglio>();

            lstEnti = _dbContext.TipologiaDettaglioCollection.Find(c => lstCodiciPin.Contains(c.CodSede) && c.CodiceTipologia.Equals(CodTipologia)).ToList();

            //GESTIONE RICORSIVITA'
            var result = FiltraByRicorsività(listaPin, lstEnti);

            //MAPPING E ORDINAMENTO
            return result.Select(c => new TipologiaDettaglio()
            {
                CodiceDettaglioTipologia = c.CodiceDettaglioTipologia,
                CodiceTipologia = c.CodiceTipologia,
                CodSede = c.CodSede,
                Descrizione = c.Descrizione,
                Ricorsivo = c.Ricorsivo,
                Id = c.Id,
                Pos = GetPosByTipologia(c.CodiceTipologia, c.CodiceDettaglioTipologia, c.CodSede)
            }).OrderByDescending(c => c.Descrizione).ToList();
        }

        private List<PosDAO> GetPosByTipologia(int codiceTipologia, int codiceDettaglioTipologia, string CodSede)
        {
            var filtriPos = new FiltriPOS()
            {
                idTipologia = codiceTipologia,
                idDettaglioTipologia = codiceDettaglioTipologia
            };

            var query = new GetElencoPOSQuery()
            {
                CodiceSede = CodSede,
                Filters = filtriPos
            };

            var Pos = _getPos.GetPosByCodTipologiaCodDettaglio(query);

            if (Pos != null)
                return Pos;
            else
                return null;
        }

        private List<PinNodo> GetGerarchia(string[] CodSede)
        {
            var listaPin = new List<PinNodo>();
            var sediAlberate = _getAlberaturaUnitaOperative.ListaSediAlberata();

            foreach (var sede in CodSede)
            {
                listaPin.Add(new PinNodo(sede, true));
                foreach (var figlio in sediAlberate.Result.GetSottoAlbero(listaPin))
                {
                    PinNodo fgl = new PinNodo(figlio.Codice, true);
                    listaPin.Add(fgl);
                }
            }

            return listaPin;
        }

        private static List<TipologiaDettaglio> FiltraByRicorsività(List<PinNodo> listaPin, List<TipologiaDettaglio> lstTipologie)
        {
            if (lstTipologie.Count > 0)
                return lstTipologie.Where(c =>
                {
                    //LOGICA/CONDIZIONI RICORSIVITA'
                    var padre = listaPin.Find(x => x.Codice == c.CodSede.Substring(0, 2) + ".1000");
                    var figli = listaPin.Where(x => x.Codice.Contains(c.CodSede.Substring(0, 2)) && x != padre).ToList();

                    return (padre.Ricorsivo && c.Ricorsivo) || figli.Any(x => x.Ricorsivo);
                }).ToList();
            else
                return lstTipologie;
        }
    }
}
<commit_msg>fix - dettaglio tipologia: errore get dettagli tipologia con ruoli CON<commit_after>﻿using MongoDB.Driver;
using Persistence.MongoDB;
using SO115App.API.Models.Classi.Organigramma;
using SO115App.Models.Classi.Condivise;
using SO115App.Models.Classi.Filtri;
using SO115App.Models.Classi.Pos;
using SO115App.Models.Servizi.CQRS.Queries.GestioneDettaglioTipologia.GetDettagliTipoligiaByIdTipologia;
using SO115App.Models.Servizi.CQRS.Queries.GestioneSoccorso.GestionePOS.RicercaElencoPOS;
using SO115App.Models.Servizi.Infrastruttura.GestioneDettaglioTipologie;
using SO115App.Models.Servizi.Infrastruttura.GestionePOS;
using SO115App.Models.Servizi.Infrastruttura.SistemiEsterni.ServizioSede;
using System.Collections.Generic;
using System.Linq;

namespace SO115App.Persistence.MongoDB.GestioneDettaglioTipologia
{
    public class GetListaDettagliTipologiaByIdTipologia : IGetListaDettagliTipologieByIdTipologia
    {
        private readonly DbContext _dbContext;
        private readonly IGetAlberaturaUnitaOperative _getAlberaturaUnitaOperative;
        private readonly IGetPOS _getPos;

        public GetListaDettagliTipologiaByIdTipologia(DbContext dbContext, IGetAlberaturaUnitaOperative getAlberaturaUnitaOperative, IGetPOS getPos)
        {
            _dbContext = dbContext;
            _getAlberaturaUnitaOperative = getAlberaturaUnitaOperative;
            _getPos = getPos;
        }

        public List<TipologiaDettaglio> Get(GetDettagliTipoligiaByIdTipologiaQuery query)
        {
            var listaPin = GetGerarchia(query.IdSede);
            var lstCodiciPin = listaPin.Select(c => c.Codice).ToList();
            var lstEnti = _dbContext.TipologiaDettaglioCollection.Find(c => lstCodiciPin.Contains(c.CodSede) && c.CodiceTipologia.Equals(query.CodiceTipologia)).ToList();

            //GESTIONE RICORSIVITA'
            var result = FiltraByRicorsività(listaPin, lstEnti);

            //MAPPING E ORDINAMENTO
            return result.Select(c => new TipologiaDettaglio()
            {
                CodiceDettaglioTipologia = c.CodiceDettaglioTipologia,
                CodiceTipologia = c.CodiceTipologia,
                CodSede = c.CodSede,
                Descrizione = c.Descrizione,
                Ricorsivo = c.Ricorsivo,
                Id = c.Id,
                Pos = GetPosByTipologia(c.CodiceTipologia, c.CodiceDettaglioTipologia, c.CodSede)
            }).OrderByDescending(c => c.Descrizione).ToList();
        }

        private List<PosDAO> GetPosByTipologia(int codiceTipologia, int codiceDettaglioTipologia, string CodSede)
        {
            var filtriPos = new FiltriPOS()
            {
                idTipologia = codiceTipologia,
                idDettaglioTipologia = codiceDettaglioTipologia
            };

            var query = new GetElencoPOSQuery()
            {
                CodiceSede = CodSede,
                Filters = filtriPos
            };

            var Pos = _getPos.GetPosByCodTipologiaCodDettaglio(query);

            if (Pos != null)
                return Pos;
            else
                return null;
        }

        private List<PinNodo> GetGerarchia(string[] CodSede)
        {
            var listaPin = new List<PinNodo>();
            var sediAlberate = _getAlberaturaUnitaOperative.ListaSediAlberata();

            foreach (var sede in CodSede)
            {
                listaPin.Add(new PinNodo(sede, true));
                foreach (var figlio in sediAlberate.Result.GetSottoAlbero(listaPin))
                {
                    PinNodo fgl = new PinNodo(figlio.Codice, true);
                    listaPin.Add(fgl);
                }
            }

            return listaPin;
        }

        private static List<TipologiaDettaglio> FiltraByRicorsività(List<PinNodo> listaPin, List<TipologiaDettaglio> lstTipologie)
        {
            return lstTipologie.Where(c =>
            {
                //LOGICA/CONDIZIONI RICORSIVITA'
                if (c.CodSede == "00")
                    return c.Ricorsivo;

                var padre = listaPin.Find(x => x.Codice == c.CodSede.Substring(0, 2) + ".1000");
                var figli = listaPin.Where(x => x.Codice.Contains(c.CodSede.Substring(0, 2)) && x != padre).ToList();

                return (padre.Ricorsivo && c.Ricorsivo) || figli.Any(x => x.Ricorsivo);
            }).ToList();
        }
    }
}

{'fraction_non_alphanumeric': 0.08236225817400158, 'fraction_numerical': 0.008937662631519403, 'mean_word_length': 2.2452276064610865, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 35, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4236197', 'n_tokens_mistral': 2956, 'n_tokens_neox': 2804, 'n_words': 430}