Codeunit 137 OCR Inc. Doc. via Job Queue

App
Base Application
Namespace
Microsoft.EServices.EDocument
Versions
17-28

Procedures, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/eServices/EDocument/OCRIncDocviaJobQueue.Codeunit.al105 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.EServices.EDocument;

using System.Threading;

codeunit 137 "OCR Inc. Doc. via Job Queue"
{
    Permissions = TableData "Job Queue Entry" = rimd;
    TableNo = "Job Queue Entry";

    trigger OnRun()
    var
        IncomingDocument: Record "Incoming Document";
        SendIncomingDocumentToOCR: Codeunit "Send Incoming Document to OCR";
        RecRef: RecordRef;
    begin
        Rec.TestField("Record ID to Process");
        RecRef.Get(Rec."Record ID to Process");
        RecRef.SetTable(IncomingDocument);
        IncomingDocument.Find();
        SetJobQueueStatus(IncomingDocument, IncomingDocument."Job Queue Status"::Processing);

        case IncomingDocument."OCR Status" of
            IncomingDocument."OCR Status"::Ready:
                if not SendIncomingDocumentToOCR.TrySendToOCR(IncomingDocument) then begin
                    SetJobQueueStatus(IncomingDocument, IncomingDocument."Job Queue Status"::Error);
                    Error(GetLastErrorText);
                end;
            IncomingDocument."OCR Status"::Sent, IncomingDocument."OCR Status"::"Awaiting Verification":
                if not (SendIncomingDocumentToOCR.TryRetrieveFromOCR(IncomingDocument) and
                        (IncomingDocument."OCR Status" = IncomingDocument."OCR Status"::Success))
                then begin
                    SetJobQueueStatus(IncomingDocument, IncomingDocument."Job Queue Status"::Processing);
                    Error(GetLastErrorText);
                end;
        end;

        SetJobQueueStatus(IncomingDocument, IncomingDocument."Job Queue Status"::" ");
    end;

    var
        OCRSendReceiveDescriptionTxt: Label 'OCR Incoming Document No. %1.', Comment = '%1 = document type, %2 = document number. Example: Post Purchase Order 1234.';
        IncomingDocumentScheduledMsg: Label 'Incoming Document No. %1 has been scheduled for OCR.', Comment = '%1=document type, %2=number, e.g. Order 123  or Invoice 234.';
        WrongJobQueueStatusErr: Label 'Incoming Document No. %1 cannot be processed because it has already been scheduled for OCR. Choose the Remove from Job Queue action to reset the job queue status and then OCR again.', Comment = '%1 = document type, %2 = document number. Example: Purchase Order 1234 or Invoice 1234.';

    local procedure SetJobQueueStatus(var IncomingDocument: Record "Incoming Document"; NewStatus: Enum "Inc. Doc. Job Queue Status")
    begin
        IncomingDocument.LockTable();
        if IncomingDocument.Find() then begin
            IncomingDocument."Job Queue Status" := NewStatus;
            IncomingDocument.Modify();
            Commit();
        end;
    end;

    procedure EnqueueIncomingDoc(var IncomingDocument: Record "Incoming Document")
    begin
        if not (IncomingDocument."Job Queue Status" in [IncomingDocument."Job Queue Status"::" ", IncomingDocument."Job Queue Status"::Error]) then
            Error(WrongJobQueueStatusErr, IncomingDocument."Entry No.");
        if IncomingDocument.Status = IncomingDocument.Status::New then
            CODEUNIT.Run(CODEUNIT::"Release Incoming Document", IncomingDocument);

        IncomingDocument."Job Queue Status" := IncomingDocument."Job Queue Status"::Scheduled;
        IncomingDocument."Job Queue Entry ID" := EnqueueJobEntry(IncomingDocument);
        IncomingDocument.Modify();
        Message(IncomingDocumentScheduledMsg, IncomingDocument."Entry No.");
    end;

    local procedure EnqueueJobEntry(IncomingDocument: Record "Incoming Document"): Guid
    var
        JobQueueEntry: Record "Job Queue Entry";
    begin
        JobQueueEntry."Object Type to Run" := JobQueueEntry."Object Type to Run"::Codeunit;
        JobQueueEntry."Object ID to Run" := CODEUNIT::"OCR Inc. Doc. via Job Queue";
        JobQueueEntry."Record ID to Process" := IncomingDocument.RecordId;
        // Set Timeout to prevent the Job Queue from hanging (eg. as a result of a printer dialog).
        JobQueueEntry."Maximum No. of Attempts to Run" := 10;
        JobQueueEntry."Rerun Delay (sec.)" := 5;
        JobQueueEntry.Description :=
          CopyStr(StrSubstNo(OCRSendReceiveDescriptionTxt, IncomingDocument."Entry No."), 1, MaxStrLen(JobQueueEntry.Description));
        JobQueueEntry."Notify On Success" := true;
        CODEUNIT.Run(CODEUNIT::"Job Queue - Enqueue", JobQueueEntry);
        exit(JobQueueEntry.ID);
    end;

    procedure CancelQueueEntry(var IncomingDocument: Record "Incoming Document")
    var
        JobQueueEntry: Record "Job Queue Entry";
    begin
        if IncomingDocument."Job Queue Status" = IncomingDocument."Job Queue Status"::" " then
            exit;
        if not IsNullGuid(IncomingDocument."Job Queue Entry ID") then
            JobQueueEntry.SetRange(ID, IncomingDocument."Job Queue Entry ID");
        JobQueueEntry.SetRange("Record ID to Process", IncomingDocument.RecordId);
        if not JobQueueEntry.IsEmpty() then
            JobQueueEntry.DeleteAll(true);
        IncomingDocument."Job Queue Status" := IncomingDocument."Job Queue Status"::" ";
        IncomingDocument.Modify();
    end;
}