public RipartizioneSpeseDTO GetRipartizioneByModello(int idEsercizio, int idTestataMovimentoContabile, int idModello, int idCausale, decimal importo, TipoMovimentoEnum tipo)
        {

            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
            var ripartizioneSpeseService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IRipartizioneSpeseService>();

            var testataRep = new TestataMovimentoContabileRepository(_info, _windsorRepository, null);
            var ripartizione = new RipartizioneSpeseDTO();
            try
            {
                var testata = daoFactory.GetTestataMovimentoContabileDao().Find(idTestataMovimentoContabile, false);
                if (testata != null)
                    ripartizioneSpeseService.ApplyModello(testata, idModello, importo, tipo, false);
                else
                    testata = ripartizioneSpeseService.ApplyModello(idEsercizio, idModello, idCausale, importo, tipo, false);

                if(testata != null)
                    ripartizione.Testata = testataRep.GetByDomainEntity(testata);
                else
                    _log.WarnFormat("Testata a NULL - {0} - esercizio:{1} - modello:{2} - testataMovimentoContabile:{3}", Library.Utility.GetMethodDescription(), idEsercizio, idModello, idTestataMovimentoContabile);

                return ripartizione;

                // --------------------------------------
                // Lotti
                // --------------------------------------
                var esercizio = daoFactory.GetEsercizioDao().GetById(idEsercizio, false);
                var lotti = new Dictionary<string, BusinessInstanceSelectedDTO[]>(testata.Movimenti.Count);
                foreach (var movimento in testata.Movimenti)
                {
                    var key = ripartizioneSpeseService.GetKey(movimento);
                    var tbLotti = ripartizioneSpeseService.GetLottiDataSource(key, movimento.ContoRiferimento.ID, esercizio.CondominioRiferimento.ID, null);
                    lotti.Add(key, getListaDto(tbLotti)); 
                }
                ripartizione.Lotti = lotti;

                // --------------------------------------
                // Stabili
                // --------------------------------------
                var stabili = new Dictionary<string, BusinessInstanceSelectedDTO[]>(testata.Movimenti.Count);
                foreach (var movimento in testata.Movimenti)
                {
                    string key = ripartizioneSpeseService.GetKey(movimento);
                    var tbStabili = ripartizioneSpeseService.GetStabiliDataSource(key, movimento.ContoRiferimento.ID, esercizio.CondominioRiferimento.ID, null);
                    stabili.Add(key, getListaDto(tbStabili));
                }
                ripartizione.Stabili = stabili;

                // --------------------------------------
                // Gruppi
                // --------------------------------------
                var gruppi = new Dictionary<string, BusinessInstanceSelectedDTO[]>(testata.Movimenti.Count);
                foreach (var movimento in testata.Movimenti)
                {
                    var key = ripartizioneSpeseService.GetKey(movimento);
                    var tbGruppi = ripartizioneSpeseService.GetGruppiDataSource(key, movimento.ContoRiferimento.ID, esercizio.CondominioRiferimento.ID, null);
                    gruppi.Add(key, getListaDto(tbGruppi));
                }
                ripartizione.Gruppi = gruppi;
                
                // --------------------------------------
                // Unità Immobiliari
                // --------------------------------------
                var unita = new Dictionary<string, UnitaImmobiliareSelectedDTO[]>(testata.Movimenti.Count);
                foreach (var movimento in testata.Movimenti)
                {
                    var key = ripartizioneSpeseService.GetKey(movimento);
                    var tbUnita = ripartizioneSpeseService.GetUnitaDataSource(key, movimento.ContoRiferimento.ID, esercizio.CondominioRiferimento.ID, testata.EsercizioRiferimento);

                    unita.Add(key, getListaUnitaDto(tbUnita, movimento.ContoRiferimento));
                }
                ripartizione.UnitaImmobiliari = unita;

                return ripartizione;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nel caricamento delle ripartizioni spese - {0} - esercizio:{1} - modello:{2} - testataMovimentoContabile:{3}", ex, Library.Utility.GetMethodDescription(), idEsercizio, idModello, idTestataMovimentoContabile);
                throw;
            }
        }
        public RipartizioneSpeseDTO GetRipartizioneByMovimentoEsistente(MovimentoContabileDTO movimentoDto, int idEsercizio, RipartizioneSpeseDTO ripartizione, int? idContoDetrazione = null)
        {
            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
            var esercizio = daoFactory.GetEsercizioDao().GetById(idEsercizio, false);
            var ripartizioneSpeseService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IRipartizioneSpeseService>();
            var repTestata = new TestataMovimentoContabileRepository(_info, _windsorRepository, null);

            IRipartizioneSpesa movimento = null;
            if (movimentoDto.Stato == "RIPARTIZIONE")
                movimento = daoFactory.GetRipartizioneSpesaDao().Find(movimentoDto.ID, false); 
            else
                movimento = daoFactory.GetMovimentoContabileDao().Find(movimentoDto.ID, false);
            
            var movimentoContabile = movimento as MovimentoContabile;
            if(movimento != null)
            {
                try
                {
                    var key = ripartizioneSpeseService.GetKey(movimentoDto);

                    if (ripartizione == null)
                        ripartizione = new RipartizioneSpeseDTO();

                    if (movimentoContabile != null)
                    {
                        key = ripartizioneSpeseService.GetKey(movimentoContabile);
                        if (movimentoContabile.Testata != null)
                            ripartizione.Testata = repTestata.GetByDomainEntity(movimentoContabile.Testata);
                    }
                    else if (movimentoDto.Stato != "RIPARTIZIONE")
                    {
                        _log.ErrorFormat("Trovato movimento contabile senza testata associata - {0} - id:{1}", Library.Utility.GetMethodDescription(), movimento.ID);
                    }

                    // -----------------------------------------------
                    // Recupero eventuali filtri di selezione
                    // -----------------------------------------------
                    // Gruppi
                    int[] gruppiSelezionati = null;
                    if (!string.IsNullOrEmpty(movimento.GruppiAddebito))
                    {
                        var gruppiAddebito = movimento.GruppiAddebito.Split('&');
                        gruppiSelezionati = new int[gruppiAddebito.Length];
                        for (var i = 0; i < gruppiAddebito.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(gruppiAddebito[i]))
                                gruppiSelezionati[i] = int.Parse(gruppiAddebito[i]);
                        }
                    }

                    // Lotti
                    int[] lottiSelezionati = null;
                    if (!string.IsNullOrEmpty(movimento.LottiAddebito))
                    {
                        string[] lottiAddebito = movimento.LottiAddebito.Split('&');
                        lottiSelezionati = new int[lottiAddebito.Length];
                        for (var i = 0; i < lottiAddebito.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(lottiAddebito[i]))
                                lottiSelezionati[i] = int.Parse(lottiAddebito[i]);
                        }
                    }

                    // Stabili
                    int[] stabiliSelezionati = null;
                    if (!string.IsNullOrEmpty(movimento.StabiliAddebito))
                    {
                        var stabiliAddebito = movimento.StabiliAddebito.Split('&');
                        stabiliSelezionati = new int[stabiliAddebito.Length];
                        for (var i = 0; i < stabiliAddebito.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(stabiliAddebito[i]))
                                stabiliSelezionati[i] = int.Parse(stabiliAddebito[i]);
                        }
                    }

                    if (movimentoContabile == null || movimentoContabile.Testata != null)
                    {
                        var conto = daoFactory.GetContoDao().Find(movimentoDto.IdConto.GetValueOrDefault(), false);
                        if (conto != null)
                        {
                            Conto contoDetrazione = null;
                            if (idContoDetrazione != null)
                            {
                                contoDetrazione = daoFactory.GetContoDao().Find(idContoDetrazione.GetValueOrDefault(), false);
                                conto = contoDetrazione;
                            }

                            ripartizione.UnitaImmobiliari[key] = getListaUnitaDto(ripartizioneSpeseService.GetUnitaDataSourceByMovimento(key, movimento, contoDetrazione), conto);
                            ripartizione.Lotti[key] = getListaDto(ripartizioneSpeseService.GetLottiDataSource(key, movimentoDto.IdConto, esercizio.CondominioRiferimento.ID, lottiSelezionati));
                            ripartizione.Stabili[key] = getListaDto(ripartizioneSpeseService.GetStabiliDataSource(key, movimentoDto.IdConto, esercizio.CondominioRiferimento.ID, stabiliSelezionati));
                            ripartizione.Gruppi[key] = getListaDto(ripartizioneSpeseService.GetGruppiDataSource(key, movimentoDto.IdConto, esercizio.CondominioRiferimento.ID, gruppiSelezionati));
                        }
                    }

                    return ripartizione;
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nel caricamento delle ripartizioni spese - {0}", ex, Library.Utility.GetMethodDescription());
                    throw;
                }                
            }

            return ripartizione;
        }