Table of Contents

Technische Erweiterungsmöglichkeiten

Der Candis Connector lässt sich flexibel erweitern – sowohl durch die Nutzung von Event-Abonnements als auch durch die Integration von Objekterweiterungen. In Abschnitt Alle Events werden zunächst alle verfügbaren Events tabellarisch dargestellt. Anschließend erläutert Abschnitt Stammdatenübertragung die Erweiterungsmöglichkeiten im Rahmen der Stammdatenübertragung. Abschnitt Einkaufsrechnungsimport und Datenverarbeitung beschreibt schließlich, wie der Import von Einkaufsbelegen einschließlich der zugrunde liegenden Verarbeitungslogik individuell angepasst werden kann.

Alle Events

Modul Event Datei
Vendor OnCheckCandisVendorUpdateNeeded(var Vendor: Record Vendor; var xVendor: Record Vendor; var isNeeded: Boolean) SNCC Transfer Vendor Mgt.
Vendor OnCheckCandisVendorBankAccountUpdateNeeded(var VendorBankAccount: Record "Vendor Bank Account"; var xVendorBankAccount: Record "Vendor Bank Account"; var isNeeded: Boolean) SNCC Transfer Vendor Mgt.
Vendor OnBeforeUpdateCandisVendorEntry(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var Vendor: Record Vendor) SNCC Transfer Vendor Mgt.
Vendor OnBeforeUpdateVendorChangeLog(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var Vendor: Record Vendor) SNCC Vendor Change Mgt.
Vendor OnBeforeApplyLatestChange(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var SNCCVendorUpdate: Record "SNCC Vendor Update") SNCC Vendor Change Mgt.
Vendor OnBeforeSetHttpRequestBodyValues(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var ContentBody: JsonObject) SNCC Vendor HTTP Handler
PaymentTerm OnCheckCandisPaymentTermUpdateNeeded(var PaymentTerms: Record "Payment Terms"; var xPaymentTerms: Record "Payment Terms"; var isNeeded: Boolean) SNCC Transfer Payment Term
PaymentTerm OnBeforeUpdateCandisPaymentTermEntry(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var PaymentTerms: Record "Payment Terms") SNCC Transfer Payment Term
PaymentTerm OnBeforeSetHttpRequestBody(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var ContentBodys: JsonArray) SNCC Payment HTTP Handler
PaymentTerm OnBeforeApplyLatestChange(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var SNCCPaymentTeLatestChange: Record "SNCC Payment Te. Latest Change") SNCC Payment Term Change Mgt.
PaymentTerm OnBeforeUpdatePaymentTermChangeLog(var SNCCPaymentTeLatestChange: Record "SNCC Payment Te. Latest Change"; var PaymentTerms: Record "Payment Terms") SNCC Payment Term Change Mgt.
GLAccount OnCheckCandisGLAccountUpdateNeeded(var GLAccount: Record "G/L Account"; var xGLAccount: Record "G/L Account"; var isNeeded: Boolean) SNCC Transfer G/L Account Mgt.
GLAccount OnBeforeUpdateCandisGLAccountEntry(var SNCCGLAccountUpdate: Record "SNCC G/L Account Update"; var GLAccount: Record "G/L Account") SNCC Transfer G/L Account Mgt.
GLAccount OnBeforeSetHttpRequestBody(var SNCCGLAccountUpdate: Record "SNCC G/L Account Update"; var ContentBody: JsonObject) SNCC G/L Account HTTP Handler
GLAccount OnBeforeApplyLatestChange(var SNCCGLAccountLastChange: Record "SNCC G/L Account Last. Change"; var SNCCGLAccountUpdate: Record "SNCC G/L Account Update") SNCC G/L Account Change Mgt.
GLAccount OnBeforeUpdateGLAccountChangeLog(var SNCCGLAccountLastChange: Record "SNCC G/L Account Last. Change"; var GLAccount: Record "G/L Account") SNCC G/L Account Change Mgt.
VatPostSet OnCheckCandisVatPostSetUpdateNeeded(var VATPostingSetup: Record "VAT Posting Setup"; var xVATPostingSetup: Record "VAT Posting Setup"; var isNeeded: Boolean) SNCC Transfer VATPostSet Mgt.
VatPostSet OnBeforeUpdateCandisVATPostSetEntry(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var VATPostingSetup: Record "VAT Posting Setup") SNCC Transfer VATPostSet Mgt.
VatPostSet OnBeforeSetHttpRequestBody(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var ContentBody: JsonObject) SNCC VATPostSet HTTP Handler
VatPostSet OnBeforeApplyLatestChange(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var SNCCVATPostSetLatestChange: Record "SNCC VATPostSet Latest Change") SNCC VATPostSet Change Mgt.
VatPostSet OnBeforeUpdateVATPostSetChangeLog(var SNCCVATPostSetLatestChange: Record "SNCC VATPostSet Latest Change"; var VATPostingSetup: Record "VAT Posting Setup") SNCC VATPostSet Change Mgt.
Dimension OnAfterApplyInterfaceSetup(var SNCCInterfaceSetup: Record "SNCC Interface Setup") SNCC Interface Setup Wizard
Dimension OnCheckDimensionActive(var IsDimensionActive: Boolean) SNCC Dimension Helper
Dimension OnBeforeCheckDimensionTypeValid(var DimensionValue: Record "Dimension Value"; var SNCCDimensionType: Enum "SNCC Dimension Type"; var isHandled: Boolean) SNCC Transfer Dimension Mgt.
Dimension OnAfterCombineDimensionTypeFiler(var DimensionTypeFilter: Text) SNCC Dimension Helper
Dimension OnBeforeSetHttpRequestBody(var SNCCDimensionUpdate: Record "SNCC Dimension Update"; var ContentBody: JsonObject) SNCC Dimension HTTP Handler
Candis Import OnBeforeInsertPurchInvHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var ContentObject: JsonObject) SNCC Export Doc Data Handler
Candis Import OnBeforeInsertPurchInvLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var LineContent: JsonToken) SNCC Export Doc Data Handler
BC-Rechnungserstellung OnBeforeModifyPurchaseHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var PurchaseHeader: Record "Purchase Header") SNCC Export Doc Transformer
BC-Rechnungserstellung OnBeforeInsertPurchaseLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var PurchaseLine: Record "Purchase Line") SNCC Export Doc Transformer
VATReporting Date Extension - Setup OnCheckVATReportingDateUsage(DeliveryDateUsage: Enum "SNCC Delivery Date Usage") Table -> SNCC Interface Setup
VATReporting Date Extension - Wizard OnCheckVATReportingDateUsage(SNCCDeliveryDateUsage: Enum "SNCC Delivery Date Usage") Page -> SNCC Interface Setup Wizard
VATReporting Date Extension OnSetDeliveryDateOnPurchaseHeader(var DeliveryDateUsage: Enum "SNCC Delivery Date Usage"; var PurchaseHeader: Record "Purchase Header"; var DeliveryDate: Date) SNCC Export Doc Transformer

