示例#1
0
        private ResultDettaglioSpesa manageDettaglioSpesa(DettaglioSpesaDTO dto, DettaglioSpesa dettaglioMultiIva)
        {
            DettaglioSpesa item = null;
            string result = string.Empty;

            // Controllo sullo stato U, D, I
            switch (dto.Stato.ToUpper())
            {
                case "U":
                    result = updateDettaglio(dto, dettaglioMultiIva, out item);
                    break;
                case "I":
                    result = insertDettaglio(dto, dettaglioMultiIva, out item);
                    break;
            }

            if (!string.IsNullOrEmpty(result))
                item = null;

            return new ResultDettaglioSpesa(item, result);
        }
示例#2
0
 public ResultDettaglioSpesa ManageDettaglioDomainEntity(DettaglioSpesaDTO dettaglioDto, DettaglioSpesa dettaglioMultiIva)
 {
     try
     {
         return manageDettaglioSpesa(dettaglioDto, dettaglioMultiIva);
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nella gestione dei dettagli delle Fatture/Spese - {0} - id:{1}", ex, Utility.GetMethodDescription(), dettaglioDto.ID);
         throw;
     }
 }
示例#3
0
        private string updateDettaglio(DettaglioSpesaDTO dto, DettaglioSpesa dtoMultiIva, out DettaglioSpesa item)
        {
            var message = string.Empty;
            item = null;
            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);

            try
            {
                item = daoFactory.GetDettaglioSpesaDao().GetById(dto.ID, false);

                // Condizione necessaria per il controllo del fatto che sul DB ho una versione uguale o più vecchia
                if (dto.Version == item.Version)
                {
                    item.AliquotaIva = dto.AliquotaIva;
                    item.ImportoIva = dto.ImportoIva;
                    item.ImportoLordo = dto.ImportoLordo - item.SpesaRiferimento.AltreSpese.GetValueOrDefault();
                    item.Note = dto.Note;
                    item.NumeroRiga = dto.NumeroRiga;
                    item.SoggettoRitenutaAcconto = dto.SoggettoRitenutaAcconto;
                    item.Descrizione = dto.Descrizione;

                    item.ModelloRipartizione = dto.IdModelloRipartizione != null ? daoFactory.GetModelloRegistrazioneContabileDao().GetById(dto.IdModelloRipartizione.Value, false) : null;

                    // ------------------------------------------
                    // Movimenti contabili
                    // ------------------------------------------
                    item.Movimenti.Clear();
                    for (int i = 0; i < dto.Movimenti.Length; i++)
                    {
                        dto.Movimenti[i].IdDettaglio = item.ID;

                        // Se non è valorizzata alcun sottoconto e nessuna descrizione uso la descrione presente sul dettaglio
                        if (dto.Movimenti[i].IdSottoConto == null && (dto.Movimenti[i].Descrizione == null || dto.Movimenti[i].Descrizione.Trim() == string.Empty))
                            dto.Movimenti[i].Descrizione = item.Descrizione;

                        int? id = dto.Movimenti[i].ID;
                        if (id.GetValueOrDefault() > 0)
                        {
                            var movimentoCheck = daoFactory.GetMovimentoContabileDao().Find(id.GetValueOrDefault(), false);
                            if (movimentoCheck == null)
                                dto.Movimenti[i].ID = 0;
                        }

                        if ((dto.Movimenti[i].Stato == "U") || (dto.Movimenti[i].Stato == "I"))
                        {
                            var result = getMovimentoRepository().ManageDomainEntity(dto.Movimenti[i]);
                            if (result.Movimento != null)
                                id = result.Movimento.ID;
                            else
                                return result.Message;
                        }

                        var movimento = daoFactory.GetMovimentoContabileDao().GetById(id.Value, false);
                        item.Movimenti.Add(movimento);
                        movimento.DettaglioRiferimento = item;
                        if (dtoMultiIva != null)
                        {
                            var movimentoPrincipale = IesiGenericCollections<MovimentoContabile>.GetByIndex(dtoMultiIva.Movimenti, i);
                            if (movimentoPrincipale != null && movimentoPrincipale.ContoRiferimento != null && movimentoPrincipale.ContoRiferimento.ID == movimento.ContoRiferimento.ID)
                                movimento.MovimentoPrincipaleMultiIva = movimentoPrincipale;
                        }
                    }
                }
                else
                {
                    // Eccezione: Sul db c'è qualche cosa di più nuovo.
                    
                    _log.Error("Errore nel salvataggio del dettaglio Spesa id:" + dto.ID + " - il dato sul db è più recente di quello che si vuole salvare");
                    message = "Errore nel salvataggio del dettaglio Spesa id:" + dto.ID + " - il dato sul db è più recente di quello che si vuole salvare";
                }
            }
            catch (Exception ex)
            {
                
                _log.Error("Errore nel salvataggio del dettaglio Spesa: " + Utility.GetMethodDescription() + " - id:" + dto.ID, ex);
                throw;
            }

            return message;
        }
