<wcm:element name="specificationGroups.group.18.groupPriority">18</wcm:element>
<wcm:element name="specificationGroups.group.18.comparable">no</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.name.1">physical keyboard</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.value.1">No</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.specPriority.1">1</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.comparable.1">no</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.isKey.1">No</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.valueType.1">Text</wcm:element>
<wcm:element name="specificationGroups.group.18.specifications.valueUOM.1"/>
<wcm:element name="specificationGroups.group.18.specifications.footnote.1"/>
<wcm:element name="specificationGroups.group.18.specifications.description.1"/>
<wcm:element name="specificationGroups.group.18.specifications.hideInList.1">true</wcm:element>
<wcm:element name="specificationGroups.group.19.groupName">WIFI Calling</wcm:element>
<wcm:element name="specificationGroups.group.19.groupPriority">19</wcm:element>
<wcm:element name="specificationGroups.group.19.comparable">no</wcm:element>


<wcm:element name="specificationGroups.group.19.groupPriority">19</wcm:element>
<wcm:element name="specificationGroups.group.19.comparable">no</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.name.1">WIFI Calling</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.value.1">Available</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.specPriority.1">1</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.comparable.1">no</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.isKey.1">Yes</wcm:element>
<wcm:element name="specificationGroups.group.19.specifications.valueType.1">Text</wcm:element>


2733
<wcm:element name="specificationGroups.group.19.specifications.valueUOM.1"/>
<wcm:element name="specificationGroups.group.19.specifications.footnote.1"/>
<wcm:element name="specificationGroups.group.19.specifications.description.1"/>
<wcm:element name="specificationGroups.group.19.specifications.hideInList.1"/>
<wcm:element name="inTheBox"/>
</wcm:row>
VFUK-FW-AOMFW-Data-BundleMerchandising
Create VFUK-FW-AOMFW-Data-BundleMerchandising class
Create Dataset - BundleMerchandising
Keys -VersionId, ProductId
Create below properties in this class
XML Structure for BundleMerchandising
<wcm:row>
<wcm:element name="bundleId">112903</wcm:element>
<wcm:element name="control.isDisplayableEcare"/>
<wcm:element name="control.isSellableECare"/>
<wcm:element name="control.isDisplayableAcq">true</wcm:element>
<wcm:element name="control.isSellableRet">true</wcm:element>
<wcm:element name="control.isDisplayableRet">true</wcm:element>
<wcm:element name="control.isSellableAcq">true</wcm:element> VersionId Integer NA
ProductId Text wcm:element name="bundleId"
IsDisplayableEcare Boolean wcm:element
name="control.isDisplayableEcare"
IsSellableEcare Boolean wcm:element
name="control.isSellableECare"
IsDisplayableAcquisition Boolean wcm:element
name="control.isDisplayableAcq"


IsDisplayableAcquisition Boolean wcm:element
name="control.isDisplayableAcq"
IsSellableRetention Boolean wcm:element name="control.isSellableRet"
IsDisplayableRetention Boolean wcm:element
name="control.isDisplayableRet"
IsSellableAcquisition Boolean wcm:element name="control.isSellableAcq"
IsDisplayableSavedBasket Boolean wcm:element
name="control.isDisplayableSavedBasket"
DisplayGroup Text wcm:element name="displayGroup"
DisplayOrder Integer wcm:element name="control.order" PropertyName Type Mapped From


2734
<wcm:element name="control.isDisplayableSavedBasket"/>
<wcm:element name="control.order"/>
<wcm:element name="control.affiliateExport"/>
<wcm:element name="control.compareWith"/>
<wcm:element name="promoteAs.promotionName.1">30030</wcm:element>
<wcm:element name="promoteAs.promotionName.2">Bundle.SecureNet.2017.bingo</wcm:element>
<wcm:element name="promoteAs.promotionName.3">OFF100020</wcm:element>
<wcm:element name="promoteAs.promotionName.4">OFF100011</wcm:element>
<wcm:element name="promoteAs.promotionName.5">Voucher_Bingo_VA_25Pct_112965_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.6">Voucher_Bingo_VA_25Pct_112965_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.7">Voucher_Bingo_VA_25Pct_112965_sec</wcm:element>
<wcm:element name="postSaleJourney"/>
<wcm:element name="displayGroup">red51</wcm:element>
<wcm:element name="omniChannelDiscountEligible"/>
</wcm:row>
VFUK-FW-AOMFW-Data-ProductMerchandising
Create VFUK-FW-AOMFW-Data-ProductMerchandising class
Create Dataset - ProductMerchandising
Keys -VersionId, ProductId
Create below properties in this class
VersionId Integer NA


Keys -VersionId, ProductId
Create below properties in this class
VersionId Integer NA
ProductId Text wcm:element name="productId"
IsDisplayableEcare Boolean wcm:element
name="control.isDisplayableEcare"
IsSellableEcare Boolean wcm:element
name="control.isSellableECare"
IsDisplayableAcquisition Boolean wcm:element
name="control.isDisplayableAcq"
IsSellableRetention Boolean wcm:element name="control.isSellableRet"
IsDisplayableRetention Boolean wcm:element
name="control.isDisplayableRet"
IsSellableAcquisition Boolean wcm:element name="control.isSellableAcq"
IsDisplayableSavedBasket Boolean wcm:element
name="control.isDisplayableSavedBasket" PropertyName Type Mapped From/Description


2735
XML Structure for ProductMerchandising
<wcm:row>
<wcm:element name="productId">206011</wcm:element>
<wcm:element name="control.isDisplayableEcare"/>
<wcm:element name="control.isSellableECare"/>
<wcm:element name="control.isDisplayableAcq">true</wcm:element>
<wcm:element name="control.isSellableRet">true</wcm:element>
<wcm:element name="control.isDisplayableRet">true</wcm:element>
<wcm:element name="control.isSellableAcq">true</wcm:element>
<wcm:element name="control.isDisplayableSavedBasket"/>
<wcm:element name="control.order"/>
<wcm:element name="control.preOrderable"/>
<wcm:element name="control.availableFrom"/>
<wcm:element name="control.availableFromWeeklyWindow"/>
<wcm:element name="control.backOrderable"/>
<wcm:element name="control.affiliateExport"/> DisplayGroup Text wcm:element name="displayGroup"
LeadPlanBySegment ValueGroup For Each:
leadPlans.leadPlanBySegment.segment.X
Name:
leadPlans.leadPlanBySegment.segment.X
Value:
leadPlans.leadPlanBySegment.leadPlanId.X

Example:
<wcm:element
name="leadPlans.leadPlanBySegment.segm
ent.1">Business</wcm:element>
<wcm:element
name="leadPlans.leadPlanBySegment.lead
PlanId.1">113406</wcm:element>
<wcm:element
name="leadPlans.leadPlanBySegment.segm


<wcm:element
name="leadPlans.leadPlanBySegment.segm
ent.2">Consumer</wcm:element>
<wcm:element
name="leadPlans.leadPlanBySegment.lead
PlanId.2">113406</wcm:element>
{
"Business" : "113406",
"Consumer": "113406"
}


2736
<wcm:element name="control.compareWith"/>
<wcm:element name="control.backorderMessage"/>
<wcm:element name="segment"/>
<wcm:element name="productGroups.productGroupName.1">CompatibleDeliveryMethods_CnC_PremiumDelivery</wcm:element>
<wcm:element name="productGroups.groupRole.1">Compatible Delivery</wcm:element>
<wcm:element name="productGroups.productGroupName.2">Insurance Tier 1</wcm:element>
<wcm:element name="productGroups.groupRole.2">Compatible Insurance</wcm:element>
<wcm:element name="promoteAs.promotionName.1">OCP_P_5pct_PAYM</wcm:element>
<wcm:element name="promoteAs.promotionName.2">OCP_P_10pct_PAYM</wcm:element>
<wcm:element name="promoteAs.promotionName.3">EBU_W_WAM_C_Handset_Online</wcm:element>
<wcm:element name="promoteAs.promotionName.4">OCP_P_20pct_PAYM</wcm:element>
<wcm:element name="promoteAs.promotionName.5">Voucher_PayM_EBU_AddOn_15Pct_112130_All</wcm:element>
<wcm:element name="promoteAs.promotionName.6">Voucher_PayM_EBU_AddOn_40Pct_110263_All</wcm:element>
<wcm:element name="promoteAs.promotionName.7">Voucher_PayM_VdAdv_15Pct_109769_aq</wcm:element>


<wcm:element name="promoteAs.promotionName.8">Voucher_PayM_VdAdv_15Pct_109769_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.9">Voucher_PayM_Brclys_20Pct_109001_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.10">Voucher_PayM_Brclys_20Pct_109001_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.11">Voucher_PayM_Brclys_30Pct_109002_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.12">Voucher_PayM_Brclys_30Pct_109002_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.13">Voucher_PayM_Brclys_15Pct_109769_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.14">Voucher_PayM_Brclys_15Pct_109769_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.15">Voucher_PayM_VdAff_10Pct_104914_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.16">Voucher_PayM_VdAff_10Pct_104914_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.17">Voucher_PayM_Offer_10Pct_104914_aq</wcm:element>


<wcm:element name="promoteAs.promotionName.18">Voucher_PayM_WC_10Pct_104914_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.19">Voucher_PayM_Basket_10Pct_104914_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.20">Voucher_PayM_Basket_15Pct_107414_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.21">Voucher_PayM_Prtnrshp_15Pct_107414_both</wcm:element>
<wcm:element name="promoteAs.promotionName.22">Voucher_PayM_EBU_AddOn_15Pct_107414_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.23">Voucher_PayM_EBU_AddOn_20Pct_107409_aq</wcm:element>
<wcm:element name="promoteAs.promotionName.24">Voucher_PayM_AddOn_15pct_107414_ac</wcm:element>
<wcm:element name="promoteAs.promotionName.25">Voucher_PayM_EBU_Roaming_107409_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.26">Voucher_PayM_EBU_Roaming_104914_upg</wcm:element>
<wcm:element name="promoteAs.promotionName.27">OCP_P_15pct_PAYM</wcm:element>


<wcm:element name="promoteAs.promotionName.28">OCP_P_25pct_PAYM</wcm:element>
<wcm:element name="promoteAs.promotionName.29">OCP_P_30pct_PAYM</wcm:element>


2737
<wcm:element name="promoteAs.promotionName.30">EBU_36Mth_Plan_5pct</wcm:element>
<wcm:element name="promoteAs.promotionName.31">EBU_36Mth_Plan_15pct</wcm:element>
<wcm:element name="promoteAs.promotionName.32">EBU_36Mth_Plan_10pct</wcm:element>
<wcm:element name="promoteAs.promotionName.33">W_HH_HANDSET_01</wcm:element>
<wcm:element name="omniChannelDiscountEligible"/>
<wcm:element name="leadPlanId">113706</wcm:element>
<wcm:element name="leadPlans.leadPlanBySegment.segment.1">Business</wcm:element>
<wcm:element name="leadPlans.leadPlanBySegment.leadPlanId.1">113406</wcm:element>
<wcm:element name="leadPlans.leadPlanBySegment.segment.2">Consumer</wcm:element>
<wcm:element name="leadPlans.leadPlanBySegment.leadPlanId.2">113406</wcm:element>
<wcm:element name="fastMoving"/>
<wcm:element name="stockThresholdLimit"/>
<wcm:element name="compatibleWithWatch"/>
<wcm:element name="postSaleJourney"/>
<wcm:element name="displayGroup"/>
</wcm:row>
VFUK-FW-AOMFW-Data-ProductGroupDetails
Create VFUK-FW-AOMFW-Data-ProductGroupDetails class
Create Dataset - ProductGroupDetails
Keys -VersionId, GroupName


