HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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);
    }
}