Stammdatenübertragung

Im Rahmen der Weiterentwicklung des SIEVERS Candis Connectors besteht die Möglichkeit, zusätzliche Felder in den Stammdatenmodulen zu berücksichtigen und an das Candis-Portal zu übertragen. Die erforderlichen Implementierungsschritte können je nach Modul variieren. Abschnitt Kreditorenmodul beschreibt exemplarisch die Vorgehensweise zur Erweiterung der Stammdatenübertragung am Beispiel des Kreditorenmoduls. Diese Vorgehensweise ist auf die übrigen Module übertragbar. Eine Ausnahme bildet das Dimensionsmodul, da es abweichende Anforderungen an die Erweiterung stellt. Aus diesem Grund wird dessen spezifische Implementierung gesondert in Abschnitt Dimensionsmodul erläutert.

Kreditorenmodul

Hinweis: Das hier beschriebene Vorgehen gilt analog auch für die Module PaymentTerm, GLAccount und VatPostSet.

Die Erweiterung des Kreditorenmoduls umfasst drei wesentliche Anpassungen:

  1. Erweiterung der Tabellen und Pages

    Die Tabellen SNCC Vendor Update, SNCC Vendor Updates Archiv sowie SNCC Vendor Latest Change müssen um die neuen Felder erweitert werden. Dabei ist zwingend sicherzustellen, dass Basis und Archiv identisch aufgebaut sind. Für die Synchronisierung wird die interne AL-Funktion TransferFields verwendet, um Daten zwischen den Tabellen zu übertragen.

  2. Übernahme von Änderungen am Kreditor

    Sobald im System Änderungen an Kreditor-Stammdaten vorgenommen werden, erfolgt deren Prüfung und Übernahme über mehrere Events:

    • Überprüfung ob eine Änderung stattgefunden hat: SNCC Transfer Vendor Mgt. -> OnCheckCandisVendorUpdateNeeded und/oder OnCheckCandisVendorBankAccountUpdateNeeded
     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Vendor Mgt.", 'OnCheckCandisVendorUpdateNeeded', '', false, false)]
     local procedure OnCheckCandisVendorUpdateNeeded(var Vendor: Record Vendor; var xVendor: Record Vendor; var isNeeded: Boolean)
     begin
         if Vendor."Country/Region Code" <> xVendor."Country/Region Code" then begin
             isNeeded := true;
         end;
     end;
    
    • Übernahme aus dem Kreditor in eine Update Entität: SNCC Transfer Vendor Mgt.OnBeforeUpdateCandisVendorEntry
     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Vendor Mgt.", 'OnBeforeUpdateCandisVendorEntry', '', false, false)]
     local procedure OnBeforeUpdateCandisVendorEntry(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var Vendor: Record Vendor)
     begin
         SNCCVendorUpdate.Validate(Country, Vendor."Country/Region Code");
     end;
    
    • Übernahme aus dem Kreditor in die Folgeaktualsierungen: SNCC Vendor Change Mgt.OnBeforeUpdateVendorChangeLog
     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor Change Mgt.", 'OnBeforeUpdateVendorChangeLog', '', false, false)]
     local procedure OnBeforeUpdateVendorChangeLog(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var Vendor: Record Vendor)
     begin
         SNCCVendorLatestChange.Validate(Country, Vendor."Country/Region Code");
     end;
    
    • Übernahme aus den Folgeaktualsierungen in die Update Entität: SNCC Vendor Change Mgt.OnBeforeApplyLatestChange
     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor Change Mgt.", 'OnBeforeApplyLatestChange', '', false, false)]
     local procedure OnBeforeApplyLatestChange(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var SNCCVendorUpdate: Record "SNCC Vendor Update")
     begin
         SNCCVendorUpdate.Validate(Country, SNCCVendorLatestChange.Country);
     end;
    
  3. Erweiterung der HTTP-Anfragen

    Um die erweiterten Felder auch in die Kommunikation mit dem Candis-Portal einzubeziehen, wird der HTTP-Body im Event OnBeforeSetHttpRequestBody der Codeunit SNCC Vendor HTTP Handler erweitert.

     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor HTTP Handler", 'OnBeforeSetHttpRequestBodyValues', '', false, false)]
     local procedure OnBeforeSetHttpRequestBodyValues(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var ContentBody: JsonObject)
     var
         CountryJsonValue: JsonValue;
     begin
         CountryJsonValue.SetValueToNull();
         if SNCCVendorUpdate.Country <> '' then
             CountryJsonValue.SetValue(SNCCVendorUpdate.Country);
    
         ContentBody.Add('Country', CountryJsonValue);
     end;
    

