Exemple #1
0
        public virtual string GetDescrizione(Esercizio esercizio, Condominio condominio, IRipartizioneSpesa movimento)
        {
            var descrizione = Descrizione;

            if (!string.IsNullOrEmpty(descrizione) && descrizione.Contains("$"))
            {
                try
                {
                    // ==========================================
                    //  Applico il template
                    // ==========================================

                    // ------------------------------------------
                    //  Creo le stringhe
                    // ------------------------------------------
                    DateTime? dataAperturaEsercizio = null;
                    DateTime? dataChiusuraEsercizio = null;
                    var fornitore = string.Empty;

                    if (esercizio == null && condominio != null)
                        esercizio = condominio.GetCurrentEsercizioOrdinario();
                    if (esercizio != null)
                    {
                        dataAperturaEsercizio = esercizio.DataApertura.GetValueOrDefault();
                        dataChiusuraEsercizio = esercizio.DataChiusura.GetValueOrDefault();
                    }

                    if (movimento != null && movimento.FornitoreRiferimento != null)
                        fornitore = movimento.FornitoreRiferimento.DisplayName;

                    // ------------------------------------------
                    //  NVelocity
                    // ------------------------------------------
                    var memoryEngine = NVelocityEngineFactory.CreateNVelocityMemoryEngine(true);

                    System.Collections.IDictionary context = new System.Collections.Hashtable();

                    context.Add("fornitore", fornitore);

                    if (dataAperturaEsercizio != null)
                    {
                        context.Add("dataaperturaesercizio", dataAperturaEsercizio.GetValueOrDefault().ToShortDateString());
                        context.Add("meseiniziocompetenza", Utility.GetMonthName(dataAperturaEsercizio.Value.Month, false));
                        context.Add("annoiniziocompetenza", dataAperturaEsercizio.GetValueOrDefault().Year);
                    }
                    if (dataChiusuraEsercizio != null)
                    {
                        context.Add("datachiusuraesercizio", dataChiusuraEsercizio.GetValueOrDefault().ToShortDateString());
                        context.Add("mesefinecompetenza", Utility.GetMonthName(dataChiusuraEsercizio.Value.Month, false));
                        context.Add("annofinecompetenza", dataChiusuraEsercizio.GetValueOrDefault().Year);
                    }

                    descrizione = memoryEngine.Process(context, descrizione);

                    if (!string.IsNullOrEmpty(descrizione))
                        descrizione = descrizione.Trim();
                }
                catch (Exception ex)
                {
                    _log.Error("Errore nella applicazione del template per la testata di movimento - " + Utility.GetMethodDescription() + " - id:" + ID, ex);
                }
            }

            return descrizione;
        }
