Introduce Account-level matching & mapping to allow supporting Account-level fields on PersonAccounts #269
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Introduction
This PR aims to introduce a new feature: Being able to match and map B2C customer profile attributes to Account-level fields from Core.
A bit of technical background: From the Core platform, a PersonAccount is a merge of both the Account and the Contact records. This means that a given PersonAccount record may have Account-level fields, and Contact-level fields. Before this new feature, b2c-crm-sync was only relying on Contact-level fields to ensure the same codebase between the Account-Contact model and the PersonAccount model.
The issue with this logic is that when a business requirement is to create a given field at Account level because it makes more sense, but the data has to be mapped from B2C Commerce, b2c-crm-sync was unable to make it working properly in a standard way. In order to make it work, we would have to duplicate the field at the Contact level and copy over the data between both Contact-level and Account-level fields in order for the data to transit from the Contact to the Account.
Now, b2c-crm-sync is able to get the account-level field from B2C Commerce, use it within the matching rule if needed, and also map it to the PersonAccount record that is being resolved by b2c-crm-sync.
Breaking changes
Changes have been made from within the root code of b2c-crm-sync to make this feature working for PersonAccounts only.
If you enable the PersonAccount model, then the code behaves in a way that
Unit Test Coverage
Same as before, we ensure the solution is 100% passing unit test with a coverage higher than the required 80% for Core and 100% unit test coverage for B2C.
![Screenshot 2024-05-14 at 6 37 58 PM](https://private-user-images.githubusercontent.com/155649993/330522359-682e2b12-30d1-4689-957a-47025535237c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzMwNTIyMzU5LTY4MmUyYjEyLTMwZDEtNDY4OS05NTdhLTQ3MDI1NTM1MjM3Yy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xMDI2MzgyZjA3MjQ3NDAxOTE1Yzk1YzgyYTEyOTM5OWE5N2IzOWRkY2NjZjY5ZGY2YTYwOTM1NTUxZDU3MzQ3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.UkwRi2xd0UWiXVLNm8UsEzLvfjUluaFIsLLwDFj4vOQ)
Use cases
Creation of the Account-level field
In order to make our use case working, we create an Account-level field:
![Screenshot 2024-04-19 at 10 10 34 AM](https://private-user-images.githubusercontent.com/155649993/323894927-54be8f0d-1477-4096-9102-ce2de1700ad8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0OTI3LTU0YmU4ZjBkLTE0NzctNDA5Ni05MTAyLWNlMmRlMTcwMGFkOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xZDYyOGY1YmMwMzhhMmVjMTk4OWM5ZTIzMDE4ZmQ5MDZkZWE1M2NlYWUzOTE5OGJkNjBmMjliZmIwYWFiNjliJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.sPFF7M0RbGDp8PHF8yStY98owGQE0Wv7ShHWGRQBvVQ)
Configuration of Integration Mapping
In order to make our use cases working, we create an integration mapping for an account-level mapping:
![Screenshot 2024-04-19 at 10 08 28 AM](https://private-user-images.githubusercontent.com/155649993/323894431-b4f513ed-b751-44d9-bd51-eb0eb13dc9cb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NDMxLWI0ZjUxM2VkLWI3NTEtNDRkOS1iZDUxLWViMGViMTNkYzljYi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03NDBhYjE4MTQzZDNkYzMzYTE3YjE4MTVjOGRlMDI5MTVmYmE1M2JlZjIwNGYzODk3MTI2NDY1MDYyZjdmMmU0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.IHZkLLc3kWIE2m2koJtIHkOPwWdk0VAxZGI4GW5U6fw)
![Screenshot 2024-04-19 at 10 08 38 AM](https://private-user-images.githubusercontent.com/155649993/323894444-b631227b-2e2a-4783-97ea-fd01c8d6942a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NDQ0LWI2MzEyMjdiLTJlMmEtNDc4My05N2VhLWZkMDFjOGQ2OTQyYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lN2Q4ZmYyZTdmMDAxYzVkOTk1M2I0NDdhOTk4OGE3OWEzY2JjYWE4MzI2NDM2NTRkNzJiYzczOTJjMjE2ZDk0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.MdJ06SrX4fMJ9UlWrZWGGpEFRII_Ls9qp4UfmrvT7Vw)
1 - Customer resolution (no existing customer in Core, so PersonAccount creation):
Creation of a brand new B2C customer profile, containing an account-level field:
![Screenshot 2024-04-19 at 10 10 12 AM](https://private-user-images.githubusercontent.com/155649993/323894592-546771db-d952-4e38-ac90-198c8e0bc2e6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NTkyLTU0Njc3MWRiLWQ5NTItNGUzOC1hYzkwLTE5OGM4ZTBiYzJlNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01MzhlNTA4NDRiZWFjYmJmYjg5YjRlMGVkMjlhZjZiZTljYmU5ZmY5Yjk0MTNmMjZkNzQ4OGFjN2M1ODNlNDJlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.wPZPuaHwQyd7LVJWK1yTgtiKxSYnb_b_TWQO0p0iW8Q)
The account is actually created within Core, including the account-level field:
![Screenshot 2024-04-19 at 10 22 58 AM](https://private-user-images.githubusercontent.com/155649993/323894968-37bb26fd-d017-4a71-9ff6-f0634e283897.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0OTY4LTM3YmIyNmZkLWQwMTctNGE3MS05ZmY2LWYwNjM0ZTI4Mzg5Ny5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04ZDMyMDFlMTVjNzM4ZTU5ZGY4MDE4NWJmYTA3ZWI2ZGQwZDI3OTFkODI1OTAxNzliYWI1NzQyNGYzZDcwMDJlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.XaB45FblkIE6ybhQcDO2SvXw4dxrRnpLuDWO5VZwkYk)
2 - Synching back customer data from Core to B2C
Modifying the Core PersonAccount record:
![Screenshot 2024-04-19 at 10 23 30 AM](https://private-user-images.githubusercontent.com/155649993/323895674-0a66dc3d-ea6d-400a-a390-8fdc5b3020f3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk1Njc0LTBhNjZkYzNkLWVhNmQtNDAwYS1hMzkwLThmZGM1YjMwMjBmMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xOThjNTc1YzY2MmY2MjdiNTI4ZmQ1ODkwYTI4OWYyZDE0MzNkMWNjMjlhNWFiZGE2YmNlYmRlNmRkMmMwYjVhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.RIYOd8M9htYDWlzB8PfNA61Ws3O0PZIwZvGb7Q_rhIg)
The B2C customer profile is modified, including the account-level field:
![Screenshot 2024-04-19 at 10 23 51 AM](https://private-user-images.githubusercontent.com/155649993/323895742-77fdf443-2b1b-408a-aefc-3693705c055b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk1NzQyLTc3ZmRmNDQzLTJiMWItNDA4YS1hZWZjLTM2OTM3MDVjMDU1Yi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00ZjVmZGZlZDY3MDcyYjgwOGNiMGYzNWM1YmI2ZGIwMTM2Y2NiNTk2NjlhNDUxODNkNTU2OTNkYzgzYzhlNTRlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.DjByUZ_eiw7hoNPnc4MAsLGXYlfiiWGDJqqBvCwdTVM)
3 - Customer resolution on an existing customer (removing the customer profile from b2c and creating it again, but leave the core profile as-is)
Creation of the B2C customer profile, containing the account-level field:
![Screenshot 2024-04-19 at 10 54 39 AM](https://private-user-images.githubusercontent.com/155649993/323896246-d2f7a7fe-2bea-4d59-af06-e4c2b221a108.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk2MjQ2LWQyZjdhN2ZlLTJiZWEtNGQ1OS1hZjA2LWU0YzJiMjIxYTEwOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNDU0OTBmZGNkYTUxYmRlM2ZiOTE4NGU4NjM5Njk2YjY3YWNkYzc5NDUwM2VjYzQ1NTliZWQ0MmNkY2ZmZDEyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.r5fGtRWVDl44sPNpt81wNjmPpU8ekWMwzLla_VLDW4o)
The existing Core PersonAccount is resolved and correctly mapped with both Contact-level and Account-level fields:
![Screenshot 2024-04-19 at 10 25 30 AM](https://private-user-images.githubusercontent.com/155649993/323896378-fdf77aa2-ef5b-4c2e-a2a9-f763d5655bca.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMTEsIm5iZiI6MTczOTE5MTAxMSwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk2Mzc4LWZkZjc3YWEyLWVmNWItNGMyZS1hMmE5LWY3NjNkNTY1NWJjYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMFQxMjM2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYzNlMGMzODBlZTRiMjIzMjU3NTMzMDA4NTI1NmU4NGRjOGNlMTM3MjljYjU2MzM1ZmQ3MjA4YTNlOGZhNDZmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.BQJV9RmQBdpQAYsxAU1KLnnBzAXZn9_V58g10bHcDcA)