public AnteprimaReportEmissioneRate(IList<RataEmissioneDTO> dataSource, CondominioDTO condominio, DatiBancariDTO banca, string note, bool firma, DateTime dataRicevuta, IAziendaService aziendaService)
        {
            InitializeComponent();
            _dataSource = dataSource;
            _condominio = condominio;
            _dataRicevuta = dataRicevuta;

            _note = note;
            _firma = firma;
            _aziendaService = aziendaService;
            _banca = banca;

            try
            {
                _document = new RicevutaRata(dataSource, note, firma, aziendaService);

                // ======================================
                // Parametri
                // ======================================
                if (banca != null)
                {
                    _document.Parameters["banca"].Value = banca.Descrizione;
                    _document.Parameters["coordinateBancarie"].Value = banca.Iban;
                }

                _document.Parameters["dataRicevuta"].Value = _dataRicevuta;

                var amministratore = aziendaService.GetAmministratore();
                if (amministratore != null)
                    _document.Parameters["nomeAmministratore"].Value = $"{amministratore.Nome} {amministratore.Cognome}";
                SetDataSource(_document, null);

            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nell'apertura della maschera di anteprima per emissione rate - {0} - condominio:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), _condominio?.ID.ToString() ?? "<NULL>", Login.Instance.CurrentLogin().Azienda);
                throw;
            }
        }
        public string FormattaTesto(CondominioDTO condominio, DatiBancariDTO banca, decimal? importo, decimal? importoTotale, string testoNota)
        {
            int? idDatiBancari = null;
            if(banca != null)
                idDatiBancari = banca.ID;
            
            int? idCondominio = null;
            if (condominio != null)
                idCondominio = condominio.ID;

            try
            {
                var result = GetServiceClient().ApplicaStampaUnione(testoNota, new ParametriStampaUnione { IdCondominio = idCondominio, IdDatiBancari = idDatiBancari, TipoIndirizzo = TipoIndirizzo.NonDefinito, Importo = importo, ImportoTotale = importoTotale }, GetUserInfo());
                CloseService();
                return result;
            }
            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 formattazione delle note - {0} - condominio:{1} - banca:{2} - importo:{3} - importoTotale:{4} - azienda:{1}", ex, Utility.GetMethodDescription(), condominio != null ? condominio.ID.ToString() : "<NULL>", banca != null ? banca.ID.ToString() : "<NULL>", importo.GetValueOrDefault(), importoTotale.GetValueOrDefault(), Login.Instance.CurrentLogin().Azienda);
            }

            return testoNota;
        }
        public DatiBancariDTO[] GetAll()
        {
            try
            {
                var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
                var lista = daoFactory.GetDatiBancariCondominiDao().GetAll();
                var listaDto = new DatiBancariDTO[lista.Count];

                var index = 0;
                foreach (var item in lista)
                {
                    listaDto[index] = setDto(item);
                    index++;
                }

                return listaDto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nel caricamento dei dati bancari - {0}", ex, Utility.GetMethodDescription());
                throw;
            }
        }
        private DatiBancariCondomini manage(DatiBancariDTO dto)
        {
            DatiBancariCondomini item = null;
            bool result;

            // Controllo sullo stato U, I
            switch (dto.Stato.ToUpper())
            {
                case "U":
                    result = update(dto, out item);

                    if (!result)
                        throw new Exception("Il dato sul database è più recente di quello utilizzato");
                    break;
                case "I":
                    result = insert(dto, out item);

                    //if (!result)
                    //    throw new Exception("Impossibile scrivere sul database");
                    break;
                case "D":
                    delete(dto.ID);
                    break;
            }
            return item;
        }
        private bool insert(DatiBancariDTO dto, out DatiBancariCondomini item)
        {
            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
            bool result;

            try
            {
                var abiCab = daoFactory.GetAbiCabDao().GetByAbiCab(dto.Abi, dto.Cab);
                if (abiCab != null)
                {
                    item = new DatiBancariCondomini(dto.Iban, daoFactory.GetCondominioDao().GetById(dto.IdCondominio, false))
                    {
                        Abi = dto.Abi,
                        Cab = dto.Cab,
                        Cin = dto.Cin,
                        ContoCorrente = dto.ContoCorrente.Truncate(50),
                        DataValidita = dto.DataValidita,
                        Iban = dto.Iban.Truncate(27),
                        Note = dto.Note.Truncate(50),
                        Principale = dto.Principale
                    };

                    if (string.IsNullOrEmpty(item.Iban) && !string.IsNullOrEmpty(item.Abi) && !string.IsNullOrEmpty(item.Cab) && !string.IsNullOrEmpty(item.ContoCorrente))
                    {
                        var coord = new CoordinateBancarie();
                        try
                        {
                            coord.Abi = item.Abi;
                            coord.Cab = item.Cab;
                            coord.ContoCorrente = item.ContoCorrente;
                            item.Iban = coord.CalcolaIBAN();
                            item.ContoCorrente = coord.ContoCorrente;
                        }
                        catch (Exception ex)
                        {
                            _log.WarnFormat("Errore inaspettato nel calcolo dell'IBAN - {0} - id:{1} - abi:{2} - cab:{3} - c/c:{4}", ex, Utility.GetMethodDescription(), dto.ID, dto.Abi, dto.Cab, dto.ContoCorrente);
                        }

                        if (string.IsNullOrEmpty(item.Cin))
                        {
                            try
                            {
                                item.Cin = coord.CalcolaCin();
                            }
                            catch (Exception ex)
                            {
                                _log.WarnFormat("Errore inaspettato nel calcolo del CIN - {0} - id:{1} - abi:{2} - cab:{3} - c/c:{4}", ex, Utility.GetMethodDescription(), dto.ID, dto.Abi, dto.Cab, dto.ContoCorrente);
                            }
                        }
                    }

                    daoFactory.GetDatiBancariCondominiDao().SaveOrUpdate(item);

                    // Aggiungo ABI e CAB tra i preferiti
                    try
                    {
                        if (item.CondominioRiferimento != null && item.CondominioRiferimento.Azienda != null)
                        {
                            var abicabPref = daoFactory.GetAbiCabPreferitoDao().GetByAbiCab(item.Abi, item.Cab, item.CondominioRiferimento.Azienda.ID);
                            if (abicabPref == null)
                            {
                                var abicab = daoFactory.GetAbiCabDao().Find(new AbiCabId(item.Abi, item.Cab), false);
                                if (abicab != null)
                                {
                                    abicabPref = new AbiCabPreferito(abicab, item.CondominioRiferimento.Azienda);
                                    daoFactory.GetAbiCabPreferitoDao().SaveOrUpdate(abicabPref);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.WarnFormat("Errore nell'inserimento di ABI e CAB preferito - {0} - id:{1} - abi:{2} - cab:{3} - c/c:{4}", ex, Utility.GetMethodDescription(), dto.ID, dto.Abi, dto.Cab, dto.ContoCorrente);
                    }

                }
                else
                {
                    _log.ErrorFormat("Non trovato ABI CAB - {0} - abi:{1} - cab:{2}", Utility.GetMethodDescription(), dto.Abi, dto.Cab);
                    item = null;
                    return false;
                }

                result = true;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nell'inserimento dei dati bancari - {0} - id:{1} - abi:{2} - cab:{3} - c/c:{4}", ex, Utility.GetMethodDescription(), dto.ID, dto.Abi, dto.Cab, dto.ContoCorrente);
                throw;
            }

            return result;
        }
        private bool update(DatiBancariDTO dto, out DatiBancariCondomini item)
        {
            var result = false;
            item = null;
            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);

            try
            {
                item = daoFactory.GetDatiBancariCondominiDao().Find(dto.ID, false);

                if (item != null)
                {
                    //// Condizione necessaria per il controllo del fatto che sul DB ho una versione uguale o più vecchia
                    //if (dto.Version == item.Version)
                    //{
                        var abicab = daoFactory.GetAbiCabDao().Find(new AbiCabId(dto.Abi, dto.Cab), false);
                        if (abicab != null)
                        {
                            item.Abi = dto.Abi;
                            item.Cab = dto.Cab;
                            item.Cin = dto.Cin;
                            item.ContoCorrente = dto.ContoCorrente.Truncate(50);
                            item.DataValidita = dto.DataValidita;
                            item.Iban = dto.Iban.Truncate(27);
                            item.Note = dto.Note.Truncate(50);
                            item.Principale = dto.Principale;

                            // Aggiungo ABI e CAB tra i preferiti
                            var abicabPref = daoFactory.GetAbiCabPreferitoDao().GetByAbiCab(item.Abi, item.Cab, item.CondominioRiferimento.Azienda.ID);
                            if (abicabPref == null)
                            {
                                abicabPref = new AbiCabPreferito(abicab, item.CondominioRiferimento.Azienda);
                                daoFactory.GetAbiCabPreferitoDao().SaveOrUpdate(abicabPref);
                            }

                            result = true;
                        }
                        else
                        {
                            _log.WarnFormat("Tentativo di aggiornare dati bancari con ABI CAB inesistente - {0} - id:{1} - ABI:{2} - CAB:{3} - condominio:{4} - IBAN:{5} - azienda:{6}", Utility.GetMethodDescription(), dto.ID, dto.Abi, dto.Cab, dto.IdCondominio, dto.Iban, _info.Azienda);
                            result = true;
                        }  
                    //}
                    //else
                    //{
                    //    // Eccezione: Sul db c'è qualche cosa di più nuovo.
                    //    _log.ErrorFormat("Errore nel salvataggio dei dati bancari il dato sul db è più recente di quello che si vuole salvare - {0} - id:{1} - azienda:{2}", Utility.GetMethodDescription(), dto.ID, _info.Azienda);
                    //}
                }
                else
                {
                    _log.WarnFormat("Tentativo di aggiornare DatiBancari inesistenti - {0} - id:{1} - azienda:{2}", Utility.GetMethodDescription(), dto.ID, _info.Azienda);
                    return true;
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nel salvataggio dei dati bancari - {0} - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, _info.Azienda);
                throw;
            }

            return result;
        }
        private DatiBancariDTO setDto(DatiBancariCondomini item)
        {
            var dto = new DatiBancariDTO
            {
                ID = item.ID,
                Abi = item.Abi,
                Cab = item.Cab,
                ContoCorrente = item.ContoCorrente,
                Cin = item.Cin,
                Iban = item.Iban,
                Note = item.Note,
                DataValidita = item.DataValidita,
                Principale = item.Principale,
                IdCondominio = item.CondominioRiferimento.ID
            };

            try
            {
                var abiCab = BancheHelper.GetAbiCabDescription(dto.Abi, dto.Cab, WindsorConfigRepository.GetKey(_info.Azienda));
                dto.Descrizione = $"{abiCab[0]} - {abiCab[1]}";
                dto.DescrizioneAbi = dto.Abi + " - " + abiCab[0];
                dto.DescrizioneCab = dto.Cab + " - " + abiCab[1];
                dto.DisplayName = dto.DescrizioneAbi + " / " + dto.DescrizioneCab;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella decodifica dei dati bancari - {0} - id:{1} - abi:{2} - cab:{3}", ex, Utility.GetMethodDescription(), item.ID, dto.Abi, dto.Cab);
                throw;
            }

            dto.Version = item.Version;

            return dto;
        }
 public DatiBancariCondomini ManageDomainEntity(DatiBancariDTO dto)
 {
     try
     {
         return manage(dto);
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nella gestione dei dati bancari - {0} - id:{1}", ex, Utility.GetMethodDescription(), dto.ID);
         throw;
     }
 }
 public string IsAllowDeleteBanca(DatiBancariDTO datiBancari)
 {
     var result = GetServiceClient().IsAllowDeleteContoBancario(datiBancari.ID, GetUserInfo());
     CloseService();
     return result;
 }