Create Dataset - ProductGroupDetails
Keys -VersionId, GroupName
Create below properties in this class
"Insurance Tier 1": {
"GroupId": 162, VersionId  Integer NA
GroupName  Text wcm:element
name="group.name"
GroupId  Integer wcm:element name="group.id"
GroupType  Text wcm:element
name="group.groupType"
MemberProductList  PageList (VFUK-FW-AOMFW-
Data-MEF-MemberProductList)For Each: wcm:element
name="group.member.id.X"
 ProductId Text wcm:element
name="group.member.id.X"
 Priority Integer wcm:element
name="group.member.priority.X" PropertyName PropertyName (Child level) Type Mapped From/Description


2738
"GroupType": "Compatible Insurance",
"MemberProducts": [
{
    "ProductId" : "110461",
    "Priority: 1
},
{
   "ProductId" : "110463",
   "Priority: 2
}
]
}
VFUK-FW-AOMFW-Data-ProductGroupMemberDetails
Create VFUK-FW-AOMFW-Data-ProductGroupMemberDetails class
Create Dataset - ProductGroupMemberDetails
Keys -VersionId, ProductId
Create below properties in this class
"110461": {
    "GroupName": "Insurance Tier 1",
    "GroupId": "162",
    "GroupType": "Compatible Insurance",     "MemberPriority": 1
}
XML Structure for ProdcutGroupDetails and ProductGroupMemberDetails
<wcm:row>
<wcm:element name="group.id">162</wcm:element>
<wcm:element name="group,name">Insurance Tier 1</wcm:element>
<wcm:element name="group.description"/>
<wcm:element name="group.media"/>
<wcm:element name="group.priority">1</wcm:element>
<wcm:element name="group.priority.upgrade"/>
<wcm:element name="group.groupType">Compatible Insurance</wcm:element>
<wcm:element name="group.member.id.1">110461</wcm:element>
<wcm:element name="group.member.priority.1">1</wcm:element>
<wcm:element name="group.member.id.2">110463</wcm:element>VersionId Integer NA
ProductId Text wcm:element name="productId"
GroupName Text wcm:element name="group.name"


ProductId Text wcm:element name="productId"
GroupName Text wcm:element name="group.name"
GroupId Integer wcm:element name="group.id"
GroupType Text wcm:element name="group.groupType"
MemberPriority Integer wcm:element
name="group.member.priority.X" PropertyName Type Mapped From/Description


2739
<wcm:element name="group.member.priority.2">2</wcm:element>
<wcm:element name="group.member.id.3">109608</wcm:element>
<wcm:element name="group.member.priority.3">3</wcm:element>
<wcm:element name="group.member.id.4">109609</wcm:element>
<wcm:element name="group.member.priority.4">4</wcm:element>
<wcm:element name="group.member.id.5">109606</wcm:element>
<wcm:element name="group.member.priority.5">5</wcm:element>
<wcm:element name="group.member.id.6">109607</wcm:element>
<wcm:element name="group.member.priority.6">6</wcm:element>
</wcm:row>

Open Points
BundleContent Dataset - Bundles list in MEF_content xml doesn’t have full.front and full.hero but properties are mentioned in class
structure.
What does ImageURLGroup in ProductContent means?
How to do purge based on versioning?


2740
Batch NBA Case Design
[ Setup Stage ] [ Process Stage] [ End Stage ] [ Abort Stage ] [ Elapse Stage ]
Setup Stage
Initialise Batch NBA Process
Invokes a SubFlow is called Initialise Flows . When invokes the flow, pass values as below.
Then, check CheckpointStatus, If it is Elapsed “Initialize sub-flow elapsed”. After that, it will routed to End.
Else, Initialize check point valid and it will routed to End.
Verify Campaign Status For BatchNBA Process
SupportEmailSubject AOM: Issue in BatchNBA Case
CheckpointCheck true
Wait yesParameter Name Parameter Value


2741
Invokes the Subflow is called Verify Campaign Status then, invokes Truncate Campaign Datasets activity.
Do the steps in TruncateCampaignDatasets activity  as below;
Truncate the BestEmailTreatmentsAfterControlGroups dataset
Truncate the BestSMSTreatmentsAfterControlGroups dataset
Check;
If ErrorStackTrace is Null or Empty, it is succesfull. Then, it will routed to End.
Else, it will be routed to  NotifySupport  subflow.
Verify Campain Status Flow
Checks the status of the Email and, only if the Channel Management toggle is not enabled, SMS Pega Marketing Campaigns via
VerifyCampaignStatus Activty.
Before run the activty, pass Channel=”Email” as a parameter to check Email campaign status, and pass Channel=”SMS” as a parameter to
check SMS campaign status.
In the case of any failure, it will be routed to  NotifySupport  subflow.
If any of the Campaigns in the previous run have failed or parent campaign is not in Running mode then the flow is routed to NotifySupport
and waits for the manual action.
If none of the campaigns in the previous run have failed and child campaign is resolved-completed then truncate
BestEmailTreatmentsAfterControlGroups and BestSMSTreatmentsAfterControlGroups datasets in TruncateCampaignDatasets Activty
and the flow continues with the rest of the NBA case stages/steps.
Process Stage
Initialise Treatment Buckets
This flow first invokes the activity InitialiseTreatmentBuckets. This activity does the following:
Executes the GetMaxCapacityForTreatments data flow which gets the maximum capacity for each active treatment.


2742
For each active treatment, a Loop calls the function AOMUtilities.setupRLB(mapName, bucketName, capacity, minutes):
mapName is hardcoded to “BatchNBAVolumeConstraints“. bucketName is set to .pyName, which will be the treatment name.
capacity is set to .MaxCapacity, which is the value returned from GetMaxCapacityForTreatments data flow. minutes is set to 24
hours in minutes, i.e. 1440 .
If the data flow or activity fail then .ErrorStackTrace and .ErrorCode are set. The error is written to the AOM error log.
Check;
If ErrorStackTrace is Null or Empty, it is successful. Then, it will be routed to End.
Else, it will be routed to  NotifySupport  subflow.
Prepare Data With Intents For Batch NBA Process
Firstly, invokes subflow is called  Prepare Data For Batch NBA.
Check ;
1. DataFlowStatus = "Completed"   (DataFlowStatus is not “Completed“)
2. ErrorStackTrace=””  (Does not have any error in last rule)
If they are equal as above, it will be routed to  subflow is called Identify Customer Intents .
Else, it will be routed to  Notify Support subflow. Then, Re-Run  Prepare Data For Batch NBA. again.
Secondly, invokes Identify Customer Intents,
Check ;
1. DataFlowStatus = "Completed"   (DataFlowStatus is not “Completed“)
2. ErrorStackTrace=””  (Does not have any error in last rule)
If they are equal as above, it will be routed to End as Success path.
Else, it will be routed to  Notify Support subflow. Then, Re-Run  Prepare Data For Batch NBA. again.


2743
Prepare Data For Batch NBA Flow


2744
Invokes Start Data Flow, it is an activity is called PrepareDataForBatchNBA, then do below;
Truncate the SubscriptionDataForBatchNBA
Execute PrepareDataForBatchNBA dataflow.
If it is succesfull, it invokes a subflow is called Snooze. Then, invokes Check Data Flow Status, it is an activity is called
CheckPrepareDataForBatchNBADFStatus.
Else, it will be routed to End as Failure path.
Do the steps in CheckPrepareDataForBatchNBADFStatus activity  as below;
Execute the PrepareDataForBatchNBA DataFlow
Set the DataFlow status from Primary.DataFlowProgress.pyStatus
Check ;
1. DataFlowStatus != "Completed"   (DataFlowStatus is not “Completed“)
2. DataFlowStatus != "Failed"    (DataFlowStatus is not “Failed“)
3. DataFlowStatus != "Stopped"    (DataFlowStatus is not “Stopped“)
4. ErrorStackTrace=””  (Does not have any error in last rule)
If they are equal as above, it will be routed to Snooze again as In Progress path. Then, invokes Check Data Flow Status and do the same
steps that does  in CheckPrepareDataForBatchNBADFStatus  again.
Else, it will be routed to End as Success/Failure path.
In case of failure, truncate the SubscriptionDataForBatchNBA dataset and re-run the PrepareBatchData DF
Identify Customer Intents Flow


2745
Invokes Start Data Flow, it is an activity is called IdentifyCustomerIntents, then do below;
Execute IdentifyCustomerIntents dataflow.
If it is succesfull, it invokes a subflow is called Snooze. Then, invokes Check Data Flow Status, it is an activity is called
CheckIdentifyCustomerIntentsDFStatus.
Else, it will be routed to End as Failure path.
Do the steps in CheckIdentifyCustomerIntentsDFStatus activity  as below;
Execute the IdentifyCustomerIntents DataFlow
Set the DataFlow status from Primary.DataFlowProgress.pyStatus
Check ;
1. DataFlowStatus != "Completed"   (DataFlowStatus is not “Completed“)
2. DataFlowStatus != "Failed"    (DataFlowStatus is not “Failed“)
3. DataFlowStatus != "Stopped"    (DataFlowStatus is not “Stopped“)
4. ErrorStackTrace=””  (Does not have any error in last rule)
If they are equal as above, it will be routed to Snooze again as In Progress path. Then, invokes Check Data Flow Status and do the same
steps that does  in CheckIdentifyCustomerIntentsDFStatus again.
Else, it will be routed to End as Success/Failure path.
Identify Best OB Treatments By Batch Process
Invokes Start Data Flow, it is an activity is called IdentifyBestOBTreatmentsByBatch, then do below;
Truncate the BestOBTreatmentsByBatch dataset
Execute IdentifyBestOBTreatmentsByBatch dataflow.
If it is succesfull, it invokes a subflow is called Snooze. Then, invokes Check Data Flow Status, it is an activity is called
CheckIdentifyBestOBTreatmentsByBatchStatus.


CheckIdentifyBestOBTreatmentsByBatchStatus.
Else, it will be routed to  Notify Support subflow. Then, invokes Start Data Flow and do the same steps that does  in
IdentifyBestOBTreatmentsByBatch again.
Do the steps in CheckIdentifyBestOBTreatmentsByBatchStatus activity  as below;
Execute IdentifyBestOBTreatmentsByBatch dataflow
Set the DataFlowStatus from Primary.DataFlowProgress.pyStatus
Check ;
1. DataFlowStatus= "Completed"
2. ErrorStackTrace=””  (Does not have any error in last rule)
If they are equal as above, it will be routed to End as Successful path,


2746
Else, it will be routed to  Snooze, Then Then, invokes Check Data Flow Statu sand do the same steps that does  in
CheckIdentifyBestOBTreatmentsByBatchStatus again.

End Stage
Delete Treatment Buckets Map
This flow first invokes the activity DeleteTreatmentBucketsMap. This activity does the following:
Calls the function AOMUtilities.RemoveRLBMap(mapName):
mapName is hardcoded to “BatchNBAVolumeConstraints“.
If the data flow or activity fail then .ErrorStackTrace and .ErrorCode are set. The error is written to the AOM error log.
Check;
If ErrorStackTrace is Null or Empty, it is successful. Then, it will be routed to End.
Else, it will be routed to NotifySupport subflow.
Finalise Process

Finilise flow have two paremeters , None of parameters is picked for End Stage
Abort Stage
Abort Stage consists of only one process is called Finilise Flow.


2747
Finilise Process

Finilise flow have two paremeters , AbortStage parameter is picked for Abort Stage
Elapse Stage
Elase Stage consists of only one process is called Finilise Flow.
Finilise Process

Finilise flow have two paremeters , ElapseStage parameter is picked for Elapse Stage


2748
Oldest one

Setup

Initialise Batch NBASets the values required for the case to on the case page CaseStartTime,
CaseType, SupportEmailSubject, SupportEmail & SuccessEmailNeeded. Checks, if
the case triggered time is falling in between the current checkpoint interval, if so
then case will continue processing & case is runnable wrt to the conditions defined
in Is Case Runnable activity, the case processing started and case status is
updated as “Running”. Else it will snooze until the current time is falling in between
the current checkpoint interval.
Verify Campaign Status For
BatchNBAInvokes a Subflow and truncate campaign related datasets.
SubFlow: VerifyCampaignStatus
Checks the status of the SMS and Email Pega Marketing Campaigns.
If any of the Campaigns in the previous run have failed or parent campaign is not in
Running mode then the flow is routed to Support and waits for the manual action.
If none of the campaigns in the previous run have failed then truncate
BestEmailTreatmentsAfterControlGroups and
BestSMSTreatmentsAfterControlGroups datasets and the flow continues with the
rest of the NBA case stages/steps.

