File: //var/www/html/Modules/Checkout/Http/Controllers/CheckoutController.php
<?php
namespace Modules\Checkout\Http\Controllers;
use EonVisualMedia\LaravelKlaviyo\Klaviyo;
use EonVisualMedia\LaravelKlaviyo\TrackEvent;
use Exception;
use Illuminate\Support\Facades\Auth;
use Modules\Support\Country;
use Modules\Cart\Facades\Cart;
use Modules\Page\Entities\Page;
use Illuminate\Routing\Controller;
use Modules\Payment\Facades\Gateway;
use Modules\User\Services\CustomerService;
use Modules\Checkout\Services\OrderService;
use Modules\Address\Entities\DefaultAddress;
use Modules\Cart\Http\Middleware\CheckCartStock;
use Modules\Order\Http\Requests\StoreOrderRequest;
use Modules\Cart\Http\Middleware\CheckCouponUsageLimit;
use Modules\Cart\Http\Middleware\RedirectIfCartIsEmpty;
class CheckoutController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware([
RedirectIfCartIsEmpty::class,
CheckCartStock::class,
CheckCouponUsageLimit::class,
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
Gateway::all();
$user = Auth::user();
$cart = Cart::toArray();
//dd($cart);
if (isset($user->email)) {
//dd($user);
$data = self::getDatas($cart);
Klaviyo::track(TrackEvent::make(
'Started Checkout',
$data,
[
'$email' => $user->email,
'$first_name' => $user->first_name,
'$last_name' => $user->last_name
],
));
}
return view('public.checkout.create', [
'cart' => Cart::instance(),
'countries' => Country::supported(),
'gateways' => Gateway::all(),
'defaultAddress' => auth()->user()->defaultAddress ?? new DefaultAddress,
'addresses' => $this->getAddresses(),
'termsPageURL' => Page::urlForPage(setting('storefront_terms_page')),
]);
}
public function getDatas($cart)
{
$data = [];
$data["Currency"] = "HUF";
$data["CurrencySymbol"] = "Ft";
$data["Categories"] = self::getCategories($cart);
$data["ItemNames"] = self::getItemsName($cart);
$data["\$service"] = "api";
$data["extra"]["Items"] = self::getItems($cart);
$data["extra"]["SubTotal"] = $cart["total"]->convertToCurrentCurrency()->amount()*0.7874;
$data["extra"]["ShippingTotal"] = $cart["shippingCost"]->convertToCurrentCurrency()->amount();
$data["extra"]["TaxTotal"] = $cart["total"]->convertToCurrentCurrency()->amount()*0.2126;
$data["extra"]["GrandTotal"] = $cart["total"]->convertToCurrentCurrency()->amount()+$cart["shippingCost"]->convertToCurrentCurrency()->amount();
$data["extra"]["CartRebuildKey"] = rand();
$data["\$value"] = $cart["total"]->convertToCurrentCurrency()->amount()+$cart["shippingCost"]->convertToCurrentCurrency()->amount();
//dd($data);
return $data;
}
public function getItemsName($cart)
{
$data = [];
$i = 0;
foreach ($cart["items"] as $item) {
$data[] = $item->product->name;
}
return $data;
}
public function getCategories($cart)
{
$data = [];
$i = 0;
foreach ($cart["items"] as $item) {
foreach ($item->product->categories as $category) {
$data[] = $category->name;
}
}
return $data;
}
public function getItems($cart)
{
$data = [];
$i = 0;
foreach ($cart["items"] as $item) {
$data[$i] = [
"Quantity" => $item->qty,
"ProductID" => $item->product->sku,
"VariantID" => "",
"Name" => $item->product->name,
"URL" => "https://royaltuning.hu/termek/" . $item->product->slug,
"Images" => [
0 => [
"URL" => $item->product->base_image->path
]
],
"Categories" => [
0 => $item->product->categories[0]->name
],
"Variation" => [],
"SubTotal" => $item->product->selling_price->convertToCurrentCurrency()->amount() * 0.2126,
"Total" => $item->product->selling_price->convertToCurrentCurrency()->amount() - ($item->product->selling_price->convertToCurrentCurrency()->amount() * 0.2126),
"LineTotal" => ($item->product->selling_price->convertToCurrentCurrency()->amount() * 0.2126) * $item->qty,
"Tax" => $item->product->selling_price->convertToCurrentCurrency()->amount() * 0.2126 * $item->qty,
"TotalWithTax" => $item->product->selling_price->convertToCurrentCurrency()->amount() * $item->qty
];
$i++;
//dd($data);
return $data;
}
}
/**
* Get addresses for the logged in user.
*
* @return \Illuminate\Support\Collection
*/
private
function getAddresses()
{
if (auth()->guest()) {
return collect();
}
return auth()->user()->addresses->keyBy('id');
}
/**
* Store a newly created resource in storage.
*
* @param \Modules\Order\Http\Requests\StoreOrderRequest $request
* @param \Modules\User\Services\CustomerService $customerService
* @param \Modules\Checkout\Services\OrderService $orderService
* @return \Illuminate\Http\Response
*/
public
function store(StoreOrderRequest $request, CustomerService $customerService, OrderService $orderService)
{
if (auth()->guest() && $request->create_an_account) {
$customerService->register($request)->login();
}
$order = $orderService->create($request);
$gateway = Gateway::get($request->payment_method);
try {
$response = $gateway->purchase($order, $request);
} catch (Exception $e) {
$orderService->delete($order);
return response()->json([
'message' => $e->getMessage(),
], 403);
}
return response()->json($response);
}
}