diff --git a/cronServices/checkBookingChanges.js b/cronServices/checkBookingChanges.js index 00451a3..aeae234 100644 --- a/cronServices/checkBookingChanges.js +++ b/cronServices/checkBookingChanges.js @@ -4,18 +4,26 @@ require('dotenv').config(); const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../services/officeRnD/bookings'); const { chargeBookingChanges } = require('../services/integration/bookingChangeCharges'); +const { bulkWriteChanges } = require('../services/integration/bookingChangeLog'); const checkBookingChanges = () => { fetchAllBookings() .then((reservations) => { bulkWriteReservationsWithChangesTracking(reservations) .then((changes) => { - chargeBookingChanges(changes) + bulkWriteChanges(changes) .then(() => { - process.exit(); + chargeBookingChanges(changes) + .then(() => { + process.exit(); + }) + .catch((error) => { + console.log('Error creating charges ', error); + process.exit(); + }); }) .catch((error) => { - console.log('Error creating charges ', error); + console.log('Error bulk write booking reservation change log :', error); process.exit(); }); }) diff --git a/migrations/20190711071404-add-booking-reservation-change-logs-table.js b/migrations/20190711071404-add-booking-reservation-change-logs-table.js new file mode 100644 index 0000000..b64e9a3 --- /dev/null +++ b/migrations/20190711071404-add-booking-reservation-change-logs-table.js @@ -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'); + } +}; diff --git a/models/bookingReservationChangeLog.js b/models/bookingReservationChangeLog.js new file mode 100644 index 0000000..b26866e --- /dev/null +++ b/models/bookingReservationChangeLog.js @@ -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; +}; diff --git a/services/integration/bookingChangeCharges.js b/services/integration/bookingChangeCharges.js index 06a9f8c..4b208e0 100644 --- a/services/integration/bookingChangeCharges.js +++ b/services/integration/bookingChangeCharges.js @@ -24,7 +24,6 @@ const chargeBookingChanges = (changes) => { return new Promise((resolve, reject) => { if (Array.isArray(changes)){ const incidents = []; - const errors = []; changes.forEach((change) => { const { oldReservation, newReservation } = change; if (oldReservation && newReservation){ @@ -97,14 +96,10 @@ const chargeBookingChanges = (changes) => { } } }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)); }else{ reject('Input argument is not an array !'); diff --git a/services/integration/bookingChangeLog.js b/services/integration/bookingChangeLog.js new file mode 100644 index 0000000..72dfeeb --- /dev/null +++ b/services/integration/bookingChangeLog.js @@ -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, +}; diff --git a/services/officeRnD/bookings.js b/services/officeRnD/bookings.js index 650b7aa..d6c028c 100644 --- a/services/officeRnD/bookings.js +++ b/services/officeRnD/bookings.js @@ -174,7 +174,7 @@ const bulkWriteReservationsWithChangesTracking = (reservations) => { const changedKeys = instance.changed(); const previous = instance.previous(); - const lookupKeys = ['start', 'end', 'resourceId']; + const lookupKeys = ['start', 'end', 'resourceId', 'canceled']; let realChange = false; lookupKeys.forEach((key) => { @@ -193,25 +193,41 @@ const bulkWriteReservationsWithChangesTracking = (reservations) => { }); reservations.forEach((reservation) => { - asyncJobs.push( - db.bookingReservation.update(reservation, { - where: { - reservationId: reservation.reservationId, - }, - returning: true, - individualHooks: true, - }) - .then(([updateCount, updatedInstances]) => { - if (updateCount === 0){ - db.bookingReservation.upsert(reservation); - } + const asyncReservationUpdate = () => { + return new Promise((resolve, reject) => { + db.bookingReservation.update(reservation, { + where: { + reservationId: reservation.reservationId, + }, + returning: true, + individualHooks: true, }) - .catch((error) => { - console.log('Error updating'); - console.log(error); - reject(error); - }) - ); + .then(([updateCount, updatedInstances]) => { + if (updateCount === 0){ + const oldReservation = { + 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)