'use strict'; const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../officeRnD/bookings'); const { fetchResources } = require('../officeRnD/resources'); const { fetchRates } = require('../officeRnD/rates'); const { deleteBookingsRemovedFromORD } = require('./bookings'); const { officeRnDAPIErrors } = require('../../constants/constants'); const { getIncidentsFromChanges, bulkWriteBookingChangeIncidents, getReservationsIncidentsForRemoval, deleteBookingChangeIncidents, } = require('./bookingChangeCharges'); const { bulkWriteChanges } = require('./bookingChangeLog'); const checkBookingChanges = () => { return new Promise((resolve, reject) => { const asyncFetchActions = [fetchAllBookings(), fetchResources(), fetchRates()]; Promise.all(asyncFetchActions) .then((asyncData) => { const reservations = asyncData[0]; const resources = asyncData[1]; const rates = asyncData[2]; const ratesMap = {}; rates.forEach(rate => { const { rateId, price, weekendPrice } = rate; ratesMap[rateId] = { price, weekendPrice }; }); const resourcesMap = {}; resources.forEach(resource => { const { resourceId, rate } = resource; resource.price = ratesMap[rate] || {price: 0, weekendPrice: 0}; resourcesMap[resourceId] = resource; }); const reservationsInORD = []; 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]; // console.log(changes); bulkWriteChanges(changes) .then(() => { getIncidentsFromChanges(changes) .then(({incidents, reservationsForAdditionalCheck}) => { // console.log('=====INCIDENTS====='); // console.log(incidents); bulkWriteBookingChangeIncidents(incidents) .then(() => { getReservationsIncidentsForRemoval(reservationsForAdditionalCheck) .then((incidentsToRemove) => { deleteBookingChangeIncidents(incidentsToRemove) .then(() => resolve(true)) .catch((error) => { console.log('Error deleting incidents : ', error); reject(error); }); }) .catch((error) => { console.log('Failed to fetch reservations possible incidents for removal', error); reject(error); }); }) .catch((error) => { console.log('error', error); reject(error); }); }) .catch((error) => { console.log('Error creating charges ', error); reject(error); }); }) .catch((error) => { console.log('Error bulk write booking reservation change log :', error); reject(error); }); }) .catch((error) => { console.log('Error bulk write booking reservations :', error); reject(error); }); }) .catch((error) => { console.log('\t> [Check Booking Changes] Error fetching bookings, resources and rates from ORD ', error); reject(officeRnDAPIErrors.FAILED_TO_FETCH_DATA); }); }); }; module.exports = { checkBookingChanges };