0% found this document useful (0 votes)
97 views8 pages

Approval WFPosted Purch Invoice

This document contains code for setting up a workflow in Microsoft Dynamics 365 Business Central for approving purchase invoices. It includes codeunits that insert a workflow template for invoice approval, handle workflow events when an invoice is sent for approval or the approval is canceled, and handle workflow responses like setting the invoice status to pending approval. The codeunits work together to integrate the invoice approval process with Dynamics 365 Business Central's workflow functionality.

Uploaded by

Meddah Mehdi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
97 views8 pages

Approval WFPosted Purch Invoice

This document contains code for setting up a workflow in Microsoft Dynamics 365 Business Central for approving purchase invoices. It includes codeunits that insert a workflow template for invoice approval, handle workflow events when an invoice is sent for approval or the approval is canceled, and handle workflow responses like setting the invoice status to pending approval. The codeunits work together to integrate the invoice approval process with Dynamics 365 Business Central's workflow functionality.

Uploaded by

Meddah Mehdi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 8

OBJECT Codeunit 60011 Workflow Setup Ext

{
OBJECT-PROPERTIES
{
Date=14-04-20;
Time=15:12:15;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
InsertInvoiceApprovalWorkflowTemplate;
END;

}
CODE
{
VAR
WorkflowManagement@1000000000 : Codeunit 1501;
WorkflowEventHandlingExt@1000000001 : Codeunit 60012;
NoWorkflowEnabledErr@1000000002 : TextConst 'ENU=No Approval workflow for
this record type is enabled.';
WorkflowSetup@1000000003 : Codeunit 1502;
InvoiceWorkflowCategoryTxt@1000000004 : TextConst
'@@@={Locked};ENU=POSTEDPURCHDOC;FRB=POSTEDPURCHDOC;NLB=POSTEDPURCHDOC';
InvoiceWorkflowCategoryDescText@1000000005 : TextConst 'FRB=Flux de travail
facture achat;NLB=Inkoopfactuurwerkstroom';
InvoiceApprWorkflowDescText@1000000006 : TextConst 'ENU=Posted Purchase
Invoice Workflow;FRB=Flux de travail facture achat enregistr‚e;NLB=Geboekte
Inkoopfactuurwerkstroom';
InvoiceAppWorkflowCodeTXT@1000000008 : TextConst
'@@@={Locked};ENU=PPIW;FRB=PPIW;NLB=PPIW';
InvoiceTypeCondnText@1000000007 : TextConst '@@@={Locked};ENU="<?xml
version=""1.0"" encoding=""utf-8"" standalone=""yes""?
><ReportParameters><DataItems><DataItem name=""Purch. Inv. Header"">
%1</DataItem><DataItem name=""Purch. Inv. Line"">
%2</DataItem></DataItems></ReportParameters>";FRB="<?xml version=""1.0""
encoding=""utf-8"" standalone=""yes""?><ReportParameters><DataItems><DataItem
name=""Purch. Inv. Header"">%1</DataItem><DataItem name=""Purch. Inv. Line"">
%2</DataItem></DataItems></ReportParameters>";NLB="<?xml version=""1.0""
encoding=""utf-8"" standalone=""yes""?><ReportParameters><DataItems><DataItem
name=""Purch. Inv. Header"">%1</DataItem><DataItem name=""Purch. Inv. Line"">
%2</DataItem></DataItems></ReportParameters>"';

[EventSubscriber(Codeunit,1502,OnAddWorkflowCategoriesToLibrary)]
LOCAL PROCEDURE OnAddWorkflowCategoriesToLibrary@1000000000();
BEGIN
WorkflowSetup.InsertWorkflowCategory(InvoiceWorkflowCategoryTxt,
InvoiceWorkflowCategoryDescText);
END;

[EventSubscriber(Codeunit,1502,OnAfterInsertApprovalsTableRelations)]
LOCAL PROCEDURE OnAfterInsertApprovalTableRelations@1000000001();
VAR
ApprovalEntry@1000000000 : Record 454;
BEGIN
WorkflowSetup.InsertTableRelation(DATABASE::"Purch. Inv. Header", 0,
DATABASE::"Approval Entry", ApprovalEntry.FIELDNO("Record ID to Approve"));
END;

[EventSubscriber(Codeunit,1502,OnInsertWorkflowTemplates)]
LOCAL PROCEDURE OnInsertWorkflowTemplates@1000000002(VAR Sender@1000000000 :
Codeunit 1502);
BEGIN
InsertInvoiceApprovalWorkflowTemplate();
END;

LOCAL PROCEDURE InsertInvoiceApprovalWorkflowTemplate@1000000003();


VAR
Workflow@1000000000 : Record 1501;
BEGIN
WorkflowSetup.InsertWorkflowTemplate(Workflow, InvoiceAppWorkflowCodeTXT,
InvoiceApprWorkflowDescText, InvoiceWorkflowCategoryTxt);
InsertInvoiceApprovalWorkflowDetails(Workflow);
WorkflowSetup.MarkWorkflowAsTemplate(Workflow);
END;

LOCAL PROCEDURE InsertInvoiceApprovalWorkflowDetails@1000000004(VAR


Workflow@1000000000 : Record 1501);
VAR
WorkflowStepArgument@1000000001 : Record 1523;
BlankDateFormula@1000000002 : DateFormula;
WorkflowEventHandlingExt@1000000003 : Codeunit 60012;
WorkflowResponseHandling@1000000004 : Codeunit 1521;
PurchInvHeader@1000000006 : Record 122;
BEGIN
WorkflowSetup.PopulateWorkflowStepArgument(WorkflowStepArgument,
WorkflowStepArgument."Approver Type"::Approver,
WorkflowStepArgument."Approver Limit Type"::"Direct Approver",
0, '', BlankDateFormula, TRUE);

WorkflowSetup.InsertDocApprovalWorkflowSteps(
Workflow,
BuildInvoiceTypeConditions(PurchInvHeader.Status::Open),
WorkflowEventHandlingExt.RunWorkflowOnSendInvoiceForApprovalCode,
BuildInvoiceTypeConditions(PurchInvHeader.Status::"Pending Approval"),
WorkflowEventHandlingExt.RunWorkflowOnCancelInvoiceApprovalCode,
WorkflowStepArgument,
TRUE);
END;

LOCAL PROCEDURE BuildInvoiceTypeConditions@1000000005(Status@1000000000 :


Integer) : Text;
VAR
PurchInvHeader@1000000001 : Record 122;
BEGIN
PurchInvHeader.SETRANGE(Status, Status);
EXIT(STRSUBSTNO(InvoiceTypeCondnText,
WorkflowSetup.Encode(PurchInvHeader.GETVIEW(FALSE))));
END;

BEGIN
END.
}
}

OBJECT Codeunit 60012 Workflow Event Handling Ext


{
OBJECT-PROPERTIES
{
Date=14-04-20;
Time=13:50:16;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
END;

}
CODE
{
VAR
WorkflowManagement@1000000000 : Codeunit 1501;
WorkflowEventHandling@1000000001 : Codeunit 1520;
InvoiceSendForApprovalEventDescTxt@1000000002 : TextConst 'ENU=Approval of an
Invoice document is requested';
InvoiceApprovalRequestCancelEventDescTxt@1000000003 : TextConst 'ENU=Approval
of an Invoice document is canceled';

PROCEDURE RunWorkflowOnSendInvoiceForApprovalCode@1000000001() : Code[128];


BEGIN
EXIT(UPPERCASE('RunWorkflowOnSendInvoiceForApproval'));
END;

[EventSubscriber(Codeunit,60014,OnSendInvoiceForApproval)]
PROCEDURE RunWorkflowOnSendInvoiceForApproval@1000000000(VAR
PurchInvHeader@1000000001 : Record 122);
BEGIN
WorkflowManagement.HandleEvent(RunWorkflowOnSendInvoiceForApprovalCode,
PurchInvHeader);
END;

PROCEDURE RunWorkflowOnCancelInvoiceApprovalCode@1000000002() : Code[128];


BEGIN
EXIT(UPPERCASE('RunWorkflowOnCancelInvoiceApproval'));
END;

[EventSubscriber(Codeunit,60014,OnCancelInvoiceForApproval)]
LOCAL PROCEDURE RunWorkflowOnCancelInvoiceApproval@1000000004(VAR
PurchInvHeader@1000000001 : Record 122);
BEGIN
WorkflowManagement.HandleEvent(RunWorkflowOnCancelInvoiceApprovalCode,
PurchInvHeader);
END;

[EventSubscriber(Codeunit,1520,OnAddWorkflowEventsToLibrary)]
LOCAL PROCEDURE OnAddWorkflowEventsToLibrary@1000000003();
BEGIN

WorkflowEventHandling.AddEventToLibrary(RunWorkflowOnSendInvoiceForApprovalCode,
DATABASE::"Purch. Inv. Header", InvoiceSendForApprovalEventDescTxt, 0, FALSE);

WorkflowEventHandling.AddEventToLibrary(RunWorkflowOnCancelInvoiceApprovalCode,
DATABASE::"Purch. Inv. Header", InvoiceApprovalRequestCancelEventDescTxt, 0,
FALSE);
END;

[EventSubscriber(Codeunit,1520,OnAddWorkflowEventPredecessorsToLibrary)]
LOCAL PROCEDURE
OnAddWorkflowEventPredecessorsToLibrary@1000000005(EventFunctionName@1000000000 :
Code[128]);
BEGIN
CASE EventFunctionName OF
RunWorkflowOnCancelInvoiceApprovalCode:

WorkflowEventHandling.AddEventPredecessor(RunWorkflowOnCancelInvoiceApprovalCode,
RunWorkflowOnSendInvoiceForApprovalCode);
WorkflowEventHandling.RunWorkflowOnApproveApprovalRequestCode:

WorkflowEventHandling.AddEventPredecessor(WorkflowEventHandling.RunWorkflowOnApprov
eApprovalRequestCode, RunWorkflowOnSendInvoiceForApprovalCode);
END;
END;

BEGIN
END.
}
}

OBJECT Codeunit 60013 Workflow Response Handling Ext


{
OBJECT-PROPERTIES
{
Date=14-04-20;
Time=13:40:46;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
END;

}
CODE
{

[EventSubscriber(Codeunit,1521,OnOpenDocument)]
LOCAL PROCEDURE OnOpenDocument@1000000000(RecRef@1000000000 : RecordRef;VAR
Handled@1000000001 : Boolean);
VAR
PurchInvHeader@1000000003 : Record 122;
BEGIN
CASE RecRef.NUMBER OF
{
DATABASE::"Sales Invoice Header" :
BEGIN
RecRef.SETTABLE(SalesInvoiceHeader);
SalesInvoiceHeader.Status := SalesInvoiceHeader.Status::Released;
SalesInvoiceHeader.MODIFY;
Handled := TRUE;
END;
}
DATABASE::"Purch. Inv. Header" :
BEGIN
RecRef.SETTABLE(PurchInvHeader);
PurchInvHeader.Status := PurchInvHeader.Status::Released;
PurchInvHeader.MODIFY;
Handled := TRUE;
END;

END;
END;

[EventSubscriber(Codeunit,1535,OnSetStatusToPendingApproval)]
LOCAL PROCEDURE OnSetStatusToPendingApproval@1000000001(RecRef@1000000000 :
RecordRef;VAR Variant@1000000001 : Variant;VAR IsHandled@1000000002 : Boolean);
VAR
PurchInvHeader@1000000004 : Record 122;
BEGIN
CASE RecRef.NUMBER OF
DATABASE::"Purch. Inv. Header" :
BEGIN
RecRef.SETTABLE(PurchInvHeader);
PurchInvHeader.Status := PurchInvHeader.Status::"Pending Approval";
PurchInvHeader.MODIFY;
IsHandled := TRUE;
END;
END;
END;

[EventSubscriber(Codeunit,1521,OnAddWorkflowResponsePredecessorsToLibrary)]
LOCAL PROCEDURE
OnAddWorkflowResponsePredecessorToLibrary@1000000005(ResponseFunctionName@100000000
0 : Code[128]);
VAR
WorkflowResponseHandling@1000000001 : Codeunit 1521;
WorkflowEventHandlingExt@1000000002 : Codeunit 60012;
BEGIN
CASE ResponseFunctionName OF
WorkflowResponseHandling.SetStatusToPendingApprovalCode:

WorkflowResponseHandling.AddResponsePredecessor(WorkflowResponseHandling.SetStatusT
oPendingApprovalCode,
WorkflowEventHandlingExt.RunWorkflowOnSendInvoiceForApprovalCode);
WorkflowResponseHandling.SendApprovalRequestForApprovalCode:

WorkflowResponseHandling.AddResponsePredecessor(WorkflowResponseHandling.SendApprov
alRequestForApprovalCode,
WorkflowEventHandlingExt.RunWorkflowOnSendInvoiceForApprovalCode);
WorkflowResponseHandling.CancelAllApprovalRequestsCode:

WorkflowResponseHandling.AddResponsePredecessor(WorkflowResponseHandling.CancelAllA
pprovalRequestsCode,
WorkflowEventHandlingExt.RunWorkflowOnCancelInvoiceApprovalCode);
WorkflowResponseHandling.OpenDocumentCode:

WorkflowResponseHandling.AddResponsePredecessor(WorkflowResponseHandling.OpenDocume
ntCode,
WorkflowEventHandlingExt.RunWorkflowOnCancelInvoiceApprovalCode);
END;
END;
BEGIN
END.
}
}

OBJECT Codeunit 60014 Approval Mgt Ext


{
OBJECT-PROPERTIES
{
Date=14-04-20;
Time=13:43:39;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
END;

}
CODE
{
VAR
WorkflowManagement@1000000000 : Codeunit 1501;
WorkflowEventHandlingExt@1000000001 : Codeunit 60012;
NoWorkflowEnabledErr@1000000002 : TextConst 'ENU=No Approval workflow for
this record type is enabled.';

[Integration]
PROCEDURE OnSendInvoiceForApproval@1000000000(VAR PurchInvHeader@1000000001 :
Record 122);
BEGIN
END;

[Integration]
PROCEDURE OnCancelInvoiceForApproval@1000000001(VAR PurchInvHeader@1000000001 :
Record 122);
BEGIN
END;

PROCEDURE CheckClaimApprovalsWorkflowEnable@1000000002(VAR
PurchInvHeader@1000000001 : Record 122) : Boolean;
BEGIN
IF NOT IsInvoiceDocApprovalsWorkflowEnable(PurchInvHeader) THEN
ERROR(NoWorkflowEnabledErr);
EXIT(TRUE);
END;

PROCEDURE IsInvoiceDocApprovalsWorkflowEnable@1000000003(VAR
PurchInvHeader@1000000001 : Record 122) : Boolean;
BEGIN
IF PurchInvHeader.Status <> PurchInvHeader.Status::Open THEN
EXIT(FALSE);
EXIT(WorkflowManagement.CanExecuteWorkflow(PurchInvHeader,
WorkflowEventHandlingExt.RunWorkflowOnSendInvoiceForApprovalCode));
END;

[EventSubscriber(Codeunit,1535,OnPopulateApprovalEntryArgument)]
LOCAL PROCEDURE OnPopulateApprovalEntryArgument@1000000005(VAR
RecRef@1000000000 : RecordRef;VAR ApprovalEntryArgument@1000000001 : Record
454;WorkflowStepInstance@1000000002 : Record 1504);
VAR
PurchInvHeader@1000000004 : Record 122;
BEGIN
CASE RecRef.NUMBER OF
DATABASE::"Purch. Inv. Header":
BEGIN
RecRef.SETTABLE(PurchInvHeader);
ApprovalEntryArgument."Document No." := PurchInvHeader."No.";
END;
END;
END;

BEGIN
END.
}
}

OBJECT Codeunit 60015 Page Management Ext


{
OBJECT-PROPERTIES
{
Date=14-04-20;
Time=13:43:59;
Modified=Yes;
Version List=;
}
PROPERTIES
{
OnRun=BEGIN
END;

}
CODE
{

[EventSubscriber(Codeunit,700,OnAfterGetPageID)]
LOCAL PROCEDURE OnAfterGetPageID@1000000000(RecordRef@1000000000 :
RecordRef;VAR PageID@1000000001 : Integer);
BEGIN
IF PageID = 0 THEN
PageID := GetConditionalCardPageID(RecordRef);
END;

LOCAL PROCEDURE GetConditionalCardPageID@1000000001(RecordRef@1000000000 :


RecordRef) : Integer;
BEGIN
CASE RecordRef.NUMBER OF
DATABASE::"Purch. Inv. Header":
EXIT(PAGE::"Posted Purchase Invoice");
END;
END;

BEGIN
END.
}
}

You might also like