diff --git a/app/Attendize/mailers/Mailer.php b/app/Attendize/mailers/Mailer.php
deleted file mode 100644
index 96985f0e..00000000
--- a/app/Attendize/mailers/Mailer.php
+++ /dev/null
@@ -1,26 +0,0 @@
-attach($attachment);
- }
-
- $message
- ->to($toEmail)
- ->from($fromEmail, $fromName)
- ->replyTo($replyEmail, $fromName)
- ->subject($subject);
- });
- }
-}
diff --git a/app/Commands/OrderTicketsCommand.php b/app/Commands/OrderTicketsCommand.php
deleted file mode 100644
index ba9ea696..00000000
--- a/app/Commands/OrderTicketsCommand.php
+++ /dev/null
@@ -1,54 +0,0 @@
-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();
- }
-}
diff --git a/app/Commands/SendAttendeeTicketCommand.php b/app/Commands/SendAttendeeTicketCommand.php
deleted file mode 100644
index 75c3b596..00000000
--- a/app/Commands/SendAttendeeTicketCommand.php
+++ /dev/null
@@ -1,82 +0,0 @@
-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;
- }
-
-}
diff --git a/app/Http/Controllers/EventAttendeesController.php b/app/Http/Controllers/EventAttendeesController.php
index 6c0694e8..69f94bd7 100644
--- a/app/Http/Controllers/EventAttendeesController.php
+++ b/app/Http/Controllers/EventAttendeesController.php
@@ -2,9 +2,9 @@
namespace App\Http\Controllers;
+use App\Mailers\TicketMailer;
+use App\Jobs\GenerateTicket;
use App\Commands\MessageAttendeesCommand;
-use App\Commands\OrderTicketsCommand;
-use App\Commands\SendAttendeeTicketCommand;
use App\Models\Attendee;
use App\Models\Event;
use App\Models\EventStats;
@@ -19,6 +19,8 @@ use Excel;
use Mail;
use Response;
use Validator;
+use Config;
+use Log;
class EventAttendeesController extends MyBaseController
{
@@ -190,8 +192,10 @@ class EventAttendeesController extends MyBaseController
$attendee->reference_index = 1;
$attendee->save();
+ $this->dispatch(new GenerateTicket($order->order_reference."-".$attendee->reference_index));
+
if ($email_attendee == '1') {
- $this->dispatch(new OrderTicketsCommand($order, false));
+ TicketMailer::sendAttendeeTicket($attendee);
}
session()->flash('message', 'Attendee Successfully Created');
@@ -346,8 +350,9 @@ class EventAttendeesController extends MyBaseController
$attendee->reference_index = 1;
$attendee->save();
+ $this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
if ($email_attendee == '1') {
- $this->dispatch(new OrderTicketsCommand($order, false));
+ TicketMailer::sendAttendeeTicket($attendee);
}
}
};
@@ -510,6 +515,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
*
@@ -728,7 +759,8 @@ class EventAttendeesController extends MyBaseController
{
$attendee = Attendee::scope()->findOrFail($attendee_id);
- $this->dispatch(new SendAttendeeTicketCommand($attendee));
+ $this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
+ TicketMailer::sendAttendeeTicket($attendee);
return response()->json([
'status' => 'success',
diff --git a/app/Http/Controllers/EventCheckoutController.php b/app/Http/Controllers/EventCheckoutController.php
index c0c066b5..82953ffc 100644
--- a/app/Http/Controllers/EventCheckoutController.php
+++ b/app/Http/Controllers/EventCheckoutController.php
@@ -2,7 +2,8 @@
namespace App\Http\Controllers;
-use App\Commands\OrderTicketsCommand;
+use App\Jobs\GenerateTicket;
+use App\Mailers\TicketMailer;
use App\Models\Affiliate;
use App\Models\Attendee;
use App\Models\Event;
@@ -604,7 +605,9 @@ class EventCheckoutController extends Controller
/*
* 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) {
diff --git a/app/Http/Controllers/EventCheckoutController.php.orig b/app/Http/Controllers/EventCheckoutController.php.orig
new file mode 100644
index 00000000..48283dba
--- /dev/null
+++ b/app/Http/Controllers/EventCheckoutController.php.orig
@@ -0,0 +1,726 @@
+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);
+ }
+
+}
+
diff --git a/app/Http/routes.php b/app/Http/routes.php
index 9331643d..ab3ceb7b 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -438,6 +438,11 @@ Route::group(['middleware' => ['auth', 'first.run']], function () {
'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?}', [
'as' => 'showExportAttendees',
'uses' => 'EventAttendeesController@showExportAttendees',
diff --git a/app/Jobs/GenerateTicket.php b/app/Jobs/GenerateTicket.php
new file mode 100644
index 00000000..ad27e1ee
--- /dev/null
+++ b/app/Jobs/GenerateTicket.php
@@ -0,0 +1,80 @@
+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);
+ }
+}
diff --git a/app/Jobs/Job.php b/app/Jobs/Job.php
new file mode 100644
index 00000000..798c060b
--- /dev/null
+++ b/app/Jobs/Job.php
@@ -0,0 +1,20 @@
+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);
+ });
+
+ }
+
+}
diff --git a/composer.json b/composer.json
index 066cc9c2..5356e4e8 100644
--- a/composer.json
+++ b/composer.json
@@ -25,8 +25,8 @@
"omnipay/paypal": "*",
"omnipay/bitpay": "dev-master",
"omnipay/coinbase": "dev-master",
- "laracasts/utilities": "^2.1"
-
+ "laracasts/utilities": "^2.1",
+ "predis/predis": "~1.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
diff --git a/composer.lock b/composer.lock
index 51929bb5..3d134ba6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,21 +4,21 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "e2db7e61501bed9cc6b59cf199253d9d",
- "content-hash": "e38028f7836ddda07bda5ec825a3c44b",
+ "hash": "4d8c6a5d2fc3f02e9e8c100381c79588",
+ "content-hash": "5af2e646bc6bd34c42124fd9b3577070",
"packages": [
{
"name": "aws/aws-sdk-php",
- "version": "3.17.6",
+ "version": "3.18.14",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "d5a5145263da88c9ba870b579c3d4f648b82d2a9"
+ "reference": "9398db378231fe723583fb8d7a919c1806f02be3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d5a5145263da88c9ba870b579c3d4f648b82d2a9",
- "reference": "d5a5145263da88c9ba870b579c3d4f648b82d2a9",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9398db378231fe723583fb8d7a919c1806f02be3",
+ "reference": "9398db378231fe723583fb8d7a919c1806f02be3",
"shasum": ""
},
"require": {
@@ -85,7 +85,7 @@
"s3",
"sdk"
],
- "time": "2016-04-11 17:36:01"
+ "time": "2016-05-26 20:43:24"
},
{
"name": "classpreloader/classpreloader",
@@ -247,12 +247,12 @@
"source": {
"type": "git",
"url": "https://github.com/dompdf/dompdf.git",
- "reference": "18b08fdb3e22378e980f79fc45cdd3e0a69a416a"
+ "reference": "8db6e1478e11b4e2bd0753c903dabe375b58ac3b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dompdf/dompdf/zipball/18b08fdb3e22378e980f79fc45cdd3e0a69a416a",
- "reference": "18b08fdb3e22378e980f79fc45cdd3e0a69a416a",
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8db6e1478e11b4e2bd0753c903dabe375b58ac3b",
+ "reference": "8db6e1478e11b4e2bd0753c903dabe375b58ac3b",
"shasum": ""
},
"require": {
@@ -300,7 +300,7 @@
],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf",
- "time": "2016-04-09 02:57:14"
+ "time": "2016-05-12 04:19:17"
},
{
"name": "erusev/parsedown",
@@ -602,16 +602,16 @@
},
{
"name": "guzzlehttp/promises",
- "version": "1.1.0",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8"
+ "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8",
- "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579",
+ "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579",
"shasum": ""
},
"require": {
@@ -649,7 +649,7 @@
"keywords": [
"promise"
],
- "time": "2016-03-08 01:15:46"
+ "time": "2016-05-18 16:56:05"
},
{
"name": "guzzlehttp/psr7",
@@ -715,12 +715,12 @@
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
- "reference": "e368d262887dbb2fdfaf710880571ede51e9c0e6"
+ "reference": "22088b04728a039bd1fc32f7e79a89a118b78698"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Intervention/image/zipball/e368d262887dbb2fdfaf710880571ede51e9c0e6",
- "reference": "e368d262887dbb2fdfaf710880571ede51e9c0e6",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/22088b04728a039bd1fc32f7e79a89a118b78698",
+ "reference": "22088b04728a039bd1fc32f7e79a89a118b78698",
"shasum": ""
},
"require": {
@@ -769,7 +769,7 @@
"thumbnail",
"watermark"
],
- "time": "2016-02-26 18:18:19"
+ "time": "2016-04-26 14:08:40"
},
{
"name": "ircmaxell/password-compat",
@@ -1106,16 +1106,16 @@
},
{
"name": "laravel/framework",
- "version": "v5.2.29",
+ "version": "v5.2.34",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "e3d644eb131f18c5f3d28ff7bc678bc797091f20"
+ "reference": "6a26f3bb6a6e00c53654a661221643ad1b98e146"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/e3d644eb131f18c5f3d28ff7bc678bc797091f20",
- "reference": "e3d644eb131f18c5f3d28ff7bc678bc797091f20",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/6a26f3bb6a6e00c53654a661221643ad1b98e146",
+ "reference": "6a26f3bb6a6e00c53654a661221643ad1b98e146",
"shasum": ""
},
"require": {
@@ -1176,7 +1176,7 @@
},
"require-dev": {
"aws/aws-sdk-php": "~3.0",
- "mockery/mockery": "~0.9.2",
+ "mockery/mockery": "~0.9.4",
"pda/pheanstalk": "~3.0",
"phpunit/phpunit": "~4.1",
"predis/predis": "~1.0",
@@ -1194,7 +1194,8 @@
"predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
"symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).",
- "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*)."
+ "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).",
+ "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)."
},
"type": "library",
"extra": {
@@ -1230,20 +1231,20 @@
"framework",
"laravel"
],
- "time": "2016-04-03 01:43:55"
+ "time": "2016-05-26 21:59:46"
},
{
"name": "laravel/socialite",
- "version": "v2.0.15",
+ "version": "v2.0.17",
"source": {
"type": "git",
"url": "https://github.com/laravel/socialite.git",
- "reference": "edd00ab96933e3ef053533cce81e958fb26921af"
+ "reference": "81d39cde2226f7548d8d1aa99405278c87e50737"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/socialite/zipball/edd00ab96933e3ef053533cce81e958fb26921af",
- "reference": "edd00ab96933e3ef053533cce81e958fb26921af",
+ "url": "https://api.github.com/repos/laravel/socialite/zipball/81d39cde2226f7548d8d1aa99405278c87e50737",
+ "reference": "81d39cde2226f7548d8d1aa99405278c87e50737",
"shasum": ""
},
"require": {
@@ -1284,7 +1285,7 @@
"laravel",
"oauth"
],
- "time": "2016-03-21 14:30:30"
+ "time": "2016-05-27 12:42:05"
},
{
"name": "laravelcollective/html",
@@ -1342,16 +1343,16 @@
},
{
"name": "league/flysystem",
- "version": "1.0.20",
+ "version": "1.0.22",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a"
+ "reference": "bd73a91703969a2d20ab4bfbf971d6c2cbe36612"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
- "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/bd73a91703969a2d20ab4bfbf971d6c2cbe36612",
+ "reference": "bd73a91703969a2d20ab4bfbf971d6c2cbe36612",
"shasum": ""
},
"require": {
@@ -1421,20 +1422,20 @@
"sftp",
"storage"
],
- "time": "2016-03-14 21:54:11"
+ "time": "2016-04-28 06:53:12"
},
{
"name": "league/flysystem-aws-s3-v3",
- "version": "1.0.9",
+ "version": "1.0.11",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
- "reference": "595e24678bf78f8107ebc9355d8376ae0eb712c6"
+ "reference": "1f7ae4e3cc178686c49a9d23cab43ed1e955368c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/595e24678bf78f8107ebc9355d8376ae0eb712c6",
- "reference": "595e24678bf78f8107ebc9355d8376ae0eb712c6",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/1f7ae4e3cc178686c49a9d23cab43ed1e955368c",
+ "reference": "1f7ae4e3cc178686c49a9d23cab43ed1e955368c",
"shasum": ""
},
"require": {
@@ -1468,7 +1469,7 @@
}
],
"description": "Flysystem adapter for the AWS S3 SDK v3.x",
- "time": "2015-11-19 08:44:16"
+ "time": "2016-05-03 19:35:35"
},
{
"name": "league/oauth1-client",
@@ -1647,16 +1648,16 @@
},
{
"name": "mews/purifier",
- "version": "2.0.4",
+ "version": "2.0.5",
"source": {
"type": "git",
"url": "https://github.com/mewebstudio/Purifier.git",
- "reference": "8a242619c848d7477b8ff1b21a54df5ebb7e22d5"
+ "reference": "73c8b50c5626a5d0e416ceea745587d582d10455"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mewebstudio/Purifier/zipball/8a242619c848d7477b8ff1b21a54df5ebb7e22d5",
- "reference": "8a242619c848d7477b8ff1b21a54df5ebb7e22d5",
+ "url": "https://api.github.com/repos/mewebstudio/Purifier/zipball/73c8b50c5626a5d0e416ceea745587d582d10455",
+ "reference": "73c8b50c5626a5d0e416ceea745587d582d10455",
"shasum": ""
},
"require": {
@@ -1705,7 +1706,7 @@
"security",
"xss"
],
- "time": "2016-02-02 14:52:29"
+ "time": "2016-04-26 15:21:32"
},
{
"name": "milon/barcode",
@@ -1982,16 +1983,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v2.0.1",
+ "version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "ce5be709d59b32dd8a88c80259028759991a4206"
+ "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ce5be709d59b32dd8a88c80259028759991a4206",
- "reference": "ce5be709d59b32dd8a88c80259028759991a4206",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
+ "reference": "47b254ea51f1d6d5dc04b9b299e88346bf2369e3",
"shasum": ""
},
"require": {
@@ -2007,7 +2008,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "2.1-dev"
}
},
"autoload": {
@@ -2029,7 +2030,7 @@
"parser",
"php"
],
- "time": "2016-02-28 19:48:28"
+ "time": "2016-04-19 13:41:41"
},
{
"name": "nitmedia/wkhtml2pdf",
@@ -2037,12 +2038,12 @@
"source": {
"type": "git",
"url": "https://github.com/NitMedia/wkhtml2pdf.git",
- "reference": "74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b"
+ "reference": "59d46d6dbda7d54efd045aed8bef0f05a63abd90"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/NitMedia/wkhtml2pdf/zipball/74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b",
- "reference": "74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b",
+ "url": "https://api.github.com/repos/NitMedia/wkhtml2pdf/zipball/59d46d6dbda7d54efd045aed8bef0f05a63abd90",
+ "reference": "59d46d6dbda7d54efd045aed8bef0f05a63abd90",
"shasum": ""
},
"require": {
@@ -2077,7 +2078,7 @@
"wkhtml2pdf",
"wkhtmltopdf"
],
- "time": "2016-03-11 14:25:56"
+ "time": "2016-05-11 19:00:35"
},
{
"name": "omnipay/bitpay",
@@ -2292,16 +2293,16 @@
},
{
"name": "omnipay/paypal",
- "version": "v2.5.3",
+ "version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/omnipay-paypal.git",
- "reference": "97fc3b1ff43e130ee911b35e139dcc853488d07a"
+ "reference": "3d39ab63f9c1e31893ec61bbab9eda98df5f1a6f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/97fc3b1ff43e130ee911b35e139dcc853488d07a",
- "reference": "97fc3b1ff43e130ee911b35e139dcc853488d07a",
+ "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/3d39ab63f9c1e31893ec61bbab9eda98df5f1a6f",
+ "reference": "3d39ab63f9c1e31893ec61bbab9eda98df5f1a6f",
"shasum": ""
},
"require": {
@@ -2346,20 +2347,20 @@
"paypal",
"purchase"
],
- "time": "2016-02-29 00:06:43"
+ "time": "2016-03-25 10:40:17"
},
{
"name": "omnipay/stripe",
- "version": "v2.3.2",
+ "version": "v2.3.3",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/omnipay-stripe.git",
- "reference": "fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4"
+ "reference": "0ea7a647ee01e29c152814e11c2ea6307e5b0db9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/omnipay-stripe/zipball/fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4",
- "reference": "fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4",
+ "url": "https://api.github.com/repos/thephpleague/omnipay-stripe/zipball/0ea7a647ee01e29c152814e11c2ea6307e5b0db9",
+ "reference": "0ea7a647ee01e29c152814e11c2ea6307e5b0db9",
"shasum": ""
},
"require": {
@@ -2403,7 +2404,7 @@
"payment",
"stripe"
],
- "time": "2016-03-19 08:35:06"
+ "time": "2016-04-26 08:34:50"
},
{
"name": "paragonie/random_compat",
@@ -2453,6 +2454,56 @@
],
"time": "2016-03-18 20:34:03"
},
+ {
+ "name": "pda/pheanstalk",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pda/pheanstalk.git",
+ "reference": "430e77c551479aad0c6ada0450ee844cf656a18b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pda/pheanstalk/zipball/430e77c551479aad0c6ada0450ee844cf656a18b",
+ "reference": "430e77c551479aad0c6ada0450ee844cf656a18b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Pheanstalk\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Annesley",
+ "email": "paul@annesley.cc",
+ "homepage": "http://paul.annesley.cc/",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP client for beanstalkd queue",
+ "homepage": "https://github.com/pda/pheanstalk",
+ "keywords": [
+ "beanstalkd"
+ ],
+ "time": "2015-08-07 21:42:41"
+ },
{
"name": "phenx/php-font-lib",
"version": "0.4",
@@ -2578,6 +2629,56 @@
],
"time": "2015-05-01 07:00:55"
},
+ {
+ "name": "predis/predis",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nrk/predis.git",
+ "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nrk/predis/zipball/84060b9034d756b4d79641667d7f9efe1aeb8e04",
+ "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "ext-curl": "Allows access to Webdis when paired with phpiredis",
+ "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Predis\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniele Alessandri",
+ "email": "suppakilla@gmail.com",
+ "homepage": "http://clorophilla.net"
+ }
+ ],
+ "description": "Flexible and feature-complete PHP client library for Redis",
+ "homepage": "http://github.com/nrk/predis",
+ "keywords": [
+ "nosql",
+ "predis",
+ "redis"
+ ],
+ "time": "2015-07-30 18:34:15"
+ },
{
"name": "psr/http-message",
"version": "1.0",
@@ -2739,16 +2840,16 @@
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v5.4.1",
+ "version": "v5.4.2",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421"
+ "reference": "d8db871a54619458a805229a057ea2af33c753e8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421",
- "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/d8db871a54619458a805229a057ea2af33c753e8",
+ "reference": "d8db871a54619458a805229a057ea2af33c753e8",
"shasum": ""
},
"require": {
@@ -2788,20 +2889,20 @@
"mail",
"mailer"
],
- "time": "2015-06-06 14:19:39"
+ "time": "2016-05-01 08:45:47"
},
{
"name": "symfony/console",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd"
+ "reference": "34a214710e0714b6efcf40ba3cd1e31373a97820"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/6b1175135bc2a74c08a28d89761272de8beed8cd",
- "reference": "6b1175135bc2a74c08a28d89761272de8beed8cd",
+ "url": "https://api.github.com/repos/symfony/console/zipball/34a214710e0714b6efcf40ba3cd1e31373a97820",
+ "reference": "34a214710e0714b6efcf40ba3cd1e31373a97820",
"shasum": ""
},
"require": {
@@ -2848,11 +2949,11 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2016-03-16 17:00:50"
+ "time": "2016-04-28 09:48:42"
},
{
"name": "symfony/css-selector",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
@@ -2905,7 +3006,7 @@
},
{
"name": "symfony/debug",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
@@ -2962,16 +3063,16 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v2.8.4",
+ "version": "v2.8.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "47d2d8cade9b1c3987573d2943bb9352536cdb87"
+ "reference": "a158f13992a3147d466af7a23b564ac719a4ddd8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/47d2d8cade9b1c3987573d2943bb9352536cdb87",
- "reference": "47d2d8cade9b1c3987573d2943bb9352536cdb87",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a158f13992a3147d466af7a23b564ac719a4ddd8",
+ "reference": "a158f13992a3147d466af7a23b564ac719a4ddd8",
"shasum": ""
},
"require": {
@@ -3018,11 +3119,11 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2016-03-07 14:04:32"
+ "time": "2016-05-03 18:59:18"
},
{
"name": "symfony/finder",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
@@ -3071,16 +3172,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v2.8.4",
+ "version": "v2.8.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "06d6b2c755b2f34ce21e688b62072e9c625709c4"
+ "reference": "ed9357bf86f041bd69a197742ee22c97989467d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/06d6b2c755b2f34ce21e688b62072e9c625709c4",
- "reference": "06d6b2c755b2f34ce21e688b62072e9c625709c4",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ed9357bf86f041bd69a197742ee22c97989467d7",
+ "reference": "ed9357bf86f041bd69a197742ee22c97989467d7",
"shasum": ""
},
"require": {
@@ -3122,20 +3223,20 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2016-03-27 12:57:53"
+ "time": "2016-04-05 16:36:54"
},
{
"name": "symfony/http-kernel",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "579f828489659d7b3430f4bd9b67b4618b387dea"
+ "reference": "6a5010978edf0a9646342232531e53bfc7abbcd3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/579f828489659d7b3430f4bd9b67b4618b387dea",
- "reference": "579f828489659d7b3430f4bd9b67b4618b387dea",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6a5010978edf0a9646342232531e53bfc7abbcd3",
+ "reference": "6a5010978edf0a9646342232531e53bfc7abbcd3",
"shasum": ""
},
"require": {
@@ -3204,20 +3305,20 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2016-03-25 01:41:20"
+ "time": "2016-05-09 22:13:13"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "1289d16209491b584839022f29257ad859b8532d"
+ "reference": "dff51f72b0706335131b00a7f49606168c582594"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d",
- "reference": "1289d16209491b584839022f29257ad859b8532d",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
+ "reference": "dff51f72b0706335131b00a7f49606168c582594",
"shasum": ""
},
"require": {
@@ -3229,7 +3330,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -3263,20 +3364,20 @@
"portable",
"shim"
],
- "time": "2016-01-20 09:13:37"
+ "time": "2016-05-18 14:26:46"
},
{
"name": "symfony/polyfill-php54",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php54.git",
- "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb"
+ "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/9ba741ca01c77282ecf5796c2c1d667f03454ffb",
- "reference": "9ba741ca01c77282ecf5796c2c1d667f03454ffb",
+ "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1",
+ "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1",
"shasum": ""
},
"require": {
@@ -3285,7 +3386,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -3321,20 +3422,20 @@
"portable",
"shim"
],
- "time": "2016-01-25 19:13:00"
+ "time": "2016-05-18 14:26:46"
},
{
"name": "symfony/polyfill-php55",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php55.git",
- "reference": "b4f3f07d91702f8f926339fc4fcf81671d8c27e6"
+ "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/b4f3f07d91702f8f926339fc4fcf81671d8c27e6",
- "reference": "b4f3f07d91702f8f926339fc4fcf81671d8c27e6",
+ "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d",
+ "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d",
"shasum": ""
},
"require": {
@@ -3344,7 +3445,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -3377,20 +3478,20 @@
"portable",
"shim"
],
- "time": "2016-01-20 09:13:37"
+ "time": "2016-05-18 14:26:46"
},
{
"name": "symfony/polyfill-php56",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "4d891fff050101a53a4caabb03277284942d1ad9"
+ "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9",
- "reference": "4d891fff050101a53a4caabb03277284942d1ad9",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a",
+ "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a",
"shasum": ""
},
"require": {
@@ -3400,7 +3501,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -3433,20 +3534,20 @@
"portable",
"shim"
],
- "time": "2016-01-20 09:13:37"
+ "time": "2016-05-18 14:26:46"
},
{
"name": "symfony/polyfill-util",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-util.git",
- "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4"
+ "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4",
- "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4",
+ "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99",
+ "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99",
"shasum": ""
},
"require": {
@@ -3455,7 +3556,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -3485,20 +3586,20 @@
"polyfill",
"shim"
],
- "time": "2016-01-20 09:13:37"
+ "time": "2016-05-18 14:26:46"
},
{
"name": "symfony/process",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "e6f1f98bbd355d209a992bfff45e7edfbd4a0776"
+ "reference": "53f9407c0bb1c5a79127db8f7bfe12f0f6f3dcdb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/e6f1f98bbd355d209a992bfff45e7edfbd4a0776",
- "reference": "e6f1f98bbd355d209a992bfff45e7edfbd4a0776",
+ "url": "https://api.github.com/repos/symfony/process/zipball/53f9407c0bb1c5a79127db8f7bfe12f0f6f3dcdb",
+ "reference": "53f9407c0bb1c5a79127db8f7bfe12f0f6f3dcdb",
"shasum": ""
},
"require": {
@@ -3534,20 +3635,20 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2016-03-30 10:41:14"
+ "time": "2016-04-14 15:30:28"
},
{
"name": "symfony/routing",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "d061b609f2d0769494c381ec92f5c5cc5e4a20aa"
+ "reference": "a6cd168310066176599442aa21f5da86c3f8e0b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/d061b609f2d0769494c381ec92f5c5cc5e4a20aa",
- "reference": "d061b609f2d0769494c381ec92f5c5cc5e4a20aa",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/a6cd168310066176599442aa21f5da86c3f8e0b3",
+ "reference": "a6cd168310066176599442aa21f5da86c3f8e0b3",
"shasum": ""
},
"require": {
@@ -3609,11 +3710,11 @@
"uri",
"url"
],
- "time": "2016-03-23 13:23:25"
+ "time": "2016-05-03 12:23:49"
},
{
"name": "symfony/translation",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
@@ -3677,16 +3778,16 @@
},
{
"name": "symfony/var-dumper",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "3841ed86527d18ee2c35fe4afb1b2fc60f8fae79"
+ "reference": "0e918c269093ba4c77fca14e9424fa74ed16f1a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3841ed86527d18ee2c35fe4afb1b2fc60f8fae79",
- "reference": "3841ed86527d18ee2c35fe4afb1b2fc60f8fae79",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e918c269093ba4c77fca14e9424fa74ed16f1a6",
+ "reference": "0e918c269093ba4c77fca14e9424fa74ed16f1a6",
"shasum": ""
},
"require": {
@@ -3736,7 +3837,7 @@
"debug",
"dump"
],
- "time": "2016-03-10 10:34:12"
+ "time": "2016-04-25 11:17:47"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -3837,23 +3938,23 @@
},
{
"name": "vlucas/phpdotenv",
- "version": "v2.2.0",
+ "version": "v2.2.1",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "9caf304153dc2288e4970caec6f1f3b3bc205412"
+ "reference": "63f37b9395e8041cd4313129c08ece896d06ca8e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/9caf304153dc2288e4970caec6f1f3b3bc205412",
- "reference": "9caf304153dc2288e4970caec6f1f3b3bc205412",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/63f37b9395e8041cd4313129c08ece896d06ca8e",
+ "reference": "63f37b9395e8041cd4313129c08ece896d06ca8e",
"shasum": ""
},
"require": {
"php": ">=5.3.9"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.0"
+ "phpunit/phpunit": "^4.8 || ^5.0"
},
"type": "library",
"extra": {
@@ -3868,7 +3969,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD"
+ "BSD-3-Clause-Attribution"
],
"authors": [
{
@@ -3878,13 +3979,12 @@
}
],
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
- "homepage": "http://github.com/vlucas/phpdotenv",
"keywords": [
"dotenv",
"env",
"environment"
],
- "time": "2015-12-29 15:10:30"
+ "time": "2016-04-15 10:48:49"
}
],
"packages-dev": [
@@ -4409,33 +4509,29 @@
},
{
"name": "fzaninotto/faker",
- "version": "v1.5.0",
+ "version": "v1.6.0",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
- "reference": "d0190b156bcca848d401fb80f31f504f37141c8d"
+ "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d",
- "reference": "d0190b156bcca848d401fb80f31f504f37141c8d",
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123",
+ "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^5.3.3|^7.0"
},
"require-dev": {
+ "ext-intl": "*",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "~1.5"
},
- "suggest": {
- "ext-intl": "*"
- },
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.5.x-dev"
- }
+ "branch-alias": []
},
"autoload": {
"psr-4": {
@@ -4457,7 +4553,7 @@
"faker",
"fixtures"
],
- "time": "2015-05-29 06:29:14"
+ "time": "2016-04-29 12:21:54"
},
{
"name": "phpdocumentor/reflection-docblock",
@@ -4834,21 +4930,24 @@
},
{
"name": "phpunit/php-timer",
- "version": "1.0.7",
+ "version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
- "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
"type": "library",
"autoload": {
"classmap": [
@@ -4871,7 +4970,7 @@
"keywords": [
"timer"
],
- "time": "2015-06-21 08:01:12"
+ "time": "2016-05-12 18:03:57"
},
{
"name": "phpunit/php-token-stream",
@@ -4924,16 +5023,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "4.8.24",
+ "version": "4.8.26",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "a1066c562c52900a142a0e2bbf0582994671385e"
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e",
- "reference": "a1066c562c52900a142a0e2bbf0582994671385e",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74",
"shasum": ""
},
"require": {
@@ -4947,7 +5046,7 @@
"phpunit/php-code-coverage": "~2.1",
"phpunit/php-file-iterator": "~1.4",
"phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": ">=1.0.6",
+ "phpunit/php-timer": "^1.0.6",
"phpunit/phpunit-mock-objects": "~2.3",
"sebastian/comparator": "~1.1",
"sebastian/diff": "~1.2",
@@ -4992,7 +5091,7 @@
"testing",
"xunit"
],
- "time": "2016-03-14 06:16:08"
+ "time": "2016-05-17 03:09:28"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -5168,16 +5267,16 @@
},
{
"name": "sebastian/environment",
- "version": "1.3.5",
+ "version": "1.3.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf"
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf",
- "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
"shasum": ""
},
"require": {
@@ -5214,7 +5313,7 @@
"environment",
"hhvm"
],
- "time": "2016-02-26 18:40:46"
+ "time": "2016-05-17 03:18:57"
},
{
"name": "sebastian/exporter",
@@ -5423,7 +5522,7 @@
},
{
"name": "symfony/class-loader",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/class-loader.git",
@@ -5479,16 +5578,16 @@
},
{
"name": "symfony/dom-crawler",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f"
+ "reference": "49b588841225b205700e5122fa01911cabada857"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/18a06d7a9af41718c20764a674a0ebba3bc40d1f",
- "reference": "18a06d7a9af41718c20764a674a0ebba3bc40d1f",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/49b588841225b205700e5122fa01911cabada857",
+ "reference": "49b588841225b205700e5122fa01911cabada857",
"shasum": ""
},
"require": {
@@ -5531,11 +5630,11 @@
],
"description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2016-03-23 13:23:25"
+ "time": "2016-04-12 18:09:53"
},
{
"name": "symfony/yaml",
- "version": "v3.0.4",
+ "version": "v3.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
diff --git a/config/database.php b/config/database.php
index 97cfa58f..9cd3450b 100644
--- a/config/database.php
+++ b/config/database.php
@@ -115,7 +115,7 @@ return [
'cluster' => false,
'default' => [
- 'host' => '127.0.0.1',
+ 'host' => 'redis',
'port' => 6379,
'database' => 0,
],
diff --git a/docker-compose.yml b/docker-compose.yml
index 8bd849e0..0efe2923 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -13,8 +13,19 @@ php:
links:
- db
- maildev
+ - redis
volumes:
- .:/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:
image: postgres
environment:
@@ -29,3 +40,5 @@ maildev:
image: djfarrelly/maildev
ports:
- "1080:80"
+redis:
+ image: redis
diff --git a/resources/views/Emails/AttendeeTicketResend.blade.php b/resources/views/Mailers/TicketMailer/SendAttendeeTicket.blade.php
similarity index 58%
rename from resources/views/Emails/AttendeeTicketResend.blade.php
rename to resources/views/Mailers/TicketMailer/SendAttendeeTicket.blade.php
index 44a06b58..d186164e 100644
--- a/resources/views/Emails/AttendeeTicketResend.blade.php
+++ b/resources/views/Mailers/TicketMailer/SendAttendeeTicket.blade.php
@@ -3,7 +3,7 @@
@section('message_content')
Hello {{$attendee->first_name}},
-Your ticket for the event {{$order->event->title}} is attached to this email.
+Your ticket for the event {{$attendee->order->event->title}} is attached to this email.
diff --git a/resources/views/Mailers/TicketMailer/SendOrderTickets.php b/resources/views/Mailers/TicketMailer/SendOrderTickets.php
new file mode 100644
index 00000000..db438837
--- /dev/null
+++ b/resources/views/Mailers/TicketMailer/SendOrderTickets.php
@@ -0,0 +1,91 @@
+@extends('Emails.Layouts.Master')
+
+@section('message_content')
+Hello,
+
+Your order for the event {{$order->event->title}} was successful.
+
+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])}}
+
+
+
| + Ticket + | ++ Qty. + | ++ Price + | ++ Fee + | ++ Total + | +|
| + {{$order_item->title}} + | ++ {{$order_item->quantity}} + | ++ @if((int)ceil($order_item->unit_price) == 0) + FREE + @else + {{money($order_item->unit_price, $order->event->currency->code)}} + @endif + + | ++ @if((int)ceil($order_item->unit_price) == 0) + - + @else + {{money($order_item->unit_booking_fee, $order->event->currency->code)}} + @endif + + | ++ @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 + + | +|
| + | ++ | ++ | ++ Sub Total + | ++ {{money($order->amount + $order->order_fee, $order->event->currency->code)}} + | +|