Dimensionsmodul

  1. Setup-Erweiterung In der SNCC Interface Setup-Tabelle und der zugehörigen Page wird eine neue Dimension ergänzt.

  2. Enum-Erweiterung

    Über eine Enum Erweiterung wird das Enum SNCC Dimension Type um einen neuen Typen ergänzt.

  3. Zuweisungslogik anpassen

    Das Event OnBeforeCheckDimensionTypeValid wird genutzt um die neue Dimension der Abfrage Logik bei einem Update hinzuzufügen. Weiterhin muss das Event OnCheckDimensionActive genutzt werden, da die Standard Dimensionen deaktiviert werden können. Wenn keine Dimension aktiv ist, wird weiterführende Logik nicht ausgeführt. Dieses Event muss zur Aktivierung den Boolean passend setzen.

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Dimension Mgt.", 'OnBeforeCheckDimensionTypeValid', '', false, false)]
    local procedure OnBeforeCheckDimensionTypeValid(var DimensionValue: Record "Dimension Value"; var SNCCDimensionType: Enum "SNCC Dimension Type"; var isHandled: Boolean)
    var
      SNCCInterfaceSetup: Record "SNCC Interface Setup";
    begin
      SNCCInterfaceSetup.Get();
      case DimensionValue."Dimension Code" of
          SNCCInterfaceSetup."New Dimension":
              begin
                  SNCCDimensionType := SNCCDimensionType::"New Dimension";
                  isHandled := true;
              end;
      end;
    end;
    
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension Helper", 'OnCheckDimensionActive', '', false, false)]
    local procedure OnCheckDimensionActive(var IsDimensionActive: Boolean)
    var
      SNCCInterfaceSetup: Record "SNCC Interface Setup";
    begin
      if not SNCCInterfaceSetup.Get() then begin
          SNCCInterfaceSetup.Init();
          SNCCInterfaceSetup.Insert(true);
      end;
      isDimensionActive := (SNCCInterfaceSetup."Interface NEW DIMENSION Active" or SNCCInterfaceSetup."Interface Active");
    end;
    
  4. Erweiterung der HTTP-Anfragen

    Der Filtermechanismus zur Setzung von Dimensionsfiltern muss entsprechend erweitert werden. Hierfür steht das Event OnAfterCombineDimensionTypeFiler zur Verfügung. Wenn mehrere Dimensionen ergänzt werden sollen, ist ab der zweiten Dimension eine logische ODER-Verknüpfung mithilfe des Pipe-Operators (|) vorzunehmen. Da bereits eine Dimension gesetzt sein kann, muss dies zunächst überprüft werden.

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension Helper", 'OnAfterCombineDimensionTypeFiler', '', false, false)]
    local procedure OnAfterCombineDimensionTypeFiler(var DimensionTypeFilter: Text)
    begin
        if DimensionTypeFilter = '' then
            DimensionTypeFilter := Format(Enum::"SNCC Dimension Type"::"New Dimension")
        else
            DimensionTypeFilter += '|' + Format(Enum::"SNCC Dimension Type"::"New Dimension");
        DimensionTypeFilter += '|' + Format(Enum::"SNCC Dimension Type"::"New Dimension 2");
    end;
    

    Das Event OnAfterSetHttpRequestBody in der Codeunit SNCC Dimension HTTP Handler wird angepasst, um die neue Dimension in den JSON-Body zu integrieren.

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension HTTP Handler", 'OnBeforeSetHttpRequestBody', '', false, false)]
    local procedure OnBeforeSetHttpRequestBody(var SNCCDimensionUpdate: Record "SNCC Dimension Update"; var ContentBody: JsonObject)
    begin
        case
            SNCCDimensionUpdate."Dimension Type" of
            Enum::"SNCC Dimension Type"::"New Dimension":
                ContentBody.Add('type', 'New Dimension');
        end;
    end;
    

