|
|
|
|
@@ -21,160 +21,6 @@ const getSortedIncidentsForMember = (memberId) => {
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const createUnlockedIncident = (reservation) => {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const { reservationId, memberId, resourceId, start, end } = reservation;
|
|
|
|
|
|
|
|
|
|
getLastIncidentForMember(memberId)
|
|
|
|
|
.then(incidents => {
|
|
|
|
|
const lastIncident = incidents && incidents[0] ? incidents[0] : undefined;
|
|
|
|
|
|
|
|
|
|
const incident = {
|
|
|
|
|
reservationId,
|
|
|
|
|
memberId,
|
|
|
|
|
resourceId,
|
|
|
|
|
bookingStart: start,
|
|
|
|
|
bookingEnd: end,
|
|
|
|
|
incidentLevel: null,
|
|
|
|
|
incidentLevelPrice: null,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
console.log('=> UNLOCKED INCIDENT');
|
|
|
|
|
console.log('\tMember : ', memberId);
|
|
|
|
|
console.log('\tStart : ', start);
|
|
|
|
|
console.log('\tEnd : ', end);
|
|
|
|
|
console.log('\tMore details : ');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
if (lastIncident){
|
|
|
|
|
const lastIncidentLevel = lastIncident.incidentLevel;
|
|
|
|
|
const lastIncidentBeginningOfTheMonth = moment(lastIncident.bookingStart).startOf('month');
|
|
|
|
|
const beginningOfTheMonth = moment.utc().startOf('month');
|
|
|
|
|
|
|
|
|
|
const timePassedFromLastIncident = Math.abs(beginningOfTheMonth.diff(lastIncidentBeginningOfTheMonth, 'months'));
|
|
|
|
|
|
|
|
|
|
if (timePassedFromLastIncident >= 6){
|
|
|
|
|
console.log('\t\t-> This is first incident for this member in last 6 months');
|
|
|
|
|
incident.incidentLevel = unlockedIncidentLevelsPrices.UNLOCKED_0.title;
|
|
|
|
|
incident.incidentLevelPrice = unlockedIncidentLevelsPrices.UNLOCKED_0.price;
|
|
|
|
|
} else {
|
|
|
|
|
console.log('\t\t-> This member had incident(s) in past 6 months !!!');
|
|
|
|
|
incident.incidentLevel = lastIncidentLevel;
|
|
|
|
|
incident.incidentLevelPrice = unlockedIncidentLevelsPrices[lastIncidentLevel].price;
|
|
|
|
|
}
|
|
|
|
|
console.log('\t\tLast incident details : ');
|
|
|
|
|
console.log('\t\tStart : ', lastIncident.bookingStart);
|
|
|
|
|
console.log('\t\tCalculated diff : ', timePassedFromLastIncident);
|
|
|
|
|
console.log('\t\t------------------');
|
|
|
|
|
console.log('\tNew incident level : ', incident.incidentLevel);
|
|
|
|
|
} else {
|
|
|
|
|
console.log('\t\tThis is first incident for this member, EVER !');
|
|
|
|
|
incident.incidentLevel = unlockedIncidentLevelsPrices.UNLOCKED_0.title;
|
|
|
|
|
incident.incidentLevelPrice = unlockedIncidentLevelsPrices.UNLOCKED_0.price;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
db.unlockedIncident.findOrCreate({
|
|
|
|
|
where: {
|
|
|
|
|
reservationId,
|
|
|
|
|
memberId,
|
|
|
|
|
resourceId,
|
|
|
|
|
bookingStart: start,
|
|
|
|
|
bookingEnd: end,
|
|
|
|
|
},
|
|
|
|
|
defaults: {
|
|
|
|
|
...incident
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.then(()=>resolve())
|
|
|
|
|
.catch((error)=>reject(error));
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
reject(error);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const createUnscheduledUseIncident = (reservation, doorLockEntry) => {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const timeResolution = parseInt(process.env.UNSCHEDULED_USE_TIME_RESOLUTION) || 5;
|
|
|
|
|
const chargePrice = parseFloat(process.env.UNSCHEDULED_USE_CHARGE_FEE) || 5;
|
|
|
|
|
|
|
|
|
|
const reservationEndTime = moment(reservation.end);
|
|
|
|
|
const lockedTime = moment(doorLockEntry.timestamp);
|
|
|
|
|
const timeDifference = Math.abs(reservationEndTime.diff(lockedTime, 'minutes'));
|
|
|
|
|
|
|
|
|
|
const timeIntervalsToCharge = Math.floor(timeDifference / timeResolution);
|
|
|
|
|
const totalChargeFee = timeIntervalsToCharge * chargePrice;
|
|
|
|
|
|
|
|
|
|
if (timeIntervalsToCharge > 0){
|
|
|
|
|
const incident = {
|
|
|
|
|
reservationId: reservation.reservationId,
|
|
|
|
|
memberId: reservation.memberId,
|
|
|
|
|
resourceId: reservation.resourceId,
|
|
|
|
|
bookingStart: reservation.start,
|
|
|
|
|
bookingEnd: reservation.end,
|
|
|
|
|
doorLockEventTimestamp: doorLockEntry.timestamp,
|
|
|
|
|
doorLockEventType: doorLockEntry.event,
|
|
|
|
|
chargePrice,
|
|
|
|
|
timeIntervalsToCharge,
|
|
|
|
|
totalChargeFee,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
db.unscheduledIncident.findOrCreate({where: {...incident}, defaults: {...incident}})
|
|
|
|
|
.then(()=>resolve())
|
|
|
|
|
.catch((error)=>reject(error));
|
|
|
|
|
}else{
|
|
|
|
|
resolve();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const createDoorLockIncident = (reservation, doorLockEntry) => {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
if (!doorLockEntry){
|
|
|
|
|
// Check if there is unlock entry for this reservation
|
|
|
|
|
getUnlockEntryForReservation(reservation)
|
|
|
|
|
.then((unlockEntry) => {
|
|
|
|
|
if (!unlockEntry){
|
|
|
|
|
// check if there is back-to-back booking before current one
|
|
|
|
|
getFirstPreviousBooking(reservation)
|
|
|
|
|
.then((previousReservation) => {
|
|
|
|
|
if (previousReservation){
|
|
|
|
|
const previousReservationEnd = moment(previousReservation.end);
|
|
|
|
|
const currentReservationStart = moment(reservation.start);
|
|
|
|
|
const timeDifference = Math.abs(currentReservationStart.diff(previousReservationEnd, 'minutes'));
|
|
|
|
|
|
|
|
|
|
const maxBackToBackDifference = parseInt(process.env.MAX_BACK_TO_BACK_DIFFERENCE) || 0;
|
|
|
|
|
if (timeDifference <= maxBackToBackDifference) {
|
|
|
|
|
createUnlockedIncident(reservation)
|
|
|
|
|
.then(() => resolve())
|
|
|
|
|
.catch((error) => reject(error));
|
|
|
|
|
}else{
|
|
|
|
|
resolve();
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
resolve();
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((error)=>reject(error));
|
|
|
|
|
}else {
|
|
|
|
|
createUnlockedIncident(reservation)
|
|
|
|
|
.then(()=>resolve())
|
|
|
|
|
.catch((error)=>reject(error));
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
reject(error);
|
|
|
|
|
});
|
|
|
|
|
}else{
|
|
|
|
|
createUnscheduledUseIncident(reservation, doorLockEntry)
|
|
|
|
|
.then(()=>resolve())
|
|
|
|
|
.catch((error) => reject(error));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const insertUnscheduledIncidents = (incidents) => {
|
|
|
|
|
const asyncJobs = [];
|
|
|
|
|
incidents.forEach((incident) => {
|
|
|
|
|
@@ -333,8 +179,8 @@ const getIncidentData = (reservation) => {
|
|
|
|
|
if (nextReservation){
|
|
|
|
|
// Check if next reservations is immediately after (back to back reservation)
|
|
|
|
|
// If yes, then there is no need to check door lock entries related to this booking
|
|
|
|
|
const firstReservationEnd = moment(reservation.end);
|
|
|
|
|
const secondReservationStart = moment(nextReservation.start);
|
|
|
|
|
const firstReservationEnd = moment.utc(reservation.end);
|
|
|
|
|
const secondReservationStart = moment.utc(nextReservation.start);
|
|
|
|
|
const timeDifference = Math.abs(secondReservationStart.diff(firstReservationEnd, 'minutes'));
|
|
|
|
|
|
|
|
|
|
const maxBackToBackDifference = parseInt(process.env.MAX_BACK_TO_BACK_DIFFERENCE) || 0;
|
|
|
|
|
@@ -355,8 +201,8 @@ const getIncidentData = (reservation) => {
|
|
|
|
|
const timeResolution = parseInt(process.env.UNSCHEDULED_USE_TIME_RESOLUTION) || 5
|
|
|
|
|
const chargePrice = parseFloat(process.env.UNSCHEDULED_USE_CHARGE_FEE) || 5;
|
|
|
|
|
|
|
|
|
|
const reservationEndTime = moment(reservation.end);
|
|
|
|
|
const lockedTime = moment(lockEntry.timestamp);
|
|
|
|
|
const reservationEndTime = moment.utc(reservation.end);
|
|
|
|
|
const lockedTime = moment.utc(lockEntry.timestamp);
|
|
|
|
|
const timeDifference = Math.abs(reservationEndTime.diff(lockedTime, 'minutes'));
|
|
|
|
|
|
|
|
|
|
const timeIntervalsToCharge = Math.floor(timeDifference / timeResolution);
|
|
|
|
|
@@ -391,8 +237,8 @@ const getIncidentData = (reservation) => {
|
|
|
|
|
getFirstPreviousBooking(reservation)
|
|
|
|
|
.then((previousReservation) => {
|
|
|
|
|
if (previousReservation){
|
|
|
|
|
const previousReservationEnd = moment(previousReservation.end);
|
|
|
|
|
const currentReservationStart = moment(reservation.start);
|
|
|
|
|
const previousReservationEnd = moment.utc(previousReservation.end);
|
|
|
|
|
const currentReservationStart = moment.utc(reservation.start);
|
|
|
|
|
const timeDifference = Math.abs(currentReservationStart.diff(previousReservationEnd, 'minutes'));
|
|
|
|
|
|
|
|
|
|
const maxBackToBackDifference = parseInt(process.env.MAX_BACK_TO_BACK_DIFFERENCE) || 0;
|
|
|
|
|
|