MIF_E31210536/app/Http/Controllers/TransaksiController.php

475 lines
17 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\DataHarga as DataHarga;
use App\Models\Transaksi as Trans;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Contracts\Support\ValidatedData;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Twilio\Rest\Client;
use Carbon\Carbon;
class TransaksiController extends Controller
{
public function tabeltrans(Request $request)
{
$keyword = $request->input('keyword');
$transaksiDatas = Trans::join('dataharga', 'transaksi.id_dataharga', '=', 'dataharga.id')
->join('users', 'transaksi.users_id', '=', 'users.id')
->select(
'transaksi.id',
'transaksi.nama_pembeli',
'dataharga.nama as nama_paket',
'transaksi.total_harga',
'transaksi.nohp',
'transaksi.status',
'transaksi.jumlah',
'transaksi.alamat',
'transaksi.note',
'transaksi.created_at',
'transaksi.timestamp',
'dataharga.nama as dataharga_nama',
'dataharga.harga as harga',
'users.name as user_name',
'users.email'
)
->when($keyword, function ($query) use ($keyword) {
return $query->where('transaksi.nama_pembeli', 'like', '%' . $keyword . '%')
->orWhere('dataharga.nama', 'like', '%' . $keyword . '%')
->orWhere('transaksi.nohp', 'like', '%' . $keyword . '%')
->orWhere('users.name', 'like', '%' . $keyword . '%')
->orWhere('transaksi.alamat', 'like', '%' . $keyword . '%')
->orWhere('transaksi.status', 'like', '%' . $keyword . '%');
})->orderBy('transaksi.id', 'desc')
->get();
$users = User::get();
$datahargas = DataHarga::get();
return view('pages.pesanan', compact('transaksiDatas', 'users', 'datahargas'));
}
public function history(Request $request)
{
$keyword = $request->input('keyword');
// dd($snapToken);
$userId = Auth::id(); // Ambil user ID dari sesi menggunakan Auth
$transaksiDatas = Trans::join('dataharga', 'transaksi.id_dataharga', '=', 'dataharga.id')
->join('users', 'transaksi.users_id', '=', 'users.id')
->select(
'transaksi.id',
'transaksi.nama_pembeli',
'dataharga.nama as nama_paket',
'transaksi.total_harga',
'transaksi.nohp',
'transaksi.status',
'transaksi.jumlah',
'transaksi.alamat',
'transaksi.created_at',
'transaksi.timestamp',
'dataharga.nama as dataharga_nama',
'dataharga.harga as harga',
'users.name as user_name'
)
->where('transaksi.users_id', $userId)
->when($keyword, function ($query, $keyword) {
return $query->where(function ($query) use ($keyword) {
$query->where('transaksi.nama_pembeli', 'LIKE', "%{$keyword}%")
->orWhere('dataharga.nama', 'LIKE', "%{$keyword}%")
->orWhere('transaksi.alamat', 'LIKE', "%{$keyword}%")
->orWhere('transaksi.nohp', 'LIKE', "%{$keyword}%");
});
})
->orderBy('transaksi.id', 'desc') // Filter berdasarkan user_id
->get();
$users = User::get();
$datahargas = DataHarga::get();
$snapToken = $request->session()->get('snapToken');
return view('Users.history', ['snapToken' => $snapToken], compact('transaksiDatas'));
// return view('Users.history',['snap_token' => $snapToken], compact('transaksiDatas', 'users', 'datahargas'));
}
public function historys(Request $request)
{
$userId = Auth::id(); // Ambil user ID dari sesi menggunakan Auth
$keyword = $request->input('keyword');
$transaksiDatas = Trans::join('dataharga', 'transaksi.id_dataharga', '=', 'dataharga.id')
->join('users', 'transaksi.users_id', '=', 'users.id')
->select(
'transaksi.id',
'transaksi.nama_pembeli',
'dataharga.nama as nama_paket',
'transaksi.total_harga',
'transaksi.nohp',
'transaksi.status',
'transaksi.jumlah',
'transaksi.alamat',
'transaksi.snaptoken',
'transaksi.created_at',
'transaksi.timestamp',
'dataharga.nama as dataharga_nama',
'dataharga.harga as harga',
'users.name as user_name'
)
->where('transaksi.users_id', $userId)
->when($keyword, function ($query, $keyword) {
return $query->where(function ($query) use ($keyword) {
$query->where('transaksi.nama_pembeli', 'LIKE', "%{$keyword}%")
->orWhere('dataharga.nama', 'LIKE', "%{$keyword}%")
->orWhere('transaksi.alamat', 'LIKE', "%{$keyword}%")
->orWhere('transaksi.nohp', 'LIKE', "%{$keyword}%");
});
})
->orderBy('transaksi.id', 'desc') // Filter berdasarkan user_id
->get();
$users = User::get();
$datahargas = DataHarga::get();
return view('Users.detailhistory', compact('transaksiDatas')); // Perhatikan perubahan di sini
}
public function detailTransaksi($id)
{
$userId = Auth::id(); // Ambil user ID dari sesi menggunakan Auth
$transaksiDatas = Trans::join('dataharga', 'transaksi.id_dataharga', '=', 'dataharga.id')
->join('users', 'transaksi.users_id', '=', 'users.id')
->select(
'transaksi.id',
'transaksi.nama_pembeli',
'dataharga.nama as nama_paket',
'transaksi.total_harga',
'transaksi.nohp',
'transaksi.status',
'transaksi.jumlah',
'transaksi.alamat',
'transaksi.snaptoken',
'transaksi.note',
'transaksi.created_at',
'transaksi.timestamp',
'dataharga.nama as dataharga_nama',
'dataharga.harga as harga',
'users.name as user_name'
)
->where('transaksi.id', $id) // Gunakan 'transaksi.id' untuk menghindari ambiguitas
->get();
$transaksiData = Trans::join('dataharga', 'transaksi.id_dataharga', '=', 'dataharga.id')
->join('users', 'transaksi.users_id', '=', 'users.id')
->select(
'transaksi.id',
'transaksi.nama_pembeli',
'dataharga.nama as nama_paket',
'transaksi.total_harga',
'transaksi.nohp',
'transaksi.status',
'transaksi.jumlah',
'transaksi.alamat',
'transaksi.snaptoken',
'transaksi.note',
'transaksi.created_at',
'dataharga.nama as dataharga_nama',
'dataharga.harga as harga',
'users.name as user_name'
)
->where('transaksi.users_id', $userId)
->orderBy('transaksi.id', 'desc')// Filter berdasarkan user_id
->get();
$users = User::get();
$datahargas = DataHarga::get();
return view('Users.detailhistory', compact('transaksiDatas', 'transaksiData', 'users', 'datahargas'));
}
public function insertTransaction(Request $request)
{
$validatedData = $request->validate([
'nama_pembeli' => 'required',
'users_id' => 'required',
'id_dataharga' => 'required',
'nohp' => 'required',
'jumlah' => 'required',
'total_harga' => 'required',
'alamat' => 'required',
'tanggal' => 'required|date', // Pastikan input tanggal valid
]);
// // Mengonversi tanggal dan waktu yang diinputkan menjadi format datetime
// $createdAt = Carbon::createFromFormat('Y-m-d H:i:s', . ' 00:00:00');
// Simpan data transaksi ke dalam tabel
$transaction = new Trans();
$transaction->nama_pembeli = $validatedData['nama_pembeli'];
$transaction->id_dataharga = $validatedData['id_dataharga'];
$transaction->total_harga = $validatedData['total_harga'];
$transaction->users_id = $validatedData['users_id'];
$transaction->nohp = $validatedData['nohp'];
$transaction->alamat = $validatedData['alamat'];
$transaction->status = 'Belum';
$transaction->jumlah = $validatedData['jumlah'];
$transaction->timestamp = $validatedData['tanggal'];
$transaction->save();
dd($transaction);
return redirect('/pesanan')->with('success', 'Transaksi berhasil disimpan');
}
public function transaksi(Request $request)
{
// Validasi input
$validatedData = $request->validate([
'nama' => 'required',
'id_dataharga' => 'required',
'nohp' => 'required',
'jumlah' => 'required|integer',
'alamat' => 'required',
'tanggal' => 'required|date' // Tambahkan validasi untuk tanggal
]);
// $createdAt = Carbon::createFromFormat('Y-m-d H:i:s', $validatedData['tanggal'] . ' 00:00:00');
// Ambil data harga berdasarkan ID yang diterima dari formulir
$dataharga = DataHarga::findOrFail($validatedData['id_dataharga']);
// Hitung total harga
$totalHarga = $dataharga->harga * $validatedData['jumlah'];
// Simpan data transaksi ke dalam tabel
$transaction = new Trans();
$transaction->nama_pembeli = $validatedData['nama'];
$transaction->id_dataharga = $validatedData['id_dataharga'];
$transaction->total_harga = $totalHarga;
$transaction->users_id = Auth::id(); // Ambil user ID dari session menggunakan Auth
$transaction->nohp = $validatedData['nohp'];
$transaction->alamat = $validatedData['alamat'];
$transaction->status = 'Belum';
$transaction->jumlah = $validatedData['jumlah'];
$transaction->timestamp = $validatedData['tanggal'].':00';
$transaction->save();
// dd($transaction);
\Midtrans\Config::$serverKey = config('midtrans.server_key');
\Midtrans\Config::$isProduction = false;
\Midtrans\Config::$isSanitized = true;
\Midtrans\Config::$is3ds = true;
$params = array(
'transaction_details' => array(
'order_id' => $transaction->id, // Gunakan ID transaksi sebagai order_id
'gross_amount' => $transaction->total_harga,
),
'customer_details' => array(
'nama_pembeli' => $transaction->nama_pembeli,
'alamat' => $transaction->alamat,
'nohp' => $transaction->nohp,
),
);
$snapToken = \Midtrans\Snap::getSnapToken($params);
$transaction->snaptoken = $snapToken;
$transaction->save();
$data = DataHarga::find($validatedData['id_dataharga']);
return redirect("/history")->with(compact('snapToken', 'transaction', 'data'));
}
public function callback(Request $request)
{
$serverKey = config('midtrans.server_key');
$computed_signature = hash("sha512", $request->order_id . $request->status_code . $request->gross_amount . $serverKey);
// Logging for debugging
// Log::info('Midtrans Callback Data', [
// 'request' => $request->all(),
// 'computed_signature' => $computed_signature,
// 'received_signature' => $request->signature_key
// ]);
if ($computed_signature == $request->signature_key) {
if ($request->transaction_status == 'capture' || $request->transaction_status == 'settlement') {
$order = Trans::where('id', $request->order_id)->first();
if ($order) {
$order->update(['status' => 'Selesai']);
return response()->json(['status' => 'success'], 200);
} else {
return response()->json(['status' => 'error', 'message' => 'Transaksi tidak ditemukan'], 404);
}
}
}
return response()->json(['status' => 'error', 'message' => 'Gagal melakukan verifikasi transaksi'], 400);
}
public function detailharga($id)
{
// Mengambil data harga berdasarkan ID
$dataharga = DataHarga::find($id);
// Jika data tidak ditemukan, bisa ditangani dengan redirect atau pesan error
if (!$dataharga) {
return redirect()->back()->with('error', 'Data harga tidak ditemukan.');
}
// Mengirim data harga ke view detailharga
return view('Users.pemesanan', compact('dataharga'));
}
public function updateTransaction(Request $request, $id)
{
$validatedData = $request->validate([
'nama_pembeli' => 'required',
'users_id' => 'required',
'id_dataharga' => 'required',
'nohp' => 'required',
'jumlah' => 'required',
'total_harga' => 'required',
'alamat' => 'required',
]);
$transaction = Trans::find($id);
if (!$transaction) {
return redirect('/pesanan')->with('error', 'Transaksi tidak ditemukan');
}
$transaction->nama_pembeli = $validatedData['nama_pembeli'];
$transaction->id_dataharga = $validatedData['id_dataharga'];
$transaction->total_harga = $validatedData['total_harga'];
$transaction->users_id = $validatedData['users_id'];
$transaction->nohp = $validatedData['nohp'];
$transaction->alamat = $validatedData['alamat'];
$transaction->jumlah = $validatedData['jumlah'];
$transaction->save();
return redirect('/pesanan')->with('success', 'Transaksi berhasil diperbarui');
}
public function cancel(Request $request, $id)
{
$validatedData = $request->validate([
'note' => 'required',
]);
$transaction = Trans::find($id);
if (!$transaction) {
return back()->with('error', 'Transaksi tidak ditemukan');
}
$transaction->note = $validatedData['note'];
$transaction->status = "Batal";
$transaction->save();
return back()->with('success', 'Transaksi berhasil diperbarui');
}
public function tolak(Request $request, $id)
{
$validatedData = $request->validate([
'note' => 'required',
]);
$transaction = Trans::find($id);
if (!$transaction) {
return back()->with('error', 'Transaksi tidak ditemukan');
}
$transaction->note = $validatedData['note'];
$transaction->status = "Batal";
$transaction->save();
// Kirim pesan WhatsApp
$this->sendWhatsAppMessage($transaction->nohp, $validatedData['note']);
return back()->with('success', 'Transaksi berhasil diperbarui');
}
private function sendWhatsAppMessage($to, $note)
{
$sid = env('TWILIO_SID');
$token = env('TWILIO_AUTH_TOKEN');
$twilio = new Client($sid, $token);
$from = env('TWILIO_WHATSAPP_FROM');
$to = "whatsapp:+62" . ltrim($to, '0'); // Format nomor telepon untuk WhatsApp
$message = "Informasi : Transaksi pemesanan Angkutan Wisata Jember telah ditolak. Catatan: " . $note;
$twilio->messages->create($to, [
'from' => $from,
'body' => $message
]);
// dd($twilio->messages);
}
private function sendWhatsAppMessage2($to)
{
$sid = env('TWILIO_SID');
$token = env('TWILIO_AUTH_TOKEN');
$twilio = new Client($sid, $token);
$from = env('TWILIO_WHATSAPP_FROM');
$to = "whatsapp:+62" . ltrim($to, '0'); // Format nomor telepon untuk WhatsApp
$message = "Transaksi Anda Di Terima \n Silahkan Lakukan Pembayaran Pada Website Wisata Jember";
$twilio->messages->create($to, [
'from' => $from,
'body' => $message
]);
// dd($twilio->messages);
}
public function setuju($id)
{
$transaction = Trans::find($id);
if (!$transaction) {
return back()->with('error', 'Transaksi tidak ditemukan');
}
$transaction->status = "Setuju";
$transaction->save();
$this->sendWhatsAppMessage2($transaction->nohp);
return back()->with('success', 'Transaksi berhasil diperbarui');
}
public function destroytrans($id)
{
$blog = Trans::where('id', $id)->delete();
return redirect('/pesanan');
}
public function getHarga($id)
{
$harga = Dataharga::find($id); // Gantilah 'Dataharga' sesuai dengan nama model Anda
return response()->json(['harga' => $harga->harga]);
}
}