432 lines
15 KiB
PHP
432 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Exception;
|
|
use Midtrans\Snap;
|
|
use App\Models\Order;
|
|
use App\Models\Payment;
|
|
use App\Models\Product;
|
|
use App\Models\Shipment;
|
|
use App\Models\OrderItem;
|
|
use FontLib\Table\Type\name;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Str;
|
|
|
|
class OrderController extends Controller
|
|
{
|
|
public function process()
|
|
{
|
|
if (\Cart::isEmpty()) {
|
|
return redirect()->route('cart.index');
|
|
}
|
|
|
|
// \Cart::removeConditionsByType('shipping');
|
|
|
|
$items = \Cart::getContent();
|
|
|
|
// $totalWeight = 0;
|
|
// foreach ($items as $item) {
|
|
// $totalWeight += ($item->quantity * $item->associatedModel->weight);
|
|
// }
|
|
|
|
// $provinces = $this->getProvinces();
|
|
// $cities = isset(auth()->user()->city_id) ? $this->getCities(auth()->user()->province_id) : [];
|
|
|
|
return view('frontend.orders.checkout', compact('items'));
|
|
}
|
|
|
|
public function cities(Request $request)
|
|
{
|
|
$cities = $this->getCities($request->query('province_id'));
|
|
return response()->json(['cities' => $cities]);
|
|
}
|
|
|
|
public function shippingCost(Request $request)
|
|
{
|
|
$items = \Cart::getContent();
|
|
|
|
$totalWeight = 0;
|
|
foreach ($items as $item) {
|
|
$totalWeight += ($item->quantity * $item->associatedModel->weight);
|
|
}
|
|
|
|
$destination = $request->input('city_id');
|
|
return $this->getShippingCost($destination, $totalWeight);
|
|
}
|
|
|
|
private function getShippingCost($destination, $weight)
|
|
{
|
|
$params = [
|
|
'origin' => env('RAJAONGKIR_ORIGIN'),
|
|
'destination' => $destination,
|
|
'weight' => $weight,
|
|
];
|
|
|
|
$results = [];
|
|
foreach ($this->couriers as $code => $courier) {
|
|
$params['courier'] = $code;
|
|
|
|
$response = $this->rajaOngkirRequest('cost', $params, 'POST');
|
|
|
|
if (!empty($response['rajaongkir']['results'])) {
|
|
foreach ($response['rajaongkir']['results'] as $cost) {
|
|
if (!empty($cost['costs'])) {
|
|
foreach ($cost['costs'] as $costDetail) {
|
|
$serviceName = strtoupper($cost['code']) . ' - ' . $costDetail['service'];
|
|
$costAmount = $costDetail['cost'][0]['value'];
|
|
$etd = $costDetail['cost'][0]['etd'];
|
|
|
|
$result = [
|
|
'service' => $serviceName,
|
|
'cost' => $costAmount,
|
|
'etd' => $etd,
|
|
'courier' => $code,
|
|
];
|
|
|
|
$results[] = $result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$response = [
|
|
'origin' => $params['origin'],
|
|
'destination' => $destination,
|
|
'weight' => $weight,
|
|
'results' => $results,
|
|
];
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function setShipping(Request $request)
|
|
{
|
|
\Cart::removeConditionsByType('shipping');
|
|
|
|
$items = \Cart::getContent();
|
|
|
|
$totalWeight = 0;
|
|
foreach ($items as $item) {
|
|
$totalWeight += ($item->quantity * $item->associatedModel->weight);
|
|
}
|
|
|
|
$shippingService = $request->get('shipping_service');
|
|
$destination = $request->get('city_id');
|
|
|
|
$shippingOptions = $this->getShippingCost($destination, $totalWeight);
|
|
|
|
$selectedShipping = null;
|
|
if ($shippingOptions['results']) {
|
|
foreach ($shippingOptions['results'] as $shippingOption) {
|
|
if (str_replace(' ', '', $shippingOption['service']) == $shippingService) {
|
|
$selectedShipping = $shippingOption;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$status = null;
|
|
$message = null;
|
|
$data = [];
|
|
if ($selectedShipping) {
|
|
$status = 200;
|
|
$message = 'Success set shipping cost';
|
|
|
|
$this->addShippingCostToCart($selectedShipping['service'], $selectedShipping['cost']);
|
|
|
|
$data['total'] = number_format(\Cart::getTotal());
|
|
} else {
|
|
$status = 400;
|
|
$message = 'Failed to set shipping cost';
|
|
}
|
|
|
|
$response = [
|
|
'status' => $status,
|
|
'message' => $message
|
|
];
|
|
|
|
if ($data) {
|
|
$response['data'] = $data;
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function addShippingCostToCart($serviceName, $cost)
|
|
{
|
|
$condition = new \Darryldecode\Cart\CartCondition(
|
|
[
|
|
'name' => $serviceName,
|
|
'type' => 'shipping',
|
|
'target' => 'total',
|
|
'value' => '+' . $cost,
|
|
]
|
|
);
|
|
|
|
\Cart::condition($condition);
|
|
}
|
|
|
|
private function getSelectedShipping($destination, $totalWeight, $shippingService)
|
|
{
|
|
$shippingOptions = $this->getShippingCost($destination, $totalWeight);
|
|
|
|
$selectedShipping = null;
|
|
if ($shippingOptions['results']) {
|
|
foreach ($shippingOptions['results'] as $shippingOption) {
|
|
if (str_replace(' ', '', $shippingOption['service']) == $shippingService) {
|
|
$selectedShipping = $shippingOption;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $selectedShipping;
|
|
}
|
|
|
|
public function checkout(Request $request)
|
|
{
|
|
$token = $request->except('_token');
|
|
|
|
$order = \DB::transaction(function () use ($token) {
|
|
// $destination = isset($params['ship_to']) ? $params['shipping_city_id'] : $params['city_id'];
|
|
// $items = \Cart::getContent();
|
|
|
|
// $totalWeight = 0;
|
|
// foreach ($items as $item) {
|
|
// $totalWeight += ($item->quantity * $item->associatedModel->weight);
|
|
// }
|
|
|
|
// $selectedShipping = $this->getSelectedShipping($destination, $totalWeight, $params['shipping_service']);
|
|
|
|
$baseTotalPrice = \Cart::getSubTotal();
|
|
// $shippingCost = $selectedShipping['cost'];
|
|
// $discountAmount = 0;
|
|
// $discountPercent = 0;
|
|
// $grandTotal = ($baseTotalPrice + $shippingCost) - $discountAmount;
|
|
|
|
$orderDate = date('Y-m-d H:i:s');
|
|
$paymentDue = (new \DateTime($orderDate))->modify('+3 day')->format('Y-m-d H:i:s');
|
|
|
|
// $user_profile = [
|
|
// 'username' => $params['username'],
|
|
// 'first_name' => $params['first_name'],
|
|
// 'last_name' => $params['last_name'],
|
|
// 'address1' => $params['address1'],
|
|
// 'address2' => $params['address2'],
|
|
// 'province_id' => $params['province_id'],
|
|
// 'city_id' => $params['city_id'],
|
|
// 'postcode' => $params['postcode'],
|
|
// 'phone' => $params['phone'],
|
|
// 'email' => $params['email'],
|
|
// ];
|
|
|
|
// auth()->user()->update($user_profile);
|
|
|
|
$orderParams = [
|
|
'user_id' => auth()->id(),
|
|
'code' => Order::generateCode(),
|
|
'status' => Order::CREATED,
|
|
'order_date' => $orderDate,
|
|
'payment_due' => $paymentDue,
|
|
'payment_status' => Order::UNPAID,
|
|
'base_total_price' => $baseTotalPrice,
|
|
// 'discount_amount' => $discountAmount,
|
|
// 'discount_percent' => $discountPercent,
|
|
// 'shipping_cost' => $shippingCost,
|
|
// 'grand_total' => $grandTotal,
|
|
'customer_first_name' => $token['username'],
|
|
// 'customer_last_name' => $params['last_name'],
|
|
// 'customer_address1' => $params['address1'],
|
|
// 'customer_address2' => $params['address2'],
|
|
'customer_phone' => $token['phone'],
|
|
// 'customer_email' => $params['email'],
|
|
// 'customer_city_id' => $params['city_id'],
|
|
// 'customer_province_id' => $params['province_id'],
|
|
// 'customer_postcode' => $params['postcode'],
|
|
'note' => $token['note'],
|
|
// 'shipping_courier' => $selectedShipping['courier'],
|
|
// 'shipping_service_name' => $selectedShipping['service'],
|
|
];
|
|
|
|
$order = Order::create($orderParams);
|
|
|
|
$cartItems = \Cart::getContent();
|
|
|
|
if ($order && $cartItems) {
|
|
foreach ($cartItems as $item) {
|
|
$itemDiscountAmount = 0;
|
|
$itemDiscountPercent = 0;
|
|
$itemBaseTotal = $item->quantity * $item->price;
|
|
$itemSubTotal = $itemBaseTotal - $itemDiscountAmount;
|
|
|
|
$product = $item->associatedModel;
|
|
|
|
$orderItemParams = [
|
|
'order_id' => $order->id,
|
|
'product_id' => $item->associatedModel->id,
|
|
'qty' => $item->quantity,
|
|
'base_price' => $item->price,
|
|
'base_total' => $itemBaseTotal,
|
|
'discount_amount' => $itemDiscountAmount,
|
|
'discount_percent' => $itemDiscountPercent,
|
|
'sub_total' => $itemSubTotal,
|
|
'name' => $item->name,
|
|
'weight' => $item->associatedModel->weight,
|
|
];
|
|
|
|
$orderItem = OrderItem::create($orderItemParams);
|
|
|
|
if ($orderItem) {
|
|
$product = Product::findOrFail($product->id);
|
|
$product->quantity -= $item->quantity;
|
|
$product->save();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// $shippingFirstName = isset($params['ship_to']) ? $params['shipping_first_name'] : $params['first_name'];
|
|
// $shippingLastName = isset($params['ship_to']) ? $params['shipping_last_name'] : $params['last_name'];
|
|
// $shippingAddress1 = isset($params['ship_to']) ? $params['shipping_address1'] : $params['address1'];
|
|
// $shippingAddress2 = isset($params['ship_to']) ? $params['shipping_address2'] : $params['address2'];
|
|
// $shippingPhone = isset($params['ship_to']) ? $params['shipping_phone'] : $params['phone'];
|
|
// $shippingEmail = isset($params['ship_to']) ? $params['shipping_email'] : $params['email'];
|
|
// $shippingCityId = isset($params['ship_to']) ? $params['shipping_city_id'] : $params['city_id'];
|
|
// $shippingProvinceId = isset($params['ship_to']) ? $params['shipping_province_id'] : $params['province_id'];
|
|
// $shippingPostcode = isset($params['ship_to']) ? $params['shipping_postcode'] : $params['postcode'];
|
|
|
|
// $shipmentParams = [
|
|
// 'user_id' => auth()->id(),
|
|
// 'order_id' => $order->id,
|
|
// 'status' => Shipment::PENDING,
|
|
// 'total_qty' => \Cart::getTotalQuantity(),
|
|
// 'total_weight' => $totalWeight,
|
|
// 'first_name' => $shippingFirstName,
|
|
// 'last_name' => $shippingLastName,
|
|
// 'address1' => $shippingAddress1,
|
|
// 'address2' => $shippingAddress2,
|
|
// 'phone' => $shippingPhone,
|
|
// 'email' => $shippingEmail,
|
|
// 'city_id' => $shippingCityId,
|
|
// 'province_id' => $shippingProvinceId,
|
|
// 'postcode' => $shippingPostcode,
|
|
// ];
|
|
// Shipment::create($shipmentParams);
|
|
|
|
return $order;
|
|
});
|
|
|
|
if (!isset($order)) {
|
|
return redirect()->back()->with([
|
|
'message' => 'something went wrong !',
|
|
'alert-type' => 'danger'
|
|
]);
|
|
// return redirect()->route('checkout.received', $order->id);
|
|
}
|
|
|
|
if ($request['cash'] === "on" && $request['cashless'] === "on") {
|
|
return '<script>alert("Choose one payment only!!!");window.location.href="/orders/checkout"</script>';
|
|
}
|
|
|
|
if ($request['cash'] === "on") {
|
|
\Cart::clear();
|
|
$order->update(['payment_status' => 'cash']);
|
|
return view('frontend.orders.cash', compact('order'));
|
|
}
|
|
|
|
// Set your Merchant Server Key
|
|
\Midtrans\Config::$serverKey = config('midtrans.serverKey');
|
|
// Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction).
|
|
\Midtrans\Config::$isProduction = false;
|
|
// Set sanitization on (default)
|
|
\Midtrans\Config::$isSanitized = true;
|
|
// Set 3DS transaction for credit card to true
|
|
\Midtrans\Config::$is3ds = true;
|
|
|
|
$params = array(
|
|
'transaction_details' => array(
|
|
'order_id' => Str::random(15),
|
|
'gross_amount' => $order->base_total_price,
|
|
),
|
|
'customer_details' => array(
|
|
'name' => $request->username,
|
|
'handphone' => $request->phone,
|
|
),
|
|
);
|
|
|
|
$snapToken = \Midtrans\Snap::getSnapToken($params);
|
|
|
|
return view('frontend.orders.confirmation', compact('snapToken', 'order'));
|
|
|
|
// $this->initPaymentGateway();
|
|
|
|
// $customerDetails = [
|
|
// 'first_name' => $order->customer_first_name,
|
|
// 'last_name' => $order->customer_last_name,
|
|
// 'email' => $order->customer_email,
|
|
// 'phone' => $order->customer_phone,
|
|
// ];
|
|
|
|
// $transaction_details = [
|
|
// 'enable_payments' => Payment::PAYMENT_CHANNELS,
|
|
// 'transaction_details' => [
|
|
// 'order_id' => $order->code,
|
|
// 'gross_amount' => $order->grand_total,
|
|
// ],
|
|
// 'customer_details' => $customerDetails,
|
|
// 'expiry' => [
|
|
// 'start_time' => date('Y-m-d H:i:s T'),
|
|
// 'unit' => Payment::EXPIRY_UNIT,
|
|
// 'duration' => Payment::EXPIRY_DURATION,
|
|
// ]
|
|
// ];
|
|
|
|
// try {
|
|
// $snap = Snap::createTransaction($transaction_details);
|
|
|
|
// $order->payment_token = $snap->token;
|
|
// $order->payment_url = $snap->redirect_url;
|
|
// $order->save();
|
|
|
|
// header('Location: ' . $order->payment_url);
|
|
// exit;
|
|
// } catch (Exception $e) {
|
|
// echo $e->getMessage();
|
|
// }
|
|
}
|
|
|
|
public function order_success($orderId)
|
|
{
|
|
$order = Order::find($orderId);
|
|
$order->update(['payment_status' => 'paid']);
|
|
\Cart::clear();
|
|
return redirect()->route('homepage');
|
|
}
|
|
|
|
public function received($orderId)
|
|
{
|
|
$order = Order::where('id', $orderId)
|
|
->where('user_id', auth()->id())
|
|
->firstOrFail();
|
|
|
|
return view('frontend.orders.received', compact('order'));
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$orders = Order::where('user_id', auth()->id())
|
|
->paginate(10);
|
|
|
|
return view('frontend.orders.index', compact('orders'));
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$order = Order::where('user_id', auth()->id())->findOrFail($id);
|
|
|
|
return view('frontend.orders.show', compact('order'));
|
|
}
|
|
} |