Proposal For Custom Transaction Approval Process

Proposal Summary 

The proposed solution aims the approval process for the transactions using the custom page. This customization will enable the system for the transaction approval process. 

Requirement 

Growire wants the custom transaction approval process for Vendor Bills, Purchase Orders, Expense Requests/Reports, and Credit Notes. Assign approvers based on Class, Department, Project, Subsidairy and Internal Order. Auto-fill “Approved Amount” from “Amount to Approve. Enable partial approvals and handle rejected transactions with restart option. 

Deliverable 

This proposal aims to improve the approval process for Vendor Bills, Purchase Orders, and Expense Requests/Reports in our system through customization. The primary objective is to streamline the approval process and fetch approver details from custom record setup efficiently. 

The proposed solution involves the following steps: 

This customization applies to Vendor Bills, Purchase Orders and Expense Requests/Reports. 

We will restrict the transactions by following the below actions untill the approval process completed : 

  • Vendor Bill: The Payment Hold value will be set to true during the creation context. 
  • Purchase Order: The default status will be “Pending Approval” in the creation context. 
  • Expense Report/Request: The default status will be “Pending Approval” in the creation context. 

There is no permission for user  to change the Payment Hold value or the Pending Approval status. The Payment Hold and transaction status field will be disabled. Once the approval process was completed we will be changed status for further process. 

Approver Data Calculation 

The approver details will be added to the Approval subtab in the transaction. These details will be fetched from the custom record setup, ensuring consistency and accuracy in the approval process. 

Transaction lines will be grouped based on the class, department, Project, Subsidiary and Internal Order combination. Consequently, if only 1 class/department/project/internal order/ Subsidiary combination exists on the detail lines, this will be added to the Approval Subtab. If there are more combinations, more records will be added to the Approval subtab, each with a subtotal (no tax amount included) per class/department/project/internal order/ Subsidiary combination. 

Using the (sub)totals, we will consult the active records in the Approval Matrix to find matches for Class, Department, Project, Subsidiary and Internal Order. If an exact match is not found, a “Hierarchy Traversal” procedure will be initiated, seeking parent entities within each hierarchy (e.g., Parent Class, Parent Department, Parent Project, and Parent Internal Order). This process will continue until a match is found or all hierarchical levels have been explored.                                                                                               

The Approver details will be determined based on the (sub)total falling within the “min” and “max” approval amount range specified in the Approval Matrix. Once a match is found, one or more records will be injected into the Approval Subtab, indicating the appropriate approver(s) for the respective combination. 

In cases where no match is found after the hierarchy traversal, a custom record will define the “Dummy Approver.” Transactions failing to find an approver through the regular process will be assigned to this Dummy Approver.  

Approval Process 

The custom suitelet HTML page will be developed for the Approval process and the page has following steps: 

Step 1 – Transaction List: 

All transactions will be listed from the approval subtab, which are active and the Approved amount is blank, if the current user is the next approver in the Approval Subtab (determined by the level order). By Clicking the Checkbox, the user can select the transactions for the Approving. 

The following fields will be available in the Step-1 of the Approval Process. 

  • Approve: Checkbox that allows to check the records for the Approval process. 
  • Type: Refers to transaction type that is presented (vendor bill, credit note, purchase order, expense request, …). 
  • Number: Transaction number in NetSuite. 
  • Reference: Reference number used by e.g. supplier on a vendor bill. 
  • Class: Class value will be fetched from the transaction Approval subtab. 
  • Department: Department value will be fetched from the transaction Approval subtab. 
  • Subsidiary: Subsidiary value will be fetched from the transaction. 
  • Project: Project value will be fetched from the transaction Approval subtab. 
  • Internal order: Internal order value will be fetched from the transaction Approval subtab. 
  • Entity: Entity as displayed in NetSuite. For vendor bill this will be a vendor ID, for an expense request this will be an employee name, .. etc. 
  • Comments: ** Need Clarification. 
  • Subsidiary: Subsidiary from the transaction. 
  • Approve Amount: Amount as calculated the approval records for this transaction or the total of a partial approved amount by the approver in a previous level. If an approver in level 2 approves only 50% of an amount, the approver in level 3 should also be asked to approve only that partial amount. 
  • Total Amount: Total amount (excl VAT) on this transaction. 
  • PDF: This hyperlink allows the approver to open a window containing the PDF version of the transaction, if available. The PDF will be opened in the new tab. 

