diff --git a/constants/constants.js b/constants/constants.js index 1a4da0c..bdc29da 100644 --- a/constants/constants.js +++ b/constants/constants.js @@ -60,6 +60,7 @@ const officeRnDAPIErrors = { FAILED_TO_FETCH_FEES: 'Failed to fetch existing fees', FAILED_TO_DELETE_FEES: 'Failed to delete fees in ORD', FAILED_TO_ADD_FEES: 'Failed to add fees in ORD', + MEMBERSHIPS_ARE_NOT_LOADED_CORRECTLY: 'Memberships are not loaded correctly', }; const integrationServiceErrors = { PROCESSING_TRY_AGAIN: 'Incident calculations are in progress. Please try again in a few minutes', @@ -70,6 +71,7 @@ const integrationServiceErrors = { INVALID_DATE_RANGE: 'Dates in date range are invalid', FAILED_TO_GENERATE_MEMBER_PRACTICE_SUMMARY: 'Failed to generate Member Practice Summary', ERRORS_IN_MEMBER_PRACTICE_SUMMARY_REPORT: 'Member Practice Summary Report is generated but there were some errors and report may be incomplete', + EXPECTED_MEMBER_IDS_ARRAY: 'Expected array of member IDs', }; const incidentType = { diff --git a/controllers/integration.js b/controllers/integration.js index c703d47..6b4c282 100644 --- a/controllers/integration.js +++ b/controllers/integration.js @@ -6,6 +6,7 @@ const { getMappingsFromDatabase, fetchOffices, fetchResources, saveNewMappingToD const { getAllIncidents, getMemberPracticeSummaryReport } = require('../services/integration/reports'); const { getMembersFeesForDateRange } = require('../services/integration/invoiceIntegration'); const { deleteFeesFromORD, addFeesToORD } = require('../services/officeRnD/fees'); +const { reformatMembershipsName } = require('../services/officeRnD/memberships'); const { checkBookingChanges } = require('../services/integration/checkBookingChange'); const { checkIfProcessing } = require('../services/integration/processingStatus'); @@ -85,13 +86,21 @@ const addFees = (req, res) => { .then(() => { // TODO: Change this to parallel execution getMembersFeesForDateRange(dateRange, memberIds) - .then((allFees) => { + .then(({allFees, memberships}) => { addFeesToORD(allFees) .then((numberOfInsertedFees) => { - res.send({ - status: 'ok', - numberOfInsertedFees - }); + reformatMembershipsName(memberships) + .then(() => { + res.send({ + status: 'ok', + numberOfInsertedFees + }); + }) + .catch((error) => { + console.log('Error reformatting memberships name'); + console.log(error); + res.status(500).send(error); + }) }) .catch((error) => { console.log('Error adding fees'); diff --git a/services/integration/invoiceIntegration.js b/services/integration/invoiceIntegration.js index 034529c..86cb5ed 100644 --- a/services/integration/invoiceIntegration.js +++ b/services/integration/invoiceIntegration.js @@ -8,7 +8,7 @@ const { getAllBookingsForMembersInDateRange } = require('./bookings'); const { DEFAULT_DATE_FORMAT, UI_TIMEZONE, incidentTypeExplanations, incidentType, unlockedIncidentLevelsPrices } = require('../../constants/constants'); const { getResourceMappings } = require('../officeRnD/resources'); const { fetchAllMembers } = require('../officeRnD/members'); -const { fetchAllMembershipsAsMap } = require('../officeRnD/memberships'); +const { fetchAllMembershipsForMemberIds } = require('../officeRnD/memberships'); const { discounts, DISCOUNT_PLANS } = require('../../constants/constants'); const createFeeFromIncident = (incident) => { @@ -280,7 +280,7 @@ const createNegativeFeeForDiscount = (memberData, dateRange) => { const getMembersFeesForDateRange = (dateRange, memberIds) => { return new Promise((resolve, reject) => { - const collectData = [getAllIncidents(dateRange, memberIds), getAllBookingsForMembersInDateRange(dateRange, memberIds), getResourceMappings(), fetchAllMembers(), fetchAllMembershipsAsMap()]; + const collectData = [getAllIncidents(dateRange, memberIds), getAllBookingsForMembersInDateRange(dateRange, memberIds), getResourceMappings(), fetchAllMembers(), fetchAllMembershipsForMemberIds(memberIds)]; Promise.all(collectData) .then((result) => { @@ -288,7 +288,23 @@ const getMembersFeesForDateRange = (dateRange, memberIds) => { const allBookings = result[1]; const resourceMappings = result[2]; const membersList = result[3]; - const membershipsMap = result[4]; + const memberships = result[4]; + + const membershipsMap = {}; + memberships.forEach((membership) => { + const { price, name, member } = membership; + if (!membershipsMap[member]) { + membershipsMap[member] = [{ + price, + name, + }]; + }else{ + membershipsMap[member].push({ + price, + name, + }); + } + }); const membersMap = {}; const oneMemberObject = { @@ -428,10 +444,17 @@ const getMembersFeesForDateRange = (dateRange, memberIds) => { }); allFees.forEach((fee) => { - fee.team = memberIdTeamMappings[fee.member] || null; + const { member } = fee; + const { teamId, name: memberName} = membersMap[member].member; + + fee.team = memberIdTeamMappings[member] || null; + if (teamId){ + //if member is part of the company, add name to the fee description/name + fee.name += `, ${memberName}`; + } }); - resolve(allFees); + resolve({allFees, memberships}); }) .catch((error) => { diff --git a/services/officeRnD/memberships.js b/services/officeRnD/memberships.js index 43774f0..328cdf7 100644 --- a/services/officeRnD/memberships.js +++ b/services/officeRnD/memberships.js @@ -1,28 +1,26 @@ 'use strict'; const { API } = require('../../helpers/api'); +const { DISCOUNT_PLANS, officeRnDAPIErrors, integrationServiceErrors } = require('../../constants/constants'); -const fetchAllMembershipsAsMap = () => { +const fetchAllMembershipsForMemberIds = (memberIds) => { return new Promise((resolve, reject) => { API.get('/memberships') .then((result) => { - const membershipsMap = {}; const memberships = result.data || []; - memberships.forEach((membership) => { - const { price, name, member } = membership; - if (!membershipsMap[member]) { - membershipsMap[member] = [{ - price, - name, - }]; - }else{ - membershipsMap[member].push({ - price, - name, - }); - } - }); - resolve(membershipsMap); + + if (Array.isArray(memberIds)){ + const filteredMemberships = []; + memberships.forEach((membership) => { + const { member } = membership; + if (memberIds.indexOf(member) !== -1){ + filteredMemberships.push(membership); + } + }); + resolve(filteredMemberships); + }else{ + reject(integrationServiceErrors.EXPECTED_MEMBER_IDS_ARRAY); + } }) .catch((error) => { reject(error); @@ -30,6 +28,36 @@ const fetchAllMembershipsAsMap = () => { }); }; -module.exports = { - fetchAllMembershipsAsMap, +const reformatMembershipsName = (memberships) => { + return new Promise((resolve, reject) => { + const asyncMembershipUpdates = []; + if (Array.isArray(memberships)){ + memberships.forEach((membership) => { + const { name, _id } = membership; + + if (name && name.length > 0 && name[0] !== '['){ + DISCOUNT_PLANS.forEach((discountPlan) => { + if (name === discountPlan){ + asyncMembershipUpdates.push(API.put(`memberships/${_id}`, {name: `[${name}]`})); + } + }); + } + }); + + Promise.all(asyncMembershipUpdates) + .then(() => { + resolve(true); + }) + .catch((error) => reject(error)); + }else{ + reject(officeRnDAPIErrors.MEMBERSHIPS_ARE_NOT_LOADED_CORRECTLY); + } + + + }); +}; + +module.exports = { + fetchAllMembershipsForMemberIds, + reformatMembershipsName };