예제 #1
0
        public string PagamentoRitenuta(Pagamento pagamento, DateTime dataPagamento, Conto conto, int? idSottoconto, string descrizione, decimal? importo, decimal? importoInteressi, decimal? importoSanzione)
        {
            try
            {
                var anomalie = string.Empty; 
                if (Conversione.IsSqlSmallDateTime(dataPagamento))
                {
                    if (!string.IsNullOrEmpty(descrizione) && descrizione.Trim().Length > 500)
                        descrizione = descrizione.Trim().Substring(0, 500);

                    var pagamentoRitenuta = new PagamentoRitenuta(pagamento.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.ID, descrizione, dataPagamento, true, TipoVersamentoF24Enum.Immediato);
                    pagamentoRitenuta.Pagamenti.Add(pagamento);
                    _daoFactory.GetPagamentoRitenutaDao().SaveOrUpdate(pagamentoRitenuta);

                    if (importoInteressi != null)
                        pagamento.RitenutaAcconto.ImportoInteressi = importoInteressi.Value;

                    if (importoSanzione != null)
                        pagamento.RitenutaAcconto.ImportoSanzione = importoSanzione.Value;

                    pagamento.RitenutaAcconto.Stato = StatoRitenutaEnum.Pagata;
                    pagamento.RitenutaAcconto.TestataRiferimento = pagamentoRitenuta;
                    pagamentoRitenuta.TestataContabile = _movimentiContabilitaService.SetMovimentiRitenuta(pagamento, pagamento.RitenutaAcconto, conto, idSottoconto, dataPagamento, descrizione, null, null, importo);
                }
                else
                {
                    _log.WarnFormat("La data di pagamento della ritenuta non è corretta - {0} - pagamento:{1} - importo:{2} - dataPagamento:{3:d} - conto:{4} - idSottoconto:{5} - descrizione:{6}", Utility.GetMethodDescription(), pagamento.ID, importo, dataPagamento, conto.ID, idSottoconto.GetValueOrDefault(), descrizione);
                }

                return anomalie;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante l'inserimento pagamento della ritenuta - {0} - pagamento:{1} - importo:{2} - dataPagamento:{3:d} - conto:{4} - idSottoconto:{5} - descrizione:{6}", ex, Utility.GetMethodDescription(), pagamento.ID, importo, dataPagamento, conto.ID, idSottoconto.GetValueOrDefault(), descrizione);
                throw; 
            }
        }
예제 #2
0
        private void writeMovimento50(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 50");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString(CultureInfo.InvariantCulture).PadLeft(7, '0'));

            // --------------------------------------------------------------------
            // Descrizione disposizione per fornitore
            // --------------------------------------------------------------------
            // 1° segmento (numero fattura 24ch + data fattura GGMMAA)
            var descrizione = string.Empty;
            if(pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento != null)
            {
                var numeroDocumento = pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento;
                if (numeroDocumento.Length > 24)
                    numeroDocumento = numeroDocumento.Substring(0, 24);
                sb.Append(numeroDocumento.PadLeft(24, '0'));
                descrizione += "Fatt. nr." + pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento;
            }
            if (pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento != null)
            {
                sb.Append(convertData(pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.Value));
                descrizione += "del " + pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.Value.ToShortDateString();            
            }

            // 2° segmento 3 ° segmento
            if (descrizione.Length > 60)
                descrizione = descrizione.Substring(0, 60);
            sb.Append(descrizione.PadRight(60));
            
            //                sb.Append((pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID + "&" + pag.ID).PadLeft(30, ' '));

            // filler
            sb.Append(string.Empty.PadLeft(20));

            sw.WriteLine(sb.ToString());
        }
예제 #3
0
        private void writeMovimento70(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 70");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // filler
            sb.Append(string.Empty.PadLeft(15));

            // campo non disponibile
            sb.Append(string.Empty.PadLeft(5));

            // qualificatore flusso
            sb.Append(string.Empty.PadLeft(7));

            // codice MP
            sb.Append(string.Empty.PadLeft(5));

            // filler
            sb.Append(string.Empty.PadLeft(27));

            // --------------------------------------------------------------------
            // Identificazione della disposizione di pagamento
            // --------------------------------------------------------------------
            // flag richiesta
            sb.Append("3");

            // Identificativo della disposizione (pagamento)
            sb.Append(pag.ID.ToString().PadLeft(30, '0'));

            // filler
            sb.Append(string.Empty.PadLeft(10));

            // CIN fornitore
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Cin.PadLeft(1, ' '));

            // filler
            sb.Append(string.Empty.PadLeft(1));

            // chiavi di controllo
            sb.Append(string.Empty.PadLeft(8));

            sw.WriteLine(sb.ToString());
        }
