How To Generate Approval Required E-mail On Quote Save
If a client's workflow requires that the quote remains editable after being submitted for approval and notifications must be sent to the approvers, this can be achieved by generating the notification e-mails when the quote is saved (rather than submitted). The basic concept entails creating a “Submit To” flag with “Yes”/”No”/null options and a price parameter table to keep track of the generated e-mails (to prevent the e-mails from being generated more than once).
When the quote is saved with “Submit To” == null -> nothing happens.
When the quote is saved with “Submit To” == “Yes” -> a notification e-mail is generated to the appropriate parties and the quote gets entered into a tracking table to avoid duplicate e-mail generation.
When the quote is saved with “Submit To” == “No” -> the quote record is deleted from the tracking table so that when the quote is saved with “Submit To” == “Yes” the e-mail is generated again.
Create a Price Parameter MLTV table (in this case called “QuotesEmailSent”) as follows:
Create a Calculation Flow Logic with the following code:
if (api.isInputGenerationExecution()) return //isInputGenerationExecution suppooted from version 10.0, in older versions use isSyntaxCheck
def quotesSaved = true
int i = 0
int step = 200
def qs = []
def quotes = []
def table = api.findLookupTable("QuotesEmailSent")
def tableValues = api.findLookupTableValues("QuotesEmailSent")
def quoteList = []
//create a list of quotes in the PP tracking table
for (quote in tableValues) {
quoteList.add(quote.name)
}
//find all users in the approver group
def ug = api.find("U", Filter.equal("groups.uniqueName", "Marketing Manager"))
//create the list of e-mails of the users in the approver group
def emailList = []
for (e in ug) {
emailList.add(e.email)
}
//iterate over saved quotes
while (quotesSaved) {
qs = api.find("Q", i, step, null)
if (qs.size() != 0) {
quotes.addAll(qs)
i += step
} else {
quotesSaved = false
}
/*Find the quotes with the “Submit To” flag switched to “Yes” that are not in the tracking table,
and generate the e-mails adding the quote(s) to the tracking tables.
Find the quotes with the “Submit To” flag switched to “No” and remove the quote(s) from the tracking table*/
for (q in qs) {
def clic = api.getCalculableLineItemCollection(q?.typedId)
for (lineItem in clic?.lineItems) {
if (lineItem.folder) continue
}
for (input in clic?.inputs) {
if (input.name == "submitForApproval" && input.value == "Yes" && !quoteList.contains(q.typedId)) {
for (email in emailList) {
api.sendEmail(email, "Submitted For Quote", "https://www.pricefx.eu/priceFxWeb.html?locale=en_US&targetPageState=" + q.typedId + "&targetPage=priceShopPage#priceShopPage")
}
updateRecord = [lookupTableId : table.id, "name" : q.typedId, "attribute1" : q.uniqueName, "attribute2" : q.lastUpdateDate]
api.addOrUpdate("MLTV", updateRecord)
} else if (input.name == "submitForApproval" && input.value == "No") {
existingRecord = [lookupTableId : table.id, "name" : q.typedId, "attribute1" : q.uniqueName, "attribute2" : q.lastUpdateDate]
api.delete("MLTV", existingRecord)
}
}
}
}Create a calculation flow which will run this logic every 5 minutes (or as often as you and the client deem reasonable).
In case there are more than one approval levels you will need to create a "Submit To" flag and a PP tracking table for each level.
The full code (including HTML formatting for the e-mail) is available in Git - Copy_of_GenerateEmailOnQuoteSave_VA1.groovy
Found an issue in documentation? Write to us.