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])}} + + +

Order Details

+Order Reference: {{$order->order_reference}}
+Order Name: {{$order->full_name}}
+Order Date: {{$order->created_at->toDayDateTimeString()}}
+Order Email: {{$order->email}}
+ +

Order Items

+
+ + + + + + + + + @foreach($order->orderItems as $order_item) + + + + + + + + @endforeach + + + + + + + +
+ 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)}} +
+ +

+
+

+Thank you +@stop diff --git a/resources/views/ManageEvent/Attendees.blade.php b/resources/views/ManageEvent/Attendees.blade.php index 4c5888bb..a5ff99a0 100644 --- a/resources/views/ManageEvent/Attendees.blade.php +++ b/resources/views/ManageEvent/Attendees.blade.php @@ -129,6 +129,9 @@ Attendees data-href="{{route('showResendTicketToAttendee', ['attendee_id'=>$attendee->id])}}" class="loadModal" > Resend Ticket +
  • Ticket PDF