467
2. Add Attributes to new template
Later data is added to the template from Treatment To Treatment Variations screen.

Screen: Action Attributes
1. Allows to create action attributes, new attribute is created “RedirectURL”

Screen: Actions
A new action is created from ‘Actions’ screen.
1. New template “ButtonToURLSameWindow” is created.
2. Add Attributes to new template
Data is added to the action from Treatment To Treatment Variations screen.


468

Screen: TreatmentToTreatmentVariations
For a specific scenario e.g. “Default”, attributes and actions for the template can be configured in PM Tool.

DefaultScenario > Templates section:


469

DefaultScenario > Outcomes section:
Default Scenarios page >


470
Default Scenario > Attributes and Actions definition


471

ExtraLargeImageURL (Banner) 343 KB
LargeImageURL (1GB/2GB) 418 KBImageURL Attribute Size
FooterSectionRule App
Header Business/Opti
MediumImageURL Business/Opti
HeaderSectionRule App
BodyHeader Business/Opti
Body Business/Opti
SectionName App
LargeImageURL Business/Opti
ExtraLargeImageURL Business/OptiTemplateAttribute Editable
Button Text Business/OptiTemplateAction Editable


472

Success Scenario > Attributes definition
Failure Scenario > Attribute definition

 RedirectURL Business/Opti
Short Text (Single-Line Datatype) 256
Long Text (Multi-Line Datatype) 4000Attribute Max Length


473
XLP Logic Components
How the Microsite url, that is sent in the SMS, is formed?
A sample Microsite URL is shown below. It has two parts.

Strategy: SetLandingPageCTA forms the URL and it can be included as a sub-strategy in the main logic while populating the ouput. This
can be done for any functionality, e.g. for Batch, Strategy: PopulateOutputPropertiesForSMSByBatch calls this strategy.
In ‘Treatment to Treatment Variation’ decision data for SMS, configured in PM Tool; property ‘TreatmentDynamicVariable1’ contains the
SMS body text along with a tag [LandingPageCTA], that is replaced in the above strategy with the Mircrosite URL.
Strategy: SetLandingPageCTA: (How the URL is formed and replaces the tag).
1: The first part of the URL configured in AOMConfig is retrieved and saved to attribute MicrositeURL.
.MicrositeURL = D_VFUKFWAOMFWDataAOMConfig[ConfigType:Microsite,ConfigName:OffersURL].ConfigValue
Below screenshot shows where the URL is configured in AOMConfig.


474
2: Below function is called and property .Metadatacode is set. It forms the second part of the url.
Function SaveOffersMetadata takes Subscription Id, comma-separated list of clipboard page SR properties, and Page (ClipboardPage) as
input. It then invokes the activity SaveOffersMetadata to store the properties in data set OffersMetadata and returns MetadataId as String
type. E.g.
.Metadatacode = SaveOffersMetadata(.CustomerID,
"pxInteractionID,Channel,OfferName,OfferVariant,TreatmentName,TreatmentVariant,AOMInteractionId", ClipboardPage)
Above underlined, is a comma-separated list of properties that is stored by the function in the data set: OffersMetadata (see next topic).
Then the function returns a code that is set to .Metadatacode. E.g.  "71b8ce9403724458bd3ffd03d75e7cd".
Above code is the second part of the URL. When customer clicks on the URL in SMS, this code comes back to Pega and is used to look up
information for the customer + offers from the data set.
3: First and second part of the URL is set to property .LandingPageCTA.
.LandingPageCTA = .MicrositeURL + .Metadatacode
4: Tag [LandingPageCTA] in .TreatmentDynamicVariable1 is replaced with the above property .LandingPageCTA
Now the SMS will have the body text along with the formed URL.
Data set: OffersMetadata
SaveOffersMetadata function/activity saves to this Data set (Decision Data Store) in below format.
Pega Case (for information only for Optimisation team)
Microsite is just a Pega Case. This document mainly concentrates on Fetch Offers and Next Best Content which are the new logic
components for this functionality.
Fetch Offers flow calls:


components for this functionality.
Fetch Offers flow calls:
Data Flow: IdentifyBestMicrositeTreatments and Strategy: IdentifyBestMicrositeTreatments
Next Best Content flow calls:
Data Flow: GetNextBestContent and Strategy: GetNextBestContent


475
Fetch Offers step in Pega case calls Data flow: IdentifyBestMicrositeTreatments that in turn calls Strategy:
IdentifyBestMicrositeTreatments. The strategy struncture is as below. Strategies mainly for this functionality are highlighted and described in
the list below:
1. IdentifyEligibleTreatmentsforMicrosite: This strategy is common for all execution modes. For Microsite functionality, it gets treatments
specifically for Microsite. During this logic, while getting the offers, offer expiry is checked. How offer expiry works is explained in a
section below.
2. IdentifyBestTreatmentforSubscription: This strategy is common for all execution modes. For Microsite functionality, it does the logic of
parent child offer bundling.
3. IdentifyTreatmentVariations: This strategy is common for all execution modes. For Microsite functionality, it gets only the treatment
variations for microsite treatments.
4. PopulateOutputPropertiesForMicrosite - Explained below:
5. SetIHPropertiesForAllChannels: This strategy is common for all execution modes. For Microsite functionality, it set the common +
microsite specific Interaction History properties.
6. GetInactiveMicrositeTreatment - Call decision data: T2TVAttributes and T2TVActions and get records for Scenario = Inactive. Set
property .ErrorMessage with the value from AOMBusinessConfig (screenshot below)


476
7. GetExpiredMicrositeTreatment - Call decision data: T2TVAttributes and T2TVActions and get records for Scenario = Expired. Also check
offer expiry. Set property .ErrorMessage with the value from AOMBusinessConfig. How offer expiry works is explained in a section
below.
8. GetIneligibleMicrositeTreatment - Call decision data: T2TVAttributes and T2TVActions and get records for Scenario = Ineligible. Set
property .ErrorMessage with the value from AOMBusinessConfig.

Strategy: PopulateOutputPropertiesForMicrosite
1. Route for Offers with Parent Child combination.
2. 2a and 2b: Route for Offers as Parent only without any children.
3. Set .ResponseType = Action for this route and get data from T2TVAttributes decision data. ResponseType property is used by the App
layer to recognize the relevant data.
4. Set .ResponseType = Action for this route and get data from T2TVActions decision data.
5. Import data from decision data: T2TVAttributes.
6. Import data from decision data: T2TVActions.
7. Join with the primary route and get “TemplateDetails”.
8. Join with the primary route and get “ActionTemplateId”, “ActionType”, “ActionDetail”, “Outcome”.


477

Next Best Content
Data flow and Strategy: Next Best Content
From Microsite landing page, where offers are dispalyed, if customer clicks on ‘Buy Now’, CSO (Create Sales Order) call is made.
Depending on the success of failure of CSO call, the next best content/screen is displayed to customer.
For the Offer in context, strategy gets all the relevant offer variations, treatment and treatment variations assigns attributes and actions from
decision data: T2TVAttributes and T2TVActions.
Similar kind of logic, described above in Strategy: PopulateOutputPropertiesForMicrosite.

How offer expiry works?
Offer expiry logic is present in below two strategy.
Strategy 1: SetExpiryPeriod
This check is done for all execution modes and all channels. While getting eligible offers from proposition data, this strategy is called as a
sub-strategy inside IdentifyEligibleOffers.
Fallow Period
It introduces the concept of Fallow period for offer expiry date. Fallow period for expired offers can be configured against offers in the PM
tool. If the number of days since an expiry date is less than the fallow period then an offer should be unavailable. Expired error status for
microsite should be based on the fallow period status.
Two attributes present in PM Tool Offers screen for this functionality are:
FallowPeriodForOfferExpiry - values e.g. 0, 3, 4 etc.


478
FallowPeriodForOfferExpiryInterval - values e.g. Years, Months, Days.
Fallow period logic is applied against the latest expiry date for the offer from Interaction History.
In PM Tool it is configured in Offers screen, as in the screenshot below.
1. Offer Expiry Interval in Days, Months or Years or a specific date.
2. If the offer has expired, make the offer unavailable for specified number of days.
3. Fallow period interval in Days, Months or Years or a specific date or Indefinite.
4. Number of days for the fallow period.
Strategy 2: OfferExpiry
This check is done for Microsite channel and is called as a sub-strategy inside strategy: IdentifyBestMicrositeTreatments.
For the offer in the request context, get latest expiry date from Interaction History and check against current date.
If offer expiry date is in future, let the logic flow to the next step.
If offer expiry date is in past, set error message configured in AOMBusinessConfig.
Capture Response in Interaction History
At various points during the user journey, customer interactions are captured in Interaction History.
Some scenarios are mentioned below:


479
SMS sent to customer after Batch process Pending - if sent via Pega Marketing
Selected - if sent via TIL service
Customer clicks on the Microsite link in the SMS Clicked
Microsite is displayed with Offers Shown - for each offer
Customer clicks “Buy Now” button for an offer Accepted
CSO - Create Sales Order failure FailureScenario Outcome in IH


480
XLP Error Scenarios
Currently, all error scenarios display the page as below. Content in the page is served by AOMConfig and not from PM Tool at the moment.
Error is written to aom_error database table.

Content shown in the above error page is configured in AOMConfig and is managed at the App layer.
ConfigType: ExceptionTemplateAttributes
ConfigName: OffersMicrosite
The ConfigValue in the above screenshot is like below. (Original image links are removed for the purpose of documentation).
{
"PageTitle": "Oops",
"Header": "Sorry, that didn't work",
"Body": "We're sorry, we weren't able to process your request. Please click below to check out your options.",There is a scope in future releases to have customized templates/screens for each error scenario.


481
"ExtraLargeImageURL": "ImageUrl1Path/image1.jpg"
"LargeImageURL": "ImageUrl2Path/image2.jpg"
"MediumImageURL": "ImageUrl3Path/image3.jpg"
"ButtonText": "Explore My Options",
"ButtonURL": "Url to which button click should take the user"
}
Error Scenario 1
Once customer clicks on the URL in SMS, AOM tries to look up customer and offer information by using the Metadatacode present in the
URL. If found, pass to the next stage. However, if customer details cannot be found against the URL details, error screen is displayed.
Error Scenario 2
If Metadatacode look up is successful, there are additional validations for GPSL. If call to GPSL fails, error screen is displayed.
GPSL = Get Processed Service List, is a SOAP service exposed by Vodafone TIL (Tibco Interface Layer) which returns the Offers and
Product details for a given Service Number/MSISDN.
Error Scenario 3
On the URL click and other customer activities on the Microsite, Pega needs to write reponses to Interaction History as part of Capture
Response process. If the process fails, error screen is displayed. One possible scenario could be Interaction id mismatch for a sms sent
response and sms clicked response.
Error Scenario 4
Customer clicks on the URL, but the customer data is not present in Subscription table, it corresponds to a failure and error screen is
displayed.

Error Scenario 5
On ‘Buy Now’ button click on Microsite, if CSO = Create Sales Order process fails, error screen is displayed.
Error Scenario 6
Display error screen if the offer has expired.


482
XLP App layer
This page describes the Landing Pages displayed in the Offers Case and how the pages are populated with content. The attributes used to
display the pages are detailed.
In the event of Landing Pages not displaying as expected, please check the relevant attribute(s) on the page and the value(s) returned in
Decision Data.
A. Exception Handling Error Page
This page displays for all flow exceptions and errors in the Offers Case. This page is not offer specific but the content of this page can be
configured as described below.
This page is displayed in case of landing page offer is either Inactive, Expired or Ineligible.
All attributes are set from the following record in AOMConfig (shown here with example ConfigValue):
ConfigType: ExceptionTemplateAttributes
ConfigName: OffersMicrosite
ConfigValue:
{
"PageTitle": "Oops",
"Header": "Sorry, that didn't work",
"Body": "We're sorry, we weren't able to process your request. Please click below to check out your options",
"ExtraLargeImageURL": "url",
"LargeImageURL": "url",
"MediumImageURL": "url",
"ButtonText": "Explore My Options",
"ButtonURL": "url"
}
Troubleshooting
Text content not displaying as expected
(Header or Body)Check AOMConfig entry for individual
attributes - Header & Body
Button text not displaying as expected Check AOMConfig entry - ButtonText
attribute
Button does not redirect to expected url Check AOMConfig entry - ButtonURL
attribute Problem Check Notes


