A transaction template is a blueprint for LUSID to automatically generate transactions in appropriate portfolios in response to a particular type of instrument event.
For example, LUSID emits a bond coupon event every time a coupon is due on an instrument mastered as type Bond
. LUSID also provides a default transaction template for bond coupon events that automatically generates an output transaction for the coupon amount in every portfolio with a holding in that bond. You can use the default transaction template as-is, or create your own custom template to override and configure the process.
Note that an instrument event can be:
- An instrument lifecycle event. See a list.
- A corporate action event. See a list.
LUSID provides a default transaction template for every type of event. To examine a template, call the GetTransactionTemplate API, specifying:
- The appropriate
instrumentEventType
, for exampleBondCouponEvent
. - An
instrumentType
emitting this event, for exampleBond
. - A
scope
ofdefault
. Note this is a protected scope and you cannot edit the default transaction templates, nor add your own in this location.
For example:
curl -X GET "https://<your-domain>.lusid.com/api/api/instrumenteventtypes/BondCouponEvent/transactiontemplates/Bond/default" -H "Authorization: Bearer <your-API-access-token>"
The response to this call is currently as follows (note default transaction templates may evolve over time):
{
"instrumentType": "Bond",
"instrumentEventType": "BondCouponEvent",
"description": "LUSID default template for automatically generated transactions in respect of Bond Coupon instrument events.",
"scope": "default",
"componentTransactions": [
{
"displayName": "Bond Income",
"transactionFieldMap": {
"transactionId": "{{instrumentEventId}}-{{holdingId}}",
"type": "BondCoupon",
"source": "default",
"instrument": "{{instrument}}",
"transactionDate": "{{BondCouponEvent.exDate}}",
"settlementDate": "{{BondCouponEvent.paymentDate}}",
"units": "{{eligibleBalance}}",
"transactionPrice": {
"price": "{{BondCouponEvent.couponPerUnit}}",
"type": "CashFlowPerUnit"
},
"transactionCurrency": "{{BondCouponEvent.currency}}",
"exchangeRate": "1",
"totalConsideration": {
"currency": "{{BondCouponEvent.currency}}",
"amount": "{{BondCouponEvent.couponAmount}}"
}
},
"transactionPropertyMap": []
}
],
...
}
Note the following:
- This template handles instrument events of type
BondCouponEvent
emitted by instruments of typeBond
. - It is domiciled in the
default
(that is, system) transaction templatescope
. - It generates a single transaction for each portfolio with a holding in the underlying instrument. Note it is possible for a template to generate multiple transactions.
- This transaction has no
condition
; that is, it is always produced when LUSID emits a bond coupon event. - This transaction belongs to a
BondCoupon
transaction type, which must exist in thedefault
transaction typesource
. - The
transactionDate
is the ex-dividend date and thesettlementDate
is the payment date. - The quantity held (
units
) is assessed dynamically per-portfolio and per-coupon. - The
transactionPrice.price
is the coupon per unit, which is calculated as the annual coupon rate multiplied by the principal and divided by the number of coupons per year. - The
transactionCurrency
is the currency specified in the bond economic definition, and anexchangeRate
of1
means the settlement currency is the same. - The
totalConsideration.Amount
is the coupon per unit scaled by the quantity held.
Note this template does not set the Transaction/default/TradeToPortfolioRate
system property to calculate the cost basis of the transaction in the portfolio currency, where this is different to the transaction/settlement currency. A mechanism for setting an exchange rate for foreign currency transactions is coming soon.