Loading
Loyalty Management
Apex Class for the Join Promotion Widget Template

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;
        }
    }
}
 
Loading
Salesforce Help | Article