Skip to content
This repository has been archived by the owner on Sep 7, 2023. It is now read-only.

Commit

Permalink
feature(template) Add formatting support for numbers and monetary amo…
Browse files Browse the repository at this point in the history
…unts in templates

Signed-off-by: Jerome Simeon <jeromesimeon@me.com>
  • Loading branch information
jeromesimeon committed Mar 18, 2020
1 parent 8190e2b commit a39edc2
Show file tree
Hide file tree
Showing 9 changed files with 6,760 additions and 6,757 deletions.
4 changes: 3 additions & 1 deletion examples/interestsformat/data.json
@@ -1,6 +1,8 @@
{
"$class": "org.accordproject.interests.TemplateModel",
"loanAmount": 100000,
"loanAmount": { "$class": "org.accordproject.money.MonetaryAmount",
"doubleValue" : 100000,
"currencyCode" : "GBP" },
"rate": 2.5,
"loanDuration": 3
}
14 changes: 8 additions & 6 deletions examples/interestsformat/logic/interests.ergo
Expand Up @@ -27,22 +27,24 @@ define function roundn(x:Double, n:Integer) {
}

// Formula taken from https://en.wikipedia.org/wiki/Mortgage_calculator#Monthly_payment_formula
define function monthlyPaymentFormula(loanAmount: Double, rate: Double, loanDuration: Integer) : MonetaryAmount {
define function monthlyPaymentFormula(loanAmount: MonetaryAmount, rate: Double, loanDuration: Integer) : MonetaryAmount {
let currency = loanAmount.currencyCode;
let amount = loanAmount.doubleValue;
let term = longToDouble(loanDuration * 12);
if (rate = 0.0) then return MonetaryAmount{ doubleValue: (loanAmount / term), currencyCode: USD }
if (rate = 0.0) then return MonetaryAmount{ doubleValue: (amount / term), currencyCode: currency }
else
let monthlyRate = (rate / 12.0) / 100.0;
let monthlyPayment =
(monthlyRate * loanAmount)
(monthlyRate * amount)
/ (1.0 - ((1.0 + monthlyRate) ^ (-term)));
return MonetaryAmount{ doubleValue: roundn(monthlyPayment, 0), currencyCode: USD }
return MonetaryAmount{ doubleValue: roundn(monthlyPayment, 0), currencyCode: currency }
}

define function cummulativeInterests(loanAmount: Double, rate: Double, loanDuration: Integer) : MonetaryAmount {
define function cummulativeInterests(loanAmount: MonetaryAmount, rate: Double, loanDuration: Integer) : MonetaryAmount {
let term = longToDouble(loanDuration * 12);
let monthly = monthlyPaymentFormula(loanAmount, rate, loanDuration);
return MonetaryAmount{
doubleValue: term * (monthly.doubleValue - loanAmount),
doubleValue: term * (monthly.doubleValue - loanAmount.doubleValue),
currencyCode: monthly.currencyCode
}
}
Expand Down
3 changes: 2 additions & 1 deletion examples/interestsformat/model/model.cto
Expand Up @@ -15,6 +15,7 @@
namespace org.accordproject.interests

import org.accordproject.time.* from https://models.accordproject.org/v2.0/time.cto
import org.accordproject.money.* from https://models.accordproject.org/money@0.2.0.cto

transaction Request {
o String input
Expand All @@ -25,7 +26,7 @@ transaction Response {
}

concept TemplateModel {
o Double loanAmount
o MonetaryAmount loanAmount
o Double rate
o Integer loanDuration
}
Expand Down
4 changes: 2 additions & 2 deletions examples/interestsformat/text/grammar.tem.md
@@ -1,4 +1,4 @@
This is a fixed interest loan to the amount of {{loanAmount}}
This is a fixed interest loan to the amount of {{loanAmount as "K0,0.0 (CCC)"}}
at the yearly interest rate of {{rate}}%
with a loan term of {{loanDuration}},
and monthly payments of {{% monetaryAmountFormat(monthlyPaymentFormula(contract.loanAmount,contract.rate,contract.loanDuration), "0,0.0 CCC") %}}
and monthly payments of {{% monthlyPaymentFormula(contract.loanAmount,contract.rate,contract.loanDuration) as "K0,0.0 (CCC)" %}}
10 changes: 4 additions & 6 deletions extraction/src/ErgoParser.mly
Expand Up @@ -51,13 +51,11 @@ let make_template_computed prov e =
[e]

let make_template_variable_as prov v s =
ErgoCompiler.ecallfun prov
(relative_name_of_qname (Some "org.accordproject.time","format"))
[ErgoCompiler.eunaryoperator prov
ErgoCompiler.eas prov
(Util.char_list_of_string s)
(ErgoCompiler.eunaryoperator prov
(EOpDot (Util.char_list_of_string v))
(make_template_input prov);
ErgoCompiler.econst prov
(ErgoCompiler.ErgoData.dstring (Util.char_list_of_string s))]
(make_template_input prov))

(* Construct AST for variables *)
let wrap_template_variable prov name ve =
Expand Down
4,468 changes: 2,234 additions & 2,234 deletions packages/ergo-cli/extracted/ergoccore.js

Large diffs are not rendered by default.

4,790 changes: 2,395 additions & 2,395 deletions packages/ergo-cli/extracted/ergotopcore.js

Large diffs are not rendered by default.

4,222 changes: 2,111 additions & 2,111 deletions packages/ergo-compiler/extracted/compilercore.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/ergo-engine/test/workload.json
Expand Up @@ -367,7 +367,7 @@
"clauseName": "generateText",
"currentTime": "2019-01-01T16:34:00-05:00",
"expected": {
"response": "This is a fixed interest loan to the amount of 100000.0\nat the yearly interest rate of 2.5%\nwith a loan term of 3,\nand monthly payments of {{\"2,886.0 USD\"}}\n"
"response": "This is a fixed interest loan to the amount of £100,000.0 (GBP)\nat the yearly interest rate of 2.5%\nwith a loan term of 3,\nand monthly payments of {{\"£2,886.0 (GBP)\"}}\n"
}
},
{
Expand Down

0 comments on commit a39edc2

Please sign in to comment.