Exemple #2
0
 private string getBilancioMovimentoKey(IRipartizioneSpesa movimento)
 {
     return movimento.ID + "_" + Guid.NewGuid();
 }
        private IEnumerable<SpeseUnitaRipartoDTO> getRiparto(IRipartizioneSpesa movimento, List<IGrouping<int, Millesimo>> millesimiGroupByConto, int? anno, int? detrazione, Esercizio esercizio, bool dettaglioSottoConto)
        {
            try
            {
                var importoProprieta = _ripartizioneService.GetImportoCompetenza(movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault(), movimento, TipoSoggetto.Proprietario, anno, detrazione);
                var importoConduzione = _ripartizioneService.GetImportoCompetenza(movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault(), movimento, TipoSoggetto.Conduttore, anno, detrazione);

                var millesimiConto = millesimiGroupByConto.Where(item => item.Key == movimento.ContoRiferimento.ID).ToList();
                var millesimiAttivi = new List<Millesimo>(millesimiConto.Count);
                foreach (var millesimoConto in millesimiConto)
                {
                    try
                    {
                        var millesimiGroupByUnita = millesimoConto.GroupBy(item => item.UnitaRiferimento.ID).ToList();
                        foreach (var spesa in movimento.DettaglioRipartizione)
                        {
                            try
                            {
                                IGrouping<int, Millesimo> millesimi = null;
                                if (spesa.UnitaRiferimento != null)
                                    millesimi = millesimiGroupByUnita.FirstOrDefault(item => item.Key == spesa.UnitaRiferimento.ID);
                                else if (spesa.SoggettoCondominio != null)
                                    millesimi = millesimiGroupByUnita.FirstOrDefault(item => item.Key == spesa.SoggettoCondominio.UnitaImmobiliare.ID);

                                if (millesimi != null)
                                    millesimiAttivi.AddRange(millesimi.ToList());
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore nel calcolo del riparto - SINGOLA SPESA - {0} - movimento:{1} - anno:{2} - esercizio:{3} - spesa:{4}", ex, Utility.GetMethodDescription(), movimento?.ID.ToString() ?? "<NULL>", anno.GetValueOrDefault(), esercizio?.ID.ToString() ?? "<NULL>", spesa?.ID.ToString() ?? "<NULL>");
                                throw;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nel calcolo del riparto - SINGOLO CONTO - {0} - movimento:{1} - anno:{2} - esercizio:{3} - conto:{4}", ex, Utility.GetMethodDescription(), movimento?.ID.ToString() ?? "<NULL>", anno.GetValueOrDefault(), esercizio?.ID.ToString() ?? "<NULL>", millesimoConto.Key);
                        throw;
                    }
                }

                IList<SpeseUnitaRipartoDTO> lista = new List<SpeseUnitaRipartoDTO>();
                if (millesimiAttivi.Count > 0)
                {
                    var totaleMillesimi = millesimiAttivi.Sum(item => item.Valore);
                    if (totaleMillesimi > 0)
                    {
                        foreach (var millesimo in millesimiAttivi)
                        {
                            // Se è definita devo usare la ripartizione specifica per conto
                            // ---------------------------------------------------------------------------------
                            var importoProprietario = (importoProprieta * millesimo.Valore) / totaleMillesimi;
                            var importoConduttore = (importoConduzione * millesimo.Valore) / totaleMillesimi;
                            var importi = getImportoProprietaConduzioneByUnita(movimento.ContoRiferimento, importoProprietario, importoConduttore, millesimo.UnitaRiferimento.ID);

                            var riparto = new SpeseUnitaRipartoDTO
                            {
                                IdConto = movimento.ContoRiferimento.ID,
                                IdUnita = millesimo.UnitaRiferimento.ID,
                                ValoreMillesimo = millesimo.Valore,
                                UnitaMisuraMillesimo = "PC",
                                ImportoProprietario = importi[0],
                                ImportoConduttore = importi[1]
                            };

                            if (dettaglioSottoConto)
                            {
                                if (movimento.SottoContoRiferimento != null)
                                    riparto.IdSottoConto = movimento.SottoContoRiferimento.ID;
                                else
                                    riparto.IdSottoConto = movimento.ID*-1;
                            }

                            lista.Add(riparto);
                        }
                    }
                    else
                    {
                        _log.WarnFormat("Totale millesimi a 0 - {0} - movimento:{1} - esercizio:{2} - anno:{3} - azienda:{4}", Utility.GetMethodDescription(), movimento.ID.ToString(), esercizio?.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>", anno, esercizio?.CondominioRiferimento.Azienda.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>");
                    }
                }
                else
                {
                    var millesimiAttiviDto = _millesimiService.GetByConto(movimento.ContoRiferimento, null, null, esercizio);
                    var totaleMillesimi = millesimiAttiviDto.Sum(item => item.Valore.GetValueOrDefault());
                    if (totaleMillesimi > 0)
                    {
                        foreach (var millesimo in millesimiAttiviDto)
                        {
                            // Se è definita devo usare la ripartizione specifica per conto
                            // ---------------------------------------------------------------------------------
                            var importoProprietario = (importoProprieta * millesimo.Valore) / totaleMillesimi;
                            var importoConduttore = (importoConduzione * millesimo.Valore) / totaleMillesimi;
                            var importi = getImportoProprietaConduzioneByUnita(movimento.ContoRiferimento, importoProprietario, importoConduttore, millesimo.IdUnitaRiferimento);

                            var riparto = new SpeseUnitaRipartoDTO
                            {
                                IdConto = movimento.ContoRiferimento.ID,
                                IdUnita = millesimo.IdUnitaRiferimento,
                                ValoreMillesimo = millesimo.Valore,
                                UnitaMisuraMillesimo = "PC",
                                ImportoProprietario = importi[0],
                                ImportoConduttore = importi[1]
                            };

                            if (dettaglioSottoConto)
                            {
                                if (movimento.SottoContoRiferimento != null)
                                    riparto.IdSottoConto = movimento.SottoContoRiferimento.ID;
                                else
                                    riparto.IdSottoConto = movimento.ID * -1;
                            }

                            lista.Add(riparto);
                        }
                    }
                    else
                    {
                        _log.WarnFormat("Totale millesimi a 0 - {0} - movimento:{1} - esercizio:{2} - anno:{3} - azienda:{4}", Utility.GetMethodDescription(), movimento.ID.ToString(), esercizio?.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>", anno, esercizio?.CondominioRiferimento.Azienda.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>");
                    }
                }

                return lista;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nel calcolo del riparto - {0} - movimento:{1} - anno:{2} - esercizio:{3}", ex, Utility.GetMethodDescription(), movimento?.ID.ToString() ?? "<NULL>", anno.GetValueOrDefault(), esercizio?.ID.ToString() ?? "<NULL>");
                throw;
            }
        }
Exemple #4
0
        protected bool isAddebitatoScala(IRipartizioneSpesa movimento, int idScala)
        {
            if (!string.IsNullOrEmpty(movimento.GruppiAddebito))
            {
                var scale = movimento.GruppiAddebito.Split('&');
                if (scale.Contains(idScala.ToString()))
                    return true;
            }

            return false;
        }
Exemple #5
0
        private decimal getImporto(IRipartizioneSpesa movimento, int? idStabile, int? idScala, Dictionary<string, IList<MillesimoDTO>> millesimiConto, Esercizio esercizio, int? detrazione)
        {
            if (movimento.DettaglioRipartizione.Count == 0 || !string.IsNullOrEmpty(movimento.GruppiAddebito) || !string.IsNullOrEmpty(movimento.StabiliAddebito))
            {
                var key = movimento.ContoRiferimento.ID.ToString(CultureInfo.InvariantCulture);
                List<int> stabili = null;
                List<int> scale = null;
                if (!string.IsNullOrEmpty(movimento.StabiliAddebito))
                {
                    stabili = new List<int>();
                    key += "|" + movimento.StabiliAddebito;
                    stabili.AddRange(movimento.StabiliAddebito.Split('&').Select(int.Parse));
                }
                if (!string.IsNullOrEmpty(movimento.GruppiAddebito))
                {
                    scale = new List<int>();
                    key += "|" + movimento.GruppiAddebito;
                    scale.AddRange(movimento.GruppiAddebito.Split('&').Select(int.Parse));
                }

                IList<MillesimoDTO> millesimiTotali = null;
                if (millesimiConto.ContainsKey(key))
                    millesimiTotali = millesimiConto[key];
                if (millesimiTotali == null)
                    millesimiTotali = _millesimiService.GetByConto(movimento.ContoRiferimento, stabili, scale, esercizio);

                // ---------------------------------------------------------------------------------------------------------------------------------------------
                // se la scala o lo stabile a cui è stato addebitato il movimento non comprende lo stabile o la scala di riferimento devo scartare il movimento
                if ((idStabile != null || idScala != null) && (stabili != null || scale != null))
                {
                    if (idStabile != null && stabili != null && !stabili.Contains(idStabile.Value))
                        return 0;
                    else if (idStabile != null && scale != null)
                    {
                        var stabiliCheck = new List<int>();
                        foreach (var i in scale)
                        {
                            var scala = _daoFactory.GetGruppoStabileDao().Find(i, false);
                            if (scala != null)
                                stabiliCheck.Add(scala.PalazzinaRiferimento.ID);
                        }

                        if (!stabiliCheck.Contains(idStabile.Value))
                            return 0;
                    }
                    else if (idScala != null && stabili != null)
                    {
                        var scaleToCheck = new List<int>();
                        foreach (var i in stabili)
                        {
                            var stabile = _daoFactory.GetPalazzinaDao().Find(i, false);
                            if (stabile != null)
                                scaleToCheck.AddRange(stabile.GruppiStabile.Select(gruppoStabile => gruppoStabile.ID));

                            if (!scaleToCheck.Contains(idScala.Value))
                                return 0;
                        }
                    }
                    else if (idScala != null && !scale.Contains(idScala.Value))
                        return 0;
                }
                // ---------------------------------------------------------------------------------------------------------------------------------------------

                IList<MillesimoDTO> millesimiMovimento = null;
                if (idStabile != null)
                {
                    key = $"{movimento.ContoRiferimento.ID}|{idStabile}";
                    if (millesimiConto.ContainsKey(key))
                        millesimiMovimento = millesimiConto[key];
                    if (millesimiMovimento == null)
                    {
                        // bugid#7195
                        // Se il movimento haun addebito diretto su alcune scale, per calcolare i millesimi di riferimento per lo stabile selezionato devo utilizzare
                        // SOLO le scale con addebito del movimento presenti nello stabile selezionato.
                        // Usando l'intero stabile i calcoli non sono corretti perchè sono considerate anche scale a cui NON è stato addebitato il movimento
                        if(!string.IsNullOrEmpty(movimento.StabiliAddebito) || scale == null)
                            millesimiMovimento = _millesimiService.GetByConto(movimento.ContoRiferimento, new List<int> { idStabile.Value }, null, esercizio);
                        else
                        {
                            var scaleMovimento = new List<int>();
                            foreach (var i in scale)
                            {
                                var scala = _daoFactory.GetGruppoStabileDao().Find(i, false);
                                if(scala != null && scala.PalazzinaRiferimento.ID == idStabile.Value)
                                    scaleMovimento.Add(i);
                                millesimiMovimento = _millesimiService.GetByConto(movimento.ContoRiferimento, null, scaleMovimento, esercizio);
                            }
                        }
                    }
                }

                if (idScala != null)
                {
                    key = $"{movimento.ContoRiferimento.ID}|{idScala}";
                    if (millesimiConto.ContainsKey(key))
                        millesimiMovimento = millesimiConto[key];
                    if (millesimiMovimento == null)
                        millesimiMovimento = _millesimiService.GetByConto(movimento.ContoRiferimento, null, new List<int> { idScala.Value }, esercizio);
                }

                if (millesimiMovimento != null)
                {
                    var denominatore = millesimiTotali.Sum(item => item.Valore.GetValueOrDefault());
                    var numeratore = millesimiMovimento.Sum(item => item.Valore.GetValueOrDefault());
                    if (denominatore != 0)
                        return (movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault() * numeratore) / denominatore;
                    else if (millesimiMovimento.Sum(item => item.Valore.GetValueOrDefault()) == 0)
                        return movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault();
                    else
                    {
                        throw new InvalidDataException($"La somma totale dei millesimi è 0 mentre la somma dei millesimi conti è <> 0 - {Utility.GetMethodDescription()} - esercizio:{esercizio?.ID.ToString() ?? "<NULL>"}");
                    }
                }                
            }
            else if (movimento.DettaglioRipartizione.Count > 0 && (idStabile != null || idScala != null))
            {
                var importo = 0m;
                foreach (var spesaUnita in movimento.DettaglioRipartizione)
                {
                    UnitaImmobiliare unita = null;
                    if (spesaUnita.UnitaRiferimento != null)
                        unita = spesaUnita.UnitaRiferimento;
                    else if (spesaUnita.SoggettoCondominio != null)
                        unita = spesaUnita.SoggettoCondominio.UnitaImmobiliare;

                    if(unita != null)
                    {
                        if (idStabile != null && unita.GruppoStabileRiferimento.PalazzinaRiferimento.ID == idStabile.Value)
                            importo += spesaUnita.GetImporto();
                        else if (idScala != null && unita.GruppoStabileRiferimento.ID == idScala.Value)
                            importo += spesaUnita.GetImporto();
                    }
                }

                return importo;
            }

            return movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault();
        }
Exemple #6
0
        protected bool isAddebitatoStabile(IRipartizioneSpesa movimento, int idStabile)
        {
            if(!string.IsNullOrEmpty(movimento.StabiliAddebito))
            {
                var stabili = movimento.StabiliAddebito.Split('&');
                if (stabili.Contains(idStabile.ToString()))
                    return true;
            }

            return false;
        }
        public DataTable GetUnitaDataSourceByMovimento(string key, IRipartizioneSpesa movimento, Conto contoDetrazione)
        {
            try
            {
                DataTable table;

                DateTime dataRiferimento = DateTime.Today;
                var movimentoContabile = movimento as MovimentoContabile;
                if (movimentoContabile != null)
                    dataRiferimento = movimentoContabile.Testata.DataRegistrazione.GetValueOrDefault();

                if (key != null && _unitaSelezionate.ContainsKey(key))
                    table = _unitaSelezionate[key];
                else
                {
                    table = GetEmptyUnitaDataSource();

                    var conto = movimento.ContoRiferimento;
                    if (contoDetrazione != null)
                        conto = contoDetrazione;

                    if (conto.Ripartizione)
                    {
                        if (!conto.IsSpesePersonali)
                        {
                            var listaUnita = _daoFactory.GetUnitaImmobiliareDao().GetByCondominio(conto.CondominioRiferimento.ID);
                            foreach (var unita in listaUnita)
                            {
                                var row = table.NewRow();
                                row["IdUnitaImmobiliare"] = unita.ID;
                                row["Nominativo"] = unita.Descrizione;
                                if(unita.Ordine != null)
                                    row["Ordine"] = unita.Ordine;
                                row["Interno"] = unita.InternoCompleto;
                                row["TipoUnita"] = unita.TipoUnitaImmobiliare.Descrizione;
                                row["ParentId"] = unita.GruppoStabileRiferimento.ID;
                                row["ParentName"] = unita.GruppoStabileRiferimento.Descrizione;
                                row["Selezionato"] = !movimento.IsRipartoPersonalizzato && !conto.IsSpesePersonali && contoDetrazione == null;

                                var spesa = (from s in movimento.DettaglioRipartizione
                                             where s.UnitaRiferimento != null && s.UnitaRiferimento.ID == unita.ID
                                             select s).SingleOrDefault();

                                if (spesa != null)
                                {
                                    if (conto.IsSpesePersonali && spesa.Importo != null)
                                        row["Importo"] = spesa.Importo;
                                    if (spesa.Importo != null || movimento.IsRipartoPersonalizzato || contoDetrazione != null)
                                        row["Selezionato"] = true;
                                }

                                table.Rows.Add(row);
                            }
                        }
                        else
                        {
                            // Se conto è di spese personali il dettaglio della ripartizione deve sempre essere per soggetto mai per unità immobiliare
                            // La correzzione è necessaria per ragioni di compatibilità dopo il bugid#2926
                            foreach (var speseUnita in movimento.DettaglioRipartizione)
                            {
                                if (speseUnita.SoggettoCondominio == null && speseUnita.UnitaRiferimento != null)
                                {
                                    if (conto.PercentualeProprieta > 0)
                                        speseUnita.SoggettoCondominio = speseUnita.UnitaRiferimento.GetProprietarioPrincipale(dataRiferimento);
                                    else
                                    {
                                        var conduttore = speseUnita.UnitaRiferimento.GetConduttorePrincipale(dataRiferimento) ??
                                                         speseUnita.UnitaRiferimento.GetProprietarioPrincipale(dataRiferimento);
                                        speseUnita.SoggettoCondominio = conduttore;
                                    }

                                    speseUnita.UnitaRiferimento = null;
                                }
                            }

                            var soggetti = _daoFactory.GetSoggettoCondominioDao().GetAttiviByCondominioData(movimento.GetEsercizio().CondominioRiferimento.ID, null, null, movimento.GetEsercizio().DataApertura.GetValueOrDefault());
                            foreach (var soggetto in soggetti)
                            {
                                try
                                {
                                    var row = table.NewRow();
                                    row["IdSoggettoCondominio"] = soggetto.ID;
                                    row["Nominativo"] = soggetto.DisplayName;
                                    row["Interno"] = soggetto.UnitaImmobiliare.InternoCompleto;
                                    if (soggetto.UnitaImmobiliare.Ordine != null)
                                        row["Ordine"] = soggetto.UnitaImmobiliare.Ordine;
                                    row["TipoUnita"] = soggetto.UnitaImmobiliare.TipoUnitaImmobiliare.Descrizione;
                                    row["TipoCondomino"] = soggetto.Tipo.ToString();
                                    row["DirittiReali"] = soggetto.DirittoReale.GetValueOrDefault().Description();
                                    if(soggetto.PercentualeRiferimento != null)
                                       row["PercentualeSpese"] = soggetto.PercentualeRiferimento.GetValueOrDefault();
                                    row["Selezionato"] = false;
                                    row["ParentId"] = soggetto.UnitaImmobiliare.GruppoStabileRiferimento.ID;
                                    row["ParentName"] = soggetto.UnitaImmobiliare.GruppoStabileRiferimento.Descrizione;

                                    var spesa = (from s in movimento.DettaglioRipartizione
                                                 where s.SoggettoCondominio != null && s.SoggettoCondominio.ID == soggetto.ID
                                                 select s).SingleOrDefault();

                                    if (spesa != null)
                                    {
                                        if (conto.IsSpesePersonali && spesa.Importo != null)
                                            row["Importo"] = spesa.Importo;
                                        if (spesa.Importo != null || movimento.IsRipartoPersonalizzato || contoDetrazione != null)
                                            row["Selezionato"] = true;
                                    }

                                    table.Rows.Add(row);
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore nel calcolo del datasource delle ripartizioni spese (SINGOLO SOGGETTO) - {0} - soggetto:{1} - key:{2} - idMovimento:{3} ", ex, Utility.GetMethodDescription(), soggetto.ID,  key,  movimento.ID);
                                    throw;
                                }
                            }
                        }

                        table.AcceptChanges();
                    }
                }

                return table;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la creazione del datasource per la ripartizione - {0} - key:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), key, + movimento.ID);
                throw;
            }
        }
        public decimal GetImportoCompetenza(decimal importo, IRipartizioneSpesa movimento, TipoSoggetto tipoSoggetto, int? anno, int? detrazione)
        {
            decimal importoCompetenza;

            var contoRiferimento = movimento.ContoRiferimento;
            var sottoContoRiferimento = movimento.SottoContoRiferimento;

            if (anno != null)
                importo = importo*movimento.GetPercentualePagata(anno, detrazione);

            var percentualeProprieta = contoRiferimento.PercentualeProprieta;
            if (sottoContoRiferimento?.PercentualeProprieta != null)
                percentualeProprieta = sottoContoRiferimento.PercentualeProprieta.Value;
            if (movimento.PercentualeProprieta != null)
                percentualeProprieta = movimento.PercentualeProprieta.Value;
            var importoCompetenzaProprietario = importo * percentualeProprieta;

            if (tipoSoggetto == TipoSoggetto.Proprietario)
                importoCompetenza = importoCompetenzaProprietario;
            else
                importoCompetenza = importo - importoCompetenzaProprietario;

            return importoCompetenza;
        }
 public decimal GetImportoCompetenza(decimal importo, IRipartizioneSpesa movimento, TipoSoggetto tipoSoggetto)
 {
     return GetImportoCompetenza(importo, movimento, tipoSoggetto, null, null);
 }
        public decimal GetImportoCompetenza(decimal? importo, GruppoStabile gruppo, IRipartizioneSpesa movimento, List<int> stabili, List<int> gruppi, TipoSoggetto tipoSoggetto, int? anno, int? detrazione)
        {
            if (importo == null)
                importo = movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault();

            if (gruppo == null)
                return GetImportoCompetenza(importo.GetValueOrDefault() * movimento.GetPercentualePagata(anno, detrazione), movimento, tipoSoggetto);

            var contoRiferimento = movimento.ContoRiferimento;

            if (gruppi == null && !string.IsNullOrEmpty(movimento.GruppiAddebito))
                gruppi = movimento.GruppiAddebito.Split('&').Select(int.Parse).ToList();

            var millesimiTotali = _millesimiService.GetByConto(contoRiferimento, null, gruppi, movimento.GetEsercizio());
            if (millesimiTotali.Count > 0)
            {
                var millesimi = _millesimiService.GetByConto(contoRiferimento, null, new List<int> { gruppo.ID }, movimento.GetEsercizio());
                var denominatore = millesimiTotali.Sum(item => item.Valore.GetValueOrDefault());
                if(denominatore != 0)
                    importo = importo.GetValueOrDefault() * millesimi.Sum(item => item.Valore.GetValueOrDefault()) / denominatore;
            }
            else
                importo = movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault();
            
            return GetImportoCompetenza(importo.GetValueOrDefault(), movimento, tipoSoggetto, anno, detrazione);
        }