diff --git a/controllers/doorLock.js b/controllers/doorLock.js index 6e9626f..c34248a 100644 --- a/controllers/doorLock.js +++ b/controllers/doorLock.js @@ -27,7 +27,13 @@ const uploadDoorLockData = (req, res) => { parserResults.forEach((parserResult) => { parsedData.push(...parserResult.parsedData); parserErrors.push(...parserResult.errors); - unknownMembers.push(...parserResult.unknownMembers); + + parserResult.unknownMembers.forEach((newUnknownMember) => { + // Check if member is already labeled as unknown in different file + if (!unknownMembers.find((unknownMember) => unknownMember.details === newUnknownMember.details)){ + unknownMembers.push(newUnknownMember); + } + }); }); const asyncWriteJobs = []; diff --git a/services/doorLock/doorLock.js b/services/doorLock/doorLock.js index c59c6e7..48b87c2 100644 --- a/services/doorLock/doorLock.js +++ b/services/doorLock/doorLock.js @@ -3,10 +3,11 @@ const db = require('../../models'); const fs = require('fs'); const csv = require('csv-parser'); -const moment = require('moment/moment'); +const moment = require('moment-timezone'); const Op = require('sequelize').Op; const { + UI_TIMEZONE, USER_ENTRY_EVENT, ENABLE_PASSAGE_MODE, DISABLE_PASSAGE_MODE, @@ -38,7 +39,7 @@ const parseDoorLockDataFile = (file) => { return new Promise ((resolve, reject) => { const results = []; const errors = []; - const unknownMembers = []; + const unknownMembersToReport = []; let isValidFile = true; const prefetchDataJobs = [getMappingsFromDatabase(), fetchAllMembers()]; @@ -48,6 +49,11 @@ const parseDoorLockDataFile = (file) => { const mappings = result[0]; const allMembers = result[1]; + const membersMap = {}; + const unknownMembersMap = {}; + + allMembers.forEach((member) => membersMap[member.name] = member); + const mappingFromFileName = extractMappingFromFileName(file.name); const mappingObject = checkIfMappingExsists(mappingFromFileName, mappings); if (!mappingObject){ @@ -104,13 +110,15 @@ const parseDoorLockDataFile = (file) => { const secondEntry = results[i+1]; if (firstEntry && (firstEntry.event === USER_ENTRY_EVENT)){ - const memberObject = allMembers.find(member => member.name === firstEntry.name); + const memberObject = membersMap[firstEntry.name]; if (!memberObject){ //Check if member is already labeled as unknown - const unknownMember = unknownMembers.find((member) => member.details === firstEntry.name); + const unknownMember = unknownMembersMap[firstEntry.name]; + if (!unknownMember){ - unknownMembers.push({ + unknownMembersMap[firstEntry.name] = firstEntry.name; + unknownMembersToReport.push({ error: csvParserErrors.UNKNOWN_MEMBER, details: firstEntry.name, file: file.name, @@ -123,7 +131,7 @@ const parseDoorLockDataFile = (file) => { doorLockEvents.USER_UNLOCKED : doorLockEvents.USER_LOCKED; const dateTimeString = `${firstEntry.date} ${firstEntry.time}`; - const timestamp = moment.utc(dateTimeString, 'MM/DD/YY HH:mm:ss A').toISOString(); + const timestamp = moment.tz(dateTimeString, 'MM/DD/YY HH:mm:ss A', UI_TIMEZONE).toISOString(); //Verify that member is registered in OfficeRnD system if (memberObject){ @@ -159,7 +167,7 @@ const parseDoorLockDataFile = (file) => { } resolve({ parsedData, - unknownMembers, + unknownMembers: unknownMembersToReport, errors }); });