483
B. Offers pages
The Offers Landing Pages content is populated from attributes that are set in Decision Data - T2TVAttributes and T2TVActions. These are
returned from logic data flows in the Offers Case.
The attributes used to display each screen are detailed below. If any screens do not display as expected, the attribute values should be
checked first.
The value set in T2TVAttributes - TreatmentAttributes.SectionName determines which of the Offers screens to display.
The pages below are used to display the offers on Landing page - as Default scenario (when the offer is loaded on Landing Page)
as well as CSO Success/Failure Scenarios.
B1. Parent Single Action page
TreatmentAttributes.SectionName = "SingleActionInformationPage" (set in T2TVAttributes)
Page content is populated from the following name/value properties in TreatmentAttributes set in T2TVAttributes.Background image not displaying as
expectedCheck AOMConfig entries -
ExtraLargeImageURL, LargeImageURL,
MediumImageURLThe different size images are used
depending on the screen size.
HeaderSectionRule Header shown with Vodafone logo. This should be a valid Section rule name.
Existing Section name with VF logo should
be H e a d e r A l i g n R i g h t
Header Hello Emma. Here’s a data offer just for you. Text
Body It’s great to see you’ve been making the most of your data
allowance…………..Text
ExtraLargeImageURL Background image shown URL of image.
LargeImageURL Background image when screen size is reduced to large URL of image.
MediumImageURL Background image when screen size is reduced to medium URL of image.
FooterSectionRule Footer shown with ‘Terms & Conditions’ | ‘Privacy policy’ links


FooterSectionRule Footer shown with ‘Terms & Conditions’ | ‘Privacy policy’ links
and @ 2022 Vodafone text.This should be a valid Section rule name.
Existing Section name should be TreatmentAttributes
attributeExample in screen above Notes


484
Action buttons are populated from T2TVActions Decision Data attributes - ActionTemplateType & ActionTemplateDetail.
There are currently 2 types of Action button - Product Add On button and Redirect button.

The above pattern of template is used for Default scenario (single offer) as well as CSO Failure scenario.
B2. Parent with Child page

TreatmentAttributes.SectionName = "ParentWithCardChildren" (set in T2TVAttributes)
Page content is populated from the following name/value properties in TreatmentAttributes set in T2TVAttributes.F o o t e r D e f a u l t .
Product Add
OnProductAddOn "[{"Name": "ButtonText", "Value": "<<Set to
button label>>"}]"eg. "[{"Name": "ButtonText", "Value": "Buy Now"}]"
Redirect RedirectURL "[{"Name": "ButtonText", "Value": "<<Set to
button label>>"}, {"Name": "RedirectURL",
"Value": "<<Set to url to redirect to>>"}]"eg. "[{"Name": "ButtonText", "Value": "Explore My
Options"}, {"Name": "RedirectURL", "Value": "url"}]"Button type ActionTemplate
TypeActionTemplateDetail attributes Notes
HeaderSectionRule Header shown with Vodafone logo. This should be a valid Section rule name.
Existing Section name with VF logo should
be H e a d e r A l i g n R i g h t
Header Hello Emma. Here’s a data offer just for you. Text
Body It’s great to see you’ve been making the most of your data
allowance…………..TextTreatmentAttributes
attributeExample in screen above Notes


485
For each Child, the card sections on the page are populated from the following name/value properties in the Child’s TreatmentAttributes :
For this page, there are no Action buttons for the Parent section. Action buttons can be defined for the Child card sections.
Action buttons are populated from T2TVActions Decision Data attributes - ActionTemplateType & ActionTemplateDetail.
There are currently 2 types of Action button - Product Add On button and Redirect button.
The above pattern of template is used for Default scenario (Multiple offers - Parent & Child).ExtraLargeImageURL Background image shown URL of image.
LargeImageURL Background image when screen size is reduced to large URL of image.
MediumImageURL Background image when screen size is reduced to medium URL of image.
BodyHeader Get your extra Text
FooterSectionRule Footer shown with ‘Terms & Conditions’ | ‘Privacy policy’ links
and @ 2022 Vodafone text.This should be a valid Section rule name.
Existing Section name should be
F o o t e r D e f a u l t .
ImageSashText 50% discount Text
Header 1GB of data for only £XX a month Text
Body Your Data Extra will automatically renew each month…… Text
LargeImageURL Child card image - For 1GB and For 2GB URL of image.
MediumImageURL Child card image for medium screen size - For 1GB and For
2GBURL of image.
Footer This Data Extra will be added to mobile number…………… TextTreatmentAttributes
attributeExample in screen above Notes
Product Add
OnProductAddOn "[{"Name": "ButtonText", "Value": "<<Set to
button label>>"}]"eg. "[{"Name": "ButtonText", "Value": "Buy Now"}]"
Redirect RedirectURL "[{"Name": "ButtonText", "Value": "<<Set to


Redirect RedirectURL "[{"Name": "ButtonText", "Value": "<<Set to
button label>>"}, {"Name": "RedirectURL",
"Value": "<<Set to url to redirect to>>"}]"eg. "[{"Name": "ButtonText", "Value": "Explore My
Options"}, {"Name": "RedirectURL", "Value": "url"}]"Button type ActionTemplate
TypeActionTemplateDetail attributes Notes


487
B3. No Action Information Page


488
TreatmentAttributes.SectionName = "NoActionInformationPage" (set in T2TVAttributes)
Page content is populated from the following name/value properties in TreatmentAttributes set in T2TVAttributes.
There are no Action buttons for this page.
The above pattern of template is used for Default scenario (Single offer with no CTA) as well as CSO Success scenario.
 HeaderSectionRule Header shown with Vodafone logo. This should be a valid Section rule name.
Existing Section name with VF logo should
be H e a d e r A l i g n R i g h t
Header Hello Emma. Here’s a data offer just for you. Text
Body It’s great to see you’ve been making the most of your data
allowance…………..Text
ExtraLargeImageURL Background image shown URL of image.
LargeImageURL Background image when screen size is reduced to large URL of image.
MediumImageURL Background image when screen size is reduced to medium URL of image.
FooterSectionRule Footer shown with ‘Terms & Conditions’ | ‘Privacy policy’ links
and @ 2022 Vodafone text.This should be a valid Section rule name.
Existing Section name should be
F o o t e r D e f a u l t .TreatmentAttributes
attributeExample in screen above Notes


489
2nd Line Private Pricing
Objective
Digital platform calls AOM’s 2nd line private pricing functionality via API calls, to get a list of prioritised tariff plans, associated percentage
discounts along with associated offers for a customer with an existing primary line product.
This functionality is a part of existing APIs: GetNBA and GetProductList.
Business Purpose = CrossSell
Currently implemented only for CrossSell but has the scope to be extended to other business purposes.
Channel in the API request = Web
OrderType in the API request = In Life Sales
This is passed in Get Product List API request to identify that the request is related to a 2nd line journey.
For GetNBA, it is hard coded as ‘In Life Sales’ in the logic.

Test Cell Management is new in 2nd Line PP, that is described in a separate section in the later part of this documentation.

GetNBA API:
2nd Line PP is called in the GetNBA logic flow when the customer's intent is: Buy-Second-Line.
GetNBA request can either come from the 'Upgrades & Offers' page or the 'Options to Buy (OTB)' popup on the Digital platform.
Logic distinguishes between these two sub-channels and determines which offers, treatment and templates to use.
So SubChannel under the Web channel are:
'Purchase' - for 'Options to Buy (OTB)' popup
'UpgradesAndOffers' - for 'Upgrades & Offers' page
As per current business requirement, only the Discounts (for tariff) need to be assigned template attributes and actions.

Sample GetNBA API request with SubChannel = Purchase and PrimaryContext = Options_to_Buy
{
Identifier: {
Account: {
AccountNumber: "31521130702",
Status: "Existing",
Type: "Consumer"


AccountNumber: "31521130702",
Status: "Existing",
Type: "Consumer"
},
ServiceNumber: "447920130702"
},
RequestorDetail: {
Channel: "Web",
SubChannel: "Purchase"
},
Context: {
PrimaryContext: "Options_to_Buy",
NoOfActions: 5,


490
Detail: []
}
}
Sample GetNBA API request with SubChannel = UpgradesAndOffers and PrimaryContext = Upgrades_and_Offers
{
Identifier: {
Account: {
AccountNumber: "31521130702",
Status: "Existing",
Type: "Consumer"
},
ServiceNumber: "447920130702"
},
RequestorDetail: {
Channel: "Web",
SubChannel: "UpgradesAndOffers"
},
Context: {
PrimaryContext: "Upgrades_and_Offers",
NoOfActions: 5,
Detail: []
}
}

GetProductList API:
Get Product List gets a list of available tariffs and discounts. There is no Business requirement for templates here.
Sample GetProductList API request with Tariff in Line item (basket)
{
"OwnerAccountNumber": "169806809",
"SubscriptionId": "-127975494",
"AgentId": "53243463",
"Division": "Webchat Saves",
"Channel": "Web",
"SubChannel": "UpgradesAndOffers",
"OrderType": "In Life Sales",
"CaseId": "CaseId",
"RecommendationId": "RecommendationId",
"ProductType": "Tariff",
"LoanEligibilityStatus": "Eligible",
"LineItems": [
{
"ProductId": "112168",
"ProductType": "Tariff"
}
]
}
Sample GetProductList API request with Handset in Line item (basket)


491
{
"OwnerAccountNumber": "169806809",
"SubscriptionId": "-127975494",
"AgentId": "53243463",
"Division": "Webchat Saves",
"Channel": "Web",
"SubChannel": "UpgradesAndOffers",
"OrderType": "In Life Sales",
"CaseId": "CaseId",
"RecommendationId": "RecommendationId",
"ProductType": "Tariff",
"LoanEligibilityStatus": "Eligible",
"LineItems": [
{
"ProductId": "204523",
"ProductType": "Handset"
}

For both the APIs, response is sent to Digital, and Pega writes records to Interaction History and Interaction History reporting.

Error Scenarios
When the APIs are called, if the MSISDN is not recognised by AOM then an error should be returned.
Likewise, if the supplied SKU is not recognised against any non-SIMO plan, then an error should be returned.


492
Propositions and PM Tool screens for 2nd Line PP
At the time of preparing this document, below offers were given by Business as part of 2nd Line private pricing functionality.
PM Tool Offer screen to configure offers
All offers have CustomerSegment = ConsumerPostpay and BusinessSegment = Consumer.
Two new fields are added to the offer screen: TariffType and TestGroup (described later in Test Cell Management section of this document).
PM tool O f f e r screen screenshot.AddMobileWithHand
setCrossSell Batch,GetNBA Loan Handset Tariff
AddSIMO CrossSell Batch,GetNBA CBU SIMOnly Tariff
AddTablet CrossSell Batch,GetNBA Loan Tablet Tariff
AddDataSIMO CrossSell GetNBA CBU DataSIMOnly Tariff
AddDiscount CrossSell GetNBA   DiscountOffer Name Business Purpose OfferExecutionMod
eTariff Segment TariffType ProductRecommen
dation Type


493

All offers have offer Variant = OfferVariantDefault.

PM Tool Treatment screen to configure treatments

All treatments have treatment variant = TreatmentVariantDefault.

PM Tool Parent Child Treatments screen to configure Parent Child offer relationship.

PM Tool SubChannel screen to configure two new sub channels
There are two subchannels ‘Upgrades and Offers' and ‘Purchase’
These are from the 'Upgrades & Offers' page or the 'Options to Buy (OTB)' popup.

There is a screen for Test Cell Management described in the Test Cell Management section in later part of this document.AddMobileWithHandset_Web AddMobileWithHandset Web
AddSIMO_Web AddSIMO Web
AddTablet_Web AddTablet Web
AddDataSIMO_Web AddDataSIMO Web
AddDiscount_Web AddDiscount WebTreatment Name Associated Offer Name Applicable Channel
AddMobileWithHandset_Web AddDiscount_Web
AddSIMO_Web AddDiscount_Web
AddTablet_Web AddDiscount_Web
AddDataSIMO_Web AddDiscount_Web
AddMifi_Web AddDiscount_WebBundleParentTreatment BundleChildTreatment


494
Get Product List Logic
Strategy: GetProductList is the main strategy.

It calls Sub Strategy GetProductListForUpgrade and GetProductListForAdditionalLine that contains the existing GetProductList logic for
Upgrades and the 2nd Line Pricing logic respectively.
The switch component chooses the relevant route based on the .OrderType from API request context.
Call Strategy: GetProductListForUpgrade if .OrderType is "Upgrade" or "Flexi Upgrade"
Call Strategy: GetProductListForAdditionalLine of .OrderType is "In Life Sales" or "New Acquisition"
Set .ErrorMessage = "Invalid Order Type" otherwise

Logic relevant to 2nd line private pricing functionality

Strategy: GetProductListForAdditionalLine
Brief description of the logic
1] GetAllTariffs : All the available tariffs are called here.


495

2] ManageHaloServiceType & EvaluateInterestedServiceType: To find the service type suitable for a customer.

3] GetEligibleTariffsForSKU : Gets tariffs which are compatible with the product the customer holds.

4] Check Additional Line Context:
Switch based on the context data from EvaluateInterestedServiceType as shown below:

