public void SetMovimentiPagamenti(Disposizione disposizione, string tipoConto, LogTransazione logTransazione)
        {
            try
            {
                var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("PF");
                var lista = new Dictionary<Esercizio, TestataMovimentoContabile>(disposizione.Pagamenti.Count);

                foreach (var pag in disposizione.Pagamenti)
                {
                    try
                    {
                        var numeroRiga = 0;
                        var esercizioRiferimento = getEsercizioCompetenza(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento, pag.Data.GetValueOrDefault());
                        if (esercizioRiferimento == null)
                        {
                            var ex = new InvalidDataException(string.Format("Non trovato nessun esercizio attivo"));
                            _log.FatalFormat("Non trovato nessun esercizio attivo - {0} - condominio:{1} - disposizione:{2} - tipoConto:{3}", ex, Utility.GetMethodDescription(), pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, disposizione.ID, tipoConto);
                            throw ex;
                        }

                        var message = IsAllowDataRegistrazione(new List<int> { esercizioRiferimento.CondominioRiferimento.ID }, esercizioRiferimento, pag.Data.GetValueOrDefault());
                        if (message.Count == 0)
                        {
                            // ================================================
                            // Testata
                            // ================================================
                            TestataMovimentoContabile testata;
                            if (lista.ContainsKey(esercizioRiferimento))
                                testata = lista[esercizioRiferimento];
                            else
                            {
                                testata = new TestataMovimentoContabile(esercizioRiferimento, pag.Data, TipoTestataMovimentoContabileEnum.Automatica, logTransazione);
                                if(logTransazione == null)
                                    _daoFactory.GetTestataMovimentoContabileDao().SaveOrUpdate(testata);

                                // Per ora ritengo opportuno avere una testata di movimento contabile distinta per ogni pagamento.
                                // Per avere un testata che accorpi diversi pagamenti è sufficiente scommentare la riga successiva.
                                //lista.Add(esercizioRiferimento, testata);
                            }

                            // ================================================
                            // Debiti VS Fornitori
                            // ------------------------------------------------
                            //  Se è già presente un movimento contabile legato alla ritenute
                            //  vuol dire che il pagamento stato annullato.
                            //  In questo caso il movimento di ritenuta non deve essere generato
                            // ================================================
                            numeroRiga++;
                            var importoFornitori = pag.Importo.GetValueOrDefault();
                            if (pag.RitenutaAcconto != null && pag.RitenutaAcconto.MovimentoContabileCreazione == null)
                                importoFornitori += pag.RitenutaAcconto.Importo.GetValueOrDefault();
                            var movimentoPatrimoniale = new MovimentoContabile(testata, pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento, causale, numeroRiga, _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoFornitori()), importoFornitori, "D")
                            {
                                Descrizione = string.Format("Pagamento Fatt. n.{0} del {1:d}", pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento, pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.GetValueOrDefault())
                            };
                            if(logTransazione == null)
                                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoPatrimoniale);

                            // ================================================
                            // Ritenuta
                            // ================================================
                            decimal importoRitenuta = 0;
                            if (pag.ScadenzaRiferimento.SpesaRiferimento.Detrazione.GetValueOrDefault() == 0 && pag.RitenutaAcconto != null && pag.RitenutaAcconto.MovimentoContabileCreazione == null && pag.RitenutaAcconto.Importo != null && pag.RitenutaAcconto.Importo.GetValueOrDefault() != 0)
                            {
                                numeroRiga++;
                                var segnoRitenuta = "A";
                                importoRitenuta = pag.RitenutaAcconto.Importo.GetValueOrDefault();
                                if (pag.RitenutaAcconto.Importo.GetValueOrDefault() < 0)
                                {
                                    segnoRitenuta = "D";
                                    importoRitenuta = importoRitenuta * -1;
                                }
                                var movimentoRitenuta = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoRitenuta()), importoRitenuta, segnoRitenuta)
                                {
                                    FornitoreRiferimento = movimentoPatrimoniale.FornitoreRiferimento
                                };
                                if (!string.IsNullOrEmpty(pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento) && pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento != null)
                                    movimentoRitenuta.Descrizione = "Ritenuta Fatt. n." + pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento + " del " + pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.Value.ToShortDateString();

                                pag.RitenutaAcconto.MovimentoContabileCreazione = movimentoRitenuta;
                                if(logTransazione == null)
                                    _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoRitenuta);
                            }

                            // ================================================
                            // Conto Patrimoniale
                            // ================================================
                            numeroRiga++;
                            if (pag.Conto == null)
                            {
                                switch (tipoConto)
                                {
                                    case "B":
                                        pag.Conto = _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoBancario());
                                        break;
                                    case "C":
                                        pag.Conto = _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, "903");
                                        break;
                                }
                            }

                            var segnoPagamento = "A";
                            var importoPagamento = importoFornitori - importoRitenuta;
                            if (importoPagamento < 0)
                            {
                                segnoPagamento = "D";
                                importoPagamento = importoPagamento * -1;

                                // Inverto segno e importo anche per il movimento di Debiti v/Fornitori
                                movimentoPatrimoniale.Segno = invertiSegno("D");
                                movimentoPatrimoniale.Importo = importoFornitori * -1;
                            }

                            var movimentoBancario = new MovimentoContabile(testata, causale, numeroRiga, pag.Conto, importoPagamento, segnoPagamento)
                            {
                                Descrizione = movimentoPatrimoniale.GetDescrizione(),
                                NumeroAssegno = pag.NumeroAssegno,
                                FornitoreRiferimento =
                                    pag.ScadenzaRiferimento.SpesaRiferimento.
                                    FornitoreRiferimento,
                                SottoContoRiferimento = pag.SottoConto,
                                ContoCorrenteBancario = pag.ContoCorrenteBancario
                            };
                            pag.MovimentoContabile = movimentoBancario;
                            if (logTransazione == null)
                                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoBancario);
                        }
                        else
                        {
                            var ex = new InvalidDataException(string.Format("La data di registrazione {0} non è valida", pag.Data.GetValueOrDefault()));
                            _log.FatalFormat("Data di registrazione non valida - {0} - data:{1} - pagamento:{2} - disposizione:{3} - tipoConto:{4} - esercizio:{5}", ex, Utility.GetMethodDescription(), pag.Data.GetValueOrDefault(), pag.ID, disposizione.ID, tipoConto, esercizioRiferimento.ID);
                            throw ex;
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.FatalFormat("Errore inaspettato durante la scrittura dei movimenti per pagamenti - (SINGOLO PAGAMENTO) - {0} - pagamento:{1} - disposizione:{2}", ex, Utility.GetMethodDescription(), pag.ID, disposizione.ID);
                        throw;
                    }

                }
            }
            catch (Exception ex)
            {
                _log.FatalFormat("Errore inaspettato durante la scrittura dei movimenti per pagamenti - {0} - disposizione:{1}", ex, Utility.GetMethodDescription(), disposizione.ID);
                throw;
            }
        }
