diff --git a/src/server/config/config.json b/src/server/config/config.json index da5d145..c992ded 100755 --- a/src/server/config/config.json +++ b/src/server/config/config.json @@ -3,7 +3,7 @@ "username": "savvy", "password": "savvy001!", "database": "savvy", - "host": "postgres", + "host": "10.10.33.21", "port": 5432, "dialect": "postgres" }, diff --git a/src/server/controllers/member.js b/src/server/controllers/member.js index 7eb9ad9..5265296 100755 --- a/src/server/controllers/member.js +++ b/src/server/controllers/member.js @@ -1,5 +1,5 @@ const { check, validationResult } = require('express-validator'); -const memberServices = require("../services").member; +const memberServices = require("../services").memberService.member; module.exports = { register(req, res) { @@ -123,7 +123,6 @@ module.exports = { }, getSlideCardData(req, res) { - console.log('ss'); memberServices.getSlideCard(req) .then(data => res.status(200).send(data)) .catch(error => res.status(400).send(error.errors)); diff --git a/src/server/services/card/card.js b/src/server/services/card/card.js deleted file mode 100644 index 54d9058..0000000 --- a/src/server/services/card/card.js +++ /dev/null @@ -1,242 +0,0 @@ -const sequelize = require("../../models").sequelize; -const { Op } = require("sequelize"); -const { forEach } = require('lodash'); -const MembersCardAssign = require("../../models").MembersCardAssign; - -module.exports = { - CARD_BEHAVIORS: { - BH0001: 'BH0001', - BH0002: 'BH0002', - BH0003: 'BH0003', - BH0004: 'BH0004', - BH0005: 'BH0005', - BH0006: 'BH0006', - BH0007: 'BH0007', - BH0008: 'BH0008', - BH0009: 'BH0009', - BH00010: 'BH00010', - BH00011: 'BH00011', - BH00012: 'BH00012', - BH00013: 'BH00013', - BH00014: 'BH00014', - BH00015: 'BH00015', - BH00016: 'BH00016', - BH00017: 'BH00017', - BH00018: 'BH00018', - }, - DEFAULT_CARD_TYPE: 33000, - DEFAULT_CARD_COUNT: 100, - CARD_LOCATIONS: { - DEFAULT: 0, - MAINFEED: 100, - ACTIVITIES: 200 - }, - CARD_ADD_DENIED: 0, - CARD_ADD_ALLOWED: 100, - async getMemberSurveyCards(memberId) { - var result = {}; - let sql = `SELECT card_id FROM members_onboarding_survey mos - LEFT JOIN onboarding_survey_cards ca ON ca.answers_key = mos.answers_key - LEFT JOIN main_cards a ON a.id=ca.card_id - WHERE mos.member_id = :member_id AND a.status = 1 - AND card_id NOT IN (SELECT card_id FROM members_card_assign WHERE member_id = :member_id AND status=1) - GROUP BY card_id`; - const results = await sequelize.query(sql, - { - replacements: { - member_id: memberId - } - }); - if (results[0]) { - var obj = this - console.log(results) - forEach(results[0], async function (value) { - await obj.userCardAdd(memberId, value.card_id) - }); - result = results[0]; - } - return result; - }, - - async userCardAdd(memberId, cardId) { - console.log('add card') - var a = this; - const memberCard = await this.getMemberCardAssignByMemberIdAndCardId(memberId, cardId); - //console.log("memberCard: ",memberCard) - if (memberCard) { - console.log('card status', memberCard.status) - if (memberCard.status == 0) { - const cardClick = await this.getMemberCardClickTrack(memberId, cardId); - const data = { - status: 1, - updated: Date.now() - }; - console.log('cardClick', cardClick) - if (cardClick) { - if (cardClick.expiration == 0) { - this.updateMemberCardAssign(memberId, cardId, data); - } - } else { - //update card status - this.updateMemberCardAssign(memberId, cardId, data); - } - } else { - //status already added - } - } else { - //insert member card assign - data = { - member_id: memberId, - card_id: cardId, - status: 1 - } - //console.log(data); - //this.memberCardAssignInsert(data); - } - }, - - async memberCardAssignInsert(data) { - return await MembersCardAssign.create(data); - }, - - async getMemberCardAssignByMemberIdAndCardId(memberId, cardId) { - console.log('getMemberCardAssignByMemberIdAndCardId') - return await MembersCardAssign.findOne({ - where: { - card_id: cardId, - member_id: memberId, - status: { - [Op.in]: [0, 1] - } - } - }); - - }, - - async getMemberCardClickTrack(memberId, cardId) { - var result = null; - let sql = `SELECT expiration FROM members_cardclicktrack mc LEFT JOIN main_cards a ON a.id=mc.card_id - WHERE a.id=:card_id AND mc.member_id=:member_id LIMIT 1`; - const results = await sequelize.query(sql, - { - replacements: { - card_id: cardId, - member_id: memberId - } - }); - if (results[0].expiration) { - console.log(results[0]) - result = results[0]; - } - return result; - - }, - - async updateMemberCardAssign(memberId, cardId, data) { - console.log('updateMemberCardAssign') - return MembersCardAssign - .update(data, - { - returning: true, - where: { - member_id: memberId, - card_id: cardId, - } - } - ) - .then(([rowsUpdate, [updatedRow]]) => { - return updatedRow - }) - .catch(error => { - console.log(error) - }); - }, - - async getMemberCardsByType(memberId, cardType, limit) { - var result = {}; - var total = 0; - var queryMain = ''; - var sqlSelect = ''; - var sqlCount = ''; - var cardType = cardType; - console.log(cardType) - switch (cardType) { - case 33000: - sqlCount = `SELECT count(ca.id) `; - sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude, - EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; - queryMain = `FROM main_cards a - LEFT JOIN card_actions b ON (b.id=a.card_action_id) - LEFT JOIN address adr ON adr.id = a.card_location - LEFT JOIN members_card_assign ca ON ca.card_id=a.id AND ca.member_id=:member_id AND ca.status=1 - WHERE a.status = 1 AND a.deleted IS NULL AND a.button1_action IN ('GOOFFERS','CARPOOL') `; - sqlCount += queryMain; - sqlSelect += queryMain + `ORDER BY a.card_order ASC`; - break; - case 22000: - sqlCount = `SELECT count(ca.id) `; - sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, - EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; - queryMain = `FROM members_card_assign ca - LEFT JOIN main_cards a ON a.id=ca.card_id - LEFT JOIN address adr ON adr.id = a.card_location - LEFT JOIN card_actions b ON (b.id=a.card_action_id) - WHERE ca.member_id = :member_id AND ca.status =1 AND a.status=1 - AND show_area IN (`+ this.CARD_LOCATIONS.DEFAULT + `,` + this.CARD_LOCATIONS.MAINFEED + `) AND a.deleted IS NULL AND ca.subscribe IS NULL AND ca.completed IS NULL `; - sqlCount += queryMain; - sqlSelect += queryMain + `ORDER BY a.card_order ASC`; - break; - - case 55000: - sqlCount = `SELECT count(ca.id) `; - sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, - EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; - queryMain = `FROM members_card_assign ca - LEFT JOIN main_cards a ON a.id=ca.card_id - LEFT JOIN address adr ON adr.id = a.card_location - LEFT JOIN card_actions b ON (b.id=a.card_action_id) - WHERE ca.member_id = :member_id AND a.button1_action IN ('GOOFFERS') AND ca.subscribe IS NOT NULL `; - sqlCount += queryMain; - sqlSelect += queryMain + ` ORDER BY ca.subscribe ASC`; - break; - - case 11000: - sqlCount = `SELECT count(a.id) `; - sqlSelect = `SELECT a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data `; - queryMain = `FROM main_cards a LEFT JOIN card_actions b ON (b.id=a.card_action_id) - WHERE a.status = 1 AND a.deleted IS NULL ORDER BY RANDOM()`; - break; - default: - sql = `select 1 from 1`; - } - sqlSelect += ` LIMIT ` + limit; - console.log("sql", sqlSelect) - const results = await sequelize.query(sqlSelect, - { - replacements: { member_id: memberId } - }); - if (results[0]) { - forEach(results[0], async function (card) { - console.log(card.card_behavior) - }); - //result = results[0]; - } - const totalCards = await sequelize.query(sqlCount, - { - replacements: { member_id: memberId } - }); - if (totalCards[0][0]) { - total = parseInt(totalCards[0][0].count); - } - return { total: total, result: result }; - }, - - verifyMemberCardDescision(cardData, member){ - var behavior = cardData.card_behavior; - switch(behavior){ - case this.CARD_BEHAVIORS.BH0001: - return this.CARD_ADD_ALLOWED; - } - return this.CARD_ADD_ALLOWED; - } -} \ No newline at end of file diff --git a/src/server/services/card/cardBehavior.js b/src/server/services/card/cardBehavior.js new file mode 100644 index 0000000..cdf5c1a --- /dev/null +++ b/src/server/services/card/cardBehavior.js @@ -0,0 +1,136 @@ +const sequelize = require("../../models").sequelize; +const MembersBankAccount = require("../../models").MembersBankAccounts; +const OAuth2PullJob = require("../../models").Oauth2PullJobs; + +module.exports = (memberCardService, memberService) => { + + var cardBehavior = {}; + cardBehavior.behaviorBH0001 = async (member) => { + return memberCardService.CARD_ADD_ALLOWED; + }; + + cardBehavior.behaviorBH0002 = async (member) => { + const totalBankAccount = await MembersBankAccount.count({ + where: { + member_id: member.id + } + }); + if (member.last_acct == "" && totalBankAccount == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0003 = async (member) => { + const totalPullEmail = await OAuth2PullJob.count({ + where: { + member_id: member.id + } + }); + if (member.last_email == "" && totalPullEmail == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0004 = async (member) => { + const totalPullEmail = await OAuth2PullJob.count({ + where: { + member_id: member.id + } + }); + if (member.last_acct == "" && totalPullEmail == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0005 = async (member) => { + const weeklySpending = await memberService.weeklyMemberSpending(member); + if (weeklySpending.weekly_total == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0006 = async (member) => { + if (member.max_budget == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0007 = async (member) => { + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0008 = async (member) => { + const weeklySpending = await memberService.weeklyMemberSpending(member); + if (weeklySpending.over_spending > 0 && weeklySpending.under_spending == 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0009 = async (member) => { + const weeklySpending = await memberService.weeklyMemberSpending(member); + if (weeklySpending.under_spending > 0 && weeklySpending.over_spending == 0 && weeklySpending.user_budget_percentbelow > 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0010 = async (member) => { + return await memberService.enableGPS(member); + }; + + cardBehavior.behaviorBH0011 = async (member) => { + const enableGPS = await memberService.enableGPS(member); + if (enableGPS && member.last_acct != "" && member.last_email != "") { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0012 = async (member) => { + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0013 = async (member) => { + const enableGPS = await memberService.enableGPS(member); + return !enableGPS; + }; + + cardBehavior.behaviorBH0014 = async (member) => { + const weeklySpending = await memberService.weeklyMemberSpending(member); + if (weeklySpending.user_budget_percentabove > 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0015 = async (member) => { + const weeklySpending = await memberService.weeklyMemberSpending(member); + if (weeklySpending.user_budget_percentbelow > 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0016 = async (member) => { + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0017 = async (member) => { + return memberCardService.CARD_ADD_DENIED; + }; + + cardBehavior.behaviorBH0018 = async (member) => { + if (member.min_budget + member.max_budget > 0) { + return memberCardService.CARD_ADD_ALLOWED; + } + return memberCardService.CARD_ADD_DENIED; + }; + + return cardBehavior; +} \ No newline at end of file diff --git a/src/server/services/card/index.js b/src/server/services/card/index.js new file mode 100644 index 0000000..3f44578 --- /dev/null +++ b/src/server/services/card/index.js @@ -0,0 +1,11 @@ +const memberCard = require("./memberCard"); +const cardBehavior = require("./cardBehavior"); + +/* console.log({ + memberCard, + cardBehavior +}) */ +module.exports = { + memberCard, + cardBehavior +}; diff --git a/src/server/services/card/memberCard.js b/src/server/services/card/memberCard.js new file mode 100644 index 0000000..8d24989 --- /dev/null +++ b/src/server/services/card/memberCard.js @@ -0,0 +1,253 @@ +const sequelize = require("../../models").sequelize; +const { Op } = require("sequelize"); +const { forEach, invoke } = require('lodash'); +const MembersCardAssign = require("../../models").MembersCardAssign; + +module.exports = (memberService) => { + const cardBehaviorService = require("./cardBehavior")(this,memberService); + return { + CARD_BEHAVIORS: { + BH0001: 'BH0001', + BH0002: 'BH0002', + BH0003: 'BH0003', + BH0004: 'BH0004', + BH0005: 'BH0005', + BH0006: 'BH0006', + BH0007: 'BH0007', + BH0008: 'BH0008', + BH0009: 'BH0009', + BH00010: 'BH00010', + BH00011: 'BH00011', + BH00012: 'BH00012', + BH00013: 'BH00013', + BH00014: 'BH00014', + BH00015: 'BH00015', + BH00016: 'BH00016', + BH00017: 'BH00017', + BH00018: 'BH00018', + }, + DEFAULT_CARD_TYPE: 33000, + DEFAULT_CARD_COUNT: 100, + CARD_LOCATIONS: { + DEFAULT: 0, + MAINFEED: 100, + ACTIVITIES: 200 + }, + CARD_ADD_DENIED: 0, + CARD_ADD_ALLOWED: 100, + + async getMemberSurveyCards(memberId) { + var result = {}; + let sql = `SELECT card_id FROM members_onboarding_survey mos + LEFT JOIN onboarding_survey_cards ca ON ca.answers_key = mos.answers_key + LEFT JOIN main_cards a ON a.id=ca.card_id + WHERE mos.member_id = :member_id AND a.status = 1 + AND card_id NOT IN (SELECT card_id FROM members_card_assign WHERE member_id = :member_id AND status=1) + GROUP BY card_id`; + const results = await sequelize.query(sql, + { + replacements: { + member_id: memberId + } + }); + if (results[0]) { + var obj = this + console.log(results) + forEach(results[0], async function (value) { + await obj.userCardAdd(memberId, value.card_id) + }); + result = results[0]; + } + return result; + }, + + async userCardAdd(memberId, cardId) { + console.log('add card') + var a = this; + const memberCard = await this.getMemberCardAssignByMemberIdAndCardId(memberId, cardId); + //console.log("memberCard: ",memberCard) + if (memberCard) { + console.log('card status', memberCard.status) + if (memberCard.status == 0) { + const cardClick = await this.getMemberCardClickTrack(memberId, cardId); + const data = { + status: 1, + updated: Date.now() + }; + console.log('cardClick', cardClick) + if (cardClick) { + if (cardClick.expiration == 0) { + this.updateMemberCardAssign(memberId, cardId, data); + } + } else { + //update card status + this.updateMemberCardAssign(memberId, cardId, data); + } + } else { + //status already added + } + } else { + //insert member card assign + data = { + member_id: memberId, + card_id: cardId, + status: 1 + } + //console.log(data); + //this.memberCardAssignInsert(data); + } + }, + + async memberCardAssignInsert(data) { + return await MembersCardAssign.create(data); + }, + + async getMemberCardAssignByMemberIdAndCardId(memberId, cardId) { + console.log('getMemberCardAssignByMemberIdAndCardId') + return await MembersCardAssign.findOne({ + where: { + card_id: cardId, + member_id: memberId, + status: { + [Op.in]: [0, 1] + } + } + }); + + }, + + async getMemberCardClickTrack(memberId, cardId) { + var result = null; + let sql = `SELECT expiration FROM members_cardclicktrack mc LEFT JOIN main_cards a ON a.id=mc.card_id + WHERE a.id=:card_id AND mc.member_id=:member_id LIMIT 1`; + const results = await sequelize.query(sql, + { + replacements: { + card_id: cardId, + member_id: memberId + } + }); + if (results[0].expiration) { + console.log(results[0]) + result = results[0]; + } + return result; + + }, + + async updateMemberCardAssign(memberId, cardId, data) { + console.log('updateMemberCardAssign') + return MembersCardAssign + .update(data, + { + returning: true, + where: { + member_id: memberId, + card_id: cardId, + } + } + ) + .then(([rowsUpdate, [updatedRow]]) => { + return updatedRow + }) + .catch(error => { + console.log(error) + }); + }, + + async getMemberCardsByType(member, cardType, limit) { + var memberId = member.id; + var result = {}; + var total = 0; + var queryMain = ''; + var sqlSelect = ''; + var sqlCount = ''; + var cardType = cardType; + console.log(cardType) + switch (cardType) { + case 33000: + sqlCount = `SELECT count(ca.id) `; + sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; + queryMain = `FROM main_cards a + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN members_card_assign ca ON ca.card_id=a.id AND ca.member_id=:member_id AND ca.status=1 + WHERE a.status = 1 AND a.deleted IS NULL AND a.button1_action IN ('GOOFFERS','CARPOOL') `; + sqlCount += queryMain; + sqlSelect += queryMain + `ORDER BY a.card_order ASC`; + break; + case 22000: + sqlCount = `SELECT count(ca.id) `; + sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; + queryMain = `FROM members_card_assign ca + LEFT JOIN main_cards a ON a.id=ca.card_id + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE ca.member_id = :member_id AND ca.status =1 AND a.status=1 + AND show_area IN (`+ this.CARD_LOCATIONS.DEFAULT + `,` + this.CARD_LOCATIONS.MAINFEED + `) AND a.deleted IS NULL AND ca.subscribe IS NULL AND ca.completed IS NULL `; + sqlCount += queryMain; + sqlSelect += queryMain + `ORDER BY a.card_order ASC`; + break; + + case 55000: + sqlCount = `SELECT count(ca.id) `; + sqlSelect = `SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire `; + queryMain = `FROM members_card_assign ca + LEFT JOIN main_cards a ON a.id=ca.card_id + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE ca.member_id = :member_id AND a.button1_action IN ('GOOFFERS') AND ca.subscribe IS NOT NULL `; + sqlCount += queryMain; + sqlSelect += queryMain + ` ORDER BY ca.subscribe ASC`; + break; + + case 11000: + sqlCount = `SELECT count(a.id) `; + sqlSelect = `SELECT a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data `; + queryMain = `FROM main_cards a LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE a.status = 1 AND a.deleted IS NULL ORDER BY RANDOM()`; + break; + default: + sql = `select 1 from 1`; + } + sqlSelect += ` LIMIT ` + limit; + console.log("sql", sqlSelect) + const results = await sequelize.query(sqlSelect, { + replacements: { member_id: memberId } + }); + var testCardAllowed = this.CARD_ADD_DENIED + if (results[0]) { + var self = this; + forEach(results[0], async function (card) { + //console.log("card behavior: ", card.card_behavior) + if (cardType == 22000) { + testCardAllowed = self.verifyMemberCardDescision(card, member); + } + }); + result = results[0]; + } + const totalCards = await sequelize.query(sqlCount, { + replacements: { member_id: memberId } + }); + if (totalCards[0][0]) { + total = parseInt(totalCards[0][0].count); + } + + return { total: total, result: result }; + }, + + async verifyMemberCardDescision(cardData, member) { + var behavior = cardData.card_behavior; + var func = 'behavior' + behavior; + + if (func in cardBehaviorService) { + //console.log('call function ', func) + return invoke(cardBehaviorService, func, member); + } + return this.CARD_ADD_ALLOWED; + } + } +} \ No newline at end of file diff --git a/src/server/services/index.js b/src/server/services/index.js index 61a57b7..aefb60c 100755 --- a/src/server/services/index.js +++ b/src/server/services/index.js @@ -1,4 +1,14 @@ -const member = require("./member/member"); +const cardService = require("./card"); +const mailService = require("./mail"); +const memberService = require("./member"); + +/*console.log({ + cardService, + mailService, + memberService +})*/ module.exports = { - member + cardService, + mailService, + memberService }; diff --git a/src/server/services/mail/member.js b/src/server/services/mail/member.js index 18fe3de..3cd77ca 100644 --- a/src/server/services/mail/member.js +++ b/src/server/services/mail/member.js @@ -1,6 +1,7 @@ const handlebars = require('handlebars'); const fs = require('fs'); const sgMail = require('@sendgrid/mail') + sgMail.setApiKey(process.env.SENDGRID_API_KEY); module.exports = { emailResetPassword(user, resetPin) { diff --git a/src/server/services/member/index.js b/src/server/services/member/index.js new file mode 100644 index 0000000..67eaf39 --- /dev/null +++ b/src/server/services/member/index.js @@ -0,0 +1,7 @@ +const member = require("./member"); +const resetPassword = require("./resetPassword"); + +module.exports = { + member, + resetPassword +}; diff --git a/src/server/services/member/member.js b/src/server/services/member/member.js index 6c9bbc7..730e851 100755 --- a/src/server/services/member/member.js +++ b/src/server/services/member/member.js @@ -3,13 +3,15 @@ const { pick, forEach } = require('lodash'); const bcrypt = require('bcrypt'); const crypto = require('crypto'); const Member = require("../../models").Members; -const MemberOnboardingSurvey = require("../../models").MembersOnboardingSurvey; const sequelize = require("../../models").sequelize; +const MemberOnboardingSurvey = require("../../models").MembersOnboardingSurvey; +const MembersTracking = require("../../models").MembersTracking; +const MembersBankAccount = require("../../models").MembersBankAccounts; const resetPasswordService = require("./resetPassword"); -const cardService = require("../card/card"); +const memberCardService = require("../card").memberCard.bind(this); const mailServiceMember = require("../mail").member; -const { DEFAULT_CARD_TYPE } = require('../card/card'); +console.log('card in member', memberCardService) module.exports = { RESET_START: 100, RESET_CONFIRM: 200, @@ -80,7 +82,7 @@ module.exports = { } } else { return { - message: "Wrong username or password." + message: "Wrong email." }; } } catch (error) { @@ -143,7 +145,7 @@ module.exports = { let expired = date.setDate(date.getDate() + 7); var status = 3; - + if (user == null) { console.log('user null') return false; @@ -266,7 +268,7 @@ module.exports = { }, async getProfile(req) { - console.log(req.user) + //console.log(req.user) const member_id = req.user.id; var result = {}; let sql = `SELECT dg.personality AS personality_name,m.id AS member_id,m.*,m.id as id @@ -489,19 +491,125 @@ module.exports = { return 0;*/ }, - async getSlideCard(req) { + async weeklyMemberSpending(member) { + var overSpending = 0; + var underSpending = 0; + var weeklyTotal = 0; + var populationAverage = 0; + var memberAverage = 0; + var userBudgetPercentBelow = 0; + var userBudgetPercentAbove = 0; + var userMoreLocalAveragePerm = 0; + var userLessLocalAveragePerm = 0; + var totalBank = 0; + var totalEmail = 0; + var totalWeeklySpend = 0; + //local average + var queryPopulation = `SELECT avg(amount) *0.01 AS population_average + FROM members_bankimport + WHERE category IN (SELECT category FROM activity_listcategory) AND currency='USD'`; + const avgPop = await sequelize.query(queryPopulation); + if (avgPop[0][0]) { + populationAverage = parseFloat(avgPop[0][0].population_average); + } + + var queryMemberAverage = `SELECT avg(amount) *0.01 AS member_average + FROM members_bankimport + WHERE category IN (SELECT category FROM activity_listcategory) AND member_id = :member_id AND currency='USD'`; + const memberAverge = await sequelize.query(queryMemberAverage, { + replacements: { member_id: member.id } + }); + if (memberAverge[0][0]) { + memberAverage = parseFloat(memberAverge[0][0].member_average); + } + + if (memberAverage > 0 && memberAverage > populationAverage) { + userMoreLocalAveragePerm = memberAverage - populationAverage; + } + + if (memberAverage > 0 && memberAverage < populationAverage) { + userLessLocalAveragePerm = populationAverage - memberAverage; + } + //end local average + var totalWeeklyBudget = (member.min_budget + member.max_budget) / 200; + + var queryBankImport = `SELECT * FROM (SELECT round(0.01*sum(amount),2) AS total FROM members_bankimport + WHERE member_id= :member_id AND LOWER(category) IN (SELECT LOWER(category) FROM activity_listcategory) + AND date_trunc('day', time) > (current_date - 8) + AND date_trunc('day', time) < current_date) AS c WHERE c.total IS NOT NULL`; + + const totalBankImport = await sequelize.query(queryBankImport, { + replacements: { member_id: member.id } + }); + if (totalBankImport[0][0]) { + totalBank = parseInt(totalBankImport[0][0].total); + } + + var queryTotalEmail = `SELECT * FROM (SELECT round(sum(a.cost),2) AS total + FROM parsedemail_item a, trackedemail_item b WHERE b.id=a.trackedemail_item_id + AND b.member_id= :member_id AND a.dup_id IS NULL AND date_trunc('day', a.travel_date_end) > (current_date - 8) + AND date_trunc('day', a.travel_date_end) < current_date) AS c WHERE c.total IS NOT NULL`; + + const totalEmailCost = await sequelize.query(queryTotalEmail, { + replacements: { member_id: member.id } + }); + if (totalEmailCost[0][0]) { + totalEmail = parseInt(totalEmailCost[0][0].total); + } + + totalWeeklySpend = totalBank + totalEmail; + + if (totalWeeklySpend > totalWeeklyBudget && totalWeeklyBudget > 0) { + overSpending = totalWeeklySpend - totalWeeklyBudget; + userBudgetPercentAbove = overSpending / totalWeeklyBudget; + } + + if (totalWeeklyBudget > totalWeeklySpend && totalWeeklyBudget > 0) { + underSpending = totalWeeklyBudget - totalWeeklySpend; + userBudgetPercentBelow = underSpending / totalWeeklyBudget; + } + + weeklyTotal = totalWeeklySpend; + + return { + over_spending: overSpending, + under_spending: underSpending, + weekly_total: weeklyTotal, + user_budget_percentbelow: userBudgetPercentBelow, + user_budget_percentabove: userBudgetPercentAbove, + user_less_localavergperm: userLessLocalAveragePerm, + user_more_localavergperm: userMoreLocalAveragePerm, + population_average: populationAverage, + member_average: memberAverage + }; + + }, + + async enableGPS(member) { + const totalTracking = await MembersBankAccount.count({ + where: { + member_id: member.id + } + }); + if (totalTracking > 0) { + return true; + } + return false; + }, + + async getSlideCard(req) { const member_id = req.user.id; - const card_type = (req.query.card_type) ? req.query.card_type : DEFAULT_CARD_TYPE; - const card_count = (req.query.card_count) ? req.query.card_count : cardService.DEFAULT_CARD_COUNT; - //const surveyCards = await cardService.getMemberSurveyCards(member_id); + const card_type = (req.query.card_type) ? req.query.card_type : memberCardService.DEFAULT_CARD_TYPE; + const card_count = (req.query.card_count) ? req.query.card_count : memberCardService.DEFAULT_CARD_COUNT; + //const surveyCards = await memberCardService.getMemberSurveyCards(member_id); //console.log(surveyCards); console.log("card_type:", card_type); console.log("get cards") + const member = await this.getProfile(req); + const memberCards = await memberCardService(this).getMemberCardsByType(member, parseInt(card_type), card_count); - const memberCards = await cardService.getMemberCardsByType(member_id, parseInt(card_type), card_count); - - console.log("memberCards", memberCards.total) + //console.log("memberCards", memberCards) if (surveyCards) { } }