fix parsing reports, change tables to use timestamps

This commit is contained in:
Bilal Catic
2019-06-03 09:22:23 +02:00
parent cae217739a
commit c5408c1295
6 changed files with 87 additions and 32 deletions

View File

@@ -3,6 +3,7 @@
const db = require('../models/index');
const fs = require('fs');
const csv = require('csv-parser');
const moment = require('moment');
const {
USER_ENTRY_EVENT,
@@ -32,17 +33,28 @@ const parseDoorLockDataFile = (file) => {
mapValues: ({ header, index, value }) => value.trim()
}))
.on('headers', (headers) => {
headers.forEach((header) => {
if (!VALID_CSV_HEADERS.includes(header.trim())){
isValidFile = false;
console.log('INVALID HEADER');
errors.push({
error: csvParserErrors.UNKNOWN_COLUMN,
details: header,
file: file.name,
});
const sortedValidHeadersArray = VALID_CSV_HEADERS.concat().sort();
const sortedParsedHeadersArray = headers.map(header => header.trim()).sort();
let validHeaders = true;
if (sortedParsedHeadersArray.length !== sortedValidHeadersArray.length) {
validHeaders = false;
}else {
for (let i = 0; i < sortedValidHeadersArray.length; i++){
validHeaders = validHeaders
&& (sortedValidHeadersArray[i] === sortedParsedHeadersArray[i]);
}
});
}
if (!validHeaders){
isValidFile = false;
errors.push({
error: csvParserErrors.INVALID_HEADERS,
details: `Expected headers : ${JSON.stringify(VALID_CSV_HEADERS)}`,
file: file.name,
});
}
})
.on('data', (data) => {
if (!isValidFile) {
@@ -59,14 +71,29 @@ const parseDoorLockDataFile = (file) => {
let i = 0;
while (i < results.length){
//Verify pair
//First entry should be user entry and second should be enable / disable passage
//First entry type should be user entry and second should be enable / disable passage
const firstEntry = results[i];
const secondEntry = results[i+1];
if (firstEntry && (firstEntry.event === USER_ENTRY_EVENT)){
const memberObject = findMember(firstEntry.name);
if (!memberObject){
//Check if member is already labeled as unknown
const unknownMember = unknownMembers.find((member) => member.details === firstEntry.name);
if (!unknownMember){
unknownMembers.push({
error: csvParserErrors.UNKNOWN_MEMBER,
details: firstEntry.name,
file: file.name,
});
}
}
if (secondEntry && (secondEntry.event === ENABLE_PASSAGE_MODE || secondEntry.event === DISABLE_PASSAGE_MODE)){
const event = (secondEntry.event === ENABLE_PASSAGE_MODE) ? USER_UNLOCKED_DOOR : USER_LOCKED_DOOR;
const memberObject = findMember(firstEntry.name);
const dateTimeString = `${firstEntry.date} ${firstEntry.time}`;
const timestamp = moment.utc(dateTimeString, 'MM/DD/YY HH:mm:ss A').toISOString();
//Verify that member is registered in OfficeRnD system
if (memberObject){
@@ -74,28 +101,17 @@ const parseDoorLockDataFile = (file) => {
memberName: firstEntry.name,
memberNumber: firstEntry['user no'],
memberId: memberObject.memberId,
date: firstEntry.date,
time: firstEntry.time,
timestamp,
event,
};
parsedData.push(entryData);
} else {
//Check if member is already labeled as unknown
const unknownMember = unknownMembers.find((member) => member.details === firstEntry.name);
if (!unknownMember){
unknownMembers.push({
error: csvParserErrors.UNKNOWN_MEMBER,
details: firstEntry.name,
file: file.name,
});
}
}
i+=2;
} else {
errors.push({
error: csvParserErrors.INVALID_ENTRY_EXPECTED_PASSAGE_MODE,
details: secondEntry || 'Last row in file',
details: firstEntry,
file: file.name,
});
i+=1;