Example #2
0
 private string getDescrizioneMovimento(MovimentoContabile movimento, Esercizio esercizio, bool detrazione)
 {
     if (movimento.SottoContoRiferimento != null)
         return movimento.SottoContoRiferimento.GetDescrizione(esercizio, null, movimento);
     if (!string.IsNullOrEmpty(movimento.GetDescrizione(detrazione)))
         return movimento.GetDescrizione();
     return string.Empty;
 }
        private MovimentoContabileListaDTO setListaDto(MovimentoContabile item, bool importiNegativi, IArchiviazioneOtticaService archiviazioneService)
        {
            try
            {
                var dto = new MovimentoContabileListaDTO
                {
                    ID = item.ID,
                    IdTestata = item.Testata.ID,
                    Data = item.Testata.DataRegistrazione.GetValueOrDefault(),
                    Causale = item.Causale.DescrizioneCompleta,
                    IdCondominio = item.Testata.EsercizioRiferimento.CondominioRiferimento.ID,
                    Condominio = item.Testata.EsercizioRiferimento.CondominioRiferimento.DisplayName,
                    IdEsercizio = item.Testata.EsercizioRiferimento.ID,
                    Esercizio = item.Testata.EsercizioRiferimento.DisplayName,
                    IdConto = item.ContoRiferimento.ID,
                    Conto = item.ContoRiferimento.Descrizione,
                    TipoConto = item.ContoRiferimento.Tipo.ToString(),
                    Descrizione = item.GetDescrizione(),
                    Importo = !importiNegativi ? item.GetImportoSenzaSegno() : item.GetImportoConSegno(),
                    ImportoResiduoEvasione = item.GetImportoSenzaSegno(),
                    Stato = item.Stato
                };

                if(item.ImportoEvasioneTransitorio != null)
                    dto.ImportoResiduoEvasione -= item.ImportoEvasioneTransitorio;

                dto.Segno = item.Segno;

                dto.Note = item.Note;
                dto.NumeroRegistrazione = item.NumeroRegistrazione;
                dto.NumeroAssegno = item.NumeroAssegno;
                dto.NumeroRiga = item.NumeroRiga;

                if (item.EvasioneBancaria != null)
                    dto.IdEvasioneBancaria = item.EvasioneBancaria.ID;

                if (item.FornitoreRiferimento != null)
                {
                    dto.IdFornitore = item.FornitoreRiferimento.ID;
                    dto.Nominativo = item.FornitoreRiferimento.DisplayName;
                }

                if (item.CondominoRiferimento != null)
                {
                    dto.IdCondomino = item.CondominoRiferimento.ID;
                    dto.Nominativo = item.CondominoRiferimento.Persona.DisplayName;
                }

                if(item.DettaglioRiferimento != null)
                    dto.IdDettaglio = item.DettaglioRiferimento.ID;
                if (item.SottoContoRiferimento != null)
                {
                    dto.IdSottoConto = item.SottoContoRiferimento.ID;
                    dto.SottoConto = item.SottoContoRiferimento.GetDescrizione(item.Testata.EsercizioRiferimento, null, item);
                }
                else if (item.ContoRiferimento.Codice == getPianoContiService().GetCodiceContoBancario() && item.ContoCorrenteBancario != null)
                {
                    dto.IdSottoConto = item.ContoCorrenteBancario.ID * -1;
                    dto.SottoConto = item.ContoCorrenteBancario.DisplayName;
                }
                else if (item.ContoRiferimento.Codice == getPianoContiService().GetCodiceContoFornitori() && item.FornitoreRiferimento != null)
                {
                    dto.IdSottoConto = item.FornitoreRiferimento.ID * -1;
                    dto.SottoConto = item.FornitoreRiferimento.DisplayName;
                }

                var spesaRiferimento = item.Testata.SpesaRiferimento;
                if (spesaRiferimento == null && item.DettaglioRiferimento != null)
                    spesaRiferimento = item.DettaglioRiferimento.SpesaRiferimento;

                // =============================================================================================
                //  Commentato rendeva troppo lenta la ricerca dei movimenti - bugid#2967
                // =============================================================================================
                //if(spesaRiferimento == null)
                //{
                //    Pagamento pagamento = null;
                //    if(pagamenti == null)
                //        pagamento = daoFactory.GetPagamentoDao().GetByMovimentoContabile(item);
                //    else
                //        pagamento = pagamenti.FirstOrDefault(itemPagamento => itemPagamento.MovimentoContabile != null && itemPagamento.MovimentoContabile.ID == item.ID);
                //    if (pagamento != null)
                //        spesaRiferimento = pagamento.ScadenzaRiferimento.SpesaRiferimento;
                //}
                // =============================================================================================

                if (spesaRiferimento != null)
                {
                    dto.IdSpesa = spesaRiferimento.ID;
                    dto.NumeroProtocollo = spesaRiferimento.NumeroProtocollo;
                    dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(spesaRiferimento, true);
                    dto.StatoSpesa = spesaRiferimento.Stato;
                    dto.TipoDocumentoSpesa = spesaRiferimento.TipoDocumento;
                }
                else
                {
                    dto.NumeroProtocollo = item.Testata.NumeroProtocollo;
                    if (dto.NumeroProtocollo > 0)
                        dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(item.Testata);
                    else if (item.DettaglioRiferimento != null && item.DettaglioRiferimento.SpesaRiferimento != null)
                        dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(item.DettaglioRiferimento.SpesaRiferimento, true);
                }
                
                dto.IsAllowOpenDettaglio = item.Testata.NumeroProtocollo > 0 || dto.IdSpesa > 0;

                return dto;
            }
            catch (Exception ex)
            {
                if (item != null)
                {
                    
                    _log.Error("Errore nel caricamento del Movimento Contabile: " + Utility.GetMethodDescription() + " - id:" + item.ID, ex);
                }
                else
                {
                    
                    _log.Error("Errore nel caricamento del Movimento Contabile: " + Utility.GetMethodDescription() + " - Movimento --> null", ex);
                }
                throw;
            }
        }