Mit erfolgreicher Umsetzung dieser Erweiterung lassen sich zusätzliche Dimensionen systemseitig verwalten und vollautomatisch an das Candis-Portal übertragen.

Einkaufsbelegimport und Datenverarbeitung

Neben der Stammdatenübertragung bestehen weitere Möglichkeiten zur Erweiterung im Bereich des Einkaufsbelegimport aus dem Candis-Portal.

Empfangen weiterer Felder aus Candis in SNCCPurchInvHeader/Line

  1. Erweiterung von Tabellen und Pages

    • Tabellen: SNCC Purch. Inv. Header und SNCC Purch. Inv. Header Archiv für Header-Felder
    • Pages: SNCC Purch. Inv. Headers und SNCC Purch. Inv. Head. Archivs
    • Tabellen: SNCC Purch. Inv. Line und SNCC Purch. Inv. Line Archiv für Positionsdaten
    • Pages: SNCC Purch. Inv. Lines und SNCC Purch. Inv. Line Archivs
  2. Verarbeitung per Event-Subscriber

    Das Event SNCC Export Doc Data Handler: OnBeforeInsertPurchInvHeader: ermöglicht das Einlesen zusätzlicher Felder aus dem ContentObject und deren Speicherung in der TransfertabelleSNCCPurchInvHeader. OnBeforeInsertPurchInvLine ist das Equivalent zu verwendende Event für die Purchase Line.

     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Data Handler", 'OnBeforeInsertPurchInvHeader', '', false, false)]
     local procedure OnBeforeInsertPurchInvHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var ContentObject: JsonObject)
     var
         Country: Code[10];
         CountryCode: JsonToken;
         LabelCountry: Label 'Country';
     begin
         ContentObject.SelectToken(LabelCountry, CountryCode);
         SNCCPurchInvHeader."Country" := CountryCode.AsValue().AsText();
     end;
    
     [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Data Handler", 'OnBeforeInsertPurchInvLine', '', false, false)]
     local procedure OnBeforeInsertPurchInvLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var LineContent: JsonToken)
     var
         Country: Code[10];
         CountryCode: JsonToken;
         LabelCountry: Label 'Country';
     begin
         LineContent.SelectToken(LabelCountry, CountryCode);
         SNCCPurchInvLine."Country" := CountryCode.AsValue().AsText();
     end;
    

