commit
f155882d3f
|
|
@ -10,3 +10,4 @@ installed
|
||||||
/.buildpath
|
/.buildpath
|
||||||
/composer.phar
|
/composer.phar
|
||||||
_ide_helper.php
|
_ide_helper.php
|
||||||
|
*.swp
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Attendize\mailers;
|
|
||||||
|
|
||||||
use Mail;
|
|
||||||
|
|
||||||
class Mailer
|
|
||||||
{
|
|
||||||
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = [], $attachment = false)
|
|
||||||
{
|
|
||||||
Mail::send($view, $data, function ($message) use ($toEmail, $fromEmail, $fromName, $subject, $attachment) {
|
|
||||||
$replyEmail = $fromEmail;
|
|
||||||
$fromEmail = config('attendize.outgoing_email');
|
|
||||||
|
|
||||||
if ($attachment) {
|
|
||||||
$message->attach($attachment);
|
|
||||||
}
|
|
||||||
|
|
||||||
$message
|
|
||||||
->to($toEmail)
|
|
||||||
->from($fromEmail, $fromName)
|
|
||||||
->replyTo($replyEmail, $fromName)
|
|
||||||
->subject($subject);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Commands;
|
|
||||||
|
|
||||||
use App\Attendize\mailers\OrderMailer;
|
|
||||||
use Illuminate\Contracts\Bus\SelfHandling;
|
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
|
||||||
use Illuminate\Queue\SerializesModels;
|
|
||||||
use Log;
|
|
||||||
|
|
||||||
class OrderTicketsCommand extends Command implements ShouldQueue, SelfHandling
|
|
||||||
{
|
|
||||||
use InteractsWithQueue,
|
|
||||||
SerializesModels;
|
|
||||||
|
|
||||||
public $ticketOrder, $sendOrderConfirmation;
|
|
||||||
private $outSeperator = "\n ---------------------- \n";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OrderTicketsCommand constructor.
|
|
||||||
*
|
|
||||||
* @param \App\Models\Order $ticketOrder
|
|
||||||
* @param bool|true $sendOrderConfirmation
|
|
||||||
*/
|
|
||||||
public function __construct(\App\Models\Order $ticketOrder, $sendOrderConfirmation = true)
|
|
||||||
{
|
|
||||||
$this->ticketOrder = $ticketOrder;
|
|
||||||
$this->sendOrderConfirmation = $sendOrderConfirmation;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param OrderMailer $mailer
|
|
||||||
*/
|
|
||||||
public function handle(OrderMailer $mailer)
|
|
||||||
{
|
|
||||||
Log::info(date('d m y H:i')." - Starting Job {$this->job->getJobId()} ".__CLASS__);
|
|
||||||
|
|
||||||
//1 - Notify event organiser
|
|
||||||
if ($this->sendOrderConfirmation) {
|
|
||||||
$mailer->sendOrderNotification($this->ticketOrder);
|
|
||||||
}
|
|
||||||
|
|
||||||
//2 - Generate PDF Tickets
|
|
||||||
$this->ticketOrder->generatePdfTickets();
|
|
||||||
|
|
||||||
//3 - Send Tickets / Order confirmation
|
|
||||||
$mailer->sendOrderConfirmation($this->ticketOrder);
|
|
||||||
|
|
||||||
Log::info(date('d m y H:i')." - Finished Job {$this->job->getJobId()} ".__CLASS__);
|
|
||||||
|
|
||||||
$this->delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Commands;
|
|
||||||
|
|
||||||
use App\Attendize\mailers\AttendeeMailer;
|
|
||||||
use Illuminate\Contracts\Bus\SelfHandling;
|
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
|
||||||
use Illuminate\Queue\SerializesModels;
|
|
||||||
use Log;
|
|
||||||
use PDF;
|
|
||||||
|
|
||||||
class SendAttendeeTicketCommand extends Command implements ShouldQueue, SelfHandling
|
|
||||||
{
|
|
||||||
use InteractsWithQueue,
|
|
||||||
SerializesModels;
|
|
||||||
|
|
||||||
public $ticketOrder, $attendee;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OrderTicketsCommand constructor.
|
|
||||||
*
|
|
||||||
* @param \App\Models\Order $ticketOrder
|
|
||||||
* @param bool|true $sendOrderConfirmation
|
|
||||||
*/
|
|
||||||
public function __construct(\App\Models\Attendee $attendee)
|
|
||||||
{
|
|
||||||
$this->ticketOrder = $attendee->order;
|
|
||||||
$this->attendee = $attendee;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AttendeeMailer $mailer
|
|
||||||
*/
|
|
||||||
public function handle(AttendeeMailer $mailer)
|
|
||||||
{
|
|
||||||
Log::info(date('d m y H:i')." - Starting Job {$this->job->getJobId()} ".__CLASS__);
|
|
||||||
|
|
||||||
//1 - Generate PDF Tickets
|
|
||||||
$ticket_path = $this->generateAttendeeTicket();
|
|
||||||
|
|
||||||
//2 - Send Tickets / Order confirmation
|
|
||||||
$mailer->sendAttendeeTicket($this->attendee, $this->ticketOrder, $ticket_path);
|
|
||||||
|
|
||||||
Log::info(date('d m y H:i')." - Finished Job {$this->job->getJobId()} ".__CLASS__);
|
|
||||||
|
|
||||||
$this->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a ticket for an attendee
|
|
||||||
*
|
|
||||||
* @todo should the path to the PDF be stored in the DB?
|
|
||||||
* @todo This probably shouldn't be done here
|
|
||||||
* @return bool|string
|
|
||||||
*/
|
|
||||||
public function generateAttendeeTicket() {
|
|
||||||
$data = [
|
|
||||||
'order' => $this->ticketOrder,
|
|
||||||
'event' => $this->attendee->event,
|
|
||||||
'tickets' => $this->attendee->event->tickets,
|
|
||||||
'attendees' => [$this->attendee],
|
|
||||||
'css' => file_get_contents(public_path('assets/stylesheet/ticket.css')),
|
|
||||||
'image' => base64_encode(file_get_contents(public_path($this->attendee->event->organiser->full_logo_path))),
|
|
||||||
];
|
|
||||||
|
|
||||||
$pdf_file_name = $this->ticketOrder->order_reference.'-1';
|
|
||||||
$pdf_file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$pdf_file_name;
|
|
||||||
$pdf_file = $pdf_file_path.'.pdf';
|
|
||||||
|
|
||||||
if (file_exists($pdf_file)) {
|
|
||||||
return $pdf_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
PDF::setOutputMode('F'); // force to file
|
|
||||||
PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, $pdf_file_path);
|
|
||||||
|
|
||||||
return $pdf_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Mailers\TicketMailer;
|
||||||
|
use App\Jobs\GenerateTicket;
|
||||||
use App\Commands\MessageAttendeesCommand;
|
use App\Commands\MessageAttendeesCommand;
|
||||||
use App\Commands\OrderTicketsCommand;
|
|
||||||
use App\Commands\SendAttendeeTicketCommand;
|
|
||||||
use App\Models\Attendee;
|
use App\Models\Attendee;
|
||||||
use App\Models\Event;
|
use App\Models\Event;
|
||||||
use App\Models\EventStats;
|
use App\Models\EventStats;
|
||||||
|
|
@ -19,6 +19,8 @@ use Excel;
|
||||||
use Mail;
|
use Mail;
|
||||||
use Response;
|
use Response;
|
||||||
use Validator;
|
use Validator;
|
||||||
|
use Config;
|
||||||
|
use Log;
|
||||||
|
|
||||||
class EventAttendeesController extends MyBaseController
|
class EventAttendeesController extends MyBaseController
|
||||||
{
|
{
|
||||||
|
|
@ -73,13 +75,13 @@ class EventAttendeesController extends MyBaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the 'Create Attendee' modal
|
* Show the 'Invite Attendee' modal
|
||||||
*
|
*
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
* @param $event_id
|
* @param $event_id
|
||||||
* @return string|View
|
* @return string|View
|
||||||
*/
|
*/
|
||||||
public function showCreateAttendee(Request $request, $event_id)
|
public function showInviteAttendee(Request $request, $event_id)
|
||||||
{
|
{
|
||||||
$event = Event::scope()->find($event_id);
|
$event = Event::scope()->find($event_id);
|
||||||
|
|
||||||
|
|
@ -88,28 +90,27 @@ class EventAttendeesController extends MyBaseController
|
||||||
* @todo This is a bit hackish
|
* @todo This is a bit hackish
|
||||||
*/
|
*/
|
||||||
if ($event->tickets->count() === 0) {
|
if ($event->tickets->count() === 0) {
|
||||||
return '<script>showMessage("You need to create a ticket before you can add an attendee.");</script>';
|
return '<script>showMessage("You need to create a ticket before you can invite an attendee.");</script>';
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('ManageEvent.Modals.CreateAttendee', [
|
return view('ManageEvent.Modals.InviteAttendee', [
|
||||||
'event' => $event,
|
'event' => $event,
|
||||||
'tickets' => $event->tickets()->lists('title', 'id'),
|
'tickets' => $event->tickets()->lists('title', 'id'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an attendee
|
* Invite an attendee
|
||||||
*
|
*
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
* @param $event_id
|
* @param $event_id
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function postCreateAttendee(Request $request, $event_id)
|
public function postInviteAttendee(Request $request, $event_id)
|
||||||
{
|
{
|
||||||
$rules = [
|
$rules = [
|
||||||
'first_name' => 'required',
|
'first_name' => 'required',
|
||||||
'ticket_id' => 'required|exists:tickets,id,account_id,' . \Auth::user()->account_id,
|
'ticket_id' => 'required|exists:tickets,id,account_id,' . \Auth::user()->account_id,
|
||||||
'ticket_price' => 'numeric|required',
|
|
||||||
'email' => 'email|required',
|
'email' => 'email|required',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -128,7 +129,7 @@ class EventAttendeesController extends MyBaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
$ticket_id = $request->get('ticket_id');
|
$ticket_id = $request->get('ticket_id');
|
||||||
$ticket_price = $request->get('ticket_price');
|
$ticket_price = 0;
|
||||||
$attendee_first_name = $request->get('first_name');
|
$attendee_first_name = $request->get('first_name');
|
||||||
$attendee_last_name = $request->get('last_name');
|
$attendee_last_name = $request->get('last_name');
|
||||||
$attendee_email = $request->get('email');
|
$attendee_email = $request->get('email');
|
||||||
|
|
@ -190,11 +191,13 @@ class EventAttendeesController extends MyBaseController
|
||||||
$attendee->reference_index = 1;
|
$attendee->reference_index = 1;
|
||||||
$attendee->save();
|
$attendee->save();
|
||||||
|
|
||||||
|
$this->dispatch(new GenerateTicket($order->order_reference."-".$attendee->reference_index));
|
||||||
|
|
||||||
if ($email_attendee == '1') {
|
if ($email_attendee == '1') {
|
||||||
$this->dispatch(new OrderTicketsCommand($order, false));
|
TicketMailer::sendAttendeeInvite($attendee);
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->flash('message', 'Attendee Successfully Created');
|
session()->flash('message', 'Attendee Successfully Invited');
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
|
|
@ -212,7 +215,7 @@ class EventAttendeesController extends MyBaseController
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'error',
|
'status' => 'error',
|
||||||
'error' => 'An error occurred while creating this attendee. Please try again.'
|
'error' => 'An error occurred while inviting this attendee. Please try again.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -255,7 +258,6 @@ class EventAttendeesController extends MyBaseController
|
||||||
{
|
{
|
||||||
$rules = [
|
$rules = [
|
||||||
'ticket_id' => 'required|exists:tickets,id,account_id,' . \Auth::user()->account_id,
|
'ticket_id' => 'required|exists:tickets,id,account_id,' . \Auth::user()->account_id,
|
||||||
'ticket_price' => 'numeric',
|
|
||||||
'attendees_list' => 'required|mimes:csv,txt|max:5000|',
|
'attendees_list' => 'required|mimes:csv,txt|max:5000|',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -273,10 +275,7 @@ class EventAttendeesController extends MyBaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
$ticket_id = $request->get('ticket_id');
|
$ticket_id = $request->get('ticket_id');
|
||||||
$ticket_price = $request->get('ticket_price');
|
$ticket_price = 0;
|
||||||
if ($request->get('ticket_price') == null) {
|
|
||||||
$ticket_price = 0;
|
|
||||||
}
|
|
||||||
$email_attendee = $request->get('email_ticket');
|
$email_attendee = $request->get('email_ticket');
|
||||||
$num_added = 0;
|
$num_added = 0;
|
||||||
if ($request->file('attendees_list')) {
|
if ($request->file('attendees_list')) {
|
||||||
|
|
@ -307,6 +306,7 @@ class EventAttendeesController extends MyBaseController
|
||||||
$order->account_id = Auth::user()->account_id;
|
$order->account_id = Auth::user()->account_id;
|
||||||
$order->event_id = $event_id;
|
$order->event_id = $event_id;
|
||||||
$order->save();
|
$order->save();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update qty sold
|
* Update qty sold
|
||||||
*/
|
*/
|
||||||
|
|
@ -346,14 +346,15 @@ class EventAttendeesController extends MyBaseController
|
||||||
$attendee->reference_index = 1;
|
$attendee->reference_index = 1;
|
||||||
$attendee->save();
|
$attendee->save();
|
||||||
|
|
||||||
|
$this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
|
||||||
if ($email_attendee == '1') {
|
if ($email_attendee == '1') {
|
||||||
$this->dispatch(new OrderTicketsCommand($order, false));
|
TicketMailer::sendAttendeeInvite($attendee);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->flash('message', $num_added . ' Attendees Successfully Created');
|
session()->flash('message', $num_added . ' Attendees Successfully Invited');
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
|
|
@ -510,6 +511,32 @@ class EventAttendeesController extends MyBaseController
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads the ticket of an attendee as PDF
|
||||||
|
*
|
||||||
|
* @param $event_id
|
||||||
|
* @param $attendee_id
|
||||||
|
*/
|
||||||
|
public function showExportTicket($event_id, $attendee_id)
|
||||||
|
{
|
||||||
|
$attendee = Attendee::scope()->findOrFail($attendee_id);
|
||||||
|
|
||||||
|
Config::set('queue.default', 'sync');
|
||||||
|
Log::info("*********");
|
||||||
|
Log::info($attendee_id);
|
||||||
|
Log::info($attendee);
|
||||||
|
|
||||||
|
|
||||||
|
$this->dispatch(new GenerateTicket($attendee->order->order_reference."-".$attendee->reference_index));
|
||||||
|
|
||||||
|
$pdf_file_name = $attendee->order->order_reference.'-'.$attendee->reference_index;
|
||||||
|
$pdf_file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$pdf_file_name;
|
||||||
|
$pdf_file = $pdf_file_path.'.pdf';
|
||||||
|
|
||||||
|
|
||||||
|
return response()->download($pdf_file);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Downloads an export of attendees
|
* Downloads an export of attendees
|
||||||
*
|
*
|
||||||
|
|
@ -728,7 +755,8 @@ class EventAttendeesController extends MyBaseController
|
||||||
{
|
{
|
||||||
$attendee = Attendee::scope()->findOrFail($attendee_id);
|
$attendee = Attendee::scope()->findOrFail($attendee_id);
|
||||||
|
|
||||||
$this->dispatch(new SendAttendeeTicketCommand($attendee));
|
$this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
|
||||||
|
TicketMailer::sendAttendeeTicket($attendee);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Commands\OrderTicketsCommand;
|
use App\Jobs\GenerateTicket;
|
||||||
|
use App\Mailers\TicketMailer;
|
||||||
use App\Models\Affiliate;
|
use App\Models\Affiliate;
|
||||||
use App\Models\Attendee;
|
use App\Models\Attendee;
|
||||||
use App\Models\Event;
|
use App\Models\Event;
|
||||||
|
|
@ -604,7 +605,9 @@ class EventCheckoutController extends Controller
|
||||||
/*
|
/*
|
||||||
* Queue up some tasks - Emails to be sent, PDFs etc.
|
* Queue up some tasks - Emails to be sent, PDFs etc.
|
||||||
*/
|
*/
|
||||||
$this->dispatch(new OrderTicketsCommand($order));
|
$this->dispatch(new GenerateTicket($order->reference));
|
||||||
|
TicketMailer::sendOrderTickets($order);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,726 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Jobs\GenerateTicket;
|
||||||
|
use App\Mailers\TicketMailer;
|
||||||
|
use App\Models\Affiliate;
|
||||||
|
use App\Models\Attendee;
|
||||||
|
use App\Models\Event;
|
||||||
|
use App\Models\EventStats;
|
||||||
|
use App\Models\Order;
|
||||||
|
use App\Models\OrderItem;
|
||||||
|
use App\Models\ReservedTickets;
|
||||||
|
use App\Models\QuestionAnswer;
|
||||||
|
use App\Models\Ticket;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Cookie;
|
||||||
|
use DB;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Log;
|
||||||
|
use Omnipay;
|
||||||
|
use PDF;
|
||||||
|
use PhpSpec\Exception\Exception;
|
||||||
|
use Validator;
|
||||||
|
|
||||||
|
class EventCheckoutController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Is the checkout in an embedded Iframe?
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $is_embedded;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EventCheckoutController constructor.
|
||||||
|
* @param Request $request
|
||||||
|
*/
|
||||||
|
public function __construct(Request $request)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* See if the checkout is being called from an embedded iframe.
|
||||||
|
*/
|
||||||
|
$this->is_embedded = $request->get('is_embedded') == '1';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate a ticket request. If successful reserve the tickets and redirect to checkout
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $event_id
|
||||||
|
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||||
|
*/
|
||||||
|
public function postValidateTickets(Request $request, $event_id)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Order expires after X min
|
||||||
|
*/
|
||||||
|
$order_expires_time = Carbon::now()->addMinutes(config('attendize.checkout_timeout_after'));
|
||||||
|
|
||||||
|
$event = Event::findOrFail($event_id);
|
||||||
|
|
||||||
|
$ticket_ids = $request->get('tickets');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove any tickets the user has reserved
|
||||||
|
*/
|
||||||
|
ReservedTickets::where('session_id', '=', session()->getId())->delete();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go though the selected tickets and check if they're available
|
||||||
|
* , tot up the price and reserve them to prevent over selling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$validation_rules = [];
|
||||||
|
$validation_messages = [];
|
||||||
|
$tickets = [];
|
||||||
|
$order_total = 0;
|
||||||
|
$total_ticket_quantity = 0;
|
||||||
|
$booking_fee = 0;
|
||||||
|
$organiser_booking_fee = 0;
|
||||||
|
$quantity_available_validation_rules = [];
|
||||||
|
|
||||||
|
foreach ($ticket_ids as $ticket_id) {
|
||||||
|
$current_ticket_quantity = (int)$request->get('ticket_' . $ticket_id);
|
||||||
|
|
||||||
|
if ($current_ticket_quantity < 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$total_ticket_quantity = $total_ticket_quantity + $current_ticket_quantity;
|
||||||
|
|
||||||
|
$ticket = Ticket::find($ticket_id);
|
||||||
|
|
||||||
|
$ticket_quantity_remaining = $ticket->quantity_remaining;
|
||||||
|
|
||||||
|
|
||||||
|
$max_per_person = min($ticket_quantity_remaining, $ticket->max_per_person);
|
||||||
|
|
||||||
|
$quantity_available_validation_rules['ticket_' . $ticket_id] = [
|
||||||
|
'numeric',
|
||||||
|
'min:' . $ticket->min_per_person,
|
||||||
|
'max:' . $max_per_person
|
||||||
|
];
|
||||||
|
|
||||||
|
$quantity_available_validation_messages = [
|
||||||
|
'ticket_' . $ticket_id . '.max' => 'The maximum number of tickets you can register is ' . $ticket_quantity_remaining,
|
||||||
|
'ticket_' . $ticket_id . '.min' => 'You must select at least ' . $ticket->min_per_person . ' tickets.',
|
||||||
|
];
|
||||||
|
|
||||||
|
$validator = Validator::make(['ticket_' . $ticket_id => (int)$request->get('ticket_' . $ticket_id)],
|
||||||
|
$quantity_available_validation_rules, $quantity_available_validation_messages);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'messages' => $validator->messages()->toArray(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$order_total = $order_total + ($current_ticket_quantity * $ticket->price);
|
||||||
|
$booking_fee = $booking_fee + ($current_ticket_quantity * $ticket->booking_fee);
|
||||||
|
$organiser_booking_fee = $organiser_booking_fee + ($current_ticket_quantity * $ticket->organiser_booking_fee);
|
||||||
|
|
||||||
|
$tickets[] = [
|
||||||
|
'ticket' => $ticket,
|
||||||
|
'qty' => $current_ticket_quantity,
|
||||||
|
'price' => ($current_ticket_quantity * $ticket->price),
|
||||||
|
'booking_fee' => ($current_ticket_quantity * $ticket->booking_fee),
|
||||||
|
'organiser_booking_fee' => ($current_ticket_quantity * $ticket->organiser_booking_fee),
|
||||||
|
'full_price' => $ticket->price + $ticket->total_booking_fee,
|
||||||
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reserve the tickets for X amount of minutes
|
||||||
|
*/
|
||||||
|
$reservedTickets = new ReservedTickets();
|
||||||
|
$reservedTickets->ticket_id = $ticket_id;
|
||||||
|
$reservedTickets->event_id = $event_id;
|
||||||
|
$reservedTickets->quantity_reserved = $current_ticket_quantity;
|
||||||
|
$reservedTickets->expires = $order_expires_time;
|
||||||
|
$reservedTickets->session_id = session()->getId();
|
||||||
|
$reservedTickets->save();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $current_ticket_quantity; $i++) {
|
||||||
|
/*
|
||||||
|
* Create our validation rules here
|
||||||
|
*/
|
||||||
|
$validation_rules['ticket_holder_first_name.' . $i . '.' . $ticket_id] = ['required'];
|
||||||
|
$validation_rules['ticket_holder_last_name.' . $i . '.' . $ticket_id] = ['required'];
|
||||||
|
$validation_rules['ticket_holder_email.' . $i . '.' . $ticket_id] = ['required', 'email'];
|
||||||
|
|
||||||
|
$validation_messages['ticket_holder_first_name.' . $i . '.' . $ticket_id . '.required'] = 'Ticket holder ' . ($i + 1) . '\'s first name is required';
|
||||||
|
$validation_messages['ticket_holder_last_name.' . $i . '.' . $ticket_id . '.required'] = 'Ticket holder ' . ($i + 1) . '\'s last name is required';
|
||||||
|
$validation_messages['ticket_holder_email.' . $i . '.' . $ticket_id . '.required'] = 'Ticket holder ' . ($i + 1) . '\'s email is required';
|
||||||
|
$validation_messages['ticket_holder_email.' . $i . '.' . $ticket_id . '.email'] = 'Ticket holder ' . ($i + 1) . '\'s email appears to be invalid';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validation rules for custom questions
|
||||||
|
*/
|
||||||
|
foreach ($ticket->questions as $question) {
|
||||||
|
|
||||||
|
if ($question->is_required && $question->is_enabled) {
|
||||||
|
$validation_rules['ticket_holder_questions.' . $ticket_id . '.' . $i . '.' . $question->id] = ['required'];
|
||||||
|
$validation_messages['ticket_holder_questions.' . $ticket_id . '.' . $i . '.' . $question->id . '.required'] = "This question is required";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($tickets)) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => 'No tickets selected.',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The 'ticket_order' session stores everything we need to complete the transaction.
|
||||||
|
*/
|
||||||
|
session()->set('ticket_order_' . $event->id, [
|
||||||
|
'validation_rules' => $validation_rules,
|
||||||
|
'validation_messages' => $validation_messages,
|
||||||
|
'event_id' => $event->id,
|
||||||
|
'tickets' => $tickets,
|
||||||
|
'total_ticket_quantity' => $total_ticket_quantity,
|
||||||
|
'order_started' => time(),
|
||||||
|
'expires' => $order_expires_time,
|
||||||
|
'reserved_tickets_id' => $reservedTickets->id,
|
||||||
|
'order_total' => $order_total,
|
||||||
|
'booking_fee' => $booking_fee,
|
||||||
|
'organiser_booking_fee' => $organiser_booking_fee,
|
||||||
|
'total_booking_fee' => $booking_fee + $organiser_booking_fee,
|
||||||
|
'order_requires_payment' => (ceil($order_total) == 0) ? false : true,
|
||||||
|
'account_id' => $event->account->id,
|
||||||
|
'affiliate_referral' => Cookie::get('affiliate_' . $event_id),
|
||||||
|
'account_payment_gateway' => count($event->account->active_payment_gateway) ? $event->account->active_payment_gateway : false,
|
||||||
|
'payment_gateway' => count($event->account->active_payment_gateway) ? $event->account->active_payment_gateway->payment_gateway : false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're this far assume everything is OK and redirect them
|
||||||
|
* to the the checkout page.
|
||||||
|
*/
|
||||||
|
if ($request->ajax()) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'success',
|
||||||
|
'redirectUrl' => route('showEventCheckout', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'is_embedded' => $this->is_embedded,
|
||||||
|
]) . '#order_form',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit('Please enable Javascript in your browser.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the checkout page
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $event_id
|
||||||
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function showEventCheckout(Request $request, $event_id)
|
||||||
|
{
|
||||||
|
$order_session = session()->get('ticket_order_' . $event_id);
|
||||||
|
|
||||||
|
if (!$order_session || $order_session['expires'] < Carbon::now()) {
|
||||||
|
return redirect()->route('showEventPage', ['event_id' => $event_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$secondsToExpire = Carbon::now()->diffInSeconds($order_session['expires']);
|
||||||
|
|
||||||
|
$data = $order_session + [
|
||||||
|
'event' => Event::findorFail($order_session['event_id']),
|
||||||
|
'secondsToExpire' => $secondsToExpire,
|
||||||
|
'is_embedded' => $this->is_embedded,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($this->is_embedded) {
|
||||||
|
return view('Public.ViewEvent.Embedded.EventPageCheckout', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('Public.ViewEvent.EventPageCheckout', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the order, handle payment, update stats, fire off email jobs then redirect user
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $event_id
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function postCreateOrder(Request $request, $event_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there's no session kill the request and redirect back to the event homepage.
|
||||||
|
*/
|
||||||
|
if (!session()->get('ticket_order_' . $event_id)) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => 'Your session has expired.',
|
||||||
|
'redirectUrl' => route('showEventPage', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$event = Event::findOrFail($event_id);
|
||||||
|
$order = new Order;
|
||||||
|
$ticket_order = session()->get('ticket_order_' . $event_id);
|
||||||
|
|
||||||
|
$validation_rules = $ticket_order['validation_rules'];
|
||||||
|
$validation_messages = $ticket_order['validation_messages'];
|
||||||
|
|
||||||
|
$order->rules = $order->rules + $validation_rules;
|
||||||
|
$order->messages = $order->messages + $validation_messages;
|
||||||
|
|
||||||
|
if (!$order->validate($request->all())) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'messages' => $order->errors(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the request data to a session in case payment is required off-site
|
||||||
|
*/
|
||||||
|
session()->push('ticket_order_' . $event_id . '.request_data', $request->except(['card-number', 'card-cvc']));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Begin payment attempt before creating the attendees etc.
|
||||||
|
* */
|
||||||
|
if ($ticket_order['order_requires_payment']) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
$gateway = Omnipay::create($ticket_order['payment_gateway']->name);
|
||||||
|
|
||||||
|
$gateway->initialize($ticket_order['account_payment_gateway']->config + [
|
||||||
|
'testMode' => config('attendize.enable_test_payments'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
switch ($ticket_order['payment_gateway']->id) {
|
||||||
|
case config('attendize.payment_gateway_paypal'):
|
||||||
|
case config('attendize.payment_gateway_coinbase'):
|
||||||
|
|
||||||
|
$transaction_data = [
|
||||||
|
'cancelUrl' => route('showEventCheckoutPaymentReturn', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'is_payment_cancelled' => 1
|
||||||
|
]),
|
||||||
|
'returnUrl' => route('showEventCheckoutPaymentReturn', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'is_payment_successful' => 1
|
||||||
|
]),
|
||||||
|
'brandName' => isset($ticket_order['account_payment_gateway']->config['brandingName'])
|
||||||
|
? $ticket_order['account_payment_gateway']->config['brandingName']
|
||||||
|
: $event->organiser->name
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
case config('attendize.payment_gateway_stripe'):
|
||||||
|
$token = $request->get('stripeToken');
|
||||||
|
$transaction_data = [
|
||||||
|
'token' => $token,
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log::error('No payment gateway configured.');
|
||||||
|
return repsonse()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => 'No payment gateway configured.'
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$transaction_data = [
|
||||||
|
'amount' => ($ticket_order['order_total'] + $ticket_order['organiser_booking_fee']),
|
||||||
|
'currency' => $event->currency->code,
|
||||||
|
'description' => 'Order for customer: ' . $request->get('order_email'),
|
||||||
|
] + $transaction_data;
|
||||||
|
|
||||||
|
$transaction = $gateway->purchase($transaction_data);
|
||||||
|
|
||||||
|
$response = $transaction->send();
|
||||||
|
|
||||||
|
if ($response->isSuccessful()) {
|
||||||
|
|
||||||
|
session()->push('ticket_order_' . $event_id . '.transaction_id', $response->getTransactionReference());
|
||||||
|
|
||||||
|
return $this->completeOrder($event_id);
|
||||||
|
|
||||||
|
} elseif ($response->isRedirect()) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As we're going off-site for payment we need to store some into in a session
|
||||||
|
*/
|
||||||
|
session()->push('ticket_order_' . $event_id . '.transaction_data', $transaction_data);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'success',
|
||||||
|
'redirectUrl' => $response->getRedirectUrl(),
|
||||||
|
'redirectData' => $response->getRedirectData(),
|
||||||
|
'message' => 'Redirecting to ' . $ticket_order['payment_gateway']->provider_name
|
||||||
|
]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// display error to customer
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => $response->getMessage(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} catch (\Exeption $e) {
|
||||||
|
Log::error($e);
|
||||||
|
$error = 'Sorry, there was an error processing your payment. Please try again.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($error) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => $error,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No payment required so go ahead and complete the order
|
||||||
|
*/
|
||||||
|
return $this->completeOrder($event_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to complete a user's payment when they return from
|
||||||
|
* an off-site gateway
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $event_id
|
||||||
|
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||||
|
*/
|
||||||
|
public function showEventCheckoutPaymentReturn(Request $request, $event_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($request->get('is_payment_cancelled') == '1') {
|
||||||
|
session()->flash('message', 'You cancelled your payment. You may try again.');
|
||||||
|
return response()->redirectToRoute('showEventCheckout', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'is_payment_cancelled' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ticket_order = session()->get('ticket_order_' . $event_id);
|
||||||
|
$gateway = Omnipay::create($ticket_order['payment_gateway']->name);
|
||||||
|
|
||||||
|
$gateway->initialize($ticket_order['account_payment_gateway']->config + [
|
||||||
|
'testMode' => config('attendize.enable_test_payments'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$transaction = $gateway->completePurchase($ticket_order['transaction_data'][0]);
|
||||||
|
|
||||||
|
$response = $transaction->send();
|
||||||
|
|
||||||
|
if ($response->isSuccessful()) {
|
||||||
|
session()->push('ticket_order_' . $event_id . '.transaction_id', $response->getTransactionReference());
|
||||||
|
return $this->completeOrder($event_id, false);
|
||||||
|
} else {
|
||||||
|
session()->flash('message', $response->getMessage());
|
||||||
|
return response()->redirectToRoute('showEventCheckout', [
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'is_payment_failed' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Complete an order
|
||||||
|
*
|
||||||
|
* @param $event_id
|
||||||
|
* @param bool|true $return_json
|
||||||
|
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||||
|
*/
|
||||||
|
public function completeOrder($event_id, $return_json = true)
|
||||||
|
{
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
$order = new Order();
|
||||||
|
$ticket_order = session()->get('ticket_order_' . $event_id);
|
||||||
|
$request_data = $ticket_order['request_data'][0];
|
||||||
|
$event = Event::findOrFail($ticket_order['event_id']);
|
||||||
|
$attendee_increment = 1;
|
||||||
|
$ticket_questions = isset($request_data['ticket_holder_questions']) ? $request_data['ticket_holder_questions'] : [];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the order
|
||||||
|
*/
|
||||||
|
if (isset($ticket_order['transaction_id'])) {
|
||||||
|
$order->transaction_id = $ticket_order['transaction_id'][0];
|
||||||
|
}
|
||||||
|
if ($ticket_order['order_requires_payment']) {
|
||||||
|
$order->payment_gateway_id = $ticket_order['payment_gateway']->id;
|
||||||
|
}
|
||||||
|
$order->first_name = $request_data['order_first_name'];
|
||||||
|
$order->last_name = $request_data['order_last_name'];
|
||||||
|
$order->email = $request_data['order_email'];
|
||||||
|
$order->order_status_id = config('attendize.order_complete');
|
||||||
|
$order->amount = $ticket_order['order_total'];
|
||||||
|
$order->booking_fee = $ticket_order['booking_fee'];
|
||||||
|
$order->organiser_booking_fee = $ticket_order['organiser_booking_fee'];
|
||||||
|
$order->discount = 0.00;
|
||||||
|
$order->account_id = $event->account->id;
|
||||||
|
$order->event_id = $ticket_order['event_id'];
|
||||||
|
$order->save();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update the event sales volume
|
||||||
|
*/
|
||||||
|
$event->increment('sales_volume', $order->amount);
|
||||||
|
$event->increment('organiser_fees_volume', $order->organiser_booking_fee);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update affiliates stats stats
|
||||||
|
*/
|
||||||
|
if ($ticket_order['affiliate_referral']) {
|
||||||
|
$affiliate = Affiliate::where('name', '=', $ticket_order['affiliate_referral'])
|
||||||
|
->where('event_id', '=', $event_id)->first();
|
||||||
|
$affiliate->increment('sales_volume', $order->amount + $order->organiser_booking_fee);
|
||||||
|
$affiliate->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update the event stats
|
||||||
|
*/
|
||||||
|
$event_stats = EventStats::firstOrNew([
|
||||||
|
'event_id' => $event_id,
|
||||||
|
'date' => DB::raw('CURRENT_DATE'),
|
||||||
|
]);
|
||||||
|
$event_stats->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
|
||||||
|
|
||||||
|
if ($ticket_order['order_requires_payment']) {
|
||||||
|
$event_stats->increment('sales_volume', $order->amount);
|
||||||
|
$event_stats->increment('organiser_fees_volume', $order->organiser_booking_fee);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the attendees
|
||||||
|
*/
|
||||||
|
foreach ($ticket_order['tickets'] as $attendee_details) {
|
||||||
|
|
||||||
|
<<<<<<< 15de38ab91b55e6c557d0db15a10718714e90c3d
|
||||||
|
/*
|
||||||
|
* Update ticket's quantity sold
|
||||||
|
*/
|
||||||
|
$ticket = Ticket::findOrFail($attendee_details['ticket']['id']);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update some ticket info
|
||||||
|
*/
|
||||||
|
$ticket->increment('quantity_sold', $attendee_details['qty']);
|
||||||
|
$ticket->increment('sales_volume', ($attendee_details['ticket']['price'] * $attendee_details['qty']));
|
||||||
|
$ticket->increment('organiser_fees_volume',
|
||||||
|
($attendee_details['ticket']['organiser_booking_fee'] * $attendee_details['qty']));
|
||||||
|
=======
|
||||||
|
$attendee = new Attendee();
|
||||||
|
$attendee->first_name = $request_data["ticket_holder_first_name"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->last_name = $request_data["ticket_holder_last_name"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->email = $request_data["ticket_holder_email"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->event_id = $event_id;
|
||||||
|
$attendee->order_id = $order->id;
|
||||||
|
$attendee->ticket_id = $attendee_details['ticket']['id'];
|
||||||
|
$attendee->account_id = $event->account->id;
|
||||||
|
$attendee->reference_index = $attendee_increment;
|
||||||
|
$attendee->save();
|
||||||
|
>>>>>>> ticket refactoring
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Insert order items (for use in generating invoices)
|
||||||
|
*/
|
||||||
|
$orderItem = new OrderItem();
|
||||||
|
$orderItem->title = $attendee_details['ticket']['title'];
|
||||||
|
$orderItem->quantity = $attendee_details['qty'];
|
||||||
|
$orderItem->order_id = $order->id;
|
||||||
|
$orderItem->unit_price = $attendee_details['ticket']['price'];
|
||||||
|
$orderItem->unit_booking_fee = $attendee_details['ticket']['booking_fee'] + $attendee_details['ticket']['organiser_booking_fee'];
|
||||||
|
$orderItem->save();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the attendees
|
||||||
|
*/
|
||||||
|
for ($i = 0; $i < $attendee_details['qty']; $i++) {
|
||||||
|
|
||||||
|
$attendee = new Attendee();
|
||||||
|
$attendee->first_name = $request_data["ticket_holder_first_name"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->last_name = $request_data["ticket_holder_last_name"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->email = $request_data["ticket_holder_email"][$i][$attendee_details['ticket']['id']];
|
||||||
|
$attendee->event_id = $event_id;
|
||||||
|
$attendee->order_id = $order->id;
|
||||||
|
$attendee->ticket_id = $attendee_details['ticket']['id'];
|
||||||
|
$attendee->account_id = $event->account->id;
|
||||||
|
$attendee->reference_index = $attendee_increment;
|
||||||
|
$attendee->save();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save the attendee's questions
|
||||||
|
*/
|
||||||
|
foreach ($attendee_details['ticket']->questions as $question) {
|
||||||
|
|
||||||
|
|
||||||
|
$ticket_answer = isset($ticket_questions[$attendee_details['ticket']->id][$i][$question->id]) ? $ticket_questions[$attendee_details['ticket']->id][$i][$question->id] : null;
|
||||||
|
|
||||||
|
if (is_null($ticket_answer)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there are multiple answers to a question then join them with a comma
|
||||||
|
* and treat them as a single answer.
|
||||||
|
*/
|
||||||
|
$ticket_answer = is_array($ticket_answer) ? implode(', ', $ticket_answer) : $ticket_answer;
|
||||||
|
|
||||||
|
if (!empty($ticket_answer)) {
|
||||||
|
QuestionAnswer::create([
|
||||||
|
'answer_text' => $ticket_answer,
|
||||||
|
'attendee_id' => $attendee->id,
|
||||||
|
'event_id' => $event->id,
|
||||||
|
'account_id' => $event->account->id,
|
||||||
|
'question_id' => $question->id
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Keep track of total number of attendees */
|
||||||
|
$attendee_increment++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kill the session
|
||||||
|
*/
|
||||||
|
session()->forget('ticket_order_' . $event->id);
|
||||||
|
|
||||||
|
<<<<<<< 15de38ab91b55e6c557d0db15a10718714e90c3d
|
||||||
|
/*
|
||||||
|
* Queue up some tasks - Emails to be sent, PDFs etc.
|
||||||
|
*/
|
||||||
|
$this->dispatch(new OrderTicketsCommand($order));
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
|
||||||
|
Log::error($e);
|
||||||
|
DB::rollBack();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => 'Whoops! There was a problem processing your order. Please try again.'
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
=======
|
||||||
|
/*
|
||||||
|
* Queue up some tasks - Emails to be sent, PDFs etc.
|
||||||
|
*/
|
||||||
|
$this->dispatch(new GenerateTicket($order->reference));
|
||||||
|
TicketMailer::sendOrderTickets($order);
|
||||||
|
|
||||||
|
>>>>>>> ticket refactoring
|
||||||
|
|
||||||
|
if ($return_json) {
|
||||||
|
return response()->json([
|
||||||
|
'status' => 'success',
|
||||||
|
'redirectUrl' => route('showOrderDetails', [
|
||||||
|
'is_embedded' => $this->is_embedded,
|
||||||
|
'order_reference' => $order->order_reference,
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->redirectToRoute('showOrderDetails', [
|
||||||
|
'is_embedded' => $this->is_embedded,
|
||||||
|
'order_reference' => $order->order_reference,
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the order details page
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $order_reference
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function showOrderDetails(Request $request, $order_reference)
|
||||||
|
{
|
||||||
|
$order = Order::where('order_reference', '=', $order_reference)->first();
|
||||||
|
|
||||||
|
if (!$order) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'order' => $order,
|
||||||
|
'event' => $order->event,
|
||||||
|
'tickets' => $order->event->tickets,
|
||||||
|
'is_embedded' => $this->is_embedded,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($this->is_embedded) {
|
||||||
|
return view('Public.ViewEvent.Embedded.EventPageViewOrder', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('Public.ViewEvent.EventPageViewOrder', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows the tickets for an order - either HTML or PDF
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @param $order_reference
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function showOrderTickets(Request $request, $order_reference)
|
||||||
|
{
|
||||||
|
$order = Order::where('order_reference', '=', $order_reference)->first();
|
||||||
|
|
||||||
|
if (!$order) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'order' => $order,
|
||||||
|
'event' => $order->event,
|
||||||
|
'tickets' => $order->event->tickets,
|
||||||
|
'attendees' => $order->attendees,
|
||||||
|
'css' => file_get_contents(public_path('assets/stylesheet/ticket.css')),
|
||||||
|
'image' => base64_encode(file_get_contents(public_path($order->event->organiser->full_logo_path))),
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($request->get('download') == '1') {
|
||||||
|
return PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, 'Tickets');
|
||||||
|
}
|
||||||
|
return view('Public.ViewEvent.Partials.PDFTicket', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -413,14 +413,14 @@ Route::group(['middleware' => ['auth', 'first.run']], function () {
|
||||||
'uses' => 'EventAttendeesController@postResendTicketToAttendee',
|
'uses' => 'EventAttendeesController@postResendTicketToAttendee',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Route::get('{event_id}/attendees/create', [
|
Route::get('{event_id}/attendees/invite', [
|
||||||
'as' => 'showCreateAttendee',
|
'as' => 'showInviteAttendee',
|
||||||
'uses' => 'EventAttendeesController@showCreateAttendee',
|
'uses' => 'EventAttendeesController@showInviteAttendee',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Route::post('{event_id}/attendees/create', [
|
Route::post('{event_id}/attendees/invite', [
|
||||||
'as' => 'postCreateAttendee',
|
'as' => 'postInviteAttendee',
|
||||||
'uses' => 'EventAttendeesController@postCreateAttendee',
|
'uses' => 'EventAttendeesController@postInviteAttendee',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Route::get('{event_id}/attendees/import', [
|
Route::get('{event_id}/attendees/import', [
|
||||||
|
|
@ -438,6 +438,11 @@ Route::group(['middleware' => ['auth', 'first.run']], function () {
|
||||||
'uses' => 'EventAttendeesController@showPrintAttendees',
|
'uses' => 'EventAttendeesController@showPrintAttendees',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Route::get('{event_id}/attendees/{attendee_id}/export_ticket', [
|
||||||
|
'as' => 'showExportTicket',
|
||||||
|
'uses' => 'EventAttendeesController@showExportTicket',
|
||||||
|
]);
|
||||||
|
|
||||||
Route::get('{event_id}/attendees/export/{export_as?}', [
|
Route::get('{event_id}/attendees/export/{export_as?}', [
|
||||||
'as' => 'showExportAttendees',
|
'as' => 'showExportAttendees',
|
||||||
'uses' => 'EventAttendeesController@showExportAttendees',
|
'uses' => 'EventAttendeesController@showExportAttendees',
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Jobs\Job;
|
||||||
|
use App\Models\Order;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Log;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
|
class GenerateTicket extends Job implements ShouldQueue
|
||||||
|
{
|
||||||
|
use InteractsWithQueue, SerializesModels;
|
||||||
|
|
||||||
|
protected $reference;
|
||||||
|
protected $order_reference;
|
||||||
|
protected $attendee_reference_index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($reference)
|
||||||
|
{
|
||||||
|
Log::info("Generating ticket: #".$reference);
|
||||||
|
$this->reference = $reference;
|
||||||
|
$this->order_reference = explode("-", $reference)[0];
|
||||||
|
if (strpos($reference, "-")) {
|
||||||
|
$this->attendee_reference_index = explode("-", $reference)[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
|
||||||
|
$file_name = $this->reference;
|
||||||
|
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name;
|
||||||
|
$file_with_ext = $file_path.".pdf";
|
||||||
|
|
||||||
|
if (file_exists($file_with_ext)) {
|
||||||
|
Log::info("Use ticket from cache: ".$file_with_ext);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$order = Order::where('order_reference', $this->order_reference)->first();
|
||||||
|
Log::info($order);
|
||||||
|
$event = $order->event;
|
||||||
|
|
||||||
|
$query = $order->attendees();
|
||||||
|
if ($this->isAttendeeTicket()) {
|
||||||
|
$query = $query->where('reference_index', '=', $this->attendee_reference_index);
|
||||||
|
}
|
||||||
|
$attendees = $query->get();
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'order' => $order,
|
||||||
|
'event' => $event,
|
||||||
|
'attendees' => $attendees,
|
||||||
|
'css' => file_get_contents(public_path('assets/stylesheet/ticket.css')),
|
||||||
|
'image' => base64_encode(file_get_contents(public_path($event->organiser->full_logo_path))),
|
||||||
|
];
|
||||||
|
|
||||||
|
PDF::setOutputMode('F'); // force to file
|
||||||
|
PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, $file_path);
|
||||||
|
|
||||||
|
Log::info("Ticket generated!");
|
||||||
|
}
|
||||||
|
|
||||||
|
private function isAttendeeTicket() {
|
||||||
|
return ($this->attendee_reference_index != null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
|
||||||
|
abstract class Job
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Queueable Jobs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This job base class provides a central location to place any logic that
|
||||||
|
| is shared across all of your jobs. The trait included with the class
|
||||||
|
| provides access to the "onQueue" and "delay" queue helper methods.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
use Queueable;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Mailers;
|
||||||
|
|
||||||
|
use Mail;
|
||||||
|
use Log;
|
||||||
|
|
||||||
|
class TicketMailer
|
||||||
|
{
|
||||||
|
|
||||||
|
public static function sendOrderTickets($order) {
|
||||||
|
|
||||||
|
Log::info("Sending ticket to: ".$order->email);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'order' => $order,
|
||||||
|
];
|
||||||
|
|
||||||
|
Mail::queue('Mailers.TicketMailer.SendOrderTickets', $data, function($message) use ($order) {
|
||||||
|
$message->to($order->email);
|
||||||
|
$message->subject('Your tickets for the event '.$order->event->title);
|
||||||
|
|
||||||
|
$file_name = $order->reference;
|
||||||
|
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
|
||||||
|
|
||||||
|
$message->attach($file_path);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function sendAttendeeTicket($attendee) {
|
||||||
|
|
||||||
|
Log::info("Sending ticket to: ".$attendee->email);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'attendee' => $attendee,
|
||||||
|
];
|
||||||
|
|
||||||
|
Mail::queue('Mailers.TicketMailer.SendAttendeeTicket', $data, function($message) use ($attendee) {
|
||||||
|
$message->to($attendee->email);
|
||||||
|
$message->subject('Your ticket for the event '.$attendee->order->event->title);
|
||||||
|
|
||||||
|
$file_name = $attendee->getReferenceAttribute();
|
||||||
|
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
|
||||||
|
|
||||||
|
$message->attach($file_path);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function sendAttendeeInvite($attendee) {
|
||||||
|
|
||||||
|
Log::info("Sending invite to: ".$attendee->email);
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'attendee' => $attendee,
|
||||||
|
];
|
||||||
|
|
||||||
|
Mail::queue('Mailers.TicketMailer.SendAttendeeInvite', $data, function($message) use ($attendee) {
|
||||||
|
$message->to($attendee->email);
|
||||||
|
$message->subject('Your ticket for the event '.$attendee->order->event->title);
|
||||||
|
|
||||||
|
$file_name = $attendee->getReferenceAttribute();
|
||||||
|
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
|
||||||
|
|
||||||
|
$message->attach($file_path);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -25,8 +25,8 @@
|
||||||
"omnipay/paypal": "*",
|
"omnipay/paypal": "*",
|
||||||
"omnipay/bitpay": "dev-master",
|
"omnipay/bitpay": "dev-master",
|
||||||
"omnipay/coinbase": "dev-master",
|
"omnipay/coinbase": "dev-master",
|
||||||
"laracasts/utilities": "^2.1"
|
"laracasts/utilities": "^2.1",
|
||||||
|
"predis/predis": "~1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "~4.0",
|
"phpunit/phpunit": "~4.0",
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -115,7 +115,7 @@ return [
|
||||||
'cluster' => false,
|
'cluster' => false,
|
||||||
|
|
||||||
'default' => [
|
'default' => [
|
||||||
'host' => '127.0.0.1',
|
'host' => 'redis',
|
||||||
'port' => 6379,
|
'port' => 6379,
|
||||||
'database' => 0,
|
'database' => 0,
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,19 @@ php:
|
||||||
links:
|
links:
|
||||||
- db
|
- db
|
||||||
- maildev
|
- maildev
|
||||||
|
- redis
|
||||||
volumes:
|
volumes:
|
||||||
- .:/usr/share/nginx/html/attendize
|
- .:/usr/share/nginx/html/attendize
|
||||||
|
php-worker:
|
||||||
|
build: .
|
||||||
|
dockerfile: Dockerfile-php
|
||||||
|
links:
|
||||||
|
- db
|
||||||
|
- maildev
|
||||||
|
- redis
|
||||||
|
volumes:
|
||||||
|
- .:/usr/share/nginx/html/attendize
|
||||||
|
command: php artisan queue:work --daemon
|
||||||
db:
|
db:
|
||||||
image: postgres
|
image: postgres
|
||||||
environment:
|
environment:
|
||||||
|
|
@ -29,3 +40,5 @@ maildev:
|
||||||
image: djfarrelly/maildev
|
image: djfarrelly/maildev
|
||||||
ports:
|
ports:
|
||||||
- "1080:80"
|
- "1080:80"
|
||||||
|
redis:
|
||||||
|
image: redis
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
@extends('Emails.Layouts.Master')
|
||||||
|
|
||||||
|
@section('message_content')
|
||||||
|
Hello {{$attendee->first_name}},<br><br>
|
||||||
|
|
||||||
|
You have been invited to the event <b>{{$attendee->order->event->title}}</b>.<br/>
|
||||||
|
Your ticket for the event is attached to this email.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
Regards
|
||||||
|
@stop
|
||||||
|
|
@ -3,8 +3,7 @@
|
||||||
@section('message_content')
|
@section('message_content')
|
||||||
Hello {{$attendee->first_name}},<br><br>
|
Hello {{$attendee->first_name}},<br><br>
|
||||||
|
|
||||||
Your ticket for the event <b>{{$order->event->title}}</b> is attached to this email.
|
Your ticket for the event <b>{{$attendee->order->event->title}}</b> is attached to this email.
|
||||||
|
|
||||||
|
|
||||||
<br><br>
|
<br><br>
|
||||||
Thank you
|
Thank you
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
@extends('Emails.Layouts.Master')
|
||||||
|
|
||||||
|
@section('message_content')
|
||||||
|
Hello,<br><br>
|
||||||
|
|
||||||
|
Your order for the event <b>{{$order->event->title}}</b> was successful.<br><br>
|
||||||
|
|
||||||
|
Your tickets are attached to this email. You can also view you order details and download your tickets at: {{route('showOrderDetails', ['order_reference' => $order->order_reference])}}
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Order Details</h3>
|
||||||
|
Order Reference: <b>{{$order->order_reference}}</b><br>
|
||||||
|
Order Name: <b>{{$order->full_name}}</b><br>
|
||||||
|
Order Date: <b>{{$order->created_at->toDayDateTimeString()}}</b><br>
|
||||||
|
Order Email: <b>{{$order->email}}</b><br>
|
||||||
|
|
||||||
|
<h3>Order Items</h3>
|
||||||
|
<div style="padding:10px; background: #F9F9F9; border: 1px solid #f1f1f1;">
|
||||||
|
<table style="width:100%; margin:10px;">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>Ticket</b>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>Qty.</b>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>Price</b>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>Fee</b>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>Total</b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@foreach($order->orderItems as $order_item)
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{$order_item->title}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{$order_item->quantity}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if((int)ceil($order_item->unit_price) == 0)
|
||||||
|
FREE
|
||||||
|
@else
|
||||||
|
{{money($order_item->unit_price, $order->event->currency->code)}}
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if((int)ceil($order_item->unit_price) == 0)
|
||||||
|
-
|
||||||
|
@else
|
||||||
|
{{money($order_item->unit_booking_fee, $order->event->currency->code)}}
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if((int)ceil($order_item->unit_price) == 0)
|
||||||
|
FREE
|
||||||
|
@else
|
||||||
|
{{money(($order_item->unit_price + $order_item->unit_booking_fee) * ($order_item->quantity), $order->event->currency->code)}}
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<b>Sub Total</b>
|
||||||
|
</td>
|
||||||
|
<td colspan="2">
|
||||||
|
{{money($order->amount + $order->order_fee, $order->event->currency->code)}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
</div>
|
||||||
|
<br><br>
|
||||||
|
Thank you
|
||||||
|
@stop
|
||||||
|
|
@ -29,11 +29,11 @@ Attendees
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<div class="btn-toolbar" role="toolbar">
|
<div class="btn-toolbar" role="toolbar">
|
||||||
<div class="btn-group btn-group-responsive">
|
<div class="btn-group btn-group-responsive">
|
||||||
<button data-modal-id="CreateTicket" href="javascript:void(0);" data-href="{{route('showCreateAttendee', ['event_id'=>$event->id])}}" class="loadModal btn btn-success" type="button"><i class="ico-ticket"></i> Add Attendee</button>
|
<button data-modal-id="InviteAttendee" href="javascript:void(0);" data-href="{{route('showInviteAttendee', ['event_id'=>$event->id])}}" class="loadModal btn btn-success" type="button"><i class="ico-user-plus"></i> Invite Attendee</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btn-group btn-group-responsive">
|
<div class="btn-group btn-group-responsive">
|
||||||
<button data-modal-id="CreateTicket" href="javascript:void(0);" data-href="{{route('showImportAttendee', ['event_id'=>$event->id])}}" class="loadModal btn btn-success" type="button"><i class="ico-user-plus"></i> Import Attendees</button>
|
<button data-modal-id="ImportAttendees" href="javascript:void(0);" data-href="{{route('showImportAttendee', ['event_id'=>$event->id])}}" class="loadModal btn btn-success" type="button"><i class="ico-file"></i> Invite Attendees</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btn-group btn-group-responsive">
|
<div class="btn-group btn-group-responsive">
|
||||||
|
|
@ -129,6 +129,9 @@ Attendees
|
||||||
data-href="{{route('showResendTicketToAttendee', ['attendee_id'=>$attendee->id])}}"
|
data-href="{{route('showResendTicketToAttendee', ['attendee_id'=>$attendee->id])}}"
|
||||||
class="loadModal"
|
class="loadModal"
|
||||||
> Resend Ticket</a></li>
|
> Resend Ticket</a></li>
|
||||||
|
<li><a
|
||||||
|
href="{{route('showExportTicket', ['event_id'=>$event->id, 'attendee_id'=>$attendee->id])}}"
|
||||||
|
> Ticket PDF</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
<h3 class="modal-title">
|
<h3 class="modal-title">
|
||||||
<i class="ico-user-plus"></i>
|
<i class="ico-user-plus"></i>
|
||||||
Import Attendees</h3>
|
Invite Attendees</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
@ -18,24 +18,13 @@
|
||||||
{!! Form::select('ticket_id', $tickets, null, ['class' => 'form-control']) !!}
|
{!! Form::select('ticket_id', $tickets, null, ['class' => 'form-control']) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="form-group">
|
|
||||||
{!! Form::label('ticket_price', 'Ticket Price', array('class'=>'control-label')) !!}
|
|
||||||
{!! Form::text('ticket_price', Input::old('price'),
|
|
||||||
array(
|
|
||||||
'class'=>'form-control',
|
|
||||||
'placeholder'=>'E.g: 25.99'
|
|
||||||
)) !!}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- Import -->
|
<!-- Import -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
{!! Form::label('attendees_list', 'Import File', array('class'=>'control-label required')) !!}
|
{!! Form::labelWithHelp('attendees_list', 'Import File', array('class'=>'control-label required'),
|
||||||
|
'File must be .csv and the first line must contains first_name,last_name,email') !!}
|
||||||
{!! Form::styledFile('attendees_list',1,array('id'=>'input-attendees_list')) !!}
|
{!! Form::styledFile('attendees_list',1,array('id'=>'input-attendees_list')) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -45,7 +34,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox custom-checkbox">
|
<div class="checkbox custom-checkbox">
|
||||||
<input type="checkbox" name="email_ticket" id="email_ticket" value="1" />
|
<input type="checkbox" name="email_ticket" id="email_ticket" value="1" />
|
||||||
<label for="email_ticket"> Send confirmation & ticket to attendee.</label>
|
<label for="email_ticket"> Send invitation & ticket to attendees.</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
<div role="dialog" class="modal fade " style="display: none;">
|
<div role="dialog" class="modal fade " style="display: none;">
|
||||||
{!! Form::open(array('url' => route('postCreateAttendee', array('event_id' => $event->id)), 'class' => 'ajax')) !!}
|
{!! Form::open(array('url' => route('postInviteAttendee', array('event_id' => $event->id)), 'class' => 'ajax')) !!}
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header text-center">
|
<div class="modal-header text-center">
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
<h3 class="modal-title">
|
<h3 class="modal-title">
|
||||||
<i class="ico-user"></i>
|
<i class="ico-user"></i>
|
||||||
Create Attendee</h3>
|
Invite Attendee</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
@ -18,17 +18,6 @@
|
||||||
{!! Form::select('ticket_id', $tickets, null, ['class' => 'form-control']) !!}
|
{!! Form::select('ticket_id', $tickets, null, ['class' => 'form-control']) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="form-group">
|
|
||||||
{!! Form::label('ticket_price', 'Ticket Price', array('class'=>'control-label required')) !!}
|
|
||||||
{!! Form::text('ticket_price', Input::old('price'),
|
|
||||||
array(
|
|
||||||
'class'=>'form-control',
|
|
||||||
'placeholder'=>'E.g: 25.99'
|
|
||||||
)) !!}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
@ -67,7 +56,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox custom-checkbox">
|
<div class="checkbox custom-checkbox">
|
||||||
<input type="checkbox" name="email_ticket" id="email_ticket" value="1" />
|
<input type="checkbox" name="email_ticket" id="email_ticket" value="1" />
|
||||||
<label for="email_ticket"> Send confirmation & ticket to attendee.</label>
|
<label for="email_ticket"> Send invitation & ticket to attendee.</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -75,7 +64,7 @@
|
||||||
</div> <!-- /end modal body-->
|
</div> <!-- /end modal body-->
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
{!! Form::button('Cancel', ['class'=>"btn modal-close btn-danger",'data-dismiss'=>'modal']) !!}
|
{!! Form::button('Cancel', ['class'=>"btn modal-close btn-danger",'data-dismiss'=>'modal']) !!}
|
||||||
{!! Form::submit('Create Attendee', ['class'=>"btn btn-success"]) !!}
|
{!! Form::submit('Invite Attendee', ['class'=>"btn btn-success"]) !!}
|
||||||
</div>
|
</div>
|
||||||
</div><!-- /end modal content-->
|
</div><!-- /end modal content-->
|
||||||
{!! Form::close() !!}
|
{!! Form::close() !!}
|
||||||
|
|
@ -10,13 +10,13 @@
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
@section('blankslate-text')
|
@section('blankslate-text')
|
||||||
Attendees will appear here once they successfully registered for your event, or, you can manually add attendees yourself.
|
Attendees will appear here once they successfully registered for your event, or, you can manually invite attendees yourself.
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
@section('blankslate-body')
|
@section('blankslate-body')
|
||||||
<button data-invoke="modal" data-modal-id='CreateTicket' data-href="{{route('showCreateAttendee', array('event_id'=>$event->id))}}" href='javascript:void(0);' class=' btn btn-success mt5 btn-lg' type="button" >
|
<button data-invoke="modal" data-modal-id='InviteAttendee' data-href="{{route('showInviteAttendee', array('event_id'=>$event->id))}}" href='javascript:void(0);' class=' btn btn-success mt5 btn-lg' type="button" >
|
||||||
<i class="ico-ticket"></i>
|
<i class="ico-user-plus"></i>
|
||||||
Create Attendee
|
Invite Attendee
|
||||||
</button>
|
</button>
|
||||||
@stop
|
@stop
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue