Fix deleted booking problem / Compare only first 22 ( configurable ) letters of a name with dlock user
This commit is contained in:
@@ -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 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 = {
|
module.exports = {
|
||||||
VALID_CSV_HEADERS,
|
VALID_CSV_HEADERS,
|
||||||
USER_ENTRY_EVENT,
|
USER_ENTRY_EVENT,
|
||||||
@@ -162,4 +164,5 @@ module.exports = {
|
|||||||
UNPAID_FEE_STATUS,
|
UNPAID_FEE_STATUS,
|
||||||
CUSTOM_FEES_PREFIXES,
|
CUSTOM_FEES_PREFIXES,
|
||||||
ALLOW_SENDING_FEES,
|
ALLOW_SENDING_FEES,
|
||||||
|
TRIM_DLOCK_NAMES_LENGTH
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
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
|
#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_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)
|
DB_POOL_ACQUIRE=The maximum time, in milliseconds, that pool will try to get connection before throwing error (ex. 120000)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ const {
|
|||||||
VALID_CSV_HEADERS,
|
VALID_CSV_HEADERS,
|
||||||
doorLockEvents,
|
doorLockEvents,
|
||||||
csvParserErrors,
|
csvParserErrors,
|
||||||
|
TRIM_DLOCK_NAMES_LENGTH
|
||||||
} = require('../../constants/constants');
|
} = require('../../constants/constants');
|
||||||
|
|
||||||
const { fetchAllMembers } = require('../officeRnD/members');
|
const { fetchAllMembers } = require('../officeRnD/members');
|
||||||
@@ -53,7 +54,12 @@ const parseDoorLockDataFile = (file) => {
|
|||||||
const membersMap = {};
|
const membersMap = {};
|
||||||
const unknownMembersMap = {};
|
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 mappingFromFileName = extractMappingFromFileName(file.name);
|
||||||
const mappingObject = checkIfMappingExsists(mappingFromFileName, mappings);
|
const mappingObject = checkIfMappingExsists(mappingFromFileName, mappings);
|
||||||
@@ -110,18 +116,20 @@ const parseDoorLockDataFile = (file) => {
|
|||||||
const firstEntry = results[i];
|
const firstEntry = results[i];
|
||||||
const secondEntry = results[i+1];
|
const secondEntry = results[i+1];
|
||||||
|
|
||||||
if (firstEntry && (firstEntry.event === USER_ENTRY_EVENT)){
|
const trimmedName = firstEntry && firstEntry.name ? firstEntry.name.substring(0, TRIM_DLOCK_NAMES_LENGTH) || undefined : undefined;
|
||||||
const memberObject = membersMap[firstEntry.name];
|
|
||||||
|
if (firstEntry && trimmedName && (firstEntry.event === USER_ENTRY_EVENT)){
|
||||||
|
const memberObject = membersMap[trimmedName];
|
||||||
|
|
||||||
if (!memberObject){
|
if (!memberObject){
|
||||||
//Check if member is already labeled as unknown
|
//Check if member is already labeled as unknown
|
||||||
const unknownMember = unknownMembersMap[firstEntry.name];
|
const unknownMember = unknownMembersMap[trimmedName];
|
||||||
|
|
||||||
if (!unknownMember){
|
if (!unknownMember){
|
||||||
unknownMembersMap[firstEntry.name] = firstEntry.name;
|
unknownMembersMap[trimmedName] = trimmedName;
|
||||||
unknownMembersToReport.push({
|
unknownMembersToReport.push({
|
||||||
error: csvParserErrors.UNKNOWN_MEMBER,
|
error: csvParserErrors.UNKNOWN_MEMBER,
|
||||||
details: firstEntry.name,
|
details: trimmedName,
|
||||||
file: file.name,
|
file: file.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -137,7 +145,7 @@ const parseDoorLockDataFile = (file) => {
|
|||||||
//Verify that member is registered in OfficeRnD system
|
//Verify that member is registered in OfficeRnD system
|
||||||
if (memberObject){
|
if (memberObject){
|
||||||
const entryData = {
|
const entryData = {
|
||||||
memberName: firstEntry.name,
|
memberName: trimmedName,
|
||||||
memberNumber: firstEntry['user no'],
|
memberNumber: firstEntry['user no'],
|
||||||
memberId: memberObject.memberId,
|
memberId: memberObject.memberId,
|
||||||
timestamp,
|
timestamp,
|
||||||
|
|||||||
@@ -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 = {
|
module.exports = {
|
||||||
getActiveBookingsForMembersInDateRange,
|
getActiveBookingsForMembersInDateRange,
|
||||||
getAllBookingsForMembersInDateRange,
|
getAllBookingsForMembersInDateRange,
|
||||||
|
deleteBookingsRemovedFromORD
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../officeRnD/bookings');
|
const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../officeRnD/bookings');
|
||||||
const { fetchResources } = require('../officeRnD/resources');
|
const { fetchResources } = require('../officeRnD/resources');
|
||||||
const { fetchRates } = require('../officeRnD/rates');
|
const { fetchRates } = require('../officeRnD/rates');
|
||||||
|
const { deleteBookingsRemovedFromORD } = require('./bookings');
|
||||||
const { officeRnDAPIErrors } = require('../../constants/constants');
|
const { officeRnDAPIErrors } = require('../../constants/constants');
|
||||||
const {
|
const {
|
||||||
getIncidentsFromChanges,
|
getIncidentsFromChanges,
|
||||||
@@ -34,8 +35,17 @@ const checkBookingChanges = () => {
|
|||||||
resourcesMap[resourceId] = resource;
|
resourcesMap[resourceId] = resource;
|
||||||
});
|
});
|
||||||
|
|
||||||
bulkWriteReservationsWithChangesTracking(reservations, resourcesMap)
|
const reservationsInORD = [];
|
||||||
.then((changes) => {
|
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)
|
bulkWriteChanges(changes)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
getIncidentsFromChanges(changes)
|
getIncidentsFromChanges(changes)
|
||||||
|
|||||||
Reference in New Issue
Block a user