ProcessInitialise Treatment Buckets

Prepare Data With Intents For Batch
NBA
Identify Best OB Treatments By
BatchExecute InitialiseTreatmentBuckets activity
Execute GetMaxCapacityForTreatments dataflow.
For each active treatment, call AOMUtilities.setupRLB function.
If there are any errors while then NotifySupport subflow is invoked.
Invokes PrepareDataForBatchNBA and IdentifyCustomerIntents subflows.


Invokes PrepareDataForBatchNBA and IdentifyCustomerIntents subflows.
In the case of any failure, it will be routed to NotifySupport subflow and
SubFlow: PrepareDataForBatchNBA
Truncate the SubscriptionDataForBatchNBA
Execute PrepareBatchData dataflow.
In case of failure, truncate the SubscriptionDataForBatchNBA dataset and re-run
the PrepareBatchData DF
SubFlow:IdentifyCustomerIntents
Run the IdentifyCustomerIntents DF.
In case of failure, truncate the SubscriptionDataForBatchNBA dataset and re-run
the PrepareBatchData DF( Flow Starts from the Previous Step as both the dataflow
use same target datasets)
SubFlow:IdentifyBestOBTreatmentsByBatch
Truncate BestOBTreatmentsByBatch data set and run the
IdentifyBestOBTreatmentsByBatch DF.Case Stage Case Step Functionality


2749
 In Case of failure, truncate the BestOBTreatmentsByBatch data set and re-run the
DF itself.
End Finalise Case Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport
SubFlow is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent
out in case of failure or completion. Checks if SupportEmail is set before sending
the email communication out.
Case is Successfully Completed and Notification will be sent out that Case is
Successfully completed.
Abort
(Alternative
Stage)Finalise Case Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport
SubFlow is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent
out in case of failure or completion. Checks if SupportEmail is set before sending
the email communication out.
Case will be Aborted and email will be sent out to notify that case has been Aborted
Elapse
(Alternative
Stage)Finalise Case Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport
SubFlow is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent
out in case of failure or completion. Checks if SupportEmail is set before sending
the email communication out.
Case will be Elapsed and email will be sent out to notify that case has been
Elapsed


2750
Treatment Buckets Design
As part of the Reconfigure Volume Constraint Process in Batch Mode design, a process of using Rate Limiting  Buckets has been
introduced.
The logic design can be seen here - NBA FW - Reconfigure Volume Constraint Process in Batch Mode .
This implementation uses the Hazelcast and Bucket4j open-source libraries. Details of these are here - Throttling Design .
Process - Initialise Treatment Buckets
This process is part of the BatchNBA case. It sets up new treatment buckets for all active treatments. Each bucket will have a maximum
capacity set. When the bucket is created, it will be filled with the maximum capacity of tokens.
The process flow executes the activity InitialiseTreatmentBuckets. This activity calls the data flow GetMaxCapacityForTreatments. This
flow returns all active treatments with their maximum capacity. For each treatment, the function AOMUtilities.setupRLB(mapName,
bucketName, capacity, minutes) is called.
Static variable added to AOMUtilities library:
HAZELCAST_INSTANCE = “AOM_HZ”
AOMUtilities.setupRLB(mapName, bucketName, capacity, minutes) function
Parameters:
mapName - this is hardcoded in the activity as “BatchNBAVolumeConstraints“. This is the map name used for treatment buckets.
bucketName - the name of the bucket to be set up for each treatment. Taken as .pyName from each active treatment.
capacity - the maximum capacity to set for the bucket. Returned from GetMaxCapacityForTreatments flow for each treatment.
minutes - this is hardcoded in the activity to 24 hours in minutes (1440).
Validate parameters.
Get the Hazelcast instance using name HAZELCAST_INSTANCE. This will have been created when the Setup Rate Limiting Bucket
Job Scheduler was run.


Job Scheduler was run.
Get the IMap for mapName. If this does not already exist, a new map will be created.
IMap<String, GridBucketState> map = hz.getMap(mapName);
If the bucketName already exists, get the bucket
ProxyManager proxyManager = Bucket4j.extension(io.github.bucket4j.grid.hazelcast.Hazelcast.class).proxyManagerForMap(map);
Optional<Bucket> b = proxyManager.getProxy(bucketName);
If this bucket already exists, then the following will update the configuration of the bucket. When the function is run from BatchNBA, the
bucket should not exist and so a new one will be created. The following section is for any situations when the function is run where the
bucket needs to be updated:
If we are updating the capacity of a bucket, we require the bucket to fill to capacity immediately. Therefore, the configuration is first
set to the following:
Refill refill = Refill.intervally(capacity, Duration.ofMillis(1));
Bandwidth bandwidth = Bandwidth.classic(capacity, refill);
Then, the configuration is replaced:
bucket = b.get();
bucket.replaceConfiguration(Bucket4j.configurationBuilder().addLimit(bandwidth).build());
We now need to replace the configuration again in order to set the refill time (in this case, 24 hours).
refill = Refill.intervally(capacity, Duration.ofMinutes(minutes));
bandwidth = Bandwidth.classic(capacity, refill);
Th l h fi i


2751
Then replace the configuration:
bucket.replaceConfiguration(Bucket4j.configurationBuilder().addLimit(bandwidth).build());
The configuration is replaced twice to achieve filling the bucket to capacity and setting the refill time. It was found that if the
configuration was just replaced once with a refill time of 24 hours, then the bucket would not fill up to capacity until 24 hours had
passed (i.e. not immediately).
If the bucket does not exist, then a new bucket is created on the map. The bucket is created using the ‘intervally’ method (non-greedy).
The bucket fills to capacity on creation, and will then refill after the time period (24 hours in this case):
Refill refill = Refill.intervally(capacity, Duration.ofMinutes(minutes));
Bandwidth bandwidth = Bandwidth.classic(capacity, refill);

Process - Delete Treatment Buckets Map
This process is invoke at the End stage of the BatchNBA case. It cleans up and destroys the treatment bucket map
“BatchNBAVolumeConstraints“ which was created.
The process flow executes the activity DeleteTreatmentBucketsMap. This activity calls the function
AOMUtilities.RemoveRLBMap(mapName) is called.
AOMUtilities.RemoveRLBMap(mapName) function
Parameters: mapName - this is hardcoded in the activity as “BatchNBAVolumeConstraints“. This is the map name used for treatment
buckets.
Validate parameters.
Get the Hazelcast instance using name HAZELCAST_INSTANCE.
Get the IMap for mapName.
Destroy the map
map.destroy();

Function - AOMUtilities.GetAvailableTokens(mapName, bucketName)
This function returns the available capacity of a treatment.
Parameters:
mapName - would be passed as  “BatchNBAVolumeConstraints“.


Parameters:
mapName - would be passed as  “BatchNBAVolumeConstraints“.
bucketName - name of the treatment bucket to check.
Validate parameters.
Function will return a long value:
 long availableTokens = b.get().getAvailableTokens();
Function - AOMUtilities.GetAvailableTokensInt(mapName, bucketName)
This function is used by logic to return the available capacity of a treatment. Logic require a function to return type int - so this function was
created. It simply calls AOMUtilities.GetAvailableTokens() and casts the result to type int.

Function - AOMUtilities.TryConsumeFromRLB(mapName, bucketName)
This function is used by logic to consume 1 token from the bucket.
Parameters:


2752
mapName - would be passed as “BatchNBAVolumeConstraints“.
bucketName - name of the treatment bucket to consume 1 token from.
Validate parameters.
The function will check if the bucket is present.
If bucket is present, then it will attempt to consume 1 token.
Function returns a boolean - true if 1 token was successfully consumed.
The available tokens remaining in the bucket is updated.


2753
DataFlow Audit History
DataFlowAudit Table

Call below activity in both CheckPrepareDataForBatchNBADFStatus and CheckIdentifyBestOBTreatmentsByBatchStatus activities
only when we have dataflow status is completed.
CreateDataFlowAuditLog

 Class Name VFUK-FW-AOMFW-Data-DataFlowAudit
Column Name Property Name Description Constraints Source
case_id CaseId Unique caseId PK - NOT NULL  Auto Generated ID on
Case creation
case_type CaseType Case Type NOT NULL Passed while creating a
case
case_subtype CaseSubType Sub Type of Case NOT NULL Passed while creating a
case
dataflow_name DataFlowName Name of the Dataflow NOT NULL DataFlowProgress
page
completion_ts CompletionTimestamp Dataflow completion time NOT NULL DataFlowProgress
page
payload Payload Data in JSON format of
required Dataflow
informationNOT NULL DataFlowProgress
pageTable Name dataflow_audit_history
This activity write a insert record into DB(name) table
Applies To VFUK-FW-AOMFW-Work
Ruleset AOMFW
Input Parameter CaseId(String)  CaseType(String) |DataFlowName(String)|CompletionTimestamp (DateTime)|Payload (String)
Output Parameter N/A
Error Handling ErrorStackTrace is Populated
Log to Error LogCreateDataFlowAuditLog


2754
HouseKeeping
 SQL Connect rule to delete records from dataflow_audit_history

AOMConfig

 Delete SQL - Delete records within the retention period that is set in the config
Applies To VFUK-FW-AOMFW-Data-DataFlowAudit
Ruleset AOMFW-Database
RequestTyp
ePurgeDataPostgreSQL
HousekeepingSQL DataFlowAudit VFUK-FW-AOMFW-Data-DataFlowAudit

HousekeepingRetentionPeriod DataFlowAudit 90ConfigType ConfigName ConfigValue


2755
1393706: Run AOM batch during business hours, single or multiple times
Introduce new CaseSubType for BatchNBA
LOV’s are Full, Prepare, Process
Batch NBA Case Changes
If CaseSubType = Full
Execute Setup Stage
Execute Prepare Stage
Execute Process Stage
If CaseSubType = Prepare
Execute Setup Stage
Execute Prepare Stage
If CaseSubType = Process
Execute Setup Stage
Execute Process StageAdd a new parameter for CaseSubType
Update step 4
Set CaseSubType = Param.CaseSubType
Remove pyLabel (It should be automatically populated as BatchNBA)
Update step 10
Correct ProcessName parameter in the QEL step
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Input Parameter CaseSubType
Output Parameter N/ACaseIgnitor Activity (existing)
Stage Name Setup Prepare
Skip Stage If Case Sub
Type=ProcessProcess
Skip Stage If Case Sub Type=PrepareEnd
 Step Name Initialise Case
StatePrepare Data For Batch NBA Check Process Input Data (is only run if
CaseSubType=Process)Finalise
Verify Campaign Status For BatchNBA
Identify Best OB Treatments By Batch
Delete Treatment Buckets MapBatch NBA Case Design


2756
Reorganize the stages and flows belong to the stages based on the when conditions to skip stages
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Logic Add new stage “Prepare”
Move “Prepare Data For Batch NBA” process from Process stage to Prepare stage
Add new process Check Process Input Data (is only run if IsCaseSubTypeProcess WHEN rule is true)
Move “Verify Campaign Status For BatchNBA” process from Setup stage to Process stage
Move “Delete Treatment Buckets Map” process from End stage to Process stagepyDefault BatchNBA Case Type (existing)
Prepare process is skipped if the IsCaseSubTypeProcess WHEN rule is true
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Logic CaseSubType = 'Process'IsCaseSubTypeProcess When Rule (new)
Process process is skipped if the IsCaseSubTypePrepare WHEN rule is true
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Logic CaseSubType = 'Prepare'IsCaseSubTypePrepare When Rule (new)
Truncates BestOBTreatmentsByBatch data set and executes the data flow.
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Activity Logic Add a router step
If CaseSubType = Full, then run existing DF
Get the DataFlowWorkItemId for the data flow and set DebugEnabled param
Start the IdentifyBestOBTreatmentsByBatch Data Flow
Otherwise, run new DF (get the DF name from logic team)
Get the DataFlowWorkItemId for the data flow and set DebugEnabled param
Start the <TBD> Data Flow
 IdentifyBestOBTreatmentsByBatch Activity (existing)


