Zum Inhalt

Integration Mahnungsversand

1. Angemahnte Rechnungen anhängen

1.1. Anforderung

Beim Versand der Mahnung sollen die angemahnten Rechnungen als Anhang an die E-Mail angehängt werden.

1.2 Custom Anhang erstellen

Mit dem Multinav Mail Event Mail_OnCreateTempAttachment können Parameter definiert werden, die dann Funktionen für individuelle Anhänge ausführen.

codeunit 50000 "Multinav Attachments"
{
    // Diese Funktion dient als Interface für Kundenspezifische Erweiterungen von Anhängen
    // Als Parameter werden Queue und Anhang übergeben

    var
        CMNMIntegrationInterface: Codeunit "CMNM Integration Interface";
        CMNMIntegrationEvent: Codeunit "CMNM Integration Event";


    [EventSubscriber(ObjectType::Codeunit, Codeunit::"CMNM Integration Event", 'Mail_OnCreateTempAttachment', '', false, false)]
    local procedure CustomTempAttachment(var pEntry: Record "CMNM Entry"; pAttachmentRecordId: RecordID; var pTempEntryDetail: Record "CMNM Entry Detail" temporary; var pResult: Integer; var pProcessed: Boolean)
    begin
        case pEntry."Dispatch Type" of
            pEntry."Dispatch Type"::Outlook,
            pEntry."Dispatch Type"::Smtp:
                pResult := CustomTempEMailAttachment(pEntry, pAttachmentRecordId, pTempEntryDetail, pProcessed);
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"CMNM Integration Event", 'Preview_OnCreateTempAttachment', '', false, false)]
    local procedure CustomPreviewTempAttachment(var pEntry: Record "CMNM Entry"; pAttachmentRecordId: RecordID; var pTempEntryDetail: Record "CMNM Entry Detail" temporary; var pResult: Integer; var pProcessed: Boolean)
    begin
        case pEntry."Dispatch Type" of
            pEntry."Dispatch Type"::Outlook,
            pEntry."Dispatch Type"::Smtp:
                pResult := CustomTempEMailAttachment(pEntry, pAttachmentRecordId, pTempEntryDetail, pProcessed);
        end;
    end;

    procedure CustomTempEMailAttachment(var pEntry: Record "CMNM Entry"; pAttachmentRecordId: RecordID; var pTempEntryDetail: Record "CMNM Entry Detail" temporary; var pProcessed: Boolean) lResult: Integer
    var
        lEmailAttachment: Record "CMNM eMail Attachment";
        lRecRef: RecordRef;
    begin
        if pProcessed then
            exit;

        lRecRef.Get(pAttachmentRecordId);
        lRecRef.SetTable(lEmailAttachment);

        case lEmailAttachment."Codeunit Parameter" of
            'REMINDERDOCS':
                lResult := ReminderCreateInvoiceDocs(pEntry, lEmailAttachment, pTempEntryDetail);
            else
                if not pEntry."Temp Entry" and (pEntry."Entry No." > 0) then
                    exit(45);
        end;

        pProcessed := (lResult = 0) or ((lResult <> 45) and (lResult <> 0));
    end;

    procedure ReminderCreateInvoiceDocs(var pEntry: Record "CMNM Entry"; pAttachment: Record "CMNM eMail Attachment"; var pTempEntryDetail: Record "CMNM Entry Detail" temporary) lResult: Integer
    var
        lIssRemHeader: Record "Issued Reminder Header";
        lIssRemLine: Record "Issued Reminder Line";
        lSalesInvHeader: Record "Sales Invoice Header";
        lRepSel: Record "Report Selections";
        lRecRef: RecordRef;
        lSalesInvHeaderRef: RecordRef;
        lOutStream: OutStream;
    begin
        lRecRef.Get(pEntry."Source RecordID");
        lRecRef.SetTable(lIssRemHeader);
        lIssRemLine.SetRange("Reminder No.", lIssRemHeader."No.");
        lIssRemLine.SetRange(Type, lIssRemLine.Type::"Customer Ledger Entry");
        lIssRemLine.SetRange("Document Type", lIssRemLine."Document Type"::Invoice);

        if lIssRemLine.FindSet() then
            repeat
                lSalesInvHeader.Get(lIssRemLine."Document No.");
                Clear(lSalesInvHeaderRef);
                lSalesInvHeaderRef.GetTable(lSalesInvHeader);
                lSalesInvHeaderRef.SetRecFilter();
                lSalesInvHeader.SetRecFilter();
                lRepSel.Get(lRepSel.Usage::"S.Invoice", '1');

                if not pTempEntryDetail.FindLast() then
                    pTempEntryDetail."Detail Entry No." := 1
                else
                    pTempEntryDetail."Detail Entry No." += 1;
                pTempEntryDetail.Init();

                pTempEntryDetail."Entry No." := pEntry."Entry No.";
                pTempEntryDetail.Type := pTempEntryDetail.Type::attachment;
                pTempEntryDetail.Value := StrSubstNo(pAttachment."Custom Attachment Name", lSalesInvHeader."No.");

                pTempEntryDetail.Attachment.CreateOutStream(lOutStream);
                Report.SaveAs(lRepSel."Report ID", '', ReportFormat::Pdf, lOutStream, lSalesInvHeaderRef);

                pTempEntryDetail.Insert();
            until lIssRemLine.Next() = 0;
    end;
}

