diff --git a/client/src/components/GenerateFeesInORDButton/index.js b/client/src/components/GenerateFeesInORDButton/index.js index 43e6d0f..ab645c6 100644 --- a/client/src/components/GenerateFeesInORDButton/index.js +++ b/client/src/components/GenerateFeesInORDButton/index.js @@ -1,8 +1,10 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { Button, Modal } from 'semantic-ui-react'; +import moment from 'moment'; import { addFeesToOrd } from '../../store/actions'; +import { defaultDateFormat } from '../../constants/constants'; class GenerateFeesInORDButton extends Component { state = { open: false }; @@ -21,7 +23,25 @@ class GenerateFeesInORDButton extends Component { render() { const { open, size } = this.state; - const { singleMember, disabled } = this.props; + const { singleMember, disabled, dateRange } = this.props; + + let submitIsDisabled = disabled; + + if (dateRange && dateRange.startDate) { + const startDateMoment = moment(dateRange.startDate, defaultDateFormat); + const currentMoment = moment(); + + const startMomentMonth = startDateMoment.month(); + const startMomentYear = startDateMoment.year(); + const currentMonth = currentMoment.month(); + const currentYear = currentMoment.year(); + + const monthSelectorIsInPast = (startMomentYear < currentYear) || + (startMomentYear === currentYear && startMomentMonth < currentMonth); + + submitIsDisabled = disabled || !monthSelectorIsInPast; + } + const modalContent = singleMember ? 'This will remove all existing fees in ORD for selected member in selected date range and generate new fees based on shown incident tables. Do you want to continue ?': @@ -29,7 +49,7 @@ class GenerateFeesInORDButton extends Component { return (
- + Add fees to the ORD diff --git a/controllers/integration.js b/controllers/integration.js index d882457..8830a94 100644 --- a/controllers/integration.js +++ b/controllers/integration.js @@ -10,7 +10,7 @@ const { reformatMembershipsName } = require('../services/officeRnD/memberships') const { checkBookingChanges } = require('../services/integration/checkBookingChange'); const { checkIfProcessing } = require('../services/integration/processingStatus'); -const { UI_TIMEZONE } = require('../constants/constants'); +const { UI_TIMEZONE, DEFAULT_DATE_FORMAT } = require('../constants/constants'); const getKnownOfficeResourceMappings = (req, res) => { const dataToFetch = [getMappingsFromDatabase(), fetchOffices(), fetchResources()]; @@ -117,48 +117,61 @@ const addFees = (req, res) => { const dateRange = req.body && req.body.dateRange ? req.body.dateRange : {startDate: null, endDate: null}; const { startDate, endDate } = dateRange; - if (startDate && endDate && Array.isArray(memberIds)){ - checkBookingChanges() - .then(() => { - deleteFeesFromORD(dateRange, memberIds) - .then((invoicedFees) => { - // TODO: Change this to parallel execution - getMembersFeesForDateRange(dateRange, memberIds) - .then(({allFees, memberships}) => { - addFeesToORD(allFees, invoicedFees) - .then((numberOfInsertedFees) => { - reformatMembershipsName(memberships) - .then(() => { - res.send({ - status: 'ok', - numberOfInsertedFees - }); - }) - .catch((error) => { - console.log('Error reformatting memberships name'); - console.log(error); - res.status(500).send(error); - }) - }) - .catch((error) => { - console.log('Error adding fees'); - res.status(500).send(error); - }) - }) - .catch((error) => { - console.log(error); - res.status(500).send(error); - }) - }) - .catch((error) => { - console.log(error); - res.status(500).send(error); - }); - }) - .catch((error) => { - console.log('Error with updating booking reservations'); - res.status(500).send(error); - }) + const startDateMoment = moment.tz(dateRange.startDate, DEFAULT_DATE_FORMAT, UI_TIMEZONE); + + if (startDate && endDate && startDateMoment.isValid() && Array.isArray(memberIds)){ + const currentMoment = moment.tz(UI_TIMEZONE); + const startMomentMonth = startDateMoment.month(); + const startMomentYear = startDateMoment.year(); + const currentMonth = currentMoment.month(); + const currentYear = currentMoment.year(); + + if ((startMomentYear < currentYear) || (startMomentYear === currentYear && startMomentMonth < currentMonth)) { + checkBookingChanges() + .then(() => { + deleteFeesFromORD(dateRange, memberIds) + .then((invoicedFees) => { + // TODO: Change this to parallel execution + getMembersFeesForDateRange(dateRange, memberIds) + .then(({allFees, memberships}) => { + addFeesToORD(allFees, invoicedFees) + .then((numberOfInsertedFees) => { + reformatMembershipsName(memberships) + .then(() => { + res.send({ + status: 'ok', + numberOfInsertedFees + }); + }) + .catch((error) => { + console.log('Error reformatting memberships name'); + console.log(error); + res.status(500).send(error); + }) + }) + .catch((error) => { + console.log('Error adding fees'); + res.status(500).send(error); + }) + }) + .catch((error) => { + console.log(error); + res.status(500).send(error); + }) + }) + .catch((error) => { + console.log(error); + res.status(500).send(error); + }); + }) + .catch((error) => { + console.log('Error with updating booking reservations'); + res.status(500).send(error); + }) + }else{ + console.log('Selected month/year pair is current month or in the future'); + res.status(400).send('Selected month/year pair is current month or in the future'); + } }else{ console.log('Date range is missing to send fees to ORD'); res.status(400).send('Date range is missing');