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