예제 #4
0
        public BilancioAperturaMessage SetBilancioApertura(TestataMovimentoContabileGestioneDTO testata)
        {
            try
            {
                var fatalMessage = string.Empty;
                var warnMessage = string.Empty;

                //==============================================
                // Controllo esercizio
                //==============================================
                if (testata.CodiceEsercizio == 0)
                {
                    _log.ErrorFormat("Non è definito alcun esercizio - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage("Non è definito alcun esercizio", string.Empty, false);
                }

                var esercizio = _daoFactory.GetEsercizioDao().Find(testata.CodiceEsercizio, false);
                if(esercizio == null)
                {
                    _log.ErrorFormat("L'esercizio non è stato trovato - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage($"L'esercizio '{testata.CodiceEsercizio}' non è stato trovato.", string.Empty, false);
                }
                
                if(esercizio.Gestione == GestioneEsercizioEnum.Straordinario)
                {
                    _log.ErrorFormat("L'esercizio deve essere un esercizio ordinario - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage("L'esercizio deve essere un esercizio ordinario", string.Empty, false);
                }

                //==============================================
                // Controllo Saldi Condomini
                //==============================================
                var saldiCondomini = _daoFactory.GetSaldoSoggettoDao().GetByEsercizioStabileScala(esercizio, null, null);
                var contoCreditiCondomini = _daoFactory.GetContoDao().GetAllByCodice(esercizio.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoVersamentiCondomini()).FirstOrDefault(item => item.EsercizioRiferimento == null);
                if (contoCreditiCondomini != null)
                {
                    var movimentiVersamentiCondomini = testata.Movimenti.Where(item => item.IdConto == contoCreditiCondomini.ID).ToList();
                    if (movimentiVersamentiCondomini.Count > 1)
                    {
                        _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                        _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
                        return new BilancioAperturaMessage($"Non può essere presente più di un movimento per il conto {contoCreditiCondomini.Codice} - {contoCreditiCondomini.Descrizione}", string.Empty, false);
                    }

                    if (movimentiVersamentiCondomini.Count == 1)
                    {
                        var importoCreditiCondomini = movimentiVersamentiCondomini.Sum(item => item.ImportoDare.GetValueOrDefault() - item.ImportoAvere.GetValueOrDefault());
                        if (importoCreditiCondomini > 0)
                        {
                            if (saldiCondomini.Count == 0)
                            {
                                _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
                                return new BilancioAperturaMessage("Prima di registrare il bilancio di apertura occorre inserire i saldi iniziali dei singoli condomini", string.Empty, true);
                            }

                            var totaleSaldiCondomini = saldiCondomini.Sum(item => item.Importo);
                            if (importoCreditiCondomini != totaleSaldiCondomini)
                            {
                                _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
                                return new BilancioAperturaMessage($"L'importo del conto crediti v/condomini: {importoCreditiCondomini:c} non corrisponde con la somma dei saldi dei singoli condomini: {totaleSaldiCondomini:c}", string.Empty, true);
                            }
                        }
                    }                    
                }                
                
                //==============================================
                // Controllo data registrazione
                //==============================================
                if (testata.DataRegistrazione == null || !Conversione.IsSqlSmallDateTime(testata.DataRegistrazione.GetValueOrDefault()))
                {
                    _log.ErrorFormat("Non è definita la data di registrazione - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage("Non è definita la data di registrazione", string.Empty, false);
                }
                
                if(testata.DataRegistrazione.GetValueOrDefault() < esercizio.DataApertura.GetValueOrDefault())
                {
                    _log.DebugFormat("La data di registrazione è inferiore alla data di apertura dell'esercizio - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage("La data di registrazione è inferiore alla data di apertura dell'esercizio", string.Empty, false);
                }

                //==============================================
                // Controllo correttezza importi
                //==============================================
                if (testata.Movimenti == null)
                {
                    _log.FatalFormat("I movimenti sono a null - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                    return new BilancioAperturaMessage("I movimenti sono a null", string.Empty, false);
                }

                if (testata.Movimenti.Sum(mov => mov.ImportoDare.GetValueOrDefault()) != testata.Movimenti.Sum(mov => mov.ImportoAvere.GetValueOrDefault()))
                    fatalMessage = $"Il totale Dare:{testata.Movimenti.Sum(mov => mov.ImportoDare.GetValueOrDefault()):c} non corrisponde col totale Avere:{testata.Movimenti.Sum(mov => mov.ImportoAvere.GetValueOrDefault()):c}.{Environment.NewLine}";
                else
                {
                    var listaDettagli = new Dictionary<int, DettaglioSpesa>();
                    // ==============================================================================================================
                    // Se il bilancio di apertura NON è registrato nel primo esercizio occorre registrare solo i movimenti contabili
                    // ==============================================================================================================
                    if (IsRequiredDatiFatturaBilancioApertura(esercizio.ID))
                    {
                        // ===============================================
                        // Controllo movimenti
                        // ===============================================
                        foreach (var dto in testata.Movimenti)
                        {
                            if (dto.Stato == "U")
                            {
                                var messageControllo = IsAllowUpdateMovimentoBilancioApertura(dto.ID, dto.IdSpesa);
                                if (string.IsNullOrEmpty(messageControllo))
                                {
                                    // ------------------------------------------------------------------------------------
                                    //  Se il conto non è Fornitori e Ritenuta devo cancellare l'eventuale spesa associata
                                    // ------------------------------------------------------------------------------------
                                    var conto = _daoFactory.GetContoDao().GetById(dto.IdConto.GetValueOrDefault(), false);
                                    if (conto.Codice == _pianoContiService.GetCodiceContoFornitori() || conto.Codice == _pianoContiService.GetCodiceContoRitenuta())
                                        dto.IdSpesa = 0;
                                    else
                                    {
                                        if (dto.IdSpesa > 0)
                                        {
                                            var messageDeleteSpesa = IsAllowDelete(dto.IdSpesa);
                                            if (!string.IsNullOrEmpty(messageDeleteSpesa.FatalMessage))
                                                return new BilancioAperturaMessage(messageDeleteSpesa.FatalMessage, string.Empty, false);
                                            else
                                            {
                                                var movimento = _daoFactory.GetMovimentoContabileDao().Find(dto.ID, false);
                                                if(movimento != null)
                                                {
                                                    movimento.Spesa = null;
                                                    movimento.Testata.Movimenti.Remove(movimento);
                                                    movimento.Testata = null;
                                                    _daoFactory.GetMovimentoContabileDao().Delete(movimento);
                                                }

                                                Delete(dto.IdSpesa);

                                                dto.ID = 0;
                                                dto.IdSpesa = 0;
                                                dto.IdFornitore = 0;
                                                dto.NumeroDocumento = null;
                                                dto.DataDocumento = null;
                                                dto.ImportoFattura = null;
                                                dto.ImportoIva = null;
                                                dto.ImportoRitenuta = null;
                                                dto.InteressiRitenuta = null;
                                                dto.SanzioniRitenuta = null;
                                                dto.AliquotaRitenuta = null;
                                                dto.AltreSpese = null;
                                                dto.AltreSpeseEsenti = null;
                                                dto.DataPagamento = null;
                                                dto.DataVersamentoRitenuta = null;
                                            }
                                        }
                                    }

                                }
                                else
                                {
                                    fatalMessage += messageControllo + Environment.NewLine;
                                    
                                    _log.WarnFormat("{0} - {1} - testata:{2}", fatalMessage, Utility.GetMethodDescription(), testata.ID);
                                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                                    return new BilancioAperturaMessage(fatalMessage, string.Empty, false);
                                }
                            }
                        }

                        var index = 0;

                        // ===============================================
                        // Elaborazione di tutti i movimenti
                        // ===============================================
                        foreach (var movimento in testata.Movimenti)
                        {
                            try
                            {
                                if (movimento.Stato == "U")
                                {
                                    if (movimento.IdConto == null)
                                    {
                                        _log.FatalFormat("I movimenti sono a null - 2 - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                                        _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                        _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                                        return new BilancioAperturaMessage($"Non è presente il conto per la riga:{movimento.NumeroRiga.GetValueOrDefault()}", string.Empty, false);
                                    }

                                    index++;
                                    if (movimento.ID == 0)
                                        movimento.ID = index*-1;

                                    // ----------------------------------------------------------
                                    //  Se è presente il fornitore devo gestire la fattura
                                    // ----------------------------------------------------------
                                    var conto = _daoFactory.GetContoDao().GetById(movimento.IdConto.GetValueOrDefault(), false);
                                    if (movimento.IdFornitore > 0 && (conto.Codice == _pianoContiService.GetCodiceContoFornitori() || conto.Codice == _pianoContiService.GetCodiceContoRitenuta()))
                                    {
                                        var fornitore = _daoFactory.GetFornitoreDao().GetById(movimento.IdFornitore.GetValueOrDefault(), false);

                                        // ----------------------------------
                                        // Importi
                                        // ----------------------------------
                                        decimal importo;
                                        decimal? importoRitenuta = null;
                                        try
                                        {
                                            if (movimento.ImportoAvere.GetValueOrDefault() > 0)
                                            {
                                                importo = movimento.ImportoAvere.GetValueOrDefault() - movimento.AltreSpeseEsenti.GetValueOrDefault();
                                                importoRitenuta = movimento.ImportoRitenuta;
                                            }
                                            else
                                            {
                                                importo = (movimento.ImportoDare.GetValueOrDefault() - movimento.AltreSpeseEsenti.GetValueOrDefault()) * -1;
                                                if(movimento.ImportoRitenuta != null)
                                                    importoRitenuta = movimento.ImportoRitenuta.GetValueOrDefault()*-1;
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - IMPORTI - {0} - idTestata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }

                                        // ----------------------------------
                                        // Spesa
                                        // ----------------------------------
                                        GestioneCondomini.Domain.Spesa spesa;
                                        try
                                        {
                                            if (movimento.ID > 0)
                                            {
                                                var mov = _daoFactory.GetMovimentoContabileDao().Find(movimento.ID, false);
                                                if (mov != null)
                                                {
                                                    if (mov.Spesa != null)
                                                        spesa = mov.Spesa;
                                                    else
                                                    {
                                                        if (mov.DettaglioRiferimento?.SpesaRiferimento == null)
                                                        {
                                                            var messageSpesa = getNewSpesa(fornitore, esercizio, testata, movimento, out spesa);
                                                            if (!string.IsNullOrEmpty(messageSpesa))
                                                            {
                                                                fatalMessage += messageSpesa + Environment.NewLine;

                                                                _log.ErrorFormat("Errore nella generazione della spesa - {0} - idTestata:{1}", Utility.GetMethodDescription(), testata.ID);
                                                                _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                                                _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                                                                return new BilancioAperturaMessage(fatalMessage, string.Empty, false);
                                                            }
                                                        }
                                                        else
                                                            spesa = mov.DettaglioRiferimento.SpesaRiferimento;
                                                    }
                                                }
                                                else
                                                {
                                                    int? idMov = null;
                                                    if (mov != null)
                                                        idMov = mov.ID;

                                                    _log.ErrorFormat("Non è stato trovato il movimento contabile - {0} - id:{1}", Utility.GetMethodDescription(), idMov);
                                                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                                                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                                                    return new BilancioAperturaMessage("Non è stato trovato il movimento contabile", string.Empty, false);
                                                }

                                                if (spesa != null)
                                                    spesa.FornitoreRiferimento = fornitore;
                                            }
                                            else
                                            {
                                                spesa = new GestioneCondomini.Domain.Spesa(fornitore, esercizio, null);
                                                try
                                                {
                                                    if (_protocolloService == null)
                                                    {
                                                        _log.ErrorFormat("Errore di inizializzazione del protocollo service - {0} - idEsercizio:{1} - idTestata:{2}", Utility.GetMethodDescription(), testata.CodiceEsercizio, testata.ID);
                                                        fatalMessage = "Errore di inizializzazione del protocollo service.";
                                                    }

                                                    if (movimento.DataDocumento == null)
                                                    {
                                                        
                                                        _log.ErrorFormat("La data del documento è null - {0} - documento:{1} - movimento:{2} - esercizio:{3} - testata:{4}", Utility.GetMethodDescription(), movimento.NumeroDocumento, movimento.ID, testata.CodiceEsercizio, testata.ID);
                                                        fatalMessage = "La data del documento è null.";
                                                    }

                                                    if (esercizio.CondominioRiferimento == null)
                                                    {

                                                        _log.FatalFormat("Il Condominio è null - {0} - documento:{1} - movimento:{2} - esercizio:{3} - testata:{4}", Utility.GetMethodDescription(), movimento.NumeroDocumento, movimento.ID, testata.CodiceEsercizio, testata.ID);
                                                        fatalMessage = "Il Condominio è null.";
                                                    }

                                                    var protocollo = _protocolloService.GetProgressivo(TipoProtocollo.Fattura, esercizio.DataApertura.GetValueOrDefault().Year, esercizio.CondominioRiferimento);
                                                    if (protocollo.Progressivo != null)
                                                        spesa.NumeroProtocollo = protocollo.Progressivo;
                                                    else
                                                        return new BilancioAperturaMessage(protocollo.Message, string.Empty, false);
                                                }
                                                catch (Exception ex)
                                                {
                                                    _log.ErrorFormat("Errore inaspettato nel recuperare il progressivo - {0} - data:{1:d} - condominio:{2} - movimento:{3} - esercizio:{4} - testata:{5}", ex, Utility.GetMethodDescription(), movimento.DataDocumento.GetValueOrDefault(), esercizio.CondominioRiferimento.ID, movimento.ID, testata.CodiceEsercizio, testata.ID);
                                                    fatalMessage = "Errore inaspettato nel recuperare il progressivo.";
                                                }

                                                _daoFactory.GetSpesaDao().SaveOrUpdate(spesa);
                                            }

                                            if (spesa != null)
                                            {
                                                spesa.TipoDocumento = "FATBILAPP";
                                                spesa.ImportoRitenuta = importoRitenuta;
                                                spesa.AltreSpeseEsenti = movimento.AltreSpeseEsenti;
                                                spesa.AltreSpese = movimento.AltreSpese;
                                                spesa.IsRitenutaCalcoloImponibile = spesa.FornitoreRiferimento.IsRitenutaCalcolataImponibile;
    
                                                if(movimento.AliquotaRitenuta != null)
                                                    spesa.AliquotaRitenuta = movimento.AliquotaRitenuta.GetValueOrDefault()/100;
                                                else
                                                    spesa.AliquotaRitenuta = null;
                                                
                                                spesa.NumeroDocumento = movimento.NumeroDocumento;
                                                spesa.DataDocumento = movimento.DataDocumento;
                                                spesa.Stato = conto.Codice == _pianoContiService.GetCodiceContoFornitori() ? StatoSpesaEnum.Inserita : StatoSpesaEnum.Pagata;

                                                movimento.IdSpesa = spesa.ID;

                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - SPESA - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }

                                        // ----------------------------------
                                        // Dettaglio Spesa
                                        // ----------------------------------
                                        DettaglioSpesa dettaglio = null;
                                        try
                                        {
                                            if (conto.Codice == _pianoContiService.GetCodiceContoFornitori() || conto.Codice == _pianoContiService.GetCodiceContoRitenuta())
                                            {
                                                if (movimento.ID > 0 && _daoFactory.GetMovimentoContabileDao().GetById(movimento.ID, false).DettaglioRiferimento != null)
                                                    dettaglio = _daoFactory.GetMovimentoContabileDao().GetById(movimento.ID, false).DettaglioRiferimento;
                                                else
                                                {
                                                    dettaglio = new DettaglioSpesa(spesa, 1);
                                                    _daoFactory.GetDettaglioSpesaDao().SaveOrUpdate(dettaglio);
                                                }

                                                dettaglio.Descrizione = movimento.Descrizione;
                                                dettaglio.ImportoLordo = conto.Codice == _pianoContiService.GetCodiceContoFornitori() ? importo - movimento.AltreSpese.GetValueOrDefault() : movimento.ImportoFattura;
                                                dettaglio.ImportoIva = movimento.ImportoIva;
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - DETTAGLIO SPESA - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }

                                        // ------------------------------------------------------
                                        // Scadenza - SOLO se non di tratta di nota di accredito
                                        // ------------------------------------------------------
                                        ScadenzaFattura scadenza = null;
                                        try
                                        {
                                            if (spesa != null && movimento.ImportoDare.GetValueOrDefault() == 0)
                                            {
                                                if (movimento.ID > 0)
                                                    scadenza = IesiGenericCollections<ScadenzaFattura>.GetByIndex(spesa.Scadenze, 0);
                                                if (scadenza == null)
                                                {
                                                    scadenza = new ScadenzaFattura(spesa, esercizio.DataApertura, importo - spesa.ImportoRitenuta.GetValueOrDefault())
                                                    {
                                                        Stato = conto.Codice == _pianoContiService.GetCodiceContoFornitori() ? StatoSpesaEnum.Inserita : StatoSpesaEnum.Pagata
                                                    };

                                                    _daoFactory.GetScadenzaFatturaDao().SaveOrUpdate(scadenza);
                                                }

                                                if (conto.Codice == _pianoContiService.GetCodiceContoFornitori())
                                                {
                                                    scadenza.Importo = importo + spesa.AltreSpeseEsenti.GetValueOrDefault() - spesa.ImportoRitenuta.GetValueOrDefault();
                                                    scadenza.ImportoRitenuta = spesa.ImportoRitenuta;
                                                    if (movimento.DataPagamento != null)
                                                        scadenza.Scadenza = movimento.DataPagamento.GetValueOrDefault();
                                                }
                                                else
                                                {
                                                    scadenza.Importo = 0;
                                                    scadenza.ImportoRitenuta = importoRitenuta;
                                                }
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - SCADENZA - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }

                                        // =================================================================================
                                        //  RITENUTE
                                        // ----------------------------------
                                        // Pagamento
                                        // ----------------------------------
                                        try
                                        {
                                            // Inserimento pagamento fattura per ritenuta in bilancio di apertura da pagare
                                            if (scadenza != null && conto.Codice == _pianoContiService.GetCodiceContoRitenuta())
                                            {
                                                Pagamento pagamento;
                                                if (scadenza.Pagamenti.Count > 0)
                                                {
                                                    pagamento = scadenza.Pagamenti.First();
                                                    pagamento.Data = movimento.DataPagamento.GetValueOrDefault();
                                                    pagamento.RitenutaAcconto.Importo = scadenza.ImportoRitenuta;
                                                    pagamento.RitenutaAcconto.ImportoInteressi = movimento.InteressiRitenuta;
                                                    pagamento.RitenutaAcconto.ImportoSanzione = movimento.SanzioniRitenuta;
                                                    pagamento.Importo = spesa.ImportoLordo - pagamento.RitenutaAcconto.Importo.GetValueOrDefault();
                                                    pagamento.Stato = StatoSpesaEnum.Pagata;

                                                    // Se il pagamento è già presente devo annullare la ritenuta eventualmente già versata
                                                    // TODO: Verificare se è necessario controllare che non si tratti di un versamento CBI
                                                    if (pagamento.RitenutaAcconto != null && pagamento.RitenutaAcconto.TestataRiferimento != null)
                                                    {
                                                        var messageDeleteRitenuta = _ritenutaService.DeletePagamentoRitenuta(pagamento.RitenutaAcconto.TestataRiferimento.ID);
                                                        if (!string.IsNullOrEmpty(messageDeleteRitenuta))
                                                            fatalMessage += messageDeleteRitenuta + Environment.NewLine;

                                                    }
                                                }
                                                else
                                                {
                                                    pagamento = new Pagamento(scadenza, null, spesa.ImportoLordo, movimento.DataPagamento.GetValueOrDefault(), TipoPagamentoFatturaEnum.AltroAmministratore)
                                                    {
                                                        RitenutaAcconto = new Ritenuta(scadenza.ImportoRitenuta)
                                                        {
                                                            ImportoInteressi = movimento.InteressiRitenuta,
                                                            ImportoSanzione = movimento.SanzioniRitenuta,
                                                            Stato = StatoRitenutaEnum.Inserita
                                                        },
                                                        Stato = StatoSpesaEnum.Pagata
                                                    };

                                                    _daoFactory.GetPagamentoDao().SaveOrUpdate(pagamento);
                                                }

                                                // -------------------------------------------------------------------------------------------
                                                // Se presente la data di versamento della ritenuta la ritenuta inserita è già stata versata
                                                // -------------------------------------------------------------------------------------------
                                                if (string.IsNullOrEmpty(fatalMessage) && movimento.DataVersamentoRitenuta != null)
                                                {
                                                    var contoRitenuta = _daoFactory.GetContoDao().GetByCodice(scadenza.SpesaRiferimento.EsercizioRiferimento.ID, scadenza.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoBancario());
                                                    _ritenutaService.PagamentoRitenuta(pagamento, movimento.DataVersamentoRitenuta.GetValueOrDefault(), contoRitenuta, null, testata.Descrizione, null, null, null);
                                                }
                                            }

                                            if (dettaglio != null)
                                                listaDettagli.Add(movimento.ID, dettaglio);
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - PAGAMENTO - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }

                                        // =================================================================================
                                        //  FATTURE
                                        // ---------------------------------------------------------------------------------
                                        // Inserimento pagamento fattura per fattura in bilancio di apertura ma già pagata
                                        // ---------------------------------------------------------------------------------
                                        try
                                        {
                                            if (spesa != null && string.IsNullOrEmpty(fatalMessage) && conto.Codice == _pianoContiService.GetCodiceContoFornitori() && movimento.DataPagamento != null)
                                            {
                                                if (spesa.ID > 0 && scadenza?.Pagamenti != null && scadenza.Pagamenti.Count > 0)
                                                {
                                                    var messageAnnullamentoPagamenti = _pagamentoService.IsAllowAnnullamentoPagamentiSpesa(spesa.ID);
                                                    if (string.IsNullOrEmpty(messageAnnullamentoPagamenti.FatalMessage))
                                                        _pagamentoService.AnnullamentoPagamentiSpesa(spesa.ID);
                                                    else
                                                        fatalMessage += messageAnnullamentoPagamenti.FatalMessage + Environment.NewLine;
                                                }

                                                if (string.IsNullOrEmpty(fatalMessage))
                                                {
                                                    var idScadenza = 0;
                                                    decimal? importoScadenza = spesa.ImportoLordo;
                                                    var dataScadenza = movimento.DataPagamento;
                                                    var statoScadenza = StatoSpesaEnum.Inserita;
                                                    if (scadenza != null)
                                                    {
                                                        idScadenza = scadenza.ID;
                                                        importoScadenza = scadenza.Importo;
                                                        dataScadenza = scadenza.Scadenza;
                                                        statoScadenza = scadenza.Stato;
                                                    }

                                                    int? idSottoConto = null;
                                                    var datiBancari = esercizio.CondominioRiferimento.DatiBancariPrincipale;
                                                    if (datiBancari != null)
                                                        idSottoConto = datiBancari.ID*-1;
                                                    var scadenze = new List<ScadenzaFatturaDTO>(1)
                                                    {
                                                        new ScadenzaFatturaDTO
                                                        {
                                                            ID = idScadenza,
                                                            IdContoPagamentoScadenza = _pianoContiService.GetContoBancario(esercizio).ID,
                                                            DataPagamentoRitenuta = null,
                                                            DataPagamentoScadenza = movimento.DataPagamento.GetValueOrDefault(),
                                                            IdSottoContoPagamentoScadenza = idSottoConto,
                                                            IdSpesa = spesa.ID,
                                                            Importo = importoScadenza,
                                                            ImportoRitenuta = movimento.ImportoRitenuta,
                                                            Scadenza = dataScadenza,
                                                            StatoScadenza = statoScadenza,
                                                            Stato = "U"
                                                        }
                                                    };
                                                    var messagePagamenti = _pagamentoService.CreatePagamentiImmediati(spesa.ID, scadenze, null);
                                                    if (!string.IsNullOrEmpty(messagePagamenti))
                                                        fatalMessage += messagePagamenti + Environment.NewLine;
                                                }
                                            }

                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - PAGAMENTO 2 - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                                            throw;
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - SINGOLO MOVIMENTO - {0} - movimento:{1} - testata:{2}", ex, Utility.GetMethodDescription(), movimento.ID, testata.ID);
                                throw;
                            }
                        }
                    }

                    try
                    {
                        if(string.IsNullOrEmpty(fatalMessage))
                        {
                            var result = _movimentoContabileService.SetBilancioApertura(testata);
                            fatalMessage += result.Message;
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - MOVIMENTI CONTABILI - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                        throw;
                    }

                    try
                    {
                        if(string.IsNullOrEmpty(fatalMessage))
                        {
                            foreach (var dto in testata.Movimenti)
                            {
                                try
                                {
                                    if (dto.IdMovimentoRiferimento > 0 && listaDettagli.ContainsKey(dto.ID))
                                        _daoFactory.GetMovimentoContabileDao().GetById(dto.IdMovimentoRiferimento, false).DettaglioRiferimento = listaDettagli[dto.ID];
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - IMPOSTAZIONE DETTAGLIO RIFERIMENTO (SINGOLO DETTAGLIO) - {0} - id:{1} - testata:{2}", ex, Utility.GetMethodDescription(), dto.ID, testata.ID);
                                    throw;
                                }

                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - IMPOSTAZIONE DETTAGLIO RIFERIMENTO - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                        throw;
                    }

                    // =============================================================================================
                    // Esercizi Precedenti: Se chiusi occorre eliminare le registrazioni di chiusura - bugid#2472
                    // =============================================================================================
                    var eserciziPrecedenti =
                        esercizio.CondominioRiferimento.Esercizi.Where(
                            item =>
                            item.Stato == StatoEsercizioEnum.Chiuso &&
                            item.Gestione == GestioneEsercizioEnum.Ordinario &&
                            item.DataApertura.GetValueOrDefault() < esercizio.DataApertura.GetValueOrDefault()).ToList();

                    foreach (var esercizioPrecedente in eserciziPrecedenti)
                        _movimentoContabileService.EliminazioneOperazioniAperturaChiusura(esercizioPrecedente);

                }

                if (!string.IsNullOrEmpty(fatalMessage))
                {
                    _persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                    _persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
                }

                return new BilancioAperturaMessage(fatalMessage, warnMessage, false);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato nel salvataggio del bilancio di apertura - {0} - testata:{1}", ex, Utility.GetMethodDescription(), testata.ID);
                throw;
            }
        }
예제 #5
0
        private void writeMovimento30(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 30");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // --------------------------------------------------------------------
            // Descrizione beneficiario (fornitore)
            // --------------------------------------------------------------------
            var descrizioneFornitore = Library.Conversione.ToInvioTelematico(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.DisplayName);
            var descrizione1 = string.Empty;
            var descrizione2 = string.Empty;
            var descrizione3 = string.Empty;
            if (descrizioneFornitore.Length <= 30)
            {
                descrizione1 = descrizioneFornitore.PadRight(30, ' ');
                descrizione2 = string.Empty.PadLeft(30, ' ');
                descrizione3 = string.Empty.PadLeft(30, ' ');
            }
            else if (descrizioneFornitore.Length > 30 && descrizioneFornitore.Length <= 60)
            {
                descrizione1 = descrizioneFornitore.Substring(0, 30);
                descrizione2 = descrizioneFornitore.PadRight(61, ' ').Substring(31, 30);
                descrizione3 = string.Empty.PadLeft(30, ' ');
            }
            else if (descrizioneFornitore.Length > 60)
            {
                descrizione1 = descrizioneFornitore.Substring(0, 30);
                descrizione2 = descrizioneFornitore.Substring(31, 30);
                descrizione3 = descrizioneFornitore.Substring(61).PadRight(30, ' ');
            }

            // Descrizione fornitore
            sb.Append(descrizione1);
            sb.Append(descrizione2);
            sb.Append(descrizione3);

            // Codice Fiscale
            if (pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale != null)
                sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale.PadRight(16, ' '));

            // filler
            sb.Append(string.Empty.PadLeft(4));

            sw.WriteLine(sb.ToString());
        }
        public string StornoNoteAccredito(int idNota, IList<StornoScadenzaDTO> scadenze, DettaglioSpesa dettaglioSpesa, Esercizio esercizio, DateTime dataRegistrazione)
        {
            try
            {
                var message = string.Empty;
                var nota = _daoFactory.GetSpesaDao().GetById(idNota, false);

                Disposizione disposizione = null;
                if (nota.Riscossioni.Count > 0)
                {
                    var riscossione = IesiGenericCollections<Riscossione>.GetByIndex(nota.Riscossioni, 0);
                    if (riscossione.Pagamenti.Count > 0)
                        disposizione = IesiGenericCollections<Pagamento>.GetByIndex(riscossione.Pagamenti, 0).DisposizioneRiferimento;
                }

                if (disposizione == null)
                {
                    disposizione = new Disposizione($"Storno da nota accredito n.{nota.NumeroDocumento} del:{nota.DataDocumento.GetValueOrDefault():d}", dataRegistrazione, nota.EsercizioRiferimento.CondominioRiferimento.Azienda, null);
                    _daoFactory.GetDisposizioneDao().SaveOrUpdate(disposizione);
                }

                //==============================================================
                // Controlli
                //==============================================================
                IList<ScadenzaFattura> scadenzeFattura = new List<ScadenzaFattura>();
                foreach (var scadenzaImporto in scadenze)
                {
                    var scadenza = _daoFactory.GetScadenzaFatturaDao().GetById(scadenzaImporto.Id, false);
                    scadenzeFattura.Add(scadenza);
                    if (scadenza.Stato != StatoSpesaEnum.Pagata && scadenza.Stato != StatoSpesaEnum.ParzialmentePagata && scadenzaImporto.Importo > scadenza.Importo.GetValueOrDefault() - scadenza.ImportoPagato)
                        message += $"L'importo {scadenzaImporto.Importo:c} è superiore al residuo da pagare: {(scadenza.Importo.GetValueOrDefault() - scadenza.ImportoPagato):c}{Environment.NewLine}";
                }

                //==============================================================
                // Verifico se devo impostare automaticamente la detrazione
                //==============================================================
                try
                {
                    if (scadenzeFattura.All(item => item.SpesaRiferimento.Detrazione.GetValueOrDefault() == 36))
                        nota.Detrazione = 36;
                    else if (scadenzeFattura.All(item => item.SpesaRiferimento.Detrazione.GetValueOrDefault() == 55))
                        nota.Detrazione = 55;
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nella impostazione automatica della detrazione per una nota di accredito - {0} - idNota:{1}", ex, Utility.GetMethodDescription(), idNota);
                }

                //==============================================================
                // Cancellazione riscossioni esistenti
                //==============================================================
                IList<Riscossione> riscossioni = nota.Riscossioni.ToList();
                nota.Riscossioni.Clear();
                nota.TestateMovimenti.Clear();
                var movimentiToDelete = new List<int>();
                foreach (var riscossione in riscossioni)
                {
                    riscossione.ScadenzaRiferimento = null;
                    riscossione.SpesaRiferimento = null;

                    // Memorizzazione dei movimenti da cancellare, la cancellazione NON viene eseguita ora
                    // per evitare problemi nella successione degli script eseguiti sul database da NHibernate
                    if (riscossione.MovimentoContabile != null)
                        movimentiToDelete.Add(riscossione.MovimentoContabile.ID);

                    riscossione.MovimentoContabile = null;
                    riscossione.Pagamenti.Clear();
                    _daoFactory.GetRiscossioneDao().Delete(riscossione);
                }

                IList<Pagamento> pagamenti = disposizione.Pagamenti.ToList();
                disposizione.Pagamenti.Clear();
                foreach (var pagamento in pagamenti)
                {
                    pagamento.DisposizioneRiferimento = null;

                    if (pagamento.ScadenzaRiferimento != null)
                        pagamento.ScadenzaRiferimento.Pagamenti.Remove(pagamento);
                    pagamento.ScadenzaRiferimento = null;

                    if (pagamento.NotaStorno != null)
                        pagamento.NotaStorno.Pagamenti.Remove(pagamento);
                    pagamento.NotaStorno = null;

                    pagamento.File = null;
                    pagamento.MovimentoContabile = null;
                    pagamento.MovimentoContabileStorno = null;

                    _daoFactory.GetPagamentoDao().Delete(pagamento);
                }

                //==============================================================
                // Esecuzione
                //==============================================================
                if (string.IsNullOrEmpty(message))
                {
                    foreach (var scadenzaImporto in scadenze)
                    {
                        var scadenza = _daoFactory.GetScadenzaFatturaDao().GetById(scadenzaImporto.Id, false);

                        var pagamento = new Pagamento(scadenza, disposizione, scadenzaImporto.Importo, dataRegistrazione, TipoPagamentoFatturaEnum.Storno)
                        {
                            RitenutaAcconto = new Ritenuta(scadenzaImporto.ImportoRitenuta) { Stato = StatoRitenutaEnum.Stornata },
                            Stato = StatoSpesaEnum.Pagata
                        };
                        _daoFactory.GetPagamentoDao().SaveOrUpdate(pagamento);

                        var riscossione = new Riscossione(nota, scadenzaImporto.Importo);
                        _daoFactory.GetRiscossioneDao().SaveOrUpdate(riscossione);
                        riscossione.ImportoRitenuta = (scadenza.ImportoRitenuta * scadenzaImporto.Importo) / scadenza.Importo;
                        riscossione.DataRitenuta = dataRegistrazione;
                        riscossione.Pagamenti.Add(pagamento);
                        riscossione.ScadenzaRiferimento = scadenza;

                        pagamento.NotaStorno = riscossione;
                        riscossione.MovimentoContabile = _movimentiContabilitaService.SetMovimentiStornoScadenza(dettaglioSpesa, scadenza, scadenzaImporto.Importo + scadenzaImporto.ImportoRitenuta, esercizio, dataRegistrazione);
                        riscossione.MovimentoContabile.Testata.SpesaRiferimento = nota;
                        nota.TestateMovimenti.Add(riscossione.MovimentoContabile.Testata);
                        scadenza.SetStato();

                        if (scadenza.Stato == StatoSpesaEnum.Pagata)
                            scadenza.Stato = StatoSpesaEnum.Stornata;
                    }

                    // Cancellazione dei movimenti precedentemente individuati, la cancellazione viene eseguita solo ora
                    // per evitare problemi nella successione degli script eseguiti sul database da NHibernate
                    foreach (var idMovimentoContabile in movimentiToDelete)
                        _movimentiContabilitaService.DeleteMovimento(idMovimentoContabile);
                }

                return message;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nello storno di una fattura - {0} - idNota:{1}", ex, Utility.GetMethodDescription(), idNota);
                throw;
            }
        }
예제 #7
0
        public TestataMovimentoContabile SetMovimentiRitenuta(Pagamento pagamento, Ritenuta ritenuta, Conto contoPatrimoniale, int? idSottoConto, DateTime dataRegistrazione, string descrizione, string descrizioneAddebitoInteressi, string descrizioneAddebitoSanzioni, decimal? importo)
        {
            var esercizio = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(pagamento.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento, dataRegistrazione);
            if (esercizio == null || esercizio.Stato == StatoEsercizioEnum.Chiuso)
            {
                throw new InvalidDataException(string.Format("La data di registrazione {0:d} del versamento della ritenuta per {1:c} non è valida per il condominio:'{2}' perchè non è stato trovato un esercizio aperto di competenza", dataRegistrazione, ritenuta.Importo, pagamento.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DisplayName));
            }

            var message = IsAllowDataRegistrazione(new List<int> { esercizio.CondominioRiferimento.ID }, esercizio, dataRegistrazione);
            if (message.Count == 0)
            {
                var numeroRiga = 0;
                var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("VR");

                var importoRitenuta = ritenuta.Importo.GetValueOrDefault();
                if (importo != null)
                    importoRitenuta = importo.Value;
                importoRitenuta = Math.Round(importoRitenuta, 2);

                // ------------------------------------------------
                // Testata
                // ------------------------------------------------
                var testata = new TestataMovimentoContabile(esercizio, dataRegistrazione, TipoTestataMovimentoContabileEnum.Automatica, null) { SpesaRiferimento = pagamento.ScadenzaRiferimento.SpesaRiferimento };
                _daoFactory.GetTestataMovimentoContabileDao().SaveOrUpdate(testata);

                var contoRitenuta = _daoFactory.GetContoDao().GetByCodice(esercizio.ID, esercizio.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoRitenuta());

                var spesa = pagamento.ScadenzaRiferimento.SpesaRiferimento;
                var firstDettaglio = spesa.Dettagli.FirstOrDefault();
                TestataMovimentoContabile testataFattura = null;
                if (firstDettaglio != null)
                {
                    var firstMovimento = firstDettaglio.Movimenti.FirstOrDefault();
                    if (firstMovimento != null)
                        testataFattura = firstMovimento.Testata;
                }

                // ------------------------------------------------
                // Interessi per Ravvedimento Operoso
                // ------------------------------------------------
                if (ritenuta.ImportoInteressi > 0)
                {
                    if (testataFattura != null && !testataFattura.AperturaBilancio)
                    {
                        foreach (var dettaglio in spesa.Dettagli)
                        {
                            if (dettaglio.Movimenti.Count > 0)
                            {

                                foreach (var movimento in dettaglio.Movimenti)
                                {
                                    var importoMovimento = movimento.GetImportoConSegno().GetValueOrDefault();
                                    if (movimento.ContoRiferimento.Tipo == TipoContoEconomicoEnum.Patrimoniale)
                                        importoMovimento = importoMovimento * -1;

                                    numeroRiga++;
                                    var interesseCompetenza = ritenuta.ImportoInteressi.GetValueOrDefault();
                                    if (spesa.ImportoLordo != 0)
                                        interesseCompetenza = (ritenuta.ImportoInteressi.GetValueOrDefault() * importoMovimento) / spesa.ImportoLordo;
                                    var movimentoInteresse = new MovimentoContabile(testata, causale, numeroRiga, movimento.ContoRiferimento, interesseCompetenza, "D")
                                    {
                                        SottoContoRiferimento = movimento.SottoContoRiferimento,
                                        FornitoreRiferimento = movimento.FornitoreRiferimento
                                    };

                                    if (!string.IsNullOrEmpty(descrizioneAddebitoInteressi))
                                        movimentoInteresse.Descrizione = descrizioneAddebitoInteressi.Replace("<DescrizioneSpesa>", movimento.GetDescrizione());

                                    _ripartizioneService.CloneRipartizioneByMovimento(movimentoInteresse, movimento);

                                    _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoInteresse);
                                }
                            }
                            else
                            {
                                numeroRiga++;
                                var movimentoInteresse = new MovimentoContabile(testata, causale, numeroRiga, contoRitenuta, ritenuta.ImportoInteressi, "D")
                                {
                                    FornitoreRiferimento = spesa.FornitoreRiferimento,
                                    Descrizione = "Interesse versamento ritenuta"
                                };

                                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoInteresse);
                            }

                        }                        
                    }
                    else
                    {
                        numeroRiga++;
                        var sottoContoInteressiSanzioni = _daoFactory.GetSottoContoDao().GetInteressiSanzioniByEsercizio(testata.EsercizioRiferimento.ID, testata.EsercizioRiferimento.CondominioRiferimento.ID);
                        if (sottoContoInteressiSanzioni != null)
                        {
                            var movimentoInteresse = new MovimentoContabile(testata, causale, numeroRiga, sottoContoInteressiSanzioni.ContoRiferimento, ritenuta.ImportoInteressi, "D")
                            {
                                SottoContoRiferimento = sottoContoInteressiSanzioni,
                                FornitoreRiferimento = spesa.FornitoreRiferimento,
                                Descrizione = "Interesse versamento ritenuta"
                            };

                            _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoInteresse);
                        }
                        else
                        {
                            ritenuta.ImportoInteressi = 0;
                        }
                        
                    }

                }

                // ------------------------------------------------
                // Sanzione per Ravvedimento Operoso
                // ------------------------------------------------
                if (ritenuta.ImportoSanzione > 0)
                {
                    if (testataFattura != null && !testataFattura.AperturaBilancio)
                    {
                        foreach (var dettaglio in spesa.Dettagli)
                        {
                            if (dettaglio.Movimenti.Count > 0)
                            {

                                foreach (var movimento in dettaglio.Movimenti)
                                {
                                    var importoMovimento = movimento.GetImportoConSegno().GetValueOrDefault();
                                    if (movimento.ContoRiferimento.Tipo == TipoContoEconomicoEnum.Patrimoniale)
                                        importoMovimento = importoMovimento*-1;

                                    numeroRiga++;
                                    var sanzioneCompetenza = ritenuta.ImportoSanzione.GetValueOrDefault();
                                    if (spesa.ImportoLordo != 0)
                                        sanzioneCompetenza = (ritenuta.ImportoSanzione.GetValueOrDefault()*
                                                              importoMovimento)/spesa.ImportoLordo;
                                    var movimentoSanzione = new MovimentoContabile(testata, causale, numeroRiga,
                                        movimento.ContoRiferimento, sanzioneCompetenza, "D")
                                    {
                                        SottoContoRiferimento = movimento.SottoContoRiferimento,
                                        FornitoreRiferimento = movimento.FornitoreRiferimento
                                    };

                                    if (!string.IsNullOrEmpty(descrizioneAddebitoSanzioni))
                                        movimentoSanzione.Descrizione = descrizioneAddebitoSanzioni.Replace("<DescrizioneSpesa>", movimento.GetDescrizione());

                                    _ripartizioneService.CloneRipartizioneByMovimento(movimentoSanzione, movimento);

                                    _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoSanzione);
                                }
                            }
                            else
                            {
                                numeroRiga++;
                                var movimentoSanzione = new MovimentoContabile(testata, causale, numeroRiga, contoRitenuta, ritenuta.ImportoSanzione, "D")
                                {
                                    FornitoreRiferimento = spesa.FornitoreRiferimento,
                                    Descrizione = "Sanzione versamento ritenuta"
                                };

                                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoSanzione);
                            }
                        }
                    }
                    else
                    {
                        numeroRiga++;
                        var sottoContoInteressiSanzioni = _daoFactory.GetSottoContoDao().GetInteressiSanzioniByEsercizio(testata.EsercizioRiferimento.ID, testata.EsercizioRiferimento.CondominioRiferimento.ID);
                        if (sottoContoInteressiSanzioni != null)
                        {
                            var movimentoSanzione = new MovimentoContabile(testata, causale, numeroRiga, sottoContoInteressiSanzioni.ContoRiferimento, ritenuta.ImportoSanzione, "D")
                            {
                                SottoContoRiferimento = sottoContoInteressiSanzioni,
                                FornitoreRiferimento = spesa.FornitoreRiferimento,
                                Descrizione = "Sanzione versamento ritenuta"
                            };

                            _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoSanzione);
                        }
                        else
                        {
                            ritenuta.ImportoSanzione = 0;
                        }
                    }
                }

                // ------------------------------------------------
                // Ritenuta
                // ------------------------------------------------
                numeroRiga++;
                var movimentoPatrimoniale = new MovimentoContabile(testata, causale, numeroRiga, contoRitenuta, importoRitenuta, "D")
                {
                    FornitoreRiferimento = pagamento.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento,
                    Descrizione = "Ritenuta " + pagamento.GetDescrizione()
                };
                if (!string.IsNullOrEmpty(descrizione))
                    movimentoPatrimoniale.Descrizione += " - " + descrizione;
                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoPatrimoniale);

                // ------------------------------------------------
                // Conto Patrimoniale
                // ------------------------------------------------
                numeroRiga++;

                var movimentoBancario = new MovimentoContabile(testata, causale, numeroRiga, contoPatrimoniale, importoRitenuta + ritenuta.ImportoInteressi.GetValueOrDefault() + ritenuta.ImportoSanzione.GetValueOrDefault(), "A")
                {
                    FornitoreRiferimento = movimentoPatrimoniale.FornitoreRiferimento,
                    Descrizione = movimentoPatrimoniale.Descrizione
                };
                _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoBancario);

                if (idSottoConto != null)
                {
                    if (idSottoConto > 0)
                        movimentoBancario.SottoContoRiferimento = _daoFactory.GetSottoContoDao().GetById(idSottoConto.Value, false);
                    if (idSottoConto < 0)
                        movimentoBancario.ContoCorrenteBancario = _daoFactory.GetDatiBancariCondominiDao().GetById(idSottoConto.Value*-1, false);
                }

                if (contoPatrimoniale.Codice == _pianoContiService.GetCodiceContoBancario() &&
                    movimentoBancario.ContoCorrenteBancario == null)
                    movimentoBancario.ContoCorrenteBancario = esercizio.CondominioRiferimento.DatiBancariPrincipale;

                testata.Descrizione = movimentoPatrimoniale.Descrizione;
                ritenuta.MovimentoContabilePagamento = movimentoBancario;

                return testata;
            }

            var ex = new InvalidDataException(string.Format("La data di registrazione {0} non è valida", dataRegistrazione));
            
            _log.FatalFormat("Data di registrazione non valida - {0} - data:{1} - pagamento:{2} - conto:{3}", ex, Utility.GetMethodDescription(), dataRegistrazione, pagamento.ID, contoPatrimoniale.ID);
            throw ex;
        }
예제 #8
0
        private CBICreditTransferTransactionInformation getCreditTransferTransactionInfo(Pagamento pagamento, int index)
        {
            var debitore = pagamento.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento;
            var creditInfo = new CBICreditTransferTransactionInformation
            {
                PaymentId = new PaymentIdentification1
                {
                    InstructionId = index.ToString(),
                    EndToEndId = pagamento.ID.ToString()
                },
                Amount = new CBIAmountType1
                {
                    InstructedAmount = new ActiveOrHistoricCurrencyAndAmount
                    {
                        Currency = "EUR",
                        Value = pagamento.Importo.GetValueOrDefault()
                    }
                },
                Creditor = getCreditor(debitore),
                CreditorAccount = new CBICashAccount2
                {
                    Id = new CBIAccountIdentification1 {IBAN = debitore.PersonaRiferimento.Iban}
                },
                PaymentTypeInfo = new CBIPaymentTypeInformation2
                {
                    CategoryPurpose = new CategoryPurpose1Choice {Code = "SUPP"}
                },
                RemittanceInformation = new RemittanceInformation5
                {
                    Unstructured = new List<string> {pagamento.GetDescrizione().TrimForSepa() }
                },
                RelatedRemittanceInformation = new List<CBIRemittanceLocation1>
                {
                    new CBIRemittanceLocation1 {RmtId = pagamento.ID.ToString()}
                }
            };
            
            //creditInfo.ServiceInformation = CBISrvInf1.ESBEN;
            //creditInfo.DestCdtrRsp = new CBIPartyIdentification5();
            //creditInfo.DestCdtrRsp.Name = _disposizione.Azienda.Descrizione;
            //creditInfo.DestCdtrRsp.Id = new CBIIdType3();
            //creditInfo.DestCdtrRsp.Id.OrganisationId = new CBIOrganisationIdentification4();
            //creditInfo.DestCdtrRsp.Id.OrganisationId.Othr = new CBIGenericIdentification2();
            //creditInfo.DestCdtrRsp.Id.OrganisationId.Othr.Id = _disposizione.Azienda.CodiceCUC;
            //creditInfo.DestCdtrRsp.Id.OrganisationId.Othr.Issr = "CBI";

            //creditInfo.PaymentTypeInfo.CategoryPurpose.Item = "SUPP";
            //creditInfo.PaymentTypeInfo.CategoryPurpose.ItemElementName = ItemChoiceType.Cd;

            return creditInfo;
        }
예제 #9
0
        private void writeMovimento10(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 10");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // filler
            sb.Append(string.Empty.PadLeft(6));

            // data esecuzione bonifico
            sb.Append(convertData(DateTime.Today));
            
            // data valuta
//            sb.Append(convertData(pag.Valuta.Value));
            // La valuta è ora decisa dalla banca quindi il campo non viene più valorizzato
            sb.Append(string.Empty.PadLeft(6));
            
            // causale
            sb.Append("48000");

            // importo
            sb.Append(Math.Round(pag.Importo.GetValueOrDefault() * 100, 0).ToString().PadLeft(13, '0'));

            // segno
            sb.Append("+");

            // --------------------------------------------------------------------
            // Coordinate banca ordinante (banca del condominio)
            // --------------------------------------------------------------------
            var contoCorrente = pag.ContoCorrenteBancario ?? pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DatiBancariPrincipale;

            // ABI
            sb.Append(contoCorrente.Abi.PadLeft(5, '0'));

            // CAB
            sb.Append(contoCorrente.Cab.PadLeft(5, '0'));

            // Conto Corrente
            var contoCorrenteValue = contoCorrente.ContoCorrente;
            if (!string.IsNullOrEmpty(contoCorrenteValue) && contoCorrenteValue.Length > 12)
                contoCorrenteValue = contoCorrenteValue.Substring(0, 12);
            sb.Append(contoCorrenteValue.PadLeft(12, '0'));

            // --------------------------------------------------------------------
            // Coordinate banca destinataria (banca del fornitore)
            // --------------------------------------------------------------------

            // ABI
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Abi.PadLeft(5, '0'));

            // CAB
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Cab.PadLeft(5, '0'));

            // Conto Corrente
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.ContoCorrente.PadLeft(12, '0'));

            // --------------------------------------------------------------------
            // Coordinate azienda ordinante (condominio)
            // --------------------------------------------------------------------

            // Codice SIA
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.CodiceSIA.PadLeft(5, '0'));

            // Tipo codice
            sb.Append("3");

            // Codice Fiscale del beneficiario (Fornitore)
            string codiceFiscaleFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.PartitaIva;
            if(string.IsNullOrEmpty(codiceFiscaleFornitore) && !string.IsNullOrEmpty(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale))
                codiceFiscaleFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale;
            if (!string.IsNullOrEmpty(codiceFiscaleFornitore) && codiceFiscaleFornitore.Length > 16)
                codiceFiscaleFornitore = codiceFiscaleFornitore.Substring(0, 16);
            if (string.IsNullOrEmpty(codiceFiscaleFornitore))
                codiceFiscaleFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.ID.ToString();
            sb.Append(codiceFiscaleFornitore.PadRight(16, ' '));

            // Modilità pagamento
            sb.Append("1");

            // filler
            sb.Append(string.Empty.PadLeft(5));

            // divisa
            sb.Append("E");

            sw.WriteLine(sb.ToString());
        }
예제 #10
0
        private PagamentoSpesaDTO setSpesaDto(Pagamento item)
        {
            try
            {
                var dto = new PagamentoSpesaDTO
                {
                    ID = item.ID,
                    Data = item.Data,
                    CodiceConfermaBonifico = item.CodiceConfermaBonifico,
                    Importo = item.Importo,
                    StatoPagamento = item.Stato,
                    Valuta = item.Valuta,
                    Tipo = item.Tipo,
                    Version = item.Version,
                    IdScadenzaFattura = item.ScadenzaRiferimento.ID
                };

                if (item.DisposizioneRiferimento != null)
                {
                    dto.DescrizioneDisposizioneRiferimento = item.DisposizioneRiferimento.Descrizione;
                    dto.IdDisposizioneRiferimento = item.DisposizioneRiferimento.ID;
                }
                if (item.TipoCodiceConfermaBonifico != TipoCodiceEsitoDisposizioneBonifico.Undefined)
                    dto.TipoCodiceConfermaBonifico = item.TipoCodiceConfermaBonifico;

                if (item.MovimentoContabile != null)
                {
                    dto.Conto = item.MovimentoContabile.ContoRiferimento.Descrizione;
                    if (item.MovimentoContabile.SottoContoRiferimento != null)
                        dto.SottoConto = item.MovimentoContabile.SottoContoRiferimento.GetDescrizione(item.MovimentoContabile.Testata.EsercizioRiferimento, null, item.MovimentoContabile);
                    else if (item.MovimentoContabile.ContoCorrenteBancario != null)
                        dto.SottoConto = item.MovimentoContabile.ContoCorrenteBancario.DisplayName;
                }

                if (item.RitenutaAcconto != null)
                {
                    dto.ImportoRitenuta = item.RitenutaAcconto.Importo;
                    dto.StatoRitenuta = item.RitenutaAcconto.Stato;
                    if (item.RitenutaAcconto.TestataRiferimento != null)
                        dto.DataPagamentoRitenuta = item.RitenutaAcconto.TestataRiferimento.Data;
                }

                return dto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella creazione dell'istanza DTO - {0} - id:{1}", ex, Library.Utility.GetMethodDescription(), item.ID);
                throw;
            }
        }
예제 #11
0
        private string getDisposizioneUniqueId(Pagamento pagamento)
        {
            try
            {
                return $"{pagamento.DisposizioneRiferimento.ID}+{pagamento.ContoCorrenteBancario.ID:000000000}+{DateTime.Now:yyyy-MM-dd-HHmm}";
            }
            catch (Exception ex)
            {
                var disposizione = string.Empty;
                if (pagamento?.DisposizioneRiferimento != null)
                    disposizione = pagamento.DisposizioneRiferimento.ID.ToString();

                var contoCorrente = string.Empty;
                if (pagamento?.ContoCorrenteBancario != null)
                    contoCorrente = pagamento.ContoCorrenteBancario.ID.ToString();

                _log.ErrorFormat("Errore nell'identificazione del pagamento - {0} - pagamento:{1} - disposizione:{2} - contoCorrente:{3}", ex, Library.Utility.GetMethodDescription(), pagamento?.ID.ToString() ?? "<NULL>", disposizione, contoCorrente);
                throw;
            }
        }
예제 #12
0
        private PagamentoDTO setDto(Pagamento item)
        {
            try
            {
                if (item != null)
                {
                    var dto = new PagamentoDTO
                    {
                        ID = item.ID,
                        Data = item.Data,
                        IdScadenzaFattura = item.ScadenzaRiferimento.ID,
                        IdFattura = item.ScadenzaRiferimento.SpesaRiferimento.ID,
                        IdentificativoArchiviazione = getArchiviazioneOtticaService().GetIdentificativoArchiviazione(item.ScadenzaRiferimento.SpesaRiferimento),
                        Importo = item.Importo,
                        StatoSpesa = item.ScadenzaRiferimento.SpesaRiferimento.Stato,
                        TipoDocumentoSpesa = Library.Decodifica.Instance.GetElement("TipoDocumentoContabile", item.ScadenzaRiferimento.SpesaRiferimento.TipoDocumento).Descrizione,
                        CodiceEsercizioSpesa = item.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID,
                        StatoPagamento = item.Stato,
                        Valuta = item.Valuta,
                        CodiceConfermaBonifico = item.CodiceConfermaBonifico,
                        Tipo = item.Tipo,
                        Version = item.Version
                    };

                    if (item.TipoCodiceConfermaBonifico != TipoCodiceEsitoDisposizioneBonifico.Undefined)
                        dto.TipoCodiceConfermaBonifico = item.TipoCodiceConfermaBonifico;

                    if (item.DisposizioneRiferimento != null)
                    {
                        dto.DescrizioneDisposizioneRiferimento = item.DisposizioneRiferimento.Descrizione;
                        dto.IdDisposizioneRiferimento = item.DisposizioneRiferimento.ID;
                    }

                    if (item.MovimentoContabile != null)
                    {
                        dto.CodiceMovimentoPagamentoFattura = item.MovimentoContabile.ID;
                        dto.CodiceTestataMovimentoPagamentoFattura = item.MovimentoContabile.Testata.ID;
                        dto.Conto = item.MovimentoContabile.ContoRiferimento.Descrizione;
                        if (item.MovimentoContabile.SottoContoRiferimento != null)
                            dto.SottoConto = item.MovimentoContabile.SottoContoRiferimento.GetDescrizione(item.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento, null, item.MovimentoContabile);
                        else if (item.MovimentoContabile.ContoRiferimento.Codice == getPianoContiService().GetCodiceContoBancario() && item.MovimentoContabile.ContoCorrenteBancario != null)
                            dto.SottoConto = item.MovimentoContabile.ContoCorrenteBancario.DisplayName;
                    }

                    if (item.RitenutaAcconto != null)
                    {
                        dto.ImportoRitenuta = item.RitenutaAcconto.Importo;
                        dto.StatoRitenuta = item.RitenutaAcconto.Stato;
                        if (item.RitenutaAcconto.TestataRiferimento != null)
                            dto.DataPagamentoRitenuta = item.RitenutaAcconto.TestataRiferimento.Data;
                        if (item.RitenutaAcconto.MovimentoContabilePagamento != null)
                        {
                            dto.CodiceMovimentoPagamentoRitenuta = item.RitenutaAcconto.MovimentoContabilePagamento.ID;
                            dto.CodiceTestataMovimentoPagamentoRitenuta = item.RitenutaAcconto.MovimentoContabilePagamento.Testata.ID;
                        }
                    }

                    if (item.ScadenzaRiferimento.SpesaRiferimento != null)
                    {
                        dto.DescrizioneCondominio = item.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DisplayName;
                        dto.DescrizioneFornitore = item.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.DisplayName;
                        dto.NumeroDocumento = item.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento;
                        dto.DataDocumento = item.ScadenzaRiferimento.SpesaRiferimento.DataDocumento;

                        var detrazione = string.Empty;
                        if (item.ScadenzaRiferimento.SpesaRiferimento.Detrazione.GetValueOrDefault() == 36)
                            detrazione = item.Data <= new DateTime(2012, 6, 25)
                                             ? "36 - Ristr.Edilizia"
                                             : "50% - Ristr.Edilizia";
                        else if (item.ScadenzaRiferimento.SpesaRiferimento.Detrazione.GetValueOrDefault() == 55)
                            detrazione = "55% - Riqual.Energetica";
                        dto.Detrazione = detrazione;
                    }

                    return dto;
                }
                return null;
            }
            catch (Exception ex)
            {
                
                var idStr = string.Empty;
                if (item != null)
                    idStr = item.ID.ToString(CultureInfo.InvariantCulture);
                _log.ErrorFormat("Errore nella creazione dell'istanza DTO - {0} - id:{1}", ex, Library.Utility.GetMethodDescription(), idStr);
                throw;
            }
        }
예제 #13
0
 public PagamentoDTO GetByDomainEntity(Pagamento item)
 {
     try
     {
         return setDto(item);
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nel caricamento dei pagamenti delle Fatture/Spese - {0} - id:{1}", ex, Library.Utility.GetMethodDescription(), item.ID);
         throw;
     }
 }
예제 #14
0
파일: Pagamento.cs 프로젝트: gipasoft/Sfera
        public virtual IUpdatableBusinessEntity Copy()
        {
            Pagamento pagamento = new Pagamento(ScadenzaRiferimento, DisposizioneRiferimento, null, Data, Tipo);

            return pagamento;
        }
예제 #15
0
        private List<DatiCertificazioneDTO> setDatiCertificazione(List<DatiCertificazioneDTO> dati, Pagamento pag, DateTime? dataPagamentoRitenuta, int anno, bool esenteRegimeMinimo)
        {
            if (pag.RitenutaAcconto != null && (pag.RitenutaAcconto.Importo.GetValueOrDefault() != 0 || esenteRegimeMinimo))
            {
                var datiCertificazione = (from item in dati
                                            where item.IdCondominio == pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID &&
                                            item.IdFornitore == pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.ID
                                            select item).SingleOrDefault();
                if (datiCertificazione == null)
                {
                    datiCertificazione = new DatiCertificazioneDTO
                    {
                        DescrizioneFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.DisplayName,
                        IdFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.ID,
                        IdPersona = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.ID,
                        CodiceCondominio = pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Codice,
                        IdCondominio = pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID,
                        DescrizioneCondominio = pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Descrizione,
                        CodiceFiscaleCondominio = pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale,
                        CodiceFiscaleFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale,
                        PartitaIvaFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.PartitaIva,
                        EsenteRegimeMinimo = esenteRegimeMinimo
                    };

                    var contatti = new ContattoCollection(pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Contatti);
                    var contattoEmail = contatti.GetFirstContatto<Email>();
                    if (contattoEmail != null)
                        datiCertificazione.Email = contattoEmail.Valore;
                    var contattoEmailCertificato = contatti.GetFirstContatto<EmailCertificata>();
                    if(contattoEmailCertificato != null)
                        datiCertificazione.EmailCertificata = contattoEmailCertificato.Valore;
                    var contattoFax = contatti.GetFirstContatto<Fax>();
                    if (contattoFax != null)
                        datiCertificazione.Fax = contattoFax.Valore;
                    var contattoCellulare = contatti.GetFirstContatto<Cellulare>();
                    if (contattoCellulare != null)
                        datiCertificazione.Cellulare = contattoCellulare.Valore;

                    if (pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza != null)
                    {
                        var indirizzo = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.DisplayNameArray;
                        datiCertificazione.IndirizzoFornitore = indirizzo[0];
                        datiCertificazione.SecondaRigaIndirizzoFornitore = indirizzo[1];
                        datiCertificazione.CapFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Cap;
                        if (pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Comune != null)
                            datiCertificazione.ComuneFornitore = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Comune.Descrizione;
                    }

                    if (pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo != null)
                    {
                        var indirizzo = pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo.DisplayNameArray;
                        datiCertificazione.IndirizzoCondominio = indirizzo[0];
                        datiCertificazione.SecondaRigaIndirizzoCondominio = indirizzo[1];
                    }

                    datiCertificazione.Dettaglio = new List<DettaglioDatiCertificazioneDTO>();

                    dati.Add(datiCertificazione);
                }

                // ========================================================
                //  Dettagli della certificazione
                // ========================================================
                var dettaglioDatiCertificazione = new DettaglioDatiCertificazioneDTO
                {
                    IdCondominio = datiCertificazione.IdCondominio,
                    IdFornitore = datiCertificazione.IdFornitore,
                    CodiceTributo = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.CodiceTributo,
                    DataFattura = pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.GetValueOrDefault(),
                    NumeroFattura = pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento,
                    DataPagamentoFattura = pag.Data.GetValueOrDefault(),
                    DataPagamentoRitenuta = dataPagamentoRitenuta,
                    IdFattura = pag.ScadenzaRiferimento.SpesaRiferimento.ID,
                    ImportoIva = pag.ScadenzaRiferimento.SpesaRiferimento.ImportoIva,
                    ImportoImponibile = pag.ScadenzaRiferimento.SpesaRiferimento.Imponibile,
                    ImportoRitenuta = pag.RitenutaAcconto.Importo.GetValueOrDefault(),
                    PercentualeRitenuta = pag.ScadenzaRiferimento.SpesaRiferimento.AliquotaRitenuta.GetValueOrDefault() * 100,
                    CompensiSoggetti = esenteRegimeMinimo ? 0m : pag.ScadenzaRiferimento.SpesaRiferimento.GetImponibileRitenuta(),
                    CompensiNonSoggetti = esenteRegimeMinimo ? pag.ScadenzaRiferimento.SpesaRiferimento.GetImponibileRitenuta() : pag.ScadenzaRiferimento.SpesaRiferimento.AltreSpese.GetValueOrDefault(),
                    AltreSpeseNonSoggette = pag.ScadenzaRiferimento.SpesaRiferimento.SpeseEsentiRitenuta.GetValueOrDefault(),
                    ImportoTotale = pag.ScadenzaRiferimento.SpesaRiferimento.ImportoLordo,
                    ImportoPagato = pag.Importo.GetValueOrDefault()
                };

                // In casi di pagamento parziale
                if (pag.ScadenzaRiferimento.SpesaRiferimento.ImportoLordo - pag.ScadenzaRiferimento.SpesaRiferimento.ImportoRitenuta.GetValueOrDefault() != pag.Importo)
                {
                    var percentualePagata = 1m;

                    // Nel caso in cui l'importo lordo corrisponde con la ritenuta siamo nel caso di fattura da bilancio di apertura inserita in modo non corretto bugid#7583
                    var denominatore = pag.ScadenzaRiferimento.SpesaRiferimento.ImportoLordo;

                    // Nel caso di fattura inserita in bilancio d'apertura con conto "Ritenuta Fiscale" non devo sottrarre l'importo della ritenuta bugid#9391
                    if (pag.ScadenzaRiferimento.SpesaRiferimento.TipoDocumento.ToUpper() != "FATBILAPP" || pag.ScadenzaRiferimento.SpesaRiferimento.MovimentiBollette.FirstOrDefault() == null || pag.ScadenzaRiferimento.SpesaRiferimento.MovimentiBollette.FirstOrDefault().ContoRiferimento.Codice != "904")
                        denominatore -= pag.ScadenzaRiferimento.SpesaRiferimento.ImportoRitenuta.GetValueOrDefault();

                    if (denominatore != 0)
                        percentualePagata = pag.Importo.GetValueOrDefault() / denominatore;

                    dettaglioDatiCertificazione.ImportoTotale = dettaglioDatiCertificazione.ImportoTotale * percentualePagata;
                    dettaglioDatiCertificazione.CompensiSoggetti = dettaglioDatiCertificazione.CompensiSoggetti * percentualePagata;
                    dettaglioDatiCertificazione.CompensiNonSoggetti = dettaglioDatiCertificazione.CompensiNonSoggetti * percentualePagata;
                    dettaglioDatiCertificazione.ImportoIva = dettaglioDatiCertificazione.ImportoIva * percentualePagata;
                    dettaglioDatiCertificazione.ImportoImponibile = dettaglioDatiCertificazione.ImportoImponibile * percentualePagata;

                    dettaglioDatiCertificazione.AltreSpeseNonSoggette = dettaglioDatiCertificazione.AltreSpeseNonSoggette*percentualePagata;
                }

                // Per le fatture da bilancio di apertura il campo AltreSpeseEsenti viene usato come: SpeseEsentiRitenuta perchè il campo SpeseEsentiRitenuta non è presente
                // occorre quindi sottrarre il valore di tale campo per i CompensiSoggetti bugid#4139
                if (pag.ScadenzaRiferimento.SpesaRiferimento.TipoDocumento == "FATBILAPP")
                {
                    dettaglioDatiCertificazione.CompensiSoggetti -= pag.ScadenzaRiferimento.SpesaRiferimento.AltreSpeseEsenti.GetValueOrDefault();
                }

                datiCertificazione.Dettaglio.Add(dettaglioDatiCertificazione);
            }

            return dati;
        }
예제 #16
0
        private void writeMovimento16(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 16");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // --------------------------------------------------------------------
            // Coordinate banca ordinante (banca del condominio)
            // --------------------------------------------------------------------
            var contoCorrente = pag.ContoCorrenteBancario ?? pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DatiBancariPrincipale;
            var coord = new Library.BusinessData.CoordinateBancarie
            {
                Abi = contoCorrente.Abi,
                Cab = contoCorrente.Cab,
                ContoCorrente = contoCorrente.ContoCorrente
            };

            // Codice Paese
            sb.Append("IT");

            // CheckDigit IBAN
            sb.Append(coord.CalcolaCheckIBAN());

            // CIN
            sb.Append(coord.CalcolaCin());

            // ABI
            sb.Append(coord.Abi);

            // CAB
            sb.Append(coord.Cab);

            // Conto Corrente
            sb.Append(coord.ContoCorrente);

            // filler
            sb.Append(string.Empty.PadLeft(83));

            sw.WriteLine(sb.ToString());
        }
예제 #17
0
 private string getKeyOrdine(Pagamento pagamento)
 {
     var key = pagamento.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.CodiceTributo + "¥";
     key += pagamento.Data.GetValueOrDefault().Year + pagamento.Data.GetValueOrDefault().Month.ToString().PadLeft(2, '0');
     return key;
 }
예제 #18
0
        private void writeMovimento17(Pagamento pag, StreamWriter sw, int numeroDisposizione)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 17");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // --------------------------------------------------------------------
            // Coordinate bancarie beneficiario (banca del fornitore)
            // --------------------------------------------------------------------
            var coord = new Library.BusinessData.CoordinateBancarie
            {
                Abi = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Abi,
                Cab = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.Cab,
                ContoCorrente = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.PersonaRiferimento.ContoCorrente
            };

            // Codice Paese
            sb.Append("IT");

            // CheckDigit IBAN
            sb.Append(coord.CalcolaCheckIBAN());

            // CIN
            sb.Append(coord.CalcolaCin());

            // ABI
            sb.Append(coord.Abi);

            // CAB
            sb.Append(coord.Cab);

            // Conto Corrente
            sb.Append(coord.ContoCorrente);

            // filler
            sb.Append(string.Empty.PadLeft(83));

            sw.WriteLine(sb.ToString());
        }
예제 #19
0
        private void createPagamenti(Disposizione disposizione, IList<DisposizionePagamentoDTO> lista, StatoSpesaEnum stato, DataPagamentoEnum tipoDataPagamento, TipoPagamentoFatturaEnum tipo, IList<ScadenzaFattura> scadenze)
        {
            try
            {
                var index = 0;
                foreach (var disposizionePagamento in lista)
                {
                    DateTime? dataPagamento = null;
                    try
                    {
                        if (disposizionePagamento.ImportoPagamento > 0 || disposizionePagamento.ImportoAutorizzato > 0)
                        {
                            var scadenza = _daoFactory.GetScadenzaFatturaDao().Find(disposizionePagamento.IdScadenza.Value, false);
                            if (scadenza == null && scadenze != null && lista.Count == scadenze.Count)
                                scadenza = scadenze[index];

                            scadenza.ImportoAutorizzato = disposizionePagamento.ImportoAutorizzato;
                            if (disposizionePagamento.PagamentoCompletoRitenuta)
                                scadenza.PagamentoCompletoRitenuta = true;
                            var importoRitenutaResiduo = scadenza.GetImportoRitenutaResiduo();

                            // Calcolo la data di pagamento
                            switch (tipoDataPagamento)
                            {
                                case DataPagamentoEnum.Today:
                                    dataPagamento = DateTime.Today;
                                    break;
                                case DataPagamentoEnum.Scadenza:
                                    dataPagamento = disposizionePagamento.DataScadenza;
                                    break;
                                case DataPagamentoEnum.Custom:
                                    dataPagamento = disposizionePagamento.DataPagamento;
                                    break;
                                case DataPagamentoEnum.Undefined:
                                    dataPagamento = null;
                                    break;
                                default:
                                    dataPagamento = DateTime.Today;
                                    break;
                            }

                            var pag = _daoFactory.GetPagamentoDao().Find(disposizionePagamento.IdPagamento.GetValueOrDefault(), false) ?? new Pagamento(scadenza, disposizione, disposizionePagamento.ImportoAutorizzato, dataPagamento, tipo);

                            // ==============================================================================================
                            //  Se non viene pagato completamente l'importo autorizzato creo un nuovo pagamento e sottraggo
                            //  dell'importo del pagamento originale l'importo pagato
                            // ==============================================================================================
                            Pagamento pagToUpdate;
                            if (tipo != TipoPagamentoFatturaEnum.Undefined && tipo != TipoPagamentoFatturaEnum.Immediato && pag.Importo > disposizionePagamento.ImportoPagamento)
                            {
                                pag.Importo = pag.Importo - disposizionePagamento.ImportoPagamento;
                                pagToUpdate = new Pagamento(scadenza, disposizione, disposizionePagamento.ImportoPagamento, dataPagamento, tipo);
                            }
                            else
                                pagToUpdate = pag;

                            pagToUpdate.Tipo = tipo;
                            pagToUpdate.Data = dataPagamento;
                            if (disposizione != null)
                            {
                                disposizione.Pagamenti.Add(pagToUpdate);
                                pagToUpdate.DisposizioneRiferimento = disposizione;
                            }

                            pagToUpdate.Stato = stato;
                            pagToUpdate.Valuta = disposizionePagamento.Valuta;

                            // La ritenuta solo se NON di tratta di una spesa con detrazione
                            decimal? importoRitenuta = 0;
                            if (scadenza.SpesaRiferimento.Detrazione.GetValueOrDefault() == 0)
                            {
                                // L'importo della ritenuta se richiesto dall'utente corrisponde all'intero importo se è il primo pagamento
                                if (!scadenza.PagamentoCompletoRitenuta)
                                    importoRitenuta = Common.ContabilitaHelper.GetImportoRitenuta(scadenza.SpesaRiferimento, disposizionePagamento.ImportoPagamento);
                                else
                                    importoRitenuta = scadenza.Pagamenti.Count == 1 ? scadenza.ImportoRitenuta : importoRitenutaResiduo;
                            }
                            pagToUpdate.RitenutaAcconto = new Ritenuta(importoRitenuta);

                            pagToUpdate.NumeroAssegno = disposizionePagamento.NumeroAssegno;

                            if (disposizionePagamento.IdModalitaPagamento > 0)
                                pagToUpdate.ModalitaPagamento = _daoFactory.GetModalitaPagamentoDao().GetById(disposizionePagamento.IdModalitaPagamento.Value, false);

                            if (disposizionePagamento.IdConto != null)
                            {
                                var conto = _daoFactory.GetContoDao().Find(disposizionePagamento.IdConto.Value, false);
                                if (conto != null)
                                    pagToUpdate.Conto = conto;
                                else
                                {
                                    _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - conto:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdConto.GetValueOrDefault());
                                    pagToUpdate.Conto = getDefaultContoPagamento(scadenza.SpesaRiferimento.EsercizioRiferimento);
                                }
                            }
                            if (disposizionePagamento.IdSottoConto != null)
                            {
                                if (disposizionePagamento.IdSottoConto > 0)
                                {
                                    var sottoconto = _daoFactory.GetSottoContoDao().Find(disposizionePagamento.IdSottoConto.Value, false);
                                    if (sottoconto != null)
                                    {
                                        _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - sottoconto:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdSottoConto.GetValueOrDefault());
                                        pagToUpdate.SottoConto = sottoconto;
                                    }
                                }
                                else if (disposizionePagamento.IdSottoConto < 0)
                                {
                                    var contocorrente = _daoFactory.GetDatiBancariCondominiDao().Find(disposizionePagamento.IdSottoConto.Value * -1, false);
                                    if (contocorrente != null)
                                        pagToUpdate.ContoCorrenteBancario = contocorrente;
                                    else
                                    {
                                        _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - idContoCorrente:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdSottoConto.GetValueOrDefault());
                                        pagToUpdate.ContoCorrenteBancario = scadenza.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DatiBancariPrincipale;
                                    }
                                }
                            }

                            // Aggiorno dati scadenza
                            scadenza.Stato = stato;
                            if (stato == StatoSpesaEnum.Pagata)
                            {
                                scadenza.ImportoAutorizzato -= disposizionePagamento.ImportoPagamento;
                                pagToUpdate.Importo = disposizionePagamento.ImportoPagamento;
                                if (scadenza.Importo > scadenza.ImportoPagato)
                                    scadenza.Stato = StatoSpesaEnum.ParzialmentePagata;
                            }
                            scadenza.SpesaRiferimento.SetStato();

                            // Eseguo il pagamento anche della ritenuta
                            var contoRitenuta = _daoFactory.GetContoDao().GetByCodice(scadenza.SpesaRiferimento.EsercizioRiferimento.ID, scadenza.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoBancario());
                            if (disposizionePagamento.DataPagamentoRitenuta != null && pagToUpdate.RitenutaAcconto != null && pagToUpdate.RitenutaAcconto.Importo != 0)
                            {
                                int? idSottoconto = null;
                                if (pagToUpdate.ContoCorrenteBancario != null)
                                    idSottoconto = pagToUpdate.ContoCorrenteBancario.ID * -1;
                                if (Conversione.IsSqlSmallDateTime(disposizionePagamento.DataPagamentoRitenuta.GetValueOrDefault()))
                                    _ritenutaAccontoService.PagamentoRitenuta(pagToUpdate, disposizionePagamento.DataPagamentoRitenuta.Value, contoRitenuta, idSottoconto, disposizione.Descrizione, null, null, null);
                                else
                                {
                                    _log.WarnFormat("La data di pagamento della ritenuta non è corretta - {0} - dataPagamento:{1:d} - conto:{2} - dataPagamentoRitenuta:{3:d} - descrizione:{4}", Utility.GetMethodDescription(), disposizionePagamento.DataPagamentoRitenuta, contoRitenuta.ID, dataPagamento, disposizione.Descrizione);
                                }
                            }
                        }

                        index++;
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nella creazione dei pagamenti immediati - SINGOLA DISPOSIZIONE - {0} - condominio:{1} - dataPagamento:{2} - tipoDataPagamento:{3} - data:{4:d} - documento:{5} - dataDocumento:{6:d}", ex, Utility.GetMethodDescription(), disposizionePagamento.Condominio, dataPagamento, tipoDataPagamento, disposizionePagamento.DataScadenza, disposizionePagamento.NumeroDocumento, disposizionePagamento.DataDocumento);
                        throw;
                    }

                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella creazione dei pagamenti immediati - {0} - disposizione:{1} - data:{2:d} - descrizione:{3} - azienda:{4}", ex, Utility.GetMethodDescription(), disposizione.ID, disposizione.Data, disposizione.Descrizione, disposizione.Azienda.ID);
                throw;
            }
        }
예제 #20
0
        private void writeMovimento20(Pagamento pag, StreamWriter sw, int numeroDisposizione, bool mittenteCondominio)
        {
            var sb = new StringBuilder(120);

            // Tipo Record
            sb.Append(" 20");

            // Numero Disposizione
            sb.Append(numeroDisposizione.ToString().PadLeft(7, '0'));

            // --------------------------------------------------------------------
            // Descrizione azienda ordinante - condominio se mittente è condominio
            // --------------------------------------------------------------------

            // Descrizione condominio
            string descrizioneMittente = Library.Conversione.ToInvioTelematico(mittenteCondominio ? pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Descrizione : pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.Descrizione);

            if (descrizioneMittente.Length > 30)
                descrizioneMittente = descrizioneMittente.Substring(0, 30);
            sb.Append(descrizioneMittente.PadRight(30, ' '));

            // Indirizzo
            string indirizzoCondominio = string.Empty;
            if (mittenteCondominio)
            {
                if (pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo != null)
                    indirizzoCondominio = Library.Conversione.ToInvioTelematico(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo.GetIndirizzoCompleto());
            }
            else
            {
                if (pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.IndirizzoSede != null)
                    indirizzoCondominio = Library.Conversione.ToInvioTelematico(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.IndirizzoSede.GetIndirizzoCompleto());
            }

            if (indirizzoCondominio.Length > 30)
                indirizzoCondominio = indirizzoCondominio.Substring(0, 30);
            sb.Append(indirizzoCondominio.PadRight(30, ' '));

            // Località
            string localitaCondominio = string.Empty;
            if (mittenteCondominio)
            {
                if (pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo != null)
                    localitaCondominio = Library.Conversione.ToInvioTelematico(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Indirizzo.Comune.Descrizione);
            }
            else
            {
                if (pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.IndirizzoSede != null)
                    localitaCondominio = Library.Conversione.ToInvioTelematico(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.Azienda.IndirizzoSede.Comune.Descrizione);
            }

            if (localitaCondominio.Length > 30)
                localitaCondominio = localitaCondominio.Substring(0, 30);
            sb.Append(localitaCondominio.PadRight(30, ' '));

            // Codice Fiscale
            sb.Append(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale.PadRight(16, ' '));

            // filler
            sb.Append(string.Empty.PadLeft(4));

            sw.WriteLine(sb.ToString());
        }
예제 #21
0
        public MovimentoContabile SetMovimentiStornoPagamento(Pagamento pag, decimal importo, DateTime dataRegistrazione)
        {
            try
            {
                var esercizio = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento, dataRegistrazione);
                var message = IsAllowDataRegistrazione(new List<int> { pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID }, esercizio, dataRegistrazione);
                if (message.Count == 0)
                {
                    var numeroRiga = 0;
                    var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("SS");

                    // ================================================
                    // Testata
                    // ================================================
                    var testata = new TestataMovimentoContabile(esercizio, dataRegistrazione, TipoTestataMovimentoContabileEnum.Automatica, null);
                    _daoFactory.GetTestataMovimentoContabileDao().SaveOrUpdate(testata);

                    // ================================================
                    // Debiti VS Fornitori
                    // ================================================
                    numeroRiga++;

                    var segno = "A";
                    if (importo < 0)
                    {
                        segno = "D";
                        importo = importo * -1;
                    }

                    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()), importo, segno)
                    {
                        Descrizione = "Storno Fatt. n." + pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento + " del " + pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.GetValueOrDefault().ToShortDateString()
                    };
                    _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoPatrimoniale);

                    // ================================================
                    // Conto Patrimoniale
                    // ================================================
                    numeroRiga++;

                    var movimentoBancario = new MovimentoContabile(testata, causale, numeroRiga, pag.Conto, importo, invertiSegno(segno))
                    {
                        Descrizione = movimentoPatrimoniale.Descrizione,
                        FornitoreRiferimento = pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento,
                        SottoContoRiferimento = pag.SottoConto,
                        ContoCorrenteBancario = pag.ContoCorrenteBancario
                    };

                    pag.MovimentoContabileStorno = movimentoBancario;

                    _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoBancario);

                    return movimentoBancario;
                }

                var ex = new InvalidDataException(string.Format("La data di registrazione {0:d} non è valida", dataRegistrazione));

                _log.ErrorFormat("Data di registrazione non valida - {0} - data:{1} - pagamento:{2} - importo:{3}", ex, Utility.GetMethodDescription(), dataRegistrazione, pag.ID, importo);
                throw ex;

            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato nella funzione - {0} - data:{1} - pagamento:{2} - importo:{3}", ex, Utility.GetMethodDescription(), dataRegistrazione, pag.ID, importo);
                throw;
            }
        }
