public RendicontoAnnualeUnita(RendicontoAnnualeConto conto, UnitaImmobiliare unita, decimal? importo) { Conto = conto; Unita = unita; Importo = importo; if (Conto != null) Conto.DettagliUnita.Add(this); }
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(); }