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

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
              * Erstellt am: 05.05.2015
              * Beschreibung: Diese Funktion erstellt ein PDF Dokument. Es wird eine PDF-Vorlage mit Formularfeldern geöffnet. 
              * Die Formularfelder werden mit Informationen aus den Infobereichen 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", "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[] { 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 });
                    IBusinessObject X3Result = command.Execute();
               

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

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

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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                       
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.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());
                        // * 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);


                        //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 = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1" + "_" + bocompany.Get(2).ToString().Replace("\r\n","_") + ".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
              * 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[] { 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 });
                    IBusinessObject X3Result = command.Execute();


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb", X3Result.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("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());
                     

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


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


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


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.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());



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


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


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


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb", X3Result.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());
                        
                        // * Hier weitere Formularfelder füllen
                        // * ...
                        // * 
                        //Dafür sorgen das die Formularfelder im fertigen Dokument nicht mehr bearbeitet werden können
                        stamper.FormFlattening = true;
                        //Schreibendes Objekt schließen und somit das neue PDF erzeugen (bewirkt das der MemoryStream geschlossen wird)
                        stamper.Close();
                        //BusinessObjekt für neuen D1 Datensatz erstellen der das Dokument enthält


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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
              * 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[] { 7045, 7044, 7043, 7042, 7041, 7034, 7033, 7032, 7031, 7030, 7028, 7027, 7026, 7025, 7022, 7021, 7020, 7016, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 63, 49, 48, 47, 42, 41, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb", X3Result.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());
                        

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


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


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


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.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());                        


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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_2_FFS" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_2_FFS" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHBonus3FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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 });
                    IBusinessObject X3Result = command.Execute();


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("Produktbonus", X3Result.Get(7034).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("Formulartext2", X3Result.Get(7026).ToString());
                        fields.SetField("Formulartext1", X3Result.Get(7025).ToString());
                        fields.SetField("FML_ProdText", X3Result.Get(7022).ToString());
                        fields.SetField("TST_pb", X3Result.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());
                        


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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3_FFS" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_3_FFS" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHBonus1FFS(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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[] { 7045, 7044, 7043, 7042, 7041, 7033, 7032, 7031, 7030, 7028, 7027, 7021, 7020, 7016, 7013, 7012, 7011, 7010, 7006, 7000, 76, 75, 74, 65, 64, 49, 48, 47, 42, 41, 22, 21, 20 });
                    IBusinessObject X3Result = command.Execute();


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

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


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

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

                        //Felder aus dem FI Datensatz füllen
                        fields.SetField("Firma", bocompany.Get(2).ToString());
                        fields.SetField("PLZ", bocompany.Get(7).ToString());
                        fields.SetField("Ort", bocompany.Get(8).ToString());
                        fields.SetField("Straße", bocompany.Get(10).ToString());
                        fields.SetField("HDLNummer", bocompany.Get(3).ToString());
                        //Felder aus X3 füllen                        
                        fields.SetField("FM_Ort_Datum", X3Result.Get(7045).ToString());
                        fields.SetField("teur5", X3Result.Get(7044).ToString());
                        fields.SetField("teur4", X3Result.Get(7043).ToString());
                        fields.SetField("ab5", X3Result.Get(7042).ToString());
                        fields.SetField("ab4", X3Result.Get(7041).ToString());
                        fields.SetField("stufeproz5", X3Result.Get(7033).ToString());
                        fields.SetField("stufeproz4", X3Result.Get(7032).ToString());
                        fields.SetField("stufeteur5", X3Result.Get(7031).ToString());
                        fields.SetField("stufeteur4", X3Result.Get(7030).ToString());
                        fields.SetField("TST_partnernr", X3Result.Get(7028).ToString());
                        fields.SetField("TST_plzort", X3Result.Get(7027).ToString());
                        fields.SetField("TST_pb", X3Result.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());



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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1_FFS" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_1_FFS" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHFFSGWBonus(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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());
                        //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);


                        //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 = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_GWBonus" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHZusatzOFLBLB(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());


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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFLBLB" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFLBLB" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHZusatzLSP(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());
                        fields.SetField("gesellschafter", X3Result.Get(79).ToString());


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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvLSP" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvLSP" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHZusatzOFL(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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());
                        //Felder aus X3 füllen                        
                        fields.SetField("gültigbis", X3Result.Get(64).ToString());
                        fields.SetField("gültigab", X3Result.Get(65).ToString());


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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFL" + "_" + bocompany.Get(2) + ".pdf" };
                        //neuesDokument.New();
                        var neuesDokument = services.GetInfoAreaService(InfoAreaIds.Documents);
                        var docCommand = neuesDokument.CreateCommand<INewCommand>();
                        docCommand.BusinessObject = new Documents(services) { Name = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_ZvOFL" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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 CHZusatz50(IChannelWriter writer, AppointmentRecordOptions options)
        {
            /*
              * Erstellt von: Ansgar Schmitz / Bodo Casper
              * Erstellt am: 01.08.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 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");
                    //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());
                        //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.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());



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


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


                        //var neuesDokument = new Documents(this.Services) { Name = "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 = "Bonus" + string.Format("{0:yyyy}", X3Result.GetDate(65)) + "_Zusatz50" + "_" + bocompany.Get(2).ToString().Replace("\r\n", "_") + ".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
              * 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("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("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("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("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) + "-06-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer7", "*" + bocompany.Get(3) + "-07-" + string.Format("{0:yyyyMMdd-HHmmss}", DateTime.Now) + "*");
                        fields.SetField("HDLNummer8", "*" + bocompany.Get(3) + "-08-" + string.Format("{0:yyyyMMdd-HHmmss}", 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));
                        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("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));
                        
                        // * 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";

                        /*
                        //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 = "Deckblatt"+".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);

                        //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 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);
            }
        }
/* neu 26.04.2016 */
[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 = 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=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);

                        //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 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 });
                    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("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 = 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=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 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 });
                    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("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 = 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=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 });
                    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("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 = 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=200_2_Kooperationsvereinbarung_Neukunden_HSC.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 });
                    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("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 = 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=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 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; }
    }
}
