using System;
using BDK;
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.Contracts.Data;
using update.Crm.Contracts.Collections;
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;
using BDK.Template;
using update.Lib.Contracts.Export;
using System.Text.RegularExpressions;

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


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

            //Prüfen ob dem Channel informationen über den Bonusplan 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 3-1261 (stano+serno)
                    var DocUid = RecordUid.Parse("D1", "x00000003000004ed");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    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, 7088, 88, 7087, 7047, 7089, 7084, 7059, 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, 7016, 7081});
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen

                        // Jahreszahl ANFANG
                        Int32 start = X3Result.GetDate(65).Year;
                        Int32 ende = X3Result.GetDate(64).Year;
                        String jahre = start.ToString();
                        if(start < ende)
                            jahre = start + "/" + ende;  
                        fields.SetField("Jahr", jahre);
                        // Jahreszahl ENDE
                        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("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(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.GetCatalogText(7016).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("HF_SUB_Text", X3Result.Get(7081).ToString());
                        
                        //Einleitung ANFANG
                        //neu OHI 28.10.2019                        
                        //wenn angeschlBet aktiv:
                        string einlBonusAN = "durch den Händler und dessen in der Anlage Angeschlossene Betriebe aufgeführten Betriebe an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";
                        
                        //wenn nicht:
                        string einlBonusAUS = "durch den Händler an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";

                        if (X3Result.Get(7089).ToString() == "J")
                            fields.SetField("EinleitungBonus", einlBonusAN);
                        else
                            fields.SetField("EinleitungBonus", einlBonusAUS);
                        //Einleitung ENDE

                        // Liste Anlage ANFANG
                        string anlagen = "- Keine Anlagen";
                        if (X3Result.Get(7059).ToString() == "J" || X3Result.Get(7084).ToString() == "J" || X3Result.Get(7088).ToString() == "J" || X3Result.Get(88).ToString() == "J" || X3Result.Get(7087).ToString() == "J" || X3Result.Get(7047).ToString() == "J" || X3Result.Get(7089).ToString() == "J")
                        {
                            anlagen = "";
                            //fields.SetField("Anlagen", "Anlagen: ");
                            if (X3Result.Get(7059).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Steigerungsbonus";
                            if (X3Result.Get(7084).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Plus 50% Versicherungsprovision";
                            if (X3Result.Get(7088).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage JuhuAuto";
                            if (X3Result.Get(88).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Loyalitätsbonus";
                            if (X3Result.Get(7087).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Doppelter Bonus";
                            if (X3Result.Get(7047).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Remarketing";
                            if (X3Result.Get(7089).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Angeschlossene Betriebe";
                            anlagen = anlagen + Environment.NewLine + "Die jeweilige vorstehend aufgeführte Anlage ist Bestandteil dieser Bonusvereinbarung 2023. Sofern Regelungen in einer der Anlagen Regelungen dieser Bonusvereinbarung 2023 widersprechen, gehen die Regelungen der Anlage den Regelungen dieser Bonusvereinbarung 2023 vor.";
                        }
                        fields.SetField("Anlagen", anlagen);
                        // Liste Anlage ENDE

                        // * 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", "x0000271100000952");
                        //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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus"+string.Format("{0:yyyy}",X3Result.GetDate(65))+"_1"+"_"+bocompany.Get(2)+".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString()," ") + ".pdf" };
                        docCommand.Execute();



                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
               // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * Änderungsdatum:06.10.2016 (BoCa)
              * Änderungsdatum:05.03.2019 + 13.11.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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[] { 7095, 7045, 7088, 88, 7087, 7047, 7089, 7084, 7059, 7080, 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, 7016, 7052, 7053, 7049, 7050, 7051, 7056, 7081 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(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("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("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("TST_vp", X3Result.GetCatalogText(7016).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("Produktanteil2", X3Result.Get(7052).ToString());
                        fields.SetField("Produktbonus2", X3Result.Get(7053).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).ToString());
                        fields.SetField("HF_Prod_ab", X3Result.Get(7056).ToString());
                        fields.SetField("HF_SUB_Text", X3Result.Get(7081).ToString());
                        // im Bonus 2022 am 26.10.2021 neu hinzugefügt
                        fields.SetField("Produktbonus_Art", X3Result.GetCatalogText(7095).ToString());

                        //Begriff_Produktquote ANFANG                     
                        if (X3Result.GetCatalogText(7095).ToString().Equals("Finanzierung"))
                            fields.SetField("Begriff_Produktquote", "Unter dem Begriff \"Produktquote\" versteht man den Anteil des Produkts Finanzierung an dem vom Händler vermittelten Gesamtumsatz");
                        else if (X3Result.GetCatalogText(7095).ToString().Equals("Leasing"))
                            fields.SetField("Begriff_Produktquote", "Unter dem Begriff \"Produktquote\" versteht man den Anteil des Produkts Leasing an dem vom Händler vermittelten Gesamtumsatz");
                        else fields.SetField("Begriff_Produktquote", ".");
                        //Begriff_Produkquote ENDE

                        //Begriff Produktbonus_Vorraussetzung ANFANG
                        if (X3Result.GetCatalogText(7095).ToString().Equals("Finanzierung"))
                            fields.SetField("Produktbonus_Vorraussetzung", "Voraussetzung für den Erhalt des Produktbonus ist, dass der Händler eine der im Volumenbonus genannten Gesamtumsatzstufen und die Produktquote für den Bereich Finanzierung im definierten Zeitraum erreicht. Die Produktquote und die Höhe des Produktbonus werden wie folgt vereinbart:");
                        else if (X3Result.GetCatalogText(7095).ToString().Equals("Leasing"))
                            fields.SetField("Produktbonus_Vorraussetzung", "Voraussetzung für den Erhalt des Produktbonus ist, dass der Händler eine der im Volumenbonus genannten Gesamtumsatzstufen und die Produktquote für den Bereich Leasing im definierten Zeitraum erreicht. Die Produktquote und die Höhe des Produktbonus werden wie folgt vereinbart:");
                        else fields.SetField("Produktbonus_Vorraussetzung", ".");
                        //Begriff Produktbonus_Vorraussetzung ENDE

                        // Jahreszahl ANFANG
                        Int32 start = X3Result.GetDate(65).Year;
                        Int32 ende = X3Result.GetDate(64).Year;
                        String jahre = start.ToString();
                        if (start < ende)
                            jahre = start + "/" + ende;
                        fields.SetField("Jahr", jahre);
                        // Jahreszahl ENDE

                        //Einleitung ANFANG
                        //neu OHI 28.10.2019                        
                        //wenn angeschlBet aktiv:
                        string einlBonusAN = "durch den Händler und dessen in der Anlage Angeschlossene Betriebe aufgeführten Betriebe an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";

                        //wenn nicht:
                        string einlBonusAUS = "durch den Händler an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";

                        if (X3Result.Get(7089).ToString() == "J")
                            fields.SetField("EinleitungBonus", einlBonusAN);
                        else
                            fields.SetField("EinleitungBonus", einlBonusAUS);
                        //Einleitung ENDE

                        // Liste Anlage ANFANG
                        string anlagen = "- Keine Anlagen";
                        if (X3Result.Get(7059).ToString() == "J" || X3Result.Get(7084).ToString() == "J" || X3Result.Get(7088).ToString() == "J" || X3Result.Get(88).ToString() == "J" || X3Result.Get(7087).ToString() == "J" || X3Result.Get(7047).ToString() == "J" || X3Result.Get(7089).ToString() == "J")
                        {
                            anlagen = "";
                            //fields.SetField("Anlagen", "Anlagen: ");
                            if (X3Result.Get(7059).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Steigerungsbonus";
                            if (X3Result.Get(7084).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Plus 50% Versicherungsprovision";
                            if (X3Result.Get(7088).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage JuhuAuto";
                            if (X3Result.Get(88).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Loyalitätsbonus";
                            if (X3Result.Get(7087).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Doppelter Bonus";
                            if (X3Result.Get(7047).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Remarketing";
                            if (X3Result.Get(7089).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Angeschlossene Betriebe";
                            anlagen = anlagen + Environment.NewLine + "Die jeweilige vorstehend aufgeführte Anlage ist Bestandteil dieser Bonusvereinbarung 2023. Sofern Regelungen in einer der Anlagen Regelungen dieser Bonusvereinbarung 2023 widersprechen, gehen die Regelungen der Anlage den Regelungen dieser Bonusvereinbarung 2023 vor.";
                        }
                        fields.SetField("Anlagen", anlagen);
                        // Liste Anlage ENDE

                        // * 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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus"+string.Format("{0:yyyy}",X3Result.GetDate(65))+"_1"+"_"+bocompany.Get(2)+".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_4" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();
                        
                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Bonusplan verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum:06.10.2016 (BoCa)
              * 2. Änderung Datum:05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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, 7016, 7052, 7053, 7049, 7050, 7051, 7056 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(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.GetCatalogText(7016).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("Produktanteil2", X3Result.Get(7052).ToString());
                        fields.SetField("Produktbonus2", X3Result.Get(7053).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).ToString());
                        fields.SetField("HF_Prod_ab", X3Result.Get(7056).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");
                                                
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_2" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();
                        
                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 06.10.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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, 7016, 7052, 7053, 7049, 7050, 7051, 7056 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(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.GetCatalogText(7016).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("Produktanteil2", X3Result.Get(7052).ToString());
                        fields.SetField("Produktbonus2", X3Result.Get(7053).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).ToString());
                        fields.SetField("HF_Prod_ab", X3Result.Get(7056).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();
                          
                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHBonus4FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 17.10.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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[] { 7095, 7047, 7088, 88, 7089, 7084, 7059, 7016, 7081, 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, 7052, 7053, 7049, 7050, 7051, 7056 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("TST_vp", X3Result.GetCatalogText(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("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.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("Produktanteil2", X3Result.Get(7052).ToString());
                        fields.SetField("Produktbonus2", X3Result.Get(7053).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).ToString());
                        fields.SetField("HF_Prod_ab", X3Result.Get(7056).ToString());
                        fields.SetField("HF_SUB_Text", X3Result.Get(7081).ToString());
                        // im Bonus 2022 am 26.10.2021 neu hinzugefügt
                        fields.SetField("Produktbonus_Art", X3Result.GetCatalogText(7095).ToString());

                        //Begriff_Produktquote ANFANG am 26.10.2021 neu hinzugefügt                     
                        if (X3Result.GetCatalogText(7095).ToString().Equals("Finanzierung"))
                            fields.SetField("Begriff_Produktquote", "Unter dem Begriff \"Produktquote\" versteht man den Anteil des Produkts Finanzierung an dem vom Händler vermittelten Gesamtumsatz");
                        else if (X3Result.GetCatalogText(7095).ToString().Equals("Leasing"))
                            fields.SetField("Begriff_Produktquote", "Unter dem Begriff \"Produktquote\" versteht man den Anteil des Produkts Leasing an dem vom Händler vermittelten Gesamtumsatz");
                        else fields.SetField("Begriff_Produktquote", ".");
                        //Begriff_Produkquote ENDE

                        //Begriff Produktbonus_Vorraussetzung ANFANG am 26.10.2021 neu hinzugefügt
                        if (X3Result.GetCatalogText(7095).ToString().Equals("Finanzierung"))
                            fields.SetField("Produktbonus_Vorraussetzung", "Voraussetzung für den Erhalt des Produktbonus ist, dass der Händler eine der im Volumenbonus genannten Gesamtumsatzstufen und die Produktquote für den Bereich Finanzierung im definierten Zeitraum erreicht. Die Produktquote und die Höhe des Produktbonus werden wie folgt vereinbart:");
                        else if (X3Result.GetCatalogText(7095).ToString().Equals("Leasing"))
                            fields.SetField("Produktbonus_Vorraussetzung", "Voraussetzung für den Erhalt des Produktbonus ist, dass der Händler eine der im Volumenbonus genannten Gesamtumsatzstufen und die Produktquote für den Bereich Leasing im definierten Zeitraum erreicht. Die Produktquote und die Höhe des Produktbonus werden wie folgt vereinbart:");
                        else fields.SetField("Produktbonus_Vorraussetzung", ".");
                        //Begriff Produktbonus_Vorraussetzung ENDE

                        //Jahreszahl ANFANG
                        //neu OHI 20.11.2019   
                        Int32 start = X3Result.GetDate(65).Year;
                        Int32 ende = X3Result.GetDate(64).Year;
                        String jahre = start.ToString();
                        if (start < ende)
                            jahre = start + "/" + ende;
                        fields.SetField("Jahr", jahre);
                        //Jahreszahl ENDE

                        //Einleitung ANFANG 
                        //neu OHI 20.11.2019                         
                        //wenn angeschlBet aktiv: 
                        string einlBonusAN = "durch den Händler und dessen in der Anlage Angeschlossene Betriebe aufgeführten Betriebe an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";
                        //wenn nicht: 
                        string einlBonusAUS = "durch den Händler an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";
                        if (X3Result.Get(7089).ToString() == "J")
                            fields.SetField("EinleitungBonus", einlBonusAN);
                        else
                            fields.SetField("EinleitungBonus", einlBonusAUS);
                        //Einleitung ENDE 

                        //Liste Anlage ANFANG
                        //neu OHI 20.11.2019   
                        string anlagen = "- Keine Anlagen";
                        if (X3Result.Get(7059).ToString() == "J" || X3Result.Get(7084).ToString() == "J" || X3Result.Get(7088).ToString() == "J" || X3Result.Get(88).ToString() == "J" || X3Result.Get(7087).ToString() == "J" || X3Result.Get(7047).ToString() == "J" || X3Result.Get(7089).ToString() == "J")
                        {
                            anlagen = "";
                            //fields.SetField("Anlagen", "Anlagen: ");
                            if (X3Result.Get(7059).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Steigerungsbonus";
                            if (X3Result.Get(7084).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Plus 50% Versicherungsprovision";
                            if (X3Result.Get(7088).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage JuhuAuto";
                            if (X3Result.Get(88).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Loyalitätsbonus";
                            if (X3Result.Get(7087).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Doppelter Bonus";
                            if (X3Result.Get(7047).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Remarketing";
                            if (X3Result.Get(7089).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Angeschlossene Betriebe";
                            anlagen = anlagen + Environment.NewLine + Environment.NewLine + "Die jeweilige vorstehend aufgeführte Anlage ist Bestandteil dieser Bonusvereinbarung 2023. Sofern Regelungen in einer der Anlagen Regelungen dieser Bonusvereinbarung 2023 widersprechen, gehen die Regelungen der Anlage den Regelungen dieser Bonusvereinbarung 2023 vor.";
                        }
                        fields.SetField("Anlagen", anlagen);
                        //Liste Anlage ENDE
                        
                        // * 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);


                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_4_Subaru" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();
                        
                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHBonus2FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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, 7052, 7053, 7049, 7050, 7051, 7056 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("TST_vp", X3Result.GetCatalogText(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.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_2_FFS" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHBonus3FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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, 7052, 7053, 7049, 7050, 7051, 7056 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("TST_vp", X3Result.GetCatalogText(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("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.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("Produktanteil2", X3Result.Get(7052).ToString());
                        fields.SetField("Produktbonus2", X3Result.Get(7053).ToString());
                        fields.SetField("versstaff1", X3Result.Get(7049).ToString());
                        fields.SetField("versstaff2", X3Result.Get(7050).ToString());
                        fields.SetField("versstaff3", X3Result.Get(7051).ToString());
                        fields.SetField("HF_Prod_ab", X3Result.Get(7056).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);
                        
                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3_FFS" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);                        
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHBonus1FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper am 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderungsdatum: 05.03.2019 (O.Hilt)
              * 3. Änderungsdatum: 20.11.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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 Bonusplan 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[] { 7047, 7088, 88, 7089, 7084, 7059, 7016, 7081, 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());

                        // Jahreszahl ANFANG
                        Int32 start = X3Result.GetDate(65).Year;
                        Int32 ende = X3Result.GetDate(64).Year;
                        String jahre = start.ToString();
                        if (start < ende)
                            jahre = start + "/" + ende;
                        fields.SetField("Jahr", jahre);
                        // Jahreszahl ENDE

                        //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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("TST_vp", X3Result.GetCatalogText(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.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        //neues Feld aus HAndel1 übernommen?
                        fields.SetField("HF_SUB_Text", X3Result.Get(7081).ToString());

                        //Einleitung ANFANG 
                        //neu OHI 28.10.2019                         
                        //wenn angeschlBet aktiv: 
                        string einlBonusAN = "durch den Händler und dessen in der Anlage Angeschlossene Betriebe aufgeführten Betriebe an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";
                        //wenn nicht: 
                        string einlBonusAUS = "durch den Händler an die BDK/ALD LF vermittelten Finanzierungs- und Leasingverträge nachfolgende Boni. Zum besseren Verständnis werden zunächst die zentralen Begriffe der Vereinbarung erläutert und anschließend die Voraussetzungen zur Erreichung der Boni beschrieben.";
                        if (X3Result.Get(7089).ToString() == "J")
                            fields.SetField("EinleitungBonus", einlBonusAN);
                        else
                            fields.SetField("EinleitungBonus", einlBonusAUS);
                        //Einleitung ENDE 

                        //Liste Anlage ANFANG
                        string anlagen = "- Keine Anlagen";
                        if (X3Result.Get(7059).ToString() == "J" || X3Result.Get(7084).ToString() == "J" || X3Result.Get(7088).ToString() == "J" || X3Result.Get(88).ToString() == "J" || X3Result.Get(7087).ToString() == "J" || X3Result.Get(7047).ToString() == "J" || X3Result.Get(7089).ToString() == "J")
                        {
                            anlagen = "";
                            //fields.SetField("Anlagen", "Anlagen: ");
                            if (X3Result.Get(7059).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Steigerungsbonus";
                            if (X3Result.Get(7084).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Plus 50% Versicherungsprovision";
                            if (X3Result.Get(7088).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage JuhuAuto";
                            if (X3Result.Get(88).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Loyalitätsbonus";
                            if (X3Result.Get(7087).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Doppelter Bonus";
                            if (X3Result.Get(7047).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Remarketing";
                            if (X3Result.Get(7089).ToString() == "J")
                                anlagen = anlagen + Environment.NewLine + "- Anlage Angeschlossene Betriebe";
                            anlagen = anlagen + Environment.NewLine + Environment.NewLine + "Die jeweilige vorstehend aufgeführte Anlage ist Bestandteil dieser Bonusvereinbarung 2023. Sofern Regelungen in einer der Anlagen Regelungen dieser Bonusvereinbarung 2023 widersprechen, gehen die Regelungen der Anlage den Regelungen dieser Bonusvereinbarung 2023 vor.";
                        }
                        fields.SetField("Anlagen", anlagen);
                        //Liste Anlage ENDE

                        // * 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);
                                          
                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1_Subaru" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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 Bonusplan 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, 65, 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).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.GetCatalogText(23).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(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);                        

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_GWBonus" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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 Bonusplan 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFLBLB" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHBestandBo(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 18.09.2018 (BoCa)
              * Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002e0dd");
                    //Den Bonusplan 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, 7068, 7069, 70 });
                    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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("BestTEUR", X3Result.Get(7068).ToString());
                        fields.SetField("BestProz", X3Result.Get(7069).ToString());
                        fields.SetField("BStichtag", X3Result.Get(70).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Bestandsbonus" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvLSP" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BaCo)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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 Bonusplan 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFL" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHZusatz50(IChannelWriter writer, AppointmentRecordOptions options)//(Zusatzvereinbarung Plus 25%/
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.2015
              * 1. Änderungsdatum: 23.09.2016 (BoCa)
              * 2. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x0000000100020e82");  // StaNo 1    SerNo 134786     ergibt x0000000100020E82
                    //Den Bonusplan 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[] { 7092, 7045, 7040, 7039, 7038, 7037, 7036, 7035, 7021, 7020, 76, 75, 74, 65, 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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).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.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(7020).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("stufeproz3", X3Result.Get(76).ToString());
                        fields.SetField("stufeproz2", X3Result.Get(75).ToString());
                        fields.SetField("stufeproz1).ToStr", 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.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("TST_laufnr", X3Result.Get(5).ToString());
                        // * neue Feld 7092 "Stufe Loyalitätsbonus in TEUR" für Bonus2021
                        //fields.SetField("Bonusumsatz", string.Format("{​​​​​0:n}​​​​​", X3Result.Get(7092)));
                        fields.SetField("Bonusumsatz", X3Result.Get(7092).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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Loyalitätsbonus" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHZV_50Vers(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 22.10.2018
              * 1. Änderung Datum: 05.03.2019 (O.Hilt)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002e160");
                    //Den Bonusplan 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, 65, 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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen                        
                        //fields.SetField("FM_Ort_Datum", X3Result.Get(7045).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


                        //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;                  

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Plus_50%_Versicherungsprovision" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHSTBonus(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 29.09.2017
              * Änderungen Datum: 05.03.2019 (O.Hilt)
              * Änderungen Datum: 11.11.2019 (O.Hilt & J. Kallies)
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002df6c");//x000000030002df6c
                    //Den Bonusplan 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[] { 7072, 7073, 7074, 7075, 7060, 7061, 7062, 7063, 7076, 7077, 7078, 7079, 7064, 7065, 7066, 7067, 7080, 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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("HF_ST_Text", X3Result.Get(7080).ToString());
                        fields.SetField("HF_ST_ab1", X3Result.Get(7072).ToString());
                        fields.SetField("HF_ST_ab2", X3Result.Get(7073).ToString());
                        fields.SetField("HF_ST_ab3", X3Result.Get(7074).ToString());
                        fields.SetField("HF_ST_ab4", X3Result.Get(7075).ToString());
                        fields.SetField("HF_ST_TEUR1", X3Result.Get(7076).ToString());
                        fields.SetField("HF_ST_TEUR2", X3Result.Get(7077).ToString());
                        fields.SetField("HF_ST_TEUR3", X3Result.Get(7078).ToString());
                        fields.SetField("HF_ST_TEUR4", X3Result.Get(7079).ToString());
                        fields.SetField("ST_ST1", X3Result.Get(7060).ToString());
                        fields.SetField("ST_ST2", X3Result.Get(7061).ToString());
                        fields.SetField("ST_ST3", X3Result.Get(7062).ToString());
                        fields.SetField("ST_ST4", X3Result.Get(7063).ToString());
                        fields.SetField("ST_AS1", X3Result.Get(7064).ToString());
                        fields.SetField("ST_AS2", X3Result.Get(7065).ToString());
                        fields.SetField("ST_AS3", X3Result.Get(7066).ToString());
                        fields.SetField("ST_AS4", X3Result.Get(7067).ToString());

                        //neu 12.11.2019  ANFANG                      
                        //wenn nur die erste Steigerungsstufe gefüllt ist:
                        string EINEstufe = "In diesem Fall wird der Umsatz zwischen der letzten erreichten Volumenbonusstufe und der Steigerungsbonusstufe mit dem vereinbarten Aufschlag gemäß Steigerungsbonus bonifiziert. Umsätze, die über die Steigerungsstufe hinaus gehen, werden ebenfalls mit diesem Aufschlag bonifiziert. Folgende Stufe ist vereinbart:";

                        //wenn mehrere Steigerungsstufen gefüllt sind:
                        string MEHREREstufen = "In diesem Fall wird der Umsatz zwischen der letzten erreichten Volumenbonusstufe und der ersten Steigerungsbonusstufe mit dem vereinbarten Aufschlag gemäß Steigerungsbonus bonifiziert. Für den Fall, dass die nächsthöhere Steigerungsbonusstufe erreicht wird, wird der Umsatz zwischen den erreichten Steigerungsbonusstufen mit dem vereinbarten Aufschlag gemäß Steigerungsbonus zusätzlich bonifiziert. Umsätze, die über die erreichte Steigerungsstufe hinaus gehen, werden ebenfalls mit dem erreichten Aufschlag bonifiziert. Folgende Stufen sind vereinbart:";

                        if (X3Result.Get(7061).ToEmptyIfNull() == "")
                            fields.SetField("Steigerungsstufen", EINEstufe);
                        else 
                            fields.SetField("Steigerungsstufen", MEHREREstufen);
                        //Steigerungsstufe ENDE

                        // * 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);
                                               
                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Steigerungsbonus" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHAngeschlBetriebe(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: O. Hilt & J.Kallies
              * Erstellt am: 21.10.2019
              * 1. Änderung Datum: 
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002E36A");// x000000030002E36A
                                                                            //Den Bonusplan 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[] { 7072, 7073, 7074, 7075, 7060, 7061, 7062, 7063, 7076, 7077, 7078, 7079, 7064, 7065, 7066, 7067, 7080, 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, 7205)
                        .LinkedTo(LinkTools.CreateLink(X3ID))
                        .LimitTo(1)
                        .Execute();


                    //new
                    // select (Synonym, FreeN4, Company, ZipCode, City, Street) from(FI) where (FreeN4 = '$parValue' AND Geschäftsbereich = '#1') orderby (ZipCode)
                    //new

                    //Ein Business Objekt erzeugen das die referenzierte Firma enthält                    
                    var bocompany = companyresult.FirstBusinessObjectOrDefault();
                    var partnernrbonus = bocompany.Get(7205);
                    var partnernrbonusliste = "";
                    var partnernr = "";
                    string firma = "";
                    var plz = "";
                    var ort = "";
                    var strasse = "";
                    string adresse = "";



                    // den Query ausführen
                    string uql = @"select (Synonym, FreeN4, Company, ZipCode, City, Street, F7205) from(FI) where (F7205 = '" + partnernrbonus + "') orderby (ZipCode)";
                    QueryCommand query = new QueryCommand(uql) { MaxRows = 50 };
                    IQueryResultSet results = query.Execute(Services);

                    foreach (var item in results.Rows)
                    {
                        BusinessObject fi = item[0] as BusinessObject;
                        partnernrbonusliste = partnernrbonusliste + fi.Get(7205) + Environment.NewLine + Environment.NewLine;
                        partnernr = partnernr + fi.Get(3) + Environment.NewLine + Environment.NewLine;
                        
                        //plz = plz + fi.Get(7).Replace(Environment.NewLine, " ") + Environment.NewLine + Environment.NewLine;
                        //ort = ort + fi.Get(8).Replace(Environment.NewLine, " ") + Environment.NewLine + Environment.NewLine;
                        //strasse = strasse + fi.Get(10).Replace(Environment.NewLine, " ") + Environment.NewLine + Environment.NewLine;
                        adresse = fi.Get(10) + ", " + fi.Get(7).Replace(Environment.NewLine, " ") + " " + fi.Get(8).Replace(Environment.NewLine, " ");
                        firma = firma + (fi.Get(2)).ReplaceLineBreaks(" ") + Environment.NewLine + "(" + adresse + ")" + Environment.NewLine;
                    }

                    //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("Partner-Nr", partnernr.ToString());
                        fields.SetField("Partner-Nr_Bonus", partnernrbonusliste.ToString());
                        fields.SetField("Firma", firma.ToString());
                        //fields.SetField("PLZ", plz.ToString());
                        //fields.SetField("Ort", ort.ToString());
                        //fields.SetField("Adresse", adresse.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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Angeschlossene_Betriebe" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHDopQuartal(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Oliver Hilt
              * Erstellt am: 29.10.2019
              * 1. Änderung Datum: 
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002E391"); //wert noch berechnen mit station3 und laufnummer 189329
                    //Den Bonusplan 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, 65, 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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen                        
                        //fields.SetField("FM_Ort_Datum", X3Result.Get(7045).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


                        //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;

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Doppelter_Bonus" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHAnlageJuhuAuto(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /* Erstellt von: Oliver Hilt
              * Erstellt am: 29.10.2019
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion. */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002E390"); //wert noch berechnen mit station3 und laufnummer 189328
                    //Den Bonusplan 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[] { 7099, 7045, 7040, 7039, 7038, 7037, 7036, 7035, 7021, 7020, 76, 75, 74, 65, 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;
                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen - im Bonus 2022 am 05.11.2021 neu hinzugefügt
                        fields.SetField("Aktion JuhuAuto", X3Result.GetCatalogText(7099).ToString());

                        //ANFANG dynamisches Feld "JuhuBerechtigt"
                        if (X3Result.GetCatalogText(7099).ToString().Equals("0,25%"))
                            fields.SetField("JuhuBerechtigt", "Bonusberechtigt sind alle während des Aktionszeitraums vermittelten und abgerechneten Finanzierungs- und Leasingverträge, bei denen die Fahrzeug-Identifikationsnummer (FIN) des auf JuhuAuto eingestellten Fahrzeuges mit der im Finanzierungs- bzw. Leasingvertrag angegebenen FIN übereinstimmt. Auf diesen Umsatz erhält der Händler einen zusätzlichen Bonusaufschlag in Höhe von 0,25%.");
                        else if (X3Result.GetCatalogText(7099).ToString().Equals("0,50%"))
                            fields.SetField("JuhuBerechtigt", "Bonusberechtigt sind alle während des Aktionszeitraums vermittelten und abgerechneten Finanzierungs- und Leasingverträge, bei denen die Fahrzeug-Identifikationsnummer (FIN) des auf JuhuAuto eingestellten Fahrzeuges mit der im Finanzierungs- bzw. Leasingvertrag angegebenen FIN übereinstimmt. Auf diesen Umsatz erhält der Händler einen zusätzlichen Bonusaufschlag in Höhe von 0,50%.");
                        else fields.SetField("JuhuBerechtigt", "ERROR!");
                        //ENDE dynamisches Feld "JuhuBerechtigt"

                        //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


                        //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;

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Aktion_JuhuAuto" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHAnlageRemarketing(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Oliver Hilt
              * Erstellt am: 29.10.2019
              * 1. Änderung Datum: 
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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", "x000000030002E3E9"); //wert noch berechnen mit station3 und laufnummer 189417
                    //Den Bonusplan 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, 65, 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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen                        
                        //fields.SetField("FM_Ort_Datum", X3Result.Get(7045).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


                        //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;

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: altes obsoletes coding VOR 05.03.2019: docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".pdf" };
                        //O.Hilt: ersetzt durch:
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Anlage_Remarketing" + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();

                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHZusatz_JuhuAuto(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Oliver Hilt
              * Erstellt am: 30.11.2020
              * 1. Änderung Datum: 
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion).
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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 // x000000030002E6B2
                    var DocUid = RecordUid.Parse("D1", "x000000030002E6B2"); //wert noch berechnen mit station=3 und laufnummer=190130
                    //Den Bonusplan 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[] { 7094, 7045, 7088, 88, 7087, 7047, 7089, 7084, 7059, 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, 7016, 7081 });
                    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());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus X3 füllen

                        // Jahreszahl ANFANG
                        Int32 start = X3Result.GetDate(65).Year;
                        Int32 ende = X3Result.GetDate(64).Year;
                        String jahre = start.ToString();
                        if (start < ende)
                            jahre = start + "/" + ende;
                        fields.SetField("Jahr", jahre);
                        // Jahreszahl ENDE
                        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("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.GetCatalogText(7021).ToString());
                        fields.SetField("TST_gb", X3Result.GetCatalogText(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.GetCatalogText(7016).ToString());
                        fields.SetField("TST_zahlung", X3Result.GetCatalogText(22).ToString());
                        fields.SetField("TST_bvart", X3Result.GetCatalogText(21).ToString());
                        fields.SetField("TST_herkunft", X3Result.GetCatalogText(20).ToString());
                        fields.SetField("HF_SUB_Text", X3Result.Get(7081).ToString());

                        //Optionaler Text wenn Folgevereinbarung = J
                        string folgeVB = "Darüber hinaus erhält der Händler einen weiteren zusätzlichen Bonusaufschlag in Höhe von 0,10% auf die Umsatzsteigerung gegenüber dem Vorjahr (01.01.2020-31.12.2020). Voraussetzung für den Erhalt dieses zusätzlichen Aufschlags ist eine Steigerung der an die BDK und ALD LF vermittelten Finanzierungs- und Leasingumsätze im Vergleich zum Vorjahr (01.01.2020-31.12.2020).";

                        if (X3Result.Get(7094).ToString() == "J")
                        {
                            fields.SetField("Folgevereinbarung", folgeVB);
                        }                                     
                        
                        //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", "x0000271100000952");
                        //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);

                        //O.Hilt: neue Regular expression zur Verwendung in der Dateiserstellung unten:
                        Regex stripCHARS = new Regex("[^a-zA-Z0-9 -_äöüÄÖÜ]");

                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus"+string.Format("{0:yyyy}",X3Result.GetDate(65))+"_1"+"_"+bocompany.Get(2)+".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();

                        //O.Hilt: 08.12.2020
                        docCommand.BusinessObject = new Documents(services) { Name = "Zusatzvereinbarung_JuhuAuto" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_" + stripCHARS.Replace(bocompany.Get(2).ToString(), " ") + ".pdf" };
                        docCommand.Execute();
                        
                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, X3ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                        //return null;
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHHDAkte(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 05.05.2015
              * Aktualisiert am: 21.10.2019 O. Hilt
              * Aktualisiert am: 30.04.2020 O. Hilt
              * Aktualisiert am: 29.11.2021 O. Hilt
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen X3 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002086c");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("Firma4", bocompany.Get(2).ToString());
                        fields.SetField("Firma5", bocompany.Get(2).ToString());
                        fields.SetField("Firma6", bocompany.Get(2).ToString());
                        fields.SetField("Firma7", bocompany.Get(2).ToString());
                        fields.SetField("Firma8", bocompany.Get(2).ToString());
                        fields.SetField("Firma9", bocompany.Get(2).ToString());
                        fields.SetField("Firma10", bocompany.Get(2).ToString());
                        fields.SetField("Firma11", bocompany.Get(2).ToString());
                        fields.SetField("Firma12", bocompany.Get(2).ToString());
                        fields.SetField("Firma13", bocompany.Get(2).ToString());
                        fields.SetField("Firma14", bocompany.Get(2).ToString());
                        fields.SetField("Firma15", bocompany.Get(2).ToString());
                        fields.SetField("Firma16", bocompany.Get(2).ToString());
                        fields.SetField("Firma17", bocompany.Get(2).ToString());
                        fields.SetField("Firma18", bocompany.Get(2).ToString());
                        fields.SetField("Firma19", bocompany.Get(2).ToString());
                        fields.SetField("Firma20", bocompany.Get(2).ToString());
                        fields.SetField("Firma21", bocompany.Get(2).ToString());
                        fields.SetField("Firma22", bocompany.Get(2).ToString());
                        fields.SetField("Firma23", bocompany.Get(2).ToString());
                        fields.SetField("Firma24", bocompany.Get(2).ToString());
                        fields.SetField("Firma25", bocompany.Get(2).ToString());
                        fields.SetField("Firma26", bocompany.Get(2).ToString()); //Hilt: neu 21.10.2019
                        fields.SetField("Firma27", bocompany.Get(2).ToString()); //Hilt: neu 21.10.2019
                        fields.SetField("Firma28", bocompany.Get(2).ToString()); //Hilt: neu 21.10.2019
                        fields.SetField("Firma29", bocompany.Get(2).ToString()); //Hilt: neu 21.10.2019
                        fields.SetField("Firma30", bocompany.Get(2).ToString()); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("Firma31", bocompany.Get(2).ToString());
                        fields.SetField("Firma32", bocompany.Get(2).ToString());
                        fields.SetField("Firma33", bocompany.Get(2).ToString());
                        fields.SetField("Firma34", bocompany.Get(2).ToString());
                        //Hilt: neu 08.12.2022 
                        fields.SetField("Firma35", bocompany.Get(2).ToString());
                        fields.SetField("Firma36", bocompany.Get(2).ToString());
                        fields.SetField("Firma37", bocompany.Get(2).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("Firma38", bocompany.Get(2).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("Firma39", bocompany.Get(2).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("Firma40", bocompany.Get(2).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende Firma
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("PLZ2", bocompany.Get(7).ToString());
                        fields.SetField("PLZ3", bocompany.Get(7).ToString());
                        fields.SetField("PLZ4", bocompany.Get(7).ToString());
                        fields.SetField("PLZ5", bocompany.Get(7).ToString());
                        fields.SetField("PLZ6", bocompany.Get(7).ToString());
                        fields.SetField("PLZ7", bocompany.Get(7).ToString());
                        fields.SetField("PLZ8", bocompany.Get(7).ToString());
                        fields.SetField("PLZ9", bocompany.Get(7).ToString());
                        fields.SetField("PLZ10", bocompany.Get(7).ToString());
                        fields.SetField("PLZ11", bocompany.Get(7).ToString());
                        fields.SetField("PLZ12", bocompany.Get(7).ToString());
                        fields.SetField("PLZ13", bocompany.Get(7).ToString());                        
                        fields.SetField("PLZ14", bocompany.Get(7).ToString()); //Hilt: neu 21.10.2019
                        fields.SetField("PLZ15", bocompany.Get(7).ToString()); //Hilt: neu 30.04.2020
                        fields.SetField("PLZ16", bocompany.Get(7).ToString()); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("PLZ17", bocompany.Get(7).ToString()); 
                        //Hilt: neu 08.12.2022
                        fields.SetField("PLZ18", bocompany.Get(7).ToString());
                        fields.SetField("PLZ19", bocompany.Get(7).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("PLZ20", bocompany.Get(7).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende PLZ
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
                        fields.SetField("Ort3", bocompany.Get(8).ToString());
                        fields.SetField("Ort4", bocompany.Get(8).ToString());
                        fields.SetField("Ort5", bocompany.Get(8).ToString());
                        fields.SetField("Ort6", bocompany.Get(8).ToString());
                        fields.SetField("Ort7", bocompany.Get(8).ToString());
                        fields.SetField("Ort8", bocompany.Get(8).ToString());
                        fields.SetField("Ort9", bocompany.Get(8).ToString());
                        fields.SetField("Ort10", bocompany.Get(8).ToString());
                        fields.SetField("Ort11", bocompany.Get(8).ToString());
                        fields.SetField("Ort12", bocompany.Get(8).ToString());
                        fields.SetField("Ort13", bocompany.Get(8).ToString());                        
                        fields.SetField("Ort14", bocompany.Get(8).ToString()); //Hilt: neu 21.10.2019                        
                        fields.SetField("Ort15", bocompany.Get(8).ToString()); //Hilt: neu 30.04.2020                        
                        fields.SetField("Ort16", bocompany.Get(8).ToString()); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("Ort17", bocompany.Get(8).ToString());
                        //Hilt: neu 08.12.2022
                        fields.SetField("Ort18", bocompany.Get(8).ToString());
                        fields.SetField("Ort19", bocompany.Get(8).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy                      
                        fields.SetField("Ort20", bocompany.Get(8).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende ORT
                        fields.SetField("HDLNum1", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum2", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum3", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum4", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum5", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum6", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum7", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum8", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum9", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum10", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum11", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum12", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum13", bocompany.Get(3).ToString());                        
                        fields.SetField("HDLNum14", bocompany.Get(3).ToString()); //Hilt: neu 21.10.2019                        
                        fields.SetField("HDLNum15", bocompany.Get(3).ToString()); //Hilt: neu 30.04.2020                        
                        fields.SetField("HDLNum16", bocompany.Get(3).ToString()); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("HDLNum17", bocompany.Get(3).ToString());
                        //Hilt: neu 08.12.2022
                        fields.SetField("HDLNum18", bocompany.Get(3).ToString());
                        fields.SetField("HDLNum19", bocompany.Get(3).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("HDLNum20", bocompany.Get(3).ToString()); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende HDLNum
                        fields.SetField("HDLNummer1", "*" + bocompany.Get(3) + "-01-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer2", "*" + bocompany.Get(3) + "-02-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer3", "*" + bocompany.Get(3) + "-03-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer4", "*" + bocompany.Get(3) + "-04-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer5", "*" + bocompany.Get(3) + "-05-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer6", "*" + bocompany.Get(3) + "-09-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer7", "*" + bocompany.Get(3) + "-10-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer8", "*" + bocompany.Get(3) + "-11-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer9", "*" + bocompany.Get(3) + "-12-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer10", "*" + bocompany.Get(3) + "-13-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer11", "*" + bocompany.Get(3) + "-14-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer12", "*" + bocompany.Get(3) + "-15-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer13", "*" + bocompany.Get(3) + "-16-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");                        
                        fields.SetField("HDLNummer14", "*" + bocompany.Get(3) + "-17-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*"); //Hilt: neu 21.10.2019                        
                        fields.SetField("HDLNummer15", "*" + bocompany.Get(3) + "-18-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*"); //Hilt: neu 30.04.2020                        
                        fields.SetField("HDLNummer16", "*" + bocompany.Get(3) + "-19-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*"); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("HDLNummer17", "*" + bocompany.Get(3) + "-20-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        //Hilt: neu 08.12.2022
                        fields.SetField("HDLNummer18", "*" + bocompany.Get(3) + "-21-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer19", "*" + bocompany.Get(3) + "-22-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*"); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("HDLNummer20", "*" + bocompany.Get(3) + "-23-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*"); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende HDLNummer
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum6", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum7", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum8", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum9", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum10", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum11", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum12", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum13", string.Format("{0:dd.MM.yyyy}", DateTime.Now));                        
                        fields.SetField("Datum14", string.Format("{0:dd.MM.yyyy}", DateTime.Now)); //Hilt: neu 21.10.2019
                        fields.SetField("Datum15", string.Format("{0:dd.MM.yyyy}", DateTime.Now)); //Hilt: neu 30.04.2020
                        fields.SetField("Datum16", string.Format("{0:dd.MM.yyyy}", DateTime.Now)); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("Datum17", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Hilt: neu 08.12.2022
                        fields.SetField("Datum18", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum19", string.Format("{0:dd.MM.yyyy}", DateTime.Now)); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("Datum20", string.Format("{0:dd.MM.yyyy}", DateTime.Now)); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende Datum
                        fields.SetField("Uhrzeit1", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit2", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit3", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit4", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit5", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit6", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit7", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit8", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit9", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit10", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit11", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit12", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit13", string.Format("{0:HH:mm:ss}", DateTime.Now));                        
                        fields.SetField("Uhrzeit14", string.Format("{0:HH:mm:ss}", DateTime.Now)); //Hilt: neu 21.10.2019
                        fields.SetField("Uhrzeit15", string.Format("{0:HH:mm:ss}", DateTime.Now)); //Hilt: neu 30.04.2020
                        fields.SetField("Uhrzeit16", string.Format("{0:HH:mm:ss}", DateTime.Now)); //Hilt: neu 29.11.2021 bzgl Bonus2022
                        fields.SetField("Uhrzeit17", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        //Hilt: neu 08.12.2022
                        fields.SetField("Uhrzeit18", string.Format("{0:HH:mm:ss}", DateTime.Now));
                        fields.SetField("Uhrzeit19", string.Format("{0:HH:mm:ss}", DateTime.Now)); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        fields.SetField("Uhrzeit20", string.Format("{0:HH:mm:ss}", DateTime.Now)); //Hilt: Platzhalter vorgebaut für die Zukunft: xy
                        //Hilt: Ende Uhrzeit

                        // * 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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Deckblatt.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHEKF(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 28.10.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 C005 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über die EKFStart 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 eine gültige EKFStart vorhanden sein
                if (options.C005Link == null || !options.C005Link.IsValid)
                {
                    throw new InvalidOperationException("C005Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020880");
                    //Die EKFStart von der Datenbank lesen der dem Channel übergeben wurde x0000271100000988, x0000000300020880
                    var C005ID = RecordUid.Parse(options.C005Link.InfoAreaId, options.C005Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C005Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C005Link.RecordId;
                    //C005 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7004, 7005, 7027, 7023, 7029, 7031 });
                    IBusinessObject C005Result = command.Execute();


                    //Die Firma raussuchen die mit dem C005 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C005ID))
                        .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("Firma1", 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());
                        fields.SetField("Betreuer", bocompany.Get(132).ToString());
                        //Felder aus C005 füllen                        
                        fields.SetField("EKFArt", C005Result.GetCatalogText(7005).ToString());
                        fields.SetField("EKFZiel", C005Result.GetCatalogText(7004).ToString());
                        fields.SetField("EKFerteilt", C005Result.Get(7023).ToString());
                        fields.SetField("EKFVL", C005Result.Get(7029).ToString());
                        fields.SetField("EKFVotum", C005Result.Get(7027).ToString());
                        fields.SetField("Crefo", C005Result.Get(7031).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        


                        // * 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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=EKFStart.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                        /*
                        //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 = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_GWBonus" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "EKFStart"+".pdf" };
                        docCommand.Execute();



                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, C005ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);

                       

                        //return null;
                        */
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHEKF200(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 26.04.2016
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen C005 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem Bonusplan verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über die EKFStart 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 eine gültige EKFStart vorhanden sein
                if (options.C005Link == null || !options.C005Link.IsValid)
                {
                    throw new InvalidOperationException("C005Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020b14");
                    //Die EKFStart von der Datenbank lesen der dem Channel übergeben wurde 
                    var C005ID = RecordUid.Parse(options.C005Link.InfoAreaId, options.C005Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C005Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C005Link.RecordId;
                    //C005 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7004, 7005, 7027, 7023, 7029, 7031 });
                    IBusinessObject C005Result = command.Execute();


                    //Die Firma raussuchen die mit dem C005 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C005ID))
                        .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("Firma1", 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());
                        fields.SetField("Betreuer", bocompany.Get(132).ToString());
                        //Felder aus C005 füllen                        
                        fields.SetField("EKFArt", C005Result.GetCatalogText(7005).ToString());
                        fields.SetField("EKFZiel", C005Result.GetCatalogText(7004).ToString());
                        fields.SetField("EKFerteilt", C005Result.Get(7023).ToString());
                        fields.SetField("EKFVL", C005Result.Get(7029).ToString());
                        fields.SetField("EKFVotum", C005Result.Get(7027).ToString());
                        fields.SetField("Crefo", C005Result.Get(7031).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        


                        // * 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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=EKFStart.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";
                       
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHAuskunft(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 28.10.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 C005 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem EKF verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über die EKFStart 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 eine gültige EKFStart vorhanden sein
                if (options.C005Link == null || !options.C005Link.IsValid)
                {
                    throw new InvalidOperationException("C005Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x00000003000208d4");
                    //Die EKFStart von der Datenbank lesen der dem Channel übergeben wurde x000027110000098a;x00000003000208d4
                    var C005ID = RecordUid.Parse(options.C005Link.InfoAreaId, options.C005Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C005Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C005Link.RecordId;
                    //C005 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7004, 7005, 7027, 7023, 7029, 7031 });
                    IBusinessObject C005Result = command.Execute();


                    //Die Firma raussuchen die mit dem C005 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C005ID))
                        .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("Firma1", 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());
                        //fields.SetField("Betreuer", bocompany.Get(132).ToString());
                        //Felder aus C005 füllen                        
                        //fields.SetField("EKFArt", C005Result.GetCatalogText(7005).ToString());
                        //fields.SetField("EKFZiel", C005Result.GetCatalogText(7004).ToString());
                        //fields.SetField("EKFerteilt", C005Result.Get(7023).ToString());
                        //fields.SetField("EKFVL", C005Result.Get(7029).ToString());
                        //fields.SetField("EKFVotum", C005Result.Get(7027).ToString());
                        //fields.SetField("Crefo", C005Result.Get(7031).ToString());
                        //fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));



                        // * 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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=SchufaAuskunft.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                        /*
                        //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 = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_GWBonus" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "SchufaAuskunft"+".pdf" };
                        docCommand.Execute();



                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, C005ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);



                        //return null;
                        */
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHVDesk(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 28.10.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 C001 und Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit dem EKF verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über die Crefo C001 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 eine gültige Crefo vorhanden sein
                if (options.C001Link == null || !options.C001Link.IsValid)
                {
                    throw new InvalidOperationException("C001Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020998");
                    //Die Crefo von der Datenbank lesen der dem Channel übergeben wurde x000027110000098d / x0000000300020998
                    var C001ID = RecordUid.Parse(options.C001Link.InfoAreaId, options.C001Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C001Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C001Link.RecordId;
                    //C001 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7004, 7005, 7012, 7010, 7015, 7024, 7025 });
                    IBusinessObject C001Result = command.Execute();


                    //Die Firma raussuchen die mit dem C001 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132, 65, 38, 95, 148, 89 ,7023)
                        .LinkedTo(LinkTools.CreateLink(C001ID))
                        .LimitTo(1)
                        .Execute();

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

                    //Die Person raussuchen die mit der Firma verknüpft ist bedingt 
                    //Feld (7001) Funktion Max 1 Datensatz
                    //= Geschäftsführer/in
                    //= Geschäftsführer/in und Verkauf
                    //=Inhaber/in
                    //=Inhaber/in und Verkauf
                    //=Geschäftsführende/r Gesellschafter/in

                    var KPresult = services
                        .FromInfoArea(InfoAreaIds.Person)
                        .Select(7001, 7002, 2, 3)
                        .LinkedTo(LinkTools.CreateLink(bocompany.Uid))
                        .LimitTo(1)
                        .Where(Filter.Equals(7002, "#2~#1") | Filter.Equals(7002, "#3~#1"))
                        .Execute();


                    /*
                    var qPerson = new QueryCommand(@"select (Funktion, Abteilung, LastName, FirstName) from (KP) where (Funktion='#2~#1' OR Funktion='#3~#1' OR Funktion='#4~#1' OR Funktion='#5~#1' OR Funktion='#6~#1')");

                    qPerson.MaxRows = 1;
                    qPerson.Links.Add(LinkTools.CreateLink(bocompany.Uid));
                    
                    var KPresult = qPerson.Execute(services);
                     */
                    //Ein Business Objekt erzeugen das die referenzierte KPDatensatz enthält                    
                    var boPerson = KPresult.FirstBusinessObjectOrDefault();

                    //Die Absatzdaten raussuchen die mit der Firma verknüpft ist bedingt 
                    //Absatzdaten Aktuell
                    //Feld KAT(1) Umsatz Pro Monat/Jahr = pro Jahr
                    // und
                    //Feld (7029) HF Monat/Jahr = Aktuelles jahr
                    //Absatzdaten Vorjahr
                    //Feld KAT(1) Umsatz Pro Monat/Jahr = pro Jahr
                    // und
                    //Feld (7029) HF Monat/Jahr = Aktuelles jahr - 1Jahr

                    /*
                    var POresultAktuell = services
                        .FromInfoArea("PO")
                        .Select(39, 30, 28, 7029, 1 )
                        .LinkedTo(LinkTools.CreateLink(bocompany.Uid))
                        .LimitTo(1)
                        .Execute();
                    */

                    System.Collections.Generic.IList<update.Crm.Contracts.Links.IBusinessObjectLink> linkList = new System.Collections.Generic.List<update.Crm.Contracts.Links.IBusinessObjectLink>();
                    linkList.Add(LinkTools.CreateLink(bocompany.Uid));

                    var qPOAktuell = new QueryCommand(@"select (ProdGrp, FirstQtrProj, RevDevPrevYr, RevenuePlan) from (PO) where (ProdGrp='pro Jahr' AND HFMonatJahr>='$curfdYear' AND HFMonatJahr<'$curfdYear+1y')")           
                    {
                        MaxRows = 1,
                        Links = linkList
                    };

                    var POresultAktuell = qPOAktuell.Execute(services);
                    //Ein Business Objekt erzeugen das die referenzierte PODatensatz enthält    
           
                    var boPOAktuell = POresultAktuell.TryGetFirstBusinessObject();

                    /*
                    var POResultVorjahr = services
                       .FromInfoArea("PO")
                       .Select(39, 30, 28, 7029, 1)
                       .LinkedTo(LinkTools.CreateLink(bocompany.Uid))
                       .LimitTo(1)
                       .Execute();
                    */
                    var qPOVorjahr = new QueryCommand(@"select (ProdGrp, FirstQtrProj, RevDevPrevYr, RevenuePlan) from (PO) where (ProdGrp='pro Jahr' AND HFMonatJahr>='$curfdYear-1y' AND HFMonatJahr<'$curfdYear')")                  
                    {
                        MaxRows = 1,
                        Links = linkList
                    };

   

                    var POResultVorjahr = qPOVorjahr.Execute(services);
                    //Ein Business Objekt erzeugen das die referenzierte PODatensatz enthält

                    var boPOVorjahr = POResultVorjahr.TryGetFirstBusinessObject();

                    //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());
                        fields.SetField("Betreuer", bocompany.Get(132).ToString());
                        fields.SetField("Status", bocompany.GetCatalogText(38).ToString());
                        fields.SetField("Region", bocompany.GetCatalogText(95).ToString());
                        fields.SetField("Phoenix_ID", bocompany.Get(148).ToString());
                        fields.SetField("Konzern_Nr", bocompany.Get(65).ToString());
                        fields.SetField("neueKoop", bocompany.Get(89).ToString());
                        fields.SetField("Eingang", bocompany.Get(7023).ToString());
                        //Felder aus C001 füllen                        
                        fields.SetField("Crefo_Nr", C001Result.Get(7004).ToString());
                        fields.SetField("Index", C001Result.Get(7005).ToString());
                        fields.SetField("Anlagedatum", C001Result.Get(7012).ToString());
                        fields.SetField("Nachmeldung", C001Result.Get(7010).ToString());
                        fields.SetField("Kommentar", C001Result.Get(7015).ToString());
                        fields.SetField("VotumVertrieb", C001Result.Get(7024).ToString());
                        fields.SetField("VotumZV", C001Result.Get(7025).ToString());

                        if (boPerson != null)
                        {
                            //Felder aus KP füllen 
                            fields.SetField("Funktion", boPerson.GetCatalogText(7001).ToString());
                            fields.SetField("Abteilung", boPerson.GetCatalogText(7002).ToString());
                            fields.SetField("Vorname", boPerson.Get(3).ToString());
                            fields.SetField("Nachname", boPerson.Get(2).ToString());
                        }
                        if(boPOVorjahr != null)
                        {
                            //Felder aus PO füllen (Vorjahr)
                            fields.SetField("GesamtUmsatzV", boPOVorjahr.Get(39).ToString());
                            fields.SetField("LeasingUmsatzV", boPOVorjahr.Get(30).ToString());
                            fields.SetField("FinanzierungUmsatzV", boPOVorjahr.Get(28).ToString());
                        }
                        if(boPOAktuell != null)
                        { 
                            //Felder aus PO füllen (Aktuelles Jahr)
                            fields.SetField("GesamtUmsatzA", boPOAktuell.Get(39).ToString());
                            fields.SetField("LeasingUmsatzA", boPOAktuell.Get(30).ToString());
                            fields.SetField("FinanzierungUmsatzA", boPOAktuell.Get(28).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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Crefo_an_VDesk.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                        /*
                        //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);


                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Crefo_an_VDesk"+".pdf" };
                        docCommand.Execute();



                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, C001ID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);



                        //return null;
                        */
                    }
                }
            }
            catch (Exception ex)
            {
                /*
                //BDK.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);
                */
                return ex.Message;
            }
        }

        [ChannelMethod]
        public string CHOFLKoop(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 25.11.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 Firma gefüllt. Das neu erzeugte
              * Dokument wird in der D1 Tabelle gespeichert und mit Hilfe von einem D3 Datensatz mit der Firma verlinkt.
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020999");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Kooperationsvereinbarung_OFL.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                        /*
                        //RecordUid docid = RecordUid.Parse("D1", "x0000271100000952");
                        //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 = "Bonus"+string.Format("{0:yyyy}",X3Result.GetDate(65))+"_1"+"_"+bocompany.Get(2)+".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Kooperationsvereinbarung_OFL"+".pdf" };
                        docCommand.Execute();



                        //Neues Dokument in einem D1 Datensatz speichern
                        pdfvorlage.SaveDocument(docCommand.BusinessObject.Uid, DokumentUpload);
                        //Neuen D1 Datensatz mit Ursprungskontakt verlinken

                        var doclink = DocumentsTools.CreateLink(services, CompanyID, docCommand.BusinessObject.Uid);
                        var documentsruek = services.Get<IDocumentsService>();
                        return documentsruek.ToDocumentKey(docCommand.BusinessObject.Uid);
                        //return neuesDokument.ToDocumentKey(docid);CHBonus                        

                        //return null;
                        */
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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);
            }
        }
        /*Neu angelegt am 08.04.2016*/
		[ChannelMethod]
      public string CHKoop200_0(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 08.04.2016
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020a4c");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000000300020a4c )
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("EMail", bocompany.Get(18).ToString());
                        fields.SetField("Telefon", bocompany.Get(14).ToString() + " / " + bocompany.Get(15).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString()+ " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString()+ ",");
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
						fields.SetField("AISNR", bocompany.Get(1).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
						fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=200_0_Kooperationsvereinbarung_Neukunden.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";
                        
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHLegi(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 15.10.2018
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e14c");
                    //Firma von der Datenbank lesen der dem Channel übergeben wurde 
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //FI Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("AISNR", bocompany.Get(1).ToString());                      


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Legitimation.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHWirtBerecht(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 12.12.2018 WirtBerecht
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e188"); 
                    //Firma von der Datenbank lesen der dem Channel übergeben wurde 
                     var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //FI Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("HDLNummer", bocompany.Get(3).ToString());
                        //fields.SetField("AISNR", bocompany.Get(1).ToString());


                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Formular_wB_Ermittlung.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHKoop200_1(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 08.04.2016
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020a4d");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("EMail", bocompany.Get(18).ToString());
                        fields.SetField("Telefon", bocompany.Get(14).ToString() + " / " + bocompany.Get(15).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString() + ",");
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
						fields.SetField("AISNR", bocompany.Get(1).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
						fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=200_1_Kooperationsvereinbarung_Neukunden_mit_Lastschrift.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";
                        
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHKoop200_2(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 08.04.2016
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020a4e");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("EMail", bocompany.Get(18).ToString());
                        fields.SetField("Telefon", bocompany.Get(14).ToString() + " / " + bocompany.Get(15).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString() + ",");
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
						fields.SetField("AISNR", bocompany.Get(1).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
						fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=200_2_Kooperationsvereinbarung_Neukunden_ZVH.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";
                        
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHKoop200_7(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 08.04.2016
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen Firma gefüllt. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über den Bonusplan 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ültige Firma vorhanden sein
                if (options.CompanyLink == null || !options.CompanyLink.IsValid)
                {
                    throw new InvalidOperationException("CompanyLink is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x0000000300020a4f");
                    //Den Bonusplan von der Datenbank lesen der dem Channel übergeben wurde x0000271100000953 (x00000003000004ed)
                    var CompanyID = RecordUid.Parse(options.CompanyLink.InfoAreaId, options.CompanyLink.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.CompanyLink.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.CompanyLink.RecordId;
                    //X3 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 2, 7, 8, 10, 3, 1, 18, 15, 14 });
                    IBusinessObject bocompany = command.Execute();


                    //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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("EMail", bocompany.Get(18).ToString());
                        fields.SetField("Telefon", bocompany.Get(14).ToString() + " / " + bocompany.Get(15).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("PLZ1", bocompany.Get(7).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString() + ",");
                        fields.SetField("Ort2", bocompany.Get(8).ToString());
                        fields.SetField("Ort3", bocompany.Get(8).ToString() + ",");
                        fields.SetField("AISNR", bocompany.Get(1).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
						fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=200_7_FFS_Kooperationsvereinbarung_Händler.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";
                        
                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHAnkaufversprechen(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 04.05.2017
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002decd");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7054, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 4010 });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C012ID))
                        .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        //fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());                    
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("AV_Filiale1", C012Result.Get(7030).ToString());
                        fields.SetField("AV_Filiale2", C012Result.Get(7035).ToString());
                        fields.SetField("AV_Filiale3", C012Result.Get(7040).ToString());
                        fields.SetField("AV_Filiale4", C012Result.Get(7045).ToString());
                        fields.SetField("AV_Filiale5", C012Result.Get(7050).ToString());
                        fields.SetField("AV_Straße1", C012Result.Get(7031).ToString());
                        fields.SetField("AV_Straße2", C012Result.Get(7036).ToString());
                        fields.SetField("AV_Straße3", C012Result.Get(7041).ToString());
                        fields.SetField("AV_Straße4", C012Result.Get(7046).ToString());
                        fields.SetField("AV_Straße5", C012Result.Get(7051).ToString());
                        fields.SetField("PLZ_Ort3", C012Result.Get(7032).ToString() + " " + C012Result.Get(7033).ToString());
                        fields.SetField("PLZ_Ort4", C012Result.Get(7037).ToString() + " " + C012Result.Get(7038).ToString());
                        fields.SetField("PLZ_Ort5", C012Result.Get(7042).ToString() + " " + C012Result.Get(7043).ToString());
                        fields.SetField("PLZ_Ort6", C012Result.Get(7055).ToString() + " " + C012Result.Get(7048).ToString());
                        fields.SetField("PLZ_Ort7", C012Result.Get(7052).ToString() + " " + C012Result.Get(7053).ToString());
                        fields.SetField("AV_PartnerNr1", C012Result.Get(7034).ToString());
                        fields.SetField("AV_PartnerNr2", C012Result.Get(7039).ToString());
                        fields.SetField("AV_PartnerNr3", C012Result.Get(7044).ToString());
                        fields.SetField("AV_PartnerNr4", C012Result.Get(7049).ToString());
                        fields.SetField("AV_PartnerNr5", C012Result.Get(7054).ToString());
                        fields.SetField("Datum6", C012Result.Get(4010).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Ankaufversprechen.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHCarsharing(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper & Oliver Hilt
              * Erstellt am: 12.12.2018
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Carsharing 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e19c");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                     var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7054, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 4010 });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C012ID))
                        .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        //fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("AV_Filiale1", C012Result.Get(7030).ToString());
                        fields.SetField("AV_Filiale2", C012Result.Get(7035).ToString());
                        fields.SetField("AV_Filiale3", C012Result.Get(7040).ToString());
                        fields.SetField("AV_Filiale4", C012Result.Get(7045).ToString());
                        fields.SetField("AV_Filiale5", C012Result.Get(7050).ToString());
                        fields.SetField("AV_Straße1", C012Result.Get(7031).ToString());
                        fields.SetField("AV_Straße2", C012Result.Get(7036).ToString());
                        fields.SetField("AV_Straße3", C012Result.Get(7041).ToString());
                        fields.SetField("AV_Straße4", C012Result.Get(7046).ToString());
                        fields.SetField("AV_Straße5", C012Result.Get(7051).ToString());
                        fields.SetField("PLZ_Ort3", C012Result.Get(7032).ToString() + " " + C012Result.Get(7033).ToString());
                        fields.SetField("PLZ_Ort4", C012Result.Get(7037).ToString() + " " + C012Result.Get(7038).ToString());
                        fields.SetField("PLZ_Ort5", C012Result.Get(7042).ToString() + " " + C012Result.Get(7043).ToString());
                        fields.SetField("PLZ_Ort6", C012Result.Get(7055).ToString() + " " + C012Result.Get(7048).ToString());
                        fields.SetField("PLZ_Ort7", C012Result.Get(7052).ToString() + " " + C012Result.Get(7053).ToString());
                        fields.SetField("AV_PartnerNr1", C012Result.Get(7034).ToString());
                        fields.SetField("AV_PartnerNr2", C012Result.Get(7039).ToString());
                        fields.SetField("AV_PartnerNr3", C012Result.Get(7044).ToString());
                        fields.SetField("AV_PartnerNr4", C012Result.Get(7049).ToString());
                        fields.SetField("AV_PartnerNr5", C012Result.Get(7054).ToString());
                        fields.SetField("Datum6", C012Result.Get(4010).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Carsharing.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHEinbeziehungsvereinbarung(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 26.02.2018
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e05c");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7054, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 4010                    });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                        .FromInfoArea(InfoAreaIds.Company)
                        .Select(2, 3, 7, 8, 10, 132)
                        .LinkedTo(LinkTools.CreateLink(C012ID))
                        .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("Straße", bocompany.Get(10).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        //Felder aus C012 füllen  
                        fields.SetField("AV_Filiale1", C012Result.Get(7030).ToString());
                        fields.SetField("AV_Filiale2", C012Result.Get(7035).ToString());
                        fields.SetField("AV_Filiale3", C012Result.Get(7040).ToString());
                        fields.SetField("AV_Filiale4", C012Result.Get(7045).ToString());
                        fields.SetField("AV_Filiale5", C012Result.Get(7050).ToString());
                        fields.SetField("AV_Straße1", C012Result.Get(7031).ToString());
                        fields.SetField("AV_Straße2", C012Result.Get(7036).ToString());
                        fields.SetField("AV_Straße3", C012Result.Get(7041).ToString());
                        fields.SetField("AV_Straße4", C012Result.Get(7046).ToString());
                        fields.SetField("AV_Straße5", C012Result.Get(7051).ToString());
                        fields.SetField("PLZ_Ort1", C012Result.Get(7032).ToString() + " " + C012Result.Get(7033).ToString());
                        fields.SetField("PLZ_Ort2", C012Result.Get(7037).ToString() + " " + C012Result.Get(7038).ToString());
                        fields.SetField("PLZ_Ort3", C012Result.Get(7042).ToString() + " " + C012Result.Get(7043).ToString());
                        fields.SetField("PLZ_Ort4", C012Result.Get(7055).ToString() + " " + C012Result.Get(7048).ToString());
                        fields.SetField("PLZ_Ort5", C012Result.Get(7052).ToString() + " " + C012Result.Get(7053).ToString());
                        fields.SetField("AV_PartnerNr1", C012Result.Get(7034).ToString());
                        fields.SetField("AV_PartnerNr2", C012Result.Get(7039).ToString());
                        fields.SetField("AV_PartnerNr3", C012Result.Get(7044).ToString());
                        fields.SetField("AV_PartnerNr4", C012Result.Get(7049).ToString());
                        fields.SetField("AV_PartnerNr5", C012Result.Get(7054).ToString());
                        fields.SetField("Datum", C012Result.Get(4010).ToString());
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                                               

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Einbeziehungsvereinbarung.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHNeuwagenkonfigurator(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 04.05.2017
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
    }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                        var DocUid = RecordUid.Parse("D1", "x000000030002decc");
               //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                var command = infoArea.CreateCommand<IReadCommand>();
                command.RecordId = options.C012Link.RecordId;
                //C012 Felder für Vorlage eintragen
                command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019 });
                IBusinessObject C012Result = command.Execute();


                //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                var companyresult = services
                .FromInfoArea(InfoAreaIds.Company)
                .Select(2, 3, 7, 8, 10, 132)
                .LinkedTo(LinkTools.CreateLink(C012ID))
                .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());                    
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("Rechnungsnummer", C012Result.Get(7016).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Service-Vertrag-Staffel_1.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHNeuwagenkonfigurator2(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 21.12.2017
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e034");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019 });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                    .FromInfoArea(InfoAreaIds.Company)
                    .Select(2, 3, 7, 8, 10, 132)
                    .LinkedTo(LinkTools.CreateLink(C012ID))
                    .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("Rechnungsnummer", C012Result.Get(7016).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Service-Vertrag-Staffel_2.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHNeuwagenkonfigurator3(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 21.12.2017
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e035");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019 });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                    .FromInfoArea(InfoAreaIds.Company)
                    .Select(2, 3, 7, 8, 10, 132)
                    .LinkedTo(LinkTools.CreateLink(C012ID))
                    .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("Rechnungsnummer", C012Result.Get(7016).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Service-Vertrag-Staffel_3.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 CHNeuwagenkonfigurator4(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 21.12.2017
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C012Link == null || !options.C012Link.IsValid)
                {
                    throw new InvalidOperationException("C012Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e036");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C012ID = RecordUid.Parse(options.C012Link.InfoAreaId, options.C012Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C012Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C012Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7009, 7016, 7017, 7018, 7019 });
                    IBusinessObject C012Result = command.Execute();


                    //Die Firma raussuchen die mit dem C012 Datensatz verknüpft ist
                    var companyresult = services
                    .FromInfoArea(InfoAreaIds.Company)
                    .Select(2, 3, 7, 8, 10, 132)
                    .LinkedTo(LinkTools.CreateLink(C012ID))
                    .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("Firma1", bocompany.Get(2).ToString());
                        fields.SetField("Firma2", bocompany.Get(2).ToString());
                        fields.SetField("Firma3", bocompany.Get(2).ToString());
                        fields.SetField("PLZ_Ort", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort1", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("PLZ_Ort2", bocompany.Get(7).ToString() + " " + bocompany.Get(8).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Ort1", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("Straße1", bocompany.Get(10).ToString());
                        fields.SetField("Straße2", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum1", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum2", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C012 füllen                        
                        fields.SetField("Rechnungsnummer", C012Result.Get(7016).ToString());

                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = false;
                        //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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=DIGEO-Service-Vertrag-Staffel_4.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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 string CHKonditionsblatt(IOutput output, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Bodo Casper
              * Erstellt am: 26.09.2018
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Das Dokument wird anschließend zum anzeigen geladen (in der aufrufenden javaScript Funktion.
              * */

            //Prüfen ob dem Channel informationen über das Ankaufversprechen 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ültiges Ankaufversprechen vorhanden sein
                if (options.C015Link == null || !options.C015Link.IsValid)
                {
                    throw new InvalidOperationException("C015Link is required!");
                }
                else
                {
                    //Es wird UID-Objekt erzeugt das auf die PDF-Vorlage referenziert
                    var DocUid = RecordUid.Parse("D1", "x000000030002e110");
                    //Die DIGEO Vollmacht von der Datenbank lesen der dem Channel übergeben wurde
                    var C015ID = RecordUid.Parse(options.C015Link.InfoAreaId, options.C015Link.RecordId.ToString());
                    var infoArea = services.GetInfoAreaService(options.C015Link.InfoAreaId);
                    var command = infoArea.CreateCommand<IReadCommand>();
                    command.RecordId = options.C015Link.RecordId;
                    //C012 Felder für Vorlage eintragen
                    command.OutputFields.Add(new[] { 7037, 7013, 7076, 7050, 7025, 7026, 7004, 7051, 7027, 7028, 7005, 7048, 7052, 7053, 7054, 7089, 7090, 7006, 7049, 7007, 7059, 7061, 7062, 7063, 7029, 7067, 7068, 7069, 7030, 7070, 7071, 7072, 7008, 7060, 7064, 7065, 7066, 7031, 7073, 7074, 7075, 7032, 7033, 7034, 7035, 7009 });
                    IBusinessObject C015Result = command.Execute();


                    //Die Firma raussuchen die mit dem C015 Datensatz verknüpft ist
                    var companyresult = services
                    .FromInfoArea(InfoAreaIds.Company)
                    .Select(2, 3, 7, 8, 10, 132)
                    .LinkedTo(LinkTools.CreateLink(C015ID))
                    .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("Datum3", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum4", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //fields.SetField("Datum5", string.Format("{0:dd.MM.yyyy}", DateTime.Now));
                        //Felder aus C015 füllen 
                        fields.SetField("HändlergruppenID", C015Result.Get(7037).ToString());
                        fields.SetField("HändlergruppenName", C015Result.Get(7013).ToString());
                        fields.SetField("FinStandard", C015Result.GetCatalogText(7050).ToString());
                        fields.SetField("Fin_Gültigab", C015Result.Get(7025).ToString());
                        fields.SetField("Fin_Gültigbis", C015Result.Get(7026).ToString());
                        fields.SetField("Fin_Bemerkung", C015Result.Get(7004).ToString());
                        fields.SetField("LeaStandard", C015Result.GetCatalogText(7051).ToString());
                        fields.SetField("Lea_Gültigab", C015Result.Get(7027).ToString());
                        fields.SetField("Lea_Gültigbis", C015Result.Get(7028).ToString());
                        fields.SetField("Lea_Bemerkung", C015Result.Get(7005).ToString());
                        fields.SetField("Aktion1", C015Result.GetCatalogText(7048).ToString());
                        fields.SetField("Aktion2", C015Result.GetCatalogText(7052).ToString());
                        fields.SetField("Aktion3", C015Result.GetCatalogText(7053).ToString());
                        fields.SetField("Aktion4", C015Result.GetCatalogText(7054).ToString());
                        fields.SetField("Aktion5", C015Result.GetCatalogText(7089).ToString());
                        fields.SetField("Aktion6", C015Result.GetCatalogText(7090).ToString());
                        fields.SetField("Akt_Bemerkung", C015Result.Get(7006).ToString());
                        fields.SetField("FinPlus", C015Result.GetCatalogText(7049).ToString());
                        fields.SetField("FinPlus_Bemerkung", C015Result.Get(7007).ToString());
                        fields.SetField("SokoFin1", C015Result.GetCatalogText(7059).ToString());
                        fields.SetField("SokoFin1_Gültigab", C015Result.Get(7029).ToString());
                        fields.SetField("SokoFin1_Gültigbis", C015Result.Get(7031).ToString());
                        fields.SetField("SokoFin2", C015Result.GetCatalogText(7061).ToString());
                        fields.SetField("SokoFin2_Gültigab", C015Result.Get(7067).ToString());
                        fields.SetField("SokoFin2_Gültigbis", C015Result.Get(7070).ToString());
                        fields.SetField("SokoFin3", C015Result.GetCatalogText(7062).ToString());
                        fields.SetField("SokoFin3_Gültigab", C015Result.Get(7068).ToString());
                        fields.SetField("SokoFin3_Gültigbis", C015Result.Get(7071).ToString());
                        fields.SetField("SokoFin4", C015Result.GetCatalogText(7063).ToString());
                        fields.SetField("SokoFin4_Gültigab", C015Result.Get(7069).ToString());
                        fields.SetField("SokoFin4_Gültigbis", C015Result.Get(7072).ToString());
                        fields.SetField("SokoFin_Bemerkung1", C015Result.Get(7008).ToString());
                        fields.SetField("SokoLea1", C015Result.GetCatalogText(7060).ToString());
                        fields.SetField("SokoLea1_Gültigab", C015Result.Get(7031).ToString());
                        fields.SetField("SokoLea1_Gültigbis", C015Result.Get(7032).ToString());
                        fields.SetField("SokoLea2", C015Result.GetCatalogText(7064).ToString());
                        fields.SetField("SokoLea2_Gültigab", C015Result.Get(7073).ToString());
                        fields.SetField("SokoLea2_Gültigbis", C015Result.Get(7033).ToString());
                        fields.SetField("SokoLea3", C015Result.GetCatalogText(7065).ToString());
                        fields.SetField("SokoLea3_Gültigab", C015Result.Get(7074).ToString());
                        fields.SetField("SokoLea3_Gültigbis", C015Result.Get(7034).ToString());
                        fields.SetField("SokoLea4", C015Result.GetCatalogText(7066).ToString());
                        fields.SetField("SokoLea4_Gültigab", C015Result.Get(7075).ToString());
                        fields.SetField("SokoLea4_Gültigbis", C015Result.Get(7035).ToString());
                        fields.SetField("SokoLea_Bemerkung1", C015Result.Get(7009).ToString());
                        fields.SetField("Datum", string.Format("{0:dd.MM.yyyy}", DateTime.Now));


                        //fields.SetField("Rechnungsnummer", C015Result.Get(7016).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

                        MemoryStream docStream = new MemoryStream(newDocument.ToArray());

                        output.ContentType = "aplication/pdf";
                        output.Headers.Add("Content-Disposition", "attachment; filename=Konditionsblatt.pdf");
                        output.Headers.Add("Content-Length", docStream.Length.ToString());
                        docStream.CopyTo(output.GetOutputStream());

                        return "OK";

                    }
                }
            }
            catch (Exception ex)
            {
                // BDK.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; }

        public LinkRecordUid C005Link { get; set; }

        public LinkRecordUid C001Link { get; set; }

        public LinkRecordUid POLink { get; set; }

        public LinkRecordUid C012Link { get; set; }

        public LinkRecordUid C015Link { get; set; }

    }
}
