Codeunit 545 Send Reminder, source in 29

Source29

src/Layers/W1/BaseApp/Sales/Reminder/SendReminder.Codeunit.al134 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Sales.Reminder;

using Microsoft.Foundation.Reporting;
using System.EMail;

codeunit 545 "Send Reminder"
{
    Permissions = tabledata "Issued Reminder Header" = rmid,
                  tabledata "Email Outbox" = rmid;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Document-Mailing", 'OnAfterEmailSent', '', false, false)]
    local procedure HandleEmailSent(var TempEmailItem: Record "Email Item" temporary; PostedDocNo: Code[20]; ReportUsage: Integer; EmailSentSuccesfully: Boolean)
    var
        DummyReportSelections: Record "Report Selections";
        IssuedReminderHeader: Record "Issued Reminder Header";
    begin
        if not EmailSentSuccesfully then
            exit;

        if ReportUsage <> DummyReportSelections.Usage::Reminder.AsInteger() then
            exit;

        if not IssuedReminderHeader.Get(PostedDocNo) then
            exit;

        UpdateSentEmailFields(IssuedReminderHeader);
    end;

    [EventSubscriber(ObjectType::Table, Database::"Issued Reminder Header", 'OnBeforeModifyEvent', '', false, false)]
    local procedure ClearEmailFields(var Rec: Record "Issued Reminder Header"; var xRec: Record "Issued Reminder Header"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary() then
            exit;

        if not xRec.Find() then
            exit;

        if Rec."Reminder Level" <> xRec."Reminder Level" then
            Rec.ClearSentEmailFieldsOnLevelUpdate(Rec);
    end;

    /// <summary>
    /// Prompts the user to select how the reminder was sent and updates the sent email fields accordingly.
    /// </summary>
    /// <param name="IssuedReminderHeader">Specifies the issued reminder header to update.</param>
    procedure UpdateReminderSentFromUI(var IssuedReminderHeader: Record "Issued Reminder Header")
    var
        SelectedOption: Integer;
    begin
        SelectedOption := StrMenu(ReminderSentByEmailTxt, 1, MarkAsSentQst);
        if SelectedOption = 0 then
            exit;

        if SelectedOption = 1 then
            UpdateSentEmailFields(IssuedReminderHeader)
        else
            UpdateSentForCurrentLevelWithoutEmail(IssuedReminderHeader);
    end;

    /// <summary>
    /// Updates the email tracking fields on the issued reminder header after successful email delivery.
    /// </summary>
    /// <param name="IssuedReminderHeader">Specifies the issued reminder header to update.</param>
    procedure UpdateSentEmailFields(var IssuedReminderHeader: Record "Issued Reminder Header")
    begin
        IssuedReminderHeader."Sent For Current Level" := true;
        IssuedReminderHeader."Last Email Sent Date Time" := CurrentDateTime();
        IssuedReminderHeader."Total Email Sent Count" += 1;
        if IssuedReminderHeader."Email Sent Level" <> IssuedReminderHeader."Reminder Level" then begin
            IssuedReminderHeader."Last Level Email Sent Count" := 1;
            IssuedReminderHeader."Email Sent Level" := IssuedReminderHeader."Reminder Level";
        end else
            IssuedReminderHeader."Last Level Email Sent Count" += 1;

        IssuedReminderHeader.Modify();
    end;

    /// <summary>
    /// Marks the reminder as sent for the current level without recording email delivery details.
    /// </summary>
    /// <param name="IssuedReminderHeader">Specifies the issued reminder header to update.</param>
    procedure UpdateSentForCurrentLevelWithoutEmail(var IssuedReminderHeader: Record "Issued Reminder Header")
    begin
        if IssuedReminderHeader."Reminder Level" <> IssuedReminderHeader."Email Sent Level" then
            IssuedReminderHeader.ClearSentEmailFieldsOnLevelUpdate(IssuedReminderHeader);

        IssuedReminderHeader."Sent For Current Level" := true;
        IssuedReminderHeader.Modify();
    end;

    /// <summary>
    /// Stores the failed email outbox message ID on the issued reminder header for later retry.
    /// </summary>
    /// <param name="MessageID">Specifies the email outbox entry number of the failed message.</param>
    /// <param name="IssuedReminderNo">Specifies the issued reminder number to update.</param>
    procedure SetFailedOutboxMessageID(MessageID: BigInteger; IssuedReminderNo: Code[20])
    var
        IssuedReminderHeader: Record "Issued Reminder Header";
    begin
        if not IssuedReminderHeader.Get(IssuedReminderNo) then
            exit;

        IssuedReminderHeader."Failed Email Outbox Entry No." := MessageID;
        IssuedReminderHeader.Modify();
    end;

    /// <summary>
    /// Deletes the failed email outbox message linked to the issued reminder if it exists.
    /// </summary>
    /// <param name="IssuedReminderNo">Specifies the issued reminder number whose failed outbox message should be deleted.</param>
    procedure DeleteFailedOutboxMessageIfExists(IssuedReminderNo: Code[20])
    var
        IssuedReminderHeader: Record "Issued Reminder Header";
        EmailOutbox: Record "Email Outbox";
    begin
        if not IssuedReminderHeader.Get(IssuedReminderNo) then
            exit;

        if EmailOutbox.Get(IssuedReminderHeader."Failed Email Outbox Entry No.") then
            EmailOutbox.Delete();

        Clear(IssuedReminderHeader."Failed Email Outbox Entry No.");
        IssuedReminderHeader.Modify();
    end;

    var
        ReminderSentByEmailTxt: Label 'Yes,No';
        MarkAsSentQst: Label 'Was reminder sent by email?';
}