- Changed the 'Resend ticket' functionality slightly so attendees only receive their ticket, and not every ticket on the order.
This commit is contained in:
parent
aa1789166d
commit
f53ea9bf75
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -75,4 +75,6 @@ class Attendee extends MyBaseModel
|
|||
{
|
||||
return ['created_at', 'updated_at', 'arrival_time'];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
@ -351,3 +351,7 @@ input[readonly] {
|
|||
background-color: white !important;
|
||||
cursor: text !important;
|
||||
}
|
||||
|
||||
html.working {
|
||||
cursor: progress;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue