using System;
using update.Crm;
using update.Crm.Lib;
using update.Lib.Extensions;
using update.Crm.BusinessObjects;
using update.Crm.Contracts;
using update.Crm.Contracts.BusinessObjects;
using update.Crm.Contracts.InfoAreaServices;
using update.Crm.Contracts.Services;
using update.Crm.Contracts.Extensions;
using update.Crm.Contracts.Links;
using update.Crm.Data;
using update.Crm.Extensions;
using update.Crm.Filters;
using update.Crm.Links;
using update.Crm.Schema;
using update.Lib.Contracts;
using update.Lib.Contracts.Exceptions;
using update.Web.Base.Contracts.Channels;
using update.Web.Channels;
using Filter = update.Crm.Filters.Filter;
using System.IO;
using System.Net;
using System.Collections.Generic;
using System.Text;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace BDK.Template.Channels
{
    [Channel]
    internal class BDKChannel : Channel
    {
        private const string LogFacilityName = "BDKChannel";
        [ChannelMethod]


        public string CHBonus1(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Kontakt vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000004ed");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7044, 7043, 7042, 7041, 7033, 7032, 7031, 7030, 7028, 7027, 7021, 7020, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 49, 48, 47, 42, 41, 23, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();
               

                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();
                  

                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2", X3Result.Get(41).ToString());
                        fields.SetField("TST_vp", X3Result.Get(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
               // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }

        public string CHBonus4(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000004f0");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7044, 7043, 7042, 7041, 7034, 7033, 7032, 7031, 7030, 7028, 7027, 7026, 7025, 7022, 7021, 7020, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 63, 49, 48, 47, 42, 41, 23, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("TST_vp", X3Result.Get(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                     

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }

        public string CHBonus2(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000004ee");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7044, 7043, 7042, 7041, 7033, 7032, 7031, 7030, 7028, 7027, 7021, 7020, 7015, 7014, 7013, 7012, 7011, 7010, 7009, 7008, 7007, 7006, 7004, 7000, 76, 75, 74, 65, 64, 62, 51, 50, 49, 48, 47, 45, 42, 41, 40, 39, 38, 23, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("versquotext3", X3Result.Get(7015).ToString());
                        fields.SetField("versquotext2", X3Result.Get(7014).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7009).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7008).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7007).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("versquotext1", X3Result.Get(7004).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("versqou3 ", X3Result.Get(62).ToString());
                        fields.SetField("versqou2 ", X3Result.Get(51).ToString());
                        fields.SetField("versqou1", X3Result.Get(50).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("Versbontext", X3Result.Get(45).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("ab32", X3Result.Get(40).ToString());
                        fields.SetField("ab22", X3Result.Get(39).ToString());
                        fields.SetField("ab12", X3Result.Get(38).ToString());
                        fields.SetField("TST_vp", X3Result.Get(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());



                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHBonus3(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000004ef");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7044, 7043, 7042, 7041, 7034, 7033, 7032, 7031, 7030, 7028, 7027, 7026, 7025, 7022, 7021, 7020, 7015, 7014, 7013, 7012, 7011, 7010, 7009, 7008, 7007, 7006, 7004, 7000, 76, 75, 74, 65, 64, 63, 62, 51, 50, 49, 48, 47, 45, 42, 41, 40, 39, 38, 23, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("versquotext3", X3Result.Get(7015).ToString());
                        fields.SetField("versquotext2", X3Result.Get(7014).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7009).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7008).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7007).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("versquotext1", X3Result.Get(7004).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("versqou3 ", X3Result.Get(62).ToString());
                        fields.SetField("versqou2 ", X3Result.Get(51).ToString());
                        fields.SetField("versqou1", X3Result.Get(50).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("Versbontext", X3Result.Get(45).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("ab32", X3Result.Get(40).ToString());
                        fields.SetField("ab22", X3Result.Get(39).ToString());
                        fields.SetField("ab12", X3Result.Get(38).ToString());
                        fields.SetField("TST_vp", X3Result.Get(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                        
                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHBonus4FSS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300000427");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7045, 7044, 7043, 7042, 7041, 7034, 7033, 7032, 7031, 7030, 7028, 7027, 7026, 7025, 7022, 7021, 7020, 7016, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 63, 49, 48, 47, 42, 41, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("TST_vp", X3Result.Get(7016).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHBonus2FSS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300000425");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7045, 7044, 7043, 7042, 7041, 7033, 7032, 7031, 7030, 7028, 7027, 7021, 7021, 7020, 7016, 7015, 7014, 7013, 7012, 7011, 7010, 7009, 7008, 7007, 7006, 7004, 7000, 76, 75, 74, 65, 64, 62, 51, 50, 49, 48, 47, 45, 42, 41, 40, 39, 38, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("TST_vp", X3Result.Get(7016).ToString());
                        fields.SetField("versquotext3", X3Result.Get(7015).ToString());
                        fields.SetField("versquotext2", X3Result.Get(7014).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7009).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7008).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7007).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("versquotext1", X3Result.Get(7004).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("versqou3 ", X3Result.Get(62).ToString());
                        fields.SetField("versqou2 ", X3Result.Get(51).ToString());
                        fields.SetField("versqou1", X3Result.Get(50).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("Versbontext", X3Result.Get(45).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("ab32", X3Result.Get(40).ToString());
                        fields.SetField("ab22", X3Result.Get(39).ToString());
                        fields.SetField("ab12", X3Result.Get(38).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());                        


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHBonus3FSS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300000426");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7045, 7044, 7043, 7042, 7041, 7034, 7033, 7032, 7031, 7030, 7028, 7027, 7026, 7025, 7022, 7021, 7020, 7016, 7015, 7014, 7013, 7012, 7011, 7010, 7009, 7008, 7007, 7006, 7004, 7000, 76, 75, 74, 65, 64, 63, 62, 51, 50, 49, 48, 47, 45, 42, 41, 40, 39, 38, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("TST_vp", X3Result.Get(7016).ToString());
                        fields.SetField("versquotext3", X3Result.Get(7015).ToString());
                        fields.SetField("versquotext2", X3Result.Get(7014).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7009).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7008).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7007).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("versquotext1", X3Result.Get(7004).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("Produktquote", X3Result.Get(63).ToString());
                        fields.SetField("versqou3 ", X3Result.Get(62).ToString());
                        fields.SetField("versqou2 ", X3Result.Get(51).ToString());
                        fields.SetField("versqou1", X3Result.Get(50).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("Versbontext", X3Result.Get(45).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("ab32", X3Result.Get(40).ToString());
                        fields.SetField("ab22", X3Result.Get(39).ToString());
                        fields.SetField("ab12", X3Result.Get(38).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                        


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHBonus1FSS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000003c1");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7045, 7044, 7043, 7042, 7041, 7033, 7032, 7031, 7030, 7028, 7027, 7021, 7020, 7016, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 49, 48, 47, 42, 41, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5 ", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5 ", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("TST_vp", X3Result.Get(7016).ToString());
                        fields.SetField("teur3", X3Result.Get(7013).ToString());
                        fields.SetField("teur2", X3Result.Get(7012).ToString());
                        fields.SetField("teur1", X3Result.Get(7011).ToString());
                        fields.SetField("ab1", X3Result.Get(7010).ToString());
                        fields.SetField("Allgemein2", X3Result.Get(7006).ToString());
                        fields.SetField("Allgemein", X3Result.Get(7000).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("ab3", X3Result.Get(42).ToString());
                        fields.SetField("ab2 ", X3Result.Get(41).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());



                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHFFSGWBonus(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030001cf86");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7045, 7040, 7039, 7038, 7037, 7036, 7035, 7021, 7020, 76, 75, 74, 49, 48, 47, 23, 22, 21, 20, 5 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("HF_Stufe3_200", X3Result.Get(7040).ToString());
                        fields.SetField("HF_Stufe2_200", X3Result.Get(7039).ToString());
                        fields.SetField("HF_Stufe1_200", X3Result.Get(7038).ToString());
                        fields.SetField("HF_Stufe3_100", X3Result.Get(7037).ToString());
                        fields.SetField("HF_Stufe2_100", X3Result.Get(7036).ToString());
                        fields.SetField("HF_Stufe1_100", X3Result.Get(7035).ToString());
                        fields.SetField(" TST_pb ", X3Result.Get(7021).ToString());
                        fields.SetField("TST_gb", X3Result.Get(7020).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1", X3Result.Get(74).ToString());
                        fields.SetField("stufeteur3", X3Result.Get(49).ToString());
                        fields.SetField("stufeteur2", X3Result.Get(48).ToString());
                        fields.SetField("stufeteur1", X3Result.Get(47).ToString());
                        fields.SetField("TST_vp", X3Result.Get(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.Get(22).ToString());
                        fields.SetField("TST_bvart", X3Result.Get(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.Get(20).ToString());
                        fields.SetField("TST_laufnr", X3Result.Get(5).ToString());



                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHZusatzOFLBLB(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030001cf5e");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 64, 65 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHZusatzLSP(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030001cf72");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 64, 65, 79 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gesellschafter", X3Result.Get(79).ToString());


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }
        public string CHZusatzOFL(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
             * Diese Funktion gleoich anpassen
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Kontakt und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Ursprungskontakt verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Kontakt mitgegeben wurden. Wenn nicht wird das Programm beendet.
            if (options == null)
                throw new ArgumentNullException("options");

            //Aktuellen Anwendungskontext in Variable merken
            var services = this.Services;

            try
            {
                //Es muss ein gültiger Bonusplan vorhanden sein
                if (options.X3Link == null || !options.X3Link.IsValid)
                {
                    throw new InvalidOperationException("X3 link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030001d0a6");
                    //Den Kontakt von der Datenbank lesen der dem Channel übergeben wurde
                    var X3ID = RecordUid.Parse(options.X3Link.InfoAreaId, options.X3Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.X3Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.X3Link.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 64, 65 });
                    IBusinessObject X3Result = command.Execute();


                    //Die Firma raussuchen die mit dem X3 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();


                    //Einen Memorystream öffnen und die PDF-Vorlage in den Stream laden                          
                    System.IO.Stream documentStream = new System.IO.MemoryStream();
                    var pdfvorlage = services.Get<IDocumentsService>();
                    pdfvorlage.LoadDocument(DocUid, documentStream);

                    //Erstellen des neuen PDFs, dafür wird ein zweiter Memory stream geöffnet.                 
                    using (MemoryStream newDocument = new MemoryStream())
                    {
                        //An Position 0 des Streams springen der die Vorlage enthält
                        documentStream.Position = 0;
                        //Lesendes und schreibendes PDF-Objekt erstellen (auf Basis der beiden MemoryStreams
                        PdfReader reader = new PdfReader(documentStream);
                        PdfStamper stamper = new PdfStamper(reader, newDocument);
                        //Variable für die Formularfelder Füllen
                        AcroFields fields = stamper.AcroFields;
                        //Formularfelder füllen

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


                        RecordUid docid = RecordUid.Parse("D1", "x00000003000206b4");
                        //Neuen MemoryStream erzeugen. Die Funktion saveDocument benötigt einen offenen Memorystream.
                        //Die Methode .ToArray() kann auch auf einen geschlossenen MemoryStream ausgeführt werden
                        MemoryStream DokumentUpload = new MemoryStream(newDocument.ToArray());
                        //An Position 0 des neuen Memory Streams springen
                        DokumentUpload.Position = 0;
                        var neuesDokument = services.Get<IDocumentsService>();
                        neuesDokument.SaveDocument(docid, DokumentUpload);


                        //var neuesDokument = new Documents(this.Services) { Name = "K.pdf" };
                        //neuesDokument.New();


                        //Neues Dokument in einem D1 Datensatz speichern
                        //pdfvorlage.SaveDocument(neuesDokument.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken
                        /*
                        var doclink = DocumentsTools.CreateLink(services, MAID, neuesDokument.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(neuesDokument.Uid);*/
                        return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // Selve.Template.Libs.Logging.Error(String.Format("Error in 'MyMethod': {0}", ex.Message), LogFacilityName);
                RecordUid voiddokument = RecordUid.Parse("D1", "0");
                var documentsruek1 = services.Get<IDocumentsService>();
                return documentsruek1.ToDocumentKey(voiddokument);
            }
        }

        [ChannelMethod]
        public void BDKThrowException()
        {
            throw new NotImplementedException();
        }



    }

    public class AppointmentRecordOptions
    {
        public LinkRecordUid CompanyLink { get; set; }

        public LinkRecordUid PersonLink { get; set; }

        public LinkRecordUid MALink { get; set; }

        public LinkRecordUid X3Link { get; set; }
    }
}
