// License: LGPL-3.0-or-later if(app.autocomplete) { require('../components/address-autocomplete') } require('../cards/create') var request = require('../common/super-agent-promise') var create_card = require('../cards/create') var format_err = require('../common/format_response_error') var path = '/nonprofits/' + app.nonprofit_id + '/events/' + appl.event_id + '/tickets' appl.def('ticket_wiz', { // Placeholder for a callback that is evaluated after the tickets are redeemed on_complete: function() {}, // Set all the wizard's default data set_defaults: function() { appl.def('ticket_wiz.post_data', { nonprofit_id: app.nonprofit_id, tickets: [], kind: "", supporter_id: "", }) }, // Set/process all the ticket data after submitting the "Tickets" step form set_tickets: function(form_obj) { hide_err() var tickets = [] var total_amount = 0 var total_quantity = 0 for(var key in form_obj.tickets) { var ticket = form_obj.tickets[key] ticket.quantity = Number(ticket.quantity) ticket.amount = Number(ticket.amount) total_quantity += ticket.quantity total_amount += ticket.quantity * ticket.amount if(ticket.quantity > 0) tickets.push({ticket_level_id: ticket.ticket_level_id, quantity: ticket.quantity}) } appl.def('ticket_wiz.post_data.tickets', tickets) // Calculate total quantity and total charge amount appl.def('ticket_wiz', { total_amount: total_amount, total_quantity: total_quantity }) if(total_amount === 0) { appl.def('ticket_wiz.post_data.kind', 'free') } else { appl.def('ticket_wiz.post_data.kind', 'charge') } if(total_quantity > 0) { appl.wizard.advance('ticket_wiz') } else { appl.notify('Please choose at least one ticket.') } }, check_if_any_ticket_levels: function(i, name, node) { var ticket_level_remainder = appl.ticket_levels.data[i].remaining var value = appl.prev_elem(node).value if(value >= ticket_level_remainder) { appl.notify("There are only " + ticket_level_remainder + " tickets remaining for '" + name + "'.") appl.prev_elem(node).value = ticket_level_remainder } }, save_supporter: function(form_obj) { appl.ticket_wiz.save_supporter_promise = request .post('/nonprofits/' + app.nonprofit_id + '/supporters') .send({supporter: form_obj}).perform() .then(function(res) { appl.ticket_wiz.supporter = res.body appl.ticket_wiz.post_data.supporter_id = res.body.id return res.body }) .catch(show_err) appl.wizard.advance('ticket_wiz') }, set_kind: function(node) { // Tickets creations have a kind of free, offsite, or charge // OffsitePayments have a kind of check or cash // We need to save each separately var op_kind = appl.prev_elem(node).value var ticket_kind = appl.prev_elem(node).getAttribute('data-ticket-kind') appl.def('ticket_wiz.post_data.kind', ticket_kind) appl.def('ticket_wiz.post_data.offsite_payment.kind', op_kind) }, send_payment: function(form_obj) { appl.def('loading', true) return appl.ticket_wiz.save_supporter_promise .then(function(supporter) { return create_card({type: 'Supporter', id: supporter.id, email: supporter.email}, form_obj) }) .catch(show_err) .then(function(card) { appl.ticket_wiz.post_data.token = card.token }) .then(appl.ticket_wiz.create_tickets) }, create_tickets: function() { appl.def('loading', true) return request.post(path) .send(appl.ticket_wiz.post_data).perform() .then(complete_wizard) .then(appl.ticket_wiz.on_complete) .catch(show_err) }, }) // end appl.def('ticket_wiz'... // To be called when either a free or purchased ticket was successfully // redeemed; will show a success/thank-you modal function complete_wizard(resp) { appl.def('created_ticket_id', resp.body.tickets[0].id) appl.def('loading', false) appl.open_modal('confirmTicketsModal') appl.ticket_wiz.set_defaults() appl.wizard.reset("ticket_wiz") hide_err() } // Display an error on the ticket wizard // Works on the amount step, supporter step, and free ticket confirmation step. // The card form step is a special case, it needs some extra state to be set function show_err(resp) { appl.def('loading', false) appl.def('error', format_err(resp)) appl.def('card_form', {error: true, status: format_err(resp), loading: false, progress_width: '0%'}) } // Hide any errors in the wizard function hide_err() { appl.def('loading', false) appl.def('error', '') appl.def('card_form', {status: '', error: false, loading: false}) } appl.ticket_wiz.set_defaults()