Document Approval in Nav2009 IN

navuser1navuser1 Member Posts: 1,329
Hi all,

I’m working on Document Approval in NAV2009 (Local DB). I have finished the Document Approval Setup for the Purchase Order. And then create a Purchase Order and click the Function menu Send Approval Request. It gives the msg window as …




I have searched the Table Approval Entry (ID 454) but I have found no records though system gives the above msg.

If I'm wrong then please currect me!

After the Code review I have found that if the PO is created without Purchaser Code than the Document approval system will give the above msg without creating any actual entry.

Kindly reply.
Now or Never

Comments

  • navuser1navuser1 Member Posts: 1,329
    can u show ur approval user setup

    Hi Mohana,

    Thanks for your quick reply. I have solved this issue by changing value of the field Approval type from Sales Pers./Purchaser to Approver in the Approval Templates form (ID 668).

    Though I think Document Approval system should not give the msg



    when it does not create any entry.


    Comment please.
    Now or Never
  • mohana_cse06mohana_cse06 Member Posts: 5,504
    i got entries even if i have Approval type = Sales Pers./Purchaser
  • navuser1navuser1 Member Posts: 1,329
    i got entries even if i have Approval type = Sales Pers./Purchaser

    fine :mrgreen:

    see the function named FindApproverPurchase of function named SendPurchaseApprovalRequest in codeunit 439.
    FindApproverPurchase(PurchaseHeader : Record "Purchase Header";ApprovalSetup : Record "Approval Setup";AppTemplate : Record "Approval T
    AddApproversTemp.RESET;
    AddApproversTemp.DELETEALL;
    
    CalcPurchaseDocAmount(PurchaseHeader,ApprovalAmount,ApprovalAmountLCY);
    
    CASE AppTemplate."Approval Type" OF
     =>AppTemplate."Approval Type"::"Sales Pers./Purchaser": BEGIN
        => IF PurchaseHeader."Purchaser Code" <> '' THEN BEGIN 
            CASE AppTemplate."Limit Type" OF
              AppTemplate."Limit Type"::"Approval Limits": BEGIN
                  UserSetup.SETCURRENTKEY("Salespers./Purch. Code");
                  UserSetup.SETRANGE("Salespers./Purch. Code",PurchaseHeader."Purchaser Code");
                  IF NOT UserSetup.FIND('-') THEN
                    ERROR(Text008,UserSetup."User ID",UserSetup.FIELDCAPTION("Salespers./Purch. Code"),
                      UserSetup."Salespers./Purch. Code")
                  ELSE BEGIN
                    ApproverId := UserSetup."User ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",PurchaseHeader."Purchaser Code",
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
                    ApproverId := UserSetup."Approver ID";
                    IF NOT UserSetup."Unlimited Purchase Approval" AND
                       ((ApprovalAmountLCY > UserSetup."Purchase Amount Approval Limit") OR
                       (UserSetup."Purchase Amount Approval Limit" = 0))
                    THEN BEGIN
                      UserSetup.RESET;
                      UserSetup.SETCURRENTKEY("User ID");
                      UserSetup.SETRANGE("User ID",ApproverId);
                      REPEAT
                        IF NOT UserSetup.FIND('-') THEN
                          ERROR(Text006,ApproverId);
                        ApproverId := UserSetup."User ID";
                        MakeApprovalEntry(
                          DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                          ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                          PurchaseHeader."Currency Code",AppTemplate,0);
                        UserSetup.SETRANGE("User ID",UserSetup."Approver ID");
                      UNTIL UserSetup."Unlimited Purchase Approval" OR
                            ((ApprovalAmountLCY <= UserSetup."Purchase Amount Approval Limit") AND
                            (UserSetup."Purchase Amount Approval Limit" <> 0))OR
                            (UserSetup."User ID" = UserSetup."Approver ID")
                    END;
                  END;
    
                  CheckAddApprovers(AppTemplate);
                  IF AddApproversTemp.FIND('-') THEN REPEAT
                      ApproverId := AddApproversTemp."Approver ID";
                      MakeApprovalEntry(
                        DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                        ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                        PurchaseHeader."Currency Code",AppTemplate,0);
                    UNTIL AddApproversTemp.NEXT = 0;
                END;
    
              AppTemplate."Limit Type"::"Request Limits": BEGIN
                  IF PurchaseHeader."Document Type" <> PurchaseHeader."Document Type"::Quote THEN
                    ERROR(STRSUBSTNO(Text026,FORMAT(AppTemplate."Limit Type"),FORMAT(PurchaseHeader."Document Type"::Quote)))
                  ELSE BEGIN
                    UserSetup.SETCURRENTKEY("Salespers./Purch. Code");
                    UserSetup.SETRANGE("Salespers./Purch. Code",PurchaseHeader."Purchaser Code");
                    IF NOT UserSetup.FIND('-') THEN
                      ERROR(Text008,UserSetup."User ID",UserSetup.FIELDCAPTION("Salespers./Purch. Code"),
                        UserSetup."Salespers./Purch. Code");
                    UserSetup.RESET;
                    UserSetup.SETRANGE("User ID",USERID);
                    IF NOT UserSetup.FIND('-') THEN
                      ERROR(Text005,USERID);
                    ApproverId := UserSetup."User ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
    
                    IF NOT UserSetup."Unlimited Request Approval" AND
                       ((ApprovalAmountLCY > UserSetup."Request Amount Approval Limit") OR
                        (UserSetup."Request Amount Approval Limit" = 0))
                    THEN
                      REPEAT
                        UserSetup.SETRANGE("User ID",UserSetup."Approver ID");
                        IF NOT UserSetup.FIND('-') THEN
                          ERROR(Text005,USERID);
                        ApproverId := UserSetup."User ID";
                        MakeApprovalEntry(
                          DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                          ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                          PurchaseHeader."Currency Code",AppTemplate,0);
                      UNTIL UserSetup."Unlimited Request Approval" OR
                            ((ApprovalAmountLCY <= UserSetup."Request Amount Approval Limit") AND
                             (UserSetup."Request Amount Approval Limit" <> 0)) OR
                            (UserSetup."User ID" = UserSetup."Approver ID");
    
                    CheckAddApprovers(AppTemplate);
                    IF AddApproversTemp.FIND('-') THEN REPEAT
                        ApproverId := AddApproversTemp."Approver ID";
                        MakeApprovalEntry(
                          DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                          ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                          PurchaseHeader."Currency Code",AppTemplate,0);
                      UNTIL AddApproversTemp.NEXT = 0;
                  END;
                END;
    
              AppTemplate."Limit Type"::"No Limits": BEGIN
                  UserSetup.SETCURRENTKEY("Salespers./Purch. Code");
                  UserSetup.SETRANGE("Salespers./Purch. Code",PurchaseHeader."Purchaser Code");
                  IF NOT UserSetup.FIND('-') THEN
                    ERROR(Text008,UserSetup."User ID",UserSetup.FIELDCAPTION("Salespers./Purch. Code"),
                      UserSetup."Salespers./Purch. Code")
                  ELSE BEGIN
                    ApproverId := UserSetup."User ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",PurchaseHeader."Purchaser Code",
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
    
                    CheckAddApprovers(AppTemplate);
                    IF AddApproversTemp.FIND('-') THEN REPEAT
                        ApproverId := AddApproversTemp."Approver ID";
                        MakeApprovalEntry(
                          DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                          ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                          PurchaseHeader."Currency Code",AppTemplate,0);
                      UNTIL AddApproversTemp.NEXT = 0;
                  END;
                END;
            END;
          END;
        END;
    
      AppTemplate."Approval Type"::Approver: BEGIN
          UserSetup.SETRANGE("User ID",USERID);
          IF NOT UserSetup.FIND('-') THEN
            ERROR(Text005,USERID);
    
          CASE AppTemplate."Limit Type" OF
            AppTemplate."Limit Type"::"Approval Limits": BEGIN
                ApproverId := UserSetup."User ID";
                MakeApprovalEntry(
                  DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                  ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                  PurchaseHeader."Currency Code",AppTemplate,0);
                IF NOT UserSetup."Unlimited Purchase Approval" AND
                   ((ApprovalAmountLCY > UserSetup."Purchase Amount Approval Limit") OR
                   (UserSetup."Purchase Amount Approval Limit" = 0))
                THEN
                  REPEAT
                    UserSetup.SETRANGE("User ID",UserSetup."Approver ID");
                    IF NOT UserSetup.FIND('-') THEN
                      ERROR(Text005,USERID);
                    ApproverId := UserSetup."User ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
                  UNTIL UserSetup."Unlimited Purchase Approval" OR
                        ((ApprovalAmountLCY <= UserSetup."Purchase Amount Approval Limit") AND
                        (UserSetup."Purchase Amount Approval Limit" <> 0)) OR
                        (UserSetup."User ID" = UserSetup."Approver ID");
    
                CheckAddApprovers(AppTemplate);
                IF AddApproversTemp.FIND('-') THEN REPEAT
                    ApproverId := AddApproversTemp."Approver ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
                  UNTIL AddApproversTemp.NEXT = 0;
              END;
    
            AppTemplate."Limit Type"::"Request Limits": BEGIN
                IF PurchaseHeader."Document Type" <> PurchaseHeader."Document Type"::Quote THEN
                  ERROR(STRSUBSTNO(Text026,FORMAT(AppTemplate."Limit Type"),FORMAT(PurchaseHeader."Document Type"::Quote)))
                ELSE BEGIN
                  UserSetup.SETRANGE("User ID",USERID);
                  IF NOT UserSetup.FIND('-') THEN
                    ERROR(Text005,USERID);
                  ApproverId := UserSetup."User ID";
                  MakeApprovalEntry(
                    DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                    ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                    PurchaseHeader."Currency Code",AppTemplate,0);
                  IF NOT UserSetup."Unlimited Request Approval" AND
                     ((ApprovalAmountLCY > UserSetup."Request Amount Approval Limit") OR
                      (UserSetup."Request Amount Approval Limit" = 0))
                  THEN
                    REPEAT
                      UserSetup.SETRANGE("User ID",UserSetup."Approver ID");
                      IF NOT UserSetup.FIND('-') THEN
                        ERROR(Text005,USERID);
                      ApproverId := UserSetup."User ID";
                      MakeApprovalEntry(
                        DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                        ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                        PurchaseHeader."Currency Code",AppTemplate,0);
                    UNTIL UserSetup."Unlimited Request Approval" OR
                          ((ApprovalAmountLCY <= UserSetup."Request Amount Approval Limit") AND
                           (UserSetup."Request Amount Approval Limit" <> 0)) OR
                          (UserSetup."User ID" = UserSetup."Approver ID");
                END;
    
                CheckAddApprovers(AppTemplate);
                IF AddApproversTemp.FIND('-') THEN REPEAT
                    ApproverId := AddApproversTemp."Approver ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
                  UNTIL AddApproversTemp.NEXT = 0;
              END;
    
            AppTemplate."Limit Type"::"No Limits": BEGIN
                ApproverId := UserSetup."Approver ID";
                IF ApproverId = '' THEN
                  ApproverId := UserSetup."User ID";
                MakeApprovalEntry(
                  DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",PurchaseHeader."Purchaser Code",
                  ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                  PurchaseHeader."Currency Code",AppTemplate,0);
    
                CheckAddApprovers(AppTemplate);
                IF AddApproversTemp.FIND('-') THEN REPEAT
                    ApproverId := AddApproversTemp."Approver ID";
                    MakeApprovalEntry(
                      DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                      ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                      PurchaseHeader."Currency Code",AppTemplate,0);
                  UNTIL AddApproversTemp.NEXT = 0;
              END;
          END;
        END;
    
      AppTemplate."Approval Type"::" ": BEGIN
          CheckAddApprovers(AppTemplate);
          IF AddApproversTemp.FIND('-') THEN
            REPEAT
              ApproverId := AddApproversTemp."Approver ID";
              MakeApprovalEntry(
                DATABASE::"Purchase Header",PurchaseHeader."Document Type",PurchaseHeader."No.",'',
                ApprovalSetup,ApproverId,AppTemplate."Approval Code",UserSetup,ApprovalAmount,ApprovalAmountLCY,
                PurchaseHeader."Currency Code",AppTemplate,0);
            UNTIL AddApproversTemp.NEXT = 0
          ELSE
            ERROR(Text027);
        END;
    END;
    
    EntryApproved := FALSE;
    DocReleased := FALSE;
    WITH ApprovalEntry DO BEGIN
      INIT;
      SETRANGE("Table ID",DATABASE::"Purchase Header");
      SETRANGE("Document Type",PurchaseHeader."Document Type");
      SETRANGE("Document No.",PurchaseHeader."No.");
      SETRANGE(Status,Status::Created);
      IF FINDSET(TRUE,FALSE) THEN
        REPEAT
          IF "Sender ID" = "Approver ID" THEN BEGIN
            Status := Status::Approved;
            MODIFY;
          END ELSE
            IF NOT IsOpenStatusSet THEN BEGIN
              Status := Status::Open;
              MODIFY;
              IsOpenStatusSet := TRUE;
              IF ApprovalSetup.Approvals THEN
                ApprovalMgtNotification.SendPurchaseApprovalsMail(PurchaseHeader,ApprovalEntry);
            END;
        UNTIL NEXT = 0;
      SETFILTER(Status,'=%1|%2|%3',Status::Approved,Status::Created,Status::Open);
      IF FIND('-') THEN
        REPEAT
          IF Status = Status::Approved THEN
            EntryApproved := TRUE
          ELSE
            EntryApproved := FALSE;
        UNTIL NEXT = 0;
      IF EntryApproved THEN
        DocReleased := ApproveApprovalRequest(ApprovalEntry);
      DispMessage := FALSE;
      IF NOT DocReleased THEN BEGIN
        PurchaseHeader.Status := PurchaseHeader.Status::"Pending Approval";
        PurchaseHeader.MODIFY(TRUE);
        DispMessage := TRUE;
      END;
      IF DocReleased THEN
        IF TestPurchasePrepayment(PurchaseHeader) AND
           (PurchaseHeader."Document Type" = PurchaseHeader."Document Type"::Order) THEN BEGIN
          PurchaseHeader.Status := PurchaseHeader.Status::"Pending Prepayment";
          PurchaseHeader.MODIFY(TRUE);
          MESSAGE(Text128,PurchaseHeader."Document Type",PurchaseHeader."No.");
        END ELSE BEGIN
          MESSAGE(Text003,PurchaseHeader."Document Type",PurchaseHeader."No.");
        END;
      EXIT(TRUE);
    END;
    

    If this function unable to Make Approval Entry (by MakeApprovalEntry) though the function SendPurchaseApprovalRequest will give the msg as




    This is not correct.
    Now or Never
  • navuser1navuser1 Member Posts: 1,329
    i got entries even if i have Approval type = Sales Pers./Purchaser

    Create a PO without Purchaser Code and then try. :-$
    Now or Never
  • navuser1navuser1 Member Posts: 1,329
    am getting following error

    this error does not create any sense. When you try to create a Approval Entry it gives there is no entry with the filter.....
    8)
    Now or Never
Sign In or Register to comment.