Start the <TBD> Data Flow
 IdentifyBestOBTreatmentsByBatch Activity (existing)
Checks the progress of the data flow
Applies To VFUK-FW-AOMFW-Work-BatchNBACheckIdentifyBestOBTreatmentsByBatchStatus Activity (existing)


2757
Ruleset AOMFW
Activity Logic Add a router step
If CaseSubType = Full, check status of the existing DF (IdentifyBestOBTreatmentsByBatch)
Otherwise, check status of the new DF
Create a local var for DF name to pass it dynamically to CreateDataFlowAuditLog (step 6)
Correct Message in the End step
Checks if SubscriptionData data set has data (Check VFUK-FW-AOMFW-Work-Extractor.HasCCDInputData activity as a reference)
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Input Parameter N/A
Output Parameter N/A
Error Handling Primary Catch-all Error Handler
Activity Logic Browse SubscriptionData data set
If it has data, then Set .HasData = true
Otherwise, Set .HasData = falseCheckProcessInputData Activity (new)
Checks if SubscriptionData data set has data (Check VFUK-FW-AOMFW-Work-Extractor.CheckCCDInputData flow as a reference)
Applies To VFUK-FW-AOMFW-Work-BatchNBA
Ruleset AOMFW
Flow Logic Run CheckProcessInputData activity
Check .HasData
If true, then Continue
If false, then Change stage (to Abort)CheckProcessInputData Flow (new)
ConfigType ConfigName ConfigValue ACTION
Case ID FullBatchNBA H-620479 Add
SkipCaseFinaliseEmail FullBatchNBA FALSE Add
CaseStatus FullBatchNBA Completed Add
CaseDependencies FullBatchNBA FullBatchNBA, DataBatchNBA,
DecisionBatchNBAAdd
Case ID PrepareBatchNBA H-620480 Add
SkipCaseFinaliseEmail PrepareBatchNBA FALSE AddAOM Config


2758
CaseStatus PrepareBatchNBA Completed Add
CaseDependencies PrepareBatchNBA DataBatchNBA , FullBatchNBA,
DecisionBatchNBAAdd
Case ID ProcessBatchNBA H-620481 Add
SkipCaseFinaliseEmail ProcessBatchNBA FALSE Add
CaseStatus ProcessBatchNBA Completed Add
CaseDependencies ProcessBatchNBA DecisionBatchNBA , FullBatchNBA,
DataBatchNBAAdd
DataFlowWorkItemId  <GetDFNameFromLogicTeam>
  <DF-XXXXX> Add
BatchNBACheckPoints Full 01:00-23:59 Add
BatchNBACheckPoints Prepare 01:00-23:59 Add
BatchNBACheckPoints Process 01:00-23:59 Add
NBACheckPoints Batch 01:00-23:59
 got this value from
Prod’s AOMConfigDelete
PauseCase FullBatchNBA FALSE Add
PauseCase PrepareBatchNBA FALSE Add
PauseCase ProcessBatchNBA FALSE Add
PauseCase BatchNBA FALSE Delete
 this is not in
Prod’s AOMConfig
CaseDependencies BatchNBA "BatchNBA,SpineLoader,SpineV2Lo
ader,IHExtractor,DistributionSimulati
on,FunnelSimulation,CustomerSimu
lation"Delete
Case ID BatchNBA B-172012 Delete
CaseStatus BatchNBA Completed Delete
SkipCaseFinaliseEmail BatchNBA FALSE Delete
 this is not in
Prod’s AOMConfig
SMSCAccountPool BatchNBA AOM Batch Account

CaseDependencies BatchNBAExtractor "BatchNBAExtractor,CCDExtractor,
SpineLoader,SpineV2Loader,Batch
NBA"Update
CaseDependencies CCDExtractor "CCDExtractor,SpineLoader,SpineV


NBA"Update
CaseDependencies CCDExtractor "CCDExtractor,SpineLoader,SpineV
2Loader,BatchNBA,BatchNBAExtra
ctor"Update
CaseDependencies CCRLoader "CCRLoader,CCDExtractor,BatchN
BA"Update
CaseDependencies CustomerSimulation "DistributionSimulation,FunnelSimul
ation,BatchNBA,CustomerSimulatioUpdate


2759
 n"
CaseDependencies DistributionSimulation "DistributionSimulation,FunnelSimul
ation,BatchNBA,CustomerSimulatio
n"Update
CaseDependencies FunnelSimulation "DistributionSimulation,FunnelSimul
ation,BatchNBA,CustomerSimulatio
n"Update
CaseDependencies IHExtractor "IHExtractor,SpineLoader,SpineV2L
oader,BatchNBA"Update
CaseDependencies MSLoader "MSLoader,CCDExtractor,BatchNB
A"Update
CaseDependencies SpineLoader "SpineLoader,CCDExtractor,BatchN
BA,BatchNBAExtractor"Update
CaseDependencies SpineV2Loader "SpineV2Loader,CCDExtractor,Batc
hNBA,BatchNBAExtractor"Update


2760
Extractor Case Design

Primary Stages
Setup
InitialiseExtractor
Prepare
PrepareIHExtract
PrepareCCDExtract
PrepareBatchNBAExtract
HoldBatchNBA Treatments
ProcessBatchNBAExtract
ProcessSeedT estData
PrepareT2SExtract
Extract
InitiateIHExtraction
InitiateRIExtraction
InitiateIHDExtraction
InitiateDMExtraction
InitiateRCSExtraction
InitiateMMSExtraction
InitiateCCDExtraction
InitiateT2SExtraction
CheckExtractorStatus
ProcessExtraction
Package & Send
PackageFiles
TransferFiles
End
PostIHExtractProcess
CleanUp
TruncateBatchNBADatasets
Finalise
Alternate Stages
Abort
RollbackInteractionHistory
CleanUp
Finalise
Elapse
Finalise


2761
Primary Stages
Setup
InitialiseExtractor
This flow invokes a common sub flow Initialise and if check points are elapsed, flow jumps to elapsed stage otherwise invokes
InitialiseExtractor activity. This activity sets WorkAreaPath, LoopLimit and append NodeId to NodeList. If there are any errors inside the
activity then the flow invokes NotifySupport sub flow.
Prepare
PrepareIHExtract

If the CaseSubType is “IH” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes PrepareIHExtractData activity. This activity get ExtractorTable and segments from AOMConfig and set
header, start and end timestamps and executes a Connect-SQL Prepare which prepares data in interaction_history_xt table.
 If it is success then invokes another activity PrepareIHRExtractData which is same as PrepareIHExtractData activity but it prepares data in
interaction_history_reporting_xt table.If it is success then invokes another activity PrepareRIExtractData which is similar to above two
activities and prepares data in recommendation_Items_xt.
If it is success then invokes another activity PrepareIHDExtractData which is similar to above two activities and prepares data in
ih_delete_staging_xt.If there are any errors inside the activities then the flow invokes NotifySupport sub flow.


2762
PrepareCCDExtract


2763
If the CaseSubType is “CCD” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then
skip the complete flow otherwise invokes CheckCCDInputData sub flow
CheckCCDInputData Process Flow:
This flow invokes HasCCDInputData activity which gets RealtimeDSPointer from AOMConfig and set to CurrentPointer and checks if
BestOBTreatments1 or BestOBTreatments2 datasets has data, if the datasets are empty then the flow invokes NotifySupport sub flow
otherwise continue the flow and invokes SwitchOnlineDataSets sub flow
SwitchOnlineDataSets Process Flow:
This flow invokes SwitchOnlineDataSets activity which truncates BestOBTreatments1/BestOBTreatments2 based on CurrentPointer then
swap the pointer and update RealtimeDSPointer in AOMConfig. Set the OnlineDataSetSwitched to true to prevent it from switching again
and invokes PrepareForOBProcess sub flow. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
PrepareForOBProcess Process Flow:


2764
This flow truncates BestOBTreatmentsBeforeRevalidation and SubscriptionsForOBRevalidation datasets and runs
PrepareForOBProcess1/PrepareForOBProcess2 DF based on CurrentPointer. Flow snoozes until the dataflow completes and continue to
next sub flow RevalidateOBTreatments. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
RevalidateOBTreatments ProcessFlow:
This flow looks similar to PrepareForOBProcess flow as above which truncates BestOBTreatmentsBeforeDedupe dataset and runs
RevalidateOBTreatments DF. Flow snoozes until the dataflow completes and continue to next sub flow PopulateMasterDataSets. If there
are any errors inside the activity then the flow invokes NotifySupport sub flow.
PopulateMasterDataSets Process Flow:
This flow looks similar to PrepareForOBProcess flow as above which truncates ContactDetailMaster, TreatmentsForOB,
OffersBySubChannelForOutboundCC and OffersBySubChannelForDirectMail datasets and runs PopulateMasterDataSets DF. Flow
snoozes until the dataflow completes and continue to next sub flow DedupeByContactDetail. If there are any errors inside the activity then
the flow invokes NotifySupport sub flow.
DedupeByContactDetail Process Flow:
This flow looks similar to PrepareForOBProcess flow as above which truncates BestOBTreatmentsAsTarget, BestOBTreatmentsAsControl,
BestOBTreatmentsAfterDedupe and TreatmentsAfterDedupe datasets and runs DedupeByContactDetail DF. Flow snoozes until the
dataflow completes and continue to next sub flow ApplyVolumeConstraints. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
ApplyVolumeConstraints Process Flow:


NotifySupport sub flow.
ApplyVolumeConstraints Process Flow:
This flow invokes CreateTreatmentVolumeConfig which browses TreatmentsForOB dataset and creates a pagelist
TreatmentVolumeConfigList with Treatments and its Subchannel volumes for target and control. If TreatmentsForOB dataset was empty, a
new case level property SkipApplyVolumeConstraints is set to true which skips the complete flow. Otherwise SkipApplyVolumeConstraints
is set to false and invokes ApplyVolumeDistribution sub flow which truncates VolumeConstrainedData dataset and apply distribution logic
for control and target customers and populate the results to VolumeConstrainedData dataset (For detailed information, please refer Apply
Volume Distribution page). After volume distribution the flow invokes AugmentVolumeConstrainedData subflow which runs
AugmentVolumeConstrainedData DF (For detailed information, please refer Apply Volume Constraints Redesign page) and invokes next
sub flow ProcessBestOBTreatments. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.


2765
ProcessBestOBTreatments Process Flow:
This flow invokes ProcessBestOBTreatmentsAsTarget and ProcessBestOBTreatmentsAsControl sub flows. If there are any errors
inside the activity then the flow invokes NotifySupport sub flow and invokes RollbackInteractionHistory subflow.
ProcessBestOBTreatmentsAsTarget Process Flow:
This flow truncates BestOutboundCCTreatmentsAfterControlGroups (only for CCD CaseSubType),
BestEmailTreatmentsAfterControlGroups, BestSMSTreatmentsAfterControlGroups, BestAppPushTreatmentsAfterControlGroups,
BestDirectMailTreatmentsAfterControlGroups, BatchDecisionOutput and SubscriptionsForOB datasets and runs
ProcessBestOBTreatmentsAsTarget DF. Flow snoozes until the dataflow completes and continue to next sub flow
ProcessBestOBTreatmentsAsControl.
ProcessBestOBTreatmentsAsControl Process Flow:
This flow looks similar to ProcessBestOBTreatmentsAsTarget flow as above which runs ProcessBestOBTreatmentsAsControl DF.
RollbackInteractionHistory Process Flow:


