2016-02-29 15:59:36 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
2016-03-05 00:18:10 +00:00
|
|
|
use App\Models\Attendee;
|
2016-02-29 15:59:36 +00:00
|
|
|
use App\Models\Event;
|
|
|
|
|
use App\Models\Order;
|
2016-03-05 00:18:10 +00:00
|
|
|
use DB;
|
|
|
|
|
use Excel;
|
|
|
|
|
use Input;
|
|
|
|
|
use Log;
|
|
|
|
|
use Mail;
|
2016-03-07 17:37:16 +00:00
|
|
|
use Omnipay;
|
2016-03-05 00:18:10 +00:00
|
|
|
use Response;
|
|
|
|
|
use Validator;
|
|
|
|
|
use View;
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
class EventOrdersController extends MyBaseController
|
|
|
|
|
{
|
|
|
|
|
public function showOrders($event_id = '')
|
|
|
|
|
{
|
|
|
|
|
$allowed_sorts = ['first_name', 'email', 'order_reference', 'order_status_id', 'created_at'];
|
|
|
|
|
|
|
|
|
|
$searchQuery = Input::get('q');
|
|
|
|
|
$sort_by = (in_array(Input::get('sort_by'), $allowed_sorts) ? Input::get('sort_by') : 'created_at');
|
|
|
|
|
$sort_order = Input::get('sort_order') == 'asc' ? 'asc' : 'desc';
|
|
|
|
|
|
|
|
|
|
$event = Event::scope()->find($event_id);
|
|
|
|
|
|
|
|
|
|
if ($searchQuery) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Strip the hash from the start of the search term in case people search for
|
|
|
|
|
* order references like '#EDGC67'
|
|
|
|
|
*/
|
|
|
|
|
if ($searchQuery[0] === '#') {
|
|
|
|
|
$searchQuery = str_replace('#', '', $searchQuery);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$orders = $event->orders()
|
|
|
|
|
->where(function ($query) use ($searchQuery) {
|
2016-03-07 17:37:16 +00:00
|
|
|
$query->where('order_reference', 'like', $searchQuery.'%')
|
|
|
|
|
->orWhere('first_name', 'like', $searchQuery.'%')
|
|
|
|
|
->orWhere('email', 'like', $searchQuery.'%')
|
|
|
|
|
->orWhere('last_name', 'like', $searchQuery.'%');
|
2016-02-29 15:59:36 +00:00
|
|
|
})
|
|
|
|
|
->orderBy($sort_by, $sort_order)
|
|
|
|
|
->paginate();
|
|
|
|
|
} else {
|
|
|
|
|
$orders = $event->orders()->orderBy($sort_by, $sort_order)->paginate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'orders' => $orders,
|
|
|
|
|
'event' => $event,
|
|
|
|
|
'sort_by' => $sort_by,
|
2016-02-29 15:59:36 +00:00
|
|
|
'sort_order' => $sort_order,
|
2016-03-07 17:37:16 +00:00
|
|
|
'q' => $searchQuery ? $searchQuery : '',
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return View::make('ManageEvent.Orders', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function manageOrder($order_id)
|
|
|
|
|
{
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => Order::scope()->find($order_id),
|
2016-02-29 15:59:36 +00:00
|
|
|
'modal_id' => Input::get('modal_id'),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return View::make('ManageEvent.Modals.ManageOrder', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function showCancelOrder($order_id)
|
|
|
|
|
{
|
|
|
|
|
$order = Order::scope()->find($order_id);
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => $order,
|
|
|
|
|
'event' => $order->event(),
|
2016-02-29 15:59:36 +00:00
|
|
|
'attendees' => $order->attendees()->withoutCancelled()->get(),
|
2016-03-07 17:37:16 +00:00
|
|
|
'modal_id' => Input::get('modal_id'),
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return View::make('ManageEvent.Modals.CancelOrder', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $order_id
|
2016-03-05 00:18:10 +00:00
|
|
|
*
|
2016-02-29 15:59:36 +00:00
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function postCancelOrder($order_id)
|
|
|
|
|
{
|
|
|
|
|
$rules = [
|
2016-03-05 00:18:10 +00:00
|
|
|
'refund_amount' => ['numeric'],
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
$messages = [
|
|
|
|
|
'refund_amount.integer' => 'Refund amount must only contain numbers.',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$validator = Validator::make(Input::all(), $rules, $messages);
|
|
|
|
|
|
|
|
|
|
if ($validator->fails()) {
|
2016-03-05 00:18:10 +00:00
|
|
|
return Response::json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-05 00:18:10 +00:00
|
|
|
'messages' => $validator->messages()->toArray(),
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$order = Order::scope()->findOrFail($order_id);
|
2016-03-05 00:18:10 +00:00
|
|
|
$refund_order = (Input::get('refund_order') === 'on') ? true : false;
|
2016-02-29 15:59:36 +00:00
|
|
|
$refund_type = Input::get('refund_type');
|
2016-03-14 07:27:31 +00:00
|
|
|
$refund_amount = round(floatval(Input::get('refund_amount')), 2);
|
2016-02-29 15:59:36 +00:00
|
|
|
$attendees = Input::get('attendees');
|
2016-03-05 00:18:10 +00:00
|
|
|
$error_message = false;
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
if ($refund_order && $order->payment_gateway->can_refund) {
|
2016-02-29 15:59:36 +00:00
|
|
|
if (!$order->transaction_id) {
|
|
|
|
|
$error_message = 'Sorry, this order cannot be refunded.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($order->is_refunded) {
|
|
|
|
|
$error_message = 'This order has already been refunded';
|
2016-03-01 12:20:02 +00:00
|
|
|
} elseif ($order->organiser_amount == 0) {
|
2016-02-29 15:59:36 +00:00
|
|
|
$error_message = 'Nothing to refund';
|
2016-03-14 07:27:31 +00:00
|
|
|
} elseif ($refund_type !== 'full' && $refund_amount > round(($order->organiser_amount - $order->amount_refunded), 2)) {
|
2016-03-07 17:37:16 +00:00
|
|
|
$error_message = 'The maximum amount you can refund is '.(money($order->organiser_amount - $order->amount_refunded, $order->event->currency->code));
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
if (!$error_message) {
|
|
|
|
|
try {
|
2016-03-22 15:24:31 +00:00
|
|
|
$gateway = Omnipay::create($order->payment_gateway->name);
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-03-22 15:24:31 +00:00
|
|
|
$gateway->initialize($order->account->getGateway($order->payment_gateway->id)->config);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
if ($refund_type === 'full') { /* Full refund */
|
2016-03-01 12:20:02 +00:00
|
|
|
$refund_amount = $order->organiser_amount - $order->amount_refunded;
|
2016-03-14 07:14:19 +00:00
|
|
|
}
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-03-14 07:14:19 +00:00
|
|
|
$request = $gateway->refund([
|
|
|
|
|
'transactionReference' => $order->transaction_id,
|
|
|
|
|
'amount' => $refund_amount,
|
|
|
|
|
'refundApplicationFee' => floatval($order->booking_fee) > 0 ? true : false,
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-14 07:14:19 +00:00
|
|
|
$response = $request->send();
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-03-14 07:14:19 +00:00
|
|
|
if ($response->isSuccessful()) {
|
|
|
|
|
/* Update the event sales volume*/
|
|
|
|
|
$order->event->decrement('sales_volume', $refund_amount);
|
2016-03-14 07:27:31 +00:00
|
|
|
$order->amount_refunded = round(($order->amount_refunded + $refund_amount), 2);
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-03-14 07:14:19 +00:00
|
|
|
if (($order->organiser_amount - $order->amount_refunded) == 0) {
|
2016-03-07 17:18:55 +00:00
|
|
|
$order->is_refunded = 1;
|
|
|
|
|
$order->order_status_id = config('attendize.order_refunded');
|
|
|
|
|
} else {
|
|
|
|
|
$order->is_partially_refunded = 1;
|
2016-03-14 07:14:19 +00:00
|
|
|
$order->order_status_id = config('attendize.order_partially_refunded');
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-14 07:14:19 +00:00
|
|
|
} else {
|
|
|
|
|
$error_message = $response->getMessage();
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-14 07:14:19 +00:00
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
$order->save();
|
2016-03-07 17:18:55 +00:00
|
|
|
} catch (\Exeption $e) {
|
2016-02-29 15:59:36 +00:00
|
|
|
Log::error($e);
|
|
|
|
|
$error_message = 'There has been a problem processing your refund. Please check your information and try again.';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($error_message) {
|
|
|
|
|
return Response::json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'success',
|
2016-03-05 00:18:10 +00:00
|
|
|
'message' => $error_message,
|
2016-02-29 15:59:36 +00:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Cancel the attendees
|
|
|
|
|
*/
|
|
|
|
|
if ($attendees) {
|
|
|
|
|
foreach ($attendees as $attendee_id) {
|
|
|
|
|
$attendee = Attendee::scope()->where('id', '=', $attendee_id)->first();
|
|
|
|
|
$attendee->is_cancelled = 1;
|
|
|
|
|
$attendee->save();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
\Session::flash('message',
|
2016-03-07 17:37:16 +00:00
|
|
|
(!$refund_amount && !$attendees) ? 'Nothing To Do' : 'Successfully '.($refund_order ? ' Refunded Order' : ' ').($attendees && $refund_order ? ' & ' : '').($attendees ? 'Cancelled Attendee(s)' : ''));
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
return Response::json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'success',
|
2016-03-05 00:18:10 +00:00
|
|
|
'redirectUrl' => '',
|
2016-02-29 15:59:36 +00:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $event_id
|
|
|
|
|
* @param string $export_as Accepted: xls, xlsx, csv, pdf, html
|
|
|
|
|
*/
|
|
|
|
|
public function showExportOrders($event_id, $export_as = 'xls')
|
|
|
|
|
{
|
|
|
|
|
$event = Event::scope()->findOrFail($event_id);
|
|
|
|
|
|
2016-03-07 17:37:16 +00:00
|
|
|
Excel::create('orders-as-of-'.date('d-m-Y-g.i.a'), function ($excel) use ($event) {
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-07 17:37:16 +00:00
|
|
|
$excel->setTitle('Orders For Event: '.$event->title);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
// Chain the setters
|
2016-03-04 23:27:13 +00:00
|
|
|
$excel->setCreator(config('attendize.app_name'))
|
|
|
|
|
->setCompany(config('attendize.app_name'));
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
$excel->sheet('orders_sheet_1', function ($sheet) use ($event) {
|
|
|
|
|
|
|
|
|
|
\DB::connection()->setFetchMode(\PDO::FETCH_ASSOC);
|
|
|
|
|
$data = DB::table('orders')
|
|
|
|
|
->where('orders.event_id', '=', $event->id)
|
|
|
|
|
->where('orders.event_id', '=', $event->id)
|
|
|
|
|
->select([
|
|
|
|
|
'orders.first_name',
|
|
|
|
|
'orders.last_name',
|
|
|
|
|
'orders.email',
|
|
|
|
|
'orders.order_reference',
|
|
|
|
|
'orders.amount',
|
|
|
|
|
\DB::raw("(CASE WHEN orders.is_refunded = 1 THEN 'YES' ELSE 'NO' END) AS `orders.is_refunded`"),
|
|
|
|
|
\DB::raw("(CASE WHEN orders.is_partially_refunded = 1 THEN 'YES' ELSE 'NO' END) AS `orders.is_partially_refunded`"),
|
|
|
|
|
'orders.amount_refunded',
|
2016-03-05 00:18:10 +00:00
|
|
|
'orders.created_at',
|
2016-02-29 15:59:36 +00:00
|
|
|
])->get();
|
|
|
|
|
//DB::raw("(CASE WHEN UNIX_TIMESTAMP(`attendees.arrival_time`) = 0 THEN '---' ELSE 'd' END) AS `attendees.arrival_time`"))
|
|
|
|
|
|
|
|
|
|
$sheet->fromArray($data);
|
|
|
|
|
|
2016-03-05 00:18:10 +00:00
|
|
|
$sheet->row(1, [
|
|
|
|
|
'First Name', 'Last Name', 'Email', 'Order Reference', 'Amount', 'Fully Refunded', 'Partially Refunded', 'Amount Refunded', 'Order Date',
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
// Set gray background on first row
|
|
|
|
|
$sheet->row(1, function ($row) {
|
|
|
|
|
$row->setBackground('#f5f5f5');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
})->export($export_as);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function showMessageOrder($order_id)
|
|
|
|
|
{
|
|
|
|
|
$order = Order::scope()->findOrFail($order_id);
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => $order,
|
|
|
|
|
'event' => $order->event,
|
2016-02-29 15:59:36 +00:00
|
|
|
'modal_id' => Input::get('modal_id'),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return View::make('ManageEvent.Modals.MessageOrder', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function postMessageOrder($order_id)
|
|
|
|
|
{
|
|
|
|
|
$rules = [
|
|
|
|
|
'subject' => 'required|max:250',
|
2016-03-05 00:18:10 +00:00
|
|
|
'message' => 'required|max:5000',
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$validator = Validator::make(Input::all(), $rules);
|
|
|
|
|
|
|
|
|
|
if ($validator->fails()) {
|
2016-03-05 00:18:10 +00:00
|
|
|
return Response::json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-05 00:18:10 +00:00
|
|
|
'messages' => $validator->messages()->toArray(),
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$order = Attendee::scope()->findOrFail($order_id);
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => $order,
|
2016-02-29 15:59:36 +00:00
|
|
|
'message_content' => Input::get('message'),
|
2016-03-07 17:37:16 +00:00
|
|
|
'subject' => Input::get('subject'),
|
|
|
|
|
'event' => $order->event,
|
|
|
|
|
'email_logo' => $order->event->organiser->full_logo_path,
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
Mail::send('Emails.messageOrder', $data, function ($message) use ($order, $data) {
|
|
|
|
|
$message->to($order->email, $order->full_name)
|
2016-03-04 23:27:13 +00:00
|
|
|
->from(config('attendize.outgoing_email_noreply'), $order->event->organiser->name)
|
2016-02-29 15:59:36 +00:00
|
|
|
->replyTo($order->event->organiser->email, $order->event->organiser->name)
|
|
|
|
|
->subject($data['subject']);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/* Could bcc in the above? */
|
|
|
|
|
if (Input::get('send_copy') == '1') {
|
|
|
|
|
Mail::send('Emails.messageOrder', $data, function ($message) use ($order, $data) {
|
|
|
|
|
$message->to($order->event->organiser->email)
|
2016-03-04 23:27:13 +00:00
|
|
|
->from(config('attendize.outgoing_email_noreply'), $order->event->organiser->name)
|
2016-02-29 15:59:36 +00:00
|
|
|
->replyTo($order->event->organiser->email, $order->event->organiser->name)
|
2016-03-07 17:37:16 +00:00
|
|
|
->subject($data['subject'].' [Organiser copy]');
|
2016-02-29 15:59:36 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-05 00:18:10 +00:00
|
|
|
return Response::json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'success',
|
2016-03-05 00:18:10 +00:00
|
|
|
'message' => 'Message Successfully Sent',
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
}
|