private RisultatoElaborazioneCBI confermaMovimento(IList<MovimentiBancariControlloDuplicatiDTO> listaMovimentiBancari) { try { RisultatoElaborazioneCBI anomalie = null; if (_importo > 0 && _valuta != null && _dataContabile != null) { try { var alreadyLoaded = isMovimentoAlreadyLoaded(_importo.GetValueOrDefault(), _segno, _valuta.GetValueOrDefault(), _dataContabile.GetValueOrDefault(), _descrizione, _descrizioneBreve, _causale, _abi, _cab, _contoCorrente, listaMovimentiBancari); if (!alreadyLoaded) { var mov = new MovimentoBancario(_abi, _cab, _contoCorrente, _importo, _segno, _valuta, _dataContabile, _causale, _file) { NumeroAssegno = _numeroAssegno, NumeroCRO = _numeroCRO, NumeroDistinta = _numeroDistinta, Descrizione = _descrizione, DescrizioneBreve = _descrizioneBreve, AbiFornitore = _abiFornitore, CabFornitore = _cabFornitore, NomeFornitore = _nomeFornitore, AbiOrdinante = _abiOrdinante, CabOrdinante = _cabOrdinante, NomeOrdinante = _nomeOrdinante }; var coord = new CoordinateBancarie {Abi = _abi, Cab = _cab, ContoCorrente = _contoCorrente}; mov.Banca = _daoFactory.GetDatiBancariCondominiDao().GetByIban(coord.CalcolaIBAN()); // ----------------------------------------------------- // Movimenti inseriti come già evasi // ----------------------------------------------------- if (mov.Causale == "56") mov.Stato = StatoMovimentoBancarioEnum.Contabilizzato; // ----------------------------------------------------- // Condominio // ----------------------------------------------------- if (mov.Banca != null) { mov.Condominio = mov.Banca.CondominioRiferimento; // ------------------------------------------------- // Cerco di proporre un esercizio // ------------------------------------------------- var esercizio = mov.Condominio.GetEsercizioByData(mov.DataValuta.GetValueOrDefault()) ?? mov.Condominio.GetCurrentEsercizioOrdinario(); if (esercizio != null) mov.Esercizio = esercizio; } checkMovimento(mov); // ----------------------------------------------------- // Cerco di proporre un fornitore // ----------------------------------------------------- if (!string.IsNullOrEmpty(mov.NomeFornitore)) { var fornitori = (from fornitore in _fornitori where fornitore.DisplayName.Replace(" ", "").ToUpper().Contains(mov.NomeFornitore.Replace(" ", "").ToUpper()) select fornitore).ToList(); if (fornitori.Count == 1) mov.Fornitore = _daoFactory.GetFornitoreDao().GetById(fornitori.First().ID, false); } // ----------------------------------------------------- // Cerco di proporre un condomino // ----------------------------------------------------- if (!string.IsNullOrEmpty(mov.NomeOrdinante)) { SoggettoCondominio condomino = null; IList<PersonaListaDTO> personeDto = (from persona in _personeAzienda where persona.DisplayName.Replace(" ", "").ToUpper().Contains(mov.NomeOrdinante.Replace(" ", "").ToUpper()) select persona).ToList(); foreach (var persona in personeDto) { var soggettiCondominio = _daoFactory.GetSoggettoCondominioDao().GetByPersona(persona.ID); if (soggettiCondominio.Count == 1) condomino = soggettiCondominio[0]; } if (condomino != null) mov.CodiceSoggetto = condomino.ID; } listaMovimentiBancari.Add(new MovimentiBancariControlloDuplicatiDTO(0, mov.Importo, mov.Segno, mov.DataValuta, mov.DataContabile, mov.DescrizioneBreve, mov.Descrizione, mov.Causale, mov.Abi, mov.Cab, mov.ContoCorrente)); } else { anomalie = new RisultatoElaborazioneCBI(); anomalie.Warning += string.Format("E' stato <strong>SCARTATO</strong> perchè già presente in archivio il movimento importo: <strong>{0:c}</strong> - abi: <strong>{1}</strong> cab: <strong>{2}</strong> - conto: <strong>{3}</strong><br/>", _importo.GetValueOrDefault(), _abi, _cab, _contoCorrente); anomalie.Riga = _descrizioneBreve + _descrizione; } _causale = null; _valuta = null; _dataContabile = null; _segno = null; _importo = null; _numeroAssegno = null; _numeroCRO = null; _numeroDistinta = null; _descrizione = null; _descrizioneBreve = null; _abiFornitore = null; _cabFornitore = null; _nomeFornitore = null; _abiOrdinante = null; _cabOrdinante = null; _nomeOrdinante = null; } catch (Exception ex) { _log.ErrorFormat("La creazione del movimento bancario si è interrotta inaspettatamente - {0}", ex, Utility.GetMethodDescription()); anomalie = new RisultatoElaborazioneCBI { Anomalie = "La creazione del movimento bancario si è interrotta inaspettatamente." }; } } return anomalie; } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato durante la conferma del movimento bancario - {0}", ex, Utility.GetMethodDescription()); throw; } }
public IEnumerable<RisultatoElaborazioneCBI> ContabilizzazioneMovimenti(List<MovimentiBancariDTO> movimenti) { try { var result = new List<RisultatoElaborazioneCBI>(); // ======================================================== // Controlli di validità // ======================================================== foreach (var mov in movimenti) { RisultatoElaborazioneCBI resultMovimento = null; if (mov.CodiceEsercizio != null) { var dataRegistrazione = DateTime.Now; if (mov.DataContabile != null) dataRegistrazione = mov.DataContabile.Value; var condominio = _daoFactory.GetEsercizioDao().GetById(mov.CodiceEsercizio.Value, false).CondominioRiferimento; var esercizio = getEsercizioCompetenza(condominio, dataRegistrazione); if (esercizio == null || esercizio.Stato == StatoEsercizioEnum.Chiuso) { resultMovimento = new RisultatoElaborazioneCBI(); resultMovimento.Fatal += $"Non è stato trovato nessun esercizio aperto per il condominio '{condominio.DisplayName}' per registrare il movimento bancario per {mov.Importo:c} in data <b>{dataRegistrazione:d}</b>.{Environment.NewLine}"; } else { var messageList = _movimentiContabiliService.IsAllowDataRegistrazione(new List<int> { mov.CodiceCondominio.GetValueOrDefault() }, esercizio, dataRegistrazione); if (messageList.Count > 0) { resultMovimento = new RisultatoElaborazioneCBI(); resultMovimento.Anomalie += $"Data registrazione: {dataRegistrazione:d} - {Math.Abs(mov.Importo.GetValueOrDefault()):c} - {messageList.Aggregate(resultMovimento.Anomalie, (current, mess) => current + (mess + Environment.NewLine))}"; } } } if (resultMovimento != null) result.Add(resultMovimento); } if (result.Count > 0) return result; // ======================================================== // Contabilizzazione dei movimenti // ======================================================== foreach (var mov in movimenti) { if (mov.CodiceEsercizio != null) { try { var banca = _daoFactory.GetDatiBancariCondominiDao().GetById(mov.CodiceBanca.GetValueOrDefault(), false); var condominio = _daoFactory.GetEsercizioDao().GetById(mov.CodiceEsercizio.Value, false).CondominioRiferimento; var esercizio = getEsercizioCompetenza(condominio, mov.DataContabile.GetValueOrDefault()); // Descrizione movimento var descrizione = string.Empty; if (!string.IsNullOrEmpty(mov.DescrizioneBreve)) descrizione = mov.DescrizioneBreve.Trim(); if (!string.IsNullOrEmpty(mov.Descrizione)) { if (!string.IsNullOrEmpty(descrizione)) descrizione += " "; descrizione += mov.Descrizione.Trim(); } if (descrizione.Length > 1000) descrizione = descrizione.Substring(0, 1000); var dataRegistrazione = DateTime.Now; if (mov.DataContabile != null) dataRegistrazione = mov.DataContabile.Value; var causaleSottoConto = _daoFactory.GetCausaleACBISottocontoDao().GetByCausaleCondominio(_causaliACBI[mov.Causale].ID, esercizio.CondominioRiferimento.ID); var causaleAzienda = _daoFactory.GetCausaleACBIAziendaDao().GetByCausaleAzienda(_causaliACBI[mov.Causale].ID, esercizio.CondominioRiferimento.Azienda.ID); if (causaleSottoConto != null && causaleAzienda?.CausaleContabile != null) { var sottoconto = causaleSottoConto.SottoConto; if (sottoconto != null) { var movimentoPatrimoniale = _movimentiContabiliService.SetMovimentoBancarioGenerico(banca, esercizio, sottoconto, mov.Importo.GetValueOrDefault(), descrizione, dataRegistrazione, causaleAzienda.CausaleContabile); if (movimentoPatrimoniale != null) { SetContabilizzato(mov, movimentoPatrimoniale.ID); // Protocollo di archiviazione if (movimentoPatrimoniale.Testata.NumeroProtocollo == null) { var progressivo = _protocolloService.GetProgressivo(TipoProtocollo.Fattura, esercizio.DataApertura.GetValueOrDefault().Year, movimentoPatrimoniale.Testata.EsercizioRiferimento.CondominioRiferimento); if (progressivo.Progressivo != null) { var protocollo = progressivo.Progressivo.Value; movimentoPatrimoniale.Testata.NumeroProtocollo = protocollo; movimentoPatrimoniale.Testata.AnnoArchiviazioneOttica = esercizio.DataApertura.GetValueOrDefault().Year; } } } else { _log.WarnFormat("Movimento patrimoniale a NULL - {0} - movimento:{1}", Utility.GetMethodDescription(), mov.ID); } } } else { var message = string.Empty; if(causaleSottoConto == null) message = $"NON trovato sottoconto con legato alla causale bancaria: {_causaliACBI[mov.Causale].DescrizioneCompleta} nel condominio {esercizio.CondominioRiferimento.DisplayName}"; else if(causaleAzienda?.CausaleContabile == null) message = $"NON trovata la causale contabile legata alla causale bancaria: {_causaliACBI[mov.Causale].DescrizioneCompleta} nel condominio {esercizio.CondominioRiferimento.DisplayName}"; if (!string.IsNullOrEmpty(message)) { result.Add(new RisultatoElaborazioneCBI {Anomalie = message}); _log.ErrorFormat("Errore {0} - {1} - id:{2}", message, Utility.GetMethodDescription(), mov.ID); _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName); _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted); } } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato durante la contabilizzazione del movimento bancario - SINGOLO MOVIMENTO - {0} - movimento:{1}", ex, Utility.GetMethodDescription(), mov.ID); throw; } } } return result; } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato durante la contabilizzazione dei movimenti bancari - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda); throw; } }
private RisultatoElaborazioneCBI elaboraMovimento62(string linea) { try { _valuta = convertToData(linea.Substring(13, 6)); _dataContabile = convertToData(linea.Substring(19, 6)); _segno = linea.Substring(25, 1); _importo = decimal.Parse(linea.Substring(26, 15)); _numeroAssegno = linea.Substring(45, 15).Trim(); _causale = linea.Substring(41, 2); _descrizioneBreve = linea.Substring(86, 34); if (_valuta == null) { var anomalie = new RisultatoElaborazioneCBI(); anomalie.Warning += string.Format("E' stato <strong>SCARTATO</strong> un movimento perchè la data valuta non è corretta - importo: <strong>{0:c}</strong> - data:{1}<br/>", _importo.GetValueOrDefault(), linea.Substring(13, 6)); anomalie.Riga = string.Format("{0}<br/>{1}{2}", linea, _descrizioneBreve, _descrizione); return anomalie; } return null; } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato durante l'importazione della riga di movimento bancario 62 - {0} - linea:{1}", ex, Utility.GetMethodDescription(), linea); throw; } }
private RisultatoElaborazioneCBI confermaMovimento(IList<Conto> contiBancari, IList<Conto> contiVersamentiCondomini, CausaleContabile causaleVersamento, LogTransazione logTransazione) { RisultatoElaborazioneCBI anomalie = null; if (_idDettaglioEmissioneRata != null) { var dettaglioEmissione = _daoFactory.GetDettaglioEmissioneRateDao().Find(_idDettaglioEmissioneRata.Value, false); if (dettaglioEmissione != null) { if (string.IsNullOrEmpty(dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.Deleted)) { var contoBancario = contiBancari.FirstOrDefault(item => item.CondominioRiferimento.ID == dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.ID); if (contoBancario == null) { contoBancario = _daoFactory.GetContoDao().GetByCodice(dettaglioEmissione.TestataEmissioneRate.Esercizio.ID, dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.ID, "902"); if(contoBancario != null) contiBancari.Add(contoBancario); } if (contoBancario != null) { // Controllo eventuali anomalie var importoRate = dettaglioEmissione.RateCollegate.Sum(item => item.Importo); if (importoRate != _importo) anomalie = new RisultatoElaborazioneCBI { Warning = $"L'importo del versamento non corrisponde all'importo della rata, <strong><i>verificare se si tratta di una rata annullata manualmente</i></strong> senza usare l'apposita funzionalità presente in Sfera - <strong>Condomino: {_nomeDebitore}</strong> - Importo: <strong>{_importo.GetValueOrDefault():c}</strong> - Importo rata: <strong>{importoRate:c}</strong><br/>", Riga = _linea14 }; // Se non presenti anomalie elaboro la conferma if (anomalie == null) { foreach (var rata in dettaglioEmissione.RateCollegate) { if (rata != null) { if (_causaleRicezione == "07000" || _causaleRicezione == "07011") { if (rata.Versamenti.Count > 0) anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value}</strong> - Data scadenza: {rata.DataScadenza:d} è già stata <strong>SALDATA</strong>.<br/>", Riga = _linea14 }; if (rata.Esercizio.Stato == StatoEsercizioEnum.Chiuso) anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value}</strong> - Data scadenza: {rata.DataScadenza} è relativa ad un <strong>ESERCIZIO CHIUSO</strong>.<br/>",Riga = _linea14 }; // Se non ho trovato la banca di accredito uso la banca principale del condominio if (_banca == null) _banca = rata.Esercizio.CondominioRiferimento.DatiBancariPrincipale; // -------------------------------------------------------------------------------------------- // ATTENZIONE: Non viene usata la data di valuta perchè inaffidabile, nel CBI della BPER // la data valuta corrisponde, erroneamente, alla data di scadenza // -------------------------------------------------------------------------------------------- // Data di registrazione if (_dataVersamento == null) _dataVersamento = DateTime.Today.AddDays(-2); var esercizioCompetenza = rata.Esercizio; // ------------------------------------------------------------------- // Esercizio CHIUSO recupero quello di competenza // ------------------------------------------------------------------- if (esercizioCompetenza.Stato == StatoEsercizioEnum.Chiuso) esercizioCompetenza = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(esercizioCompetenza.CondominioRiferimento, _dataVersamento.GetValueOrDefault()); // ------------------------------------------------------------------- // Validazione KO - Non trovato esercizio di competenza // ------------------------------------------------------------------- // Anche se sono presenti anomalie elaboro la conferma, i versamenti saranno registrati come: Versamenti fuori piano rateale if (esercizioCompetenza == null || esercizioCompetenza.Stato == StatoEsercizioEnum.Chiuso) { if (anomalie == null) anomalie = new RisultatoElaborazioneCBI(); anomalie.Fatal += $"Non è stato trovato nessun esercizio aperto per il condominio '{rata.Esercizio.CondominioRiferimento.DisplayName}' per registrare il versamento di {rata.Soggetto.DisplayName} per {rata.Importo:c} in data <b>{_dataVersamento.GetValueOrDefault():d}</b>.<br/>"; } else { TipoVersamentoDopoChiusuraEnum? tipoVersamentoDopoChiusura = null; if (_dataVersamento.GetValueOrDefault() > esercizioCompetenza.DataChiusura.GetValueOrDefault()) tipoVersamentoDopoChiusura = esercizioCompetenza.CondominioRiferimento.TipoVersamentoDopoChiusura; TipoVersamentoPrimaAperturaEnum? tipoVersamentoPrimaApertura = null; if (_dataVersamento.GetValueOrDefault() < esercizioCompetenza.DataApertura.GetValueOrDefault()) tipoVersamentoPrimaApertura = esercizioCompetenza.CondominioRiferimento.TipoVersamentoPrimaApertura; // Trovo conto versamenti corretto var contoVersamentoCondomini = contiVersamentiCondomini.FirstOrDefault(item => item.EsercizioRiferimento != null && item.EsercizioRiferimento.ID == rata.Esercizio.ID) ?? contiVersamentiCondomini.FirstOrDefault(item => item.EsercizioRiferimento == null && item.CondominioRiferimento.ID == rata.Esercizio.CondominioRiferimento.ID); var resultVersamento = _versamentiCondominiService.InsertVersamentoCondomino( esercizioCompetenza, rata, _banca, contoBancario, causaleVersamento, contoVersamentoCondomini, _dataVersamento.GetValueOrDefault(), _file, logTransazione, tipoVersamentoDopoChiusura, tipoVersamentoPrimaApertura); if (!string.IsNullOrEmpty(resultVersamento.Message)) { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value:c}</strong> - Data scadenza: {rata.DataScadenza:d} <strong>NON è stata registrata</strong>:<br/><strong>{resultVersamento.Message}</strong><br/>", Riga = _linea14 }; break; } switch (_causaleRicezione) { case "07000": rata.Emissione.Stato = StatoMavEnum.Pagato; break; case "07011": rata.Emissione.Stato = StatoMavEnum.PagatoDopoRadiazione; break; } } } } else if (_causaleRicezione == "07008") { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value:c}</strong> - Data scadenza: {rata.DataScadenza:d} è stata <strong>RICHIAMATA</strong><br/>", Riga = _linea14 }; rata.SetStato(StatoRataEnum.Richiamata); rata.DaRichiamare = false; _movimentiContabiliService.SetMovimentiRichiamoRata(rata, logTransazione); rata.Emissione.Stato = StatoMavEnum.Richiamato; } else if (_causaleRicezione == "07010") { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value:c}</strong> - Data scadenza: {rata.DataScadenza:d} è stata <strong>RADIATA</strong> per mancato pagamento del condomino<br/>", Riga = _linea14 }; rata.Emissione.Stato = StatoMavEnum.Radiato; } else if (_causaleRicezione == "07006") { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"La rata del condomino: <strong>{_nomeDebitore}</strong> <i>({rata.Esercizio.CondominioRiferimento.DisplayName})</i> - Importo: <strong>{_importo.Value:c}</strong> - Data scadenza: {rata.DataScadenza:d} è stata <strong>RESA</strong> perché formalmente irregolare o comunque non idonea al trattamento<br/>", Riga = _linea14 }; rata.Emissione.Stato = StatoMavEnum.Resa; } } } } else { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"Le rata del condominio: <strong>{dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.DisplayName}</strong> non possono essere caricate perchè non è stato trovato il conto corrente bancario<br/>", Riga = _linea14 }; _log.ErrorFormat("Non è stato trovato il conto corrente bancario per il condominio - {0} - condominio:{1} - azienda:{2}", Utility.GetMethodDescription(), dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.ID, dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.Azienda.ID); } } else { anomalie = new RisultatoElaborazioneCBI { Anomalie = $"Le rata del condominio: <strong>{dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.DisplayName}</strong> non possono essere caricate perchè non è stato trovato il condominio è annullato<br/>", Riga = _linea14 }; _log.ErrorFormat("Condominio annullato - {0} - condominio:{1} - azienda:{2}", Utility.GetMethodDescription(), dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.ID, dettaglioEmissione.TestataEmissioneRate.Esercizio.CondominioRiferimento.Azienda.ID); } } else { anomalie = new RisultatoElaborazioneCBI { Warning = $"Emissione NON trovata - Condomino: <strong>{_nomeDebitore}</strong> - Importo: <strong>{_importo.GetValueOrDefault():c}</strong><br/>", Riga = _linea14 }; } } _idDettaglioEmissioneRata = null; _importo = null; _banca = null; _dataScadenza = null; _nomeDebitore = null; return anomalie; }