2766
This flow invokes RollbackInteractionHistory activity which gets the current Case Id and do a rollback of IH based on Case Id. If there are
any errors inside the activity then the flow invokes NotifySupport sub flow.
PrepareBatchNBAExtract
If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true,
then skip the complete flow otherwise invokes CheckBatchNBAInputData sub flow.
CheckBatchNBAInputData Process Flow:
This flow invokes BestOBTreatmentsByBatchHasData activity which checks if BestOBTreatmentsByBatch dataset has data, if the datasets
are empty then the flow invokes NotifySupport sub flow otherwise continue the flow and invokes PrepareForOBProcessForBatch sub flow.
PrepareForOBProcessForBatch Process Flow:
This flow looks similar to PrepareForOBProcess flow which truncates BestOBTreatmentsBeforeDedupe dataset and runs
PrepareForOBProcessForBatch DF. Flow snoozes until the dataflow completes and continue to next sub flow PopulateMasterDataSets. If
there are any errors inside the activity then the flow invokes NotifySupport sub flow.
PopulateMasterDataSets Process Flow:
This flow looks similar to PrepareForOBProcess flow as above which truncates ContactDetailMaster, TreatmentsForOB,
OffersBySubChannelForOutboundCC and OffersBySubChannelForDirectMail datasets and runs PopulateMasterDataSets DF. Flow
snoozes until the dataflow completes and continue to next sub flow DedupeByContactDetail. If there are any errors inside the activity then
the flow invokes NotifySupport sub flow.
DedupeByContactDetailForBatchNBA Process Flow:


the flow invokes NotifySupport sub flow.
DedupeByContactDetailForBatchNBA Process Flow:
This flow looks similar to DedupeByContactDetail flow as above which truncates BestOBTreatmentsAfterDedupe, TreatmentsAfterDedupe,
BestOBTreatmentsBeforeChannelDelivery, ParentBestOBTreatments datasets and runs DedupeByContactDetailForBatchNBA DF. Flow
snoozes until the dataflow completes and continue to next sub flow ApplyVolumeConstraintsForBatchNBA. If there are any errors inside the
activity then the flow invokes NotifySupport sub flow.
ApplyVolumeConstraintsForBatchNBA Process Flow:
This flow invokes CreateTreatmentVolumeConfig which browses TreatmentsForOB dataset and creates a pagelist
TreatmentVolumeConfigList with Treatments and its Subchannel volumes for target and control. If TreatmentsForOB dataset was empty, a
new case level property SkipApplyVolumeConstraints is set to true which skips the complete flow. Otherwise SkipApplyVolumeConstraints
is set to false and invokes ApplyVolumeDistribution sub flow which truncates VolumeConstrainedData dataset and apply distribution logic
for control and target customers and populate the results to VolumeConstrainedData dataset (For detailed information, please refer Apply
Volume Distribution page). After volume distribution the flow invokes AugmentVolumeConstrainedDataForBatchNBA subflow which runs
AugmentVolumeConstrainedDataForBatchNBA DF (For detailed information, please refer Apply Volume Constraints Redesign page) and
invokes next sub flow WriteBatchDecisionOutputBeforeChannelDelivery. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
WriteBatchDecisionOutputBeforeChannelDelivery Process Flow:
This flow looks similar to PrepareForOBProcess flow as above which truncates BatchDecisionOutput dataset and runs


This flow looks similar to PrepareForOBProcess flow as above which truncates BatchDecisionOutput dataset and runs
WriteBatchDecisionOutputBeforeChannelDelivery DF. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.


2767
HoldBatchNBATreatments
If the CaseSubType is “BatchNBA” then this flow invokes an activity PopulateBatchNBADecisionSummary which calls the Connect SQL rule
to populate BatchNBADecisionSummary page list. Then it displays Batch NBA Decision Summary UI to show all treatments from Batch
NBA Decision Output grouped by parents. After treatments to be executed are selected, the flow invokes
SaveSelectedBatchNBATreatments activity to save selected treatments into SelectedBatchNBATreatments data type, and
CreateSelectedTreatmentsAttachment activity to create csv file attachment for summary email. After that, Handle Alerts common flow is
invoked to send summary email with csv attachment. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
ProcessBatchNBAExtract

If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true,
then skip the complete flow otherwise invokes ProcessForChannelDelivery sub flow.
After the Process Best OB Treatments is executed, the flow checks whether the ChannelManagement toggle is enabled or not. If enabled, it
invokes the Process Email flow, otherwise it invokes the Set Subscription Campaign Flags flow.
ProcessForChannelDelivery Process Flow:
This flow invokes StartProcessForChannelDeliveryDF activity which truncates BestOBTreatmentsAsTarget, BestOBTreatmentsAsControl,
ParentBestOBTreatmentsForChannelDelivery data sets and executes ProcessForChannelDelivery data flow. If there are any errors inside
the activity then the flow invokes NotifySupport sub flow. Flow snoozes until the data flow completes and continue to next sub flows
ProcessBestOBTreatments, SetSubscriptionCampaignFlags.
SetSubscriptionCampaignFlags Process Flow:


2768
This flow invokes a subflow VerifyCampaignStatus and truncates SubscriptionCampaignFlags dataset and runs
SetSubscriptionCampaignFlags DF. If there are any errors inside the activity then the flow invokes NotifySupport sub flow. Flow snoozes
until the data flow completes and continue to next sub flows ExecuteBatchCampaign.
VerifyCampaignStatus Process Flow:

This flow checks  the status if the ChannelManagement toggle is disabled and if it is, invokes VerifyCampaignStatus activity which checks
the status of Email and SMS campaigns, otherwise it ends process. It invokes the notify support flow if there is issue in the activity,
otherwise flow continues to next flow.
ExecuteBatchCampaign Process Flow:
This flow has channel(Email,SMS) parameter and invokes CheckCampaignInputHasData activity, based on channel it checks the data in
BestSMSTreatmentsAfterControlGroups(SMS) or BestEmailTreatmentsAfterControlGroups(Email) datasets. If any of that dataset has data
then invokes ExecuteOutboundCampaign activity which gets Email/SMS CampaignId from AOMConfig and runs Email/SMS Campaign,
otherwise flow continues and invokes ProcessAppPushForBatch sub flow. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.


2769
ProcessEmail Process flow:
This flow invokes the subprocesses: ProcessEmailByChannelManagement and PrepareDataForEmailStaging process flows
ProcessEmailByChannelManagement Process Flow:
This flow truncates the EmailCustomersWithParentTreatmentsForChannelManagement and
EmailCustomersWithChildTreatmentsForChannelManagement dataset then invokes the ProcessEmailByChannelManagement data flow
and then checks the status of this DF. This DF populates the datasets with parent and child offers. If the DF is not complete, then the flow
will wait until it is complete before continuing, and in the event of any errors in the activities invoked or the DF, Notify Support is called
PrepareDataForEmailStaging Process Flow:

This flow invokes the PrepareDataForEmailStaging data flow and then checks the status of this DF. This DF uses the populated
EmailCustomersWithParentTreatmentsForChannelManagement and EmailCustomersWithChildTreatmentsForChannelManagement
datasets to populate the EmailStaging dataset. If the DF is not complete, then the flow will wait until it is complete before continuing, and in
the event of any errors in the activities invoked or the DF, Notify Support is called
ProcessSMS Process Flow:


2770
The flow checks whether the ChannelManagement toggle is enabled or not. If enabled, it invokes the ProcessSMSByChannelManagement
flow. If disabled, it invokes the ExecuteBatchCampaign flow.
ProcessSMSByChannelManagement Process Flow:
This flow invokes the ProcessSMSByChannelManagement data flow and then checks the status of this DF. If the DF is not complete, then
the flow will wait until it is complete before continuing, and in the event of any errors in the activities invoked or the DF, Notify Support is
called
ProcessAppPush Process Flow:
The flow checks whether the AppPush toggle is enabled or not. If enabled, it invokes the ProcessAppPushByChannelManagement flow. If
disabled, it invokes the ProcessAppPushForBatch flow.
ProcessAppPushByChannelManagement Process Flow:


2771
This flow invokes the ProcessAppPushByChannelManagement data flow and then checks the status of this DF. If the DF is not complete,
then the flow will wait until it is complete before continuing, and in the event of any errors in the activities invoked or the DF, Notify Support
is called then the interaction history is rolled back from the data flow run
ProcessAppPushForBatch Process Flow:
This flow looks similar to PrepareForOBProcess flow and runs ProcessAppPushForBatch DF. If there are any errors inside the activity then
the flow invokes NotifySupport sub flow.
ProcessSeedTestData
If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true(In
Production environment this process shouldn’t be run) then skip the complete flow, otherwise runs PopulateSeedTestData DF which uses
AOMUtilities.GetNextSeedTestDataSampleId(String key,String sampleSize) function to generate SampleId based on IAtomic instances
generated from key combination to use in ExecuteSeedTest activity. Flow snoozes until the dataflow completes and continue to next activity
DestroySeedTestDataSampleIdCounters which invokes a function AOMUtilities.DestroySeedTestDataSampleIdCounters() which destroys
all IAtomic instances generated so far. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.


2772
PrepareT2SExtract
If the CaseSubType is “T2S” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes CheckT2SInputData sub flow
CheckT2SInputData Process Flow:
This flow invokes HasT2SInputData activity which gets RealtimeDSPointer from AOMConfig and set to CurrentPointer and checks if
BestOBTreatments1ForT2S or BestOBTreatments2ForT2S datasets has data, if the datasets are empty then the flow invokes
NotifySupport sub flow otherwise continue the flow and invokes SwitchT2SDataSets sub flow
SwitchT2SDataSets Process Flow:
This flow invokes SwitchT2SDataSets activity which truncates BestOBTreatments1ForT2S/BestOBTreatments2ForT2S based on
CurrentPointer then swap the pointer and update RealtimeDSPointer in AOMConfig. Set the OnlineDataSetSwitched to true to prevent it
from switching again and invokes PrepareForOBProcessForT2S sub flow. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
PrepareForOBProcessForT2S Process Flow:
This flow looks similar to PrepareForOBProcess flow which truncates BestOBTreatmentsBeforeDedupeForT2S dataset and runs
PrepareForOBProcess1ForT2S/PrepareForOBProcess2ForT2S DF based on CurrentPointer. Flow snoozes until the dataflow completes
and continue to next sub flow PopulateMasterDataSetsForT2S. If there are any errors inside the activity then the flow invokes NotifySupport
sub flow.
PopulateMasterDataSetsForT2S Process Flow:


2773
This flow looks similar to PrepareForOBProcess flow which truncates ContactDetailMasterForT2S, OffersBySubChannelForOBForT2S
datasets and runs PopulateMasterDataSetsForT2S DF. Flow snoozes until the dataflow completes and continue to next sub flow
DedupeByContactDetailForT2S. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
DedupeByContactDetailForT2S Process Flow:
This flow looks similar to PrepareForOBProcess flow which truncates BestOBTreatmentsAfterDedupeForT2S dataset and runs
DedupeByContactDetailForT2S DF. Flow snoozes until the dataflow completes and continue to next sub flow
PopulateSubscriptonsForControlGroupsForT2S. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
PopulateSubscriptonsForControlGroupsForT2S Process Flow:
This flow looks similar to PrepareForOBProcess flow which truncates SubscriptionsForOBForT2S,
BestOBTreatmentsBeforeControlGroupsForT2S datasets and runs PopulateSubscriptonsForControlGroupsForT2S DF. Flow snoozes until
the dataflow completes and continue to next sub flow ApplyControlGroupsForT2S. If there are any errors inside the activity then the flow
invokes NotifySupport sub flow.
ApplyControlGroupsForT2S Process Flow:
This flow truncates BestOutboundCCTreatmentsAfterControlGroupsForT2S dataset and runs ApplyControlGroupsForT2S DF. Flow
snoozes until the dataflow completes and continues to next flow. If there are any errors inside the activity then the flow invokes
NotifySupport and RollbackInteractionHistory sub flows.
Extract


NotifySupport and RollbackInteractionHistory sub flows.
Extract
InitiateIHExtraction
If the CaseSubType is “IH” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes HasIHExtractData activity which checks if interaction_history_xt table has data, if the table is empty
then the flow invokes HandleWarnings sub flow otherwise continue the flow and invokes InitialiseExtractorStatus sub flow for IH and IHR


