Fix problems with door unlock charges
This commit is contained in:
@@ -183,57 +183,186 @@ const writeDoorLockEvent = (entry) => {
|
||||
return db.doorLockEvent.findOrCreate({where: {...entry}, defaults: {...entry}});
|
||||
};
|
||||
|
||||
const getUnlockEntryForReservation = (reservation) => {
|
||||
const { start, end, memberId, resourceId } = reservation;
|
||||
const getUnlockEntryForReservation = (reservation, previousReservation) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { memberId, resourceId } = reservation;
|
||||
|
||||
const attributes = ['memberName', 'event', 'timestamp'];
|
||||
const earliestUnlock = parseInt(process.env.EARLIEST_UNLOCK) || 0;
|
||||
const fromTimestamp = moment(start).subtract(earliestUnlock).toISOString();
|
||||
const toTimestamp = end;
|
||||
const attributes = ['memberName', 'event', 'timestamp', 'resourceId'];
|
||||
|
||||
const filters = {
|
||||
memberId,
|
||||
timestamp: {
|
||||
[Op.and]: [
|
||||
{[Op.gt]: fromTimestamp},
|
||||
{[Op.lte]: toTimestamp}
|
||||
]
|
||||
},
|
||||
event: doorLockEvents.USER_UNLOCKED,
|
||||
resourceId,
|
||||
};
|
||||
const fromTimestamp = previousReservation && previousReservation.end ?
|
||||
previousReservation.end : moment.utc(reservation.start).tz(UI_TIMEZONE).startOf('Day').toISOString();
|
||||
const toTimestamp = reservation.end;
|
||||
|
||||
return db.doorLockEvent.findOne({
|
||||
attributes,
|
||||
where: filters,
|
||||
})
|
||||
const filters = {
|
||||
memberId,
|
||||
timestamp: {
|
||||
[Op.and]: [
|
||||
{[Op.gt]: fromTimestamp},
|
||||
{[Op.lte]: toTimestamp}
|
||||
]
|
||||
},
|
||||
resourceId,
|
||||
};
|
||||
|
||||
const order = [['timestamp', 'DESC']];
|
||||
|
||||
db.doorLockEvent.findAll({
|
||||
attributes,
|
||||
where: filters,
|
||||
order,
|
||||
})
|
||||
.then((entries) => {
|
||||
let candidateUnlockEntry = null;
|
||||
let pairedLockEntry = null;
|
||||
let eventFound = false;
|
||||
|
||||
// console.log('\r\n=?== SEARCH UNLOCK ==');
|
||||
// console.log('ReservatioN : ', reservation.start);
|
||||
|
||||
const entriesBeforeReservationStart = entries.filter((entry) => moment.utc(entry.timestamp).isBefore(reservation.start));
|
||||
|
||||
// console.log('After end : ');
|
||||
/*console.log(entriesBeforeReservationStart.map(e => {
|
||||
return {
|
||||
timestamp: e.timestamp,
|
||||
event: e.event,
|
||||
}
|
||||
}));
|
||||
|
||||
*/
|
||||
|
||||
entriesBeforeReservationStart.forEach((entry) => {
|
||||
if (!eventFound) {
|
||||
if (entry.event === doorLockEvents.USER_UNLOCKED) {
|
||||
if (pairedLockEntry) {
|
||||
pairedLockEntry = null;
|
||||
candidateUnlockEntry = null;
|
||||
} else {
|
||||
candidateUnlockEntry = entry;
|
||||
eventFound = true;
|
||||
}
|
||||
}
|
||||
if (entry.event === doorLockEvents.USER_LOCKED){
|
||||
pairedLockEntry = entry;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (eventFound){
|
||||
// console.log('FOUND : ', candidateUnlockEntry.timestamp, candidateUnlockEntry.event);
|
||||
resolve(candidateUnlockEntry);
|
||||
} else {
|
||||
// console.log('NOT FOUND IN FIRST ROUND');
|
||||
candidateUnlockEntry = null;
|
||||
const numberOfEntriesLeft = entries.length - entriesBeforeReservationStart.length;
|
||||
const entriesAfterReservationStart = entries.slice(0, numberOfEntriesLeft);
|
||||
|
||||
// console.log('Entries in reservation time : ');
|
||||
/*console.log(entriesAfterReservationStart.map(e => {
|
||||
return {
|
||||
timestamp: e.timestamp,
|
||||
event: e.event,
|
||||
}
|
||||
}));
|
||||
|
||||
*/
|
||||
|
||||
entriesAfterReservationStart.forEach((entry) => {
|
||||
if (!eventFound) {
|
||||
if (entry.event === doorLockEvents.USER_UNLOCKED) {
|
||||
//console.log('FOUND : ', entry.timestamp, entry.event);
|
||||
eventFound = true;
|
||||
candidateUnlockEntry = entry;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//console.log('===??==');
|
||||
resolve(candidateUnlockEntry);
|
||||
}
|
||||
})
|
||||
.catch((error) => reject(error));
|
||||
});
|
||||
};
|
||||
|
||||
const getRelatedDoorLockEntries = (fromTimestamp, toTimestamp, memberId, resourceId) => {
|
||||
const attributes = ['memberName', 'event', 'timestamp'];
|
||||
const getLockEntryForReservation = (reservation, nextReservation) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { memberId, resourceId } = reservation;
|
||||
|
||||
const filters = {
|
||||
memberId,
|
||||
timestamp: {
|
||||
[Op.and]: [
|
||||
{[Op.gt]: fromTimestamp},
|
||||
{[Op.lte]: toTimestamp}
|
||||
const attributes = ['memberName', 'event', 'timestamp'];
|
||||
|
||||
const fromTimestamp = reservation.start;
|
||||
const toTimestamp = nextReservation && nextReservation.start ?
|
||||
nextReservation.start : moment.utc(reservation.start).tz(UI_TIMEZONE).endOf('Day').toISOString();
|
||||
|
||||
const filters = {
|
||||
memberId,
|
||||
timestamp: {
|
||||
[Op.and]: [
|
||||
{[Op.gt]: fromTimestamp},
|
||||
{[Op.lte]: toTimestamp}
|
||||
]
|
||||
},
|
||||
event: doorLockEvents.USER_LOCKED,
|
||||
resourceId,
|
||||
};
|
||||
},
|
||||
resourceId,
|
||||
};
|
||||
|
||||
return db.doorLockEvent.findOne({
|
||||
attributes,
|
||||
where: filters
|
||||
})
|
||||
const order = [['timestamp', 'ASC']];
|
||||
|
||||
db.doorLockEvent.findAll({
|
||||
attributes,
|
||||
where: filters,
|
||||
order,
|
||||
})
|
||||
.then((entries) => {
|
||||
let candidateLockEntry = null;
|
||||
let pairedUnlockEntry = null;
|
||||
let eventFound = false;
|
||||
|
||||
const entriesAfterReservationEnd = entries.filter((entry) => moment.utc(entry.timestamp).isAfter(reservation.end));
|
||||
|
||||
entriesAfterReservationEnd.forEach((entry) => {
|
||||
if (!eventFound) {
|
||||
if (entry.event === doorLockEvents.USER_LOCKED) {
|
||||
if (pairedUnlockEntry) {
|
||||
pairedUnlockEntry = null;
|
||||
candidateLockEntry = null;
|
||||
} else {
|
||||
candidateLockEntry = entry;
|
||||
eventFound = true;
|
||||
}
|
||||
}
|
||||
if (entry.event === doorLockEvents.USER_UNLOCKED){
|
||||
pairedUnlockEntry = entry;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (eventFound){
|
||||
resolve(candidateLockEntry);
|
||||
} else {
|
||||
candidateLockEntry = null;
|
||||
const numberOfEntriesLeft = entries.length - entriesAfterReservationEnd.length;
|
||||
const entriesBeforeReservationEnd = entries.slice(0, numberOfEntriesLeft);
|
||||
|
||||
entriesBeforeReservationEnd.reverse().forEach((entry) => {
|
||||
if (!eventFound) {
|
||||
if (entry.event === doorLockEvents.USER_LOCKED) {
|
||||
eventFound = true;
|
||||
candidateLockEntry = entry;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
resolve(candidateLockEntry);
|
||||
}
|
||||
})
|
||||
.catch((error) => reject(error));
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
parseDoorLockDataFile,
|
||||
writeDoorLockEvent,
|
||||
getRelatedDoorLockEntries,
|
||||
getUnlockEntryForReservation,
|
||||
getLockEntryForReservation,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user