implement booking reservation change log

This commit is contained in:
Bilal Catic
2019-07-15 01:24:18 +02:00
parent 8a0e198690
commit e150ebc7e8
6 changed files with 150 additions and 28 deletions

View File

@@ -4,18 +4,26 @@ require('dotenv').config();
const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../services/officeRnD/bookings'); const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../services/officeRnD/bookings');
const { chargeBookingChanges } = require('../services/integration/bookingChangeCharges'); const { chargeBookingChanges } = require('../services/integration/bookingChangeCharges');
const { bulkWriteChanges } = require('../services/integration/bookingChangeLog');
const checkBookingChanges = () => { const checkBookingChanges = () => {
fetchAllBookings() fetchAllBookings()
.then((reservations) => { .then((reservations) => {
bulkWriteReservationsWithChangesTracking(reservations) bulkWriteReservationsWithChangesTracking(reservations)
.then((changes) => { .then((changes) => {
chargeBookingChanges(changes) bulkWriteChanges(changes)
.then(() => { .then(() => {
process.exit(); chargeBookingChanges(changes)
.then(() => {
process.exit();
})
.catch((error) => {
console.log('Error creating charges ', error);
process.exit();
});
}) })
.catch((error) => { .catch((error) => {
console.log('Error creating charges ', error); console.log('Error bulk write booking reservation change log :', error);
process.exit(); process.exit();
}); });
}) })

View File

@@ -0,0 +1,35 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('bookingReservationChangeLogs', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
reservationId: Sequelize.TEXT,
memberId: Sequelize.TEXT,
officeId: Sequelize.TEXT,
oldResourceId: Sequelize.TEXT,
newResourceId: Sequelize.TEXT,
oldStart: Sequelize.DATE,
oldEnd: Sequelize.DATE,
newStart: Sequelize.DATE,
newEnd: Sequelize.DATE,
canceled: Sequelize.BOOLEAN,
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('bookingReservationChangeLogs');
}
};

View File

@@ -0,0 +1,20 @@
'use strict';
module.exports = (sequelize, DataTypes) => {
const bookingReservationChangeLog = sequelize.define('bookingReservationChangeLog', {
reservationId: DataTypes.TEXT,
memberId: DataTypes.TEXT,
officeId: DataTypes.TEXT,
oldResourceId: DataTypes.TEXT,
newResourceId: DataTypes.TEXT,
oldStart: DataTypes.DATE,
oldEnd: DataTypes.DATE,
newStart: DataTypes.DATE,
newEnd: DataTypes.DATE,
canceled: DataTypes.BOOLEAN,
}, {});
bookingReservationChangeLog.associate = function(models) {
// associations can be defined here
};
return bookingReservationChangeLog;
};

View File

@@ -24,7 +24,6 @@ const chargeBookingChanges = (changes) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (Array.isArray(changes)){ if (Array.isArray(changes)){
const incidents = []; const incidents = [];
const errors = [];
changes.forEach((change) => { changes.forEach((change) => {
const { oldReservation, newReservation } = change; const { oldReservation, newReservation } = change;
if (oldReservation && newReservation){ if (oldReservation && newReservation){
@@ -97,14 +96,10 @@ const chargeBookingChanges = (changes) => {
} }
} }
}else{ }else{
errors.push(change); // New reservation or canceled, not an incident
} }
} }
}); });
if (errors.length > 0){
console.log('There were some errors with incomplete bookings : ');
console.log(errors);
}
resolve(bulkWriteBookingChangeIncidents(incidents)); resolve(bulkWriteBookingChangeIncidents(incidents));
}else{ }else{
reject('Input argument is not an array !'); reject('Input argument is not an array !');

View File

@@ -0,0 +1,48 @@
'use strict';
const db = require('../../models/index');
const bulkWriteChanges = ((changes) => {
const changeLogsForDB = [];
changes.forEach((change) => {
const { oldReservation, newReservation } = change;
const { reservationId, memberId, officeId, resourceId, start, end, canceled } = newReservation;
const logEntry = {
reservationId: oldReservation.reservationId || reservationId,
memberId: oldReservation.memberId || memberId,
officeId: oldReservation.officeId || officeId,
oldResourceId: oldReservation.resourceId || resourceId,
newResourceId: resourceId,
oldStart: oldReservation.start || start,
newStart: start,
oldEnd: oldReservation.end || end,
newEnd: end,
canceled,
};
if (!oldReservation.start && !oldReservation.end && !oldReservation.resourceId){
// new reservation
logEntry.oldResourceId = null;
logEntry.oldStart = null;
logEntry.oldEnd = null;
}
if (newReservation.canceled){
logEntry.newResourceId = null;
logEntry.newStart = null;
logEntry.newEnd = null;
}
changeLogsForDB.push(logEntry);
});
return db.bookingReservationChangeLog.bulkCreate(changeLogsForDB);
// console.log(changeLogsForDB);
// return new Promise((resolve) => resolve());
});
module.exports = {
bulkWriteChanges,
};

View File

@@ -174,7 +174,7 @@ const bulkWriteReservationsWithChangesTracking = (reservations) => {
const changedKeys = instance.changed(); const changedKeys = instance.changed();
const previous = instance.previous(); const previous = instance.previous();
const lookupKeys = ['start', 'end', 'resourceId']; const lookupKeys = ['start', 'end', 'resourceId', 'canceled'];
let realChange = false; let realChange = false;
lookupKeys.forEach((key) => { lookupKeys.forEach((key) => {
@@ -193,25 +193,41 @@ const bulkWriteReservationsWithChangesTracking = (reservations) => {
}); });
reservations.forEach((reservation) => { reservations.forEach((reservation) => {
asyncJobs.push( const asyncReservationUpdate = () => {
db.bookingReservation.update(reservation, { return new Promise((resolve, reject) => {
where: { db.bookingReservation.update(reservation, {
reservationId: reservation.reservationId, where: {
}, reservationId: reservation.reservationId,
returning: true, },
individualHooks: true, returning: true,
}) individualHooks: true,
.then(([updateCount, updatedInstances]) => {
if (updateCount === 0){
db.bookingReservation.upsert(reservation);
}
}) })
.catch((error) => { .then(([updateCount, updatedInstances]) => {
console.log('Error updating'); if (updateCount === 0){
console.log(error); const oldReservation = {
reject(error); start: null,
}) end: null,
); resourceId: null,
};
changes.push({
oldReservation,
newReservation: reservation,
});
resolve(db.bookingReservation.upsert(reservation));
}else{
resolve();
}
})
.catch((error) => {
console.log('Error updating');
console.log(error);
reject(error);
})
});
};
asyncJobs.push(asyncReservationUpdate());
}); });
Promise.all(asyncJobs) Promise.all(asyncJobs)