From 1fe81f10b093f0bb369948e92d230544e69afec1 Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Fri, 14 Nov 2025 12:12:08 +0000 Subject: [PATCH 1/7] Legaldocumentation - Enhance the Umbrella functionality within the Legaldocumentation section of the CDM. --- .../legaldocumentation-common-enum.rosetta | 10 ++++++++ .../legaldocumentation-common-type.rosetta | 23 +++++++++++++------ .../rosetta/mapping-createiq-synonym.rosetta | 2 -- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta index 647583274c..b68fcee008 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta @@ -280,3 +280,13 @@ enum TerminationCurrencyConditionEnum: FreelyAvailable <"A currency that is freely available."> PaymentsDueAndFreelyAvailable <"A currency in which payments would be due under one or more Transactions and that is freely available."> Specified <"Termination Currency Conditions are specified."> + +enum UmbrellaPartyRoleEnum: + Agent <"Represents a Legal Entity who has authority to negotiate, execute and deliver confirmations on behalf of each affiliate that is linked to the Agent."> + InvestmentManager <"Represents a Legal Entity who has been authorised to act as a centralised authority empowered to negotiate, execute and manage derivative transactions on behalf of multiple affiliated funds or accounts."> + Principal <"Represents a Legal Entity that enters into and assumes direct responsibility for derivative transactions."> + Sub Account <"Represents an individual trading entity, fund, portfolio or managed account associated to a principal, Investment Manager or Agent LEgal Entity."> + Sleeve <"Represents a distinct trading strategy, portfolio, or sub account amanged within a broader legal entity or fund. It is not a legal party to the agreement."> + + + diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index ce2f461090..e6f275815c 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -155,16 +155,25 @@ type AgreementName: <"Specifies the agreement name through an agreement type and type UmbrellaAgreement: <"A class to specify a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement. This data representation reflects the ISDA Create representation."> - isApplicable boolean (1..1) <"The determination of whether Umbrella Agreement terms are Applicable (True), or Not Applicable (False)"> - language string (0..1) <"The language associated with the umbrella agreement, and which applies to all the parties to the umbrella agreement."> - parties UmbrellaAgreementEntity (0..*) <"Underlying principals to the umbrella agreement."> + agreementSet UmbrellaAgreementSet (1..*) <"The language associated with the umbrella agreement, and which applies to all the parties to the umbrella agreement."> + parties UmbrellaAgreementEntity (2..*) <"Underlying principals to the umbrella agreement."> + language string (0..1) <"Represents any bespoke language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> - condition UmbrellaAgreementExists: <"Umbrella Agreement language and parties should not exist when Umbrella Agreement terms are Not Applicable."> - if isApplicable = True then language exists and parties exists +type UmbrellaAgreementEntity extends Counterparty: <"A class to specify the legal entities that are part of the umbrella agreement."> + umbrellapartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> + parentparty Parentparty (0..1) -type UmbrellaAgreementEntity extends LegalEntity: <"A class to specify the legal entities that are part of the umbrella agreement."> + condition Parentparty: <"Identifies where a parent child relationship exists between two parties to the Umbrella agreement, allowing none legal entities to be linked to the appropriate legal entity and allowing funds, protfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> + if umbrellapartyrole = UmbrellaPartyRoleEnum -> Sleeve then parentparty exists + or + if umbrellapartyrole = UmbrellaPartyRoleEnum -> Agent then parentparty is absent - terms string (0..1) <"The terms that might be associated with each party to the umbrella agreement."> +type Parentparty: <"A class to specify the heirarchical structure of the entity relationships within the Umbrella agreement."> + parentIdentifier string (0..1) <"Represents the Entity Identifier of the parent entity on this agreement for the party defined."> + +type UmbrellaAgreementSet: <"Represents the groups of agreement term elections that exist within the agreement and to which entities that particular group of elections apply. Where all entities under the umbrella have the same set of elections only one agreement set will exist. At least one agreement set must be defined for an Umbrella agreement"> + agreement Agreement (1..1) <"Specification of the standard set of terms that define a legal agreement."> + partyId PartyIdentifier (1..*) <"The identifier associated with a party, e.g. the 20 digits LEI code."> type AddressForNotices: <"Specification of the address and other details for notices."> primaryNotices ContactElection (1..1) <"Specification of primary notice details"> diff --git a/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta b/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta index 3bf95166d0..13280e47d7 100644 --- a/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta +++ b/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta @@ -715,8 +715,6 @@ synonym source CreateiQ_1_0 extends CreateiQ [value "documentType"] UmbrellaAgreement: - + isApplicable - [set to True when "is_applicable" = "applicable" , set to False when "is_applicable" = "not_applicable"] + language [value "language" maps 2 removeHtml] + parties From 30185efe6b2fd8f551c34f8e628c8ed0ea020321 Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Mon, 1 Dec 2025 15:45:56 +0000 Subject: [PATCH 2/7] Revisions to the Umbrella functionality Contribution to reflect the comments received to the orig... --- .../legaldocumentation-common-enum.rosetta | 16 ++++++++---- .../legaldocumentation-common-type.rosetta | 26 ++++++++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta index b68fcee008..cdcdb1ee86 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta @@ -283,10 +283,16 @@ enum TerminationCurrencyConditionEnum: enum UmbrellaPartyRoleEnum: Agent <"Represents a Legal Entity who has authority to negotiate, execute and deliver confirmations on behalf of each affiliate that is linked to the Agent."> - InvestmentManager <"Represents a Legal Entity who has been authorised to act as a centralised authority empowered to negotiate, execute and manage derivative transactions on behalf of multiple affiliated funds or accounts."> - Principal <"Represents a Legal Entity that enters into and assumes direct responsibility for derivative transactions."> - Sub Account <"Represents an individual trading entity, fund, portfolio or managed account associated to a principal, Investment Manager or Agent LEgal Entity."> - Sleeve <"Represents a distinct trading strategy, portfolio, or sub account amanged within a broader legal entity or fund. It is not a legal party to the agreement."> - + InvestmentManager <"Represents a Legal Entity who has been authorised to act as a centralised authority empowered to negotiate, execute and manage transactions on behalf of multiple affiliated funds or accounts."> + Principal <"Represents a Legal Entity that enters into and assumes direct responsibility for transactions."> + SubAccount <"Represents an individual trading entity, fund, portfolio or managed account associated to a principal, Investment Manager or Agent Legal Entity."> + Sleeve <"Represents a distinct trading strategy, portfolio, or sub account managed within a broader legal entity or fund. It is not a legal party to the agreement."> +enum AmendmentPurposeEnum: + AmendTerms <"Amendment of Legal Agreement Terms"> + AmendEntities <"Add, Remove or Amend Legal Entities to the agreement"> + AmendandRestate <"Amend terms and restate the legal agreement elections"> + Novation <"Novate trades from existing agreement to alternative agreement"> + Superseding <"Terminate existing agreement and define new agreement as superseding original agreement"> + Termination <"Termination of existing agreement"> diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index e6f275815c..ee1d24ed33 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -63,14 +63,20 @@ type AgreementTerms: <"Specification of the content of a legal agreement."> clauseLibrary boolean (0..1) <"Specification of whether the agreement terms have been negotiated using the clause library methodology."> counterparty Counterparty (2..2) <"Specification of the roles of the counterparties to the agreement."> +type AmendmentTerms: <"Represents the purpose and terms associated with an Amendment document"> + purpose AmendmentPurposeEnum (1..*) <"Purpose of the amendment"> + impactedAgreements LegalAgreementBase (0..*) <"Test"> + agreementTerms AgreementTerms (0..*) <"Test"> + type LegalAgreement extends LegalAgreementBase: <"The specification of a legal agreement between two parties, being negotiated or having been executed. This includes the baseline information and the optional specialised elections"> [metadata key] [rootType] agreementTerms AgreementTerms (0..1) <"Specification of the content of the legal agreement."> relatedAgreements LegalAgreement (0..*) <"Specifies the agreement(s) that govern the agreement, either as a reference to such agreements when specified as part of the CDM, or through identification of some of the key terms of those agreements, such as the type of agreement, the publisher, the vintage, the agreement identifier and the agreement date."> + amendment AmendmentTerms (0..*) <"Represents the legal purpose of an amendment document and the Legal agreements which are impacted by the amendment"> umbrellaAgreement UmbrellaAgreement (0..1) <"The determination of whether Umbrella Agreement terms are applicable (True) or Not Applicable (False)."> - + condition ConsistentlyExecutedAgreements: <"An executed agreement can only point to executed related agreements if any."> if relatedAgreements exists and agreementDate exists then relatedAgreements -> agreementDate exists @@ -153,22 +159,22 @@ type AgreementName: <"Specifies the agreement name through an agreement type and if creditSupportAgreementMarginType exists then creditSupportAgreementType exists -type UmbrellaAgreement: <"A class to specify a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement. This data representation reflects the ISDA Create representation."> +type UmbrellaAgreement: <"Specifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> agreementSet UmbrellaAgreementSet (1..*) <"The language associated with the umbrella agreement, and which applies to all the parties to the umbrella agreement."> - parties UmbrellaAgreementEntity (2..*) <"Underlying principals to the umbrella agreement."> - language string (0..1) <"Represents any bespoke language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> + parties UmbrellaAgreementEntity (2..*) <"Specifies the underlying entities to the agreement that either act as legal parties to the agreement or represent Legal constructs that are managed by a party to the agreement but do not represent a Legal Entity as of themselves."> + language string (0..1) <"Represents any additional language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> type UmbrellaAgreementEntity extends Counterparty: <"A class to specify the legal entities that are part of the umbrella agreement."> - umbrellapartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> - parentparty Parentparty (0..1) + umbrellaPartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> + parentParty Parentparty (0..1) <"Represents the identification of a parent child relationship between two entities in the Umbrella agreement, allowing non-legal entities to be linked to the appropriate legal entity and allowing funds, portfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> condition Parentparty: <"Identifies where a parent child relationship exists between two parties to the Umbrella agreement, allowing none legal entities to be linked to the appropriate legal entity and allowing funds, protfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> - if umbrellapartyrole = UmbrellaPartyRoleEnum -> Sleeve then parentparty exists - or - if umbrellapartyrole = UmbrellaPartyRoleEnum -> Agent then parentparty is absent + if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Sleeve then parentParty exists + or + if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Agent then parentParty is absent -type Parentparty: <"A class to specify the heirarchical structure of the entity relationships within the Umbrella agreement."> +type Parentparty: <"A class to specify the hierarchical structure of the entity relationships within the Umbrella agreement."> parentIdentifier string (0..1) <"Represents the Entity Identifier of the parent entity on this agreement for the party defined."> type UmbrellaAgreementSet: <"Represents the groups of agreement term elections that exist within the agreement and to which entities that particular group of elections apply. Where all entities under the umbrella have the same set of elections only one agreement set will exist. At least one agreement set must be defined for an Umbrella agreement"> From f8817d17d6ce7fd9edb1d0efd5b31fdd5b1853af Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Tue, 2 Dec 2025 14:15:39 +0000 Subject: [PATCH 3/7] Updated contribution to remove some types that had been added for Amendments but are not ready to... --- .../main/rosetta/legaldocumentation-common-enum.rosetta | 8 -------- .../main/rosetta/legaldocumentation-common-type.rosetta | 6 ------ 2 files changed, 14 deletions(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta index cdcdb1ee86..5b6f544aff 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-enum.rosetta @@ -287,12 +287,4 @@ enum UmbrellaPartyRoleEnum: Principal <"Represents a Legal Entity that enters into and assumes direct responsibility for transactions."> SubAccount <"Represents an individual trading entity, fund, portfolio or managed account associated to a principal, Investment Manager or Agent Legal Entity."> Sleeve <"Represents a distinct trading strategy, portfolio, or sub account managed within a broader legal entity or fund. It is not a legal party to the agreement."> -enum AmendmentPurposeEnum: - AmendTerms <"Amendment of Legal Agreement Terms"> - AmendEntities <"Add, Remove or Amend Legal Entities to the agreement"> - AmendandRestate <"Amend terms and restate the legal agreement elections"> - Novation <"Novate trades from existing agreement to alternative agreement"> - Superseding <"Terminate existing agreement and define new agreement as superseding original agreement"> - Termination <"Termination of existing agreement"> - diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index ee1d24ed33..90b1f592f6 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -63,18 +63,12 @@ type AgreementTerms: <"Specification of the content of a legal agreement."> clauseLibrary boolean (0..1) <"Specification of whether the agreement terms have been negotiated using the clause library methodology."> counterparty Counterparty (2..2) <"Specification of the roles of the counterparties to the agreement."> -type AmendmentTerms: <"Represents the purpose and terms associated with an Amendment document"> - purpose AmendmentPurposeEnum (1..*) <"Purpose of the amendment"> - impactedAgreements LegalAgreementBase (0..*) <"Test"> - agreementTerms AgreementTerms (0..*) <"Test"> - type LegalAgreement extends LegalAgreementBase: <"The specification of a legal agreement between two parties, being negotiated or having been executed. This includes the baseline information and the optional specialised elections"> [metadata key] [rootType] agreementTerms AgreementTerms (0..1) <"Specification of the content of the legal agreement."> relatedAgreements LegalAgreement (0..*) <"Specifies the agreement(s) that govern the agreement, either as a reference to such agreements when specified as part of the CDM, or through identification of some of the key terms of those agreements, such as the type of agreement, the publisher, the vintage, the agreement identifier and the agreement date."> - amendment AmendmentTerms (0..*) <"Represents the legal purpose of an amendment document and the Legal agreements which are impacted by the amendment"> umbrellaAgreement UmbrellaAgreement (0..1) <"The determination of whether Umbrella Agreement terms are applicable (True) or Not Applicable (False)."> condition ConsistentlyExecutedAgreements: <"An executed agreement can only point to executed related agreements if any."> From 93a46d0a67d9a2c9f0efcbed4c11b2463a3b955e Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Fri, 5 Dec 2025 17:14:25 +0000 Subject: [PATCH 4/7] Contribution amended after discussions regarding LegalEntityIdentifier and PartyIdentifier planne... --- .../legaldocumentation-common-type.rosetta | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index 90b1f592f6..67d9e18b41 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -69,7 +69,7 @@ type LegalAgreement extends LegalAgreementBase: <"The specification of a legal a agreementTerms AgreementTerms (0..1) <"Specification of the content of the legal agreement."> relatedAgreements LegalAgreement (0..*) <"Specifies the agreement(s) that govern the agreement, either as a reference to such agreements when specified as part of the CDM, or through identification of some of the key terms of those agreements, such as the type of agreement, the publisher, the vintage, the agreement identifier and the agreement date."> - umbrellaAgreement UmbrellaAgreement (0..1) <"The determination of whether Umbrella Agreement terms are applicable (True) or Not Applicable (False)."> + umbrellaAgreement UmbrellaAgreement (0..1) <"TSpecifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> condition ConsistentlyExecutedAgreements: <"An executed agreement can only point to executed related agreements if any."> if relatedAgreements exists and agreementDate exists @@ -156,20 +156,27 @@ type AgreementName: <"Specifies the agreement name through an agreement type and type UmbrellaAgreement: <"Specifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> agreementSet UmbrellaAgreementSet (1..*) <"The language associated with the umbrella agreement, and which applies to all the parties to the umbrella agreement."> - parties UmbrellaAgreementEntity (2..*) <"Specifies the underlying entities to the agreement that either act as legal parties to the agreement or represent Legal constructs that are managed by a party to the agreement but do not represent a Legal Entity as of themselves."> + parties UmbrellaAgreementEntity (2..*) <"Specifies the underlying entities to the agreement that either act as legal parties to the agreement or represent legal constructs that are managed by a party to the agreement but do not represent a Legal Entity as of themselves."> language string (0..1) <"Represents any additional language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> -type UmbrellaAgreementEntity extends Counterparty: <"A class to specify the legal entities that are part of the umbrella agreement."> +type UmbrellaAgreementEntity extends Counterparty: <"Specifies the entities that are part of the umbrella agreement."> umbrellaPartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> - parentParty Parentparty (0..1) <"Represents the identification of a parent child relationship between two entities in the Umbrella agreement, allowing non-legal entities to be linked to the appropriate legal entity and allowing funds, portfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> + nonLegalEntityIdentifier string (0..1) <"Specifies the unique identifier value for a non legal entity such as a sleeve, or sub account, that is a party to the agreement and has a relationship with a legal entity defined on the agreement."> + nonLegalEntityIdentifierType string (0..1) <"Specifies the Identifier type for a non Legal entity to the agreement, for example the use of an alert code to uniquely identify a non Legal entity."> + parentParty ParentParty (0..1) <"Represents the identification of a parent child relationship between two entities in the Umbrella agreement, allowing non-legal entities to be linked to the appropriate legal entity and allowing funds, portfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> + + condition NonLegalEntityIdentifier: <"If nonLegalIdentifier string is specified then nonLegalEntityIdentifierType must be specified"> + if nonLegalEntityIdentifier exists then nonLegalEntityIdentifierType exists + or + if nonLegalEntityIdentifier is absent then nonLegalEntityIdentifierType is absent - condition Parentparty: <"Identifies where a parent child relationship exists between two parties to the Umbrella agreement, allowing none legal entities to be linked to the appropriate legal entity and allowing funds, protfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> + condition ParentParty: <"Identifies where a parent child relationship exists between two parties to the Umbrella agreement, allowing none legal entities to be linked to the appropriate legal entity and allowing funds, protfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Sleeve then parentParty exists or if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Agent then parentParty is absent -type Parentparty: <"A class to specify the hierarchical structure of the entity relationships within the Umbrella agreement."> - parentIdentifier string (0..1) <"Represents the Entity Identifier of the parent entity on this agreement for the party defined."> +type ParentParty: <"Specifies the hierarchical structure of the entity relationships within the Umbrella agreement."> + parentIdentifier LegalEntity (0..1) <"Represents the Entity Identifier of the parent entity on this agreement for the party defined."> type UmbrellaAgreementSet: <"Represents the groups of agreement term elections that exist within the agreement and to which entities that particular group of elections apply. Where all entities under the umbrella have the same set of elections only one agreement set will exist. At least one agreement set must be defined for an Umbrella agreement"> agreement Agreement (1..1) <"Specification of the standard set of terms that define a legal agreement."> From 50e804297fbb402cd77a38a827b3947de107b1a2 Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Wed, 17 Dec 2025 16:04:19 +0000 Subject: [PATCH 5/7] Contribution updated to reflect comments received on the original contribution --- .../legaldocumentation-common-type.rosetta | 42 ++++++++++--------- .../rosetta/mapping-createiq-synonym.rosetta | 6 +-- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index aec54f7346..0c9e2a0daa 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -153,34 +153,36 @@ type AgreementName: <"Specifies the agreement name through an agreement type and if creditSupportAgreementMarginType exists then creditSupportAgreementType exists -type UmbrellaAgreement: <"Specifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> - +type UmbrellaAgreement: <"Specifies a set of parties which are part of a legal agreement beyond the two contracting parties to that agreement."> agreementSet UmbrellaAgreementSet (1..*) <"The language associated with the umbrella agreement, and which applies to all the parties to the umbrella agreement."> - parties UmbrellaAgreementEntity (2..*) <"Specifies the underlying entities to the agreement that either act as legal parties to the agreement or represent legal constructs that are managed by a party to the agreement but do not represent a Legal Entity as of themselves."> - language string (0..1) <"Represents any additional language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> - -type UmbrellaAgreementEntity extends Counterparty: <"Specifies the entities that are part of the umbrella agreement."> - umbrellaPartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> - nonLegalEntityIdentifier string (0..1) <"Specifies the unique identifier value for a non legal entity such as a sleeve, or sub account, that is a party to the agreement and has a relationship with a legal entity defined on the agreement."> - nonLegalEntityIdentifierType string (0..1) <"Specifies the Identifier type for a non Legal entity to the agreement, for example the use of an alert code to uniquely identify a non Legal entity."> - parentParty ParentParty (0..1) <"Represents the identification of a parent child relationship between two entities in the Umbrella agreement, allowing non-legal entities to be linked to the appropriate legal entity and allowing funds, portfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> - condition NonLegalEntityIdentifier: <"If nonLegalIdentifier string is specified then nonLegalEntityIdentifierType must be specified"> - if nonLegalEntityIdentifier exists then nonLegalEntityIdentifierType exists - or - if nonLegalEntityIdentifier is absent then nonLegalEntityIdentifierType is absent +type UmbrellaAgreementParty: <"Specifies the entities that are part of the umbrella agreement."> + party Party (0..1) <"Specifies the party to the umbrella agreement"> + actingAs CounterpartyRoleEnum (0..1) <"Specifies the CounterpartyRoleEnum, e.g. either Party1 or Party2, that is associated to the party."> + umbrellaPartyrole UmbrellaPartyRoleEnum (0..1) <"Represents the legal role that each defined entity to the agreement performs within the structure of that agreement."> + nonLegalEntity NonLegalEntity (0..1) <"Specifies a non legal entity that exists in the agreement with a defined relationship to a Legal entity to the agreement."> + parentParty Party (0..1) <"Represents the identification of a parent child relationship between two entities in the Umbrella agreement, allowing non-legal entities to be linked to the appropriate legal entity and allowing funds, portfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> - condition ParentParty: <"Identifies where a parent child relationship exists between two parties to the Umbrella agreement, allowing none legal entities to be linked to the appropriate legal entity and allowing funds, protfolio or managed accounts to be linked to their applicable Investment Manager or Agent within the agreement."> + condition ParentParty: <"Specifies that certain defined roles require that a parent party is identified."> if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Sleeve then parentParty exists - or - if umbrellaPartyrole = UmbrellaPartyRoleEnum -> Agent then parentParty is absent -type ParentParty: <"Specifies the hierarchical structure of the entity relationships within the Umbrella agreement."> - parentIdentifier LegalEntity (0..1) <"Represents the Entity Identifier of the parent entity on this agreement for the party defined."> + condition UmbrellaParty: <"Only a Party or a Non Legal entity can be set."> + optional choice party,nonLegalEntity + + condition NonLegalEntityParent: <"Non Legal entity must have a Parent Party."> + if nonLegalEntity exists then parentParty exists + +type NonLegalEntity: <"Specifies a non legal entity that exists in the agreement with a defined relationship to a Legal entity to the agreement"> + identifier string (1..1) <"Specifies the unique identifier value for a non legal entity such as a sleeve, or sub account, that is a party to the agreement and has a relationship with a legal entity defined on the agreement."> + identifierType string (1..1) <"Specifies the Identifier type for a non Legal entity to the agreement, for example the use of an alert code to uniquely identify a non Legal entity."> type UmbrellaAgreementSet: <"Represents the groups of agreement term elections that exist within the agreement and to which entities that particular group of elections apply. Where all entities under the umbrella have the same set of elections only one agreement set will exist. At least one agreement set must be defined for an Umbrella agreement"> agreement Agreement (1..1) <"Specification of the standard set of terms that define a legal agreement."> - partyId PartyIdentifier (1..*) <"The identifier associated with a party, e.g. the 20 digits LEI code."> + umbrellaAgreementParty UmbrellaAgreementParty (2..*) <"Specifies the underlying parties to the agreement that either act as legal parties to the agreement or represent legal constructs that are managed by a party to the agreement but do not represent a Legal Entity as of themselves."> + additionalLanguage string (0..1) <"Represents any additional language that may need to be captured regarding the structure or application of terms that may exist for the agreement."> + + condition ExcludeGMSLA: <"Umbrella agreement fn=unctionality is not applicable to the GMSLA legal agreement type"> + agreement -> masterAgreementElections -> islaGmsla is absent type ContactInformationElection: <"Specifies the party reference and the associated contact information."> partyReference CounterpartyRoleEnum (1..1) <"The party to which the election and details apply."> diff --git a/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta b/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta index 33dee4c03c..dc0619a040 100644 --- a/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta +++ b/rosetta-source/src/main/rosetta/mapping-createiq-synonym.rosetta @@ -751,10 +751,10 @@ synonym source CreateiQ_1_0 extends CreateiQ + masterAgreementType [value "documentType"] - UmbrellaAgreement: - + language + UmbrellaAgreementSet: + + additionalLanguage [value "language" maps 2 removeHtml] - + parties + + umbrellaAgreementParty [value "principal_identification_schedule" mapper "UmbrellaAgreementEntity"] OtherAgreementTerms: From c78b8cb60a8586772d24df567a4ebb8eabc18460 Mon Sep 17 00:00:00 2001 From: Adrian Jenks Date: Thu, 18 Dec 2025 15:23:08 +0000 Subject: [PATCH 6/7] Updated description to remove a typo --- .../src/main/rosetta/legaldocumentation-common-type.rosetta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta index 0c9e2a0daa..daace8e683 100644 --- a/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta +++ b/rosetta-source/src/main/rosetta/legaldocumentation-common-type.rosetta @@ -69,7 +69,7 @@ type LegalAgreement extends LegalAgreementBase: <"The specification of a legal a agreementTerms AgreementTerms (0..1) <"Specification of the content of the legal agreement."> relatedAgreements LegalAgreement (0..*) <"Specifies the agreement(s) that govern the agreement, either as a reference to such agreements when specified as part of the CDM, or through identification of some of the key terms of those agreements, such as the type of agreement, the publisher, the vintage, the agreement identifier and the agreement date."> - umbrellaAgreement UmbrellaAgreement (0..1) <"TSpecifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> + umbrellaAgreement UmbrellaAgreement (0..1) <"Specifies a set of legal entities which are part of a legal agreement beyond the two contracting parties to that agreement."> condition ConsistentlyExecutedAgreements: <"An executed agreement can only point to executed related agreements if any."> if relatedAgreements exists and agreementDate exists From 2c07e68af9023de8a88f0b3e6968dbb1611b4d82 Mon Sep 17 00:00:00 2001 From: Chuks-Ajeh Date: Thu, 18 Dec 2025 23:55:33 +0000 Subject: [PATCH 7/7] updated mappers and updated documentation --- docs/legal-agreements.md | 20 +++- ...brellaAgreementEntityMappingProcessor.java | 59 ------------ .../UmbrellaAgreementSetMappingProcessor.java | 92 +++++++++++++++++++ 3 files changed, 109 insertions(+), 62 deletions(-) delete mode 100644 rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementEntityMappingProcessor.java create mode 100644 rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementSetMappingProcessor.java diff --git a/docs/legal-agreements.md b/docs/legal-agreements.md index 93476f669c..74e21503df 100644 --- a/docs/legal-agreements.md +++ b/docs/legal-agreements.md @@ -308,9 +308,23 @@ The below snippet represents the `UmbrellaAgreement` data type. ``` Haskell type UmbrellaAgreement: - isApplicable boolean (1..1) - language string (0..1) - parties UmbrellaAgreementEntity (0..*) + agreementSet UmbrellaAgreementSet (1..*) +``` + + +### Umbrella Agreement Set + +`UmbrellaAgreementSet` is a data type used to specify the applicability of +Umbrella Agreement terms, relevant specific language, and underlying +entities associated with the umbrella agreement. + +The below snippet represents the `UmbrellaAgreementSet` data type. + +``` Haskell +type UmbrellaAgreementSet: + agreement Agreement (1..1) + umbrellaAgreementParty UmbrellaAgreementParty (2..*) + additionalLanguage string (0..1) ``` ### Agreement Content diff --git a/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementEntityMappingProcessor.java b/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementEntityMappingProcessor.java deleted file mode 100644 index 65ab5f9815..0000000000 --- a/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementEntityMappingProcessor.java +++ /dev/null @@ -1,59 +0,0 @@ -package cdm.legaldocumentation.common.processor; - -import cdm.legaldocumentation.common.UmbrellaAgreement.UmbrellaAgreementBuilder; -import cdm.legaldocumentation.common.UmbrellaAgreementEntity; -import cdm.legaldocumentation.common.UmbrellaAgreementEntity.UmbrellaAgreementEntityBuilder; -import com.regnosys.rosetta.common.translation.MappingContext; -import com.regnosys.rosetta.common.translation.MappingProcessor; -import com.regnosys.rosetta.common.translation.Path; -import com.rosetta.model.lib.RosettaModelObjectBuilder; -import com.rosetta.model.lib.path.RosettaPath; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -import static org.isda.cdm.processor.CdmMappingProcessorUtils.removeHtml; -import static org.isda.cdm.processor.CdmMappingProcessorUtils.toFieldWithMetaString; - -/** - * CreateiQ mapping processor. - */ -@SuppressWarnings("unused") -public class UmbrellaAgreementEntityMappingProcessor extends MappingProcessor { - - public UmbrellaAgreementEntityMappingProcessor(RosettaPath modelPath, List synonymPaths, MappingContext mappingContext) { - super(modelPath, synonymPaths, mappingContext); - } - - @Override - public void map(Path synonymPath, List builder, RosettaModelObjectBuilder parent) { - UmbrellaAgreementBuilder umbrellaAgreementBuilder = (UmbrellaAgreementBuilder) parent; - umbrellaAgreementBuilder.setParties(new ArrayList<>()); - - int index = 0; - while (true) { - Optional umbrellaAgreementEntity = getUmbrellaAgreementEntity(synonymPath, index++); - if (umbrellaAgreementEntity.isPresent()) { - umbrellaAgreementBuilder.addParties(umbrellaAgreementEntity.get()); - } else { - break; - } - } - } - - private Optional getUmbrellaAgreementEntity(Path synonymPath, Integer index) { - UmbrellaAgreementEntityBuilder umbrellaAgreementEntityBuilder = UmbrellaAgreementEntity.builder(); - - setValueAndUpdateMappings(synonymPath.addElement("principal_name", index), - umbrellaAgreementEntityBuilder::setNameValue); - - setValueAndUpdateMappings(synonymPath.addElement("lei", index), - value -> umbrellaAgreementEntityBuilder.addEntityId(toFieldWithMetaString(value))); - - setValueAndUpdateMappings(synonymPath.addElement("additional", index), - value -> umbrellaAgreementEntityBuilder.setTerms(removeHtml(value))); - - return umbrellaAgreementEntityBuilder.hasData() ? Optional.of(umbrellaAgreementEntityBuilder.build()) : Optional.empty(); - } -} \ No newline at end of file diff --git a/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementSetMappingProcessor.java b/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementSetMappingProcessor.java new file mode 100644 index 0000000000..4d5e86fa7c --- /dev/null +++ b/rosetta-source/src/main/java/cdm/legaldocumentation/common/processor/UmbrellaAgreementSetMappingProcessor.java @@ -0,0 +1,92 @@ +package cdm.legaldocumentation.common.processor; + +import cdm.legaldocumentation.common.Agreement; +import cdm.legaldocumentation.common.UmbrellaAgreement.UmbrellaAgreementBuilder; +import cdm.legaldocumentation.common.UmbrellaAgreementParty; +import cdm.legaldocumentation.common.UmbrellaAgreementSet; +import com.regnosys.rosetta.common.translation.MappingContext; +import com.regnosys.rosetta.common.translation.MappingProcessor; +import com.regnosys.rosetta.common.translation.Path; +import com.rosetta.model.lib.RosettaModelObjectBuilder; +import com.rosetta.model.lib.path.RosettaPath; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.isda.cdm.processor.CdmMappingProcessorUtils.removeHtml; + +/** + * CreateiQ mapping processor. + */ +@SuppressWarnings("unused") +public class UmbrellaAgreementSetMappingProcessor extends MappingProcessor { + + public UmbrellaAgreementSetMappingProcessor(RosettaPath modelPath, List synonymPaths, MappingContext mappingContext) { + super(modelPath, synonymPaths, mappingContext); + } + + @Override + public void map(Path synonymPath, List builder, RosettaModelObjectBuilder parent) { + UmbrellaAgreementBuilder umbrellaAgreementBuilder = (UmbrellaAgreementBuilder) parent; + umbrellaAgreementBuilder.setAgreementSet(new ArrayList<>()); + + int index = 0; + while (true) { + //We want to construct an agreementSet that holds party: + //party is part of umbrellaAgreementParty + Optional umbrellaAgreementSet = getUmbrellaAgreementSet(synonymPath, index++); + if (umbrellaAgreementSet.isPresent()) { + umbrellaAgreementBuilder.addAgreementSet(umbrellaAgreementSet.get()); + } else { + break; + } + } + } + + //TODO: finish building the mapper: + private Optional getUmbrellaAgreementSet(Path synonymPath, Integer index) { + UmbrellaAgreementSet.UmbrellaAgreementSetBuilder umbrellaAgreementSetBuilder = UmbrellaAgreementSet.builder(); + +// setValueAndUpdateMappings(synonymPath.addElement("principal_name", index), +// umbrellaAgreementSetBuilder::setNameValue); +// +// setValueAndUpdateMappings(synonymPath.addElement("lei", index), +// value -> umbrellaAgreementSetBuilder.addEntityId(toFieldWithMetaString(value))); +// +// setValueAndUpdateMappings(synonymPath.addElement("additional", index), +// value -> umbrellaAgreementSetBuilder.setTerms(removeHtml(value))); + + //aggreement obj + Agreement agreement = getAgreement(synonymPath, index); + setValueAndUpdateMappings(synonymPath.addElement("agreement", index), + value -> umbrellaAgreementSetBuilder.setAgreement(agreement)); + + //UmbrellaAggreementParty + List parties = getUmbrellaAgreementParties(synonymPath, index); + setValueAndUpdateMappings(synonymPath.addElement("agreementParty", index), + value -> { + UmbrellaAgreementParty umbrellaAgreementParty = UmbrellaAgreementParty.builder().build(); + umbrellaAgreementSetBuilder.setUmbrellaAgreementParty(parties); + }); + + //additional_language + setValueAndUpdateMappings(synonymPath.addElement("additionallanguage", index), + value -> umbrellaAgreementSetBuilder.setAdditionalLanguage(removeHtml(value))); + + + return umbrellaAgreementSetBuilder.hasData() ? Optional.of(umbrellaAgreementSetBuilder.build()) : Optional.empty(); + } + + private Agreement getAgreement(Path synonymPath, Integer index) { + Agreement agreement = Agreement.builder().build(); + return Agreement.builder().build(); + } + + private List getUmbrellaAgreementParties(Path synonymPath, Integer index) { + List parties = new ArrayList<>(); + UmbrellaAgreementParty umbrellaAgreementParty = UmbrellaAgreementParty.builder().build(); + parties.add(umbrellaAgreementParty); + return parties; + } +} \ No newline at end of file