2774
Extract Types. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
InitialiseExtractorStatus Process Flow:
This flow has ExtractType (IH, IHR, BatchNBA) parameter which invokes InitialiseExtractorStatus activity, based on parameter activity
populates required values and save extractor_status table. If there are any errors inside the activity then the flow invokes NotifySupport sub
flow.
InitiateRIExtraction
If the CaseSubType is “IH” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes HasRIExtractData Activity to check if recommendation_items_xt table has data by calling Connect-
SQL VFUK-FW-AOMFW-DATA-RECOMMENDATIONITEMSEXTRACT.PostgreSQL.HasRIData, if the table is empty then the flow
invokes HandleWarnings sub flow otherwise flow invokes InitialiseExtractorStatus sub flow for RI Extract Type.
If RecommendationItems extract table is empty then flow checks HasData(IH Data from HasIHExtractData) , if both IH and
RecommendationItems Extract tables are empty then jumps to End Stage otherwise if only RecommendationItems Extarct table is empty,
flow will not initiate RI Extract.


2775
InitiateIHDExtraction


2776

If the CaseSubType is “IH” then this flow invokes a common sub-flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes HasIHDExtractData Activity to check if the ih_delete_staging_xt table has data by calling Connect-
SQL VFUK-FW-AOMFW-DATA-IHDeleteStagingExtract.PostgreSQL.HasIHDData, if the table is empty then the flow invokes the
HandleWarnings sub-flow otherwise flow invokes the InitialiseExtractorStatus sub-flow for IHD Extract Type.
If the IHDelete extract table is empty then flow checks HasData(IH Data from HasIHExtractData), if IH Data is empty then flow checks
HasRIData (IH Recommendations Data from HasIHRIExtractData). If all IH, RecommendationItems and IHDelete Extract tables are empty
then jumps to End-Stage otherwise if only the IHDeleteExtract table is empty, the flow will not initiate IHD Extract.
InitiateDMExtraction
If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true,
then skip the complete flow otherwise invokes HasDMExtractData activity which checks if BestDirectMailTreatmentsAfterControlGroups
dataset has data, if the dataset is empty then the flow invokes HandleWarnings sub flow otherwise continue the flow and invokes
InitialiseExtractorStatus sub flow for BatchNBA Extract Types. If there are any errors inside the activity then the flow invokes NotifySupport
sub flow.
InitiateRCSExtraction


2777
If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true. If it
is, then skip the complete flow otherwise invokes HasRCSExtractData activity which checks if BestRCSTreatmentsAfterControlGroups
dataset has data. If the dataset is empty then the flow invokes HandleWarnings sub flow otherwise the flow continues and invokes
InitialiseExtractorStatus sub flow for BatchNBA Extract Types. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
InitiateMMSExtraction
If the CaseSubType is “BatchNBA” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true. If it
is, then skip the complete flow otherwise invokes HasMMSExtractData activity which checks if BestMMSTreatmentsAfterControlGroups
dataset has data. If the dataset is empty then the flow invokes HandleWarnings sub flow otherwise the flow continues and invokes
InitialiseExtractorStatus sub flow for BatchNBA Extract Types. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
InitiateCCDExtraction

If the CaseSubType is “BatchNBA” or “CCD“ then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled
is true. If it is, then skip the complete flow otherwise invokes HasCCDExtractData activity which checks if
BestOutboundCCTreatmentsAfterControlGroups dataset has data. If the dataset is empty then the flow invokes HandleWarnings sub
flow. It then checks if there is no DM Data, RCS data and MMS data. If there is none, the flow jumps to End stage . Otherwise the flow


continues and invokes InitialiseExtractorStatus sub flow for BatchNBA or CCD Extract Types. If there are any errors inside the activity
then the flow invokes NotifySupport sub flow.
InitiateT2SExtraction


2778
If the CaseSubType is “T2S” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes HasT2SExtractData activity which checks if BestOutboundCCTreatmentsAfterControlGroupsForT2S
dataset has data, if the dataset is empty then the flow invokes HandleWarnings sub flow and jumps to End stage otherwise continue the
flow and invokes InitialiseExtractorStatus sub flow for T2S Extract Types. If there are any errors inside the activity then the flow invokes
NotifySupport sub flow.
CheckExtractorStatus
This flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip the complete flow otherwise
invokes CheckExtractorStatus activity which browses extractor_status records and loops through them and set ProcessingStatus. If
ProcessingStatus is complete then flow continues further otherwise invokes HandleWarnings subflow and snoozes until the
ProcessingStatus is complete. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
ProcessExtraction
This flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip the complete flow otherwise
invokes CombineExtractOuputs activity which browses extractor_status records based on current case id, loop through the records and
convert metadata into output page. For OutputFiles inside Output page set applicable headers and copy to OutputFilesGroup page group
property, loop through OutputFilesGroup and write header file and concatenate all the files. If there are any errors inside the activity then the
flow invokes NotifySupport sub flow.


2779
Package & Send
PackageFiles


2780
This flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip the complete flow otherwise
invokes PackageExtractOutput activity which gets GNUPGHome path from AOMConfig. Activity loops through OutputFilesGroup page
group property, get GPG Recipient for output file, compress and encrypt the output file using PackageFiles function. If there are any errors
inside the activity then the flow invokes NotifySupport sub flow.
TransferFiles
This flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip the complete flow otherwise
invokes TransferExtractOutput activity which loops through OutputFilesGroup, get the destination path for output file and copy the output
file(s) to destination path using GNUcp function. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
End
PostIHExtractProcess
If the CaseSubType is “IH” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then skip
the complete flow otherwise invokes UpdateExtractorTimestamps activity which sets ExtractorStartTimestamp and ExtractorEndTimestamp
using SetAOMConfigValue function. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.


2781
CleanUp


2782
If the CaseSubType is “BatchNBA” then this flow invokes an activity CleanUp to clean selected batch NBA treatments data generated at run
time. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
TruncateBatchNBADatasets
This flow is only invoked only when Case Subtype is BatchNBA. This will truncate all the dataset for which data need not be retained until
the next run in-order to save the cassandra disk space. Any failures during the truncation will be pushed to support by flow invokes
NotifySupport sub flow.
Finalise
For detailed information please refer Finalise page.
Alternate Stages
Abort
RollbackInteractionHistory
For detailed information please refer RollbackInteractionHistory process flow section.
CleanUp
If the CaseSubType is “BatchNBA” then this flow invokes an activity CleanUp to clean selected batch NBA treatments data generated at run
time. If there are any errors inside the activity then the flow invokes NotifySupport sub flow.
Finalise
This flow has Abort Stage as parameter. For detailed information please refer Finalise page.
Elapse
Finalise
This flow has Elapse Stage as parameter. For detailed information please refer Finalise page.


2783
                                                                                ****WIP****


2784
Extractor Case Design _backup

Setup

Initialise ExtractorSets the values required for the case to on the case page CaseStartTime, CaseType,
SupportEmailSubject, SupportEmail & SuccessEmailNeeded. Checks, if the case
triggered time is falling in between the current checkpoint interval, if so then case will
continue processing & case is runnable wrt to the conditions defined in Is Case Runn
able activity, the case processing started and case status is updated as “Running”. Else
it will snooze until the current time is falling in between the current checkpoint interval.
 Prepare Prepare IH Extract Execute the prepare_extract_data function for the specified time period and set the
header
Prepare CCD Extract CheckCCDInputData: Checks if BestOBTreatments data set has data, NotifySupport
flow is triggered if the data set is empty, else continue the flow.
SwitchOnlineDataSets: Truncate the BestOBTreatments(the non-current pointer one)
and switches the pointer. In case of failure, trigger NotifySupport flow.
PrepareForOBProcess: Truncates the BestOBTreatmentsBeforeRevalidation and
SubscriptionsForOBRevalidation data sets. Execute PrepareForOBProcess dataflow. In
case of failure, trigger NotifySupport flow.
RevalidateOBTreatments: Truncates the BestOBTreatmentsBeforeDedupe. Execute
RevalidateOBTreatments dataflow. In case of failure, trigger NotifySupport flow.
PopulateMasterDataSets: Truncate the ContactDetailMaster, TreatmentsForOB,
OffersBySubChannelForOBCC and OffersBySubChannelForDirectMail. Execute
PopulateMasterDataSets dataflow. In case of failure, trigger NotifySupport flow.


PopulateMasterDataSets dataflow. In case of failure, trigger NotifySupport flow.
DedupeByContactDetail: Truncate BestOBTreatmentsBeforeControlGroups,
BestOBTreatmentsAfterDedupe and TreatmentsAfterDedupe datasets. Execute
DedupeByContactDetail dataflow. In case of failure, trigger NotifySupport flow.
ApplyVolumeConstraints: Invokes two activities CreateTreatmentVolumeConfig which
browses TreatmentsForOB dataset and creates a pagelist TreatmentVolumeConfigList
with Treatments and its Subchannel volumes and ApplyOutboundVolumeLimit activity
which truncates VolumeConstrainedData dataset and apply volume constraints logic
and populate the results to VolumeConstrainedData dataset and calls a sub-process
AugmentVolumeConstrainedData which execute AugmentVolumeConstrainedData
dataflow and populate results to BestOBTreatmentsBeforeControlGroups (For detailed
information on volume constraints logic, please refer Apply Volume Constraints
Redesign page). In case of failure, trigger NotifySupport flow.
For Release 1.11.1, as part of AOM-2369, the error code 1025 - “TreatmentsForOB
dataset was empty” is removed. If TreatmentsForOB dataset was empty, a new case
level property SkipApplyVolumeConstraints is set to true which skips the volume
constraints logic. Otherwise SkipApplyVolumeConstraints is set to false which applies
volume constraints logic.
PopulateSubscriptonsForControlGroups: Truncate the SubscriptionsForOB. Execute
PopulateSubscriptonsForControlGroups dataflow to populate SubscriptionsForOB data
set. In case of failure, trigger NotifySupport flow.Case Stage Case Step Functionality


2785
ApplyControlGroups: Truncate the
BestOutboundCCTreatmentsAfterControlGroups,BestEmailTreatmentsAfterControlGrou
ps, BestSMSTreatmentsAfterControlGroups and
BestDirectMailTreatmentsAfterControlGroups datasets. Execute ApplyControlGroups
dataflow. In case of failure, rollback IH data and trigger NotifySupport flow.
Prepare BatchNBA Extract CheckBatchNBAInputData: Checks if BestOBTreatmentsByBatch data set has data,
NotifySupport flow is triggered if the data set is empty, else continue the flow.
PrepareForOBProcessForBatch:
Invokes the Activity BestOBTreatmentsByBatchHasData to check if the
BestOBTreatmentsByBatch has data.
Execution of PrepareForOBProcessForBatch sub-flow will be skipped if
BestOBTreatmentsByBatch doesn’t contain data records.
If BestOBTreatmentsByBatch contain data records then Read the data from
BestOBTreatmentsByBatch dataset and pushed the data into
BestOBTreatmentsBeforeRevalidation and SubscriptionsForOBRevalidation (data of the
output datasets is not truncated as realtime data exists)
In case of any failure, the case will be routed to NotifySupport Subflow and upon manual
resume flow after sorting the error,the DF reinvoked from start .
RevalidateOBTreatments: Truncates the BestOBTreatmentsBeforeDedupe. Execute
RevalidateOBTreatments dataflow. In case of failure, trigger NotifySupport flow.
PopulateMasterDataSets: Truncate the ContactDetailMaster, TreatmentsForOB,
OffersBySubChannelForOBCC and OffersBySubChannelForDirectMail. Execute
PopulateMasterDataSets dataflow. In case of failure, trigger NotifySupport flow.


