mirror of https://github.com/4xmen/xshop.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
8.3 KiB
PHP
247 lines
8.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Contracts\Payment;
|
|
use App\Models\Customer;
|
|
use App\Models\Discount;
|
|
use App\Models\Invoice;
|
|
use App\Models\Order;
|
|
use App\Models\Product;
|
|
use App\Models\Quantity;
|
|
use App\Models\Transport;
|
|
use Illuminate\Http\Request;
|
|
|
|
class CardController extends Controller
|
|
{
|
|
|
|
public function __construct()
|
|
{
|
|
|
|
$this->middleware(function ($request, $next) {
|
|
if (\Session::has('locate')) {
|
|
app()->setLocale(\Session::get('locate'));
|
|
}
|
|
return $next($request);
|
|
});
|
|
}
|
|
|
|
public function productCardToggle(Product $product)
|
|
{
|
|
|
|
$quantity = \request()->input('quantity', null);
|
|
if (\Cookie::has('card')) {
|
|
$cards = json_decode(\Cookie::get('card'), true);
|
|
$qs = json_decode(\Cookie::get('q'), true);
|
|
if (in_array($product->id, $cards)) {
|
|
$found = false;
|
|
foreach ($cards as $i => $card) {
|
|
if ($card == $product->id && $qs[$i] == $quantity) {
|
|
$found = true;
|
|
break;
|
|
}
|
|
}
|
|
if ($found) {
|
|
$msg = "Product removed from card";
|
|
unset($cards[$i]);
|
|
unset($qs[$i]);
|
|
} else {
|
|
$cards[] = $product->id;
|
|
$qs[] = $quantity;
|
|
$msg = "Product added to card";
|
|
}
|
|
} else {
|
|
$cards[] = $product->id;
|
|
$qs[] = $quantity;
|
|
$msg = "Product added to card";
|
|
}
|
|
$count = count($cards);
|
|
\Cookie::queue('card', json_encode($cards), 2000);
|
|
\Cookie::queue('q', json_encode($qs), 2000);
|
|
} else {
|
|
$count = 1;
|
|
$msg = "Product added to card";
|
|
\Cookie::queue('card', "[$product->id]", 2000);
|
|
\Cookie::queue('q', "[null]", 2000);
|
|
$qs = [$quantity];
|
|
$cards = [$product->id];
|
|
}
|
|
|
|
if ($count > 0 && auth('customer')->check()) {
|
|
$customer = auth('customer')->user();
|
|
$customer->card = json_encode(['cards' => $cards, 'quantities' => $qs]);
|
|
$customer->save();
|
|
}
|
|
|
|
if (\request()->ajax()) {
|
|
return success(['count' => $count], $msg);
|
|
} else {
|
|
return redirect()->back()->with(['message' => $msg]);
|
|
}
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
// auth('customer')->login(Customer::first());
|
|
$area = 'card';
|
|
$title = __("Shopping card");
|
|
$subtitle = '';
|
|
return view('client.default-list', compact('area', 'title', 'subtitle'));
|
|
}
|
|
|
|
public function check(Request $request)
|
|
{
|
|
|
|
$request->validate([
|
|
'product_id' => ['required', 'array'],
|
|
'count' => ['required', 'array'],
|
|
'address_id' => ['required', 'exists:addresses,id'],
|
|
'desc' => ['nullable', 'string']
|
|
]);
|
|
$total = 0;
|
|
// return $request->all();
|
|
$invoice = new Invoice();
|
|
$invoice->customer_id = auth('customer')->user()->id;
|
|
$invoice->count = array_sum($request->count);
|
|
$invoice->address_id = $request->address_id;
|
|
$invoice->desc = $request->desc;
|
|
|
|
if ($request->has('transport_id')) {
|
|
$request->transport_id = $request->input('transport_id');
|
|
$t = Transport::find($request->input('transport_id'));
|
|
$invoice->transport_price = $t->price;
|
|
$total += $t->price;
|
|
}
|
|
if ($request->has('discount_id')) {
|
|
$request->discount_id = $request->input('discount_id');
|
|
}
|
|
|
|
$invoice->save();
|
|
|
|
foreach ($request->product_id as $i => $product) {
|
|
$order = new Order();
|
|
$order->product_id = $product;
|
|
$order->invoice_id = $invoice->id;
|
|
$order->count = $request->count[$i];
|
|
if ($request->quantity_id[$i] != '') {
|
|
$order->quantity_id = $request->quantity_id[$i];
|
|
$q = Quantity::find($request->quantity_id[$i]);
|
|
$order->price_total = $q->price * $request->count[$i];
|
|
$order->data = $q->data;
|
|
|
|
} else {
|
|
$p = Product::find($request->product_id[$i]);
|
|
$order->price_total = $p->price * $request->count[$i];
|
|
}
|
|
$total += $order->price_total;
|
|
$order->save();
|
|
}
|
|
|
|
$invoice->total_price = $total;
|
|
$invoice->save();
|
|
// clear shopping card
|
|
// self::clear();
|
|
//prepare to redirect to bank gateway
|
|
$activeGateway = config('xshop.payment.active_gateway');
|
|
/** @var Payment $gateway */
|
|
$gateway = app($activeGateway . '-gateway');
|
|
logger()->info('pay controller', ["active_gateway" => $activeGateway, "invoice" => $invoice->toArray(),]);
|
|
|
|
if ($invoice->isCompleted()) {
|
|
return redirect()->back()->with('message', __('Invoice payed.'));
|
|
}
|
|
|
|
$callbackUrl = route('pay.check', ['invoice_hash' => $invoice->hash, 'gateway' => $gateway->getName()]);
|
|
$payment = null;
|
|
try {
|
|
$response = $gateway->request((($invoice->total_price - $invoice->credit_price) * config('app.currency.factor')), $callbackUrl);
|
|
$payment = $invoice->storePaymentRequest($response['order_id'], (($invoice->total_price - $invoice->credit_price) * config('app.currency.factor')), $response['token'] ?? null, null, $gateway->getName());
|
|
session(["payment_id" => $payment->id]);
|
|
\Session::save();
|
|
|
|
return $gateway->goToBank();
|
|
} catch (\Throwable $exception) {
|
|
$invoice->status = 'FAILED';
|
|
$invoice->save();
|
|
\Log::error("Payment REQUEST exception: " . $exception->getMessage());
|
|
\Log::warning($exception->getTraceAsString());
|
|
$result = false;
|
|
$message = __('error in payment. contact admin.');
|
|
return redirect()->back()->withErrors($message);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public static function clear()
|
|
{
|
|
if (auth('customer')->check()) {
|
|
$customer = auth('customer')->user();
|
|
$customer->card = null;
|
|
$customer->save();
|
|
}
|
|
\Cookie::expire('card');
|
|
\Cookie::expire('q');
|
|
return true;
|
|
}
|
|
|
|
public function clearing()
|
|
{
|
|
self::clear();
|
|
return __("Card cleared");
|
|
}
|
|
|
|
public function discount($code)
|
|
{
|
|
$discount = Discount::where('code', trim($code))->where(function ($query) {
|
|
$query->where('expire', '>=', date('Y-m-d'))
|
|
->orWhereNull('expire');
|
|
})->first();
|
|
if ($discount == null) {
|
|
return [
|
|
'OK' => false,
|
|
'err' => __("Discount code isn't valid."),
|
|
];
|
|
} else {
|
|
if ($discount->type == 'PERCENT') {
|
|
$human = $discount->title . '( ' . $discount->amount . '%' . ' )';
|
|
} else {
|
|
$human = '- ' . $discount->title . '( ' . $discount->amount . config('app.currency.symbol') . ' )';
|
|
}
|
|
return [
|
|
'OK' => true,
|
|
'msg' => __("Discount code is valid."),
|
|
'data' => $discount,
|
|
'human' => $human,
|
|
];
|
|
}
|
|
}
|
|
|
|
|
|
public function productCompareToggle($slug)
|
|
{
|
|
|
|
$product = Product::where('slug', $slug)->firstOrFail();
|
|
if (\Cookie::has('compares')) {
|
|
$compares = json_decode(\Cookie::get('compares'), true);
|
|
if (in_array($product->id, $compares)) {
|
|
$msg = __("Product removed from compare");
|
|
unset($compares[array_search($product->id, $compares)]);
|
|
} else {
|
|
$compares[] = $product->id;
|
|
$msg = __("Product added to compare");
|
|
}
|
|
\Cookie::queue('compares', json_encode($compares), 2000);
|
|
} else {
|
|
$msg = "Product added to compare";
|
|
\Cookie::queue('compares', "[$product->id]", 2000);
|
|
}
|
|
|
|
if (\request()->ajax()) {
|
|
return success(null, $msg);
|
|
} else {
|
|
return redirect()->back()->with(['message' => $msg]);
|
|
}
|
|
}
|
|
}
|