5] Invalid Additional Line Context: "Invalid Additional Line Context" error message set.

6] Ineligible plans are filtered out and the TestCellManagement properties are joined with the eligible plans.

7] TestCellManagement : Unique propositions are input and TestGroup eligibility is checked so the correct TestGroup and TestCells is
assigned to each positions for a customer.

8] IdentifyDiscountPerTariff: Identify discount per tariffs by Map Test Group Details.

9] SecondLineDiscountCompatibility: To check if the discount is compatible with the tariff by using data page: D_DiscountsForTariff.

10] PrioritizePlans: To decide which plan should be given priority.

11] ApplyBundlingForAdditionalLine: It Matches the Parent & child Treatments and sets the Parent.

12] PrioritiseDiscounts: To decide which Discount should be given priority.

13] PopulateOutputPropertiesForAdditionalLine: To create relevant properties to be sent in the API response.

14] SetIHPropertiesForAllChannels: To populate required IH fields for all channels while writing them to Interaction History - maps
properties for Interaction History and for any properties with no value are set to default.


properties for Interaction History and for any properties with no value are set to default.

15] Make Decision: Confirms if error message is chosen before providing results based on CheckAdditionalLineContext as shown below. GetEligibleTariffsForSKU EvaluateInterestedServiceType.HasSKU
ManageHaloServiceType !EvaluateInterestedServiceType.HasSKU
Invalid Additional Line Context Otherwise Select Component Condition


496
 Invalid Additional Line Context CheckAdditionalLineContext.ErrorMessage!=""
SetIHPropertiesForAllChannels OtherwiswStrategy Component Condition


497
GetNBA Logic
In the existing GetNBA logic, 2nd line private pricing functionality is called in the below strategy for Intent = "Buy-Second-Line".
Strategy: PopulateOutputPropertiesForGetNBA
The strategy is called from PopulateOutputPropertiesForWeb when Execution Mode is GetNBA

There are two paths, Additional Line and Not Additional Line
2nd Line Pricing follows the Additional Line path:
Additional Line Filter
Get Max Discount - calls IdentifyMaxDiscountForTariffType
PopulateOutputPropetiesForGetNBAPrivatePricing
Results

Strategy - IdentifyMaxDiscountForTariffType
From external input, Discounts and Tariffs come into the strategy.
Strategy splits into Tariff and Discount
For tariff path, call Strategy: GetAllTariffs, to get the duration of the tariff.
Discount path
Discounts are mapped to relevant tariffs to get the duration and then are split into 12 or 24 months plans.  Other duration tariff + discount
plans flow directly to the results component.
From here, logic is similar to Get Product List logic, described in the previous part of this document.
Refer to section: Get Product List Logic, then point [7] Strategy: IdentifyDiscountPerTariff.


498
Test cell management is used here as well.

The only part that is different in GetNBA 2nd line private pricing logic is Legal Compliance, described below.

Strategy: GetLegalComplianceTariffs
There is a legal requirement by Business to ensure that when it is communicated "up to X% off", at least 15% of the eligible tariffs
compatible with an offer will receive the advertised X% discount level.
The discount matrix will be configured so the high/medium/low bandings will always be set so that the "high" discount level will always be
compliant. GetLegalComplianceTariffs ensures this and mitigates the risk of human error.
Tariffs Compliance with Legal Requirement: .Count of Tariffs >= LegalRequirement.LegalCompliance
LegalCompliance value is configured via PM Tool screen: Business Config and is stored in the data type: AOMBusinessConfig as follows:

To populate output properties and template attributes and actions, below strategy is called.

Strategy: PopulateOutputPropetiesForGetNBAPrivatePricing
GetNBA outputs are inf the form of offers/propositions e.g. parent could be the Tariff offer and discount offer is child.
In the logic flow, screenshot below, Parent Offer for Tariff flows throught the top path.
Below that is the Child offer route for Discount. In API response discounts are present in the Detail section.
Finally Disounts are joined with Tariffs.


500
OPTI KT Test Cell Management in 2nd Line Private Pricing

Test Cell Management Screen
Configure TestGroups , Enable / Disable, TestGroup Expiry and Test Cell Splits in Test Cell Management Screen
Data configured in this screen is pushed into two decision datas :TestGroups and Test Cells
Decision Data: TestCells: Data configured in PM Tool. Sample values below.

PM Tool Offer screen: There is a drop down to assign a Test Group, as shown below.
AdditionalLineDiscount Matrix:
Note: There is no PM screen for this decision data. It should be manually uploaded in system.
Example:
Random 4 Split A Random 4 Split A1 1 33
Random 4 Split A Random 4 Split A2 34 66
Random 4 Split A Random 4 Split A3 67 100CellGroup CellCode InitialValue FinalValue


502
eCare
Introduction
eCare is a new channel in NBA functionality. AOM returns offers via eCare channel in multiple containers within the Account Dashboard. A
GetNBA request will come from the account dashboard, so ‘Dashboard’ is the sub-channel in the request.
Containers are the Divisions. The new channel, sub-channel and divisions is configured via PM Tool, explained in the later part of this
document.
Business Purpose =  any business purpose can be used as per business requirement
Execution mode = GetNBA
SubChannel = Dashboard
Sample GetNBA API request with SubChannel = Dashboard
{
    "Identifier": {
        "Account": {
            "AccountNumber": "7001179200",
            "Status": "Existing",
            "Type": "Consumer"
        },
        "ServiceNumber": "447879100510"
    },
    "RequestorDetail": {
        "Channel": "eCare",
        "SubChannel": "Dashboard",
          "Agent":{
"Department":"High-Value Retention"
}
    },
    "Context": {
        "PrimaryContext": "Offers",
        "NoOfActions": 10,
        "Detail": [{
            "Name":"CONTACT_ROLE"
            ,"Value":"L0-Owner"
        }]
    }
}
For Channel = eCare in GetNBA API request, the main strategy for eCare functionality is:
IdentifyBesteCareTreatmentsForSubscription.
The API request returns:
A List of eCare eligible NBA offers (treatments) and their priority order.

A sample GetNBA API response for eCare request is below:


503
{
"InteractionId": -1552726564088101344,
"ActionList": [{
"Propensity": 0.0,
"OfferVariant": "FlexUpgrade",
"Priority": 8,
"Channel": "eCare",
"SubChannel": "Dashboard",
"OfferId": "VFO0035",
"OfferName": "UpgradeMobileToHandset",
"TreatmentId": "VFO0035-TC001",
"OfferDescription": "",
"TreatmentVariant": "OutboundCampaignFollowUp_NonOwner",
"Detail": [{
"Value": "ECareUpgrades",
"Name": "container"
},
{
"Value": "Here is an eCare upgrades offer",
"Name": "offer"
},
{
"Value": "CTA text",
"Name": "CTA"
},
{
"Value": "eCare",
"Name": "journey"
},
{
"Value": "Copy text",
"Name": "Copy"
},
{
"Value": "eCare upgrades offer",
"Name": "sash"
},
{
"Value":
"https://assets.vodafone.co.uk/cs/groups/public/documents/images/mv10_red_entertainment_image.png",
"Name": "imageURL"
},
{
"Value": "Get that new phone feeling with an upgrade today. Speak to your main Account Holder if you would
like to upgrade your plan",
"Name": "body"
},
{
"Value": "https://tcc8-www.vodafone.co.uk/upgrade-and-offers",
"Name": "CTAURL"
},


504
{
"Value": "It's upgrade time!",
"Name": "title"
}
],
"TreatmentName": "UpgradeMobileToHandset_eCare"
},
{
"Propensity": 0.25,
"Priority": 5,
"OfferVariant": "OfferVariantDefault",
"Channel": "eCare",
"SubChannel": "Dashboard",
"OfferId": "XSL010",
"OfferName": "AddTablet",
"Item": [{
"AdditionalNotes": "",
"ProductType": "Additional Service",
"ProductId": "107414",
"ProductDescription": "Other"
}],
"TreatmentId": "XSL010-TC001",
"OfferDescription": "",
"TreatmentVariant": "TreatmentVariantDefault_NonOwner",
"Detail": [{
"Value": "Here is an eCare extras tablet offer just for you",
"Name": "offer"
},
{
"Value": "ECareOffersForYou",
"Name": "container"
},
{
"Value": "CTA text",
"Name": "CTA"
},
{
"Value": "eCare",
"Name": "journey"
},
{
"Value": "Copy text",
"Name": "Copy"
},
{
"Value": "eCare extras tablet offer just for you",
"Name": "sash"
},
{
"Value": "Vodafone – Our Best Ever Network | Now With 5G
"Name": "imageURL"


505
},
{
"Value": "https://www.vodafone.co.uk/",
"Name": "CTAURL"
},
{
"Value": "Save £311 on a Samsung Tab A8",
"Name": "body"
},
{
"Value": "Extra 15% discount for you",
"Name": "title"
}
],
"TreatmentName": "AddTablet_eCare"
},

eCare provide responses to AOM to indicate whether the offer presented on the account dashboard was 'shown' and how the customer
responded to the offer.
Shown: when an offer was 'shown' to a customer
Clicked: a customer click on the relevant 'accept' CTA
Dismissed: A customer has clicked on the relevant 'decline' CTA button

Error Scenarios
If Max Offers check is failed as the MaxOffers for all the Divisions are set to 0, then ““Error in GetNextBestActions: Business Logic Error:
MaxOffers Check Failed”  error is returned.
Similarly if Min Offers check is failed: “Error in GetNextBestActions: Business Logic Error: MinOffers Check Failed”Selected Offer is returned to Channel by AOM GetNBA
Shown Offer is presented on eCare channel SetNBAResponse
Clicked Customer has clicked on Accept button on
eCareSetNBAResponse
Dismissed Customer has rejected the offer on eCare SetNBAResponseResponse/Outcome Description API


506
Propositions and PM Tool screens for eCare
Offers and Treatments are configured by PM Tool: “Offer” and “Treatment” screen respectively.
 offer and treatment names look like below. More details present in Offer Catalogue.
All offers have,
OfferVariant,TreatmentVariant
Channel Screen: New channel ‘eCare’ is configured.

SubChannel Screen: New sub channel ‘Dashboard’ is configured along with Divisions.AddInternationalMinutes eCare AddInternationalMinutes_eCare GetNBA
AddMobileSIMO eCare AddMobileSIMO_eCare GetNBA
AddMobilewithhandset eCare AddMobileWithHandset_eCare GetNBA
AddSmartwatch eCare AddSmartwatch_eCare GetNBAOffer Name Channel Treatment OfferExecutionMode
eCare Dashboard OffersForYouChannel SubChannel Division


507

Treatment Screen: The new channel, sub-channel, and division is associated with a treatment from the PM Tool ‘Treatment’ screen as
below:
Offer Decision Mix Screen
Max and Min value for offers required for the decision mix is configured in this screen. The decision mix logic in eCare is described in the
later part of this document.
Template Screen
eCare template is created and template attributes are assigned.Extra
NudgeBar4
NudgeBar5


508

Actions Screen
Two button actions are created. One for Click/Accept, one for Dismiss/Reject namely:
eCareAcceptAction
eCareDismissAction

Treatment To Treatment Variations Screen


509
The above creates a template and actions are assigned to each treatment to treatment variation.
Template assignment
Action assignment


511
eCare Logic
The primary strategy structure and flow for eCare is on the same lines as the GetNBA logic.
Main Strategy: IdentifyBesteCareTreatmentsForSubscription, called from GetNBA when Context(Channel) = "eCare"

Brief description of the strategy components
1] Strategy: IdentifyEligibleeCareTreatments
Get offers, offer variation with treatment for eCare.
2] Strategy: IdentifyTreatmentSubChannel
eCare offers pass through IdentifyTreatmentSubChannelForGetNBA where TreatmentToSubChannels Decision Data is imported. See PM
tool screens. The division is one level below the sub-channel. The division is the area of the dashboard where the offer is displayed. This
strategy checks if.SubChannel from Context =.TargetSubChannel from the decision data and passes those records.

