The Tangilla migration process is essentally an Extraction, Transformation and Load (ETL) from legacy system/s to Tangilla.
The Migration Specification seeks to standardize the data inputs required for the ETL to ensure an orderly transition.
The specfications noted below may be augmented with additional requirements specific to the AMS/MLS/Key Services provider along with any other services that may be subscribed to by association members/subscribers.
Export Files should ideally be available daily during the migration period. Tangilla can pick up via FTP, or provide a drop location.
Files should be named [association_code]_[element_name].csv eg: 1234_person.csv.
|) preferred : Avoids common issues with poorly escaped CSV's.Migration to Tangilla requires data relating to the following elements.
Person record in Tangilla.Relationship record.Relationship is the intersection of a Person, an Office and a Role. A 'Relationship' may be related to an IdP User Record.Subscription records belong to a Relationship. A Subscription record in Tangilla may be :
Subscription, represented by a Member or Member Supplemental Record in NRDS/M1SubscriptionSubscriptionSubscription Records (as may be used by an Association or MLS)Office Records in Tangilla are represented by an Office (or Office Supplemental) record in NRDS/M1The Available (and required) fields for each element is described below.
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| first_name+ | string(50) | First Name of the person. May be taken from NRDS.member.MemberFirstName | yes: memberfirstname |
| middle_name | string(80) | Middle Name/s of the person. May be taken from NRDS.member.MemberMiddleName | yes: membermiddlename |
| last_name+ | string(80) | Last Name of the person. May be taken from NRDS.member.MemberLastName | yes: memberlastname |
| generation_name | string(5) | Generation name of the person (eg Jr.) May be taken from NRDS.member.MemberGeneration | yes: membernamesuffix |
| full_name | string(255) | Full Name of the person. Can be determined based on a combination of other fields provided | yes: memberfullname |
| preferred_name | string(50) | Last Name of the person. May be taken from NRDS.member.MemberNickname | yes: membernickname |
| email+ | string(255) | Email address for the person. May be taken from NRDS.member.Email | yes: memberemail |
| mobile+ | integer(10) | Mobile/Cell number for the person. May be taken from NRDS.member.MemberCellPhone | yes: membermobilephone |
| member_nrds_id | integer(9) | Member NRDS ID. Taken from NRDS.member.MemberId. Must be provided for any person with a NRDS record. | yes: membernationalassociationid |
| drivers_license_number | string(20) | Drivers License Number | no |
| drivers_license_state | string(2) | Drivers License State | no |
| rpac_optout | tinyint(1) | Flag to indicate if this person is not to be prompted for RPAC contributions | no |
| tax_exempt | tinyint(1) | Flag to indicate if this person is exempt from Sales Tax | no |
| legacy_id+ | string(50) | The unique identifier for this person in the source system. | yes: sourcesystemid (member) |
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| legacy_id+ | string(50) | The unique identifier for this person in the source system. | yes: sourcesystemid (member) |
| role_code+ | string(4) | This is typically a billing code that defines the type of Relationship. | no |
| status+ | enumeration | Status of the Relationship (active |
inactive) |
| legacy_office_id+ | string(50) | The unique identifier for this office in the source system. | yes: sourcesystemid (office) |
| license_number | string(50) | License Number relatvie to this Relationship, required for Roles that require a License (eg a REALTOR® role) | yes: MemberStateLicense |
| license_state | string(2) | License Number relatvie to this Relationship. Required when License number is provided. | yes: MemberStateLicenseState |
| idp_user_name | string(255) | The unique username in the IDP for this Person, in this Office (may be case sensitive downstream) |
no |
| user_class_override | enumeration | Does this Relationship receive additional subscription level access granted by their Broker default: None, options Office, Group |
no |
| broker_delegate | tinyint(1) | Flag to indicate if this Relationship has been delegated broker portal access and privilages by the Broker of this office. default: 0 |
no |
| field required(+) | type | description |
|---|---|---|
| idp_user_name+ | string(50) | The unique username in the IdP for this user |
| first_name+ | string(255) | The first name of the IdP user. |
| last_name+ | string(255) | The first name of the IdP user. |
| email_address+ | string(255) | The email address associated with this IdP User. This is validated upon user activation. |
| mobile | string(255) | The mobile phone number associated with this IdP User. This is validated upon user activation. |
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| legacy_id+ | string(50) | The unique identifier for this person in the source system. | yes: sourcesystemid (member) |
| product_type+ | string(4) | Defines the billing code/type for the NRDS subscription | no |
| idp_user_name+ | string(50) | idp_user_name for the Relationship for this Subscription |
no |
| status+ | string(50) | default: active | no |
| legacy_office_id+ | string(50) | The unique identifier for the office for this subscription in the source system | yes: sourcesystemid (office) |
| member_nrds_id+ | int(9) | Member NRDS ID. | yes: membernationalassociationid |
| paid_until+ | date | the date that this subscription is paid until YYYY-MM-DD | no |
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| legacy_id+ | string(50) | The unique identifier for this person in the source system. | yes: sourcesystemid (member) |
| product_type+ | string(25) | Defines the billing type/code (mls_security_class) and access that this MLS subscription provides | yes: membermlssecurityclass |
| idp_user_name+ | string(50) | idp_user_name for the Relationship for this Subscription |
no |
| mls_user_id+ | string(50) | Identifies the user in the MLS. Must match idp_user_name. |
no |
| mls_office_id++ | string(50) | Identifies the office in the MLS. Either this OR legacy_office_id must be provided. | no |
| status+ | string(50) | default: active | no |
| legacy_office_id++ | string(50) | The unique identifier for the office for this subscription in the source system | yes: sourcesystemid (office) |
| string(255) | Email address for this subscription. Defaults to person.email if not provided. |
yes: memberemail |
|
| mobile | integer(10) | Mobile/Cell number for this subscription. Defaults to person.mobile if not provided. |
yes: yes: membermobilephone |
| website | string(255) | Website for this subscription. Defaults to nrds.office.website if not provided. |
no |
| paid_until+ | date | the date that this subscription is paid until YYYY-MM-DD | no |
Other fields may be required/supplied depending on your provider
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| legacy_id+ | string(50) | The unique identifier for this person in the source system. | yes: sourcesystemid (member) |
| idp_user_name+ | string(50) | idp_user_name for the Relationship for this Subscription |
no |
| key_service_login+ | string(50) | user_name/identifier specific to the service | no |
| product_type+ | string(50) | defines the billing type/code and product type for this subscription | no |
| status+ | string(50) | default: active | no |
| legacy_office_id+ | string(50) | The unique identifier for the office for this subscription in the source system | yes: sourcesystemid (office) |
| string(255) | Email address for this subscription. Defaults to person.email if not provided. |
yes: memberemail |
|
| mobile | integer(10) | Mobile/Cell number for this subscription. Defaults to person.mobile if not provided. |
yes: yes: membermobilephone |
| key_serial | string(100) | KeySerial for this subscription | no |
| pin | string(10) | PIN for this KeySerial | no |
| paid_until+ | date | the date that this subscription is paid until YYYY-MM-DD | no |
Other fields may be required/supplied depending on your provider
Defined as required
| field required(+) | type | description | reso defined? |
|---|---|---|---|
| legacy_office_id+ | string(50) | The unique identifier for this office in the source system. | yes: sourcesystemid (office) |
| office_nrds_id+ | int(9) | The id for the office in NRDS/M1 | no |
| mls_office_id | string(50) | ID for this office in the MLS | no |
| lockbox_office_id | string(50) | ID for this office in the KeyService | no |
| idx_optin+ | tinyint(1) | IDX Syndication Flag for this office | no |
| reso_office_type+ | string(50) | RESO Office Type for this office | yes: officetype |
| corporate_license | string(50) | Corporate License Number for this Office | yes: OfficeCorporateLicense |
| corporate_licensee | string(255) | Corporate Licensee for this Office | no |
| main_office_id | int(9) | Main Office ID for a Branch Office. Required if office is Brancg default: null |
no |
| lfro_office | tinyint(1) | Flag to indicate if this is an LFRO Office. default: 0 |
no |
Batch output of NRDS data from M1. This is a standard format and is obtained via the M1 access for the Association.