209 lines
6.9 KiB
PHP
209 lines
6.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Midtrans\Notification;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Models\Order;
|
|
use App\Models\OrderItem;
|
|
use Kreait\Firebase\Factory;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Midtrans\Config;
|
|
// use Midtrans\Notification;
|
|
|
|
|
|
class OrderController extends Controller
|
|
{
|
|
public function createSnapToken(Request $request)
|
|
{
|
|
Config::$serverKey = config('services.midtrans.server_key');
|
|
Config::$isProduction = config('services.midtrans.is_production', false);
|
|
Config::$isSanitized = true;
|
|
Config::$is3ds = true;
|
|
|
|
// Simpan data order ke session
|
|
Session::put('order_data', [
|
|
'customer_name' => $request->name,
|
|
'customer_email' => $request->email,
|
|
'table_id' => $request->table_id,
|
|
'table_device_id' => $request->table_device_id,
|
|
'total_amount' => $request->amount,
|
|
'payment_method' => 'midtrans',
|
|
'cart_items' => $request->cart_items, // array dari frontend
|
|
]);
|
|
|
|
// Tambahkan item_details untuk Snap
|
|
$items = [];
|
|
foreach ($request->cart_items as $item) {
|
|
$items[] = [
|
|
'id' => $item['id'],
|
|
'price' => $item['price'],
|
|
'quantity' => $item['qty'],
|
|
'name' => $item['name'],
|
|
];
|
|
}
|
|
|
|
$params = [
|
|
'transaction_details' => [
|
|
'order_id' => 'ORDER-' . time(),
|
|
'gross_amount' => $request->amount,
|
|
],
|
|
'item_details' => $items,
|
|
'customer_details' => [
|
|
'first_name' => $request->name,
|
|
'email' => $request->email,
|
|
],
|
|
];
|
|
|
|
$snapToken = Snap::getSnapToken($params);
|
|
return response()->json(['token' => $snapToken]);
|
|
}
|
|
|
|
public function handleNotification(Request $request)
|
|
{
|
|
// Konfigurasi Midtrans
|
|
Config::$serverKey = config('services.midtrans.server_key');
|
|
Config::$isProduction = config('services.midtrans.is_production', false);
|
|
Config::$isSanitized = true;
|
|
Config::$is3ds = true;
|
|
|
|
// Ambil isi notifikasi mentah
|
|
$rawNotification = $request->getContent();
|
|
Log::info('RAW MIDTRANS NOTIFICATION:', ['body' => $rawNotification]);
|
|
|
|
$notification = json_decode($rawNotification);
|
|
|
|
if (!$notification || !isset($notification->order_id)) {
|
|
Log::error('Invalid Midtrans notification payload.', ['raw' => $rawNotification]);
|
|
return response()->json(['message' => 'Invalid payload'], 400);
|
|
}
|
|
|
|
try {
|
|
$midtransNotif = new Notification();
|
|
|
|
$orderId = $midtransNotif->order_id;
|
|
$transactionStatus = $midtransNotif->transaction_status;
|
|
|
|
$order = Order::where('midtrans_transaction_id', $orderId)->first();
|
|
|
|
Log::info('Order ditemukan:', ['order' => $order]);
|
|
// if (!$order) {
|
|
// Log::warning('Order not found: ' . $orderId);
|
|
// return response()->json(['message' => 'Order not found'], 404);
|
|
// }
|
|
|
|
// Ubah status jadi hanya 2 kondisi: confirmed / canceled
|
|
if (in_array($transactionStatus, ['capture', 'settlement'])) {
|
|
$order->transaction_status = 'confirmed';
|
|
} else {
|
|
$order->transaction_status = 'canceled';
|
|
}
|
|
|
|
$order->save();
|
|
|
|
Log::info('Order updated:', [
|
|
'order_id' => $orderId,
|
|
'transaction_status' => $order->transaction_status,
|
|
]);
|
|
|
|
return response()->json(['message' => 'Notification handled'], 200);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Midtrans Notification Error', ['error' => $e->getMessage()]);
|
|
return response()->json(['message' => 'Notification failed'], 500);
|
|
}
|
|
}
|
|
|
|
|
|
public function saveOrder(Request $request)
|
|
{
|
|
$snapResult = $request->input('snap_result');
|
|
$orderData = Session::get('order_data');
|
|
|
|
if (!$orderData) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Data order tidak ditemukan di session.',
|
|
]);
|
|
}
|
|
|
|
try {
|
|
\DB::beginTransaction();
|
|
|
|
$order = Order::create([
|
|
'customer_name' => $orderData['customer_name'],
|
|
'customer_email' => $orderData['customer_email'],
|
|
'table_id' => $orderData['table_id'],
|
|
'midtrans_transaction_id' => $snapResult['order_id'] ?? null,
|
|
'total_amount' => $orderData['total_amount'],
|
|
'payment_method' => $orderData['payment_method'],
|
|
'transaction_status' => 'confirmed',
|
|
]);
|
|
|
|
foreach ($orderData['cart_items'] as $item) {
|
|
\App\Models\OrderItem::create([
|
|
'order_id' => $order->id,
|
|
'item_id' => $item['id'],
|
|
'item_name' => $item['name'],
|
|
'item_price' => $item['price'],
|
|
'quantity' => $item['qty'],
|
|
'total_price' => $item['total_price'],
|
|
]);
|
|
}
|
|
|
|
// Firebase update
|
|
$firebase = (new \Kreait\Firebase\Factory)
|
|
->withServiceAccount(storage_path('app/firebase/.firebase_credentials.json'))
|
|
->createDatabase();
|
|
|
|
$firebase->getReference($orderData['table_id'])->update([
|
|
'sensors/table_activation_sensor_active' => 1,
|
|
'reserved_by' => $orderData['customer_name'],
|
|
]);
|
|
|
|
\DB::commit();
|
|
Session::forget('order_data');
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Pesanan berhasil disimpan dan meja terupdate!',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
\DB::rollBack();
|
|
\Log::error('Gagal menyimpan pesanan: ' . $e->getMessage());
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Gagal menyimpan pesanan: ' . $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function confirmOrder(Request $request)
|
|
{
|
|
$request->validate([
|
|
'order_id' => 'required|string',
|
|
]);
|
|
|
|
$order = Order::where('id', $request->order_id)->first();
|
|
|
|
Log::info('Order ditemukan:', ['order' => $order]);
|
|
|
|
// if (!$order) {
|
|
// return response()->json(['message' => 'Order not found'], 404);
|
|
// }
|
|
|
|
$order->transaction_status = 'confirmed';
|
|
$order->save();
|
|
|
|
return response()->json(['message' => 'Order status updated to confirmed'], 200);
|
|
}
|
|
|
|
|
|
public function index()
|
|
{
|
|
$order = Order::all();
|
|
return view('pages.back.orders.index', compact('order'));
|
|
}
|
|
}
|