コード例 #1
0
ファイル: SpesaRepository.cs プロジェクト: gipasoft/Sfera
        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;
            }
        }
コード例 #2
0
ファイル: SferaService.cs プロジェクト: gipasoft/Sfera
		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;
			}
		}