PopulateMasterDataSets dataflow. In case of failure, trigger NotifySupport flow.
DedupeByContactDetail: Truncate BestOBTreatmentsBeforeControlGroups,
BestOBTreatmentsAfterDedupe and TreatmentsAfterDedupe datasets. Execute
DedupeByContactDetail dataflow. In case of failure, trigger NotifySupport flow.
ApplyVolumeConstraints: Invokes two activities CreateTreatmentVolumeConfig which
browses TreatmentsForOB dataset and creates a pagelist TreatmentVolumeConfigList
with Treatments and its Subchannel volumes and ApplyOutboundVolumeLimit activity
which truncates VolumeConstrainedData dataset and apply volume constraints logic
and populate the results to VolumeConstrainedData dataset and calls a sub-process
AugmentVolumeConstrainedData which execute AugmentVolumeConstrainedData
dataflow and populate results to BestOBTreatmentsBeforeControlGroups (For detailed
information on volume constraints logic, please refer Apply Volume Constraints
Redesign page). In case of failure, trigger NotifySupport flow.
For Release 1.11.1, as part of AOM-2369, the error code 1025 - “TreatmentsForOB
dataset was empty” is removed. If TreatmentsForOB dataset was empty, a new case
level property SkipApplyVolumeConstraints is set to true which skips the volume
constraints logic. Otherwise SkipApplyVolumeConstraints is set to false which applies
volume constraints logic.
PopulateSubscriptonsForControlGroups: Truncate the SubscriptionsForOB. Execute
PopulateSubscriptonsForControlGroups dataflow to populate SubscriptionsForOB data
set. In case of failure, trigger NotifySupport flow.
ApplyControlGroups: Truncate the
BestOutboundCCTreatmentsAfterControlGroups,BestEmailTreatmentsAfterControlGrou


BestOutboundCCTreatmentsAfterControlGroups,BestEmailTreatmentsAfterControlGrou
ps, BestSMSTreatmentsAfterControlGroups and


2786
BestDirectMailTreatmentsAfterControlGroups datasets. Execute ApplyControlGroups
dataflow. In case of failure, rollback IH data and trigger NotifySupport flow.
SetSubscriptionCampaignFlags
Execution of SetSubscriptionCampaignFlags sub-flow will be skipped if
BestOBTreatmentsByBatch doesn’t contain data records.
If there are data records in either of the dataset, then SubscriptionCampaignFlags
dataset is cleared and VerifyCampaignStatus Subflow is invoked to check if the previous
run campaigns are successfully completed or not. If either of the campaigns has failed
then it will route to notify support.
If there is no failure from the previous run then SetSubscriptionCampaignFlags Dataflow
will be executed and data will be pushed into SubscriptionCampaignFlags dataset.
In case of any failure, the case will be routed to NotifySupport Subflow for the manual
intervention.
ExecuteEmailCampaign
Execution of ExecuteEmailCampaign sub-flow will be skipped if
BestOBTreatmentsByBatch doesn’t contain data records.
If there is no data corresponding to the Email Campaign then the flow will be skipped.
If there is batch data available corresponding to Email Campaign then the respective
Campaign is programmatically invoked using the value configured for
CampaingWorkItemId in AOMConfig Table.
ExecuteSMSCampaign
Execution of ExecuteSMSCampaign sub-flow will be skipped if
BestOBTreatmentsByBatch doesn’t contain data records.
If there is no data corresponding to the SMS Campaign then the flow will be skipped.
If there is batch data available corresponding to SMS Campaign then the respective
Campaign is programmatically invoked using the value configured for
CampaingWorkItemId in AOMConfig Table.
In the case of any failure during the invocation of Campaign, the case will be routed to
NotifySupport sub-flow for manual intervention.


NotifySupport sub-flow for manual intervention.
ProcessAppPushForBatch
Execution of ProcessAppPushForBatch sub-flow will be skipped if
BestOBTreatmentsByBatch doesn’t contain data records.
The ProcessAppPushForBatch DF will be executed with source as
BestAppPushTreatmentsAfterControlGroups dataset. The AppPush API will be triggered
for all AppPush Treatments.
Prepare T2S Extract CheckT2SInputData: Checks if
BestOBTreatments1ForT2S/BestOBTreatments2ForT2S data set has data, else
NotifySupport flow is triggered
SwitchT2SDataSets: Truncate the BestOBTreatments and switches the pointer. In case
of failure, trigger NotifySupport flow.
PrepareForOBProcessForT2S: Truncates the
BestOBTreatmentsBeforeDedupeForT2S. Execute


2787
PrepareForOBProcess1ForT2S/PrepareForOBProcess2ForT2S dataflow. In case of
failure, trigger NotifySupport flow.
PopulateMasterDataSetsForT2S: Truncate the ContactDetailMasterForT2S and
OffersBySubChannelForOBForT2S. Execute PopulateMasterDataSetsForT2S dataflow.
In case of failure, trigger NotifySupport flow.
DedupeByContactDetailForT2S: Truncate the BestOBTreatmentsAfterDedupeForT2S.
Execute DedupeByContactDetailForT2S dataflow. In case of failure, trigger
NotifySupport flow.
PopulateSubscriptonsForControlGroupsForT2S: Truncate the
SubscriptionsForOBForT2S and BestOBTreatmentsBeforeControlGroupsForT2S.
Execute PopulateSubscriptonsForControlGroupsForT2S dataflow. In case of failure,
trigger NotifySupport flow.
ApplyControlGroupsForT2S: Truncate the
BestOutboundCCTreatmentsAfterControlGroupsForT2S. Execute
ApplyControlGroupsForT2S dataflow. In case of failure, rollback IH data and trigger
NotifySupport flow.
Extract Initiate IH Extraction Checks if IH Extract data is not empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings and end the case
If error: Trigger NotifySupport flow
Initiate DM Extraction Checks if the BestDirectMailTreatmentsAfterControlGroups dataset is not empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings.
If error: Trigger NotifySupport flow


segments/nodes
If empty: Handle warnings.
If error: Trigger NotifySupport flow
Initiate RCS Extraction Checks if the BestRCSTreatmentsAfterControlGroups dataset is not empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings.
If error: Trigger NotifySupport flow
Initiate MMS Extraction Checks if the BestMMSTreatmentsAfterControlGroups dataset is not empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings.
If error: Trigger NotifySupport flow
Initiate CCD Extraction Checks if the BestOutboundCCTreatmentsAfterControlGroups dataset is not empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings and end the case
If error: Trigger NotifySupport flow


2788
Initiate T2S Extraction Checks if the BestOutboundCCTreatmentsAfterControlGroupsForT2S dataset is not
empty:
If has data: Trigger InitialiseExtractorStatus flow - Initialise Extractor status and
segments/nodes
If empty: Handle warnings and end the case
If error: Trigger NotifySupport flow
Check Extractor Status Check extractor status:
If completed: End the flow, If still being processed: Handle warnings and snooze, If
failed: Trigger NotifySupport flow
Process Extraction Combine all extract outputs
Package & Send Package Files Package the output files (compress and encrypt)
Transfer Files Copy the output files to the destination path defined in AOM Configuration
End Post IH Extract Process Updates extractor timestamps in AOM Configuration
Truncate Batch Datasets Truncates the below data set updated by Batch NBA dataflow
BestOBTreatmentsByBatch
In case of any failure, NotifySupport Subflow for the manual intervention.
Finalise Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport SubFlow
is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent out in
case of failure or completion. Checks if SupportEmail is set before sending the email
communication out.
Case Elapsed and Successfully completed an email will be sent out from this flow.
Abort
(Alternative Stage)Finalise Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport SubFlow
is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent out in
case of failure or completion. Checks if SupportEmail is set before sending the email
communication out.


case of failure or completion. Checks if SupportEmail is set before sending the email
communication out.
Case Elapsed and Successfully completed an email will be sent out from this flow.
Elapse
(Alternative Stage)Finalise Updates CaseStatus and CaseEndTime (FinaliseCase Activity)
If there are any errors while executing FinaliseCase Activity then NotifySupport SubFlow
is invoked.
If SendCaseFinaliseEmail is set to false the only email communication will be sent out in
case of failure or completion. Checks if SupportEmail is set before sending the email
communication out.
Case Elapsed and Successfully completed an email will be sent out from this flow.


2789
Create RCS Channel Extract
In order to support the ability to send MMS and RCS messages from AOM, it must be possible to create an extract process for files to be
sent with relative details to IMI a 3rd party integrator who will be responsible for sending this information.

Case: Extractor
A new process should be added to the Extractor case to run on Batch NBA Extractor Case Sub Type - Initiate RCS Extraction.
The RCS flow should not run when the channel is not formally live. To enable this, the flow should utilise ProcessFlowToggle
functionality (see Channel Execution Approval & Switch Control Implementation - Vodafone - Adqura Confluence (atlassian.net)) .
The flow should check if there is any RCS Data from the relevant data set. If there is no data, then a warning should be sent (should not
block continuation).
The Extractor Status should be initialised for RCS Feed. This will include updating InitialiseExtractorStatus activity for RCS.

Flow: InitiateCCDExtraction
This flow checks for DM data. If there is no DM data, then the case moves straight to the End stage.
The flow should be updated to check for RCS data too (and also MMS data for the Create MMS Extract Process). The case should
only advance straight to the End stage if there are none of DM, RCS or MMS data.

Activity : GenerateExtract
This activity should be updated to support new Case Sub-type RCS. This activity should produce a RCS file per offer and sub-channel.
New Activity : GenerateRCSExtract
Execute the relevant data set to get the applicable offers for RCS
If there is no RCS data, then set error with a suitable message.
The output file headers and fields should be set. The RCS extract file format should be as per file specification


The output file headers and fields should be set. The RCS extract file format should be as per file specification
- IMI_Output_File_Specification_VODAFONE_AOM_V2.0.xlsx  - IMI_Output_File_Specification_VODAFONE_AOM_V2.0.xlsx
(sharepoint.com) .

Truncate Data Sets
The activity StartProcessBestOBTreatmentsAsTargetDF should be updated to truncate the data set
BestRCSTreatmentsAfterControlGroups
The activity StartPopulateMasterDataSetsDF should be updated to truncate the data set OffersBySubChannelForRCS


2790
Create MMS Channel Extract
In order to support the ability to send MMS and RCS messages from AOM, it must be possible to create an extract process for files to be
sent with relative details to IMI a 3rd party integrator who will be responsible for sending this information.

Case: Extractor
A new process should be added to the Extractor case to run on Batch NBA Extractor Case Sub Type - Initiate MMS Extraction.
The MMS flow should not run when the channel is not formally live. To enable this, the flow should utilise ProcessFlowToggle
functionality (see Channel Execution Approval & Switch Control Implementation - Vodafone - Adqura Confluence (atlassian.net)) .
The flow should check if there is any MMS Data from the relevant data set. If there is no data, then a warning should be sent (should not
block continuation).
The Extractor Status should be initialised for MMS Feed. This will include updating InitialiseExtractorStatus activity for MMS.

Flow: InitiateCCDExtraction
This flow checks for DM data. If there is no DM data, then the case moves straight to the End stage.
The flow should be updated to check for MMS data too (and also RCS data for the Create RCS Extract Process). The case should
only advance straight to the End stage if there are none of DM, RCS or MMS data.

Activity : GenerateExtract
This activity should be updated to support new Case Sub-type MMS. This activity should produce a MMS file per offer and sub-
channel.
New Activity : GenerateMMSExtract
Execute the relevant data set to get the applicable offers for MMS
If there is no MMS data, then set error with a suitable message.


If there is no MMS data, then set error with a suitable message.
The output file headers and fields should be set. The MMS extract file format should be as per file specification
- IMI_Output_File_Specification_VODAFONE_AOM_V2.0.xlsx  - IMI_Output_File_Specification_VODAFONE_AOM_V2.0.xlsx
(sharepoint.com) .

Truncate Data Sets
The activity StartProcessBestOBTreatmentsAsTargetDF should be updated to truncate the data set
BestRCSTreatmentsAfterControlGroups
The activity StartPopulateMasterDataSetsDF should be updated to truncate the data set OffersBySubChannelForRCS


2791
Create RecommendationItems Extract
Generate new RecommendationItems file in addition to IH and IHR files on Extarctor case for IH Case SubType.

