Zum Inhalt

Faktura

Die Faktura ist über Events, Enums und Interfaces erweiterbar.

Beispiel: Erweiterung um die zusätzliche Kalkulationsart "Arbeitsauftrag"

Szenario: Wir wollen eine zusätzliche Gruppierung im Beleglayout nach Arbeitsaufträgen in der Rechnungsdarstellung ermöglichen.

Ansicht

Über den Enum BSSSP Invoice Scheme Calculation Type wird gesteuert welche Gruppierungen / Ausgaben bzw. Rechnungserstellungen möglich sind. Dieser Enum implementiert wiederum das Interface BSSSP Invoice Scheme Calculation.

Auszug aus dem Enum:

enum 5250101 "BSSSP Invoice Scheme Calculation Type" implements "BSSSP Invoice Scheme Calculation"
{
    Extensible = true;

    value(0; None)
    {
        Caption = 'Keine Auswahl';
        Implementation = "BSSSP Invoice Scheme Calculation" = "BSSSP InvCalcNone";
    }
    value(5; Customer)
    {
        Caption = 'Rechnungsempfänger';
        Implementation = "BSSSP Invoice Scheme Calculation" = "BSSSP InvCalcCustomer";
    }

    ...
}

Zunächst muss der Enum erweitert werden:

enumextension 50001 MyInvoiceSchemeExt extends "BSSSP Invoice Scheme Calculation Type"
{
    value(50000; "Work Order")
    {
        Caption = 'Arbeitsauftrag';
    }
}

Jetzt fehlt noch die Implementierung des Interfaces, hierfür wird eine Codeunit benötigt, die das Interface implementiert.

Beispielimplementierung:

codeunit 50000 "MyInvCalcWorkOrder" implements "BSSSP Invoice Scheme Calculation"
{
    var
        WorkOrder: Record "BSSSP Work Order";

    procedure FillValueBuffer(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var InvoiceEntryBuffer: Record "BSSSP Invoice Entry" temporary; var ValueBuffer: List of [Guid])
    begin
        if not WorkOrder.get(InvoiceEntryBuffer."Work Order No.") then
            Clear(WorkOrder);

        if not ValueBuffer.Contains(WorkOrder.SystemId) then begin
            ValueBuffer.Add(WorkOrder.SystemId);
        end;
    end;

    procedure SortValueBuffer(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var ValueBuffer: List of [Guid]; var SortedValueBuffer: Dictionary of [Integer, Guid])
    var
        InvoiceSchemeCalculation: Codeunit "BSSSP InvoiceSchemeCalculation";
    begin
        InvoiceSchemeCalculation.SortValueBufferDefault(WorkOrder, InvoiceSchemeLineBuffer, ValueBuffer, SortedValueBuffer);
    end;

    procedure SetRangeByValue(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var InvoiceEntryBuffer: Record "BSSSP Invoice Entry" temporary; SystemId: Guid)
    begin
        if WorkOrder.GetBySystemId(SystemId) then begin
            InvoiceEntryBuffer.SetRange("Work Order No.", WorkOrder."No.");
        end;
    end;

    procedure GetDocumentText(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; SystemId: Guid): Text;
    var
        StandardLbl: Label 'Arbeitsauftrag ';
        RecordVariant: Variant;
    begin
        GetRecordFromSystemId(SystemId, RecordVariant);
        WorkOrder := RecordVariant;

        if InvoiceSchemeLineBuffer."Document Text" = '' then begin
            exit(StandardLbl + WorkOrder."No.");
        end else begin
            exit(StrSubstNo(InvoiceSchemeLineBuffer."Document Text", WorkOrder."No.", WorkOrder."Search Description", WorkOrder."Document Date"));
        end;
    end;

    procedure GetRecordFromSystemId(SystemId: Guid; var RecordVariant: Variant)
    begin
        if WorkOrder.GetBySystemId(SystemId) then
            RecordVariant := WorkOrder;
    end;

    procedure GetAvailableDocumentPlaceholders(var DocumentTextDictionary: Dictionary of [Integer, Text])
    begin
        DocumentTextDictionary.Add(1, WorkOrder.FieldCaption("No."));
        DocumentTextDictionary.Add(2, WorkOrder.FieldCaption("Search Description"));
        DocumentTextDictionary.Add(3, WorkOrder.FieldCaption("Document Date"));
    end;


    procedure GetSortingFields(var SortingFieldsDictionary: Dictionary of [Integer, Text])
    begin
        SortingFieldsDictionary.Add(WorkOrder.FieldNo("No."), WorkOrder.FieldCaption("No."));
        SortingFieldsDictionary.Add(WorkOrder.FieldNo("Search Description"), WorkOrder.FieldCaption("Search Description"));
    end;
}

Über die Funktion FillValueBuffer wird ein Puffer mit Werten erzeugt, um über die Arbeitsaufträge gruppieren zu können. In diesen Puffer wird die SystemId des Arbeitsauftrages geschrieben, der im Fakturaposten gefunden wurde.

Die Funktion SortValueBuffer sortiert diesen Puffer abhängig davon welche Sortierung im Beleglayout ausgewählt wurde. Über die Funktion GetSortingFields kann definiert werden welche Felder des Arbeitsauftrages für die Sortierung zur Verfügung stehen, wir haben hier die Nummer und den Suchbegriff gewählt. In der Funktion SortValueBuffer nutzen wir die Codeunit InvoiceSchemeCalculation, welche eine Standardsortierfunktion beinhaltet die mit allen Records (Variant) umgehen kann, vorstellbar wäre aber auch eine komplett freie Routine. Wichtig ist hier, dass die Variable SortedValueBuffer einen sortierten Puffer zurückliefert.

Die Funktion SetRangeByValue wird in der Rechnungserstellung verwendet, um die Fakturaposten entsprechend zu filtern, hier nach dem Arbeitsauftrag.
Die Funktion GetRecordFromSystemId liefert den Record als Variant zurück, der verwendet werden soll.

Abschliessend müssen wir uns mit den Dokumenttexten befassen, hierfür liefert die Funktion GetDocumentText für eine SystemId (Arbeitsauftrag) einen Textstring zurück. Über die Funktion GetAvailableDocumentPlaceholders geben wir dem Benutzer die möglichen Felder an, wir haben uns hier für Nummer, Suchbegriff und Belegdatum entschieden.

Als letzen Schritt unserer Erweiterung müssen wir die Implementation in unserer Enum-Erweiterung eintragen:

enumextension 50001 MyInvoiceSchemeExt extends "BSSSP Invoice Scheme Calculation Type"
{
    value(50000; "Work Order")
    {
        Caption = 'Arbeitsauftrag';
        Implementation = "BSSSP Invoice Scheme Calculation" = "MyInvCalcWorkOrder";
    }
}

Danach kann Rechnungserstellung nach Arbeitsauftrag, Gruppierung nach Arbeitsauftrag und Ausgabe nach Arbeitsauftrag für das Beleglayout verwendet werden.