a!forEach(): print the lines of an invoice
Hard
An invoice lists the order lines being billed, numbered from 1, followed by a total. Each order line is a record with name, qty and price. A line with a quantity of 0 was cancelled.
Return a list of text lines
- one line per billed item, numbered:
"1. Mug x2 = 10", where 10 is quantity × price - a last line with the total of the billed items:
"Total: 25"
A cancelled line is left off the invoice entirely.
Watch out
- The numbers count the printed lines, so a cancelled line leaves no gap:
"1. Mug"then"2. Lamp", even when a cancelled pen sat between them. fv!indexcounts every item of the list being looped over, cancelled ones included.
Input
ri!lines: List of Map, each withname(Text),qty(Integer) andprice(Integer)
ri! Rule Inputs
ri!linesList of Map{
a!map(name: "Mug", qty: 2, price: 5),
a!map(name: "Pen", qty: 0, price: 1),
a!map(name: "Lamp", qty: 1, price: 15)
}Example 1: A cancelled line in the middle
Input: ri!lines
{
a!map(name: "Mug", qty: 2, price: 5),
a!map(name: "Pen", qty: 0, price: 1),
a!map(name: "Lamp", qty: 1, price: 15)
}Output:
{
"1. Mug x2 = 10",
"2. Lamp x1 = 15",
"Total: 25"
}Example 2: A single line
Input: ri!lines
{a!map(name: "Rug", qty: 3, price: 20)}Output:
{
"1. Rug x3 = 60",
"Total: 60"
}Example 3: A cancelled first line
Input: ri!lines
{
a!map(name: "Pen", qty: 0, price: 1),
a!map(name: "Cup", qty: 4, price: 3)
}Output:
{
"1. Cup x4 = 12",
"Total: 12"
}Example 4: Everything cancelled
Input: ri!lines
{a!map(name: "Pen", qty: 0, price: 1)}Output:
{"Total: 0"}Example 5: An empty order
Input: ri!lines
{}Output:
{"Total: 0"}Appian Expression Tips
- • Use
ri!variableNamefor rule inputs - • Use
a!localVariables(local!x: …, body)for locals - • Use
a!forEach(items: …, expression: fv!item)to iterate - • Use
where()/reject(fn!isnull, list)to filter