You are here:
Apex Class for the Join Promotion Widget Template
Customize the Join Promotion widget template by adding to the widget, components, and data that aren’t available by default. For example, add a merge field for a custom Promotion field.
Required Editions
| Available in: Lightning Experience in Enterprise, Performance, Unlimited, and Developer Editions with Loyalty Management |
global class WidgetJoinMemberPromotion implements System.Callable {
public Object call(String action, Map<String, Object> arguments) {
Map<String, Object> input = (Map<String, Object>)arguments.get('input');
Map<String, Object> output = (Map<String, Object>)arguments.get('output');
Map<String, Object> options = (Map<String, Object>)arguments.get('options');
if (action == 'getPromotionDetails') {
return getPromotionDetails(input, output, options);
}
if (action == 'enrollMemberToPromotion') {
return enrollMemberToPromotion(input, output, options);
}
return null;
}
class PromotionDetails {
boolean isMemberEnrolled;
string promotionName;
string promotionDescription;
string membershipNumber;
String promotionEndDate;
String programName;
boolean isEnrollmentRequired;
boolean showPushMessage = false;
boolean success;
boolean isVisible;
}
class EnrollPromotionResponse {
boolean success;
string message;
boolean isVisible;
}
private Map<String, Object> getPromotionDetails(Map<String, Object> input, Map<String, Object> output, Map<String, Object> options) {
Long startTimeInMillis = System.currentTimeMillis();
List<LoyaltyProgram> programs = [SELECT Id From LoyaltyProgram WHERE Name =: (String)input.get('programName')];
PromotionDetails promotionDetails = new PromotionDetails();
if (programs.isEmpty()) {
promotionDetails.success = false;
output.put('promotionDetails', promotionDetails);
return output;
} else {
LoyaltyProgram program = programs.get(0);
promotionDetails.programName = (String)input.get('programName');
List<LoyaltyProgramMember> membersList = [SELECT Id FROM LoyaltyProgramMember WHERE MembershipNumber =: (String)input.get('membershipNumber') AND Program.Name =: (String)input.get('programName')];
List<Promotion> promoList = [SELECT Id, Name, Description, EndDate, IsEnrollmentRequired FROM Promotion WHERE Name =: (String)input.get('promotionName') AND LoyaltyProgram.Name =: (String)input.get('programName')];
List<LoyaltyProgramMbrPromotion> memberPromotionList = [SELECT Id FROM LoyaltyProgramMbrPromotion WHERE LoyaltyProgramMember.MembershipNumber =: (String)input.get('membershipNumber') AND Promotion.Name =: (String)input.get('promotionName') AND LoyaltyProgramMember.Program.Id =: program.Id AND Promotion.LoyaltyProgram.Id =: program.Id];
promotionDetails.isMemberEnrolled = !memberPromotionList.isEmpty();
if (membersList.isEmpty() || promoList.isEmpty()) {
promotionDetails.success = false;
output.put('promotionDetails', promotionDetails);
return output;
}
promotionDetails.success = true;
Promotion promo = promoList.get(0);
promotionDetails.promotionName = promo.Name;
promotionDetails.promotionDescription = promo.Description != null ? promo.Description : '';
promotionDetails.membershipNumber = (String) input.get('membershipNumber');
promotionDetails.isEnrollmentRequired = promo.IsEnrollmentRequired;
if (promo.EndDate != null) {
promotionDetails.promotionEndDate = DateTime.newInstance(promo.EndDate.year(), promo.EndDate.month(), promo.EndDate.day()).format('dd MMMMMM yyyy');
}
Integer threshold = Integer.valueOf((String) input.get('daysUntilPromotionExpiration'));
if (threshold != null && promo.EndDate != null && Date.today() <= promo.EndDate && Date.today().daysBetween(promo.EndDate) <= threshold) {
promotionDetails.showPushMessage = true;
}
output.put('promotionDetails', promotionDetails);
return output;
}
}
private Map<String, Object> enrollMemberToPromotion(Map<String, Object> input, Map<String, Object> output, Map<String, Object> options) {
Long startTimeInMillis = System.currentTimeMillis();
EnrollPromotionResponse enrollPromotionResponse = new EnrollPromotionResponse();
List<LoyaltyProgram> programs = [SELECT Id From LoyaltyProgram WHERE Name =: (String)input.get('programName')];
PromotionDetails promotionDetails = new PromotionDetails();
String visibilityType = (String)input.get('visibilityType');
String visibilityMap = (String)input.get('visibilityMap');
if(visibilityType != null && visibilityMap != null && visibilityType != '{Session.VisibilityType}' && visibilityMap != '{Session.VisibilityMap}' && !String.isEmpty(visibilityType) && !String.isEmpty(visibilityMap)) {
String programName = (String)input.get('programName');
String membershipNumber = (String)input.get('membershipNumber');
String decodedMap = EncodingUtil.base64Decode(visibilityMap).toString();
Map<String, Object> attributes = (Map<String, Object>) JSON.deserializeUntyped(decodedMap);
attributes.put('programName', programName);
attributes.put('membershipNumber', membershipNumber);
}
else
enrollPromotionResponse.isVisible = true;
if (programs.isEmpty()) {
enrollPromotionResponse.success = false;
output.put('enrollPromotionResponse', enrollPromotionResponse);
return output;
} else {
LoyaltyProgram program = programs.get(0);
List<LoyaltyProgramMember> memberList = [SELECT Id FROM LoyaltyProgramMember WHERE MembershipNumber =: (String)input.get('membershipNumber') AND Program.Name =: (String)input.get('programName')];
List<Promotion> promoList = [SELECT Id FROM Promotion WHERE Name =: (String)input.get('promotionName') AND LoyaltyProgram.Name =: (String)input.get('programName')];
String message = '';
if (!memberList.isEmpty() && !promoList.isEmpty()) {
try {
LoyaltyProgramMbrPromotion memberPromotion = new LoyaltyProgramMbrPromotion();
LoyaltyProgramMember member = memberList.get(0);
Promotion promo = promoList.get(0);
memberPromotion.LoyaltyProgramMemberId = member.Id;
memberPromotion.PromotionId = promo.Id;
memberPromotion.IsEnrollmentActive = true;
insert memberPromotion;
enrollPromotionResponse.success = true;
enrollPromotionResponse.message = 'EnrolledFromAction';
message = enrollPromotionResponse.message;
} catch (DmlException e) {
enrollPromotionResponse.success = false;
enrollPromotionResponse.message = e.getMessage();
message = 'DMLException: + ' + e.getStackTraceString();
}
} else {
enrollPromotionResponse.success = false;
enrollPromotionResponse.message = 'record not found';
message = enrollPromotionResponse.message;
}
output.put('enrollPromotionResponse', enrollPromotionResponse);
return output;
}
}
}
Did this article solve your issue?
Let us know so we can improve!
