public CBIEnvelPaymentRequest()
 {
     CBIPaymentRequest = new CBIPaymentRequest000400();
 }
        /// <summary>
        /// Crea il file per la disposizione dei bonifici in formato SEPA SCT
        /// Nel caso in cui siano presenti più debitori (Condomini) viene creato un file zip contenente tutte le disposizioni di bonifico
        /// </summary>
        /// <param name="disposizione">Oggetto contenente tutti i metadati dei bonifici</param>
        /// <param name="accorpate">Usato solo per i bonifici CBI</param>
        /// <param name="idModello">Usato solo per i pagamenti manuali</param>
        /// <param name="testataPerCondominio">Usato solo per i bonifici CBI</param>
        /// <param name="mittenteCondominio">Usato solo per i bonifici CBI</param>
        /// <returns></returns>
        public ResultPagamento EsecuzionePagamenti(Disposizione disposizione, bool accorpate, int? idModello, bool testataPerCondominio, bool mittenteCondominio)
        {
            string message;

            try
            {
                var documentInfo = new DocumentInfo();
                message = IsAllowPagamento(disposizione.Pagamenti.Select(item => item.ScadenzaRiferimento.ID).ToList(), true);
                if (string.IsNullOrEmpty(message))
                {
                    var pagamenti = disposizione.Pagamenti.GroupBy(item => item.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento).ToList();

                    var stream = new MemoryStream();
                    ZipFile zipFile = null;
                    var singleFileName = string.Empty;
                    if (pagamenti.Count > 1)
                        zipFile = new ZipFile();

                    foreach (var pagamentiGroupByCondominio in pagamenti)
                    {
                        try
                        {
                            var sepa = new CBIPaymentRequest000400
                            {
                                PaymentInfo = getPaymentInfo(pagamentiGroupByCondominio.Key, pagamentiGroupByCondominio.ToList()),
                                GroupHeader = getGroupHeader(pagamentiGroupByCondominio.ToList(), pagamentiGroupByCondominio.Key)
                            };

                            var envelop = new CBIBdyPaymentRequest000400 { CBIEnvelPaymentRequest = { CBIPaymentRequest = sepa } };

                            var streamContent = Library.XML.SerializerHelper<CBIBdyPaymentRequest000400>.Serialize(envelop, new List<string> { "urn:CBI:xsd:CBIBdyPaymentRequest.00.04.00", "urn:CBI:xsd:CBIPaymentRequest.00.04.00" });
                            var fileName = ContabilitaHelper.GetFileName("Pagamenti", pagamentiGroupByCondominio.Key);

                            if (zipFile != null)
                            {
                                streamContent.Seek(0, SeekOrigin.Begin);
                                zipFile.AddEntry($"{fileName}.xml", streamContent);
                            }
                            else
                            {
                                stream = (MemoryStream)streamContent;
                                singleFileName = fileName;
                            }
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Errore inaspettato durante la creazione del file CBI dei bonifici - SINGOLO CONDOMINIO - {0} - condominio:{1} - modello:{2} - disposizione:{3} - azienda:{4}", ex, Library.Utility.GetMethodDescription(), pagamentiGroupByCondominio.Key.ID, idModello, disposizione.ID, disposizione.Azienda.ID);
                            throw;
                        }
                    }

                    if (zipFile != null)
                    {
                        documentInfo.FileName = ContabilitaHelper.GetFileName("Pagamenti", null);
                        documentInfo.FileExtension = ".zip";

                        zipFile.Save(stream);
                        var documentMessages = _documentService.SaveDocument(stream.ToArray(), documentInfo.FileName, documentInfo.FileExtension, null, disposizione.Azienda.ID);
                        var documento = new Documento(documentMessages.Documento.Checksum, documentInfo.FileName, documentInfo.FileExtension, "DisposizioneBonifico", false, disposizione.Azienda);
                        _daoFactory.GetDocumentoDao().Save(documento);
                        disposizione.Documento = documento;
                        documentInfo.Body = stream.ToArray();
                        zipFile.Dispose();
                    }
                    else
                    {
                        documentInfo.Body = stream.ToArray();
                        documentInfo.FileName = singleFileName;
                        documentInfo.FileExtension = ".xml";
                        disposizione.ContenutoFile = Library.Conversione.ToString(documentInfo.Body);
                    }

                    stream.Close();
                    stream.Dispose();
                }
                
                return new ResultPagamento(message, documentInfo, null);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la creazione del file CBI dei bonifici - {0} - modello:{1} - disposizione:{2} - azienda:{3}", ex, Library.Utility.GetMethodDescription(), idModello, disposizione.ID, disposizione.Azienda.ID);
                message = "Si sono verificati problemi inaspettati durante la creazione del file CBI dei bonifici." + Environment.NewLine + "Controllare il log per ulteriori dettagli.";
                return new ResultPagamento(message, new DocumentInfo(), null);
            }
        }