Verarbeitung von SNCCPurchInvHeader/Line zu einem BC-Beleg

  1. Verarbeitung per Event-Subscriber

    • In SNCC Export Doc Transformer:

      • OnBeforeModifyPurchaseHeader: erzeugt einen BC-Purchase Header aus dem Candis-Header
         [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnBeforeModifyPurchaseHeader', '', false, false)]
         local procedure OnBeforeModifyPurchaseHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var PurchaseHeader: Record "Purchase Header")
         begin
             PurchaseHeader.Validate("Field", SNCCPurchInvHeader.Field);
         end;
      
      • OnBeforeInsertPurchaseLine: erzeugt eine BC-Purchase Line aus der Candis-Zeile
         [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnBeforeInsertPurchaseLine', '', false, false)]
         local procedure OnBeforeInsertPurchaseLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var PurchaseLine: Record "Purchase Line")
         begin
             PurchaseLine.Validate("Area", SNCCPurchInvLine.Country);
         end;
      

Erweiterung der Logik für das Setzen des Leistungsdatum

Ziel dieser Erweiterung ist es, das Leistungsdatum vom Candis Portal in ein anderes Feld des Purchase Headers zu schreiben. Wie Abschnitt Einkaufsbeleg Einrichtung beschreibt, kann ddas Leistungsdatum so konfiguriert werden, dass es in andere Felder geschrieben wird.

  1. Erweiterung des Enums SNCC Delivery Date Usage Neue Option zur alternativen Zuweisung des Datums hinzufügen

  2. Subscriber zur Auswahlkontrolle der Konfiguration (Optional) Wenn notwendig kann an dieser Stelle eine Überprüfung stattfinden

    • SNCC Interface Setup (Table) → OnCheckVATReportingDateUsage
  3. Subscriber zum Setzen des konfigurierten Feldes

    • SNCC Export Doc TransformerOnSetDeliveryDateOnPurchaseHeader
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnSetDeliveryDateOnPurchaseHeader', '', false, false)]
    local procedure OnSetDeliveryDateOnPurchaseHeader(var DeliveryDateUsage: Enum "SNCC Delivery Date Usage"; var PurchaseHeader: Record "Purchase Header"; var DeliveryDate: Date)
    begin
        case DeliveryDateUsage of
            "SNCC Delivery Date Usage"::"New usage":
                begin
                    PurchaseHeader.Validate("Order Date", DeliveryDate);
                end;
        end;
    end;
    

Mit diesen Erweiterungen wird die Flexibilität und Erweiterbarkeit des Candis Connectors im Bereich der automatisierten Einkaufsbelegverarbeitung gewährleistet.

Kacheln des Candis Connectors in weitere Rollencenter integrieren

Die CueGroup mit den Kacheln des Candis Connectors ist in einer eigenständigen DataPart Page namens SNCC Cues implementiert. Diese Page kann flexibel in beliebige Rollencenter eingebunden werden.

Nachfolgend ein Beispiel zur Einbindung der SNCC Cues in das Team Member Role Center:

pageextension 72093123 "SNCC TeamMemberRoleCenter" extends "Team Member Role Center"
{
    layout
    {
        addafter(Control3)
        {
            part("SNCC Cues"; "SNCC Cues")
            {
                ApplicationArea = Suite;
            }
        }
    }
}

Wenn kein Candis-Interface aktiv ist und die entsprechenden Kacheln nicht benötigt werden, können diese über die „Personalisieren“-Funktion in Microsoft Dynamics 365 Business Central ausgeblendet werden.

Gehen Sie dazu wie folgt vor:

  1. Öffnen Sie das entsprechende Rollencenter.

  2. Klicken Sie oben rechts auf das Zahnrad-Symbol und wählen Sie „Personalisieren“ aus.

  3. Markieren Sie den Bereich „Candis.

  4. Klicken Sie auf das kleine rote Dreieck in der oberen rechten Ecke des markierten Bereichs und wählen Sie „Ausblenden“.

Wenn Sie die Kacheln später wieder einblenden möchten, führen Sie dieselben Schritte erneut aus. Anstelle der Option „Ausblenden“ wird Ihnen die Option „Einblenden“ angeboten.

Diese Vorgehensweise ermöglicht eine einfache Erweiterung bestehender Rollencenter um die Candis-spezifischen Kacheln, ohne die Originalstruktur wesentlich zu verändern.