3] Strategy: IdentifyBestTreatmentforSubscription
eCare treatments pass through strategy: IdentifyBestTreatmentForeCareOnGetNBA (see next page). The decision mix logic is present in
this strategy.

4] Strategy: IdentifyTreatmentVariations
The common strategy which finds eligible Treatment Variations.

5] Strategy: PopulateControlGroupPercentage
Populates Offer and Treatment level control group percentages.

6] Strategy: SelectBetweenOfferORTreatmentPotentialControlSplit
Passes through ApplyPotentialControlSplit or ApplyPotentialControlSplitAtTreatmentLevel depending on if.ControlGroupLevel="Offer" or
"Treatment"

7] Strategy PopulateOutputPropertiesForeCare
When .PotentialControlFlag="Target", strategy: PopulateOutputPropertiesForGetNBA is called to create relevant properties to be sent in
the API response.


512
Strategy: SeteCareTokens and strategy: PopulateCareOutputProperties currently have empty set properties available if the scope is
extended.

8] Strategy: SetIHPropertiesForAllChannels
Populate required IH fields for all channels while writing them to Interaction History. Maps properties for Interaction History and properties
with no value are set to default.
eCare-specific values are set for:
.pyDirection = "Inbound"
.pyOutcome = "Selected"
.InControlGroup = @if(.PotentialControlFlag="Target","N","Y")

9] Switch and Error messages

ErrorMessage - MinOffers Check Failed
Sets ErrorMessage = "MinOffers Check Failed"IdentifyBestTreatmentforSubscription.pyName=""
ErrorMessage - No Decision
Sets .ErrorMessage = "No Decision"SetIHPropertiesForAllChannels.pyName=""
SetIHPropertiesForAllChannels OtherwiseSelect Component Condition


513
eCare Decision Mix Logic
Offer Decision Mix logic is used to limit the maximum and minimum offers that can pass through a sub-channel and a Division.
The logic is present in Strategy: IdentifyBestTreatmentForeCareOnGetNBA and ApplyDecisionMixAtDivisionLevel.

Business requirements for Decision Mix Logic
Data required for the logic is present in Decision Data: OfferDecisionMix. A sample data is in the table below.
From the above decision data entries, if there is no value for Division (e.g. first row), it means the decision mix is applied at the
SubChannel level. If there are entries for Division, it means the decision mix is applied at the division level.
While setting up MaxOffers at the relevant Division level, only one of the Division MaxOffers can be set up as Unlimited (value = -1).
MaxOffers value for such Division is derived as:
Value of MaxOffers at SubChannel level (minus) Sum of MaxOffers value of all Divisions (non Unlimited) selected treatments.
If Division level MaxOffers is configured, the relevant SubChannel level MaxOffers cannot be marked as Unlimited.
Validation of Max Offers: In the above example, MaxOffers = 1 is set for Division NudgeBar2. That means not more than 1 offer can be
presented for this Division.
Validation of Min Offers: The sum of min offers at the division level should be greater than or equal to the min offer at the sub-channel
level.

The main implementation points are annotated in the strategy screenshot and described below.
Strategy: IdentifyBestTreatmentForeCareOnGetNBA

1] Filters check Channel is eCare and Division is not null.
 eCare Dashboard  5 1
eCare Dashboard NudgeBar2 1 0
eCare Dashboard Extra 1 0


eCare Dashboard NudgeBar2 1 0
eCare Dashboard Extra 1 0
eCare Dashboard NudgeBar4 1 0
eCare Dashboard OffersForYou -1 1Channel SubChannel Division MaxOffers MinOffers


514
2] Decision Data: OfferDecisionMix for eCare data is imported (see more about this new Decision Data on the PM tool screen page).

3] OfferDecisionMix for eCare is split into subchannel and division levels.
From the above decision data entries, if there is no value for Division (e.g. first row), it means the decision mix is applied at the SubChannel
level. And if there are entries for Division, it means decision mix is applied at division level.

4] At the Division level eCare offers are matched with division Decision Data.

5] eCare offers are split by divisions with unlimited MaxOffers and not unlimited MaxOffers. Only one division can have unlimited offers.

6] For not unlimited MaxOffers, a list of unique divisions is created.

7] Strategy: ApplyDecisionMixAtDivisionLevel
Uses an embedded strategy to iterate over EachDivision, Prioritize Treatments by .pxPriority and return the maximum number of offers in
priority order by Division.

8] MaxOffers for divisions with unlimited MaxOffers are set, based on MaxOffers for the subchannel.

9] Treatments are prioritized by .pxPriority and filtered to return the MaxOffers in priority order.
 eCare Dashboard  5 1
eCare Dashboard NudgeBar2 1 0
eCare Dashboard NudgeBar3 1 0
eCare Dashboard NudgeBar4 1 0
eCare Dashboard NudgeBar5 -1 1Channel SubChannel Division MaxOffers MinOffers
ApplyDecisionMixAtDivisionLevel


515
10] MinOffers Check, checks the treatment count for all divisions is greater than the required MinOffers by subchannel.


516
New BDC Pipeline - dual running
Strategies are to be updated with a new pattern to support dual running of the same models from old and new pipelines. Where a model is
present in both feeds, the logic should always read from the new pipeline as priority. Previously strategies have been picking between the
old and new pipeline models at random.
Below strategies are updated as part of this Change.
A. GetBDCPropensity
Set property component “Model 967 from New Pipeline” populates this models data
“Model 967 from Old Pipeline” comes form Primary.ModelScoreListPage
The switch component “Model 967” selects between the Model 967 from the old and new pipeline
If the model id from new pipeline is not null “Model 967 from New Pipeline”
Otherwise “Model 967 from Old Pipeline” is selected
The chosen Model 967 and all “Other Models from Old Pipeline” are passed to “Join ModelID”

B. IdentifyModelBasedIntents


517
Changes are very similar to those for GetBDCPropensity.
Set property component “Model 967 from New Pipeline” populates this models data
“Model 967 from Old Pipeline” comes form Primary.ModelScoreListPage
The switch component “Model 967” selects between the Model 967 from the old and new pipeline
If the model id from new pipeline is not null “Model 967 from New Pipeline”
Otherwise “Model 967 from Old Pipeline” is selected
The chosen Model 967 and all “Other Models from Old Pipeline” are passed to “Valid Model Scores”


518
MVA KT
Configuration of MVA Offer:
Offers - created via PM Tool Offer screen.
AddBroadbandProExtra
New Offer “AddBroadbandProExtra” is created.
Map applicable channels.
Map applicable execution mode.

Treatment Screen
Configure App Treatments for App Offers


519

In Strategy: PopulateOutputPropertiesForApp and PopulateOutputPropertiesForGetNBA the content to be displayed in My Vodafone App is
populated from two Decision Data - T2TVAttributes and T2TVActions.
Decision data: T2TVAttributes - provides content of the page.
Decision data: T2TVActions - defines actions for buttons on the page.
Data for above decision data is configured in PM Tool (explained in the next section ‘PM Tool Screens’).

T2TVAttributes (Treatment To Treatment Variations Attributes)
This decisio data holds Content of page
 T2TVActions (Treatment To Treatment Variations Actions)
This decision data holds information of the Button actions i.e. what needs to be done for a button click

PM Tool Screens
There are no separate screens for the two main decision data: T2TVAttributes and T2TVActions. Instead data from a combination of
screens in PM Tool is sent to the above mentioned decision data.


520
Screen: Channel
Below is a screenshot of Channel screen.
1. New channel “App” is created.
2. Possible outcomes are added e.g. “Clicked”
3. Tick, if templates are required for the channel.
4. Tick, if Actions are needed on the template e.g. buttons.

Screen: Template Attributes
1. Used to create new template attribute, example - “ImageURL” attribute


521

 Screen: Template
1. New template “AppDiscoverDefault” is created.
2. Add Attributes to new template
Later data is added to the template from Treatment To Treatment Variations screen.

Short Text (Single-Line Datatype) 256
Long Text (Multi-Line Datatype) 4000Attribute Max Length


522
Screen: Action Attributes
1. Allows to create action attributes, new attribute is created “URL”
Screen: Actions
A new action is created from ‘Actions’ screen.
a. New templates “AppDismissAction” and “AppDirectToURLAction“ are created.
b. Add Attributes to new template
Data is added to the action from Treatment To Treatment Variations screen.


523
Screen: TreatmentToTreatmentVariations
For a specific Treatment Variant, Configure Templates and Outcomes created in other screens
Templates section:


524
Outcomes section:


