Reward campaign assessment
unknown
javascript
4 years ago
11 kB
7
Indexable
const rewardCampaigns = await rewardCampaignRepository.findByCampaignId(campaignId); if (rewardCampaigns.length <= 0) { console.info(`Reward campaign: Campaign id '${campaignId}' has no reward to evaluate.`); return; } rewardCampaigns.sort((a, b) => a.sequence - b.sequence); // Sort by increasing sequence let action = 'continue'; for (const rewardCampaign of rewardCampaigns) { if (action === 'stop') { break; } if (!validateCampaignStatus(rewardCampaign)) continue; if (!validateCampaignDate(rewardCampaign)) continue; if (!await validateDailyCampaignCap(rewardCampaign)) continue; if (!await validateWeeklyCampaignCap(rewardCampaign)) continue; if (!await validateTotalCampaignCap(rewardCampaign)) continue; const piiFieldsEncrypted = encryptPiiFields(email, phone, id); if (!await validateDailyIndividualCap(rewardCampaign, piiFieldsEncrypted)) continue; if (!await validateWeeklyIndividualCap(rewardCampaign, piiFieldsEncrypted)) continue; if (!await validateTotalIndividualCap(rewardCampaign, piiFieldsEncrypted)) continue; // Evaluate criteria rules const rewardCampaignCriteria = await rewardCampaignCriteriaRepository.where({ reward_campaign_id: rewardCampaign.id, is_deleted: false }); if (!rewardCampaignCriteria || rewardCampaignCriteria.length <= 0) { console.warn(`Reward campaign: No criteria found for reward campaign id ${rewardCampaign.id} (${rewardCampaign.salesforce_id}).`); continue; } rewardCampaignCriteria.sort((a, b) => a.sequence - b.sequence); // Sort by increasing sequence let isEligible = false; for (const criteria of rewardCampaignCriteria) { // If there are no rules then award the reward directly if (!criteria.rules) { isEligible = true; } else { // If there are rules but its status is 'Inactive' then also award the reward directly const rules = JSON.parse(criteria.rules); if (rules.status.toLowerCase() === 'inactive') { isEligible = true; } else { for (const subCriteria of rules.criteria) { const registrationFormField = await registrationFormFieldRepository.findBySalesforceId(subCriteria.resource.questionId); if (!registrationFormField) { isEligible = false; console.warn(`Reward campaign: Not found registration form field '${subCriteria.resource.questionId}'.`); break; } // Only evaluate if the form id match the config form id in rewards_campaign_criteria const criteriaRegistrationFormSalesforceId = subCriteria.resource.formId; if (criteriaRegistrationFormSalesforceId !== registrationFormSalesforceId) { isEligible = false; break; } const questionCode = registrationFormField.code; const dataType = registrationFormField.data_type; const correctAnswer = subCriteria.value; const operator = subCriteria.operator; // If PII fields question code (name, email, phone, id) are setup // then add {question_code, answer} pair for evaluation switch (questionCode) { case 'name': userQuestionsAndAnswers.push({ question_code: 'name', answer: name }); break; case 'email': userQuestionsAndAnswers.push({ question_code: 'email', answer: email }); break; case 'phone': userQuestionsAndAnswers.push({ question_code: 'phone', answer: phone }); break; case 'id': userQuestionsAndAnswers.push({ question_code: 'id', answer: id }); break; } const isAnswerCorrected = checkUserAnswer(questionCode, correctAnswer, userQuestionsAndAnswers, dataType, operator); if (rules.criteriaType.toLowerCase() === 'all') { if (!isAnswerCorrected) { console.warn(`Reward campaign: Incorrect answer for question code '${questionCode}' the correct answer is '${correctAnswer}', submitted answer was ${JSON.stringify(userQuestionsAndAnswers)} \nOperator is '${operator}', data type is '${dataType}'.`); isEligible = false; break; } isEligible = true; } else if (rules.criteriaType.toLowerCase() === 'any') { if (isAnswerCorrected) { isEligible = true; break; } } } } } if (isEligible) { const rewardCampaignQualifier = await rewardCampaignQualifierRepository.insert({ reward_campaign_id: criteria.reward_campaign_id, registration_form_response_id: registrationFormResponseId, registrant_name: name, pii_email_token: piiEmailToken, pii_phone_token: piiPhoneToken, pii_id_token: piiIdToken, remarks: '', sync_to_salesforce: 'pending', is_voided: false }); if (rewardCampaign.action_when_qualified === 'stop') { // If the qualifier is inserted then check if should process the next reward campaign action = 'stop'; } const rewards = JSON.parse(criteria.rewards); for (const item of rewards) { const rewardId = item.rewardData.Reward_Catalog__c; const quantity = item.rewardData.Quantity__c ? parseInt(item.rewardData.Quantity__c) : 0; const reward = await rewardRepository.findBySalesforceId(rewardId); if (!reward || reward.status.toLowerCase() !== 'published') { console.info(`Reward campaign: Reward id '${rewardId}' not found or it is not currently in 'published' status`); continue; } console.info(`Reward campaign: Evaluating reward '${reward.title}'.\n${JSON.stringify(reward)}`); switch (reward.type.toLowerCase()) { case 'e-voucher': // TODO: logic for e-voucher break; case 'promo-code': // TODO: logic for promo-code break; case 'lucky-draw-chance': console.info(`Reward campaign: Issuing ${quantity} lucky draw chance(s) for campaign id ${campaignId}.`); if (quantity > 0) { for (let i = 1; i <= quantity; i++) { await luckyDrawChanceRepository.insert({ campaign_id: campaignId, reward_campaign_qualifier_id: rewardCampaignQualifier.id, registration_form_response_id: registrationFormResponseId, reward_id: reward.id, pii_email_token: piiEmailToken, pii_phone_token: piiPhoneToken, pii_id_token: piiIdToken, valid_from: reward.effective_from, valid_to: reward.effective_to || null, status: 'active' }); } } break; default: // Count reward issued and check if it exceeded reward cap const rewardsIssued = await rewardIssuedRepository.where({reward_id: reward.id}); if (Number.isInteger(reward.cap)) { let totalRewardsIssued = 0; if (rewardsIssued.length > 0) { rewardsIssued.forEach(i => { totalRewardsIssued += i.quantity }); } if (totalRewardsIssued >= reward.cap) { console.warn(`Reward campaign: Exceeded reward cap (limit: ${reward.cap}). \nReward id: '${reward.id}', title: '${reward.title}'.`); break; } } const newRewardIssued = await rewardIssuedRepository.insert({ reward_campaign_id: criteria.reward_campaign_id, reward_campaign_qualifier_id: rewardCampaignQualifier.id, reward_id: reward.id, type: reward.type, registrant_name: name, pii_email_token: piiEmailToken, pii_phone_token: piiPhoneToken, pii_id_token: piiIdToken, valid_from: reward.effective_from, valid_to: reward.effective_to || null, quantity: quantity, remarks: '', sync_to_salesforce: 'pending', status: 'issued' }); console.info(`Reward campaign: Issued 1 reward. \n${JSON.stringify(newRewardIssued)}`); break; } } } else { console.warn(`Reward campaign: Not eligible for criteria ${JSON.stringify(criteria)}.`); } } } await registrationFormResponseRepository.update(registrationFormResponseId, {'sync_to_salesforce': 'sync-waiting'}); // Send message to Salesforce queue await queueService.sendToQueue( JSON.stringify({salesforcePayload, messageId: uuidv4()}), 'registration_sync', config.salesforce.queue.url, config.salesforce.queue.delaySeconds, true ); return true;
Editor is loading...