Skip to content

Commit

Permalink
Merge pull request #428 from roy-zahor/gate_system
Browse files Browse the repository at this point in the history
Gate system fixes
  • Loading branch information
LeonFedotov authored May 20, 2017
2 parents 9784b3d + b8393ed commit b1bc5cd
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 63 deletions.
7 changes: 5 additions & 2 deletions locales/en/gate.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@
"gate" : "Gate",
"search": "Search by ticket number / person name / email / id",
"enter_ticket": "Enter ticket",
"force_enter_ticket": "Force enter ticket!",
"force_enter_ticket": "Force entrance",
"exit_ticket": "Exit ticket",
"entrance_instructions" : "Please verify all the details of the ticket against a valid user ID card.",
"inside_event": "Inside event",
"ticket_group": "Ticket group",
"no_exit": "Unavailable after gates are open"
"no_exit": "Unavailable after gates are open",
"force_instructions": "Forced entrance requires permission from the shift manager. Please contact them and write down the reason for the forced entrance",
"reason": "Reason",
"force_reason_placeholder": "10 Characters minimum"
}
5 changes: 4 additions & 1 deletion locales/he/gate.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
"entrance_instructions" : "יש לוודא את פרטי הכרטיס מול תעודה מזהה.",
"inside_event": "באירוע",
"ticket_group": "קבוצת הקצאת כרטיסים",
"no_exit": "לא ניתן לצאת לאחר פתיחת שערי האירוע"
"no_exit": "לא ניתן לצאת לאחר פתיחת שערי האירוע",
"force_instructions": "כניסה בכוח באישור אחמש בלבד. יש ליצור קשר, לקבל אישור, ולתעד את הסיבה לכניסה בכוח.",
"reason": "סיבה",
"force_reason_placeholder": "תארו את הסיבה ב- 10 תווים לפחות"
}

4 changes: 3 additions & 1 deletion migrations/20170427182849_gate_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ exports.up = function (knex, Promise) {
knex.schema.table('events', function (table) {
table.string('name', 128);
table.string('gate_code', 100);
table.string("gate_status", 16);
}),

knex.schema.table('tickets', function (table) {
Expand All @@ -13,7 +14,8 @@ exports.up = function (knex, Promise) {
knex('events').insert({
event_id: "MIDBURN2017",
gate_code: "171819",
name: "Midburn 2017 מידברן"
name: "Midburn 2017 מידברן",
gate_status: "early_arrival"
})
]);
};
Expand Down
12 changes: 1 addition & 11 deletions migrations/20170519184911_missing_trigger.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
var constants = require('../models/constants');

exports.up = function (knex, Promise) {
return Promise.all([
knex.raw('DROP TRIGGER IF EXISTS camp_members_groups_after_ins').then(
Expand All @@ -10,15 +8,7 @@ exports.up = function (knex, Promise) {
"INSERT INTO users_groups_membership (group_id, user_id, status) VALUES (new.camp_id, new.user_id, new.status); " +
"END"
)
),
!knex.schema.hasColumn("events", "gate_status") ?
knex.schema.table("events", table => {
table.enu("gate_status", constants.EVENT_GATE_STATUS);
}).then(
knex.raw("update events set gate_status='early_arrival'")
)
: ''

)
])
};

Expand Down
15 changes: 15 additions & 0 deletions migrations/20170520201917_gate_forced_entrance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
exports.up = function (knex, Promise) {
return Promise.all([

knex.raw("update events set gate_status='early_arrival'"),

knex.schema.table("tickets", table => {
table.boolean("forced_entrance").defaultTo(false);
table.string("forced_entrance_reason", 256);
})
])
};