525
Request Body:
{
"Identifier": {
"Account": {
"AccountNumber": "2128",
"Status": "EXISTING",
"Type": "Consumer"
},
"ServiceNumber": "447920220000"
},
"RequestorDetail": {
"Channel": "App",
"SubChannel": "Discover"
},
"Context": {
"PrimaryContext": "",
"NoOfActions": 15,
"Detail": [
{
"Name": "ConnectionId",
"Value": "CON_28474_847464"
},
{
"Name": "international",
"Value": "Disabled"
},
{
"Name": "lost",
"Value": "Disabled"
},
{
"Name": "phone-sales",
"Value": "Disabled"
}
]
}


526
}

 Response:
  {
"InteractionId": 7798417388380314502,
"ActionList":    [
{
     "Propensity": 0.5,
     "Actions":          [
                    {
           "Type": "Button",
           "Outcome": "Clicked",
           "Id": "AppDirectToURLAction",
           "Detail":                [
                                {
                 "Value": "Find out More",
                 "Name": "Label"
              },
                                {
                 "Value": "1",
                 "Name": "Index"
              },
                                {
                 "Value": "Keep Connecting | Coronavirus advice | Vodafone ",
                 "Name": "URL"
              },
                                {


527
                 "Value": "ReDirect",
                 "Name": "Action"
              }
           ]
        },
                    {
           "Type": "Button",
           "Outcome": "Dismissed",
           "Id": "AppDismissAction",
           "Detail":                [
                                {
                 "Value": "2",
                 "Name": "Index"
              },
                                {
                 "Value": "Not Now",
                 "Name": "Label"
              },
                                {
                 "Value": "Dismiss",
                 "Name": "Action"
              }
           ]
        }
     ],
     "OfferVariant": "PAYMInformation",


528
     "Priority": 1,
     "Channel": "App",
     "SubChannel": "Discover",
     "OfferId": "ENG002",
     "OfferName": "CustomerInformation2",
     "TreatmentId": "ENG002-T0001",
     "OfferDescription": "",
     "TreatmentVariant": "TreatmentVariantDefault",
     "Detail":          [
                    {
           "Value": "<https://cdn.vodafone.co.uk/en/assets/images/desktop/948_x_478px_Headline.png",>
           "Name": "imageURL"
        },
                    {
           "Value": "Our Response to Covid 19",
           "Name": "title"
        },
                    {
           "Value": "Hints to help you get the best out of our network",
           "Name": "body"
        }
     ],
     "TreatmentName": "CustomerInformation2_App"
  },
        {


529
     "Propensity": 0.25,
     "Actions":          [
                    {
           "Type": "Button",
           "Outcome": "Dismissed",
           "Id": "AppDismissAction",
           "Detail":                [
                                {
                 "Value": "Not Today",
                 "Name": "Label"
              },
                                {
                 "Value": "2",
                 "Name": "Index"
              },
                                {
                 "Value": "Dismiss",
                 "Name": "Action"
              }
           ]
        },
                    {
           "Type": "Button",
           "Outcome": "Clicked",
           "Id": "AppDirectToURLAction",
           "Detail":                [


530
                                {
                 "Value": "Find out More",
                 "Name": "Label"
              },
                                {
                 "Value": "1",
                 "Name": "Index"
              },
                                {
                 "Value": "Mobile Broadband | Tablets, Dongles & Mobile WiFi | Vodafone ",
                 "Name": "URL"
              },
                                {
                 "Value": "ReDirect",
                 "Name": "Action"
              }
           ]
        }
     ],
     "Priority": 5,
     "OfferVariant": "OfferVariantDefault",
     "Channel": "App",
     "SubChannel": "Discover",
     "OfferId": "XSL021",
     "OfferName": "AddMifi",


531
     "TreatmentId": "XSL021-01",
     "OfferDescription": "",
     "TreatmentVariant": "TreatmentVariantDefault",
     "Detail":          [
                    {
           "Value": "<https://cdn.vodafone.co.uk/en/assets/images/desktop/MVA10_UKDIG29282_MiFiApp_v2.png",>
           "Name": "imageURL"
        },
                    {
           "Value": "Mobile Broadband",
           "Name": "title"
        },
                    {
           "Value": "Data on the go for less with 15% off our MiFi dongles",
           "Name": "body"
        }
     ],
     "TreatmentName": "AddMifi_App"
  },
        {
     "Propensity": 0.25,
     "Actions":          [
                    {
           "Type": "Button",
           "Outcome": "Dismissed",
           "Id": "AppDismissAction",


532
           "Detail":                [
                                {
                 "Value": "2",
                 "Name": "Index"
              },
                                {
                 "Value": "No Thanks",
                 "Name": "Label"
              },
                                {
                 "Value": "Dismiss",
                 "Name": "Action"
              }
           ]
        },
                    {
           "Type": "Button",
           "Outcome": "Clicked",
           "Id": "AppDirectToURLAction",
           "Detail":                [
                                {
                 "Value": "<https://www.vodafone.co.uk/web-shop/login?successReturnUrl=/mobile/best-sim-only-
deals&errorReturnUrl=/mobile/best-sim-only-deals",>
                 "Name": "URL"
              },
                                {


533
                 "Value": "Shop now",
                 "Name": "Label"
              },
                                {
                 "Value": "1",
                 "Name": "Index"
              },
                                {
                 "Value": "ReDirect",
                 "Name": "Action"
              }
           ]
        }
     ],
     "Priority": 4,
     "OfferVariant": "OfferVariantDefault",
     "Channel": "App",
     "SubChannel": "Discover",
     "OfferId": "XSL008",
     "OfferName": "AddMobileSIMO",
     "TreatmentId": "XSL008-T0005",
     "OfferDescription": "",
     "TreatmentVariant": "TreatmentVariantDefault",
     "TreatmentName": "AddMobileSIMO_App"
  },


534
        {
     "Propensity": 0.25,
     "Actions":          [
                    {
           "Type": "Button",
           "Outcome": "Dismissed",
           "Id": "AppDismissAction",
           "Detail":                [
                                {
                 "Value": "No Thanks",
                 "Name": "Label"
              },
                                {
                 "Value": "2",
                 "Name": "Index"
              },
                                {
                 "Value": "Dismiss",
                 "Name": "Action"
              }
           ]
        },
                    {
           "Type": "Button",
           "Outcome": "Clicked",
           "Id": "AppDirectToURLAction",


535
           "Detail":                [
                                {
                 "Value": "Shop now",
                 "Name": "Label"
              },
                                {
                 "Value": "1",
                 "Name": "Index"
              },
                                {
                 "Value": "<https://www.vodafone.co.uk/web-shop/login?successReturnUrl=/mobile/phones/pay-monthly-
contracts&errorReturnUrl=/mobile/phones/pay-monthly-contracts",>
                 "Name": "URL"
              },
                                {
                 "Value": "ReDirect",
                 "Name": "Action"
              }
           ]
        }
     ],
     "Priority": 2,
     "OfferVariant": "OfferVariantDefault",
     "Channel": "App",
     "SubChannel": "Discover",
     "OfferId": "XSL009",


536
     "OfferName": "AddMobilewithhandset",
     "TreatmentId": "XSL009-T0005",
     "OfferDescription": "",
     "TreatmentVariant": "TreatmentVariantDefault",
     "TreatmentName": "AddMobilewithhandset_App"
  },
        {
     "Propensity": 0.25,
     "Actions":          [
                    {
           "Type": "Button",
           "Outcome": "Dismissed",
           "Id": "AppDismissAction",
           "Detail":                [
                                {
                 "Value": "2",
                 "Name": "Index"
              },
                                {
                 "Value": "No Thanks",
                 "Name": "Label"
              },
                                {
                 "Value": "Dismiss",
                 "Name": "Action"


537
              }
           ]
        },
                    {
           "Type": "Button",
           "Outcome": "Clicked",
           "Id": "AppDirectToURLAction",
           "Detail":                [
                                {
                 "Value": "1",
                 "Name": "Index"
              },
                                {
                 "Value": "<https://www.vodafone.co.uk/web-shop/login?successReturnUrl=/mobile-broadband/tablets&errorReturnUrl=/mobile-
broadband/tablets",>
                 "Name": "URL"
              },
                                {
                 "Value": "Shop now",
                 "Name": "Label"
              },
                                {
                 "Value": "ReDirect",
                 "Name": "Action"
              }
           ]


538
        }
     ],
     "Priority": 3,
     "OfferVariant": "OfferVariantDefault",
     "Channel": "App",
     "SubChannel": "Discover",
     "OfferId": "XSL010",
     "OfferName": "AddTablet",
     "TreatmentId": "XSL010-T0005",
     "OfferDescription": "",
     "TreatmentVariant": "TreatmentVariantDefault",
     "TreatmentName": "AddTablet_App"
  } ],
"CustomerId": "1-AppTest"
}


539
Move output properties to Squad Zones KT
Objective
To have greater freedom in development for commercial squads through separation of concerns. We already have separation within the
proposition structure and built "squad zones" so that squads can manage their propositions independently of one another.
This functionality covers the introduction of separations of concern to the logic that populates data tokens and output properties. Currently
all output properties are populated through central strategies - e.g. PopulateOutputPropertiesForBatch.
 This functionality separate PopulateOutputProperties strategy for each squad that will be read into a central "Populate" strategy.
As the functionality will have highest priority for Squad defined properties below caution should be kept in mind while making any changes
in these new strategies.
Note: By setting output properties at the squad level you are overwriting any standard or default values applied in the core framework. Be
sure to apply any necessary filters to offer, treatment or execution mode when setting properties and only update the properties required. All
changes should be fully tested prior to release

Populate Output Properties change
The below list of populate output properties has been created  with naming convention as Populate[squadname]OutputProperties for
each Squad and placed under  AOMFW-Business-Artifacts rule set so that it can be updated by the different squad developers.
1. PopulateCareOutputProperties
2. PopulateCrossSellOutputProperties
3. PopulateEngagementOutputProperties
4. PopulateHBBOutputProperties
5. PopulateLoyaltyOutputProperties
6. PopulateRenewOutputProperties
7. PopulateRetainOutputProperties
8. PopulateRetentionOutputProperties
9. PopulateServiceOutputProperties
10. PopulateTradeInOutputProperties
11. PopulateUpsellOutputProperties
All strategies are created as place holders only with below structure, so that Squads can modify these strategies as per requirement.
Enable external Input.


Enable external Input.
Add a Set Property component with name ‘Set [SquadName] Specific Output Properties’ .
Connect Set Property component to Result component.


540
The new master strategy PopulateSquadSpecificOutputProperties  created in Business Artefact ruleset which calls all
Populate[squadname]OutputProperties strategies based on squad(Business Purpose) filter condition in it.
From external input connect it to squad specific filter condition e.g. For CrossSell Filter condition :
@equalsIgnoreCase(.BusinessPurpose,CrossSell) then call substrategy PopulateCrossSellOutputProperties finally connect the substrategy
to Result component.
Repeat above process for all existing squads.
The below list of strategies has been updated to call substrategy - PopulateSquadSpecificOutputProperties just before the Result
component.  so that it will have the greater priority over existing implemented output properties.
PopulateOutputPropertiesForBatch
PopulateOutputPropertiesForEmailByBatch
PopulateOutputPropertiesForMicrosite
PopulateOutputPropertiesForSMSByBatch
PopulateOutputPropertiesForT2S
PopulateOutputPropertiesForT2SControlGroups
PopulateOutputPropertiesForApp
PopulateOutputPropertiesForIBCC
PopulateOutputPropertiesForIVRAndSMS
PopulateOutputPropertiesForWeb
PopulateOutputPropertiesForeCare PopulateOutputPropertiesForTrigger
IH & IH Reporting change
Populating IH properties already have common properties and Default properties defined.
The below mentioned list of new strategies has been created  with naming convention as Set[squadname]IHProperties for each Squad
under AOMFW-Business-Artifacts rule set so that it can be updated by the different squad developers.
1. SetCareIHProperties
2. SetCrossSellIHProperties
3. SetEngagementIHProperties
4. SetHBBIHProperties
5. SetLoyaltyIHProperties
6. SetRenewIHProperties
7. SetRetainIHProperties
PopulateSquadSpecificOutputProperties


541
8. SetRetentionIHProperties
9. SetServiceIHProperties
10. SetTradeInIHProperties
11. SetUpsellIHProperties
All strategies are created as place holders only with below structures, so that Squads can modify these strategies as per requirement.
Enable external Input.
Add a Set Property component with name ‘Set [SquadName] Specific IH Properties’ .
Connect Set Property component to Result component.

The new master strategy SetSquadSpecificIHProperties  created in Business Artefact which calls all Set[squadname]IHProperties
strategies based on squad(Business Purpose) filter condition in it.
From external input connect it to squad specific filter condition e.g. For CrossSell Filter condition :
@equalsIgnoreCase(.BusinessPurpose,CrossSell) then call substrategy SetCrossSellIHProperties finally connect the substrategy to Result
component.
Repeat above process for all existing squads.
The existing strategy SetIHPropertiesForAllChannels updated to call external subStrategy component to call strategy -
SetSquadSpecificIHProperties just before the Result component, so that this will have most priority than existing implemented common
and default properties.
SetSquadSpecificIHProperties


542
Conditional investigation For RT APIs KT
Introduction
This new capability will enable easier debugging/investigation functionality for all real-time call to AOM by writing conditionally to new C*
Data Sets.
The “conditional” part of the functionality will be managed by “When” rules (in Local Ruleset) which could be updated to do the following -
Enable writing to new C* Data Sets
Use additional conditions to narrow down the scope of the investigation
 The functionality will be used in production environment or any test environment on demand to investigate issues as well as in Dev
environment during dev-testing of the changes in the Strategy FW.
If the associated When rule is set to true then whenever API is being triggered from Postman/SoapUI or from the source system, it will add
API request and customer details in associated C* Data sets. This populated Data set can be used to perform unit test in strategies to
investigate any issues related to API response.
By default when rules should be disabled.
The below is the list of APIs
1. GetNBA (TradeIn,App,IVR,Web,eCare,Retail,InboundCC,TOBi)
Data flow : GetNBA
Data set : DebugGetNBA- Key : CustomerID
When rule : DebugGetNBAIdentifyBestTreatmentsByTrigger
s (TIL)IdentifyBestTreatmentsByTrigger
sDebugBestTreatmentsByTrigger
sDebugBestTreatmentsByTrigger
s
ProcessEvent ProcessEvent DebugProcessEvent DebugProcessEvent
GetRecommendationList (GRPL)GetRecommendationList DebugGetRecommendationList DebugGetRecommendationList
IdentifyBestMicrositeTreatmentsIdentifyBestMicrositeTreatmentsDebugBestMicrositeTreatments DebugBestMicrositeTreatments
GetNextBestContent GetNextBestContent DebugGetNextBestContent DebugGetNextBestContent


GetNextBestContent GetNextBestContent DebugGetNextBestContent DebugGetNextBestContent
CaptureResponse CaptureResponse DebugCaptureResponse DebugCaptureResponse
GetCustomerNotifications GetCustomerNotifications DebugGetCustomerNotificationsDebugGetCustomerNotifications
GetCustomerUsageandAllowanc
eGetCustomerUsageandAllowanc
eDebugGetCustomerUsageandAll
owanceDebugGetCustomerUsageandAll
owance
GetNBA (TradeIn,
IVR,Web,eCare,App)GetNBA DebugGetNBA DebugGetNBA
GetAssistedUpgrade (VADR) GetAssistedUpgrade DebugAssistedUpgrade DebugAssistedUpgrade
GetProductList (VADR) GetProductList DebugGetProductList DebugGetProductList
ValidateBasket (VADR) ValidateBasket DebugValidateBasket DebugValidateBasket
ValidateDelete (VADR) ValidateDelete DebugValidateDelete DebugValidateDeleteAPI Data Flow Data set When rule


