How does LUSID resolve transaction templates and types for instrument lifecycle events?

LUSID provides a default transaction template for every type of instrument lifecycle event, domiciled in the default (that is, system) template scope.

A default transaction template mandates a transaction type with a particular name (alias) and source for each transaction it generates in response to that event, and in addition expects to locate the transaction type in a particular scope. Note a transaction type scope is not the same as a transaction template scope. More on transaction type scope and source resolution.

You have the option to override a default transaction template for an event by creating one in a custom template scope, perhaps specifying a transaction type with a different name and source. If you do, you must register this custom template scope with each portfolio you wish the event to impact.

The following diagram summarises how LUSID resolves transaction templates and transaction types each time it emits an event, using BondCouponEvent as an example:


One or more transactions should be automatically generated in a portfolio in response to an instrument event. If they are not, the first step is to call the QueryApplicableInstrumentEvents API for that portfolio.

You should see a record of each emitted event. Note the following:

  • An event has a completeness status, which can either be Complete or Incomplete. Some events require market data in order to calculate amounts, for example fixings for inflation-linked bonds.

  • If the status is Incomplete, there should be a generatedEventDiagnostics object in the response that helps diagnose the problem, for example:

  • The transactions array should preview transaction(s) generated by the event. If this array is empty, it may mean LUSID cannot resolve the transaction type:

    • There may be a problem with the transaction type source. Are you using the default transaction template?

      • YES: The transaction type must be domiciled in the default source. Is there a transaction type with the expected name in this source?

      • NO: Have you specified a different source in your custom transaction template? Is there a transaction type with this name in this source?

    • There may be a problem with the transaction type scope. Does your portfolio have a transaction type scope set? (again, note this is not the same as a transaction template scope):

      • NO: The transaction type must be stored in the default scope. Is there a transaction type with the expected name and source in that scope?

      • YES: The transaction type must be stored in your custom scope. Is there a transaction type with the expected name and source in that scope?

Note a successfully-previewed transaction has a resolvedTransactionTypeDetails object that identifies the resolved transaction type, in this case BondCoupon in the default source and default scope:

{
  "values": [
    {
      "portfolioId": {
        "scope": "FixedIncome",
        "code": "Growth"
      },
      "holdingId": 75318163,
      "lusidInstrumentId": "LUID_00003EA5",
      "instrumentScope": "default",
      "instrumentType": "Bond",
      "instrumentEventType": "BondCouponEvent",
      "instrumentEventId": "LUID_00003EA5_BondCouponEvent_20201022",
      "generatedEvent": {
        "instrumentEventId": "LUID_00003EA5_BondCouponEvent_20201022",
        "instrumentIdentifiers": {
          "Instrument/default/Figi": "BBG00ZF1T9P5"
        },
        "lusidInstrumentId": "LUID_00003EA5",
        "instrumentScope": "default",
        "description": "Queried External Instrument Event of Type BondCouponEvent",
        "eventDateRange": {
          "start": "2020-10-17T00:00:00.0000000+00:00",
          "end": "2020-10-22T00:00:00.0000000+00:00"
        },
        "completeness": "Complete",
        "instrumentEvent": {
          "exDate": "2020-10-17T00:00:00.0000000+00:00",
          "paymentDate": "2020-10-22T00:00:00.0000000+00:00",
          "currency": "GBP",
          "couponPerUnit": 0.1,
          "instrumentEventType": "BondCouponEvent"
        },
        "properties": [],
        "sequenceNumber": 0,
        "participationType": "Mandatory"
      },
      "transactions": [
        {
          "transactionId": "LUID_00003EA5_BondCouponEvent_20201022-75318163",
          "type": "BondCoupon",
          "instrumentIdentifiers": {
            "Instrument/default/LusidInstrumentId": "LUID_00003EA5"
          },
          "instrumentScope": "default",
          "instrumentUid": "LUID_00003EA5",
          "transactionDate": "2020-10-17T00:00:00.0000000+00:00",
          "settlementDate": "2020-10-22T00:00:00.0000000+00:00",
          "units": 50000,
          "transactionPrice": {
            "price": 0.1,
            "type": "CashFlowPerUnit"
          },
          "totalConsideration": {
            "amount": 5000,
            "currency": "GBP"
          },
          "exchangeRate": 1,
          "transactionCurrency": "GBP",
          "properties": {
            "Transaction/SHKs/BondPrincipal": {
              "key": "Transaction/SHKs/BondPrincipal",
              "value": {
                "labelValue": "<Not Classified>"
              }
            },
            "Transaction/SHKs/BondCoupons": {
              "key": "Transaction/SHKs/BondCoupons",
              "value": {
                "labelValue": "<Not Classified>"
              }
            }
          },
          "source": "default",
          "entryDateTime": "0001-01-01T00:00:00.0000000+00:00",
          "transactionStatus": "Active",
          "transactionGroupId": "LUID_00003EA5_BondCouponEvent_20201022",
          "resolvedTransactionTypeDetails": {
            "scope": "default",
            "source": "default",
            "type": "BondCoupon"
          }
        }
      ]
    }
  ],
  ...
}