예제 #22
0
        public SpesaInfoDTO SalvaFiscale(SpesaFiscaleDTO dto)
        {
            try
            {
                var message = string.Empty;

                var fornitore = _daoFactory.GetFornitoreDao().GetById(dto.IdFornitore, false);
                var esercizio = _daoFactory.GetEsercizioDao().Find(dto.IdEsercizio, false);
                if (esercizio == null)
                    throw new InvalidDataException("L'esercizio selezionato non è più presente in archivio.");

                GestioneCondomini.Domain.Spesa spesa;

                if (dto.ID == 0)
                {
                    spesa = new GestioneCondomini.Domain.Spesa(fornitore, esercizio, null);
                    var protocollo = _protocolloService.GetProgressivo(TipoProtocollo.Fattura, esercizio.DataApertura.GetValueOrDefault().Year, esercizio.CondominioRiferimento);
                    if (protocollo.Progressivo != null)
                    {
                        spesa.NumeroProtocollo = protocollo.Progressivo;
                        _daoFactory.GetSpesaDao().SaveOrUpdate(spesa);
                    }
                    else
                        message = protocollo.Message + Environment.NewLine;
                }
                else
                {
                    spesa = _daoFactory.GetSpesaDao().GetById(dto.ID, false);
                    spesa.FornitoreRiferimento = fornitore;
                    spesa.EsercizioRiferimento = esercizio;
                }

                var info = new SpesaInfoDTO();
                if (string.IsNullOrEmpty(message))
                {
                    spesa.ImportoRitenuta = dto.Scadenze.Sum(item => item.ImportoRitenuta);
                    spesa.AltreSpese = dto.AltreSpese;
                    spesa.AltreSpeseEsenti = dto.SpeseEsenti;
                    spesa.SpeseEsentiRitenuta = dto.SpeseEsentiRitenuta;
                    spesa.CassaProfessionisti = dto.CassaProfessionisti;
                    spesa.DataDocumento = dto.DataDocumento;
                    spesa.NumeroDocumento = dto.NumeroDocumento;
                    spesa.AliquotaRitenuta = dto.AliquotaRitenuta;
                    spesa.IsAbilitataArchiviazioneOttica = dto.IsAbilitataArchiviazioneOttica;
                    spesa.IsRitenutaCalcoloImponibile = dto.IsRitenutaCalcoloImponibile;
                    spesa.Stato = StatoSpesaEnum.Pagata;
                    spesa.TipoDocumento = dto.TipoDocumento;
                    spesa.Detrazione = dto.Detrazione;
                    spesa.EsenteRegimeMinimo = dto.EsenteRegimeMinimo;

                    // ----------------------------------------------------
                    // Dettagli
                    // ----------------------------------------------------
                    spesa.Dettagli.Clear();
                    var index = 0;
                    foreach (var dtoDettaglio in dto.Dettagli)
                    {
                        index++;
                        DettaglioSpesa dettaglio;
                        if (dtoDettaglio.ID == 0)
                            dettaglio = new DettaglioSpesa(spesa, index);
                        else
                        {
                            dettaglio = _daoFactory.GetDettaglioSpesaDao().GetById(dtoDettaglio.ID, false);
                            dettaglio.NumeroRiga = index;
                            spesa.Dettagli.Add(dettaglio);
                        }

                        dettaglio.AliquotaIva = dtoDettaglio.AliquotaIva;
                        dettaglio.Descrizione = dtoDettaglio.Descrizione;
                        dettaglio.ImportoIva = dtoDettaglio.ImportoIva;
                        dettaglio.ImportoLordo = dtoDettaglio.ImportoLordo;
                        dettaglio.SoggettoRitenutaAcconto = dtoDettaglio.SoggettoRitenutaAcconto;
                    }

                    // ----------------------------------------------------
                    // Scadenze / Pagamenti
                    // ----------------------------------------------------
                    // Pulizia movimenti, scadenze e pagamenti presenti
                    foreach (var scadenza in spesa.Scadenze)
                    {
                        foreach (var pagamento in scadenza.Pagamenti)
                            _daoFactory.GetPagamentoDao().Delete(pagamento);
                        _daoFactory.GetScadenzaFatturaDao().Delete(scadenza);
                    }
                    spesa.Scadenze.Clear();

                    foreach (var scadenzaDto in dto.Scadenze)
                    {
                        var scadenzaNew = new ScadenzaFattura(spesa, scadenzaDto.DataPagamento, scadenzaDto.Importo) { Stato = StatoSpesaEnum.Pagata };
                        var pagamentoNew = new Pagamento(scadenzaNew, null, scadenzaNew.Importo, scadenzaNew.Scadenza, TipoPagamentoFatturaEnum.Immediato) { Stato = StatoSpesaEnum.Pagata };
                        scadenzaNew.Pagamenti.Add(pagamentoNew);
                        _daoFactory.GetScadenzaFatturaDao().SaveOrUpdate(scadenzaNew);

                        // -----------------------------------------------------
                        // Ritenuta
                        // -----------------------------------------------------
                        // ritenuta PAGATA dal vecchio amministratore i dati, compresi interessi e sanzioni servono per il modello 770
                        var ritenuta = new Ritenuta(scadenzaDto.ImportoRitenuta);

                        if (!scadenzaDto.RitenutaNONPagata)
                        {
                            ritenuta.Stato = StatoRitenutaEnum.PagataAltroAmministratore;
                            ritenuta.DataPagamentoRitenuta = scadenzaDto.DataPagamentoRitenuta;
                            ritenuta.ImportoInteressi = scadenzaDto.ImportoInteressi;
                            ritenuta.ImportoSanzione = scadenzaDto.ImportoSanzioni;
                        }
                        // ritenuta NON Pagata inserita come da pagare
                        else
                        {
                            ritenuta.Stato = StatoRitenutaEnum.Inserita;
                            ritenuta.DataPagamentoRitenuta = null;
                            _daoFactory.GetSpesaDao().SaveOrUpdate(spesa);
                            _movimentoContabileService.SetMovimentiRitenutaPagataAltroAmministratore(spesa, scadenzaDto.DataPagamento.GetValueOrDefault());
                        }
                        pagamentoNew.RitenutaAcconto = ritenuta;                        
                    }

                    info = new SpesaInfoDTO
                    {
                        Id = spesa.ID,
                        NumeroProtocollo = spesa.NumeroProtocollo.GetValueOrDefault(),
                    };
                    if (spesa.IsAbilitataArchiviazioneOttica)
                    {
                        var impostazioni = _daoFactory.GetImpostazioniAziendaDao().GetByAzienda(spesa.EsercizioRiferimento.CondominioRiferimento.Azienda.ID);
                        info.IdentificativoArchiviazione = _archiviazioneService.GetIdentificativoArchiviazione(spesa);
                        info.StampaEtichettaArchiviazione = impostazioni.UtilizzoEtichettatriceArchiviazioneOtticaFatture && spesa.EsercizioRiferimento.CondominioRiferimento.IsAbilitataArchiviazioneOtticaPassivi.GetValueOrDefault();
                        info.EtichettatriceArchiviazione = impostazioni.EtichettatriceArchiviazioneOttica;
                        info.TipoEtichettaArchiviazione = impostazioni.TipoEtichettaArchiviazioneOttica;
                    }

                    spesa.Stato = StatoSpesaEnum.PagataAltroAmministratore;
                }
                else
                    info.Message = message;

                return info;
            }
            catch (Exception ex)
            {
                
                _log.Fatal("Errore inaspettato nel salvataggio della spesa FISCALE - " + Utility.GetMethodDescription() + " - spesa:" + dto.ID, ex);
                throw;
            }        
        }