543
Switch on “expression” mode
Use the following expression -
1=1
/*
a. 1=1 or 1=2 : This enables or disables the debug
b. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible.
    Example :
Data flow : GetNBA - Separate branch path to add data in C* Data set DebugGetNBA.
When rule condition :  It should be true to store data in C* Data set . as 1=1
GetNBA API Request : Sample request used to hit from Postman/SoapUI.


544
Captured details in Data Set : DebugGetNBA
Open Data set DebugGetNBA
from Actions dropdown click on Run
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31{
"Identifier": {
"Account": {
"AccountNumber": "7000896019",
"Status": "EXISTING"
},
"ServiceNumber": "447368269207"
},
"RequestorDetail": {
"Channel": "App",
"SubChannel": "Discover"
},
"Context": {
"PrimaryContext": "",
"NoOfAction": 1,
"Detail": [
{
"Name": "ConnectionId",
"Value": "2163872383726173"
},
{
"Name": "international",
"Value": "Disabled"
},
{
"Name": "lost",
"Value": "Disabled"
}
]
}
}


545
Then it shows the customer details from spine and the context data from API request.
Strategy Investigation : In Test Run Panel of base strategy ‘IdentifyBestAppTreatmentsForSubscription’ Add data set as DebugGetNBA
and CustomerID = ‘-30184827’  for which the request has been triggered.


546

 Note : Detailed example given for GetNBA only for other APIs just Dataflow, Dataset and When rules details are mentioned. Other APIs
should be used in similar way as explained above example.
2. ProcessEvent
Data flow : ProcessEvent

Data set : DebugProcessEvent - Key : CustomerID

When rule : DebugProcessEvent


547
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible.
3. GetRecommendationList (GRPL)
Data flow : GetRecommendationList

Data set : DebugGetRecommendationList   - Key : CustomerID


548

When rule : DebugGetRecommendationList
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible
4. IdentifyBestMicrositeTreatments
Data flow : IdentifyBestMicrositeTreatments
Data set : DebugBestMicrositeTreatments- Key : CustomerID


549
When rule : DebugBestMicrositeTreatments
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible.
5. GetNextBestContent
Data flow : GetNextBestContent


550
Data set : DebugGetNextBestContent- Key : CustomerID
When rule : DebugGetNextBestContent
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible


551

6. CaptureResponse
Data flow : CaptureResponse
Data set : DebugCaptureResponse- Key : CustomerID
When rule : DebugCaptureResponse
Switch on “expression” mode
Use the following expression -


552
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible

7. GetCustomerNotifications
Data flow : GetCustomerNotifications
Data set : DebugGetCustomerNotifications- Key : CustomerID
When rule : DebugGetCustomerNotifications


553
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible

8. GetCustomerUsageandAllowance
Data flow : GetCustomerUsageandAllowance

Data set : DebugGetCustomerUsageandAllowance- Key : CustomerID


554
When rule : DebugGetCustomerUsageandAllowance
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible
9. IdentifyBestTreatmentsByTriggers (TIL)
 Data flow : IdentifyBestTreatmentsByTriggers


555
Data set : DebugBestTreatmentsByTriggers - Key : CustomerID
When rule : DebugBestTreatmentsByTriggers
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug


556
2. && .Context(NTID) = "255": This condition enables debug by NTID
*/
Please note that when rule should contain examples (commented) of additional condition
10. GetProductList (VADR)
Data flow : GetProductList
Data set : DebugGetProductList- Key : CustomerID
When rule : DebugGetProductList
Switch on “expression” mode


557
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible

11. GetAssistedUpgrade (VADR)
Data flow : GetAssistedUpgrade
Data set : DebugAssistedUpgrade- Key : CustomerID
When rule : DebugAssistedUpgrade


558
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible

12. ValidateBasket (VADR)
Data flow : ValidateBasket
Data set : DebugValidateBasket- Key : CustomerID


559
When rule : DebugValidateBasket
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/
Please note that when rule should contain examples (commented) of additional conditions that are possible

13. ValidateDelete (VADR)
Data flow : ValidateDelete


560
Data set : DebugValidateDelete- Key : CustomerID
When rule : DebugValidateDelete
Switch on “expression” mode
Use the following expression -
1=1
/*
1. 1=1 or 1=2 : This enables or disables the debug
2. && TBC
*/


561
Please note that when rule should contain examples (commented) of additional conditions that are possible.


562
Seed Test Functionality KT
Introduction
The seed test functionality introduced to able to validate the new Offers/Treatments without going through the eligibility criteria for the
customer.
There are two types of seed test functionalities available.
1. Outbound Seed Testing
2. Inbound Seed Testing
Outbound Seed Testing :
Outbound Seed Testing covers Email(Mailjet and IMI), SMS and AppPush.
It uses the DataType : SeedUser and Activity : ExecuteSeedTest
SeedUser DataType Configuration
SeedUser Data Type has the information necessary for outbound seed testing.
CustomerID : Valid customerId for which seed test will be performed.
Data Tokens : JSON of Data tokens required to be replaced, example {"FirstName":"TestName","SurName":"TestSurtName"}
Email address : Any valid email to which email need to be sent example : test@vf.com
ServiceNumber : Valid ServiceNumber to which SMS to be sent example : 447587027740
SubscriberACR : It is required for AppPush channel to deliver offers.
Tags : It can be any String value, this should match while invoking ExecuteSeedTest Activity. example : Seed1
SeedUser ScreenShot from dev1

AOMBusinessConfig for SeedDataToken :
Add default data tokens in AOMBusinessConfig with SeedDataToken config type. Default data tokens can be any SR attribute being
used in SMS, Email & AppPush channels.


563
Note : If there is any data token defined on seed user level in SeedUser data type, then it takes precedence over the default data tokens
configured in AOMBusinessConfig  ConfigType ‘SeedDataTokens’.
ExecuteSeedTest Activity
ExecuteSeedTest activity is used to invoke the Seed Testing Process by passing below parameters
Tag – Seed Tag Name (Mandatory)
Channel – Seed Test Channel (Mandatory)
SeedParametersJSON – Seed Test Input Parameters in JSON format which includes below elements (Mandatory)
TreatmentName– Treatment Name of the selected treatment (Mandatory)
TreatmentVariant – Treatment Variant of the selected treatment (Mandatory)
OfferVariant – Offer Variant of the selected treatment variant (Mandatory)
IsParentTreatment – Parent/Child indicator for bundling operations (Mandatory for Email Channel as the bundling concept is
available for only Email channel)
UseLiveCustomerData – Use Live Customer Data flag (Optional)
SeedDataSize – Number of communications for each seed user (Optional)

Example Parameters for Running ExecuteSeedTest activity
seed1 AppPush [
{
"TreatmentName":"GenericOffer
_AppPush",
"TreatmentVariant":"DataCapOn
NearDepletion",
"OfferVariant":"OfferVariantDefau
lt"
}
]false NA Send AppPush
Treatment
seed2 SMS [
{
"TreatmentName":"RedirectCall_
SMS",false NA Send SMS TreatmentTag Channel SeedParametersJSON UseLiveCus
tomerDataSeedDataSiz
eNote


564
"TreatmentVariant":"RouteToOnli
ne",
"OfferVariant":"OfferVariantDefau
lt"
}
]
seed1 Email [
{
"TreatmentName":"MobileAddmo
bile_Email",
"TreatmentVariant":"AdCons",
"OfferVariant":"Handset",
"IsParentTreatment":true
}
]false NA Send Standalone
Parent Email
Treatment
seed2 Email [
{
"TreatmentName":"MobileAddmo
bile_Email",
"TreatmentVariant":"AdCons",
"OfferVariant":"Handset",
"IsParentTreatment":true
},
{
"TreatmentName":"AddMobileSI
MO_Email",
"TreatmentVariant":"AdCons",
"OfferVariant":"OfferVariantDefau
lt",
"IsParentTreatment":false
},
{
"TreatmentName":"AddTablet_E
mail",
"TreatmentVariant":"AdConsGala
xyTab",
"OfferVariant":"OfferVariantDefau
lt",
"IsParentTreatment":false
}
]false NA Send Parent Email with
Child Treatment/s


565

Steps to Execute Seed Test via Activity.
1. Open Activity ExecuteSeedTest
2. click on Actions drop down and select Run option.seed1 AppPush [
{
"TreatmentName":"AddTablet_A
ppPush",
"TreatmentVariant":"AdCons",
"OfferVariant":"OfferVariantDefau
lt"
}
]true 3 Send AppPush
treatments by querying
SeedTestLiveData and
send 3 combination of
TreamentName,Treatm
entVariant,OfferVariant
seed1 SMS [
{
"TreatmentName":"AddSmartwat
ch_SMS",
"TreatmentVariant":"AndroidSma
rtWatch",
"OfferVariant":"Android"
}
]true 4 Send SMS treatments
by querying
SeedTestLiveData and
send 4 combination of
TreamentName,Treatm
entVariant,OfferVariant
seed1 Email [
{
"TreatmentName":"MobileAddmo
bile_Email",
"TreatmentVariant":"AdCons",
"OfferVariant":"SIMO",
"IsParentTreatment":true
},
{
"TreatmentName":"AddTablet_E
mail",
"TreatmentVariant":"AdConsGala
xyTab",
"OfferVariant":"OfferVariantDefau
lt",
"IsParentTreatment":false
}
]true 2 Send Parent Email with
Child Treatment by
querying
SeedTestLiveData and
send 2 combination of
TreamentName,Treatm
entVariant,OfferVariant


566
3. Click Run option the pop up to provide Parameters will be shown
4. Provide correct all Parameter details like
 Tag should be matched with dats provided in SeedUser Data Type.
Channel - Select appropriate channel SMS/Email/AppPush
SeedParameterJSON -  Add correct Treatment JSON in SeedParameterJSON
UserLiveCustomerData  - check/uncheck box as required
SeedDataSize  - If UserLiveCustomerData is checked then provide valid integer value.
5. then click on Run
6. If successful it will send Email/SMS, push app notification onto users mobile.
7. If failed it will show the associated Error.


567
Logic Changes  :
1. Data Flow : GetPropositionDataForTreatment
Strategy : GetPropositionDataForTreatment
Channel Usage : Email, SMS, AppPush
App Invokes the DF GetPropositionDataForTreatment  with Treatment data for each TreatmentID, TreatmentVariant, OfferVariant included
in SeedParametersJSON parameter.
The DF GetPropositionDataForTreatment invokes strategy 'GetPropositionDataForTreatment ', which validates if the passed treatment data
is valid or not by checking those against the data present in Decision Data. For Email channel it populates associated subchannel from
Treatementtosubchannel DD. The treatment records will be dropped if those doesn’t match with DDs.
After successful validation DF outputs Treatments SR List then App checks if the IsParentTreatment is true,  checks if the selected parent
treatment is parent/child. If the selected treatment is child, ErrorMessage is populated as "Treatment Is Child".
App throws an error in below scenarios,
If mandatory parameters Tag, Channel or SeedParametersJSON are missing.
If passed SeedParametersJSON is not a correct JSON structure.
If passed Tag is not configured in SeedUser DataType.
For Email channel if email address is not configured in SeedUser Data Type.
For SMS channel if Service Number is not configured in SeedUser Data Type.
For AppPush channel if Subscriber ACR is not configured in SeedUser Data Type.
If passed Treatment to be tested not available in the corresponding decision data.

If Channel is SMS :
App calls activity 'Process SMS Seed Test'
App Substitutes data tokens for SMSBodyText & TreatmentDynamicVariables1 properties, which contains SMS text by taking values
from the given Treatment page.
App calls SendSMSMessage activity to deliver SMS treatment.
Note : Logic is not invoked as part SMS seed test.