Create New DatabaseClass Mapping to map recommendation_items_xt table to class
VFUK-FW-AOMFW-Data-RecommendationItemsExtract
Creating new Properties
EndTimeStamp
StartTimeStamp
Segments
Header
ExtractorTable
AOM Config

Case: Extractor
Update Prepare IH Extract process to include RecommendationItems Extract preparation by invoking PrepareRIExtractData Activity.
This activity get Recommendation_Items ExtractorTable name and ExtractSegments(defined on CaseSubType) from AOMConfig and
sets start and end timestamps to execute Connect-SQL VFUK-FW-AOMFW-DATA-
RECOMMENDATIONITEMSEXTRACT.PostgreSQL.Prepare which prepares data in recommendation_items_xt table and also sets the
header. If there are any errors inside the activities then the flow invokes NotifySupport sub flow.
create VFUK-FW-AOMFW-Work-Extractor.HeaderRI new property to write header
A new process Initiate RI Extraction  to be added to Extractor case to run on IH Case SubTypeDB Column Name DB Column  Property Name Property Name Type
segmentkey NUMERIC SegmentKey decimal
xtid(PK) VARCHAR ExtractId (PK) Text
datacontent VARCHAR DataContent TextData Mapping
ExtractorDestinationPath RI /mnt/share/aom/outbound/core/
ExtractorGPGRecipient RI AOMDomain@internal.vodafone.com
ExtractorTable RI recommendation_items_xt
ProcessFlowToggle InitiateRIExtraction FALSEConfigType (required) ConfigName (required) ConfigValue


2792
If the CaseSubType is “IH” then this flow invokes a common sub flow ProcessFlowToggle and checks if IsToggleEnabled is true, then
skip the complete flow otherwise invokes HasRIExtractData Activity to check if recommendation_items_xt table has data by calling
Connect-SQL VFUK-FW-AOMFW-DATA-RECOMMENDATIONITEMSEXTRACT.PostgreSQL.HasRIData, if the table is empty then the
flow invokes HandleWarnings sub flow otherwise flow invokes InitialiseExtractorStatus sub flow for RI Extract Type.
If RecommendationItems extract table is empty then flow  checks for IH Extract table data, if both IH and  RecommendationItems
Extract tables are empty then jumps to End Stage otherwise if only RecommendationItems Extarct table is empty, flow will not initiate RI
Extract.
Update CombineExtractOuputs to write  header and data content to outputfile related to Recommendation_items
Update only if Condition to set Header as below
If OutputFile.ConfigName, "IHR" then pass Primary.HeaderIHR to Local.Header else if OutputFile.ConfigName ,”RI” then pass
Primary.HeaderRI otherwise pass Primary.Header
 Update Agent Activity : GenerateExtract
This activity should be updated to support new ExtractType RI, to produce a recommednationIitems file by calling GenerateRIExtarct
and to handle errors if we have from GenerateRIExtarct activity
New Activity: GenerateRIExtract
This Activity will follow the same design pattern as GenerateIHExtract Activity by setting
ConfigName and Prefix specific to recommendationitems file.
Fetch records from VFUK-FW-AOMFW-Data-RecommendationItemsExtract for each given segment by using Obj-Browse method
Records will be pushed into the outputfile which is generated at the specified location


2793
Batch Controls - pause, hold, resume at treatment level
584125 - Summary View of Decision Output
Process flow HoldBatchTreatments in Extractor case after Prepare BatchNBA Extract flow
584288 - Data Population
Class VFUK-FW-AOMFW-Data-BatchNBADecisionSummary
Connect SQL rule builds and selects Data to be output to Data Type.
SQL populates the data to be shown in the UI by reading data from batch_decision_output table.
Holds the result in a Page list property in the case level to use it for displaying records in UI
Data type SelectedBatchNBATreatments
Call PopulateBatchNBADecisionSummary activity which calls SQLConnect rule to populate BatchNBADecisionSummary page list
Display BatchNBADecisionSummary Harness and Section to display Treatment data from BatchNBADecisionSummary page list
Call SaveSelectedBatchNBATreatments activity to save selected Treatments to SelectedBatchNBATreatments data type
Call CreateSelectedTreatmentsAttachment activity to create csv file attachment for summary email.
Call Handle Alerts common flow to send summary email with csv attachment.
Parent Class VFUK-FM-AOMFW-Work-Extractor
Ruleset AOMFWFlow HoldBatchNBATreatments
Stores batch decision summary data
Parent Class VFUK-FW-AOMFW-Data
Ruleset AOMFW
Keys TreatmentName
TreatmentVariant
OfferName
OfferVariant
ParentChildVFUK-FW-AOMFW-Data-BatchNBADecisionSummary Class


2794
ParentTreatmentName
Properties TreatmentName
TreatmentVariant
OfferName
OfferVariant
ParentChild
ParentTreatmentName
TargetVolume
ControlVolume
IsSelected - TrueFalse
BatchNBADecisionSummary - pagelist of BatchNBADecisionSummary
summarizes decision output data by reading batch_decision_output table, grouping table records based on treatmentname,
treatmentvariant, offername, offervariant, parentchild, parenttreatmentname columns and calculates target volume and control volume to be
shown in the UI
Applies To VFUK-FW-AOMFW-Data-BatchDecisionOutput
Ruleset AOMFW-Database
Group By TreatmentName
TreatmentVariant
OfferName
OfferVariant
ParentChild
ParentTreatmentName
Input Decision Output records in table batch_decision_output
Output TreatmentName
TreatmentVariant
OfferName
OfferVariant
ParentChild
ParentTreatmentName
TargetVolume
ControlVolume
SQL {SQLPage:SQLDiagnostics}
select
treatmentname as ".TreatmentName", treatmentvariant as ".TreatmentVariant", offername as ".OfferName",
offervariant as ".OfferVariant", parentchild as ".ParentChild", parenttreatmentname as
".ParentTreatmentName", sum(case when incontrolgroup != 'Y' then 1 else 0 end) as ".TargetVolume",
sum(case when incontrolgroup = 'Y' then 1 else 0 end) as ".ControlVolume"
from
batch_decision_output
group by
treatmentname, treatmentvariant, offername, offervariant, parentchild, parenttreatmentnamePopulateBatchNBADecisionSummary Connect SQL


2795
 stores batch decision output summary data specified by PopulateBatchNBADecisionSummary connect SQL rule
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW
Type Page-List
Class VFUK-FW-AOMFW-Data-BatchNBADecisionSummary BatchNBADecisionSummary Property
to refer SR class
Applies To VFUK-FW-AOMFW-Data-SelectedBatchNBATreatments
Ruleset AOMFW
Type Page-List
Class VFUK-AOMFW-SRCustomerList Property
Stores selected treatments from UI  (all child treatments of a selected parent treatment)
Parent Class VFUK-FW-AOMFW-Data
Ruleset AOMFW-Database
Keys TreatmentName
TreatmentVariant
OfferName
OfferVariant
Properties TreatmentName
TreatmentVariant
OfferName
OfferVariant
DB Table Mapping aom.selected_batch_nba_treatmentsVFUK-FW-AOMFW-Data-SelectedBatchNBATreatments Class
Column Name Column Type
treatmentname (PK) varchar(255)
treatmentvariant (PK) varchar(255)
offername (PK) varchar(255)
offervariant (PK) varchar(255)Table Name selected_batch_nba_treatments


2796
584293 - UI View
UI requirements:
Shows all Treatments from Batch NBA Decision Output grouped by parent
UI is populated from BatchNBADecisionSummary property
Parents display checkboxes which are selected (ticked) by default. Child treatments do not display checkboxes.
Checkboxes are editable enabling the user to deselect any Parent treatments.Query to create the table -- Drop table
-- DROP TABLE aom.selected_batch_nba_treatments;
CREATE TABLE aom.selected_batch_nba_treatments (
treatmentname varchar(255) NOT NULL,
treatmentvariant varchar(255) NOT NULL,
offername varchar(255) NOT NULL,
offervariant varchar(255) NOT NULL,
CONSTRAINT selected_batch_nba_treatments_pk PRIMARY KEY
(treatmentname, treatmentvariant, offername, offervariant)
);
The selected treatments from UI will be written into this data type (all child treatments of a selected parent treatment)
Applies To VFUK-FW-AOMFW-Data-SelectedBatchNBATreatments
Ruleset AOMFW-Database
Properties TreatmentName
TreatmentVariant
OfferName
OfferVariantSelectedBatchNBATreatments Data Type
Calls PopulateBatchNBADecisionSummary Connect SQL rule
Formats data from SQL call into BatchNBADecisionSummary page list for display. Sorts results into parent/child data structure for
display in UI section.
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFWActivity - PopulateBatchNBADecisionSummary


2797
Input
ParametersNA
Output
ParametersNA
Error
HandlingPrimary Catch-all Error Handler
Logs to Error Log
In layout tab, set to use BatchNBADecisionTreatments section
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW Flow Action - BatchNBADecisionSummary
Use HierachicalTable component to display data for treatments. UI is populated from page list property BatchNBADecisionSummary
(which was populated by SQL previously).
Treatments are grouped by parent. Child treatments should be expandable against the parent and have no selection abilities.
Parent treatments have a checkbox which is selected by default. This checkbox is editable and can be unselected if required.
Ability to submit records for continuation.
On submit, continue flow
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW
Display Columns Treatment Name
Treatment Variant
Offer Name
Offer Variant
Target Volume
Control Volume  Section - BatchNBADecisionSummary
Saves treatments which were selected in the UI. Selecred treatments are written to SelectedBatchNBATreatments data type
Any Child treatments of a selected Parent should be saved too.
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW
Input
ParametersNA
Output
ParametersNAActivity - SaveSelectedBatchNBATreatments


2798
584118 - Execute NBA Campaigns
Update required data flows in Prepare Batch NBA Extract and Process Batch NBA Extract processes in Extractor case. Update with
new data flows from logic.
New Data Flows:
1. DedupeByContactDetailForBatchNBA
2. AugmentVolumeConstrainedDataForBatchNBA
3. WriteBatchDecisionOutputBeforeChannelDelivery
4. ProcessForChannelDelivery
Flows to update in PrepareBatchNBAExtract flow:
From DedupeByContactDetail to DedupeByContactDetailForBatchNBA
From ApplyVolumeConstraints to ApplyVolumeConstraintsForBatchNBA to update AugmentVolumeConstrainedData as
AugmentVolumeConstrainedDataForBatchNBA
Flows to be added into PrepareBatchNBAExtract flow:
WriteBatchDecisionOutputBeforeChannelDelivery flow after “Apply Volume Constraints” flowError
HandlingPrimary Catch-all Error Handler
Logs to Error Log
Creates a csv file attachment for sending with the summary email.
Creates a row in the csv file for each selected treatment.
Should also include any Children of selected Parent treatments.
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW
Input
ParametersNA
Output
ParametersNA
Error
HandlingPrimary Catch-all Error Handler
Logs to Error LogActivity - CreateSelectedTreatmentsAttachment
PrepareBatchNBAExtract


2799
Flows to be moved to ProcessBatchNBAExtract flow from PrepareBatchNBAExtract flow:
ProcessBestOBTreatments
SetSubscriptionCampaignFlags
Flows to be added into ProcessBatchNBAExtract flow:
ProcessForChannelDelivery
ProcessBatchNBAExtract
DedupeByContactDetailForBatchNBA
Call StartDedupeByContactDetailForBatchNBADF activity
Applies To VFUK-FM-AOMFW-Work-Extractor
Ruleset AOMFWDedupeByContactDetailForBatchNBA Flow
Truncate datasets BestOBTreatmentsAfterDedupe, TreatmentsAfterDedupe, BestOBTreatmentsBeforeChannelDelivery,
ParentBestOBTreatments
Get the DataFlowWorkItemId
Execute data flow DedupeByContactDetailForBatchNBA
Applies To VFUK-FW-AOMFW-Work-Extractor
Ruleset AOMFW
Input
ParametersNA
Output
ParametersNA
Error
HandlingPrimary Catch-all Error Handler
Logs to Error LogStartDedupeByContactDetailForBatchNBADF Activity