489 lines
18 KiB
PHP
489 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 Ramsey\Uuid\Uuid;
|
|
use Midtrans\Config;
|
|
use Midtrans\Snap;
|
|
use Midtrans\Transaction as Trans;
|
|
use Stichoza\GoogleTranslate\GoogleTranslate;
|
|
|
|
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)
|
|
// ->orderByRaw("CASE WHEN status = 'pending' THEN 1 WHEN status = 'Finished' THEN 2 WHEN status = 'Rejected' THEN 3 ELSE 4 END ASC")
|
|
->latest()
|
|
->get(),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*/
|
|
public function indexPenjual()
|
|
{
|
|
return view('user.transaction.penjual.index', [
|
|
'transactions' => Transaction::where('penjual', Auth::user()->email)
|
|
// ->orderByRaw("CASE WHEN status = 'Progress' THEN 1 WHEN status = 'Finished' THEN 2 WHEN status = 'Rejected' THEN 3 ELSE 4 END ASC")
|
|
->latest()
|
|
->get(),
|
|
]);
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
return view('user.transaction.pembeli.detail-transaction', [
|
|
'transaction' => Transaction::findOrFail($id),
|
|
'trackings' => TransactionDescription::where('order_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';
|
|
$query = Transaction::create([
|
|
'id' => $id,
|
|
'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,
|
|
]);
|
|
|
|
if ($query) {
|
|
$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' => $id,
|
|
'status' => $status,
|
|
'user' => $pembeli,
|
|
'judul' => 'fa fa-plus',
|
|
'background' => 'bg-buyer',
|
|
'deskripsi' => $nama_depan_pembeli . ' telah membuat transaksi baru dengan ' . $nama_penjual,
|
|
]);
|
|
return response()->json([
|
|
'status' => true,
|
|
'message' => 'Berhasil menambahkan transaksi. Silahkan lakukan pembayaran.',
|
|
]);
|
|
} else {
|
|
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'));
|
|
}
|
|
}
|