Note : Logic is not invoked as part SMS seed test.
If Channel is AppPush :
App calls InvokeAppPushNotification activity to push app notification onto users mobile.
Note : Logic is not invoked as part SMS seed test.
If Channel is Email with Parameter Subchannel which should be either MailJet or IMI
App populates Context page with all data token values prepared in SeedUserSR.
App populates TreatmentList page list with all treatments data.
App sets  the CustomerId, ServiceNumber, BillingAccountNumber, Email, Consent Flags, and CustomerAccount.Contact fields for
Subscription page to contact seed user.
If Subchannel is MailJet
App calls DF PrepareEmailTreatmentsForSeedTest which internally calls the strategy ‘PrepareEmailTreatments’
The strategy apply bundling (applicable if SeedParametersJSON includes child treatments) and also apply data token replacement.
App calls ProcessOffer activity to deliver Email treatments.
If Subchannel is IMI


568
App truncate EmailCustomersWithParentTreatmentsForChannelManagementSeedTest and
EmailCustomersWithChildTreatmentsForChannelManagementSeedTest data sets.
App calls DF PrepareEmailTreatmentsByChannelManagementForSeedTest which internally calls the strategy
‘PrepareEmailTreatmentsByChannelManagement’ .
The strategy to apply bundling (applicable if SeedParametersJSON includes child treatments) and populates the all required data to be
sent to IMI.
Then write the Parent treatment data to data set EmailCustomersWithParentTreatmentsForChannelManagementSeedTest
And child treatment data to  data set EmailCustomersWithChildTreatmentsForChannelManagementSeedTest
Data Token replacement is done at App level.
App uses the data from these two data sets and call the  PrepareRequest activity with the payload parameter SR page's JSON.
App calls SendEmail activity with SourceId and SourceType parameters to send the email.

Inbound Seed Testing :
GetNBA Seed testing functionality that bypass business rules and present relative offers and treatments back to channel with no relative
business rules applied.
It is available for channels App,Web,IVR,InboundCC,Retail,eCare and TOBi
The AOM config value SeedTestEnabled for GetNBA should be true to use Inbound seed testing.
If SeedTestEnabled is true then the API response will use the treatment details configured in SeedUserNBAWhitelist otherwise it takes
BAU path.
Configure in data in Data Type SeedUserNBAWhitelist :
The SeedUserNBAWhitelist specifies the TreatmentName, TreatmentVariant and OfferVariant combination to do seed testing in GetNBA
for a given ServiceNumber, Channel and SubChannel.


569
App calls the Activity ExecuteNBASeedTest which gets default & seed user data tokens for a service number and after calling
PrepareInboundNBAForSeedTest DF, it replaces data tokens for TreatmentAttributes & ActionTemplateDetail properties in strategy
result list
Logic changes :
Data Flow : PrepareInboundNBAForSeedTest

App calls the DF PrepareInboundNBAForSeedTest, it calls strategy ‘PrepareInboundNBAForSeedTest’
This strategy imports data from data type ‘SeedUserNBAWhitelist’ using data page D_SeedUserNBAWhitelist with ServiceNumber as
input.
Then it checks for channel from context and and if treatment details passed from SeedUserNBAWhitelist are valid or not by checking
against the DDs.
Then it checks if the treatment is Parent or child and sets Parentchild accordingly and then invoke the existing strategy
‘PopulateOutputPropertiesForGetNBA’ to populate output details for GetNBA Response API.


570
There will not be IH entry for Inbound Seed Testing.
Example API request for GetNBA App channel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31{
"Identifier": {
"Account": {
"AccountNumber": "7000896019",
"Status": "EXISTING"
},
"ServiceNumber": "447368269207"
},
"RequestorDetail": {
"Channel": "App",
"SubChannel": "Discover"
},
"Context": {
"PrimaryContext": "",
"NoOfAction": 1,
"Detail": [
{
"Name": "ConnectionId",
"Value": "2163872383726173"
},
{
"Name": "international",
"Value": "Disabled"
},
{
"Name": "lost",
"Value": "Disabled"
}
]
}
}


571
Channel Management Email OPTI KT
Objective :
The purpose is to move from existing Pega Marketing email delivery(Mailjet) to IMI. As part of this change the new subchannels IMI and
Mailjet will be introduced for Email channel. IMI will serve for IMI service and Mailjet for existing Pega Marketing email campaign.
The purpose of solution is to allow Mailjet and IMI sub-channels to be live and functional in the framework at the same time. As this is dual
running solution any given e-mail treatment cannot be configured to more than one e-mail subchannel at a time.
Mailjet e-mail will continue to function exactly as it does today. Treatments configured to subchannel Mailjet will take existing Pega
Marketing route to deliver email and treatments configured to subchannel IMI will take the API route to IMI to deliver email. IMI e-mail will
use the templating solution supported by the PM tool with T2TV attributes.
The Subchannel details will be written to IH. The PM tool will enable to create multiple subchannels for channels(Email).


572
Propositions and PM Tool screens for Channel Management Email
Offers, Treatments details will be updated via ‘Offer’ and ‘Treatment’ screens of PM tool. Test offer and treatment names look like below.
More details present in Offer Catalogue.

ParentChildTreatments : The below details configured using ‘Parent Child Treatments’ screen.

Channel Screen: Email is the existing channel so need to add new channel from PM tool ‘Channel’ screen.
Subchannel Screen : Two new subchannels IMI and Mailjet configured for Channel Email.MobileAddmobile Email IMI MobileAddmobile_Email
MobileAddFixed Email Mailjet MobileAddFixed_Email
Dummy_AddMobilewithhandset Email IMI Dummy_AddMobilewithhandset_Email
Dummy_AddMobileSIMO Email IMI Dummy_AddMobileSIMO_Email
Dummy_AddTablet Email IMI Dummy_AddTablet_Email
Dummy_AddSmartwatch Email IMI Dummy_AddSmartwatch_Email
MobileAddmobile Email IMI MobileAddmobile_Email
AddSmartwatch Email IMI AddSmartwatch_EmailOffer Name Channel SubChannel Treatment
MobileAddmobile_Email Dummy_AddMobilewithhandset_Email
MobileAddmobile_Email Dummy_AddTablet_Email
MobileAddmobile_Email Dummy_AddMobileSIMO_Email
MobileAddmobile_Email Dummy_AddSmartwatch_EmailBundleParentTreatment BundleChildTreatment


573

Treatment To Subchannel :
This is handled at the Treatment screen. All available subchannels for the channel(Email)  will be displayed to map to treatment.

Template Attribute Screen :
Configured the new Template Attributes required for IMI.Email IMI
Email MailjetChannel SubChannel
EmailSubjectLine Long Text
ClickThroughURL Long Text
OfferHeader Short Text
ImageURL Long Text
EmailCopy Long TextName Type


574

Template Screen :
1. New templates “EmailParent” and “EmailChild” are  created.
2. Add Attributes to new templates
Later data is added to the template from Treatment To Treatment Variations screen.
TreatmentToTreatmentVariations Screen : EmailCopy1 Long Text
EmailCopy2 Long Text
NormalPrice Short Text
UpfrontPrice Short Text
Price Short Text
SKU Short Text
MobileImageURL Long Text
TotalAmount Short Text
PlanCost Short Text
TotalLoan Short Text
ContractPeriod Short Text
ValueText17 Long Text


575

Template mapping screen :

The value mapping for each attribute.


577
Channel Management Email Logic
Channel Management change uses the existing framework to enable the API for IMI and existing Mailjet.
Logic has changes in Batch and Extractor Logic.
Batch Logic changes includes the mapping of each treatment to associated subchannel, based on subchannel details the routes for IMI and
Mailjet are separated in extractor data flows so that Mailjet will take existing route and IMI will take the route to populate the details include
treatments attributes required to send in API request to IMI.
IMI follows the templating solution and the template attributes will be sent to App as payload.
1. Batch Logic change :
Logic enables the mapping of each Email treatment with associated Subchannel configured in ‘TreatmentToSubChannels’ Decision
Data, and remaining flow is the same till it writes the data to Data set ‘BestOBTreatmentsByBatch’.
Updated Strategy : PopulateOutputProperties to call new substrategy : IdentifyTreatmentSubChannelForEmail
strategy : IdentifyTreatmentSubChannelForEmail - which gets the target subchannel details from TreatmentToSubChannels DD and
maps to each email treatment.
2. Extractor Logic change
To make sure the logic works for dual running for both IMI and Mailjet, the separate paths has been added based on subchannel in new
data flow ‘ProcessEmailByBatch’


578
The Mailjet path writes into existing data set ‘BestEmailTreatmentsAfterControlGroups’ and the rest of the flow follows the existing logic
for Mailjet(Pega Marketing route).
The IMI path writes the details to two new data sets ‘BestEmailTreatmentsForChannelManagement’ - it includes all eligible treatments
and ‘UniqueListOfEmailCustomersForChannelManagement’ - It will have unique list of customers, this will be used to avoid unnecessary
check  multiple records for each customer.
New Data flow : ProcessEmailByChannelManagement will be called by Extractor flow. The data in data set
BestEmailTreatmentsForChannelManagement will be passed to new strategy ‘PrepareEmailTreatmentsByChannelManagement’ which
process the only IMI treatments and populated the output properties required for IMI API request to each treatments.

The Parent treatment data will be written to data set ‘EmailCustomersWithParentTreatmentsForChannelManagement’.
The child treatment data will be written to data set ‘EmailCustomersWithChildTreatmentsForChannelManagement’
The Parent and child treament records will be written to IH and IHReporting tables.
For each extractor run the data sets ' EmailCustomersWithParentTreatmentsForChannelManagement' and
‘EmailCustomersWithChildTreatmentsForChannelManagement’ will be cleared and then it will call data flow
'ProcessEmailByChannelManagement '.
The Strategy : PrepareEmailTreatmentsByChannelManagement


579
It process only IMI treatments and check for each treatment if it is a Parent with child or Independent Parent(without child) and also set
BundleParent property true for parent treatment and false for child treatments.
It calls the new strategy ‘PopulateOutputPropertiesForEmailByChannelManagement’ which does the mapping of required data and pick
up the T2TV attributes (Template details) and map to each treatment SR page.
It populated the below property details for Parent/Independent treatments, from spine data

