dashboard-admin/app/Http/Controllers/User/UserTransactionController.php

500 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\User;
use App\Models\Transaction;
use App\Models\TransactionDescription;
use App\Http\Controllers\Controller;
use App\Models\Contact;
use App\Models\Refund;
use App\Models\RefundDescription;
use App\Models\Setting;
use Illuminate\Http\Request;
use App\Models\TransactionUser;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Ramsey\Uuid\Uuid;
use Midtrans\Config;
use Midtrans\Snap;
use Midtrans\Transaction as Trans;
use Stichoza\GoogleTranslate\GoogleTranslate;
use Throwable;
class UserTransactionController extends Controller
{
/**
* Display a listing of the resource.
*/
public function __construct()
{
Config::$serverKey = 'SB-Mid-server-8rydZAwKoWuoQ6g_3ot0-K7p';
Config::$isProduction = false;
// Set sanitization on (default)
Config::$isSanitized = true;
// Set 3DS transaction for credit card to true
Config::$is3ds = true;
}
public function indexPembeli()
{
return view('user.transaction.pembeli.index', [
'transactions' => Transaction::where('pembeli', Auth::user()->email)
->latest()
->get(),
]);
}
/**
* Display a listing of the resource.
*/
public function indexPenjual()
{
return view('user.transaction.penjual.index', [
'transactions' => Transaction::where('penjual', Auth::user()->email)
->latest()
->get(),
]);
}
public function show($id)
{
return view('user.transaction.pembeli.detail-transaction', [
'transaction' => Transaction::findOrFail($id),
'trackings' => TransactionDescription::where('transaction_id', $id)
->latest()
->get(),
]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$now = Carbon::now();
$bulan = $now->format('F');
$tahun = $now->year;
$persentase_keuntungan = Setting::where('status', 'Active')
->where('bulan', '=', $bulan)
->where('tahun', '=', $tahun)
->value('persentase');
if (is_null($persentase_keuntungan)) {
$persentase_keuntungan = Setting::where('status', 'Active')
->latest()
->value('persentase');
}
return view('user.transaction.pembeli.new-transaction', [
'persentase_keuntungan' => $persentase_keuntungan,
]);
}
/**
* Store a newly created resource in storage.
*/
public function invoiceTransaction($id)
{
return view('user.transaction.pembeli.invoice-transaction', [
'TransactionUser' => TransactionUser::HistoryTransaction(),
]);
}
public function store(Request $request)
{
$pembeli = Auth::user()->email;
$penjual = $request->get('email_penjual');
$nama_barang = $request->get('nama_barang');
$satuan_barang = $request->get('satuan_barang');
$deskripsi_transaksi = $request->get('deskripsi');
$harga_barang = $request->get('harga_barang');
$jumlah_barang = $request->get('jumlah_barang');
$nama_depan_pembeli = Auth::user()->nama_depan;
$nama_belakang_pembeli = Auth::user()->nama_belakang;
$nohp_pembeli = Auth::user()->nohp;
$nama_penjual = User::where('email', $penjual)->value('nama_depan');
$alamat = ucwords(strtolower(Auth::user()->alamat));
$id = Uuid::uuid4();
$now = Carbon::now();
$persentase_keuntungan = $request->get('persentase_keuntungan');
$total_harga = $request->get('total_harga');
$total_keuntungan = $request->get('total_keuntungan');
$total_bayar = $request->get('total_bayar');
$batas_pembayaran = $now->addDays(1)->toDateTimeString();
$batas_pengiriman_barang_awal = $now->addDays(2)->toDateTimeString();
$batas_pengiriman_barang_akhir = $now->addDays(4)->toDateTimeString();
$params = [
'transaction_details' => [
'order_id' => $id,
'gross_amount' => $total_bayar,
],
'item_details' => [
[
'id' => $nama_barang . time(),
'price' => $harga_barang,
'quantity' => $jumlah_barang,
'name' => $nama_barang,
],
[
'id' => 'BA01',
'price' => $total_keuntungan,
'quantity' => 1,
'name' => 'Biaya Admin',
],
],
'customer_details' => [
'firts_name' => $nama_depan_pembeli,
'last_name' => $nama_belakang_pembeli,
'email' => $pembeli,
'phone' => $nohp_pembeli,
'billing' => [
'first_name' => $nama_depan_pembeli,
'last_name' => $nama_belakang_pembeli,
'email' => $pembeli,
'phone' => $nohp_pembeli,
'address' => $alamat,
'city' => Auth::user()->village->district->city->name,
'country_code' => 'IDN',
],
],
'callbacks' => [
'finish' => route('user-transaction.index.pembeli'),
],
'enabled_payments' => [
'credit_card', 'gopay', 'shopeepay'
],
'expiry' => [
'start_time' => $now->format('Y-m-d H:i:s P'),
'unit' => 'days',
'duration' => 1,
],
];
$snap_token = Snap::getSnapToken($params);
$token = $snap_token;
$status = 'created';
try{
DB::beginTransaction();
$query = Transaction::create([
'pembeli' => $pembeli,
'penjual' => $penjual,
'nama_barang' => $nama_barang,
'deskripsi_transaksi' => $deskripsi_transaksi,
'satuan_barang' => $satuan_barang,
'harga_barang' => $harga_barang,
'jumlah_barang' => $jumlah_barang,
'persentase_keuntungan' => $persentase_keuntungan,
'total_keuntungan' => $total_keuntungan,
'total_harga' => $total_harga,
'total_bayar' => $total_bayar,
'token' => $token,
'status' => $status,
'batas_pembayaran' => $batas_pembayaran,
'batas_pengiriman_barang_awal' => $batas_pengiriman_barang_awal,
'batas_pengiriman_barang_akhir' => $batas_pengiriman_barang_akhir,
]);
$contact = Contact::where('pemilik_kontak', $pembeli)
->where('relasi_kontak', $penjual)
->count();
if ($contact == 0) {
Contact::create([
'pemilik_kontak' => $pembeli,
'relasi_kontak' => $penjual,
]);
}
TransactionDescription::create([
'transaction_id' => $query->id,
'status' => $status,
'user' => $pembeli,
'judul' => 'fa fa-plus',
'background' => 'bg-buyer',
'deskripsi' => $nama_depan_pembeli . ' telah membuat transaksi baru dengan ' . $nama_penjual,
]);
DB::commit();
return response()->json([
'status' => true,
'message' => 'Berhasil menambahkan transaksi. Silahkan lakukan pembayaran.',
]);
}catch(Throwable $e){
DB::rollBack();
Log::error($e->getMessage());
return response()->json([
'status' => false,
'message' => 'Gagal menambahkan transaksi.',
]);
}
}
public function acceptTransaction($id)
{
$query = Transaction::where('id', $id)->update([
'status' => 'process',
]);
if ($query) {
TransactionDescription::create([
'transaction_id' => $id,
'status' => 'process',
'background' => 'bg-seller',
'user' => Auth::user()->email,
'judul' => 'fas fa-handshake',
'deskripsi' => 'Transaksi telah diterima oleh ' . Auth::user()->nama_depan,
]);
return response()->json([
'status' => true,
'message' => 'Transaksi telah diterima. Siapkan pesanan untuk dikirim ke penjual.',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Gagal update status karena kesalahan server.',
]);
}
}
public function sendingOrder($id)
{
$query = Transaction::where('id', $id)->update([
'status' => 'sending',
]);
if ($query) {
TransactionDescription::create([
'transaction_id' => $id,
'status' => 'sending',
'background' => 'bg-seller',
'user' => Auth::user()->email,
'judul' => 'fas fa-truck-moving',
'deskripsi' => 'Pesanan telah dikirim oleh ' . Auth::user()->nama_depan . ' dan sedang dalam perjalanan menuju pembeli.',
]);
return response()->json([
'status' => true,
'message' => 'Pesanan sedang dikirim dan menuju pembeli.',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Gagal update status karena kesalahan server.',
]);
}
}
public function sentOrder($id)
{
$query = Transaction::where('id', $id)->update([
'status' => 'sended',
]);
if ($query) {
TransactionDescription::create([
'transaction_id' => $id,
'status' => 'sended',
'background' => 'bg-seller',
'user' => Auth::user()->email,
'judul' => 'fas fa-check',
'deskripsi' => 'Pesanan telah sampai di tempat pembeli.',
]);
return response()->json([
'status' => true,
'message' => 'Pesanan telah sampai di tempat pembeli.',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Gagal update status karena kesalahan server.',
]);
}
}
public function finishTransaction($id)
{
$query = Transaction::where('id', $id)->update([
'status' => 'finished',
]);
if ($query) {
TransactionDescription::create([
'transaction_id' => $id,
'status' => 'sended',
'background' => 'bg-buyer',
'user' => Auth::user()->email,
'judul' => 'fas fa-check',
'deskripsi' => 'Pesanan telah sampai di tempat pembeli.',
]);
return response()->json([
'status' => true,
'message' => 'Pesanan telah sampai di tempat pembeli.',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Gagal update status karena kesalahan server.',
]);
}
}
public function payTransaction($id)
{
// Membuat objek Google Translate
$translator = new GoogleTranslate();
// Mengatur bahasa sumber (Inggris) dan bahasa target (Indonesia)
$translator->setSource('en');
$translator->setTarget('id');
$payment = Trans::status($id);
$result = json_decode(json_encode($payment), true);
if (in_array($result['status_code'], ['200', '201', '202'])) {
$query = Transaction::where('id', $id)->update([
'currency' => $result['currency'],
'merchant_id' => $result['merchant_id'],
'metode_pembayaran' => $result['payment_type'],
'tanggal_transaksi' => $result['transaction_time'],
'signature_key' => $result['signature_key'],
'status' => $result['transaction_status'],
'fraud_status' => $result['fraud_status'],
]);
if ($query) {
if ($result['transaction_status'] == 'pending') {
TransactionDescription::create([
'transaction_id' => $id,
'status' => $result['transaction_status'],
'user' => Auth::user()->email,
'judul' => 'fas fa-clock',
'status_code' => $result['status_code'],
'background' => 'bg-buyer',
'deskripsi' => 'Pembayaran ditunda.',
]);
return response()->json([
'status' => true,
'message' => 'Transaksi ditunda. Silahkan bayar nanti selama dalam waktu batas pembayaran.',
]);
} else {
TransactionDescription::create([
'transaction_id' => $id,
'status' => $result['transaction_status'],
'user' => Auth::user()->email,
'judul' => 'fas fa-plus',
'status_code' => $result['status_code'],
'background' => 'bg-buyer',
'deskripsi' => Auth::user()->nama_depan . ' telah sukses melakukan pembayaran. Transaksi diteruskan ke penjual.',
]);
return response()->json([
'status' => true,
'message' => 'Pembayaran sukses.',
]);
}
} else {
return response()->json([
'status' => false,
'message' => 'Transaksi pembayaran gagal.',
]);
}
} elseif (in_array($result['status_code'], ['400', '401', '402', '403', '404', '405', '406', '407', '408', '409', '410', '411', '412', '413'])) {
return response()->json([
'status' => false,
'message' => 'Terjadi kesalahan di server.',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Transaksi pembayaran gagal',
]);
}
}
public function cancelTransaction($id)
{
// Membuat objek Google Translate
$translator = new GoogleTranslate();
// Mengatur bahasa sumber (Inggris) dan bahasa target (Indonesia)
$translator->setSource('en');
$translator->setTarget('id');
$transaction = Transaction::where('id', $id)->first();
if ($transaction->status == 'created') {
$query = Transaction::where('id', $id)->update([
'status' => 'cancel',
]);
if ($query) {
TransactionDescription::create([
'transcation_id' => $id,
'status' => 'cancel',
'user' => Auth::user()->email,
'judul' => 'fas fa-exclamation',
'background' => 'bg-buyer',
'deskripsi' => 'Transaksi dibatalkan',
]);
return response()->json([
'status' => true,
'message' => 'Transaksi berhasil dibatal',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Transaksi gagal dibatalkan',
]);
}
} else {
$cancel = json_decode(json_encode(Trans::cancel($id)), true);
if ($cancel['status_code'] == '200') {
$query = Transaction::where('id', $id)->update([
'status' => $cancel['transaction_status'],
]);
if ($query) {
TransactionDescription::create([
'transaction_id' => $id,
'status' => $cancel['transaction_status'],
'user' => Auth::user()->email,
'judul' => 'fas fa-exclamation',
'status_code' => $cancel['status_code'],
'background' => 'bg-buyer',
'deskripsi' => $translator->translate($cancel['status_message']),
]);
return response()->json([
'status' => true,
'message' => $translator->translate($cancel['status_message']),
]);
} else {
return response()->json([
'status' => false,
'message' => $translator->translate($cancel['status_message']),
]);
}
} elseif ($cancel['status_code'] == '412') {
return response()->json([
'status' => false,
'message' => $translator->translate($cancel['status_message']),
]);
}
}
}
public function complainTransaction($id)
{
return view('user.refund.new-refund', compact('id'));
}
}