diff --git a/migrations/20180921143257_add_ticket_status.js b/migrations/20180921143257_add_ticket_status.js new file mode 100644 index 000000000..f89412e87 --- /dev/null +++ b/migrations/20180921143257_add_ticket_status.js @@ -0,0 +1,13 @@ +const constants = require('../models/constants'); + +exports.up = function(knex, Promise) { + return Promise.all([ + knex.schema.table(constants.TICKETS_TABLE_NAME, function (table) { + table.string("ticket_status", 128).nullable(); + }) + ]); +}; + +exports.down = function(knex, Promise) { + +}; diff --git a/models/constants.js b/models/constants.js index 52a5cf2b8..ad4e7b072 100644 --- a/models/constants.js +++ b/models/constants.js @@ -207,6 +207,10 @@ module.exports = { USER_GENDERS: get_enum(user_genders), USER_GENDERS_DEFAULT: get_default_enum(user_genders), + TICKET_STATUSES: { + COMPLETED: 'Completed', + ENTERED: 'Entered' + }, /** * User Current Status: * define the position of the profile. in which event user is, diff --git a/routes/api/api_gate_routes.js b/routes/api/api_gate_routes.js index 07a370d92..18903d7d4 100644 --- a/routes/api/api_gate_routes.js +++ b/routes/api/api_gate_routes.js @@ -27,7 +27,8 @@ const ERRORS = { INVALID_VEHICLE_DIRECTION: 'Please enter only in or out as the direction', EVENT_CLOSED: "Event is currently closed", INVALID_ENTRY_TYPE: 'Please enter only correct entry type (regular, early_arrival)', - INCORRECT_FORCE_ENTRY_PASSWORD: 'Incorrect Force Entry password' + INCORRECT_FORCE_ENTRY_PASSWORD: 'Incorrect Force Entry password', + TICKET_INCOMPLETE: 'Ticket is either canceled or in processing' }; function _incorrect_force_entry_password(password) { @@ -178,6 +179,11 @@ router.post('/gate-enter', async function (req, res) { return sendError(res, 500, "ALREADY_INSIDE"); } + if (ticket.attributes.ticket_status !== constants.TICKET_STATUSES.COMPLETED && + ticket.attributes.ticket_status !== constants.TICKET_STATUSES.ENTERED) { + return sendError(res, 500, "TICKET_INCOMPLETE"); + } + if (req.body.force === "true") { let force_pwd = req.body.force_pwd; if (_incorrect_force_entry_password(force_pwd)) { diff --git a/routes/pages/gate_routes.js b/routes/pages/gate_routes.js index 7f00e8828..b7bf54242 100644 --- a/routes/pages/gate_routes.js +++ b/routes/pages/gate_routes.js @@ -5,6 +5,7 @@ const router = express.Router({ const knex = require('../../libs/db').knex; const userRole = require('../../libs/user_role'); const Event = require('../../models/event').Event; +const constants = require('../../models/constants'); router.get('/', userRole.isGateManager(), function (req, res) { Event.forge({event_id: req.user.currentEventId}).fetch().then(event => { @@ -45,6 +46,9 @@ router.get('/ajax/tickets', knex.select('*').from('tickets').leftJoin('users', 'tickets.holder_id', 'users.user_id') .where('event_id', req.user.currentEventId) + .andWhere(function() { + this.where('ticket_status', 'IN', [constants.TICKET_STATUSES.COMPLETED, constants.TICKET_STATUSES.ENTERED]) + }) .andWhere(function () { this.where('ticket_number', isNaN(parseInt(req.query.search))? req.query.search: parseInt(req.query.search)) .orWhere('first_name', 'LIKE', '%' + req.query.search + '%') diff --git a/scripts/drupal_ticket_sync.js b/scripts/drupal_ticket_sync.js index cfc1d6df7..82f94fc63 100644 --- a/scripts/drupal_ticket_sync.js +++ b/scripts/drupal_ticket_sync.js @@ -12,7 +12,6 @@ const constants = require('../models/constants') var User = require('../models/user.js').User; var Ticket = require('../models/ticket.js').Ticket; -const STATUS_COMPLETED = 'Completed'; const EVENT_ID = constants.DEFAULT_EVENT_ID const TICKETS_TYPE_IDS = [...constants.events[constants.DEFAULT_EVENT_ID].bundles] @@ -75,7 +74,7 @@ async function dumpDrupalTickets(session, date, page) { headers: headers, qs: { changed: dateFormat(date, "yyyy-mm-dd hh:MM:ss"), - ticket_state_target_id: 3, + //ticket_state_target_id: 3, page: page } }; @@ -94,9 +93,10 @@ async function dumpDrupalTickets(session, date, page) { for (var ticket of tickets) { var status = ticket['Ticket State']; + var type_id = parseInt(ticket['ticket_registration_bundle']); //log.debug("type", type_id, ticket['user_ticket_type_name'][[0]], status); - if (status === STATUS_COMPLETED && TICKETS_TYPE_IDS.includes(type_id)) { + if (TICKETS_TYPE_IDS.includes(type_id)) { utickets.push({ 'id' : ticket['Docment id'], 'passport_id' : ticket['passport_id'], @@ -109,7 +109,8 @@ async function dumpDrupalTickets(session, date, page) { 'ticket_id' : ticket['Ticket number'], 'ticket_number' : ticket['Ticket number'], 'barcode' : ticket['ticket barcode']['value'], - 'ticket_type' : ticket['user_ticket_type_name'] + 'ticket_type' : ticket['user_ticket_type_name'], + 'ticket_status' : status }); } } @@ -144,7 +145,8 @@ async function updateTicket(ticket) { order_id, ticket_id, barcode, - ticket_type + ticket_type, + ticket_status } = ticket; log.info('Updating ticket', ticket_id, 'user ', holder_email); @@ -194,9 +196,9 @@ async function updateTicket(ticket) { ticket_id: ticket_id, type: ticket_type, disabled_parking: parseInt(ticket.disabled_parking, 10) === 1, - ticket_number: ticket_id // In Drupal, they are the same + ticket_number: ticket_id, // In Drupal, they are the same + ticket_status: ticket_status }); - await sparkTicket.save(null, saveOptions); log.info('Ticket update success for ticket', ticket_id); }