File: D:/HostingSpaces/SBogers10/farmfun.komma.pro/app/Komma/Checkout/CheckoutController.php
<?php
namespace App\Komma\Checkout;
use App\Http\Requests\CheckoutDataRequest;
use App\Http\Requests\CheckoutSummaryRequest;
use App\Komma\Base\Controller;
use App\Komma\Mailchimp\Mailchimp;
use App\Komma\Mailchimp\Types\ListMember;
use App\Komma\Orders\Models\Order;
use App\Komma\Orders\OrderService;
use App\Komma\Reservations\Models\Reservation;
use App\Komma\Reservations\ReservationService;
use App\Komma\Shop\Vies\ViesResult;
use App\Komma\Shop\Vies\ViesService;
use App\Komma\ShoppingCart\Interfaces\ShoppingCartInterface;
use App\Komma\Teamleader\TeamleaderService;
use App\Mail\OrderReceivedAdminMail;
use App\Mail\OrderReceivedMail;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\MessageBag;
final class CheckoutController extends Controller
{
/** @var CheckoutService */
private $checkoutService;
public function __construct()
{
$this->checkoutService = app(CheckoutService::class);
parent::__construct();
}
/**
* The data step of the checkout
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function data()
{
/** @var ShoppingCartInterface $shoppingCart */
$shoppingCart = app()->make(ShoppingCartInterface::class);
// Validate shopping cart for checkout
if ($redirectResponse = $this->validateShoppingCartForCheckout($shoppingCart)) {
return $redirectResponse;
}
session(['old_session' => $this->checkoutService->getCheckoutData()]);
return view('site.templates.checkout_data', [
'links' => $this->links,
]);
}
/**
* Summary step of the checkout
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function summary()
{
/** @var ShoppingCartInterface $shoppingCart */
$shoppingCart = app()->make(ShoppingCartInterface::class);
// Validate shopping cart for checkout
if ($redirectResponse = $this->validateShoppingCartForCheckout($shoppingCart)) {
return $redirectResponse;
}
// Get the checkout data
$checkoutData = $this->checkoutService->getCheckoutData();
// If checkout data is empty, redirect to data view
if (empty($checkoutData)) {
return redirect(localized_route('checkout.data.show'));
}
return view('site.templates.checkout_summary', [
'links' => $this->links,
'shoppingCart' => $shoppingCart,
'checkoutData' => $checkoutData,
]);
}
/**
* The success page of the checkout
*
* @return View
*/
public function success(): View
{
return view('site.templates.checkout_success', [
'links' => $this->links,
]);
}
/**
* The error page of the checkout
*
* @return View
*/
public function error(): View
{
return view('site.templates.checkout_error', [
'links' => $this->links,
]);
}
/**
* Make sure that there is at least one item in the cart
* Else redirect to the booking page
*
* @param ShoppingCartInterface $shoppingCart
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|null
*/
private function validateShoppingCartForCheckout(ShoppingCartInterface $shoppingCart)
{
if ($shoppingCart->getItemsCount() < 1) {
// TODO Make some kind of classes for this
$flashMessages = new MessageBag([
[
'type' => 'warning',
'message' => __('site/checkout.empty_cart'),
],
]);
return redirect(localized_route('shoppingCart'))->with([
'flashMessages' => $flashMessages,
]);
}
return null;
}
/**
* Validate the checkout data
*
* @param CheckoutDataRequest $checkoutDataRequest
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function validateData(CheckoutDataRequest $checkoutDataRequest)
{
// Remove token
$checkoutData = $checkoutDataRequest->except(['_token']);
// Unset company info if private
if ($checkoutData['client_type'] == config('site.client_types.private')) {
unset($checkoutData['company_name']);
unset($checkoutData['company_vat_number']);
unset($checkoutData['po_number']);
}
// Validate vat number if isset
if (! empty($checkoutData['company_vat_number'])) {
/** @var ViesService $viesService */
$viesService = app()->make(ViesService::class);
$viesResult = $viesService->validateVatNumber($checkoutData['company_vat_number']);
if (empty($viesResult) || ! is_a($viesResult, ViesResult::class)) {
$checkoutData['vies_found'] = false;
$checkoutData['vies_valid'] = false;
$checkoutData['vies_result'] = null;
} else {
$checkoutData['vies_found'] = true;
$checkoutData['vies_valid'] = $viesResult->getName() === strtoupper($checkoutData['company_name']);
$checkoutData['vies_result'] = $viesResult;
}
}
// Set as checkout send invoice to boolean instead of on
$checkoutData['checkout_send_invoice_to_other_email'] = $checkoutDataRequest->get('checkout_send_invoice_to_other_email') === 'on';
if ($checkoutData['checkout_send_invoice_to_other_email'] == false) {
unset($checkoutData['checkout_email_for_invoice']);
}
// Convert postal to desired format (without space and uppercase
$checkoutData['invoice_postal_code'] = strtoupper(preg_replace('/\s+/', '', $checkoutData['invoice_postal_code']));
// Set checkout data
$this->checkoutService->setCheckoutData((object) $checkoutData);
return redirect(localized_route('checkout.summary.show'));
}
/**
* Validate that the user accepted the legal and privacy statement by the CheckoutSummaryRequest
* Also update the checkout data with the subscribe_to_newsletter boolean
*
* Then create the order and redirect to the success page
* Or if something goes wrong to the error page.
*
* @param CheckoutSummaryRequest $checkoutSummaryRequest
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function validateSummary(CheckoutSummaryRequest $checkoutSummaryRequest)
{
/** @var ShoppingCartInterface $shoppingCart */
$shoppingCart = app()->make(ShoppingCartInterface::class);
// Validate shopping cart for checkout
if ($redirectResponse = $this->validateShoppingCartForCheckout($shoppingCart)) {
return $redirectResponse;
}
// Get the checkout data
$checkoutData = $this->checkoutService->getCheckoutData();
// If checkout data is empty, redirect to data view
if (empty($checkoutData)) {
return redirect(localized_route('checkout.data.show'));
}
// Set subscribe to newsletter to checkout data
$checkoutData->subscribe_to_newsletter = $checkoutSummaryRequest->get('checkout_newsletter') === 'on';
// Update checkout data with subscribe to newsletter
$this->checkoutService->setCheckoutData($checkoutData);
try {
/** @var OrderService $orderService */
$orderService = app()->make(OrderService::class);
// Create order
$order = $orderService->createOrder($shoppingCart, $checkoutData);
// Append to mailchimp if subscribe checkbox is active
if (isset($checkoutData->subscribe_to_newsletter) && $checkoutData->subscribe_to_newsletter) {
/** @var Mailchimp $mailchimp */
$mailchimp = app()->make(Mailchimp::class);
$listMember = new ListMember($checkoutData->email);
$listMember->addTag('Bestelling aanvraag');
$listMember->addFirstName($checkoutData->first_name);
// Check if we need to merge the name preposition and last name
if (! empty($checkoutData->name_preposition)) {
$lastName = $checkoutData->name_preposition.' '.$checkoutData->last_name;
} else {
$lastName = $checkoutData->last_name;
}
$listMember->addLastName($lastName);
$mailchimp->addNewListMember($listMember);
}
/** @var ReservationService $reservationService */
$reservationService = app()->make(ReservationService::class);
$reservation = $reservationService->createReservation($shoppingCart, $order);
if (app()->environment() === 'production'){
$teamleaderService = new TeamleaderService();
[$savedToTeamleader, $messageLines] = $teamleaderService->insertOrderIntoTeamleader($order, $reservation);
}else{
$savedToTeamleader = false;
$messageLines = ['Vanwege test omgeving niet beschikbaar'];
}
// Send mailings
Mail::send(new OrderReceivedMail($order, $shoppingCart->getLocation(), $reservation));
Mail::send(new OrderReceivedAdminMail($order, $shoppingCart->getLocation(), $savedToTeamleader, $messageLines));
// Clear sessions
$this->checkoutService->clearCheckoutSession();
$shoppingCart->clear();
return redirect(localized_route('checkout.success'));
} catch (\Exception $e) {
Log::error($e);
return redirect(localized_route('checkout.error'));
}
}
public function previewMail()
{
$order = Order::find(10);
$order->load('lines');
$reservation = Reservation::where('order_id', '=', $order->id)->first();
return new OrderReceivedMail($order, $reservation->location, $reservation);
}
public function previewMailAdmin()
{
$order = Order::find(16);
$order->load('lines');
$location = Reservation::where('order_id', '=', $order->id)->first()->location;
return new OrderReceivedAdminMail($order, $location);
}
}