/
Waterfall Calculation
Waterfall Calculation
InvoicePrice = min(ListPrice * (1 – Discount), QuotePrice)
Code
def products = ["10000001", "10000002"]
def targetDate = api.targetDate()
def customerClass = "A"
def customerId = "CID-0001"
def qapi = api.queryApi()
def t1 = qapi.tables().conditionRecords("Pricelist")
def t2 = qapi.tables().conditionRecords("Discounts")
def t3 = qapi.tables().conditionRecords("QuotePrice")
return qapi.source(t1, [t1.sku, t1.conditionValue().as("ListPrice")], t1.sku.in(products))
.leftOuterJoin(t2, { cols -> [
t2.conditionValue().as("Discount"),
cols.ListPrice.multiply(qapi.exprs().real(1).minus(t2.conditionValue())).as("CustomerPrice")
]}, { cols ->
qapi.exprs().and(
t2.key1().equal(cols.sku),
t2.key2().equal(customerClass),
t2.validFrom().lessOrEqual(targetDate),
t2.validTo().greaterOrEqual(targetDate))
})
.leftOuterJoin(t3, { cols -> [
t3.conditionValue().as("QuotePrice"),
qapi.exprs().nullIf(t3.conditionValue(), cols.CustomerPrice).as("InvoicePrice")
] },
{ cols ->
qapi.exprs().and(
t3.key1().equal(cols.sku),
t3.key2().equal(customerId),
t3.validFrom().lessOrEqual(targetDate),
t3.validTo().greaterOrEqual(targetDate))
}
)
.stream { it.collect { it } }
Result
sku | ListPrice | Discount | CustomerPrice |
10000001 | 57 |
|
|
10000001 | 21 |
|
|
10000001 | 41 |
|
|
10000001 | 98 |
|
|
10000001 | 57 |
|
|
10000001 | 62 |
|
|
10000001 | 54 |
|
|
10000002 | 6 | 0.09 | 5.46 |
10000002 | 30 | 0.09 | 27.3 |
10000002 | 26 | 0.09 | 23.66 |
10000002 | 33 | 0.09 | 30.03 |
10000002 | 6 | 0.09 | 5.46 |
10000002 | 77 | 0.09 | 70.07 |
10000002 | 83 | 0.09 | 75.53 |
See Also
Found an issue in documentation? Write to us.