By clicking the “Next” button, we can move on to the next step. 

Step 2 – Approve Amount: 

It will list all selected transactions as a Sublist for entering the Amount to approve and comment. 

  • The “Approved Amount” field’s default value is the value in the “Amount to Approve” field. The “Amount to Approve” is displayed in the read-only field. 
  • The user cannot enter an amount bigger than the “Amount to Approve”. 
  • Amounts are always needed to enter as positive numbers, even for credit notes.  
  • If an amount less than the “Amount to Approve” is entered, the “Comments” field becomes mandatory, requiring the user to provide an explanation for the lower amount. 
  • When an approver enters zero as the “Approved Amount,” the transaction will be marked as Rejected (the approved amount is no longer null but zero). Additionally, the approver must provide a reason for rejecting the transaction in the comment section. 
  • If a partial amount is entered, any amounts that are waiting in higher approval levels need to be split into the approved amount by the inferior approval level and the remaining to approve amount. 
  • The formatting of amounts, including thousand and decimal separators, will adhere to the user’s preference settings. 
  • By clicking the “Next” bouton, we can move on to the next step. 

Step 3 – Review and Finalize: 

In the final step of the Approval process, all selected transactions with the approved amount will be available in the view mode for finalizing. By clicking the “Finish” button, we can approve the transactions. 

Once the “last” approver level approves the total amount of the transaction, the Payment Hold/ Pending Approval will be changed for the further payment process. This change makes the transactions eligible for the subsequent payment run. 

When the Approval process updates a custom record, it will be registered that the current user is responsible for updating the record. 

PARTIALLY APPROVED TRANSACTIONS  

  • Approvers can approve partial amounts at their respective levels. The amount presented to the next approver will be limited to the maximum of what was approved by the previous level approver. If there is any discrepancy between the “Amount to Approve” and the approved amount at a level, the transaction will continue, and the subsequent approver will only have the authority to approve the remaining amount. 
  • In case the approval process runs multiple times for the same transaction, the “Approved Amount” from the first run will be incremented with the approved amount from each subsequent step. 

REJECTED TRANSACTIONS 

  • If the “Approved Amount” is set to zero at any approval level for a specific transaction, the approval cycle will require a restart. 
  • The technical approver will need to address the transaction’s issues based on the remarks entered in the comments field. 
  • Once the technical approver corrects the transaction, they can reinitiate the approval cycle by clicking the “Restart Approval” custom button on the approval tab. 
  • Clicking the Restart Approval button will invalidate all existing approvals by marking them as “Inactive.” This will allow for the insertion of new approver records for the transaction as if it were freshly entered in NetSuite. 

Assumptions 

The proposed solution is based on the following assumptions: 

  • The proposed solution assumes that the custom record for the approver matrix has already been set up in the Sandbox and Production account.   
  • The Approval subtab and all necessary fields have already been created in the Sandbox and Production account.   
  • A separate entry for the dummy approver record is assumed to be present in the Custom record setup.   
  • Transactions must be within an open accounting period. Our script will not restrict any processes related to the accounting period. Once the approval process is completed for the closed accounting periods, we will proceed with updating the transactions as per the approval process, if NetSuite allows. 
  • The Approval Process page layout will be designed similarly to Assistant wizard using the Custom Suitelet HTML page. 

Questions 

  • Please provide clarification regarding the source of information for the comments field in Approval Process Step-1. 

Risks 

  • As per the NetSuite standard Payment Hold or Pending Approval was not available for the Credit Note. As a result, credit note was not considered in the proposal. We will consider as a update in the future. 
  • If we added the amount values in the step-2 of the Approval process, and we return to step-1 by clicking the Back button, The updated values in the step-2 will be loss. 

Leave a comment

Your email address will not be published. Required fields are marked *