diff --git a/RELEASE.md b/RELEASE.md index 4de6397d0e..2a47bbfb6d 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,65 +1,58 @@ -# _Event Model - Qualification Functions - Enhancements for the Contract Formation qualification function_ - -_Background_ - -The current Contract Formation qualification function does not allow the inclusion of the inception premium. The latter can be transferred as part of the trade execution. This change allows a transfer instruction to be part of the representation of the business event. - +# *Infrastructure - Dependency Update* _What is being released?_ -The logical expression for the `Qualify_ContractFormation` function is enhanced to allow for the presence of a transfer instruction. - - -_Review directions_ - -In the CDM Portal, select the Textual Browser and inspect the function mentioned above. - -Changes can be reviewed in PR: https://github.com/finos/common-domain-model/pull/2544 - -# _Event Model - CounterpartyPositionBusinessEvent - Cardinality of the After state_ +This release updates the `rosetta-dsl` dependency. -_Background_ +Version updates include: +- `rosetta-dsl` 9.1.2: this release fixes DSL issues [#670](https://github.com/REGnosys/rosetta-dsl/issues/670) and [#653](https://github.com/REGnosys/rosetta-dsl/issues/653). For further details see DSL release notes: https://github.com/REGnosys/rosetta-dsl/releases/tag/9.1.2. +- `rosetta-dsl` 9.1.3: this release fixes an issue related to the generated Java `process` method. For further details see DSL release notes: https://github.com/REGnosys/rosetta-dsl/releases/tag/9.1.3. -Following the release of counterparty position in the Common Domain Model, a modelling update is required. The cardinality of the attribute `after` of type `CounterpartyPositionBusinessEvent` has been relaxed to unbounded list `(0..*)`. This change will support the cases when multiple `after` position states are generated as a result of a _partial option exercise_ event being applied to the position. +To ease the process of reviewing expectation changes, +the formatting of the following expectation files has also been improved: +- `cdm-sample-files/functions/repo-and-bond/repo-adjustment-input.json` +- `cdm-sample-files/functions/repo-and-bond/repo-reprice-input.json` +- `cdm-sample-files/functions/repo-and-bond/repo-substitution-input.json` +_Review directions_ -_What is being released?_ +Inspect formatting changes in the files listed above. -- The cardinality of the `after` position state within `CounterpartyPositionBusinessEvent`is relaxed to unbounded list. +There are no functional changes to the model. In the expectation files, global keys and references have been updated due to a bug fix, but they remain semantically the same. -_Data types_ +The changes can be reviewed in PR [#2550](https://github.com/finos/common-domain-model/pull/2550). -- `after` attribute of type `CounterpartyPositionState` updated to multiple cardinality. +# *Product Model - Qualification Functions for Zero-coupon Swaps* -_Review directions_ +_Background_ -In the CDM Portal, select the Textual Browser and inspect each of the changes listed above. +The qualification function for a zero-coupon swap is too restrictive in CDM, since it requires that all the payout legs should feature one unique payment at Term. Normally a zero coupon only points out that at least one leg has a unique payment made at term. -Changes can be reviewed in PR: https://github.com/finos/common-domain-model/pull/2539 +This release fixes this, along with some inaccurate provisions of qualifying functions regarding zero-coupon swaps. In addition, a new `Qualify_Transaction_ZeroCoupon_KnownAmount` function was added to facilitate the classification of Zero Coupon swaps with a Known Amount. -# *Event / Product Model - FpML 5.13 Schema* +This release also removes the use of conditional synonym mappings from FpML to CDM of the `PrincipalPayments` element for Zero-Coupon Swaps with Known Amount cases. The `Qualify_SubProduct_FixedFloat` qualification function has also been updated to not require the use of this `PrincipalPayments` element. _What is being released?_ -This release updates the FpML schema used for FpML to CDM ingestion. The version has been updated from `5.13 Second Working Draft` to `5.13 Third Working Draft`. For further details, visit https://www.fpml.org/spec/fpml-5-13-3-wd-3/. +- Minor changes to existing Zero-Coupon Swap qualification functions +- Addition of a new Zero-Coupon Swap Known Amount qualification function +- Removed the conditional synonym mappings from FpML to CDM for the PrincipalPayments element in scenarios with Zero-Coupon Swaps with Known Amount. -_Review Directions_ +_Qualification_ -This change has no impact on the model or test expectations. The changes can be reviewed in PR [2542](https://github.com/finos/common-domain-model/pull/2542). +- Updated `Qualify_Transaction_ZeroCoupon` function to accurately qualify Zero-Coupon swaps. +- Updated `Qualify_SubProduct_FixedFloat` function to include Zero-Coupon swaps with Known Amount. +- Updated `Qualify_InterestRate_IRSwap_FixedFloat_ZeroCoupon` function to include Zero-Coupon swaps with Known Amount. +- Updated `Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon` function to include Zero-Coupon swaps with Known Amount. +- Created new `Qualify_Transaction_ZeroCoupon_KnownAmount` function. +- Updated the annotations of `Qualify_InterestRate_IRSwap_FixedFloat_ZeroCoupon`, `Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon` and `Qualify_InterestRate_InflationSwap_Basis_ZeroCoupon` functions to accurately describe the qualified products. -# *Infrastructure - Dependency Update* +_Translate_ -_What is being released?_ +- Deprecated use of synonym mapping from FpML to CDM for the `PrincipalPayments` element for Zero-Coupon Swaps with Known Amount cases. -This release updates the `rosetta-dsl` dependency. - -Version updates include: -- `rosetta-dsl` 9.1.0: this release fixes several code generation issues such as [when assigning a Rosetta int to a Rosetta number](https://github.com/REGnosys/rosetta-dsl/issues/579). For further details see DSL release notes: https://github.com/REGnosys/rosetta-dsl/releases/tag/9.1.0. - -The issue brought to light a bug in the model having to do with the `CashPriceQuantityNoOfUnitsTriangulation` function, which has been resolved. - -_Review directions_ +Review directions -Test expectations remain the same. +In the CDM Portal, select the Textual Browser and inspect each of the changes identified above. -The changes can be reviewed in PR [#2533](https://github.com/finos/common-domain-model/pull/2533). +Inspect Pull Request: https://github.com/finos/common-domain-model/pull/2560 \ No newline at end of file diff --git a/docs/product-model.md b/docs/product-model.md index 667da4a3c8..043420852d 100644 --- a/docs/product-model.md +++ b/docs/product-model.md @@ -986,7 +986,7 @@ func Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon: Qualify_BaseProduct_Inflation(economicTerms) = True and Qualify_BaseProduct_CrossCurrency( economicTerms ) = False and Qualify_SubProduct_FixedFloat(economicTerms) = True - and Qualify_Transaction_ZeroCoupon(economicTerms) = True + and (Qualify_Transaction_ZeroCoupon(economicTerms) = True or Qualify_Transaction_ZeroCoupon_KnownAmount(economicTerms) = True) ``` If all the statements above are true, then the function evaluates to diff --git a/rosetta-source/src/main/rosetta/mapping-fpml-confirmation-tradestate-synonym.rosetta b/rosetta-source/src/main/rosetta/mapping-fpml-confirmation-tradestate-synonym.rosetta index 0f92cd7be6..eab8ed738d 100644 --- a/rosetta-source/src/main/rosetta/mapping-fpml-confirmation-tradestate-synonym.rosetta +++ b/rosetta-source/src/main/rosetta/mapping-fpml-confirmation-tradestate-synonym.rosetta @@ -637,6 +637,7 @@ synonym source FpML_5_Confirmation_To_TradeState extends FpML [value "calculation" path "calculationPeriodAmount" mapper "FloatingRateCalculation"] [value "fixedRateSchedule" path "calculationPeriodAmount->calculation"] [value "spreadSchedule" path "calculationPeriodAmount->calculation->floatingRateCalculation"] + [value "knownAmountSchedule" path "calculationPeriodAmount"] // For FRAs: [hint "fixedRate"] // For Credit: @@ -665,7 +666,6 @@ synonym source FpML_5_Confirmation_To_TradeState extends FpML [value "notionalStepSchedule" path "calculationPeriodAmount->calculation->notionalSchedule"] [value "fxLinkedNotionalSchedule" path "calculationPeriodAmount->calculation"] [value "futureValueNotional" path "calculationPeriodAmount->calculation"] - [value "knownAmountSchedule" path "calculationPeriodAmount"] [value "notionalAmount"] // For FRAs: [value "notional"] @@ -825,13 +825,10 @@ synonym source FpML_5_Confirmation_To_TradeState extends FpML [value "PrincipalExchanges" meta "id"] + initialPayment [value "initialExchange"] - [set to False when "knownAmountSchedule" exists] + finalPayment [value "finalExchange"] - [set to True when "knownAmountSchedule" exists] + intermediatePayment [value "intermediateExchange"] - [set to False when "knownAmountSchedule" exists] + principalPaymentSchedule [value "cashflows" mapper "PrincipalPaymentSchedule"] @@ -2311,6 +2308,7 @@ synonym source FpML_5_Confirmation_To_TradeState extends FpML // For Swap Stream: [value "calculation" path "calculationPeriodAmount"] [value "fxLinkedNotionalSchedule" path "calculationPeriodAmount->calculation"] + [value "knownAmountSchedule" path "calculationPeriodAmount"] // For FRAs: [hint "notional"] // For the interest leg of Equity Swap: diff --git a/rosetta-source/src/main/rosetta/product-qualification-func.rosetta b/rosetta-source/src/main/rosetta/product-qualification-func.rosetta index 0cd56a72a2..aa2456b9da 100644 --- a/rosetta-source/src/main/rosetta/product-qualification-func.rosetta +++ b/rosetta-source/src/main/rosetta/product-qualification-func.rosetta @@ -910,15 +910,15 @@ func Qualify_SubProduct_FixedFloat: <"Qualifies a product as having the Sub Prod set is_product: (economicTerms -> payout -> interestRatePayout -> rateSpecification -> fixedRate count = 1 - and economicTerms -> payout -> interestRatePayout -> rateSpecification -> floatingRate count = 1) - or (economicTerms -> payout -> interestRatePayout -> rateSpecification -> fixedRate count = 1 - and economicTerms -> payout -> interestRatePayout -> rateSpecification -> inflationRate count = 1) - or ((economicTerms -> payout -> interestRatePayout -> rateSpecification -> fixedRate is absent - and economicTerms -> payout -> interestRatePayout -> principalPayment -> finalPayment only-element = True) - and (economicTerms -> payout -> interestRatePayout -> rateSpecification -> floatingRate count = 1 - or economicTerms -> payout -> interestRatePayout -> rateSpecification -> inflationRate count = 1)) + and economicTerms -> payout -> interestRatePayout -> rateSpecification -> floatingRate count = 1) + or (economicTerms -> payout -> interestRatePayout -> rateSpecification -> fixedRate count = 1 + and economicTerms -> payout -> interestRatePayout -> rateSpecification -> inflationRate count = 1) + or ((economicTerms -> payout -> interestRatePayout -> rateSpecification -> floatingRate count = 1 + or economicTerms -> payout -> interestRatePayout -> rateSpecification -> inflationRate count = 1) + and (economicTerms -> payout -> interestRatePayout + filter rateSpecification is absent and priceQuantity exists then count = 1)) -func Qualify_SubProduct_FixedFixed: <"Qualifies a product as having the Sub Product classification Fixed Float"> +func Qualify_SubProduct_FixedFixed: <"Qualifies a product as having the Sub Product classification Fixed Fixed"> inputs: economicTerms EconomicTerms (1..1) output: @@ -943,8 +943,19 @@ func Qualify_Transaction_ZeroCoupon: <"Qualifies a product as having the Transac output: is_product boolean (1..1) set is_product: - economicTerms -> payout -> interestRatePayout -> paymentDates -> paymentFrequency -> periodMultiplier all = 1 - and economicTerms -> payout -> interestRatePayout -> paymentDates -> paymentFrequency -> period all = PeriodExtendedEnum -> T + economicTerms -> payout -> interestRatePayout -> paymentDates -> paymentFrequency + filter item -> periodMultiplier = 1 and item -> period = PeriodExtendedEnum -> T then exists + +func Qualify_Transaction_ZeroCoupon_KnownAmount: <"Qualifies a product as having the Transaction classification Zero Coupon with a Known Amount. This category applies to a Zero Coupon Swap in which the fixed leg pays a known amount at maturity."> + inputs: + economicTerms EconomicTerms (1..1) + output: + is_product boolean (1..1) + set is_product: + Qualify_SubProduct_FixedFloat(economicTerms) = True and + Qualify_Transaction_ZeroCoupon(economicTerms) = True and + (economicTerms -> payout -> interestRatePayout + filter item -> priceQuantity exists and rateSpecification is absent and paymentDates -> paymentFrequency -> periodMultiplier = 1 and paymentDates -> paymentFrequency -> period = PeriodExtendedEnum -> T then exists) func Qualify_Transaction_YoY: <"Qualifies a product as having the Transaction classification Year on Year"> inputs: @@ -1084,7 +1095,7 @@ func Qualify_InterestRate_IRSwap_Basis: <"Qualifies a product as a Basis (Float- and Qualify_SubProduct_Basis(economicTerms) = True and Qualify_Transaction_OIS(economicTerms) = False -func Qualify_InterestRate_IRSwap_FixedFloat_ZeroCoupon: <"Qualifies a product as a Fixed-Float Zero Coupon Interest Rate Swap based on the economic terms and the following criteria: 1) An interest rate product with one fixed and one floating leg and more than one payment, 2) without inflation features or cross-currency features, and 3) where the floating leg is not based on an OIS index."> +func Qualify_InterestRate_IRSwap_FixedFloat_ZeroCoupon: <"Qualifies a product as a Fixed-Float Zero Coupon Interest Rate Swap based on the economic terms and the following criteria: 1) An interest rate product with one fixed and one floating leg, 2) where the fixed leg represents one singular payment agreed upon execution and to be made at maturity, 3) where the floating leg is not based on an OIS index and 4) without any inflation features or cross-currency features."> [qualification Product] inputs: economicTerms EconomicTerms (1..1) @@ -1095,7 +1106,7 @@ func Qualify_InterestRate_IRSwap_FixedFloat_ZeroCoupon: <"Qualifies a product as set is_product: Qualify_BaseProduct_IRSwap(economicTerms) = True and Qualify_SubProduct_FixedFloat(economicTerms) = True - and Qualify_Transaction_ZeroCoupon(economicTerms) = True + and (Qualify_Transaction_ZeroCoupon(economicTerms) = True or Qualify_Transaction_ZeroCoupon_KnownAmount(economicTerms) = True) and Qualify_Transaction_OIS(economicTerms) = False func Qualify_InterestRate_IRSwap_FixedFloat_OIS: <"Qualifies a product as a Fixed-Float OIS Interest Rate Swap based on the economic terms and the following criteria: 1) An interest rate product with one fixed and one floating leg and more than one payment and where the floating leg is based on an OIS index, 2) without inflation features or cross-currency features, and 3) could include 'zero coupon' features."> @@ -1191,7 +1202,7 @@ func Qualify_InterestRate_InflationSwap_FixedFloat_YearOn_Year: <"Qualifies a pr * and Qualify_InterestRate_InflationSwap_Basis_ZeroCoupon (economicTerms) = False * and Qualify_InterestRate_InflationSwap_Basis_YearOn_Year (economicTerms) = False */ -func Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon: <"Qualifies a product as a Fixed-Float Inflation Swap with a single accrual period based on the economic terms and the following criteria: 1) An interest rate product with one fixed and one inflation rate leg and more than one payment, and 2) without cross-currency features."> +func Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon: <"Qualifies a product as a Fixed-Float Inflation Swap based on the economic terms and the following criteria: 1) An interest rate product with one fixed and one inflation rate leg, 2) where the fixed leg represents one singular payment agreed upon execution and to be made at maturity, 3) where the inflation leg features an inflation floating rate and 4) without cross-currency features."> [qualification Product] inputs: economicTerms EconomicTerms (1..1) @@ -1203,7 +1214,7 @@ func Qualify_InterestRate_InflationSwap_FixedFloat_ZeroCoupon: <"Qualifies a pro Qualify_BaseProduct_Inflation(economicTerms) = True and Qualify_BaseProduct_CrossCurrency(economicTerms) = False and Qualify_SubProduct_FixedFloat(economicTerms) = True - and Qualify_Transaction_ZeroCoupon(economicTerms) = True + and (Qualify_Transaction_ZeroCoupon(economicTerms) = True or Qualify_Transaction_ZeroCoupon_KnownAmount(economicTerms) = True) func Qualify_InterestRate_InflationSwap_Basis_YearOn_Year: <"Qualifies a product as a Basis (Float-Float) Annual Reset Inflation Swap based on the economic terms and the following criteria: 1) An interest rate product with one floating interest rate leg and one inflation rate leg and more than one payment, and 2) without cross-currency features or 'zero coupon' features."> [qualification Product] @@ -1219,7 +1230,7 @@ func Qualify_InterestRate_InflationSwap_Basis_YearOn_Year: <"Qualifies a product and Qualify_SubProduct_Basis(economicTerms) = True and Qualify_Transaction_YoY(economicTerms) = True -func Qualify_InterestRate_InflationSwap_Basis_ZeroCoupon: <"Qualifies a product as a Basis (Float-Float) Inflation Swap with a single accrual period based on the economic terms and the following criteria: 1) An interest rate product with one floating interest rate leg and one inflation rate leg and more than one payment, and 2) without cross-currency features or 'zero coupon' features."> +func Qualify_InterestRate_InflationSwap_Basis_ZeroCoupon: <"Qualifies a product as a Basis (Float-Float) Inflation Swap based on the economic terms and the following criteria: 1) An interest rate product with one floating interest rate leg and one inflation interest rate leg, 2) where the floating leg is not based on an OIS index, 3) where the inflation leg features an inflation floating rate, 4) where an interest rate payout is made at maturity into a singular payment and 5) without cross-currency features."> [qualification Product] inputs: economicTerms EconomicTerms (1..1)