diff --git a/constants/constants.js b/constants/constants.js index e603879..9cffa88 100644 --- a/constants/constants.js +++ b/constants/constants.js @@ -137,6 +137,8 @@ const UNPAID_FEE_STATUS = 'not_paid'; const ALLOW_SENDING_FEES = parseInt(process.env.ALLOW_SENDING_FEES_FOR_CURRENT_AND_FUTURE_MONTHS) ? true : false; +const TRIM_DLOCK_NAMES_LENGTH = parseInt(process.env.TRIM_DLOCK_NAMES_LENGTH) || 22; + module.exports = { VALID_CSV_HEADERS, USER_ENTRY_EVENT, @@ -162,4 +164,5 @@ module.exports = { UNPAID_FEE_STATUS, CUSTOM_FEES_PREFIXES, ALLOW_SENDING_FEES, + TRIM_DLOCK_NAMES_LENGTH }; diff --git a/environment.env b/environment.env index 22db46a..f2fe6a3 100644 --- a/environment.env +++ b/environment.env @@ -41,6 +41,8 @@ CUSTOM_FEES_PREFIXES=Array of prefixes to recognize manually added fees. Comma-s ALLOW_SENDING_FEES_FOR_CURRENT_AND_FUTURE_MONTHS=0 - false => Sending fees is disabled for current and future months, 1 - true => Sending fees is never disabled +TRIM_DLOCK_NAMES_LENGTH=Length of names in DLOCK files that will be taken to compare with ORD member names + #More about pool option : http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html DB_POOL_MAX_CONNECTIONS=Maximum number of connection in pool (ex. 18) DB_POOL_ACQUIRE=The maximum time, in milliseconds, that pool will try to get connection before throwing error (ex. 120000) diff --git a/services/doorLock/doorLock.js b/services/doorLock/doorLock.js index b304797..92c69bc 100644 --- a/services/doorLock/doorLock.js +++ b/services/doorLock/doorLock.js @@ -14,6 +14,7 @@ const { VALID_CSV_HEADERS, doorLockEvents, csvParserErrors, + TRIM_DLOCK_NAMES_LENGTH } = require('../../constants/constants'); const { fetchAllMembers } = require('../officeRnD/members'); @@ -53,7 +54,12 @@ const parseDoorLockDataFile = (file) => { const membersMap = {}; const unknownMembersMap = {}; - allMembers.forEach((member) => membersMap[member.name] = member); + allMembers.forEach((member) => { + const limitedMemberName = member.name ? member.name.substring(0, TRIM_DLOCK_NAMES_LENGTH) || undefined : undefined; + if (limitedMemberName){ + membersMap[limitedMemberName] = member; + } + }); const mappingFromFileName = extractMappingFromFileName(file.name); const mappingObject = checkIfMappingExsists(mappingFromFileName, mappings); @@ -110,18 +116,20 @@ const parseDoorLockDataFile = (file) => { const firstEntry = results[i]; const secondEntry = results[i+1]; - if (firstEntry && (firstEntry.event === USER_ENTRY_EVENT)){ - const memberObject = membersMap[firstEntry.name]; + const trimmedName = firstEntry && firstEntry.name ? firstEntry.name.substring(0, TRIM_DLOCK_NAMES_LENGTH) || undefined : undefined; + + if (firstEntry && trimmedName && (firstEntry.event === USER_ENTRY_EVENT)){ + const memberObject = membersMap[trimmedName]; if (!memberObject){ //Check if member is already labeled as unknown - const unknownMember = unknownMembersMap[firstEntry.name]; + const unknownMember = unknownMembersMap[trimmedName]; if (!unknownMember){ - unknownMembersMap[firstEntry.name] = firstEntry.name; + unknownMembersMap[trimmedName] = trimmedName; unknownMembersToReport.push({ error: csvParserErrors.UNKNOWN_MEMBER, - details: firstEntry.name, + details: trimmedName, file: file.name, }); } @@ -137,7 +145,7 @@ const parseDoorLockDataFile = (file) => { //Verify that member is registered in OfficeRnD system if (memberObject){ const entryData = { - memberName: firstEntry.name, + memberName: trimmedName, memberNumber: firstEntry['user no'], memberId: memberObject.memberId, timestamp, diff --git a/services/integration/bookings.js b/services/integration/bookings.js index e672a73..ea0ba6a 100644 --- a/services/integration/bookings.js +++ b/services/integration/bookings.js @@ -88,7 +88,24 @@ const getAllBookingsForMembersInDateRange = (dateRange, memberIds) => { }); }; +const deleteBookingsRemovedFromORD = (reservationIds) => { + if (!Array.isArray(reservationIds)){ + return 0; + } + + const filter = { + reservationId: { + [Op.notIn]: reservationIds + } + }; + + return db.bookingReservation.destroy({ + where: filter + }); +}; + module.exports = { getActiveBookingsForMembersInDateRange, getAllBookingsForMembersInDateRange, + deleteBookingsRemovedFromORD }; diff --git a/services/integration/checkBookingChange.js b/services/integration/checkBookingChange.js index e34c350..1bd0395 100644 --- a/services/integration/checkBookingChange.js +++ b/services/integration/checkBookingChange.js @@ -3,6 +3,7 @@ const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../officeRnD/bookings'); const { fetchResources } = require('../officeRnD/resources'); const { fetchRates } = require('../officeRnD/rates'); +const { deleteBookingsRemovedFromORD } = require('./bookings'); const { officeRnDAPIErrors } = require('../../constants/constants'); const { getIncidentsFromChanges, @@ -34,8 +35,17 @@ const checkBookingChanges = () => { resourcesMap[resourceId] = resource; }); - bulkWriteReservationsWithChangesTracking(reservations, resourcesMap) - .then((changes) => { + const reservationsInORD = []; + reservations.forEach(reservation => { + const { reservationId } = reservation; + reservationsInORD.push(reservationId); + }); + + const asyncActions = [deleteBookingsRemovedFromORD(reservationsInORD), bulkWriteReservationsWithChangesTracking(reservations, resourcesMap)]; + + Promise.all(asyncActions) + .then((asyncActionResults) => { + const changes = asyncActionResults[1]; bulkWriteChanges(changes) .then(() => { getIncidentsFromChanges(changes)