示例#4
0
        private string insertDettaglio(DettaglioSpesaDTO dto, DettaglioSpesa dettaglioMultiIva, out DettaglioSpesa item)
        {
            string message = string.Empty;
            item = null;
            try
            {
                var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
                item = new DettaglioSpesa(daoFactory.GetSpesaDao().GetById(dto.IdSpesaRiferimento, false),dto.NumeroRiga) {AliquotaIva = dto.AliquotaIva, ImportoIva = dto.ImportoIva};

                item.ImportoLordo = dto.ImportoLordo - item.SpesaRiferimento.AltreSpese.GetValueOrDefault();
                item.Note = dto.Note;
                item.SoggettoRitenutaAcconto = dto.SoggettoRitenutaAcconto;
                item.Descrizione = dto.Descrizione;

                if(dto.IdModelloRipartizione != null)
                    item.ModelloRipartizione = daoFactory.GetModelloRegistrazioneContabileDao().GetById(dto.IdModelloRipartizione.Value, false);

                daoFactory.GetDettaglioSpesaDao().SaveOrUpdate(item);
                
                // ------------------------------------------
                // Movimenti contabili
                // ------------------------------------------
                item.Movimenti.Clear();
                for (var i = 0; i < dto.Movimenti.Length; i++)
                {
                    try
                    {
                        dto.Movimenti[i].IdDettaglio = item.ID;

                        // Se non è valorizzata alcun sottoconto e nessuna descrizione uso la descrione presente sul dettaglio
                        if (dto.Movimenti[i].IdSottoConto == null && (dto.Movimenti[i].Descrizione == null || dto.Movimenti[i].Descrizione.Trim() == string.Empty))
                            dto.Movimenti[i].Descrizione = item.Descrizione;

                        int? id = dto.Movimenti[i].ID;
                        if ((dto.Movimenti[i].Stato == "U") || (dto.Movimenti[i].Stato == "I"))
                        {
                            // Se è presente modello recupero eventuali ripartizioni personalizzate
                            if (item.ModelloRipartizione != null)
                            {
                                var contiModelloRegistrazioneContabile = item.ModelloRipartizione.Conti.ToList()[i];
                                if (contiModelloRegistrazioneContabile != null)
                                {
                                    var listaUnita = contiModelloRegistrazioneContabile.Unita.Where(unita => unita.UnitaRiferimento != null).ToList();
                                    if (listaUnita.Count > 0)
                                    {
                                        dto.Movimenti[i].DettaglioRipartizione = new SpeseUnitaDTO[listaUnita.Count];
                                        for (var j = 0; j < listaUnita.Count; j++)
                                        {
                                            dto.Movimenti[i].DettaglioRipartizione[j] = new SpeseUnitaDTO { IdUnitaRiferimento = listaUnita.ToList()[j].UnitaRiferimento.ID };
                                            if (contiModelloRegistrazioneContabile.ContoRiferimento.IsSpesePersonali && listaUnita.Count == 1)
                                                dto.Movimenti[i].DettaglioRipartizione[j].Importo = dto.Movimenti[i].Importo;

                                        }

                                        if (dto.Movimenti[i].DettaglioRipartizione.Length > 0)
                                            dto.Movimenti[i].IsRipartoPersonalizzato = true;
                                    }
                                }
                            }

                            var resultMovimento = getMovimentoRepository().ManageDomainEntity(dto.Movimenti[i]);
                            if (resultMovimento.Movimento != null)
                                id = resultMovimento.Movimento.ID;
                            else
                                return resultMovimento.Message;
                        }

                        var movimento = daoFactory.GetMovimentoContabileDao().GetById(id.Value, false);
                        if (dettaglioMultiIva != null)
                        {
                            var movimentoPrincipale = IesiGenericCollections<MovimentoContabile>.GetByIndex(dettaglioMultiIva.Movimenti, i);
                            if (movimentoPrincipale != null && movimentoPrincipale.ContoRiferimento != null && movimentoPrincipale.ContoRiferimento.ID == movimento.ContoRiferimento.ID)
                                movimento.MovimentoPrincipaleMultiIva = movimentoPrincipale;
                        }

                        item.Movimenti.Add(movimento);
                        movimento.DettaglioRiferimento = item;

                        if (item.ModelloRipartizione != null)
                        {
                            movimento.LottiAddebito = getAddebito("L", item.ModelloRipartizione, i);
                            movimento.StabiliAddebito = getAddebito("S", item.ModelloRipartizione, i);
                            movimento.GruppiAddebito = getAddebito("G", item.ModelloRipartizione, i);
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nell'inserimento del dettaglio Spesa - SINGOLO MOVIMENTO - {0} - movimento:{1} - spesa:{2}", ex, Utility.GetMethodDescription(), dto.Movimenti[i].ID, dto.IdSpesaRiferimento);
                        throw;
                    }

                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nell'inserimento del dettaglio Spesa - {0} - spesa:{1} - modello:{2}", ex, Utility.GetMethodDescription(), dto.IdSpesaRiferimento, dto.IdModelloRipartizione);
                message = "Errore nell'inserimento del dettaglio Spesa: " + Utility.GetMethodDescription();
            }
            return message;
        }
示例#5
0
        private DettaglioSpesaDTO newDettaglioSpesa()
        {
            var dettaglio = new DettaglioSpesaDTO {SoggettoRitenutaAcconto = false, Movimenti = new List<MovimentoContabileDTO>()};
            _spesa.Dettagli.Add(dettaglio);

            _ripartizione.Add(dettaglio, null);

            return dettaglio;
        }
示例#6
0
        private DettaglioSpesaDTO setDettaglioDto(DettaglioSpesa dettaglio, bool includeDettaglioMovimenti, bool detrazione = false)
        {
            try
            {
                var dto = new DettaglioSpesaDTO
                {
                    ID = dettaglio.ID,
                    AliquotaIva = dettaglio.AliquotaIva,
                    Descrizione = dettaglio.Descrizione,
                    IdSpesaRiferimento = dettaglio.SpesaRiferimento.ID,
                    Imponibile = dettaglio.Imponibile,
                    ImportoIva = dettaglio.ImportoIva,
                    ImportoLordo = dettaglio.ImportoLordo,
                    Note = dettaglio.Note,
                    NumeroRiga = dettaglio.NumeroRiga,
                    SoggettoRitenutaAcconto = dettaglio.SoggettoRitenutaAcconto,
                    Version = dettaglio.Version
                };

                if (dettaglio.ModelloRipartizione != null)
                    dto.IdModelloRipartizione = dettaglio.ModelloRipartizione.ID;

                // ------------------------------------------
                // Movimenti contabili
                // ------------------------------------------
                var indexMovimento = 0;
                dto.Movimenti = new MovimentoContabileDTO[dettaglio.Movimenti.Count];
                foreach (var movimento in dettaglio.Movimenti)
                {
                    var movimentoDto = getMovimentoRepository().GetByDomainEntity(movimento, includeDettaglioMovimenti, true, detrazione);
                    movimentoDto.Segno = "D";
                    dto.Movimenti[indexMovimento] = movimentoDto;
                    indexMovimento++;
                }
                
                return dto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato nella creazione dell'istanza DTO per un dettaglio di una spesa - {0} - dettaglio:{1}", ex, Utility.GetMethodDescription(), dettaglio.ID);
                throw;
            }
        }
示例#7
0
        private void setDettaglioDataSource(DettaglioSpesaDTO oldDettaglio, DettaglioSpesaDTO newDettaglio)
        {
            try
            {
                modelloRipartizione.SelectionChanged -= modelloRipartizioneSelectionChanged;

                // Salvo i valori attuali 
                if (oldDettaglio != null)
                {
                    oldDettaglio.Descrizione = (string)descrizioneDettaglio.Value;
                    oldDettaglio.SoggettoRitenutaAcconto = ritenuta.Checked;
                    oldDettaglio.ImportoIva = importoDettaglioIva.Value;
                    oldDettaglio.ImportoLordo = importoDettaglioSpesa.Value;
                    oldDettaglio.Imponibile = imponibileDettaglio.Value;
                    if (modelloRipartizione.Value != null)
                        oldDettaglio.IdModelloRipartizione = (int)modelloRipartizione.Value;
                    oldDettaglio.Note = (string)noteDettaglio.Value;
                    if (aliquotaDettaglioIva.Value != null && aliquotaDettaglioIva.Value != DBNull.Value)
                        oldDettaglio.AliquotaIva = (string)aliquotaDettaglioIva.Value;
                }

                // Imposto i valori nuovi
                if (newDettaglio != null)
                {
                    clearDettaglioFields();

                    descrizioneDettaglio.Value = newDettaglio.Descrizione;
                    ritenuta.Checked = newDettaglio.SoggettoRitenutaAcconto != null && newDettaglio.SoggettoRitenutaAcconto.Value;
                    importoDettaglioIva.ValueObject = newDettaglio.ImportoIva;
                    importoDettaglioSpesa.ValueObject = newDettaglio.ImportoLordo;
                    if (_spesa.Dettagli.Count == 1)
                        importoDettaglioSpesa.Value += _spesa.AltreSpese.GetValueOrDefault();
                    imponibileDettaglio.ValueObject = newDettaglio.Imponibile;
                    modelloRipartizione.Value = newDettaglio.IdModelloRipartizione;
                    noteDettaglio.Value = newDettaglio.Note;
                    aliquotaDettaglioIva.ValueChanged -= aliquotaDettaglioIvaValueChanged;
                    aliquotaDettaglioIva.Value = newDettaglio.AliquotaIva;
                    aliquotaDettaglioIva.ValueChanged += aliquotaDettaglioIvaValueChanged;
                }

                modelloRipartizione.SelectionChanged += modelloRipartizioneSelectionChanged;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore non nella impostazione del data source del dettaglio - {0} - spesa:{1} - esercizio:{2} - azienda:{3}", ex, Utility.GetMethodDescription(), _spesa.ID, _esercizio.ID, Security.Login.Instance.CurrentLogin().Azienda);
                throw;
            }
        }
示例#8
0
        private void btnConfermaMultispesaClick(object sender, EventArgs e)
        {
            try
            {
                if(listaMultispesa.Rows.Count == 0)
                    return;

                validationSummaryMultiSpesa.Validate();

                if (validationSummaryMultiSpesa.IsValid)
                {
                    _spesa.Dettagli.Clear();
                    _ripartizione.Clear();
                    altreSpeseDettaglio.ValueObject = null;
                    altreSpeseDettaglio.Visible = false;
                    altreSpeseEsenti.ValueObject = null;
                    altreSpeseEsenti.Visible = false;
                    speseEsentiRitenuta.ValueObject = null;
                    speseEsentiRitenuta.Visible = false;
                    lblAltreSpeseDettaglio.Visible = false;
                    lblSpeseEsentiRitenuta.Visible = false;
                    lblAltreSpeseEsenti.Visible = false;
                    _spesa.AltreSpese = null;
                    _spesa.AltreSpeseEsenti = null;
                    _spesa.SpeseEsentiRitenuta = null;

                    foreach (var row in listaMultispesa.Rows)
                    {
                        try
                        {
                            if (row.Cells.Exists("AliquotaIva") && row.Cells.Exists("ImportoTotale") && row.Cells.Exists("Imponibile") && row.Cells.Exists("ImportoIva"))
                            {
                                var dettaglio = new DettaglioSpesaDTO
                                {
                                    AliquotaIva = row.Cells["AliquotaIva"].Value.ToString(),
                                    ImportoLordo = (decimal)row.Cells["ImportoTotale"].Value,
                                    Imponibile = (decimal)row.Cells["Imponibile"].Value,
                                    ImportoIva = (decimal)row.Cells["ImportoIva"].Value
                                };
                                if (modelloRipartizione.Value != null)
                                    dettaglio.IdModelloRipartizione = (int)modelloRipartizione.Value;
                                dettaglio.Movimenti = new List<MovimentoContabileDTO>();

                                if (sceltaFornitore.SelectedFornitore != null &&
                                    ((decimal?)aliquotaRitenuta.Value).GetValueOrDefault() > 0)
                                    dettaglio.SoggettoRitenutaAcconto = true;

                                _spesa.Dettagli.Add(dettaglio);
                                _ripartizione.Add(dettaglio, null);
                            }
                            else
                            {
                                _log.WarnFormat("Spesa multi iva NON sono presenti nella grid i campi previsti - {0} - spesa:{1} - esercizio:{2}", Utility.GetMethodDescription(), _spesa.ID, _esercizio.ID);
                            }

                        }
                        catch (Exception ex)
                        {
                            var aliquota = "<NULL>";
                            if (row.Cells["AliquotaIva"].Value != null)
                                aliquota = row.Cells["AliquotaIva"].Value.ToString();
                            _log.ErrorFormat("Errore nella conferma della spesa multi iva - SINGOLO DETTAGLIO - {0} - iva:{1} - spesa:{2} - esercizio:{3}", ex, Utility.GetMethodDescription(), aliquota, _spesa.ID, _esercizio.ID);
                            throw;
                        }
                    }

                    if(_spesa.Dettagli.Count > 0)
                        importoDettaglioSpesa.Value = _spesa.Dettagli[0].ImportoLordo.GetValueOrDefault();

                    getMovimentoContabileService().SetMultiSpesa(true, _spesa);
                    bindDettagliSpesa(_spesa.Dettagli);

                    popUpMultispesa.Close();

                    if (dettagliSpesa.Tabs.Count > 0)
                    {
                        try
                        {
                            dettagliSpesa.ActiveTab = dettagliSpesa.Tabs[0];
                            dettagliSpesa.SelectedTab = dettagliSpesa.Tabs[0];
                        }
                        catch (Exception ex)
                        {
                            _log.WarnFormat("Errore nella impostazione del tab di dettaglio attivo - {0}", ex, Utility.GetMethodDescription());
                            throw;
                        }
                    }
                    else
                    {
                        _log.WarnFormat("Spesa multi iva 'dettagliSpesa' non ha nessun TAB - {0} - spesa:{1} - esercizio:{2}", Utility.GetMethodDescription(), _spesa.ID, _esercizio.ID);
                    }

                    // TODO: Senza questa riga ottengo una exception in Infragisticis.UltraTab, probabilmente perchè risulta essere null il Text del Tab.
                    //       Provare Infragistics 8.2
                    descrizioneDettaglio.Text = _condominio.FormatoDescrizioneSpesa;
                    if (string.IsNullOrEmpty(descrizioneDettaglio.Text))
                        descrizioneDettaglio.Text = _condominio.DescrizioneSpeseAutomatica ? @"$vuoto" : @" ";

                    modelloRipartizioneSelectionChanged(importoDettaglioSpesa.Value, EventArgs.Empty);

                    // Disabilito i controlli a video per importo, imponibile e iva
                    importoDettaglioSpesa.Enabled = false;
                    importoDettaglioIva.Enabled = false;
                    imponibileDettaglio.Enabled = false;
                    aliquotaDettaglioIva.Enabled = false;

                    loadScadenzeTab();
                }
                else
                    validationSummaryMultiSpesa.ShowErrorSummary();
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella conferma della spesa multi iva - {0} - spesa:{1} - esercizio:{2}", ex, Utility.GetMethodDescription(), _spesa.ID, _esercizio.ID);
                throw;
            }
        }
示例#9
0
        public SpesaDTO GetNew(SpesaDTO spesaOriginale, CondominioDTO condominio)
        {
            try
            {
                var aziendaDTO = _aziendaService.GetAzienda();
                var spesa = new SpesaDTO
                {
                    Autorizzata = !aziendaDTO.AutorizzazioneScadenze,
                    IsAbilitataArchiviazioneOttica = _condominioService.GetById(condominio.ID, true).IsAbilitataArchiviazioneOtticaPassivi,
                    Dettagli = new List<DettaglioSpesaDTO>()
                };

                if (spesaOriginale != null)
                {
                    spesa.AliquotaRitenuta = spesaOriginale.AliquotaRitenuta;
                    spesa.Detrazione = spesaOriginale.Detrazione;
                    spesa.DisplayFornitore = spesaOriginale.DisplayFornitore;
                    spesa.DisplayName = spesaOriginale.DisplayName;
                    spesa.IdEsercizio = spesaOriginale.IdEsercizio;
                    spesa.IdFornitore = spesaOriginale.IdFornitore;
                    spesa.TipoDocumento = spesaOriginale.TipoDocumento;
                    spesa.Contestata = spesaOriginale.Contestata;
                    spesa.Sinistro = spesaOriginale.Sinistro;

                    foreach (var dettaglio in spesaOriginale.Dettagli)
                    {
                        var dettaglioNew = new DettaglioSpesaDTO
                        {
                            AliquotaIva = dettaglio.AliquotaIva,
                            Descrizione = dettaglio.Descrizione,
                            DisplayName = dettaglio.DisplayName,
                            ID = 0,
                            IdModelloRipartizione = dettaglio.IdModelloRipartizione,
                            Note = dettaglio.Note,
                            NumeroRiga = dettaglio.NumeroRiga,
                            SoggettoRitenutaAcconto = dettaglio.SoggettoRitenutaAcconto,
                            Movimenti = new List<MovimentoContabileDTO>()
                        };

                        foreach (var movimento in dettaglio.Movimenti)
                        {
                            var movimentoNew = new MovimentoContabileDTO
                            {
                                Causale = movimento.Causale,
                                Descrizione = movimento.Descrizione,
                                DisplayName = movimento.DisplayName,
                                ID = 0,
                                IdCondomino = movimento.IdCondomino,
                                IdConto = movimento.IdConto,
                                IdFornitore = movimento.IdFornitore,
                                NumeroRiga = movimento.NumeroRiga,
                                IdNumeroRigaMovimentoMultiIvaPrincipale = movimento.NumeroRiga,
                                IdSottoConto = movimento.IdSottoConto
                            };
                            dettaglioNew.Movimenti.Add(movimentoNew);
                        }

                        spesa.Dettagli.Add(dettaglioNew);
                    }
                }
                else
                    spesa.TipoDocumento = "FATTURA";

                spesa.Scadenze = new List<ScadenzaFatturaDTO>();
                spesa.StatoSpesa = StatoSpesaEnum.Inserita;

                return spesa;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella lettura della nuova spesa - {0} - spesa:{1} - condominio:{2}", ex, Gipasoft.Library.Utility.GetMethodDescription(), spesaOriginale != null ? spesaOriginale.ID.ToString() : "<NULL>", condominio != null ? condominio.ID.ToString() : "<NULL>");
                throw;
            }
        }
示例#10
0
        private void setRipartizioneDettaglio(DettaglioSpesaDTO dettaglio)
        {
            dettaglio.Stato = "U";
            movimentoContabileBindingSource.DataSource = dettaglio.Movimenti;

            // Imposto il data source corretto per tutte le celle
            foreach (var row in ripartizioneDettaglio.Rows)
            {
                if (row.Cells["IdConto"].Value != null)
                {
                    if (ripartizioneDettaglio.DisplayLayout.ValueLists.Exists("SottoConti"))
                        ripartizioneDettaglio.DisplayLayout.ValueLists.Remove("SottoConti");

                    var listUniqueKey = "SottoConti_" + ((int)row.Cells["IdConto"].Value);
                    if (ripartizioneDettaglio.DisplayLayout.ValueLists.Exists(listUniqueKey))
                        ripartizioneDettaglio.DisplayLayout.ValueLists.Remove(listUniqueKey);
                    var valueList = DataSourceHelper.GetValueList(_pianoContiService.GetSottoContiDataSource(_pianoContiService.GetById((int)row.Cells["IdConto"].Value, _esercizio.ID), _esercizio.ID), "ID", "DescrizioneCompleta", "Sottoconti");
                    valueList.Key = listUniqueKey;
                    ripartizioneDettaglio.DisplayLayout.ValueLists.Add(valueList);
                    row.Cells["IdSottoConto"].ValueList = ripartizioneDettaglio.DisplayLayout.ValueLists[listUniqueKey];
                }
            }

            if (ripartizioneDettaglio.ActiveRow != null)
            {
                ripartizioneDettaglio.ActiveRow.Cells["Importo"].Value = dettaglio.ImportoLordo.GetValueOrDefault() + _spesa.AltreSpeseEsenti + - totaleImportoRipartito(true);
            }

        }
        public List<MovimentoContabileDTO> GetMovimentiByDettaglio(DettaglioSpesaDTO dettaglio, Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> ripartizione, EsercizioDTO esercizio)
        {
            try
            {
                if (ripartizione == null)
                {
                    _log.ErrorFormat("Ripartizione a null - {0} - esercizio:{1} - azienda:{2}", Utility.GetMethodDescription(), esercizio != null ? esercizio.ID.ToString(CultureInfo.InvariantCulture) : "<NULL>", Login.Instance.CurrentLogin().Azienda);
                    return new List<MovimentoContabileDTO>();
                }

                if (dettaglio == null)
                {
                    _log.ErrorFormat("Dettaglio a null - {0} - esercizio:{1} - azienda:{2}", Utility.GetMethodDescription(), esercizio != null ? esercizio.ID.ToString(CultureInfo.InvariantCulture) : "<NULL>", Login.Instance.CurrentLogin().Azienda);
                    return new List<MovimentoContabileDTO>();
                }

                if (ripartizione.ContainsKey(dettaglio) && ripartizione[dettaglio] != null)
                {
                    dettaglio.Movimenti = ripartizione[dettaglio].Testata.Movimenti;
                    var movimenti = ripartizione[dettaglio].Testata.Movimenti.OrderBy(mov => mov.NumeroRiga);
                    return new List<MovimentoContabileDTO>(new List<MovimentoContabileDTO>(movimenti));
                }

                RipartizioneSpeseDTO ripartizioneDTO = null;
                foreach (var movimento in dettaglio.Movimenti)
                {
                    try
                    {
                        if (movimento != null)
                        {
                            // Escludo i movimenti che non hanno un conto definito
                            if (movimento.IdConto > 0)
                            {
                                if (dettaglio.IdSpesaRiferimento > 0)
                                {
                                    ripartizioneDTO = GetRipartizioneByMovimentoEsistente(movimento, esercizio, ripartizioneDTO, null);
                                    if(ripartizioneDTO != null && ripartizioneDTO.Testata != null && ripartizioneDTO.Testata.Movimenti != null)
                                        ripartizioneDTO.Testata.Movimenti.Clear();
                                }
                                else
                                    ripartizioneDTO = GetRipartizioneByMovimento(movimento, esercizio, ripartizioneDTO);
                            }
                            else
                            {
                                var log = LogManager.GetLogger("Sfera");
                                log.WarnFormat("ATTENZIONE: Trovato movimento senza conti definito - {0} - esercizio:{1}", Utility.GetMethodDescription(), esercizio.ID);
                            }
                        }

                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nella lettura dei movimenti per dettaglio - SINGOLO MOVIMENTO - {0} - movimento:{1} - esercizio:{2} - azienda:{3}", ex, Utility.GetMethodDescription(), movimento != null ? movimento.ID.ToString(CultureInfo.InvariantCulture) : "<NULL>", esercizio != null ? esercizio.ID.ToString(CultureInfo.InvariantCulture) : "<NULL>", Login.Instance.CurrentLogin().Azienda);
                        throw;
                    }
                }

                // Inserisco in testata i soli movimenti dello specifico dettaglio
                foreach (var movimento in dettaglio.Movimenti)
                {
                    if (ripartizioneDTO != null && ripartizioneDTO.Testata != null && ripartizioneDTO.Testata.Movimenti != null)
                        ripartizioneDTO.Testata.Movimenti.Add(movimento);
                }

                if (!ripartizione.ContainsKey(dettaglio))
                    ripartizione.Add(dettaglio, ripartizioneDTO);

                return dettaglio.Movimenti;

            }
            catch (CommunicationObjectAbortedException ex)
            {
                _log.DebugFormat("Errore nella chiamata al servizio - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda);
            }
            catch (CommunicationObjectFaultedException ex)
            {
                _log.DebugFormat("Errore nella chiamata al servizio - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda);
            }
            catch (IOException ex)
            {
                _log.DebugFormat("Errore nella chiamata al servizio - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda);
            }
            catch (ObjectDisposedException ex)
            {
                _log.DebugFormat("Errore nella chiamata al servizio - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella chiamata al servizio - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), Login.Instance.CurrentLogin().Azienda);
                throw;
            }

            return new List<MovimentoContabileDTO>();
        }
        public Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> Delete(Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> ripartizione, DettaglioSpesaDTO dettaglio, MovimentoContabileDTO movimento, SpesaDTO spesa)
        {
            dettaglio.Movimenti.Remove(movimento);
            var key = GetKey(movimento);

            if (ripartizione.ContainsKey(dettaglio) && ripartizione[dettaglio] != null)
            {
                ripartizione[dettaglio].UnitaImmobiliari.Remove(key);
                ripartizione[dettaglio].Gruppi.Remove(key);
                ripartizione[dettaglio].Stabili.Remove(key);
                ripartizione[dettaglio].Lotti.Remove(key);

                ripartizione[dettaglio].Testata.Movimenti.Remove(movimento);
            }

            return ripartizione;
        }
        public Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> SetRipartizioneByMovimento(DettaglioSpesaDTO dettaglio, MovimentoContabileDTO movimento, EsercizioDTO esercizio, RipartizioneSpeseDTO ripartizioneDettaglio, Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> ripartizione)
        {
            var ripartizioneDettaglioNew = GetRipartizioneByMovimento(movimento, esercizio, ripartizioneDettaglio);
            ripartizione[dettaglio] = ripartizioneDettaglioNew;

            //if (_isMultiSpesa)
            //{
            //    Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> newRipartizione = new Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO>(ripartizione.Count);
            //    foreach (KeyValuePair<DettaglioSpesaDTO, RipartizioneSpeseDTO> kvp in ripartizione)
            //    {
            //        RipartizioneSpeseDTO riparto = ripartizioneDettaglioNew;
            //        if (kvp.Key != dettaglio)
            //        {
            //            // Duplico il flag di selezione
            //            if (kvp.Value != null)
            //            {
            //                string key = GetKey(movimento);
            //                if (kvp.Value.UnitaImmobiliari.ContainsKey(key))
            //                {
            //                    List<UnitaImmobiliareSelectedDTO> listaUnita = kvp.Value.UnitaImmobiliari[key];
            //                    foreach (UnitaImmobiliareSelectedDTO unita in listaUnita)
            //                    {
            //                        unita.Selezionato = getSelezionatoUnita(ripartizioneDettaglioNew.UnitaImmobiliari[key], unita.ID);
            //                        unita.Stato = "U";
            //                    }
            //                }
            //            }

            //            // Calcolo la ripartizione
            //            MovimentoContabileDTO movimentoClone = cloneMovimento(movimento, dettaglio.ImportoLordo.Value, kvp.Key.ImportoLordo.Value);
            //            if (movimentoClone.IdConto > 0)
            //            {
            //                riparto = GetRipartizioneByMovimento(movimentoClone, esercizio, kvp.Value);
            //                if (kvp.Value != null)
            //                {
            //                    foreach (MovimentoContabileDTO movimentoDto in riparto.Testata.Movimenti)
            //                    {
            //                        if (isEqualMovimento(movimento, movimentoDto))
            //                        {
            //                            movimentoDto.Importo = movimentoClone.Importo;
            //                            movimentoDto.IdConto = movimentoClone.IdConto;
            //                            movimentoDto.IdSottoConto = movimentoClone.IdSottoConto;
            //                        }
            //                    }
            //                }
            //            }
            //            else
            //            {
            //                ILog _log = LogManager.GetLogger("Sfera");
            //                log4net.MDC.Set("user", Gipasoft.Security.Login.Instance.CurrentLogin().LoginName);
            //                log.Warn("ATTENZIONE: Trovato movimento senza conti definito - " + Gipasoft.Library.Utility.GetMethodDescription() + " - dettaglio:" + dettaglio.ID + " - esercizio:" + esercizio.ID);
            //            }
            //        }

            //        newRipartizione.Add(kvp.Key, riparto);
            //        kvp.Key.Movimenti = riparto.Testata.Movimenti;
            //    }
            //    ripartizione = newRipartizione;
            //}

            return ripartizione;
        }
        public Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> SetRipartizioneByModello(DettaglioSpesaDTO dettaglio, int idEsercizio, int idModello, int idCausale, decimal importo, Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO> ripartizione, TipoMovimentoEnum tipo)
        {
            var ripartizioneDettaglioNew = GetServiceClient().GetRipartizioneByModello(idEsercizio, 0, idModello, idCausale, importo, tipo, GetUserInfo());
            ripartizione[dettaglio] = ripartizioneDettaglioNew;

            if (_isMultiSpesa)
            {
                var newRipartizione = new Dictionary<DettaglioSpesaDTO, RipartizioneSpeseDTO>(ripartizione.Count);
                foreach (var kvp in ripartizione)
                {
                    var riparto = ripartizioneDettaglioNew;
                    if (kvp.Key != dettaglio)
                    {
                        riparto = GetRipartizioneByModello(idEsercizio, null, idModello, idCausale, kvp.Key.ImportoLordo.GetValueOrDefault(), tipo);
                        kvp.Key.Movimenti = riparto.Testata.Movimenti;
                    }

                    newRipartizione.Add(kvp.Key, riparto);
                }
                ripartizione = newRipartizione;
            }

            CloseService();
            return ripartizione;
        }
        public string GetDescrizioneTab(DettaglioSpesaDTO dettaglio)
        {
            string descrizione;
            if (!_isMultiSpesa)
                descrizione = "Dettaglio";
            else
                descrizione = "Al. " + dettaglio.AliquotaIva + "%";

            return descrizione;
        }