The configured Email template details from PM Tool in T2TV attributes DD are mapped to each Parent/ child treatments.
App calls the Data Flow  PrepareDataForEmailStaging in extractor flow which combines data from Parent and child datasets and
bundles in one record and store in data set EmailStaging (table email_staging)
.FirstName NameValidation.FirstName
.Surname NameValidation.Surname
ServiceNumber @if(Primary.Context("ServiceNumber")!="",Primary.Context("Service
Number"),Primary.ServiceNumber)
BillingAccountNumber Primary.BillingAccountNumber
pyEmailAddress @if(Primary.Context("pyEmailAddress")!="",Primary.Context("pyEmai
lAddress"),Primary.CustomerAccount.Contact.EmailAddress)
Title Primary.CustomerAccount.Contact.Title
MMSMarketingConsentFlag Primary.MMSMarketingConsentFlag
SMSMarketingConsentFlag Primary.SMSMarketingConsentFlag
LocationDataConsentFlag Primary.LocationDataConsentFlag
TrafficDataConsentFlag Primary.TrafficDataConsentFlag
ProfilingConsentFlag Primary.ProfilingConsentFlag
EmailMarketingConsentFlag Primary.CustomerAccount.Contact.EmailMarketingConsentFlag
AccountPool "BatchNBA"
ValueInteger1 @AOMUtilities.GetCachedAOMConfigValue("ThrottlePartitionSize","
Email",false)
PartitionKey @AOMUtilities.GetNextPartitionKey("Email",.ValueInteger1)Property Name Value


580
The sample payload record looks like below :

{
"AccountID":"760101551"
,"AccountPool":"BatchNBA"
,"ActedInAgent":"N/A"
,"AgentUsername":"N/A"
,"AOMInteractionId":"cd63e758-1d09-47d0-ba2b-4b25af83657a"
,"AOMSelectionType":"NBA"
,"BillingAccountNumber":"760101551"
,"BundleName":"MobileAddmobile_Email"
,"BundleParent":"true"
,"BundleType":"FixedBundle"
,"BusinessPurpose":"CrossSell"
,"BusinessPurposeScore":"0.0"
,"BusinessSegment":"CrossSell"
,"CallCentreOutcome":"N/A"
,"CallCentrePhoneNo":"N/A"
,"CallerType":"N/A"
,"CaseId":"E-314431"
,"Channel":"Email"
,"ChannelConnectionID":"N/A"
,"ChannelContentID":"N/A"
,"ClickedURL":"N/A"
,"Comment":"N/A"
,"ConsumerEnterpriseFlag":"C"
,"ContactDetail":"anteshwar.tondare@adqura.com"
,"ContactId":"CON101815-STF"
,"ControlGroupLevel":"Offer"
,"ControlGroupPercentage":"0"
,"CreateCustomerInteraction":"false"
,"CreateTs":"20220915T090402.586 GMT"
,"CustomerSegment":"ConsumerPostpay"
,"DeceasedFlag":"N"
,"DefaultContractMonths":"2"
,"Description":"All Calls Outgoing Only Bar-Barring Set"
,"DVTMode":"false"
,"EmailAddress":"anteshwar.tondare@adqura.com"
,"EmailMarketingConsentFlag":"Y"
,"Enabled":"true"
,"EndDate":"20311201T131900.000 GMT"


,"Enabled":"true"
,"EndDate":"20311201T131900.000 GMT"
,"Error":"N/A"
,"ErrorRelation":"N/A"
,"EventType":"Default"
,"ExecutionMode":"Batch"
,"FirstName":"Ravi"
,"FUTList":"N/A"
,"IHRId":"596a570b-a72f-4a8d-a7e3-0d9549bc830c"
,"InAOMControlGroup":"N"
,"InControlGroup":"N"
,"InMarketingTest":"Y"


581
,"Intent":"Buy-Mobile"
,"IntentRelevance":"21.00"
,"IntentScore":"100.0"
,"IsFixedProduct":"N"
,"IVRRoutingRecommendation":"N/A"
,"LocationDataConsentFlag":"N"
,"Mandatory":"No"
,"MaxChildren":"4"
,"MMSMarketingConsentFlag":"Y"
,"ModelDetails":"['967':'20220914023422']"
,"NTID":"N/A"
,"OBCMarketingConsentFlag":"Y"
,"OfferDynamicVariable1":"N/A"
,"OfferID":"XSL007"
,"OfferName":"MobileAddmobile"
,"OfferValue":"127.700000000"
,"OfferVariant":"Handset"
,"OfferWeight":"0.000000000"
,"ParentChild":"Parent"
,"ParentOfferName":"MobileAddmobile"
,"PartitionKey":"4"
,"PrepayPostpayType":"Postpaid"
,"PriorityScore":"459.56011"
,"ProductDescription2":"CTR"
,"ProductDescription3":"Calls Outgoing"
,"ProductRecommendation":"Default"
,"ProductRecommendationType":"Default"
,"ProfilingConsentFlag":"Y"
,"PropensitySource":"BDC"
,"ProspectFlag":"N"
,"pxDecisionReference":"MAM-EMAIL-101551-STF 2599872217238775858"
,"pxDecisionTime":"20220915T111435.230 GMT"
,"pxFactID":"2599872217238775859"
,"pxIdentifier":"/CrossSell/Email/MobileAddmobile_Email"
,"pxInteractionID":"2599872217238775858"
,"pxObjClass":"VFUK-AOMFW-SR"
,"pxOutcomeTime":"20220915T111441.692 GMT"
,"pxRank":"1"


,"pxOutcomeTime":"20220915T111441.692 GMT"
,"pxRank":"1"
,"pxUpdateDateTime":"20220915T111442.112 GMT"
,"pxUpdateOperator":"ravikiran.chitturi@adqura.com"
,"pxUpdateOpName":"ravikiran chitturi"
,"pyApplication":"AOMFW"
,"pyApplicationVersion":"01.03.01"
,"pyChannel":"Email"
,"pyComponent":"SetDefaultValuesToIHProperties"
,"pyDirection":"Outbound"
,"pyEmailAddress":"anteshwar.tondare@adqura.com"
,"pyGroup":"Email"
,"pyInteraction":"ProcessEmailByChannelManagement"
,"pyIsPropositionActive":"Date"
,"pyIssue":"CrossSell"
,"pyLabel":"MobileAddmobile_Email"


582
,"pyName":"MobileAddmobile_Email"
,"pyOutcome":"Pending"
,"pyPreviousComponent":"SetDefaultValuesToIHProperties"
,"pyPropensity":"3.4343"
,"pyStrategy":"PrepareEmailTreatmentsByChannelManagement"
,"pySubjectID":"MAM-EMAIL-101551-STF"
,"pySubjectType":"VFUK-FW-AOMFW-Data-Subscription"
,"pyUserIdentifier":"ravikiran.chitturi@adqura.com"
,"pzADMInputSource":"modelReferences"
,"pzDataFlowRecordContext":null
,"pzPartition":null
,"RampUpFlag":"N"
,"RampUpValue":"0"
,"Rank":"1"
,"RankingScore":"0.0"
,"RecommendationID":"N/A"
,"Scenario":"Default"
,"SendIdentifier":"N/A"
,"ServiceId":"447722101551"
,"ServiceNumber":"447722101551"
,"ServiceProductSetName":"Voice and Email"
,"ShortDescription":"MobileAddmobile"
,"SMSMarketingConsentFlag":"Y"
,"SocialMediaConsentFlag":"Y"
,"Source":"N/A"
,"StartDate":"20200401T121900.000 GMT"
,"StoreId":"N/A"
,"SubEventType":"Default"
,"SubscriptionDataPlanInBatchNBA":"Limited"
,"Surname":"Chitturi"
,"SurveyMarketingConsentFlag":"Y"
,"TargetSubChannel":"IMI"
,"TemplateID":"EmailParent"
,"TestGroupExpiry":"20220915T111441.692 GMT"
,"TILResponse":"N/A"
,"Title":"Mr."
,"TrafficDataConsentFlag":"Y"
,"TreatmentAttributes":"


,"Title":"Mr."
,"TrafficDataConsentFlag":"Y"
,"TreatmentAttributes":"
{\n\"TotalLoan\":\"N/A\",\n\"ContractPeriod\":\"N/A\",\n\"PlanCost\":\"N/A\",\n\"TotalAmount\":\"N/A\",\n\"MobileImageURL\":\"Vodafone – Ou
r Best Ever Network | Now With 5G  an existing customer you are eligible for an exclusive discount when adding an additional plan to your
account. There are a huge range of additional plans including tablets, SIM only plans and mobile broadband devices to use your discount on.
<tr> <tr> Plus you can explore our new Vodafone EVO plans which give you the flexibility to get the phone you want at the price you
choose.\",\n\"imageURL\":\"Vodafone – Our Best Ever Network | Now With 5G , you're eligible for a 15%
discount\",\n\"ClickThroughURL\":\"https://www.vodafone.co.uk/upgrade-and-offers?&tab=ils\",\n\"ValueText17\":\"N/A\"\n}"
,"TreatmentDynamicVariable1":"[FirstName], you're eligible for a 15% discount"
,"TreatmentDynamicVariable12":"https://cdn.vodafone.co.uk/en/assets/images/desktop/VOD_MOD_MB_Hero_Image_Order_Confirmed.png
"
,"TreatmentDynamicVariable2":"https://www.vodafone.co.uk/upgrade-and-offers?&tab=ils"
,"TreatmentDynamicVariable4":"https://cdn.vodafone.co.uk/en/assets/images/desktop/VOD_MOD_DT_Hero_Image_Order_Confirmed.png"
,"TreatmentDynamicVariable5":"As an existing customer you are eligible for an exclusive discount when adding an additional plan to your
account. There are a huge range of additional plans including tablets, SIM only plans and mobile broadband devices to use your discount on.


<tr> <tr> Plus you can explore our new Vodafone EVO plans which give you the flexibility to get the phone you want at the price you


583
choose."
,"TreatmentID":"XSL007-T0002"
,"TreatmentName":"MobileAddmobile_Email"
,"TreatmentVariant":"AdCons"
,"Type":"Treatments Proposition Import"
,"ValueInteger1":"5"
,"WhiteMailMarketingConsentFlag":"Y"
,"TreatmentList":[
{
"AccountID":"760101551"
,"ActedInAgent":"N/A"
,"AgentUsername":"N/A"
,"AOMInteractionId":"cd63e758-1d09-47d0-ba2b-4b25af83657a"
,"AOMSelectionType":"NBA"
,"BundleName":"MobileAddmobile_Email"
,"BundleParent":"false"
,"BundleType":"FixedBundle"
,"BusinessPurpose":"CrossSell"
,"BusinessPurposeScore":"0.0"
,"BusinessSegment":"CrossSell"
,"CallCentreOutcome":"N/A"
,"CallCentrePhoneNo":"N/A"
,"CallerType":"N/A"
,"CaseId":"E-314431"
,"Channel":"Email"
,"ChannelConnectionID":"N/A"
,"ChannelContentID":"N/A"
,"ChildRank":"2"
,"ClickedURL":"N/A"
,"Comment":"N/A"
,"ConsumerEnterpriseFlag":"C"
,"ContactDetail":"anteshwar.tondare@adqura.com"
,"ContactId":"CON101815-STF"
,"ControlGroupLevel":"Offer"
,"ControlGroupPercentage":"0"
,"CreateCustomerInteraction":"false"
,"CreateTs":"20220915T090402.586 GMT"
,"DeceasedFlag":"N"
,"DefaultContractMonths":"2"
,"Description":"All Calls Outgoing Only Bar-Barring Set"
,"DVTMode":"false"


,"Description":"All Calls Outgoing Only Bar-Barring Set"
,"DVTMode":"false"
,"EmailAddress":"anteshwar.tondare@adqura.com"
,"EmailMarketingConsentFlag":"Y"
,"Enabled":"true"
,"EndDate":"20311201T131900.000 GMT"
,"Error":"N/A"
,"ErrorRelation":"N/A"
,"EventType":"Default"
,"ExecutionMode":"Batch"
,"FUTList":"N/A"
,"IHRId":"ae3f7059-e955-41ce-84d5-dab6deacd789"
,"InAOMControlGroup":"N"


584
,"InControlGroup":"N"
,"InMarketingTest":"Y"
,"Intent":"Buy-Mobile"
,"IntentRelevance":"21.00"
,"IntentScore":"100.0"
,"IsFixedProduct":"N"
,"IVRRoutingRecommendation":"N/A"
,"LocationDataConsentFlag":"N"
,"Mandatory":"No"
,"MMSMarketingConsentFlag":"Y"
,"ModelDetails":"['967':'20220914023422']"
,"NTID":"N/A"
,"OBCMarketingConsentFlag":"Y"
,"OfferDynamicVariable1":"N/A"
,"OfferID":"XSL027"
,"OfferName":"Dummy_AddMobilewithhandset"
,"OfferValue":"172.200000000"
,"OfferVariant":"OfferVariantDefault"
,"OfferWeight":"0.000000000"
,"ParentChild":"Child"
,"ParentOfferName":"MobileAddmobile"
,"PrepayPostpayType":"Postpaid"
,"PriorityScore":"64.05"
,"ProductDescription2":"CTR"
,"ProductDescription3":"Calls Outgoing"
,"ProductRecommendation":"Default"
,"ProductRecommendationType":"Tariff"
,"ProfilingConsentFlag":"Y"
,"PropensitySource":"Default"
,"ProspectFlag":"N"
,"pxDecisionReference":"MAM-EMAIL-101551-STF 2599872217238775858"
,"pxDecisionTime":"20220915T111435.230 GMT"
,"pxFactID":"2599872217238775860"
,"pxIdentifier":"/CrossSell/Email/Dummy_AddMobilewithhandset_Email"
,"pxInteractionID":"2599872217238775858"
,"pxObjClass":"VFUK-AOMFW-SR"


,"pxObjClass":"VFUK-AOMFW-SR"
,"pxOutcomeTime":"20220915T111441.692 GMT"
,"pxRank":"2"
,"pxUpdateDateTime":"20220915T111442.158 GMT"
,"pxUpdateOpName":"PM Push User"
,"pyApplication":"AOMFW"
,"pyApplicationVersion":"01.03.01"
,"pyChannel":"Email"
,"pyComponent":"SetDefaultValuesToIHProperties"
,"pyDirection":"Outbound"
,"pyGroup":"Email"
,"pyInteraction":"ProcessEmailByChannelManagement"
,"pyIsPropositionActive":"Date"
,"pyIssue":"CrossSell"
,"pyLabel":"Dummy_AddMobilewithhandset_Email"
,"pyName":"Dummy_AddMobilewithhandset_Email"
,"pyOutcome":"Pending"