exports.down = function (knex, Promise) {

};
3 changes: 3 additions & 0 deletions routes/api_gate_routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ router.post('/get-ticket/', async function (req, res) {
// Preparing result.
let result = {
ticket_number: ticket.attributes.ticket_number,
order_id: ticket.attributes.order_id,
holder_name: ticket.relations.holder.fullName,
email: ticket.relations.holder.attributes.email,
disabled_parking: ticket.attributes.disabled_parking,
Expand Down Expand Up @@ -143,6 +144,8 @@ router.post('/gate-enter', async function (req, res) {

if (req.body.force) {
log.warn('Forced ticket entrance', ticket.attributes.ticket_number);
ticket.attributes.forced_entrance = true;
ticket.attributes.forced_entrance_reason = req.body.force_reason;
}
else {
// Finding the right users group and updating it.
Expand Down
12 changes: 9 additions & 3 deletions routes/gate_routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ var express = require('express');
var router = express.Router({
mergeParams: true
});
var knex = require('../libs/db').knex;

var knex = require('../libs/db').knex;
var userRole = require('../libs/user_role');
var security = require('../libs/security');
var Event = require('../models/event').Event;
var constants = require('../models/constants');

router.get('/', userRole.isGateManager(), function (req, res) {
//TODO Temp MIDBURN2017, we need to add a global current-event selector.
Expand All @@ -17,7 +18,7 @@ router.get('/', userRole.isGateManager(), function (req, res) {
});
});

router.get('/ajax/tickets', [security.protectJwt, userRole.isGateManager()], function (req, res) {
router.get('/ajax/tickets', [security.protectJwt, userRole.isGateManager()], async function (req, res) {
if (req.query.search) {
const MINIMUM_LENGTH = 3;

Expand All @@ -26,6 +27,10 @@ router.get('/ajax/tickets', [security.protectJwt, userRole.isGateManager()], fun
return res.status(200).json({rows: [], total: 0})
}

//TODO - Make this function load only the tickets of the current event dynamically, not from constant.
let event = await Event.forge({event_id: constants.CURRENT_EVENT_ID}).fetch();
let gate_status = event.attributes.gate_status;

knex.select('*').from('tickets').leftJoin('users', 'tickets.holder_id', 'users.user_id')
.where('ticket_number', isNaN(parseInt(req.query.search))? req.query.search: parseInt(req.query.search))
.orWhere('first_name', 'LIKE', '%' + req.query.search + '%')
Expand All @@ -39,7 +44,8 @@ router.get('/ajax/tickets', [security.protectJwt, userRole.isGateManager()], fun
res.status(500).json({
error: true,
data: {
message: err.message
message: err.message,
gate_status: gate_status
}
});
});
Expand Down
3 changes: 1 addition & 2 deletions scripts/drupal_ticket_sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ var log = require('../libs/logger')(module);

var User = require('../models/user.js').User;
var Ticket = require('../models/ticket.js').Ticket;
const TICKETS_TYPE_IDS = [39, 40, 41, 43, 44, 45, 46]
// const TICKETS_TYPE_IDS = [38, 39, 40];
const TICKETS_TYPE_IDS = [39, 40, 41, 43, 44, 45, 46];
const STATUS_COMPLETED = 'Completed';

const EVENT_ID = "MIDBURN2017";
Expand Down
99 changes: 56 additions & 43 deletions views/pages/gate.jade
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ block content

#myModal.modal.fade(role='dialog')
.modal-dialog
// Modal content
.modal-content
.modal-header
button.close(type='button', data-dismiss='modal') ×
Expand Down Expand Up @@ -72,6 +71,26 @@ block content
button.btn.btn-danger(type='button', data-dismiss='modal', id='force_entrance_button')
=t('gate:force_enter_ticket')

#forceDialog.modal.fade(role='dialog')
.modal-dialog
.modal-content
form( data-toggle="validator", id="force_form" )
.modal-header
button.close(type='button', data-dismiss='modal') ×
h4.modal-title=t("gate:enter_ticket")
.modal-body
h3=t('gate:entrance_instructions')
.alert.alert-danger
strong=t('gate:force_instructions')
p
strong=t('gate:reason')
| : 
textarea( id="force_reason", rows=3, cols=50, minlength=10, maxlength=150,
required, placeholder="#{t('gate:force_reason_placeholder')}" )
.modal-footer
button.btn.btn-primary(type='submit', id='force_entrance_dialog_button')=t('gate:force_enter_ticket')
button.btn.btn-cancel(type='button', data-dismiss='modal')=t('cancel')

block scripts
script.

Expand Down Expand Up @@ -106,6 +125,12 @@ block scripts

$(document).ready(function () {

$(".search .form-control").focus();

$("#force_form").submit(function (e) {
e.preventDefault();
});

$(document).on("click", ".entranceAction", function () {
$.post("/api/gate/get-ticket", {
barcode: this.id,
Expand Down Expand Up @@ -152,59 +177,47 @@ block scripts
gate_code: "#{gate_code}"
},
function (data, status) {
//if (data.gate_status === "early_arrival") {
$("#modal_mode")[0].innerHTML = "exit";
$("#modal_barcode")[0].innerHTML = data.ticket.barcode;
$("#modal_ticket_number")[0].innerHTML = data.ticket.ticket_number;
$("#modal_name")[0].innerHTML = data.ticket.holder_name;
$("#modal_email")[0].innerHTML = data.ticket.email;
$("#modal_type")[0].innerHTML = data.ticket.type;

var entranceButton = $("#entrance_button")[0];
entranceButton.innerHTML = "#{t('gate:exit_ticket')}";
entranceButton.disabled = false;
$("#ticket_groups_list")[0].innerHTML = "";

$("#force_entrance_button").hide();
//}
//else {
// $('#myModal').modal('hide');
// alert("#{t('gate:no_exit')}");
//}
$("#modal_mode")[0].innerHTML = "exit";
$("#modal_barcode")[0].innerHTML = data.ticket.barcode;
$("#modal_ticket_number")[0].innerHTML = data.ticket.ticket_number;
$("#modal_name")[0].innerHTML = data.ticket.holder_name;
$("#modal_email")[0].innerHTML = data.ticket.email;
$("#modal_type")[0].innerHTML = data.ticket.type;

var entranceButton = $("#entrance_button")[0];
entranceButton.innerHTML = "#{t('gate:exit_ticket')}";
entranceButton.disabled = false;
$("#ticket_groups_list")[0].innerHTML = "";

$("#force_entrance_button").hide();
});
});

$(document).on("click", "#force_entrance_button", function () {
if(prompt("נא לכתוב בכוח ^_^", "בלי כוח") == "בכוח") {
let parameters = {
barcode: $("#modal_barcode")[0].innerHTML,
gate_code: "#{gate_code}",
group_id: $("#modal_group_id")[0].innerHTML.substring(2),
force: true
};

let mode = $("#modal_mode")[0].innerHTML;
$.post("/api/gate/gate-" + mode, parameters)
.done(function (data, status) {
if (status === "success") {
$("#alerts")[0].innerHTML = "<div class='alert alert-success'>" + data.message + "</div>";
}
$("#tickets_table").bootstrapTable('resetSearch');
})
.fail(function (xhr) {
$("#alerts")[0].innerHTML = "<div class='alert alert-danger'>" + JSON.parse(xhr.responseText).message + "</div>";
});
}
$("#force_reason").val('')
$('#forceDialog').modal('show');
});

$(document).on("click", "#force_entrance_dialog_button", function () {
if (!$("#force_entrance_dialog_button").hasClass("disabled")) {
var force_reason = $("#force_reason").val();
$('#forceDialog').modal('hide');
enter(true, force_reason);
}
});

$(document).on("click", "#entrance_button", function () {
enter(false, null);
});

function enter(force, force_reason) {
let parameters = {
barcode: $("#modal_barcode")[0].innerHTML,
gate_code: "#{gate_code}",
group_id: $("#modal_group_id")[0].innerHTML.substring(2)
group_id: $("#modal_group_id")[0].innerHTML.substring(2),
force: force,
force_reason: force_reason
};

let mode = $("#modal_mode")[0].innerHTML;
$.post("/api/gate/gate-" + mode, parameters)
.done(function (data, status) {
Expand All @@ -216,5 +229,5 @@ block scripts
.fail(function (xhr) {
$("#alerts")[0].innerHTML = "<div class='alert alert-danger'>" + JSON.parse(xhr.responseText).message + "</div>";
});
});
}
});

0 comments on commit b1bc5cd

Please sign in to comment.