public SpesaInfoDTO Salva(SpesaDTO spesaDto, IDictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> listaRipartizione, bool isMultiIva) { try { var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda); var movimentoContabileService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMovimentiContabiliService>(); var ripartizioneSpeseService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IRipartizioneSpeseService>(); var protocolloService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IProtocolloService>(); var ripartizioneSpesa = new RipartizioneSpeseRepository(_info, _windsorRepository); // ------------------------------------------------------------ // Verifico se il fornitore è presente // ------------------------------------------------------------ var fornitore = daoFactory.GetFornitoreDao().Find(spesaDto.IdFornitore.GetValueOrDefault(), false); if (fornitore == null) { return new SpesaInfoDTO { Id = 0, IdentificativoArchiviazione = null, NumeroProtocollo = 0, StampaEtichettaArchiviazione = false, Message = "Il fornitore non è più presente in archivio." }; } // ------------------------------------------------------------ // Prima di ogni modifica recupero i movimenti secondari // ------------------------------------------------------------ IList<MovimentoContabile> movimentiSecondari = null; if (spesaDto.ID > 0) { var spesa = daoFactory.GetSpesaDao().Find(spesaDto.ID, false); if(spesa != null) movimentiSecondari = ripartizioneSpeseService.GetMovimentiSecondari(spesa); } // ------------------------------------------------------------ // Creo la ripartizione per ogni movimento // ------------------------------------------------------------ foreach (var dettaglioDto in spesaDto.Dettagli) { RipartizioneSpeseDTO ripartizione = null; var dettaglio = ripartizioneSpesa.GetDettaglioDto(listaRipartizione, dettaglioDto.NumeroRiga.GetValueOrDefault()); if (dettaglio != null) { if (listaRipartizione.ContainsKey(dettaglio)) ripartizione = listaRipartizione[dettaglio]; } if (ripartizione == null || ripartizione.UnitaImmobiliari == null) { var oldRipartizione = ripartizione; ripartizione = new RipartizioneSpeseDTO(); if(oldRipartizione != null) { ripartizione.Descrizione = oldRipartizione.Descrizione; ripartizione.DescrizioneVoceSpesa = oldRipartizione.DescrizioneVoceSpesa; ripartizione.NomeModello = oldRipartizione.NomeModello; } } foreach (var movimentoDto in dettaglioDto.Movimenti) { if (movimentoDto.ID > 0) { var movimento = daoFactory.GetMovimentoContabileDao().Find(movimentoDto.ID, false); if (movimento?.MovimentoStorno != null) { try { movimentoDto.IdMovimentoStorno = movimento.MovimentoStorno.ID; } catch (Exception ex) { _log.ErrorFormat("Errore nella lettura dell'id del movimento di storno - {0} - spesa:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), spesaDto.ID, movimento.ID); } finally { movimento.MovimentoStorno = null; } } } movimentoDto.ID = 0; if(dettaglioDto.IdModelloRipartizione == null) ripartizioneSpesa.GetRipartizioneByMovimento(movimentoDto, spesaDto.IdEsercizio.GetValueOrDefault(), ripartizione); } } // -------------------------------- // Aggiungo le ripartizioni tra le diverse unità immobiliari // -------------------------------- ripartizioneSpesa.AddMovimentiRipartizione(listaRipartizione, spesaDto); // -------------------------------- // Salvataggio della spesa // -------------------------------- if(spesaDto.StatoSpesa == StatoSpesaEnum.Undefined) spesaDto.StatoSpesa = StatoSpesaEnum.Inserita; var resultSpesa = ManageDomainEntity(spesaDto, isMultiIva); if (resultSpesa.Spesa != null) { var spesa = resultSpesa.Spesa; // ripartizione di default // TODO: Dato che la ripartizione ora viene ricalcolata quando serve (stampa riparto bilancio ecc....) // probabilmente NON è più necessaria la chiamata a questo metodo //ripartizioneSpesa.AddDefaultRipartizione(listaRipartizione, spesa); // -------------------------------- // Movimenti contabili secondari // -------------------------------- // Eliminazione della vecchia testata if (spesaDto.IdTestata > 0) { var testata = daoFactory.GetTestataMovimentoContabileDao().Find(spesaDto.IdTestata, false); // bugid#4168 if(testata != null) deleteTestata(testata, daoFactory); } // Creazione dei nuovi movimenti contabili movimentoContabileService.SetMovimentiInserimentoSpesa(spesa, null, spesaDto.DataRegistrazione); // -------------------------------- // Modello registrazione contabile // -------------------------------- if (listaRipartizione.Count > 0) { foreach (var dettaglio in spesa.Dettagli) { var kvpRipartizione = getDettaglioDto(listaRipartizione, dettaglio.NumeroRiga.GetValueOrDefault()); if (kvpRipartizione != null) { var listaMovimenti = new List<MovimentoContabileDTO>(kvpRipartizione.GetValueOrDefault().Key.Movimenti.Length); listaMovimenti.AddRange(kvpRipartizione.GetValueOrDefault().Key.Movimenti); var modello = ripartizioneSpesa.SalvaModelloRipartizioneContabile(kvpRipartizione.GetValueOrDefault().Value, dettaglio, listaMovimenti, dettaglio.ImportoLordo.GetValueOrDefault()); if (modello != null) { if (kvpRipartizione.GetValueOrDefault().Value.AssociatoFornitore) { var modelloContabileFornitore = new ModelloContabileFornitore(spesa.FornitoreRiferimento, modello, null); daoFactory.GetModelloContabileFornitoreDao().SaveOrUpdate(modelloContabileFornitore); } dettaglio.ModelloRipartizione = modello; } } } } // ---------------------------------------------------------------------------------------------------------------------------------------------------------------- // Aggiorno eventuali movimenti secondari collegati. // ---------------------------------------------------------------------------------------------------------------------------------------------------------------- if (movimentiSecondari != null) ripartizioneSpeseService.UpdateMovimentiSecondari(spesa, movimentiSecondari); // ---------------------------------------------------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------------------------------------------------------- // Aggiorno i documenti // ---------------------------------------------------------------------------------------------------------------------------------------------------------------- if (spesaDto.IdDocumenti.Count > 0) { foreach (var idDoc in spesaDto.IdDocumenti) { var documento = daoFactory.GetDocumentoDao().Find(idDoc, false); if(documento != null) documento.SpesaRiferimento = spesa; } } // ====================================================================================== // Registro gli eventuali pagamenti immediati // ====================================================================================== var pagamentoService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IPagamentoService>(); pagamentoService.CreatePagamentiImmediati(spesa.ID, spesaDto.Scadenze, null); // ====================================================================================== // Recupero il numero di protocollo e l'identificativo di archiviazione // ====================================================================================== if (spesa.NumeroProtocollo == null) { var progressivo = protocolloService.GetProgressivo(TipoProtocollo.Fattura, spesa.EsercizioRiferimento.DataApertura.GetValueOrDefault().Year, spesa.EsercizioRiferimento.CondominioRiferimento); if (progressivo.Progressivo != null) { spesa.NumeroProtocollo = progressivo.Progressivo; spesa.AnnoArchiviazioneOttica = spesa.EsercizioRiferimento.DataApertura.GetValueOrDefault().Year; } else return new SpesaInfoDTO { Id = 0, IdentificativoArchiviazione = null, NumeroProtocollo = 0, StampaEtichettaArchiviazione = false, Message = progressivo.Message }; } var identificativoArchiviazione = getArchiviazioneOtticaService().GetIdentificativoArchiviazione(spesa); var impostazioni = daoFactory.GetImpostazioniAziendaDao().GetByAzienda(spesa.EsercizioRiferimento.CondominioRiferimento.Azienda.ID); if (impostazioni == null) { impostazioni = new ImpostazioniAzienda(daoFactory.GetAziendaDao().GetById(spesa.EsercizioRiferimento.CondominioRiferimento.Azienda.ID, false)); daoFactory.GetImpostazioniAziendaDao().SaveOrUpdate(impostazioni); } var stampaEtichetta = impostazioni.UtilizzoEtichettatriceArchiviazioneOtticaFatture && spesa.IsAbilitataArchiviazioneOttica && spesaDto.ID == 0; var etichettatrice = impostazioni.EtichettatriceArchiviazioneOttica; var tipoEtichetta = impostazioni.TipoEtichettaArchiviazioneOttica; var trayEtichettatriceAttivazioneOttica = impostazioni.TrayEtichettatriceAttivazioneOttica; // ====================================================================================== // Aggiorno eventuali movimenti per interessi e sanzioni pagati in ritardo // ====================================================================================== movimentoContabileService.SetMovimentiInteressiSanzioni(spesa); return new SpesaInfoDTO { Id = spesa.ID, NumeroProtocollo = spesa.NumeroProtocollo.GetValueOrDefault(), IdentificativoArchiviazione = identificativoArchiviazione, StampaEtichettaArchiviazione = stampaEtichetta, EtichettatriceArchiviazione = etichettatrice, TipoEtichettaArchiviazione = tipoEtichetta, TrayEtichettatriceAttivazioneOttica = trayEtichettatriceAttivazioneOttica }; } return new SpesaInfoDTO { Id = 0, NumeroProtocollo = 0, IdentificativoArchiviazione = null, StampaEtichettaArchiviazione = false, EtichettatriceArchiviazione = string.Empty, TipoEtichettaArchiviazione = "Testo", Message = resultSpesa.Message }; } catch (Exception ex) { _log.ErrorFormat("Errore nel salvataggio della spesa - {0} - numeroDocumento:{1} - dataDocumento:{2} - dataRegistrazione:{3}", ex, Utility.GetMethodDescription(), spesaDto.NumeroDocumento, spesaDto.DataDocumento, spesaDto.DataRegistrazione); throw; } }
public RipartizioneSpeseDTO GetRipartizioneByMovimento(MovimentoContabileDTO movimento, int idEsercizio, RipartizioneSpeseDTO ripartizione, UserInfo userinfo) { var windsorRep = new WindsorConfigRepository(); try { windsorRep.BeginTransaction(userinfo); var rep = new RipartizioneSpeseRepository(userinfo, windsorRep); var item = rep.GetRipartizioneByMovimento(movimento, idEsercizio, ripartizione); windsorRep.Commit(); return item; } catch (Exception ex) { _log.ErrorFormat("Errore nella esecuzione della funzione - {0} - esercizio:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), idEsercizio, userinfo.Azienda); windsorRep.Rollback(); throw; } }