Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }