Document Approval Via Email

navuser1navuser1 Member Posts: 1,318
edited 2019-06-11 in NAV Three Tier
Dear Sir,

The approval system is configured in the NAV 2016 Database with Email Notification. The Email Notification carries Document Details. And now I want to add two Action buttons one for Approve & another for Reject in Email body. So that approver can take decision & update the Navision Data from there.

If the Approver wants to reject the document he will click Reject button or if he/she wants to approve then click the Approve button. These two buttons will serve the purpose without login the NAV System.

How to do?
Now or Never


  • TallyHoTallyHo Member Posts: 368
    edited 2019-06-11
    If you are looking for a way to let users, that are not valid NAV users, use NAV you can disregard what I'm going to write. I do not know how to do that. A browser session will open, i do not know how to prevent that. But below is just a ruff idea of what I think is possible, there are probably many other options:

    Supposing the user is using an email client in a windows environment, why not publish a page in the webservices section of NAV. The page is based on a table that has 3 fields:

    1 Primary Key (int)
    2 ApprovalEntryNo (int)
    3 ApproveReject (bln)

    Put field 2 and 3 in the page.
    Adjust NAV at the point where the email is created. Use C/AL to add 2 links in the email. You can use HTML encoding to show the words APPROVE and REJECT instead of the entire link.

    Approval link: IS 123456 AND ApproveReject IS TRUE

    Rejection link: IS 123456 AND ApproveReject IS FALSE

    Create code in you page using


    to retreive the values you are looking for to handle the approval/disapproval. Handle the approval/disaproval from there.

  • rom2018rom2018 Member Posts: 7

    1. Set\registrtion technical e-mail: [email protected] ([email protected])
    2. Set 2 tags in e-mail body
    <span class=MsoHyperlink><a href="mailto:%BM1000?subject=APPROVE&body=entryno~%BM1010~guid~%BM1020~action~1~">Approve</a></span> <br>
    <span class=MsoHyperlink><a href="mailto:%BM1001?subject=REJECT&body=entryno~%BM1011~guid~%BM1021~action~0~">Reject</a></span> <br>

    %BM - technical bookmark for set data
    3. in %BM1021 set [email protected]

    After push Approve\Reject in body E-Mail, send mail with different subject, on inbox [email protected]

    4. Set Job on NAS scheduler with run newMyMailCU.
    newMyMailCU get all mails from inbox (its own email, see st.1) [email protected]
    5. Parse mail Subject by Action 0\1 and,
    run Approval\Reject Action in standard "workflow entry" where guid in email = guid in "approval entry"

    Sample all text body:

    <body lang=ENU link=blue vlink=purple style='tab-interval:35.4pt'>
    approve next order
    <span class=MsoHyperlink><a href="%BM1001">%BM1000</a></span> <br>
    <span class=MsoHyperlink><a href="mailto:%BM1021?subject=APPROVE&body=entryno~%BM1022~guid~%BM1023~action~1~">Approve</a></span> <br>
    <span class=MsoHyperlink><a href="mailto:%BM1031?subject=REJECT&body=entryno~%BM1032~guid~%BM1033~action~0~">Reject</a></span> <br>
  • navuser1navuser1 Member Posts: 1,318
    edited 2019-06-11
    @TallyHo, @rom2018
    Thanks for your replies.

    The Approver must have a valid USERID in the Navision & as well as in the User Setup Master Table.

    The same business logic should be executed while making any decision from the Email Notification (Approve/Reject) as normal. -- This is the requirement.

    [ If any reason, the Approver does not belong to the Navision User family then I will pass a valid Nav user (hardcoded) through the Action button ]--- Please do not focus on this point now.

    Now or Never
  • rom2018rom2018 Member Posts: 7
    We need to strive for new technologies, but...
    I used my method in Nav 4..Nav18,
    when the boss in another country, with any mail reader. This worked even when the Nav was offline at the time of approval:

    My custom table 50000 EmailItemOut, and codeunit 50000 ApprovalDispatcher
    Name DataType Subtype Length
    ApprovalMgt Codeunit Approvals Mgmt.

    OnRun(VAR Rec : Record "Approval Entry")
    ApprovalEntry := Rec;
    CASE EmailItemOut."Action Type" OF
    EmailItemOut."Action Type"::Approve : ApprovalMgt.ApproveApprovalRequest(ApprovalEntry); //core Approve
    EmailItemOut."Action Type"::Reject : ApprovalMgt.RejectApprovalRequest(ApprovalEntry); //core Reject
    Rec := ApprovalEntry;

    Name DataType Subtype Length
    ApprovalMgt Codeunit Approvals Mgmt.

    SetEmailOut(VAR pEmailItemOut : Record "Email Item Out")
    EmailItemOut := pEmailItemOut;

    ReadInEmail and run action in "subject" and guid ApprovalEntry

    LOCAL RunApprovalDispatcher()
    ApprovDispL.SetEmailOut(OutMail); //cu50000
    IF NOT ApprovDispL.RUN(ApprovalEntry) THEN BEGIN
    "Error Code" := 01; //core ApprovalMgt on run action
    "Error Text" := COPYSTR(GETLASTERRORTEXT,1,MAXSTRLEN("Error Text"));
Sign In or Register to comment.