예제 #1
0
        public RendicontoAnnualeUnita(RendicontoAnnualeConto conto, UnitaImmobiliare unita, decimal? importo)
        {
            Conto = conto;
            Unita = unita;
            Importo = importo;

            if (Conto != null)
                Conto.DettagliUnita.Add(this);
        }
예제 #2
0
        private decimal getImporto(RendicontoAnnualeConto itemRendiconto, int? idStabile, int? idScala, Dictionary<string, IList<MillesimoDTO>> millesimiConto, IList<ReportRipartizioneBilancioDTO> consuntivoPrecedente, Esercizio esercizio)
        {
            if (idStabile == null && idScala == null)
                return itemRendiconto.Importo.GetValueOrDefault();

            var conto = itemRendiconto.ContoRiferimento;
            if (conto == null && itemRendiconto.SottoContoRiferimento != null)
                conto = itemRendiconto.SottoContoRiferimento.ContoRiferimento;

            if (conto != null)
            {
                var key = conto.ID.ToString();

                List<int> stabili = null;
                List<int> scale = null;
                if (itemRendiconto.Stabile != null)
                {
                    stabili = new List<int>();
                    key += "|" + itemRendiconto.Stabile.ID;
                    stabili.Add(itemRendiconto.Stabile.ID);
                }
                if (itemRendiconto.GruppoStabile != null)
                {
                    scale = new List<int>();
                    key += "|" + itemRendiconto.GruppoStabile.ID;
                    scale.Add(itemRendiconto.GruppoStabile.ID);
                }

                IList<MillesimoDTO> millesimiTotali = null;
                if (millesimiConto.ContainsKey(key))
                    millesimiTotali = millesimiConto[key];
                if (millesimiTotali == null)
                    millesimiTotali = _millesimiService.GetByConto(conto, 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 (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 && idScala == null)
                {
                    key = $"{conto.ID}|{idStabile}";
                    if (millesimiConto.ContainsKey(key))
                        millesimiMovimento = millesimiConto[key];
                    if (millesimiMovimento == null)
                        millesimiMovimento = _millesimiService.GetByConto(conto, new List<int> { idStabile.Value }, null, esercizio);
                }
                else 
                {
                    key = $"{conto.ID}|{idScala}";
                    if (millesimiConto.ContainsKey(key))
                        millesimiMovimento = millesimiConto[key];
                    if (millesimiMovimento == null)
                        millesimiMovimento = _millesimiService.GetByConto(conto, null, new List<int> { idScala.Value }, esercizio);
                }

                if (millesimiMovimento != null)
                {
                    var denominatore = millesimiTotali.Sum(item => item.Valore.GetValueOrDefault());
                    if (denominatore != 0)
                        return (itemRendiconto.Importo.GetValueOrDefault() * millesimiMovimento.Sum(item => item.Valore.GetValueOrDefault())) / denominatore;
                    else if (millesimiMovimento.Sum(item => item.Valore.GetValueOrDefault()) == 0)
                    {
                        // Non trovato nessun millesimo il calcolo dell'importo avviene in base al consuntivo dell'anno precedente
                        var totaleMillesimiConto = consuntivoPrecedente.Where(item => item.IdConto == conto.ID).Sum(item => item.Importo.GetValueOrDefault());
                        var totaleMillesimiMovimento = consuntivoPrecedente.Where(item => item.IdConto == conto.ID && (idStabile == null || item.IdStabile == idStabile.Value) && (idScala == null || item.IdGruppoStabile == idScala.Value)).Sum(item => item.Importo.GetValueOrDefault());
                        if(totaleMillesimiConto > 0)
                            return (itemRendiconto.Importo.GetValueOrDefault()*totaleMillesimiMovimento)/totaleMillesimiConto;
                        return 0;
                    }
                    else
                    {
                        throw new InvalidDataException($"La somma totale dei millesimi è 0 mentre la somma dei millesimi conti è <> 0 - {Utility.GetMethodDescription()} - esercizio:{esercizio?.ID.ToString() ?? "<NULL>"}");
                    }
                }
            }

            return itemRendiconto.Importo.GetValueOrDefault();
        }