private void dettagliSpesaSelectedTabChanged(object sender, SelectedTabChangedEventArgs e)
        {
            try
            {
                if (e.Tab.Index == -1)
                {
                    dettagliSpesa.SelectedTab = dettagliSpesa.Tabs[0];
                    return;
                }

                var modelloDaSalvare = false;

                if (dettagliSpesa.Tabs.Count > 2)
                {
                    lblAltreSpese.Visible = false;
                    altreSpese.Visible = false;
                    altreSpese.Tag = null;
                    altreSpeseDettaglio.ValueObject = null;
                    altreSpeseDettaglio.Visible = false;

                    lblAltreSpeseEsenti.Visible = false;
                    altreSpeseEsenti.ValueObject = null;
                    altreSpeseEsenti.Visible = false;

                    lblSpeseEsentiRitenuta.Visible = false;
                    speseEsentiRitenuta.ValueObject = null;
                    speseEsentiRitenuta.Visible = false;

                    _spesa.AltreSpese = null;
                    _spesa.AltreSpeseEsenti = null;
                    _spesa.SpeseEsentiRitenuta = null;
                }

                if (_isInserimento && modelloRipartizione.Value == null && ripartizioneDettaglio.Rows.Count > 1 && getCurrentRipartizione() != null && string.IsNullOrEmpty(getCurrentRipartizione().NomeModello))
                    modelloDaSalvare = true;

                DettaglioSpesaDTO dettaglio;
                DettaglioSpesaDTO oldDettaglio = null;
                if (e.Tab.Tag == null)
                {
                    dettaglio = newDettaglioSpesa();
                    dettaglio.NumeroRiga = e.Tab.Index + 1;
                    e.Tab.Tag = dettaglio;

                    if (e.PreviousSelectedTab?.Tag != null)
                    {
                        oldDettaglio = (DettaglioSpesaDTO)e.PreviousSelectedTab.Tag;
                        if (oldDettaglio.IdModelloRipartizione != null && oldDettaglio.IdModelloRipartizione.Value > 0)
                            dettaglio.IdModelloRipartizione = oldDettaglio.IdModelloRipartizione;
                        dettaglio.AliquotaIva = oldDettaglio.AliquotaIva;
                        dettaglio.SoggettoRitenutaAcconto = oldDettaglio.SoggettoRitenutaAcconto;
                        dettaglio.Descrizione = oldDettaglio.Descrizione;

                        if (modelloDaSalvare)
                        {

                            var form = new SalvataggioModelloRegistrazioneContabile((List<ModelloRegistrazioneContabileDTO>)modelliContabiliBindingSource.DataSource, modelloRipartizione.Text, descrizioneDettaglio.Text);
                            if (form.ShowDialog() != DialogResult.Cancel)
                            {
                                getCurrentRipartizione().NomeModello = form.Nome;
                                getCurrentRipartizione().DescrizioneVoceSpesa = form.DescrizioneVoceSpesa;
                                getCurrentRipartizione().AssociatoFornitore = form.AssociatoFornitore;
                            }

                            form.Dispose();
                        }
                    }
                }
                else
                    dettaglio = (DettaglioSpesaDTO)e.Tab.Tag;

                setRipartizioneDettaglio(dettaglio);

                // Se non è impostato un importo elimino il dettaglio
                if (importoDettaglioSpesa.Value == 0 && e.PreviousSelectedTab?.Tag != null)
                {
                    _spesa.Dettagli.Remove((DettaglioSpesaDTO)e.PreviousSelectedTab.Tag);
                    e.PreviousSelectedTab.Tag = null;
                }

                setDettaglioDataSource(oldDettaglio, dettaglio);

                setFocus(importoDettaglioSpesa);

                // Cassa professionisti e Altre spese sono campi di testata li visualizzo solo sul primo dettaglio
                if (dettagliSpesa.SelectedTab.Index != 0)
                {
                    cassaProfessionistiDettaglio.Visible = false;
                    lblCassaProfessionistiDettaglio.Visible = false;

                    altreSpeseDettaglio.Visible = false;
                    lblAltreSpeseDettaglio.Visible = false;

                    altreSpeseEsenti.Visible = false;
                    lblAltreSpeseEsenti.Visible = false;

                    speseEsentiRitenuta.Visible = false;
                    lblSpeseEsentiRitenuta.Visible = false;
                }
                else
                {
                    lblCassaProfessionistiDettaglio.Visible = true;
                    cassaProfessionistiDettaglio.Visible = true;

                    if (dettagliSpesa.Tabs.Count <= 2 && !getMovimentoContabileService().IsMultiSpesa)
                    {
                        altreSpeseDettaglio.Visible = true;
                        lblAltreSpeseDettaglio.Visible = true;

                        speseEsentiRitenuta.Visible = true;
                        lblSpeseEsentiRitenuta.Visible = true;

                        altreSpeseEsenti.Visible = true;
                        lblAltreSpeseEsenti.Visible = true;
                    }
                    else
                    {
                        altreSpeseDettaglio.Visible = false;
                        altreSpeseDettaglio.ValueObject = null;
                        lblAltreSpeseDettaglio.Visible = false;

                        altreSpeseEsenti.Visible = false;
                        altreSpeseEsenti.ValueObject = null;
                        lblAltreSpeseEsenti.Visible = false;
                        lblAltreSpese.Visible = false;

                        speseEsentiRitenuta.Visible = false;
                        speseEsentiRitenuta.ValueObject = null;
                        lblSpeseEsentiRitenuta.Visible = false;

                        if(_spesa.AltreSpeseEsenti != 0 && _spesa.AltreSpeseEsenti != null)
                            _spesa.AltreSpeseEsenti = null;
                        if (_spesa.SpeseEsentiRitenuta != 0 && _spesa.SpeseEsentiRitenuta != null)
                            _spesa.SpeseEsentiRitenuta = null;
                    }
                }

                if (string.IsNullOrEmpty(descrizioneDettaglio.Text))
                    descrizioneDettaglio.Text = _condominio.FormatoDescrizioneSpesa;

                ripartizioneDettaglio.Focus();
                ripartizioneDettaglio.PerformAction(UltraGridAction.FirstCellInGrid);
            }
            catch (Exception ex)
            {
                
                _log.Error("Errore non previsto nel click sul tab di dettaglio - " + Utility.GetMethodDescription(), ex);
                throw;
            }
        }
        public bool Conferma()
        {
            var result = true;

            btnConferma.Focus();
            setValidators(true);
            spesaValidationSummary.Validate();
            if (spesaValidationSummary.IsValid)
            {
                // --------------------------------------------
                // Controllo Data Registrazione
                // --------------------------------------------
                var messageDataList = getMovimentoContabileService().IsAllowDataRegistrazione(new List<int>(1) {_condominio.ID}, _esercizio.ID, dataRegistrazione.DateTime);
                if(messageDataList.Count > 0)
                {
                    var messageData = "La data di registrazione " + dataRegistrazione.DateTime + " non è ammessa:" + Environment.NewLine;
                    messageData = messageDataList.Aggregate(messageData, (current, mess) => current + (mess + Environment.NewLine));
                    CommonMessages.DisplayWarning(messageData);
                    return false;
                }

                // --------------------------------------------
                // Controllo Data Scadenza se pagamento immediato
                // --------------------------------------------
                if (_pagamentoImmediato)
                {
                    var messaggiDataPagamento = new List<string>();
                    foreach (var scadenzaFatturaDTO in _spesa.Scadenze)
                    {
                        if (scadenzaFatturaDTO != null)
                        {
                            var messageData = getMovimentoContabileService().IsAllowDataPagamento(_condominio.ID, scadenzaFatturaDTO.Scadenza.GetValueOrDefault());
                            if (!string.IsNullOrEmpty(messageData))
                                messaggiDataPagamento.Add(messageData);
                        }                        
                    }

                    if (messaggiDataPagamento.Count > 0)
                    {
                        var messageDataStr = messaggiDataPagamento.Aggregate(string.Empty, (current, mess) => current + (mess + Environment.NewLine));
                        CommonMessages.DisplayWarning(messageDataStr);
                        return false;
                    }
                }

                // --------------------------------------------
                // Controllo sul numero fattura
                // --------------------------------------------
                var messageAuth = _fatturaService.IsAllowNumeroFattura(_spesa);
                if (string.IsNullOrEmpty(messageAuth.FatalMessage))
                {
                    var resultNumeroFattura = DialogResult.Yes;
                    if (!string.IsNullOrEmpty(messageAuth.WarnMessage))
                        resultNumeroFattura = CommonMessages.DisplayConfirm("ATTENZIONE il controllo sul numero fattura ha dato i seguenti risultati:" + Environment.NewLine + Environment.NewLine + messageAuth.WarnMessage + Environment.NewLine + Environment.NewLine + "Vuoi confermare l'inserimento della spesa?");

                    if (resultNumeroFattura == DialogResult.Yes)
                    {
                        RipartizioneSpeseDTO ripartizione;
                        if (importoDettaglioSpesa.Value != 0)
                        {
                            _spesa.AltreSpese = altreSpeseDettaglio.Value;
                            _spesa.AltreSpeseEsenti = altreSpeseEsenti.Value;
                            _spesa.SpeseEsentiRitenuta = speseEsentiRitenuta.Value;
                            _spesa.AliquotaRitenuta = (decimal?)aliquotaRitenuta.Value;
                            _spesa.AliquotaCassaProfessionisti = (decimal?)cassaProfessionistiDettaglio.Value;
                            _spesa.IsRitenutaCalcoloImponibile = ritenutaCalcolataImponibile.Checked;
                            ripartizione = getCurrentRipartizione();
                            if (_isInserimento && modelloRipartizione.Value == null && ripartizioneDettaglio.Rows.Count > 1 && (ripartizione == null || string.IsNullOrEmpty(getCurrentRipartizione().NomeModello)))
                            {
                                var form = new SalvataggioModelloRegistrazioneContabile((List<ModelloRegistrazioneContabileDTO>)modelliContabiliBindingSource.DataSource, modelloRipartizione.Text, descrizioneDettaglio.Text);
                                if (form.ShowDialog() != DialogResult.Cancel)
                                {
                                    if (ripartizione == null)
                                    {
                                        ripartizione = new RipartizioneSpeseDTO
                                        {
                                            Testata = new TestataMovimentoContabileDTO {IdEsercizio = _esercizio.ID}
                                        };
                                        setCurrentRipartizione(ripartizione);
                                    }
                                    ripartizione.NomeModello = form.Nome;
                                    ripartizione.DescrizioneVoceSpesa = form.DescrizioneVoceSpesa;
                                    ripartizione.AssociatoFornitore = form.AssociatoFornitore;
                                }

                                form.Dispose();
                            }

                            // Se non sono ancora state caricate creo le scadenze
                            if (scadenze.Rows.Count == 0)
                                loadScadenzeTab();
                        }

                        // Salvo i valori a video nell'oggetto DTO
                        setDettaglioDataSource((DettaglioSpesaDTO)dettagliSpesa.ActiveTab.Tag, null);

                        _spesa.IdFornitore = sceltaFornitore.SelectedFornitore.ID;
                        _spesa.TipoDocumento = tipoDocumento.SelectedItem.DataValue.ToString();
                        _spesa.DataRegistrazione = dataRegistrazione.DateTime;

                        if (_spesaRiferimento != null)
                            _spesa.IdSpesaRiferimento = _spesaRiferimento.ID;

                        SpesaInfoDTO spesaInfo =null;
                        try
                        {
                            if (_spesa != null)
                            {
                                //spesaInfo = _fatturaService.Salva(_spesa, _ripartizione, getMovimentoContabileService().IsMultiSpesa);

                                var form = new ExecuteLoadDataObjectAsync<SpesaInfoDTO>("Salvataggio della fattura in corso ....." + Environment.NewLine + "Si prega di attendere.");
                                Func<SpesaInfoDTO> loadDati = () => _fatturaService.Salva(_spesa, _ripartizione, getMovimentoContabileService().IsMultiSpesa);
                                form.LoadData(loadDati);
                                form.ShowDialog();
                                spesaInfo = form.DataSourceObject;
                                form.Dispose();
                            }
                        }
                        catch (Exception ex)
                        {
                            
                            _log.Error("Errore non previsto nell'inserimento della spesa - " + Utility.GetMethodDescription() + " - spesa:" + getIdSpesa().GetValueOrDefault(), ex);
                            spesaInfo = new SpesaInfoDTO { Message = "Errore imprevisto nell'inserimento della spesa" };            
                        }

                        if (spesaInfo != null && string.IsNullOrEmpty(spesaInfo.Message))
                        {
                            _spesa.ID = spesaInfo.Id;

                            _spesa.DisplayName = _spesa.Dettagli[0].Descrizione;
                            if (_speseAccorpate && _isFirstSpesa && _spesaRiferimento == null)
                            {
                                _spesaRiferimento = _spesa;
                                _isFirstSpesa = false;
                                _fatturaService.SetSpesaRiferimento(_spesaRiferimento.ID, _spesaRiferimento.ID);
                            }

                            if (modelloFornitore.Checked)
                                getModelloContabileService().AssociaFornitore((ModelloRegistrazioneContabileDTO)modelloRipartizione.SelectedItem.ListObject, sceltaFornitore.SelectedFornitore);

                            // Se è stato richiesto il salvataggio del modello devo ricaricare la cache dei modelli
                            if (importoDettaglioSpesa.Value != 0)
                            {
                                ripartizione = getCurrentRipartizione();
                                if (!string.IsNullOrEmpty(ripartizione?.NomeModello))
                                    getModelloContabileService().Reload(_esercizio);
                            }

                            if (_isInserimento)
                                CommonMessages.DisplayComplete("La spesa è stata correttamente inserita." + Environment.NewLine + "Sul documento deve essere riportato: " + spesaInfo.IdentificativoArchiviazione);
                            else
                                CommonMessages.DisplayComplete("La spesa è stata correttamente aggiornata." + Environment.NewLine + "Sul documento deve essere riportato: " + spesaInfo.IdentificativoArchiviazione);
                            Dirty = false;

                            OnConfirm(new ConfirmArgs(_spesa));

                            if (_formGestione == null || !_formGestione.IsDisposed)
                            {
                                if (_isInserimento)
                                    Reload(_condominio, _esercizio);
                                Dirty = false;
                            }
                        }
                        else
                        {
                            if (spesaInfo != null)
                                CommonMessages.DisplayWarning("Si sono verificati dei problemi nell'aggiornamento della spesa:" + Environment.NewLine + spesaInfo.Message + Environment.NewLine + "Si prega di riprovare.");
                            result = false;
                        }
                    }
                }
                else
                {
                    CommonMessages.DisplayWarning("Si sono verificati i seguenti errori nel controllo del numero di fattura:" + Environment.NewLine + messageAuth.FatalMessage + Environment.NewLine + "Si prega di riprovare.");
                    return false;
                }
            }
            else
            {
                spesaValidationSummary.ShowErrorSummary();
                result = false;
            }

            setValidators(false);
            return result;
        }
        private void btnSalvaModelloClick(object sender, EventArgs e)
        {
            try
            {
                if (dettagliSpesa?.ActiveTab?.Tag != null && modelliContabiliBindingSource.DataSource != null)
                {
                    var form = new SalvataggioModelloRegistrazioneContabile((List<ModelloRegistrazioneContabileDTO>)modelliContabiliBindingSource.DataSource, modelloRipartizione.Text, descrizioneDettaglio.Text);
                    if (form.ShowDialog() == DialogResult.Cancel)
                    {
                        form.Dispose();
                        return;
                    }

                    var ripartizione = getCurrentRipartizione();
                    if (ripartizione != null)
                    {
                        ripartizione.NomeModello = form.Nome;
                        ripartizione.DescrizioneVoceSpesa = form.DescrizioneVoceSpesa;
                        ripartizione.AssociatoFornitore = form.AssociatoFornitore;
                    }

                    form.Dispose();
                }
            }
            catch (Exception ex)
            {
                
                _log.Error("Errore non previsto nel salvataggio del modello - " + Utility.GetMethodDescription(), ex);
                throw;
            }
        }