public ChiusuraEsercizioStraordinarioInfo(int? idEsercizioSaldi, TipoChiusuraEsercizioStraordinarioEnum tipoChiusura, DateTime dataApertura, DateTime dataChiusura, string descrizione) { IdEsercizioSaldi = idEsercizioSaldi; TipoChiusura = tipoChiusura; DataApertura = dataApertura; DataChiusura = dataChiusura; Descrizione = descrizione; }
public AuthorizationMessages IsAllowChiusuraEsercizio(int idEsercizio, DateTime? dataAperturaEsercizio, DateTime? dataChiusuraEsercizio, bool forzaChiusuraSenzaNuovo, int? idEsercizioSaldi, TipoChiusuraEsercizioStraordinarioEnum tipoChiusura) { var warnMessage = string.Empty; var fatalMessage = string.Empty; var esercizio = _daoFactory.GetEsercizioDao().Find(idEsercizio, false); if(esercizio == null) return new AuthorizationMessages("L'esercizio non è più presente, probabilmente è stato eliminato in un altro thread, si cosniglia di eseguire un refresh", string.Empty); if (dataAperturaEsercizio == null) dataAperturaEsercizio = esercizio.DataApertura; // ========================================================================= // Esercizio Ordinario // ========================================================================= if (esercizio.Gestione == GestioneEsercizioEnum.Ordinario) { if (esercizio.Stato == StatoEsercizioEnum.Aperto) { var esercizioPrecedente = esercizio.GetEsercizioPrecedente(); if(esercizioPrecedente != null && esercizioPrecedente.Stato == StatoEsercizioEnum.Aperto) fatalMessage = "Non è possibile eseguire la chiusura perchè l'esercizio precedente è ancora aperto." + Environment.NewLine; var annoSuccessivo = _daoFactory.GetAnnoGestionaleDao().GetAnnoSuccessivo(esercizio.AnnoGestionale.ID); if (annoSuccessivo == null && !forzaChiusuraSenzaNuovo) fatalMessage = "Non è possibile chiudere un esercizio ordinario senza prima aver aperto il nuovo." + Environment.NewLine; if (dataChiusuraEsercizio != null) { if (dataAperturaEsercizio >= dataChiusuraEsercizio) fatalMessage += "La data di chiusura non può essere anteriore a quella di apertura" + Environment.NewLine; try { var dataChiusuraOrdinaria = new DateTime(esercizio.AnnoGestionale.AnnoFinale.GetValueOrDefault(), esercizio.CondominioRiferimento.MeseChiusuraEsercizioOrdinario, esercizio.CondominioRiferimento.GiornoChiusuraEsercizioOrdinario); if (dataChiusuraEsercizio.GetValueOrDefault() != dataChiusuraOrdinaria) warnMessage = "La data di chiusura non corrisponde con la data di chiusura ordinaria: " + dataChiusuraOrdinaria.ToShortDateString(); } catch (Exception ex) { _log.ErrorFormat("Errore nella lettura della data di chiusura ordinaria - {0} - giorno:{1} - mese:{2} - anno:{3} - azienda:{4}", ex, Utility.GetMethodDescription(), esercizio.CondominioRiferimento.GiornoChiusuraEsercizioOrdinario, esercizio.CondominioRiferimento.MeseChiusuraEsercizioOrdinario, esercizio.AnnoGestionale.AnnoFinale, esercizio.CondominioRiferimento.Azienda.ID); } const string hql = "FROM Esercizio ES WHERE ES != :esercizio AND ES.Gestione = :gestione AND ES.CondominioRiferimento = :condominio AND ((ES.DataApertura >= :dataApertura AND ES.DataApertura <= :dataChiusura) OR (ES.DataChiusura >= :dataApertura AND ES.DataChiusura <= :dataChiusura))"; var esercizi = _daoFactory.GetEsercizioDao().GetByQuery(hql, new QueryParam("dataApertura", dataAperturaEsercizio.GetValueOrDefault()), new QueryParam("dataChiusura", dataChiusuraEsercizio.GetValueOrDefault()), new QueryParam("esercizio", idEsercizio), new QueryParam("condominio", esercizio.CondominioRiferimento.ID), new QueryParam("gestione", Conversione.ToHQLParameter(GestioneEsercizioEnum.Ordinario))); if (esercizi.Count > 0) { fatalMessage += "Sono presenti esercizi all'interno delle date di competenza dell'esercizio che si vuole chiudere:" + Environment.NewLine; fatalMessage = esercizi.Aggregate(fatalMessage, (current, item) => current + ("Esercizio: " + item.DisplayName + " - apertura: " + item.DataApertura.GetValueOrDefault().ToShortDateString() + " - chiusura: " + item.DataChiusura.GetValueOrDefault().ToShortDateString())); } } // Controllo movimenti di chiusura già presenti if (_daoFactory.GetTestataMovimentoContabileDao().GetTestateMovimentiByEsercizioChiusura(esercizio).Count > 0) fatalMessage += "E' già presente una chiusura di esercizio" + Environment.NewLine; // Controllo saldi condomini nel bilancio di apertura var testataBilancioApertura = _daoFactory.GetTestataMovimentoContabileDao().GetTestateMovimentiByEsercizioCausale(esercizio, _daoFactory.GetCausaleContabileDao().GetByCodice("AB")).Where(item => item.AperturaBilancio).ToList().SingleOrDefault(); if (testataBilancioApertura != null) { var contoCreditiCondomini = _daoFactory.GetContoDao().GetByCodice(esercizio.ID, esercizio.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoVersamentiCondomini()); var importoCreditiCondomini = testataBilancioApertura.Movimenti.Where(item => item.ContoRiferimento.ID == contoCreditiCondomini.ID).Sum(item => item.GetImportoConSegno().GetValueOrDefault()); if (importoCreditiCondomini != 0) { var saldiCondominiApertura = _daoFactory.GetSaldoSoggettoDao().GetByEsercizioStabileScala(esercizio, null, null); if (!saldiCondominiApertura.Any()) fatalMessage += $"Non sono presenti i saldi di inizio esercizio dei condomini{Environment.NewLine}"; else { var importoSaldiCondomini = saldiCondominiApertura.Sum(item => item.Importo * -1); if(importoCreditiCondomini != importoSaldiCondomini) fatalMessage += $"L'importo del conto crediti v/condomini: {importoCreditiCondomini:c} non corrisponde con la somma dei saldi dei singoli condomini: {importoSaldiCondomini:c}{Environment.NewLine}"; } } } } else fatalMessage = "L'esercizio è già stato chiuso" + Environment.NewLine; } // ========================================================================= // Esercizio Straordinario // ========================================================================= if (esercizio.Gestione == GestioneEsercizioEnum.Straordinario) { if (esercizio.Stato == StatoEsercizioEnum.Chiuso) fatalMessage = "L'esercizio è già stato chiuso" + Environment.NewLine; if (dataChiusuraEsercizio != null) { var numeroMovimentiDopoChiusura = _daoFactory.GetMovimentoContabileDao().GetCountMovimentiEconomici(dataChiusuraEsercizio.GetValueOrDefault().AddDays(1), esercizio); if (numeroMovimentiDopoChiusura > 0) fatalMessage = $"Sono presenti {numeroMovimentiDopoChiusura} movimenti economici con data di registrazione successiva al {dataChiusuraEsercizio.GetValueOrDefault().ToShortDateString()}.{Environment.NewLine}"; // Se presente esercizio saldi la data di chiusura deve essere coerente if (idEsercizioSaldi != null) { var esercizioSaldi = _daoFactory.GetEsercizioDao().Find(idEsercizioSaldi.GetValueOrDefault(), false); if (esercizioSaldi != null) { var messagesDataRegistrazione = _movimentoContabileService.IsAllowDataRegistrazione(new List<int> { esercizio.CondominioRiferimento.ID }, esercizioSaldi, dataChiusuraEsercizio.GetValueOrDefault()); fatalMessage = messagesDataRegistrazione.Aggregate(fatalMessage, (current, message) => current + $"{message}.{Environment.NewLine}"); } } else if(tipoChiusura == TipoChiusuraEsercizioStraordinarioEnum.TrasferimentoInOrdinario) fatalMessage = "Non è stato scelto l'esercizio ordinario per il passaggio dei saldi"; } else fatalMessage = "Non è stata definita la data di chiusura dell'esercizio"; } return new AuthorizationMessages(fatalMessage, warnMessage); }
public AuthorizationMessages IsAllowChiusura(EsercizioDTO esercizio, DateTime? dataApertura, DateTime? dataChiusura, bool forzaChiusuraSenzaNuovo, int? idEsercizioSaldi, TipoChiusuraEsercizioStraordinarioEnum tipoChiusura) { var result = GetServiceClient().IsAllowChiusuraEsercizio(esercizio.ID, dataApertura, dataChiusura, forzaChiusuraSenzaNuovo, idEsercizioSaldi, tipoChiusura, GetUserInfo()); CloseService(); return result; }
public AuthorizationMessages IsAllowChiusuraEsercizio(int idEsercizio, DateTime? dataAperturaEsercizio, DateTime? dataChiusuraEsercizio, bool forzaChiusuraSenzaNuovo, int? idEsercizioSaldi, TipoChiusuraEsercizioStraordinarioEnum tipoChiusura, UserInfo userinfo) { var windsorRep = new WindsorConfigRepository(); try { windsorRep.BeginTransaction(userinfo); var service = windsorRep.GetContainer(userinfo.Azienda).Resolve<IEsercizioService>(); var item = service.IsAllowChiusuraEsercizio(idEsercizio, dataAperturaEsercizio, dataChiusuraEsercizio, forzaChiusuraSenzaNuovo, idEsercizioSaldi, tipoChiusura); windsorRep.Commit(); return item; } catch (Exception ex) { _log.ErrorFormat("Errore nel controllo di chiusura dell'esercizio - {0} - esercizio:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), idEsercizio, userinfo.Azienda); windsorRep.Rollback(); throw; } }