diff --git a/app/Attendize/mailers/AttendeeMailer.php b/app/Attendize/mailers/AttendeeMailer.php
index d0673ca4..f2cc7843 100644
--- a/app/Attendize/mailers/AttendeeMailer.php
+++ b/app/Attendize/mailers/AttendeeMailer.php
@@ -4,11 +4,33 @@ namespace App\Attendize\mailers;
use App\Models\Attendee;
use App\Models\Message;
+use App\Models\Order;
use Carbon\Carbon;
use Mail;
class AttendeeMailer extends Mailer
{
+ /**
+ * Send the attendee the ticket
+ *
+ * @param Attendee $attendee
+ * @param Order $order
+ * @param $ticket_path
+ */
+ public function sendAttendeeTicket(Attendee $attendee, Order $order, $ticket_path)
+ {
+ $this->sendTo($attendee->email, config('attendize.outgoing_email'), $order->event->organiser->name, 'Your ticket for the event '.$order->event->title, 'Emails.AttendeeTicketResend', [
+ 'order' => $order,
+ 'email_logo' => $order->event->organiser->full_logo_path,
+ 'attendee' => $attendee
+ ], $ticket_path);
+ }
+
+ /**
+ * Sends the attendees a message
+ *
+ * @param Message $message_object
+ */
public function sendMessageToAttendees(Message $message_object)
{
$event = $message_object->event;
diff --git a/app/Commands/MessageAttendeesCommand.php b/app/Commands/MessageAttendeesCommand.php
index fae56fc2..411046f3 100644
--- a/app/Commands/MessageAttendeesCommand.php
+++ b/app/Commands/MessageAttendeesCommand.php
@@ -4,12 +4,12 @@ namespace App\Commands;
use App\Attendize\mailers\AttendeeMailer;
use Illuminate\Contracts\Bus\SelfHandling;
-use Illuminate\Contracts\Queue\ShouldBeQueued;
+use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
-class MessageAttendeesCommand extends Command implements ShouldBeQueued, SelfHandling
+class MessageAttendeesCommand extends Command implements ShouldQueue, SelfHandling
{
use InteractsWithQueue,
SerializesModels;
diff --git a/app/Commands/OrderTicketsCommand.php b/app/Commands/OrderTicketsCommand.php
index 2a710006..ba9ea696 100644
--- a/app/Commands/OrderTicketsCommand.php
+++ b/app/Commands/OrderTicketsCommand.php
@@ -4,12 +4,12 @@ namespace App\Commands;
use App\Attendize\mailers\OrderMailer;
use Illuminate\Contracts\Bus\SelfHandling;
-use Illuminate\Contracts\Queue\ShouldBeQueued;
+use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
-class OrderTicketsCommand extends Command implements ShouldBeQueued, SelfHandling
+class OrderTicketsCommand extends Command implements ShouldQueue, SelfHandling
{
use InteractsWithQueue,
SerializesModels;
diff --git a/app/Commands/SendAttendeeTicketCommand.php b/app/Commands/SendAttendeeTicketCommand.php
new file mode 100644
index 00000000..c6163e9f
--- /dev/null
+++ b/app/Commands/SendAttendeeTicketCommand.php
@@ -0,0 +1,80 @@
+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],
+ ];
+
+ $pdf_file_name = $this->ticketOrder->order_reference.'-'.$this->attendee->id;
+ $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 c124179b..641e1922 100644
--- a/app/Http/Controllers/EventAttendeesController.php
+++ b/app/Http/Controllers/EventAttendeesController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Commands\OrderTicketsCommand;
+use App\Commands\SendAttendeeTicketCommand;
use App\Models\Attendee;
use App\Models\Event;
use App\Models\EventStats;
@@ -10,16 +11,14 @@ use App\Models\Message;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Ticket;
+use Illuminate\Http\Request;
use Auth;
use DB;
use Excel;
-use Illuminate\Http\Request;
-use Input;
use Mail;
use Response;
use Session;
use Validator;
-use View;
class EventAttendeesController extends MyBaseController
{
@@ -278,7 +277,7 @@ class EventAttendeesController extends MyBaseController
});
/* Could bcc in the above? */
- if (Input::get('send_copy') == '1') {
+ if ($request->get('send_copy') == '1') {
Mail::send('Emails.messageAttendees', $data, function ($message) use ($attendee, $data) {
$message->to($attendee->event->organiser->email, $attendee->event->organiser->name)
->from(config('attendize.outgoing_email_noreply'), $attendee->event->organiser->name)
@@ -299,11 +298,11 @@ class EventAttendeesController extends MyBaseController
* @param $event_id
* @return View
*/
- public function showMessageAttendees($event_id)
+ public function showMessageAttendees(Request $request, $event_id)
{
$data = [
'event' => Event::scope()->find($event_id),
- 'modal_id' => Input::get('modal_id'),
+ 'modal_id' => $request->get('modal_id'),
'tickets' => Event::scope()->find($event_id)->tickets()->lists('title', 'id')->toArray(),
];
@@ -558,9 +557,7 @@ class EventAttendeesController extends MyBaseController
{
$attendee = Attendee::scope()->findOrFail($attendee_id);
- $order = $attendee->order;
-
- $this->dispatch(new OrderTicketsCommand($order, false));
+ $this->dispatch(new SendAttendeeTicketCommand($attendee));
return response()->json([
'status' => 'success',
diff --git a/app/Models/Attendee.php b/app/Models/Attendee.php
index cb59f9db..cd925adc 100644
--- a/app/Models/Attendee.php
+++ b/app/Models/Attendee.php
@@ -75,4 +75,6 @@ class Attendee extends MyBaseModel
{
return ['created_at', 'updated_at', 'arrival_time'];
}
+
+
}
diff --git a/composer.lock b/composer.lock
index d7e0a8ab..ca2ac76d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -9,16 +9,16 @@
"packages": [
{
"name": "aws/aws-sdk-php",
- "version": "3.15.8",
+ "version": "3.15.9",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "94630759de5e55c8e9670ea12b7ded132229696d"
+ "reference": "5f27941e2f1ac1700e667cfcf9d9da44c1d9b612"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/94630759de5e55c8e9670ea12b7ded132229696d",
- "reference": "94630759de5e55c8e9670ea12b7ded132229696d",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5f27941e2f1ac1700e667cfcf9d9da44c1d9b612",
+ "reference": "5f27941e2f1ac1700e667cfcf9d9da44c1d9b612",
"shasum": ""
},
"require": {
@@ -85,7 +85,7 @@
"s3",
"sdk"
],
- "time": "2016-03-08 23:21:09"
+ "time": "2016-03-11 00:44:20"
},
{
"name": "barryvdh/laravel-ide-helper",
@@ -2103,12 +2103,12 @@
"source": {
"type": "git",
"url": "https://github.com/NitMedia/wkhtml2pdf.git",
- "reference": "6d7dc9f8d0021723cd208075f72e63029cebb6ab"
+ "reference": "74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/NitMedia/wkhtml2pdf/zipball/6d7dc9f8d0021723cd208075f72e63029cebb6ab",
- "reference": "6d7dc9f8d0021723cd208075f72e63029cebb6ab",
+ "url": "https://api.github.com/repos/NitMedia/wkhtml2pdf/zipball/74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b",
+ "reference": "74ee44a0d35552f7caa4b9b8a1d3ee8c7e99fd0b",
"shasum": ""
},
"require": {
@@ -2143,7 +2143,7 @@
"wkhtml2pdf",
"wkhtmltopdf"
],
- "time": "2016-02-29 14:44:41"
+ "time": "2016-03-11 14:25:56"
},
{
"name": "omnipay/common",
diff --git a/public/assets/stylesheet/application.css b/public/assets/stylesheet/application.css
index 2ca06a32..16e7dbbd 100644
--- a/public/assets/stylesheet/application.css
+++ b/public/assets/stylesheet/application.css
@@ -149,4 +149,4 @@ body {
font-size: 9px;
font-weight: normal;
}
-.page-title .title .organiser_logo{position:absolute;height:45px;right:20px;top:5px;bottom:5px}.page-title .title .organiser_logo img{max-height:45px}.nav li.nav-button a span{padding:10px;background-color:#037c9c}.event.panel{margin-top:10px}.event .event-date{border:1px solid #fff;padding-bottom:9px;padding-top:7px;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,0.1);width:46px;position:absolute;background-color:#fff;top:-13px;border-color:#0384a6;color:#666}.event .event-date .day{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:22px;font-weight:500;margin:-2px auto -6px auto}.event .event-date .month{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;margin:-2px auto 0 auto}.event .event-meta{margin:0;padding:0;margin-left:60px;height:55px;margin-top:10px;color:#fff}.event .event-meta li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:12px}.event .event-meta li a{color:#fff}.event .event-meta li.event-title a{font-size:16px}.event .event-meta li.event-organiser a{font-weight:bold}.event .panel-title{height:60px;padding:10px}.event .panel-title a{margin:0;height:40px;display:table-cell;vertical-align:middle;text-indent:50px}.stat-box{padding:20px;background-color:#0398bf;color:#fff;text-align:center;margin-bottom:10px;border-bottom:4px solid rgba(0,0,0,0.2)}.stat-box h3{margin-bottom:5px;margin-top:0;font-weight:200}.stat-box span{text-transform:uppercase;font-weight:lighter;color:#d0f0fe}.stat-box:nth-child(odd){background-color:#0384a6}.top_of_page_alert{border:none;margin:0;text-align:center;border-bottom:5px solid}.v-align-text{text-align:center;position:relative;top:50%;-ms-transform:translateY(-50%);-wekbit-transform:translateY(-50%);transform:translateY(-50%)}@media (max-width:992px){.page-header>[class*=" col-"],.page-header>[class^="col-"]{margin-bottom:10px}}@media (max-width:480px){.btn-group-responsive{margin-bottom:-10px;float:none !important;display:block !important}.btn-group-responsive .btn{width:100%;padding-left:0;padding-right:0;margin-bottom:10px}.btn-group-responsive .pull-left,.btn-group-responsive .pull-right{float:none !important}}label.required::after{content:'*';color:red;padding-left:3px;font-size:9px}.hasDatepicker[disabled],.hasDatepicker[readonly],fieldset[disabled] .hasDatepicker{cursor:pointer !important;background-color:#fff !important;opacity:1}.more-options{display:none}.col-sort{color:#fff}.col-sort :hover{color:#fff}.pac-container{z-index:9999}.dtpicker-overlay{z-index:9999}.dtpicker-close{display:none}.dtpicker-header .dtpicker-title{color:#afafaf;text-align:center;font-size:18px;font-weight:normal}.dtpicker-header .dtpicker-value{padding:.8em .2em .2em .2em;color:#0384a6;text-align:center;font-size:1.4em}.dtpicker-buttonCont .dtpicker-button{background:#0384a6;border-radius:0}.dtpicker-content{border-radius:0}.sidebar-open-ltr body{overflow-x:hidden}.order_options{margin:10px 0;padding:5px 15px;margin-top:0}.order_options .event_count{font-weight:bold;color:#777;line-height:30px}.well{background-color:#f9f9f9;box-shadow:none}.input-group-btn select{width:115px !important;border-left:0;font-size:12px}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;background:red;cursor:inherit;display:block}input[readonly]{background-color:white !important;cursor:text !important}
\ No newline at end of file
+.page-title .title .organiser_logo{position:absolute;height:45px;right:20px;top:5px;bottom:5px}.page-title .title .organiser_logo img{max-height:45px}.nav li.nav-button a span{padding:10px;background-color:#037c9c}.event.panel{margin-top:10px}.event .event-date{border:1px solid #fff;padding-bottom:9px;padding-top:7px;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,0.1);width:46px;position:absolute;background-color:#fff;top:-13px;border-color:#0384a6;color:#666}.event .event-date .day{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:22px;font-weight:500;margin:-2px auto -6px auto}.event .event-date .month{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;margin:-2px auto 0 auto}.event .event-meta{margin:0;padding:0;margin-left:60px;height:55px;margin-top:10px;color:#fff}.event .event-meta li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:12px}.event .event-meta li a{color:#fff}.event .event-meta li.event-title a{font-size:16px}.event .event-meta li.event-organiser a{font-weight:bold}.event .panel-title{height:60px;padding:10px}.event .panel-title a{margin:0;height:40px;display:table-cell;vertical-align:middle;text-indent:50px}.stat-box{padding:20px;background-color:#0398bf;color:#fff;text-align:center;margin-bottom:10px;border-bottom:4px solid rgba(0,0,0,0.2)}.stat-box h3{margin-bottom:5px;margin-top:0;font-weight:200}.stat-box span{text-transform:uppercase;font-weight:lighter;color:#d0f0fe}.stat-box:nth-child(odd){background-color:#0384a6}.top_of_page_alert{border:none;margin:0;text-align:center;border-bottom:5px solid}.v-align-text{text-align:center;position:relative;top:50%;-ms-transform:translateY(-50%);-wekbit-transform:translateY(-50%);transform:translateY(-50%)}@media (max-width:992px){.page-header>[class*=" col-"],.page-header>[class^="col-"]{margin-bottom:10px}}@media (max-width:480px){.btn-group-responsive{margin-bottom:-10px;float:none !important;display:block !important}.btn-group-responsive .btn{width:100%;padding-left:0;padding-right:0;margin-bottom:10px}.btn-group-responsive .pull-left,.btn-group-responsive .pull-right{float:none !important}}label.required::after{content:'*';color:red;padding-left:3px;font-size:9px}.hasDatepicker[disabled],.hasDatepicker[readonly],fieldset[disabled] .hasDatepicker{cursor:pointer !important;background-color:#fff !important;opacity:1}.more-options{display:none}.col-sort{color:#fff}.col-sort :hover{color:#fff}.pac-container{z-index:9999}.dtpicker-overlay{z-index:9999}.dtpicker-close{display:none}.dtpicker-header .dtpicker-title{color:#afafaf;text-align:center;font-size:18px;font-weight:normal}.dtpicker-header .dtpicker-value{padding:.8em .2em .2em .2em;color:#0384a6;text-align:center;font-size:1.4em}.dtpicker-buttonCont .dtpicker-button{background:#0384a6;border-radius:0}.dtpicker-content{border-radius:0}.sidebar-open-ltr body{overflow-x:hidden}.order_options{margin:10px 0;padding:5px 15px;margin-top:0}.order_options .event_count{font-weight:bold;color:#777;line-height:30px}.well{background-color:#f9f9f9;box-shadow:none}.input-group-btn select{width:115px !important;border-left:0;font-size:12px}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;background:red;cursor:inherit;display:block}input[readonly]{background-color:white !important;cursor:text !important}html.working{cursor:progress}
\ No newline at end of file
diff --git a/public/assets/stylesheet/custom.less b/public/assets/stylesheet/custom.less
index 93d29011..7457d543 100644
--- a/public/assets/stylesheet/custom.less
+++ b/public/assets/stylesheet/custom.less
@@ -351,3 +351,7 @@ input[readonly] {
background-color: white !important;
cursor: text !important;
}
+
+html.working {
+ cursor: progress;
+}
\ No newline at end of file
diff --git a/resources/views/Emails/AttendeeTicketResend.blade.php b/resources/views/Emails/AttendeeTicketResend.blade.php
new file mode 100644
index 00000000..44a06b58
--- /dev/null
+++ b/resources/views/Emails/AttendeeTicketResend.blade.php
@@ -0,0 +1,11 @@
+@extends('Emails.Layouts.Master')
+
+@section('message_content')
+Hello {{$attendee->first_name}},
+
+Your ticket for the event {{$order->event->title}} is attached to this email.
+
+
+
+Thank you
+@stop
diff --git a/resources/views/ManageEvent/Modals/ResendTicketToAttendee.blade.php b/resources/views/ManageEvent/Modals/ResendTicketToAttendee.blade.php
index d6f3665d..62bdf8a8 100644
--- a/resources/views/ManageEvent/Modals/ResendTicketToAttendee.blade.php
+++ b/resources/views/ManageEvent/Modals/ResendTicketToAttendee.blade.php
@@ -11,7 +11,7 @@