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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzMwNTIyMzU5LTY4MmUyYjEyLTMwZDEtNDY4OS05NTdhLTQ3MDI1NTM1MjM3Yy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lMzEzYmUzMGJlMDVkNzYyZDNmOTExYWRlNDgzY2I0YTEwMjc1ZDc0ZTIzMzZmNTA3ZWNlOTYyZTU2MDBjMjlhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.lsNA8Le15ViLAaK73sCxXYpIvekB0zZ9glsiMpPBiS0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0OTI3LTU0YmU4ZjBkLTE0NzctNDA5Ni05MTAyLWNlMmRlMTcwMGFkOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01MjgwZDViZTIxZWM4OTU2NjVhYWFmYzg2NDBkNmZhZWYzYzk1NWVkNTAyOTM3ZTQwMzU0ZTRlM2Y1NDRlY2Q3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.hyHPIagVSBBRv2lRVsC0U3x7MyRPc-KfAm7xNlYdBOE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NDMxLWI0ZjUxM2VkLWI3NTEtNDRkOS1iZDUxLWViMGViMTNkYzljYi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01MjQ3ODU0ZDgzNzAyMjQwMThiYjJkZGQzNDU1MDNjMTUyYjdjZDA5OWUwMGQ3ZDZlNmI2ZjZjYTJjNmM4MmYyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.fRQvl0D2DwSsrYtEGAJdODpGD62p2DRNBunx-wlIVCE)
![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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NDQ0LWI2MzEyMjdiLTJlMmEtNDc4My05N2VhLWZkMDFjOGQ2OTQyYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wNmU3MjU5ZjUwNzA1NWE1M2Y2YWMxNjE3Yjk0ZTFjZTljZjBjMGRkYWNmNWM0Njc2YjQ2YjQzM2VkNGUyZTU0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.duSvN0C7q2U9PMuo_-lgtdegmsWvJY_G0VjrP78sUDk)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0NTkyLTU0Njc3MWRiLWQ5NTItNGUzOC1hYzkwLTE5OGM4ZTBiYzJlNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01NDExZWYyNzA0MDQ0MzhjNDIzYTRiYWY5OWY2NWZmOTFiNjg1ZDdkZTA5NjU4MzQzNGJhMjM5MDZhYmU4MWYxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.0xYR_yjm4PTvl0IyVPatEn4U4Cl2FX6L-8fJzNEo-eE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk0OTY4LTM3YmIyNmZkLWQwMTctNGE3MS05ZmY2LWYwNjM0ZTI4Mzg5Ny5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zMjM3YzU3NDkxYzYzZDZlOGI3YjE4MWM3NjVkOTljMWFjM2YxMWQ2NGEwYmQ5N2NkZGYyYjgwZGVjYWViNWIyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.5ftiENSeFJaz88K0TYgYOcuSRPBPBZsiyO_x9fcjUrA)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk1Njc0LTBhNjZkYzNkLWVhNmQtNDAwYS1hMzkwLThmZGM1YjMwMjBmMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00MDc2MzM0YjY5YWI4OTA2MGJhYzJlZWM3Y2I4M2QxOTNlYTRlODNmNzQ1YTdkOGRkNDZkZDY2MWRjYzdiMDVlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.Kxq3tJWgi51mLHIGbewTJhpa4pgqnm6Hp2GVHsBVsGs)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk1NzQyLTc3ZmRmNDQzLTJiMWItNDA4YS1hZWZjLTM2OTM3MDVjMDU1Yi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lODViNDM4ZmUwMTM0NTA1NTE1Njk4OTlmNTMxMjdiN2I4OTVkNzc5YTRhYmFiOGViOTVkOThjNDJiNTAwZGU1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.pa6NhyTBlS3i_IVfw2AaljugO5QhRsK1-7hgnR9EnlE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk2MjQ2LWQyZjdhN2ZlLTJiZWEtNGQ1OS1hZjA2LWU0YzJiMjIxYTEwOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03MzM4MzY2OWEwMjRlOWFmMGQzMzcyNGFlY2Q2ZTQ3MzAxYWRkMTE5MzU1NzliNmQwOTE5N2RmMDNmNGQ0YzM2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.UBbKZvSRkj8bNHiGtVz4sMNDEtbfBQFaq8rpB3Y2r38)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA1NzUxNTAsIm5iZiI6MTcyMDU3NDg1MCwicGF0aCI6Ii8xNTU2NDk5OTMvMzIzODk2Mzc4LWZkZjc3YWEyLWVmNWItNGMyZS1hMmE5LWY3NjNkNTY1NWJjYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxMFQwMTI3MzBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01YTdkOGQzYjcyMTVmNWU0OWIzZTc1M2Q5ZDdiMGMxYTFhMzdmZjc3MDgyMmFkMDg5NTY5OWIzNGY1NmNkYjUzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.kzD5IBu19uQJ1UBPF8fw29zjgrFNYfm8gLHEBoRmKFo)