- Changed the 'Resend ticket' functionality slightly so attendees only receive their ticket, and not every ticket on the order.

This commit is contained in:
Dave 2016-03-11 15:51:39 +00:00
parent aa1789166d
commit f53ea9bf75
12 changed files with 141 additions and 25 deletions

View File

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

View File

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

View File

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

View File

@ -0,0 +1,80 @@
<?php
namespace App\Commands;
use App\Attendize\mailers\AttendeeMailer;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
use PDF;
class SendAttendeeTicketCommand extends Command implements ShouldQueue, SelfHandling
{
use InteractsWithQueue,
SerializesModels;
public $ticketOrder, $attendee;
/**
* OrderTicketsCommand constructor.
*
* @param \App\Models\Order $ticketOrder
* @param bool|true $sendOrderConfirmation
*/
public function __construct(\App\Models\Attendee $attendee)
{
$this->ticketOrder = $attendee->order;
$this->attendee = $attendee;
}
/**
* @param AttendeeMailer $mailer
*/
public function handle(AttendeeMailer $mailer)
{
Log::info(date('d m y H:i')." - Starting Job {$this->job->getJobId()} ".__CLASS__);
//1 - Generate PDF Tickets
$ticket_path = $this->generateAttendeeTicket();
//2 - Send Tickets / Order confirmation
$mailer->sendAttendeeTicket($this->attendee, $this->ticketOrder, $ticket_path);
Log::info(date('d m y H:i')." - Finished Job {$this->job->getJobId()} ".__CLASS__);
$this->delete();
}
/**
* Create a ticket for an attendee
*
* @todo should the path to the PDF be stored in the DB?
* @todo This probably shouldn't be done here
* @return bool|string
*/
public function generateAttendeeTicket() {
$data = [
'order' => $this->ticketOrder,
'event' => $this->attendee->event,
'tickets' => $this->attendee->event->tickets,
'attendees' => [$this->attendee],
];
$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;
}
}

View File

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

View File

@ -75,4 +75,6 @@ class Attendee extends MyBaseModel
{
return ['created_at', 'updated_at', 'arrival_time'];
}
}

18
composer.lock generated
View File

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

View File

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

View File

@ -351,3 +351,7 @@ input[readonly] {
background-color: white !important;
cursor: text !important;
}
html.working {
cursor: progress;
}

View File

@ -0,0 +1,11 @@
@extends('Emails.Layouts.Master')
@section('message_content')
Hello {{$attendee->first_name}},<br><br>
Your ticket for the event <b>{{$order->event->title}}</b> is attached to this email.
<br><br>
Thank you
@stop

View File

@ -11,7 +11,7 @@
</div>
<div class="modal-body">
<div class="help-block">
The attendee will be sent another copy of their ticket to <b>{{$attendee->event->organiser->email}}</b>
The attendee will be sent another copy of their ticket to <b>{{$attendee->email}}</b>
</div>
</div> <!-- /end modal body-->
<div class="modal-footer">

View File

@ -16,7 +16,7 @@
<div class="col-md-12">
<div class="form-group">
{!! Form::label('title', 'Event Title', array('class'=>'control-label required')) !!}
{!! Form::text('title', Input::old('title'),array('class'=>'form-control','placeholder'=>'E.g: '.Auth::user()->first_name.'\'s Interational Conference' )) !!}
{!! Form::text('title', Input::old('title'),array('class'=>'form-control','placeholder'=>'E.g: '.Auth::user()->first_name.'\'s International Conference' )) !!}
</div>
<div class="form-group custom-theme">