public IList<CalcoloSubentroDTO> GetCalcoloSubentro(int idCondominio, DateTime data, PersonaDTO personaEntrante, int idPersonaUscente, int idUnitaImmobiliarePrincipale, IList<int> unitaImmobiliari, TipoSoggetto tipoSubentro, TipoRendiconto tipoRendiconto) { var calcolo = new List<CalcoloSubentroDTO>(); try { var condominio = _daoFactory.GetCondominioDao().GetById(idCondominio, false); var esercizioCorrente = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(condominio, data); if (esercizioCorrente != null) { // Confermo temporaneamente il subentro per poter leggere gli importi corretti dal rendiconto var esitoSubentroDomain = Conferma(idCondominio, idPersonaUscente, personaEntrante, idUnitaImmobiliarePrincipale, unitaImmobiliari, data, new List<CalcoloSubentroDTO>(), new List<RataSoggettoSubentroDTO>(), string.Empty, string.Empty, 0, 0, tipoSubentro, tipoRendiconto, false, null); if (esitoSubentroDomain.Subentro != null) _daoFactory.GetSubentroDao().SaveOrUpdate(esitoSubentroDomain.Subentro); // ------------------------------------------- // Recupero lista con id dei soggetti // ------------------------------------------- var soggetti = _daoFactory.GetSoggettoCondominioDao().GetByCondominioPersona(idCondominio, idPersonaUscente).ToList(); var idPersonaEntrante = esitoSubentroDomain.EsitoSubentro.IdPersona.GetValueOrDefault(); soggetti.AddRange(_daoFactory.GetSoggettoCondominioDao().GetByCondominioPersona(idCondominio, idPersonaEntrante)); var idSoggetti = new List<int>(soggetti.Count); idSoggetti.AddRange(from soggetto in soggetti where unitaImmobiliari.Contains(soggetto.UnitaImmobiliare.ID) select soggetto.ID); // ------------------------------------------- // Decodifico il rendiconto sul quale devono basarsi i calcoli // ------------------------------------------- IEnumerable<ReportRipartizioneBilancioDTO> rendicontoRiferimento = null; switch (tipoRendiconto) { case TipoRendiconto.Consuntivo: rendicontoRiferimento = _bilancioService.GetDataSourceRipartizioneBilancioConsuntivo(esercizioCorrente.ID, null, null, null, null, null, null, true, false, TipoAccorpamentoRateEnum.Nessuno, false, true, false, false, null); break; case TipoRendiconto.Preventivo: rendicontoRiferimento = _bilancioService.GetDataSourceRipartizioneBilancioPreventivo(esercizioCorrente.ID, null, null, true, false, TipoAccorpamentoRateEnum.Nessuno, false, false, false, true, false, null); break; } if (rendicontoRiferimento != null) { // ------------------------------------------- // Decodifico il tipo di subentro // ------------------------------------------- var codiceTipoSubentro = string.Empty; switch (tipoSubentro) { case TipoSoggetto.Proprietario: codiceTipoSubentro = "PROP"; break; case TipoSoggetto.Conduttore: codiceTipoSubentro = "COND"; break; } // ------------------------------------------- // Elaboro il rendiconto // ------------------------------------------- var righeRendiconto = from item in rendicontoRiferimento where idSoggetti.Contains(item.IdPartecipante) && item.Importo != null && item.IdConto > 0 select item; if (tipoSubentro == TipoSoggetto.Conduttore && soggetti.Any(item => item.Tipo == TipoSoggetto.Proprietario)) righeRendiconto = righeRendiconto.Where(item => item.TipoNominativo == codiceTipoSubentro); var rendicontoPerConto = righeRendiconto.GroupBy(item => item.IdConto); foreach (var item in rendicontoPerConto) { try { var conto = _daoFactory.GetContoDao().GetById(item.Key, false); var rigaUscente = item.FirstOrDefault(riga => riga.IdPersona == idPersonaUscente); var rigaEntrante = item.FirstOrDefault(riga => riga.IdPersona == idPersonaEntrante); var giorniCompetenzaUscente = 0; var giorniCompetenzaEntrante = 0; if (rigaUscente != null) giorniCompetenzaUscente = rigaUscente.GiorniCompetenza.GetValueOrDefault(); if (rigaEntrante != null) giorniCompetenzaEntrante = rigaEntrante.GiorniCompetenza.GetValueOrDefault(); int giorniComplessivi = giorniCompetenzaEntrante + giorniCompetenzaUscente; if (giorniComplessivi > 0) { // calcolo importi var importoUscente = item.Where(riga => riga.IdPersona == idPersonaUscente).Sum(riga => riga.Importo.GetValueOrDefault()); var importoEntrante = item.Where(riga => riga.IdPersona == idPersonaEntrante).Sum(riga => riga.Importo.GetValueOrDefault()); var dettaglioCalcolo = new CalcoloSubentroDTO { Key = "CONTO", Codice = conto.Codice, Descrizione = conto.Descrizione, GiorniEntrante = giorniCompetenzaEntrante, GiorniUscente = giorniCompetenzaUscente, IdConto = conto.ID, OrdineConto = conto.Ordine, ImportoSoggettoEntrante = importoEntrante, ImportoSoggettoUscente = importoUscente }; if (conto.IsSpesePersonali) { const string hql = "FROM SpeseUnita SP WHERE SP.MovimentoRiferimento.Testata.EsercizioRiferimento = :esercizio AND SP.MovimentoRiferimento.ContoRiferimento = :conto AND SP.UnitaRiferimento.ID IN (:unitaImmobiliari)"; var spese = _daoFactory.GetSpeseUnitaDao().GetByQuery(hql, new QueryParam("esercizio", esercizioCorrente), new QueryParam("conto", conto), new QueryParam("unitaImmobiliari", unitaImmobiliari)); foreach (var spesa in spese) { var importo = _ripartizioneSpeseService.GetImportoCompetenza(spesa, tipoSubentro, null, null); var importoSpesaUscente = importo; var dettaglioSpesa = new CalcoloSubentroDettaglioDTO { AssegnareAEntrante = false, AssegnareAUscente = false, Descrizione = spesa.MovimentoRiferimento.GetDescrizione(), ImportoSoggettoEntrante = null, ImportoSoggettoUscente = importoSpesaUscente, ImportoSpesa = importo, CodiceTestataMovimento = spesa.MovimentoRiferimento.Testata.ID }; if (spesa.MovimentoRiferimento.DettaglioRiferimento != null) { dettaglioSpesa.CodiceSpesa = spesa.MovimentoRiferimento.DettaglioRiferimento.SpesaRiferimento.ID; dettaglioSpesa.NumeroFattura = spesa.MovimentoRiferimento.DettaglioRiferimento.SpesaRiferimento.NumeroDocumento; dettaglioSpesa.DataFattura = spesa.MovimentoRiferimento.DettaglioRiferimento.SpesaRiferimento.DataDocumento; dettaglioSpesa.Fornitore = spesa.MovimentoRiferimento.DettaglioRiferimento.SpesaRiferimento.FornitoreRiferimento.DisplayName; } dettaglioCalcolo.Dettaglio.Add(dettaglioSpesa); } } calcolo.Add(dettaglioCalcolo); } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato nella elaborazione del rendiconto per il calcolo del subentro - {0} - condominio:{1} - conto:{2}", ex, Utility.GetMethodDescription(), idCondominio, item.Key); throw; } } } } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato nel calcolo del subentro - {0} - condominio:{1}", ex, Utility.GetMethodDescription(), idCondominio); throw; } return calcolo; }
public IList<CalcoloSubentroDTO> GetCalcoloSubentro(int idSubentro) { var calcolo = new List<CalcoloSubentroDTO>(); var subentro = _daoFactory.GetSubentroDao().GetById(idSubentro, false); var data = subentro.Data; try { var soggettoUscentePrincipale = (from item in subentro.UnitaImmobiliari where item.Principale select item.SoggettoUscente).FirstOrDefault(); if (soggettoUscentePrincipale != null) { var condominio = soggettoUscentePrincipale.UnitaImmobiliare.GruppoStabileRiferimento.PalazzinaRiferimento.CondominioRiferimento; var esercizioCorrente = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(condominio, data); if (esercizioCorrente != null) { // ------------------------------------------- // Decodifico il tipo di subentro // ------------------------------------------- foreach (var dettaglio in subentro.Dettagli) { try { var conto = dettaglio.Conto; CalcoloSubentroDTO calcoloSubentro = null; var calcoliSubentro = calcolo.Where(item => item.IdConto == conto.ID).ToList(); if(calcoliSubentro.Count > 0) { calcoloSubentro = calcoliSubentro.FirstOrDefault(); if(calcoliSubentro.Count > 1) { _log.InfoFormat("Trovati più di un calcolo subentro con lo stesso conto - {0} - dettaglio:{1} - subentro:{1}", Utility.GetMethodDescription(), dettaglio.ID, idSubentro); } } if (calcoloSubentro == null) { calcoloSubentro = new CalcoloSubentroDTO { Key = "CONTO", IdConto = conto.ID, OrdineConto = conto.Ordine, Codice = conto.Codice, Descrizione = conto.Descrizione, ImportoSoggettoEntrante = 0, ImportoSoggettoUscente = 0 }; calcolo.Add(calcoloSubentro); } switch (dettaglio.Tipo) { case TipoDettaglioSubentro.Uscente: calcoloSubentro.GiorniUscente = dettaglio.Giorni; calcoloSubentro.ImportoSoggettoUscente += dettaglio.Importo; break; case TipoDettaglioSubentro.Entrante: calcoloSubentro.GiorniEntrante = dettaglio.Giorni; calcoloSubentro.ImportoSoggettoEntrante += dettaglio.Importo; break; } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato nella elaborazione del rendiconto per il calcolo del subentro - {0} - subentro:{1}", ex, Utility.GetMethodDescription(), idSubentro); throw; } } } } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato nel calcolo del subentro - {0} - subentro:{1}", ex, Utility.GetMethodDescription(), idSubentro); throw; } return calcolo; }