Im letzten Schritt wird dann in der E-Mail Vorlage im Register Anhänge eine Zeile mit Anhang Art = Codeunit und Codeunit Parameter = REMINDERDOCS angelegt.

2. Versand der Mahnung beim Registrieren

2.1. Anforderung

Die Mahnungen sollen beim Registrieren automatisch versendet werden.

2.2. Integration in die Codeunit „Reminder-Issue“

In einem Event Subscriber für „OnAfterIssueReminder“ wird die Funktion CreateEntry von Multinav Mail aufgerufen und damit eine neue E-Mail erstellt.
Es werden immer alle Mahnungen beim Registrieren versendet. Möglich wäre hier auch eine Abfrage vor der Funktion CreateEntry, die prüft, ob ein Empfänger für die Mahnung vorhanden ist.

codeunit 50001 OnIssueReminder
{
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Reminder-Issue", 'OnAfterIssueReminder', '', false, false)]
    local procedure OnAfterIssueReminder(var ReminderHeader: Record "Reminder Header"; IssuedReminderNo: Code[20]);
    var
        IssReminderHeader: record "Issued Reminder Header";
        CMNMIntegrationInterface: Codeunit "CMNM Integration Interface";
    begin
        if IssuedReminderNo = '' then
            exit;

        IssReminderHeader.get(IssuedReminderNo);

        CMNMIntegrationInterface.CMNMManagement_CreateEntry('MAHNUNG', IssReminderHeader.RecordId, Enum "CMNM Dispatch Type"::Smtp, false);
    end;

    //Übersteuerung des Drucks pro Issued Reminder Header Datensatz. Wenn kein Mail Posten erzeugt wurde wird die Mahnung gedruckt
    [EventSubscriber(ObjectType::Table, Database::"Issued Reminder Header", 'OnBeforePrintRecords', '', false, false)]
    local procedure OnBeforePrintRecords(var IssuedReminderHeader: Record "Issued Reminder Header"; ShowRequestForm: Boolean; SendAsEmail: Boolean; HideDialog: Boolean; var IsHandled: Boolean);
    var
        CMNMIntegrationInterface: Codeunit "CMNM Integration Interface";
        EntryNo: Integer;
    begin
        //zusätzliche Empfänger Prüfung

        EntryNo := CMNMIntegrationInterface.CMNMManagement_CreateEntry('MAHNUNG', IssuedReminderHeader.RecordId, Enum "CMNM Dispatch Type"::Smtp, false);

        if EntryNo <> 0 then
            IsHandled := true;
    end;
}