Merge pull request #117 from ylecuyer/refactoring

Refactoring
This commit is contained in:
Dave Earley 2016-05-31 11:46:49 +01:00
commit f155882d3f
22 changed files with 1383 additions and 417 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ installed
/.buildpath /.buildpath
/composer.phar /composer.phar
_ide_helper.php _ide_helper.php
*.swp

View File

@ -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);
});
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View 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',

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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',

View File

@ -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);
}
}

20
app/Jobs/Job.php Normal file
View File

@ -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;
}

View File

@ -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);
});
}
}

View File

@ -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",

467
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -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,
], ],

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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">&nbsp;&nbsp;Send confirmation & ticket to attendee.</label> <label for="email_ticket">&nbsp;&nbsp;Send invitation & ticket to attendees.</label>
</div> </div>
</div> </div>
</div> </div>

View File

@ -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">&nbsp;&nbsp;Send confirmation & ticket to attendee.</label> <label for="email_ticket">&nbsp;&nbsp;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() !!}

View File

@ -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