MIF_E31210863/app/Http/Controllers/API/OrderController.php

348 lines
15 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Models\Order;
use App\Models\Payment;
use App\Models\Product;
use App\Models\Shipment;
use App\Models\OrderItem;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController;
class OrderController extends BaseController
{
public function checkout(Request $request){
$params = $request->user()->toArray();
$params = array_merge($params, $request->all());
$sessionKey = $request->user()->id;
$orders = \DB::transaction(
function () use ($params, $sessionKey) {
$destination = isset($params['ship_to']) ? $params['shipping_city_id'] : $params['city_id'];
if ($sessionKey) {
\Cart::session($sessionKey)->isEmpty();
} else {
\Cart::isEmpty();
}
$totalWeight = 0;
if ($sessionKey) {
$items = \Cart::session($sessionKey)->getContent();
} else {
$items = \Cart::getContent();
}
foreach ($items as $item) {
$totalWeight += ($item->quantity * $item->associatedModel->weight);
}
$param = [
'origin' => env('RAJAONGKIR_ORIGIN'),
'destination' => $destination,
'weight' => $totalWeight,
];
$results = [];
foreach ($this->couriers as $code => $courier) {
$param['courier'] = $code;
$response = $this->rajaOngkirRequest('cost', $param, '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;
}
}
}
}
}
$shippingOptions = [
'origin' => $param['origin'],
'destination' => $destination,
'weight' => $totalWeight,
'results' => $results,
];
$shippingService = $params['shipping_service'];
$selectedShipping = null;
if ($shippingOptions['results']) {
foreach ($shippingOptions['results'] as $shippingOption) {
if (str_replace(' ', '', $shippingOption['service']) == $shippingService) {
$selectedShipping = $shippingOption;
break;
}
}
}
if ($sessionKey) {
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'TAX 10%',
'type' => 'tax',
'target' => 'subtotal',
'value' => '10%',
]
);
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('tax');
\Cart::session($sessionKey)->condition($condition);
} else {
\Cart::removeConditionsByType('tax');
\Cart::condition($condition);
}
$items = \Cart::session($sessionKey)->getContent();
}
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'TAX 10%',
'type' => 'tax',
'target' => 'subtotal',
'value' => '10%',
]
);
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('tax');
\Cart::session($sessionKey)->condition($condition);
} else {
\Cart::removeConditionsByType('tax');
\Cart::condition($condition);
}
$items = \Cart::getContent();
$baseTotalPrice = 0;
foreach ($items as $item) {
$baseTotalPrice += $item->getPriceSum();
}
if ($sessionKey) {
\Cart::session($sessionKey)->getSubTotal();
}
\Cart::getSubTotal();
if ($sessionKey) {
$taxAmount = (float) \Cart::session($sessionKey)->getCondition('TAX 10%')->parsedRawValue;
}
$taxAmount = (float) \Cart::getCondition('TAX 10%')->parsedRawValue;
if ($sessionKey) {
$taxPercent = (float) \Cart::session($sessionKey)->getCondition('TAX 10%')->getValue();
}
$taxPercent = (float) \Cart::getCondition('TAX 10%')->getValue();
$shippingCost = $selectedShipping['cost'];
$discountAmount = 0;
$discountPercent = 0;
$grandTotal = ($baseTotalPrice + $taxAmount + $shippingCost) - $discountAmount;
$orderDate = date('Y-m-d H:i:s');
$paymentDue = (new \DateTime($orderDate))->modify('+7 day')->format('Y-m-d H:i:s');
$orderParams = [
'user_id' => auth()->user()->id,
'code' => Order::generateCode(),
'status' => Order::CREATED,
'order_date' => $orderDate,
'payment_due' => $paymentDue,
'payment_status' => Order::UNPAID,
'base_total_price' => $baseTotalPrice,
'tax_amount' => $taxAmount,
'tax_percent' => $taxPercent,
'discount_amount' => $discountAmount,
'discount_percent' => $discountPercent,
'shipping_cost' => $shippingCost,
'grand_total' => $grandTotal,
'note' => $params['note'],
'customer_first_name' => $params['first_name'],
'customer_last_name' => $params['last_name'],
'customer_address1' => $params['address1'],
'customer_address2' => $params['address2'],
'customer_phone' => $params['phone'],
'customer_email' => $params['email'],
'customer_city_id' => $params['city_id'],
'customer_province_id' => $params['province_id'],
'customer_postcode' => $params['postcode'],
'shipping_courier' => $selectedShipping['courier'],
'shipping_service_name' => $selectedShipping['service'],
];
$order = Order::create($orderParams);
if ($sessionKey) {
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'TAX 10%',
'type' => 'tax',
'target' => 'subtotal',
'value' => '10%',
]
);
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('tax');
\Cart::session($sessionKey)->condition($condition);
} else {
\Cart::removeConditionsByType('tax');
\Cart::condition($condition);
}
$cartItems = \Cart::session($sessionKey)->getContent();
}
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'TAX 10%',
'type' => 'tax',
'target' => 'subtotal',
'value' => '10%',
]
);
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('tax');
\Cart::session($sessionKey)->condition($condition);
} else {
\Cart::removeConditionsByType('tax');
\Cart::condition($condition);
}
$cartItems = \Cart::getContent();
if ($order && $cartItems) {
foreach ($cartItems as $item) {
$itemTaxAmount = 0;
$itemTaxPercent = 0;
$itemDiscountAmount = 0;
$itemDiscountPercent = 0;
$itemBaseTotal = $item->quantity * $item->price;
$itemSubTotal = $itemBaseTotal + $itemTaxAmount - $itemDiscountAmount;
$product = isset($item->associatedModel->parent) ? $item->associatedModel->parent : $item->associatedModel;
$orderItemParams = [
'order_id' => $order->id,
'product_id' => $item->associatedModel->id,
'qty' => $item->quantity,
'base_price' => $item->price,
'base_total' => $itemBaseTotal,
'tax_amount' => $itemTaxAmount,
'tax_percent' => $itemTaxPercent,
'discount_amount' => $itemDiscountAmount,
'discount_percent' => $itemDiscountPercent,
'sub_total' => $itemSubTotal,
'type' => $product->type,
'name' => $item->name,
'weight' => $item->associatedModel->weight,
];
$orderItem = OrderItem::create($orderItemParams);
if ($orderItem) {
$product = Product::findOrFail($product->id);
$product->quantity -= $item->quantity;
$product->save();
}
}
}
$this->initPaymentGateway();
$customerDetails = [
'first_name' => $order->customer_first_name,
'last_name' => $order->customer_last_name,
'email' => $order->customer_email,
'phone' => $order->customer_phone,
];
$data_payment = [
'enable_payments' => Payment::PAYMENT_CHANNELS,
'transaction_details' => [
'order_id' => $order->code,
'gross_amount' => (int) $order->grand_total,
],
'customer_details' => $customerDetails,
'expiry' => [
'start_time' => date('Y-m-d H:i:s T'),
'unit' => \App\Models\Payment::EXPIRY_UNIT,
'duration' => \App\Models\Payment::EXPIRY_DURATION,
],
];
$snap = \Midtrans\Snap::createTransaction($data_payment);
if ($snap->token) {
$order->payment_token = $snap->token;
$order->payment_url = $snap->redirect_url;
$order->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()->user()->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 ($orders) {
if ($sessionKey) {
\Cart::session($sessionKey)->clearCartConditions();
\Cart::session($sessionKey)->clear();
}
\Cart::clearCartConditions();
\Cart::clear();
return $this->responseOk($orders, 200, 'success');
}
return $this->responseError('Order process failed, 422');
}
}