DataTable Server Side

This commit is contained in:
Muhammad Raihan Surya 2023-11-13 09:22:34 +07:00
parent 0d50202f43
commit 676f05a162
29 changed files with 1718 additions and 1013 deletions

View File

@ -144,14 +144,12 @@ class AdminRefundController extends Controller
if ($request->has('search') && !empty($request->search['value'])) {
$searchRefund = $request->search['value'];
if (!is_numeric($searchRefund)) {
$subQuery->where(function ($a) use ($searchRefund) {
$a->whereRaw('LOWER(b.nama_depan) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(b.nama_belakang) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(s.nama_depan) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(s.nama_belakang) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(refunds.status) LIKE ?', ['%' . strtolower($searchRefund) . '%']);
});
$subQuery->where(function ($a) use ($searchRefund) {
$a->whereRaw("LOWER(CONCAT(b.nama_depan,' ',b.nama_belakang)) LIKE ?", ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw("LOWER(CONCAT(s.nama_depan,' ',s.nama_belakang)) LIKE ?", ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?', ['%' . strtolower($searchRefund) . '%'])
->orWhereRaw('LOWER(refunds.status) LIKE ?', ['%' . strtolower($searchRefund) . '%']);
});
} else {
$subQuery->where(function ($a) use ($searchRefund) {
$a->whereDay('refunds.created_at', '=', $searchRefund)

View File

@ -5,8 +5,12 @@ namespace App\Http\Controllers\Admin;
use App\Models\Transaction;
use App\Http\Controllers\Controller;
use App\Models\TransactionDescription;
use App\Models\TransactionUser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Throwable;
use Yajra\DataTables\DataTables;
class AdminTransactionController extends Controller
{
@ -16,8 +20,7 @@ class AdminTransactionController extends Controller
public function index()
{
return view('admin.transaction.index', [
'transactions' => Transaction::latest()
->get(),
'transactions' => Transaction::latest()->get(),
]);
}
@ -34,23 +37,163 @@ class AdminTransactionController extends Controller
]);
}
public function aprroveTransaction($id){
try{
public function approveTransaction(Request $request)
{
try {
DB::beginTransaction();
}catch(Throwable $e){
Transaction::where('id', $request->id)->update([
'status_transaksi' => 'success',
'status_pembayaran' => 'settlement',
'fraud_status' => 'accept'
]);
TransactionDescription::create([
'transaction_id' => $request->id,
'status' => 'success',
'user' => auth()->user()->email,
'judul' => 'fa fa-check',
'background' => 'bg-primary',
'deskripsi' => 'Admin telah menerima pembayaran transaksi dan dilanjutkan ke penjual.',
]);
DB::commit();
return response()->json([
'status' => true,
'message' => 'Transaksi telah diterima.'
]);
} catch (Throwable $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json([
'status' => false,
'message' => 'Terjadi kesalahan di bagian server.',
]);
}
}
public function denyTransaction($id){
try{
public function denyTransaction(Request $request)
{
try {
DB::beginTransaction();
}catch(Throwable $e){
Transaction::where('id', $request->id)->update([
'status_transaksi' => 'failure',
'status_pembayaran' => 'failure',
'fraud_status' => 'deny'
]);
TransactionDescription::create([
'transaction_id' => $request->id,
'status' => 'failure',
'user' => auth()->user()->email,
'judul' => 'fa fa-times',
'background' => 'bg-primary',
'deskripsi' => 'Admin telah menolak pembayaran karena terindikasi penipuan.',
]);
DB::commit();
return response()->json([
'status' => true,
'message' => 'Transaksi telah ditolak.'
]);
} catch (Throwable $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json([
'status' => false,
'message' => 'Terjadi kesalahan di bagian server.',
]);
}
}
public function listTransaction(Request $request){
public function listTransaction(Request $request)
{
try {
$subQuery = Transaction::join('users as b', 'transactions.pembeli', '=', 'b.email')
->join('users as s', 'transactions.penjual', '=', 's.email')
->latest()
->select('transactions.id', 'transactions.nama_barang', DB::raw("CONCAT(b.nama_depan,' ',b.nama_belakang) as nama_pembeli"), DB::raw("CONCAT(s.nama_depan,' ',s.nama_belakang) as nama_penjual"), 'transactions.total_harga', 'transactions.created_at', 'transactions.status_transaksi');
if ($request->has('search') && !empty($request->search['value'])) {
$searchTransaksi = $request->search['value'];
if (!is_numeric($searchTransaksi)) {
$subQuery->where(function ($a) use ($searchTransaksi) {
$a->whereRaw("LOWER(CONCAT(s.nama_depan,' ',s.nama_belakang)) LIKE ?", ['%' . strtolower($searchTransaksi) . '%'])
->orWhereRaw("LOWER(CONCAT(b.nama_depan,' ',b.nama_belakang)) LIKE ?", ['%' . strtolower($searchTransaksi) . '%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?', ['%' . strtolower($searchTransaksi) . '%'])
->orWhereRaw('LOWER(transactions.status_transaksi) LIKE ?', ['%' . strtolower($searchTransaksi) . '%']);
});
} else {
$subQuery->where(function ($a) use ($searchTransaksi) {
$a->whereDay('transactions.created_at', '=', $searchTransaksi)
->orWhereMonth('transactions.created_at', '=', $searchTransaksi)
->orWhereYear('transactions.created_at', '=', $searchTransaksi)
->orWhere('transactions.total_harga', '=', $searchTransaksi);
});
}
}
$queryTransaction = Transaction::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryTransaction)
->addIndexColumn()
->addColumn('action', function ($row) {
$url = route('admin-transaction.show', ['id' => $row->id]);
$invoice = route('invoice.get',['id' => $row->id]);
$html_code =
'
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
<li><a class="dropdown-item"
href="'.$invoice.'">Invoice</a>
</li>
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalTracking"
data-id="'.$row->id.'"
href="#">Tracking</a>
</li>
';
$html_code .= '
</ul>
</div>
';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
} catch (Throwable $e) {
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
public function transactionTracking(Request $request)
{
$data = TransactionDescription::where('transaction_id', $request->id)->get();
return response()->json([
'data' => $data,
]);
}
}

View File

@ -32,10 +32,10 @@ class AdminUserController extends Controller
/**
* Remove the specified resource from storage.
*/
public function destroy($id)
public function destroy(Request $request)
{
try {
$result = User::destroy($id);
$result = User::destroy($request->id);
if ($result) {
return response()->json([
'message' => 'Berhasil hapus data',
@ -50,9 +50,9 @@ class AdminUserController extends Controller
}
}
public function approveUser($id)
public function approveUser(Request $request)
{
$user = User::findOrFail($id);
$user = User::findOrFail($request->id);
$user->status = 'Finished';
$result = $user->save();
if ($result) {
@ -68,9 +68,9 @@ class AdminUserController extends Controller
}
}
public function denyUser($id)
public function denyUser(Request $request)
{
$user = User::findOrFail($id);
$user = User::findOrFail($request->id);
$user->status = 'Rejected';
$result = $user->save();
if ($result) {
@ -96,12 +96,16 @@ class AdminUserController extends Controller
if ($request->has('search') && !empty($request->search['value'])) {
$searchUser = $request->search['value'];
$subQuery->where(function ($a) use ($searchUser) {
$a->whereRaw('LOWER(email) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('LOWER(nama_depan) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('LOWER(nama_belakang) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('LOWER(status) LIKE ?',['%'.strtolower($searchUser).'%']);
});
if(!is_numeric($searchUser)){
$subQuery->where(function ($a) use ($searchUser) {
$a->whereRaw('LOWER(email) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw("LOWER(CONCAT(users.nama_depan,' ',users.nama_belakang)) LIKE ?", ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('LOWER(status) LIKE ?',['%'.strtolower($searchUser).'%']);
});
}else{
}
}
$queryUser = User::from(DB::raw("({$subQuery->toSql()}) as tmp"))

View File

@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Invoice;
use App\Http\Controllers\Controller;
use App\Models\Transaction;
use App\Models\TransactionDescription;
use App\Models\TransactionUser;
use Illuminate\Http\Request;
class InvoiceController extends Controller
{
public function getInvoice($id)
{
return view('invoice.invoice-transaction', [
'TransactionUser' => TransactionUser::HistoryTransaction(),
// 'transaction' => Transaction::findOrFail($id),
]);
}
public function exportInvoice(Request $request)
{
}
}

View File

@ -8,6 +8,9 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
@ -44,7 +47,7 @@ class LoginController extends Controller
'email.email' => 'Alamat email harus berformat valid.',
'password.required' => 'Password wajib diisi.',
'password.min' => 'Password harus memiliki panjang minimal 8 karakter.',
]
],
);
if (Auth::attempt($credentials)) {
@ -55,18 +58,18 @@ class LoginController extends Controller
} else {
return redirect()->intended('user');
}
} else if(Auth::user()->status == 'Rejected'){
} elseif (Auth::user()->status == 'Rejected') {
Session::flash('message', 'Akun ditolak karena tidak memenuhi persyaratan');
return redirect()->back();
} else {
Session::flash('message', 'Akun tidak ditemukan atau sedang dalam pengajuan');
return redirect()->back();
}
}else{
} else {
return redirect()
->back()
->withErrors($credentials)
->onlyInput('email');
->back()
->withErrors('Email atau password salah')
->onlyInput('email');
}
}
@ -88,19 +91,88 @@ class LoginController extends Controller
public function register(Request $request)
{
$nama_depan = $request->get('nama-depan');
$nama_belakang = $request->get('nama-belakang');
$tanggal_lahir = $request->get('tanggal-lahir');
$new_password = $request->get('new-password');
$credentials = $request->validate(
[
'nama_depan' => ['required'],
'nama_belakang' => ['required'],
'nik' => ['required', 'min:16'],
'new_email' => ['required', 'email'],
'email_verification' => ['required'],
'gender' => ['required'],
'tanggal_lahir' => [
'required',
function ($attribute, $value, $fail) {
$minimumBirthYear = Carbon::now()
->subYears(18)
->format('Y');
if ($value > $minimumBirthYear) {
$fail('Anda harus berusia minimal 18 tahun.');
}
},
],
'alamat' => ['required'],
'village_code' => ['required'],
'new_password' => ['required', 'min:8'],
'confirm_password' => ['required', 'same:new_password'],
'kode_verifikasi' => ['required', 'same:email_verification'],
'wajah' => ['required'],
'ktp' => ['required'],
'nohp' => ['required', 'min:10'],
'verification_status' => ['in:true'],
],
[
'nama_depan.required' => 'Nama depan harus diisi.',
'nama_belakang.required' => 'Nama belakang harus diisi. Jika nama hanya satu kata, boleh ketik ulang.',
'nik.required' => 'Nomor NIK harus diisi.',
'nik.min' => 'Nomor NIK harus 16 angka.',
'new_email.required' => 'Email harus diisi.',
'new_email.email' => 'Email harus memiliki @.',
'email_verification.required' => 'Email harus diverifikasi.',
'gender.required' => 'Jenis kelamin harus diisi.',
'tanggal_lahir.required' => 'Tanggal lahir harus diisi.',
'alamat.required' => 'Alamat harus diisi',
'village_code.required' => 'Alamat harus diisi.',
'new_password.required' => 'Password harus diisi.',
'new_password.min' => 'Password minimal 8 karakter.',
'confirm_password.required' => 'Konfirmasi password harus diisi.',
'confirm_password.same' => 'Konfirmasi password harus sama dengan password.',
'kode_verifikasi.required' => 'Silahkan verifikasi email.',
'kode_verifikasi.same' => 'Kode verifikasi tidak sama. Coba masukkan yang benar.',
'wajah.required' => 'Silahkan ambil foto wajah anda.',
'ktp.required' => 'Silahkan ambil foto ktp anda.',
'nohp.required' => 'No HP harus dimasukan.',
'nohp.min' => 'No HP memiliki minimal 10 angka.',
'verification_status.boolean' => 'Masa berlaku kode verifikasi sudah habis. Silahkan lakukan verifikasi lagi.',
],
);
$nama_depan = $request->get('nama_depan');
$nama_belakang = $request->get('nama_belakang');
$tanggal_lahir = $request->get('tanggal_lahir');
$new_password = $request->get('new_password');
$nik = $request->get('nik');
$email = $request->get('email');
$email = $request->get('new_email');
$nohp = $request->get('nohp');
$alamat = $request->get('alamat');
$foto_ktp = '';
$foto_wajah = '';
$persentase_kemiripan = 0;
$gender = $request->get('gender');
$kode_kelurahan = $request->get('kode-kelurahan');
$kode_kelurahan = $request->get('village_code');
$ktpBase64 = $request->request->get('ktp');
$wajahBase64 = $request->request->get('wajah');
@ -121,41 +193,41 @@ class LoginController extends Controller
//OCR
try {
$fotoKTP = public_path('storage/foto-ktp/' . $foto_ktp);
// $fotoKTP = public_path('storage/foto-ktp/' . $foto_ktp);
$image = Image::make($fotoKTP);
// $image = Image::make($fotoKTP);
$image->greyscale(); // Convert to grayscale
$image->contrast(10); // Increase contrast, adjust the value as needed
// $image->greyscale(); // Convert to grayscale
// $image->contrast(10); // Increase contrast, adjust the value as needed
$preprocessedfotoKTP = public_path('storage/preprocessed/preprocessed_image.jpg');
$image->save($preprocessedfotoKTP);
// $preprocessedfotoKTP = public_path('storage/preprocessed/preprocessed_image.jpg');
// $image->save($preprocessedfotoKTP);
$result = (new TesseractOCR($preprocessedfotoKTP))->run();
// $result = (new TesseractOCR($preprocessedfotoKTP))->run();
// (5) Normalize
$lines = explode("\n", $result);
$namaOCR = '';
$nikOCR = '';
$nikInputan = $nik;
$namaInputan = $nama_depan . ' ' . $nama_belakang;
// $lines = explode("\n", $result);
// $namaOCR = '';
// $nikOCR = '';
// $nikInputan = $nik;
// $namaInputan = $nama_depan . ' ' . $nama_belakang;
foreach ($lines as $line) {
// Mencari NIK
if (strpos($line, $nikInputan) !== false) {
$nikOCR = preg_replace('/[^0-9]/', '', $line);
}
// foreach ($lines as $line) {
// // Mencari NIK
// if (strpos($line, $nikInputan) !== false) {
// $nikOCR = preg_replace('/[^0-9]/', '', $line);
// }
// Mencari nama
if (strpos($line, $namaInputan) !== false) {
$namaOCR = trim(substr($line, strpos($line, ':') + 1));
}
}
// // Mencari nama
// if (strpos($line, $namaInputan) !== false) {
// $namaOCR = trim(substr($line, strpos($line, ':') + 1));
// }
// }
//Selesai
$persentase_kemiripan = (similar_text($nikInputan, $nikOCR, $percent) + similar_text($namaOCR, $namaOCR, $percent)) / 2;
// $persentase_kemiripan = (similar_text($nikInputan, $nikOCR, $percent) + similar_text($namaOCR, $namaOCR, $percent)) / 2;
// $status = 'Progress';
// if (similar_text($nikInputan, $nikOCR, $percent) >= 70 && similar_text($namaOCR, $namaOCR, $percent) >= 70) {
@ -163,51 +235,51 @@ class LoginController extends Controller
// } else {
// $status = 'Progress';
// }
} catch (\Exception $e) {
// $status = 'Progress';
}
//OCR
//Deteksi wajah belum
DB::beginTransaction();
$password = Hash::make($new_password);
$password = Hash::make($new_password);
$result = User::create([
'id' => Uuid::uuid4(),
'nama_depan' => $nama_depan,
'nama_belakang' => $nama_belakang,
'tanggal_lahir' => $tanggal_lahir,
'email' => $email,
'email_verified_at' => now(),
'password' => $password,
'nohp' => $nohp,
'nik' => $nik,
'alamat' => $alamat,
'foto_ktp' => $foto_ktp,
'foto_wajah' => $foto_wajah,
'foto_profile' => null,
'persentase_kemiripan' => $persentase_kemiripan,
'gender' => $gender,
'kode_kelurahan' => $kode_kelurahan,
'remember_token' => Str::random(10),
]);
$result = User::create([
'nama_depan' => $nama_depan,
'nama_belakang' => $nama_belakang,
'tanggal_lahir' => $tanggal_lahir,
'email' => $email,
'email_verified_at' => now(),
'password' => $password,
'nohp' => $nohp,
'nik' => $nik,
'alamat' => $alamat,
'foto_ktp' => $foto_ktp,
'foto_wajah' => $foto_wajah,
'foto_profile' => null,
'persentase_kemiripan' => $persentase_kemiripan,
'gender' => $gender,
'kode_kelurahan' => $kode_kelurahan,
'remember_token' => Str::random(10),
]);
DB::commit();
if ($result) {
return response()->json([
'status' => true,
'message' => 'Akun anda sudah terdaftar dan butuh verifikasi hingga maksimal 1 hari kerja',
]);
} else {
} catch (\Exception $e) {
DB::rollBack();
Log::error($e->getMessage());
return response()->json([
'status' => false,
'message' => 'Akun anda gagal terdaftar. Coba lagi! ' + $result,
'message' => 'Akun anda gagal terdaftar. Coba lagi!',
]);
}
}
public function accountStatus($email)
public function accountStatus(Request $request)
{
$result = User::where('email', $email)->get();
$result = User::where('email', $request->email)->get();
if ($result->isNotEmpty()) {
return response()->json([
'status' => true,
@ -228,27 +300,27 @@ class LoginController extends Controller
return response()->json($data);
}
public function searchCity($code)
public function searchCity(Request $request)
{
$data = City::where('province_code', $code)
$data = City::where('province_code', $request->code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);
return response()->json($data);
}
public function searchDistrict($code)
public function searchDistrict(Request $request)
{
$data = District::where('city_code', $code)
$data = District::where('city_code', $$request->code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);
return response()->json($data);
}
public function searchVillage($code)
public function searchVillage(Request $request)
{
$data = Village::where('district_code', $code)
$data = Village::where('district_code', $request->code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);

View File

@ -75,12 +75,12 @@ class UserContactController extends Controller
/**
* Remove the specified resource from storage.
*/
public function destroy($id)
public function destroy(Request $request)
{
try {
DB::beginTransaction();
Contact::destroy($id);
Contact::destroy($request->id);
DB::commit();
@ -101,9 +101,9 @@ class UserContactController extends Controller
}
}
public function cekEmail($email)
public function cekEmail(Request $request)
{
$result = User::where('email', $email)
$result = User::where('email', $request->email)
->where('role', 'User')
->first();
if ($result) {
@ -115,13 +115,13 @@ class UserContactController extends Controller
} else {
return response()->json([
'status' => false,
'message' => 'Akun dengen email ' . $email . ' tersedia dan belum diverifikasi',
'message' => 'Akun dengen email ' . $request->email . ' tersedia dan belum diverifikasi',
]);
}
} else {
return response()->json([
'status' => false,
'message' => 'Akun dengen email ' . $email . ' tidak tersedia atau ditolak',
'message' => 'Akun dengen email ' . $request->email . ' tidak tersedia atau ditolak',
]);
}
}
@ -129,18 +129,16 @@ class UserContactController extends Controller
public function listContact(Request $request){
try{
$subQuery = Contact::join('users','contacts.relasi_kontak','=','users.email')
->join('indonesia_villages','users.kode_kelurahan','=','indonesia_villages.code')
->join('indonesia_districts','indonesia_villages.district_code','=','indonesia_districts.code')
->join('indonesia_cities', 'indonesia_districts.city_code','=','indonesia_cities.code')
->join('indonesia_provinces','indonesia_cities.province_code','=','indonesia_provinces.code')
->where('pemilik_kontak', Auth::user()->email)
->select('contacts.id', 'users.email as email as email', 'users.nohp as nohp', 'users.alamat as alamat', DB::raw("CONCAT(users.nama_depan, ' ', users.nama_belakang) as nama_lengkap"),'indonesia_villages.name as kelurahan','indonesia_districts.name as kecamatan','indonesia_cities.name as kota','indonesia_provinces.name as provinsi');
->select(
'contacts.id',
DB::raw("CONCAT(users.nama_depan, ' ', users.nama_belakang) as nama_lengkap"),
);
if($request->has('search') && !empty($request->search['value'])){
$searchContact = $request->search['value'];
$subQuery->where(function($a) use ($searchContact){
$a->whereRaw('LOWER(users.nama_depan) LIKE ?',['%'.strtolower($searchContact).'%'])
->orWhereRaw('LOWER(users.nama_belakang) LIKE ?',['%'.strtolower($searchContact).'%']);
$a->whereRaw("LOWER(CONCAT(users.nama_depan,' ',users.nama_belakang)) LIKE ?",['%'.strtolower($searchContact).'%']);
});
}
@ -153,21 +151,10 @@ class UserContactController extends Controller
return DataTables::of($queryContact)
->addIndexColumn()
->addColumn('action', function($row){
$village = $row->kelurahan;
$city = $row->kota;
$district = $row->kecamatan;
$province = $row->provinsi;
$html_code = '
<button class="btn btn-info open-detail-modal" data-toggle="modal"
data-target="#modaldetail" id="detailContact"
data-nama="'.$row->nama_lengkap.'"
data-nohp="'.$row->nohp.'"
data-alamat="'.$row->alamat.'"
data-email="'.$row->email.'"
data-province="'.$province.'"
data-city="'.$city.'"
data-district="'.$district.'"
data-village="'.$village.'">Detail</button>
data-id="'.$row->id.'">Detail</button>
<button class="btn btn-danger open-detail-modal" id="deleteContact"
data-id="'.$row->id.'">Hapus</button>
';
@ -182,4 +169,27 @@ class UserContactController extends Controller
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
public function detailContact(Request $request){
$data = Contact::join('users','contacts.relasi_kontak','=','users.email')
->join('indonesia_villages','users.kode_kelurahan','=','indonesia_villages.code')
->join('indonesia_districts','indonesia_villages.district_code','=','indonesia_districts.code')
->join('indonesia_cities','indonesia_districts.city_code','=','indonesia_cities.code')
->join('indonesia_provinces','indonesia_cities.province_code','=','indonesia_provinces.code')
->where('contacts.id',$request->id)
->select(
DB::raw("CONCAT(users.nama_depan,' ',users.nama_belakang) as nama_lengkap"),
'users.alamat',
'users.email',
'users.nohp',
'indonesia_villages.name as kelurahan',
'indonesia_districts.name as kecamatan',
'indonesia_cities.name as kota',
'indonesia_provinces.name as provinsi'
)
->first();
return response()->json([
'data' => $data
]);
}
}

View File

@ -111,44 +111,72 @@ class UserRefundController extends Controller
public function listRefund(Request $request)
{
$subQuery = Refund::join('transactions', 'refunds.transaction_id', '=', 'transactions.id')
->select('refunds.id as id', 'refunds.total as total', 'refunds.due_date as tanggal_pengajuan', 'refunds.status as status','transactions.nama_barang as nama_barang', 'transactions.penjual as penjual', 'transactions.batas_konfirmasi_transaksi as batas_konfirmasi');
try{
$subQuery = Refund::join('transactions', 'refunds.transaction_id', '=', 'transactions.id')
->join('users as s', 'transactions.penjual','=','s.email')
->select(
'refunds.id',
'refunds.total',
'refunds.due_date',
'refunds.created_at',
'refunds.status',
'transactions.nama_barang',
DB::raw("CONCAT(s.nama_depan,' ',s.nama_belakang) as nama_penjual"),
);
if($request->has('search') && !empty($request->search['value'])){
$searchRefund = $request->search['value'];
$subQuery->where(function($a) use ($searchRefund){
$a->whereRaw('LOWER(transactions.nama_barang) LIKE ?',['%'.strtolower($searchRefund).'%'])
->orWhereRaw('LOWER(transactions.penjual) LIKE ?',['%'.strtolower($searchRefund).'%']);
});
}
$queryRefund = Refund::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryRefund)
->addIndexColumn()
->addColumn('aksi', function ($row) {
$url = route('user-refund.show', ['id' => $row->id]);
$html_code = '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
</ul>
</div>';
return $html_code;
})
->rawColumns(['aksi'])
->make(true);
if($request->has('search') && !empty($request->search['value'])){
$searchRefund = $request->search['value'];
if(!is_numeric($searchRefund)){
$subQuery->where(function($a) use ($searchRefund){
$a->whereRaw("LOWER(CONCAT(s.nama_depan,' ',s.nama_belakang)) LIKE ?",['%'.strtolower($searchRefund).'%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?',['%'.strtolower($searchRefund).'%'])
->orWhereRaw('LOWER(refunds.status) LIKE ?',['%'.strtolower($searchRefund).'%']);
});
}else{
$subQuery->where(function($a) use ($searchRefund){
$a->whereDay('refunds.created_at', '=', $searchRefund)
->orWhereMonth('refunds.created_at', '=', $searchRefund)
->orWhereYear('refunds.created_at', '=', $searchRefund)
->orWhereDay('refunds.due_date', '=', $searchRefund)
->orWhereMonth('refunds.due_date', '=', $searchRefund)
->orWhereYear('refunds.due_date', '=', $searchRefund)
->orWhere('refunds.total', '=', $searchRefund);
});
}
}
$queryRefund = Refund::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryRefund)
->addIndexColumn()
->addColumn('action', function ($row) {
$url = route('user-refund.show', ['id' => $row->id]);
$html_code = '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
</ul>
</div>';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
}catch(Throwable $e){
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
}

View File

@ -30,11 +30,7 @@ class UserTransactionController extends Controller
public function indexPembeli()
{
return view('user.transaction.pembeli.index', [
'transactions' => Transaction::where('pembeli', Auth::user()->email)
->latest()
->get(),
]);
return view('user.transaction.pembeli.index');
}
/**
@ -42,11 +38,7 @@ class UserTransactionController extends Controller
*/
public function indexPenjual()
{
return view('user.transaction.penjual.index', [
'transactions' => Transaction::where('penjual', Auth::user()->email)
->latest()
->get(),
]);
return view('user.transaction.penjual.index');
}
public function show($id)
@ -84,12 +76,6 @@ class UserTransactionController extends Controller
/**
* Store a newly created resource in storage.
*/
public function invoiceTransaction()
{
return view('user.transaction.pembeli.invoice-transaction', [
'TransactionUser' => TransactionUser::HistoryTransaction(),
]);
}
public function store(Request $request)
{
@ -546,11 +532,11 @@ class UserTransactionController extends Controller
$result = json_decode($response->body(), true);
$code = substr($result['status_code'], 0, 1);
if ($code == '4') {
if (in_array($result['status_code'], ['412','401'])) {
return response()->json([
'status' => false,
'message' => 'Transaksi gagal.',
'data' => $result
]);
} else {
try {
@ -558,7 +544,7 @@ class UserTransactionController extends Controller
Transaction::where('id', $request->id)->update([
'status_transaksi' => 'failure',
'status_pembayaran' => $result['transaction_status'],
'status_pembayaran' => 'cancel'
]);
TransactionDescription::create([
@ -825,46 +811,213 @@ class UserTransactionController extends Controller
public function listPembeli(Request $request)
{
$subQuery = transaction::join('transactions', 'refunds.total', '=', 'transactions.id')
->select('transactions.id', 'transactions.penjual as penjual', 'transactions.nama_barang as nama_barang', 'refunds.total as total', 'transactions.tanggal_transaksi', 'refunds.due_date as date', 'transactions.status_transaksi as status');
try{
$subQuery = Transaction::join('users','transactions.penjual','=','users.email')
->where('transactions.pembeli',auth()->user()->email)
->select(
'transactions.id',
DB::raw("CONCAT(users.nama_depan,' ',users.nama_belakang) as nama_penjual"),
'transactions.nama_barang',
'transactions.total_harga',
'transactions.created_at',
'transactions.status_transaksi',
'transactions.token'
);
if($request->has('search') && !empty($request->search['value'])){
$searchPembeli = $request->search['value'];
$subQuery->where(function($a) use ($searchPembeli){
$a->whereRaw('LOWER(transactions.penjual) LIKE ?',['%'.strtolower($searchPembeli).'%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?',['%'.strtolower($searchPembeli).'%']);
});
if($request->has('search') && !empty($request->search['value'])){
$searchPembeli = $request->search['value'];
if(!is_numeric($searchPembeli)){
$subQuery->where(function($a) use ($searchPembeli){
$a->whereRaw("LOWER(CONCAT(users.nama_depan,' ',users.nama_belakang)) LIKE ?",['%'.strtolower($searchPembeli).'%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?',['%'.strtolower($searchPembeli).'%'])
->orWhereRaw('LOWER(transactions.status_transaksi) LIKE ?',['%'.strtolower($searchPembeli).'%']);
});
}else{
$subQuery->where(function($a) use ($searchPembeli){
$a->where('transactions.total_harga','=',$searchPembeli);
});
}
}
$queryPembeli = Transaction::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryPembeli)
->addIndexColumn()
->addColumn('action', function ($row) {
$url = route('user-pembeli.show', ['id' => $row->id]);
$invoice = route('invoice.get',['id' => $row->id]);
$html_code = '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
<li><a class="dropdown-item"
href="'.$invoice.'">Invoice</a>
</li>
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalTracking"
data-id="'.$row->id.'"
href="#">Tracking</a>
</li>';
if($row->status_transaksi == 'created'){
$html_code .= '
<li><a class="dropdown-item" id="bayar"
data-id="'.$row->id.'"
data-token="'.$row->token.'"
href="#">Bayar</a>
</li>
<li><a href="#" data-id="'.$row->id.'"
id="cancel" class="dropdown-item">Batal</a>
</li>
';
}
if($row->status_transaksi == 'sent'){
$html_code .= '
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalFinish"
data-id="'.$row->id.'"
href="#">Selesaikan</a>
</li>
';
}
$html_code .= '
</ul>
</div>';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
}catch(Throwable $e){
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
$queryPembeli = transaction::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryPembeli)
->addIndexColumn()
->addColumn('aksi', function ($row) {
$url = route('user-pembeli.show', ['id' => $row->id]);
$html_code = '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
</ul>
</div>';
return $html_code;
})
->rawColumns(['aksi'])
->make(true);
}
}
public function listPenjual(Request $request){
try{
$subQuery = Transaction::join('users','transactions.pembeli','=','users.email')
->where('transactions.penjual',auth()->user()->email)
->select(
'transactions.id',
DB::raw("CONCAT(users.nama_depan,' ',users.nama_belakang) as nama_pembeli"),
'transactions.nama_barang',
'transactions.total_harga',
'transactions.created_at',
'transactions.status_transaksi',
);
if($request->has('search') && !empty($request->search['value'])){
$searchPenjual = $request->search['value'];
if(!is_numeric($searchPenjual)){
$subQuery->where(function($a) use ($searchPenjual){
$a->whereRaw("LOWER(CONCAT(users.nama_depan,' ',users.nama_belakang)) LIKE ?",['%'.strtolower($searchPenjual).'%'])
->orWhereRaw('LOWER(transactions.nama_barang) LIKE ?',['%'.strtolower($searchPenjual).'%'])
->orWhereRaw('LOWER(transactions.status_transaksi) LIKE ?',['%'.strtolower($searchPenjual).'%']);
});
}else{
$subQuery->where(function($a) use ($searchPenjual){
$a->whereDay('transactions.created_at', '=', $searchPenjual)
->orWhereMonth('transactions.created_at', '=', $searchPenjual)
->orWhereYear('transactions.created_at', '=', $searchPenjual)
->orWhere('transactions.total_harga', '=', $searchPenjual);
});
}
}
$queryPenjual = Transaction::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if ($request->ajax()) {
return DataTables::of($queryPenjual)
->addIndexColumn()
->addColumn('action', function ($row) {
$url = route('user-penjual.show', ['id' => $row->id]);
$invoice = route('invoice.get',['id' => $row->id]);
$html_code = '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="'.$url.'">Detail</a>
</li>
<li><a class="dropdown-item"
href="'.$invoice.'">Invoice</a>
</li>
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalTracking"
data-id="'.$row->id.'"
href="#">Tracking</a>
</li>';
if($row->status_transaksi == 'success'){
$html_code .= '
<li><a class="dropdown-item" id="processTransaction"
data-id="'.$row->id.'"
href="#">Proses Transaksi</a>
</li>
';
}
if($row->status_transaksi == 'progress'){
$html_code .= '
<li><a class="dropdown-item" id="sendOrder"
data-id="'.$row->id.'"
href="#">Kirim barang</a>
</li>
';
}
if($row->status_transaksi == 'sent'){
$html_code .= '
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalOrderSent"
data-id="'.$row->id.'"
href="#">Barang sudah sampai</a>
</li>
';
}
$html_code .= '
</ul>
</div>';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
}catch(Throwable $e){
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
public function transactionTracking(Request $request){
$data = TransactionDescription::where('transaction_id', $request->id)->get();
return response()->json([
'data' => $data
]);
}
}

View File

@ -20,7 +20,6 @@ class User extends Authenticatable
* @var array<int, string>
*/
protected $fillable = [
'id',
'nama_depan',
'nama_belakang',
'tanggal_lahir',

View File

@ -500,7 +500,10 @@ $(document).ready(function () {
$("#selectCity").select2({
placeholder: "Pilih Kabupaten/Kota",
ajax: {
url: "/cari-kota/" + code,
url: "/cari-kota/",
data: {
code: code,
},
processResults: function ({ data }) {
return {
results: $.map(data, function (item) {
@ -529,7 +532,10 @@ $(document).ready(function () {
$("#selectDistrict").select2({
placeholder: "Pilih Kecamatan",
ajax: {
url: "/cari-kecamatan/" + code, // Isi dengan URL yang sesuai
url: "/cari-kecamatan/",
data: {
code: code,
}, // Isi dengan URL yang sesuai
processResults: function ({ data }) {
return {
results: $.map(data, function (item) {
@ -558,7 +564,10 @@ $(document).ready(function () {
$("#selectVillage").select2({
placeholder: "Pilih Kelurahan",
ajax: {
url: "/cari-kelurahan/" + code, // Isi dengan URL yang sesuai
url: "/cari-kelurahan/",
data: {
code: code,
}, // Isi dengan URL yang sesuai
processResults: function ({ data }) {
return {
results: $.map(data, function (item) {

View File

@ -13,7 +13,7 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-refund">
<table class="table table-striped" id="table-refund" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">
@ -39,38 +39,34 @@
</div>
</section>
</div>
@include('admin.refund.modal-keterangan-status')
<script>
$(function() {
let listRefund = $('#table-refund').DataTable({
processing: true,
serverSide: true,
// ajax: "{{ route('admin-refund.list-refund') }}",
ajax: {
url: `{{ route('admin-refund.list-refund') }}`,
data: function(d) {
// Validasi dan pembersihan input sebelum dikirim
d.search.value = cleanAndValidateInput(d.search.value);
// Tambahan data lain yang akan dikirim
// ...
}
},
ajax: `{{ route('admin-refund.list-refund') }}`,
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: true,
searchable: false,
className: 'text-center'
},
{
data: 'pembeli',
name: 'pembeli',
className: 'text-center'
},
{
data: 'nama_barang',
name: 'nama_barang',
className: 'text-center'
},
{
data: 'penjual',
name: 'penjual',
className: 'text-center'
},
{
data: 'total',
@ -87,6 +83,7 @@
// Untuk tipe yang lain, kembalikan nilai asli
return data;
},
className: 'text-center'
},
{
data: 'created_at',
@ -95,7 +92,7 @@
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('en-US', {
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
@ -104,7 +101,8 @@
return formattedDate;
}
return data;
}
},
className: 'text-center'
},
{
data: 'due_date',
@ -113,7 +111,7 @@
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('en-US', {
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
@ -122,37 +120,31 @@
return formattedDate;
}
return data;
}
},
className: 'text-center'
},
{
data: 'status',
render: function(data, type, row) {
if (row.status == 'partial refund') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status}</a>`;
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
} else if (row.status == 'pending') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">${row.status}</a>`;
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
} else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">${row.status}</a>`;
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
}
},
orderable: true,
searchable: true
className: 'text-center'
},
{
data: 'action',
name: 'action',
orderable: false,
searchable: false
searchable: false,
className: 'text-center'
}
],
});
// Fungsi untuk membersihkan dan validasi input
function cleanAndValidateInput(input) {
// Lakukan pembersihan atau validasi sesuai kebutuhan
// Contoh: Mengganti karakter yang tidak diizinkan dengan spasi
return input.replace(/[^a-zA-Z0-9\s]/g, '');
}
});
</script>
@extends('admin.transaction.modal-keterangan-status')

View File

@ -0,0 +1,57 @@
<div class="modal fade" id="modalKeteranganStatus" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header d-flex justify-content-center">
<h3 class="modal-title fs-5" id="staticBackdropLabel">Keterangan Status Transaksi</h3>
</div>
<div class="modal-body">
<div class="mb-3">
<label class="badge badge-light">Created</label>
<p class="form-control">Transaksi baru telah dibuat oleh pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-dark">Challenge</label>
<p class="form-control">Transaksi diduga penipuan dan perlu direview oleh admin.</p>
</div>
<div class="mb-3">
<label class="badge badge-info">Success</label>
<p class="form-control">Transaksi sukses dibayar dan akan dilanjutkan ke pihak penjual</p>
</div>
<div class="mb-3">
<label class="badge badge-danger">Failure</label>
<p class="form-control">Terjadi kesalahan pada transaksi seperti pembatalan, pembayaran sudah
kedaluwarsa atau kerusakan di server.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Process</label>
<p class="form-control">Transaksi/pesanan pembeli sedang diproses oleh penjual.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Sending</label>
<p class="form-control">Pesanan sedang dikirim oleh penjual.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Sent</label>
<p class="form-control">Pesanan sudah sampai di tujuan pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-success">Finished</label>
<p class="form-control">Transaksi telah selesai dan diselesaikan oleh pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-danger">Refund</label>
<p class="form-control">Transaksi ditandai oleh pembeli untuk dikembalikan/retur dikarenakan
kemungkinan barang/jasa yang salah atau terjadi kerusakan.</p>
</div>
</div>
</div>
</div>
</div>

View File

@ -12,15 +12,19 @@
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
}, {
data: 'bulan',
name: 'bulan',
className: 'text-center'
}, {
data: 'tahun',
name: 'tahun',
className: 'text-center'
}, {
data: 'persentase',
name: 'persentase'
name: 'persentase',
className: 'text-center'
}, {
data: 'status',
render: function(data, type, row) {
@ -30,13 +34,13 @@
return `<div class="badge badge-danger">${row.status}</div>`;
}
},
orderable: true,
searchable: true
className: 'text-center'
}, {
data: 'action',
name: 'action',
orderable: false,
searchable: false
searchable: false,
className: 'text-center'
}]
});
@ -195,7 +199,7 @@
<a class="btn btn-success active" href="#" id="tambahModal">Tambah Data Kebijakan</a>
</div>
<div class="table-responsive">
<table class="table table-striped" id="table-setting">
<table class="table table-striped" id="table-setting" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">

View File

@ -161,19 +161,18 @@
</div>
</div>
</div>
<hr>
<div class="text-md-right">
<div class="float-lg-left mb-lg-0 mb-3">
<a href="/pembeli" class="btn btn-primary btn-icon icon-left"><i
class="fas fa-credit-card" id="payment"></i> Process
Payment</a>
<a href="/pembeli" class="btn btn-danger btn-icon icon-left"><i
class="fas fa-times"></i>
Cancel</a>
@if ($transaction->status_transaksi == 'challenge')
<hr>
<div class="text-md-center">
<p>Pada transaksi ini terjadi penipuan. Apakah anda ini menerima transaksi ini?</p>
<button class="btn btn-primary btn-icon icon-left" data-id="{{ $transaction->id }}"
id="acceptTransaction"><i class="fas fa-credit-card" id="payment"></i>Terima
Transaksi</button>
<button class="btn btn-danger btn-icon icon-left" data-id="{{ $transaction->id }}"
id="denyTransaction"><i class="fas fa-times"></i>
Tolak Transaksi</button>
</div>
<button class="btn btn-warning btn-icon icon-left"><i class="fas fa-print"></i>
Print</button>
</div>
@endif
</div>
</div>
</div>
@ -181,4 +180,125 @@
</div>
</section>
</div>
<script>
$(document).ready(function() {
$('#acceptTransaction').on('click', function() {
var id = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
Swal.fire({
title: 'Terima Transaksi',
text: 'Apakah anda yakin untuk menerima transaksi ini?',
icon: 'question',
showCancelButton: true,
cancelButtonText: 'Tunggu, Lihat sebentar',
confirmButtonText: 'Ya, terima transaksi ini'
}).then((result) => {
if (result.isConfirmed) {
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
allowEscapeKey: false,
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('admin-transaction.accept-transaction') }}",
data: {
id: id
},
type: 'PUT',
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil' :
'Gagal',
text: response.message,
icon: response.status ? 'success' : 'error'
}).then(function() {
if (response.status) {
location.reload();
}
});
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Terjadi kesalahan di server',
icon: 'error'
});
console.log(error);
}
});
}
});
});
$('#denyTransaction').on('click', function() {
var id = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
Swal.fire({
title: 'Tolak Transaksi',
text: 'Apakah anda yakin untuk menolak transaksi ini?',
icon: 'question',
showCancelButton: true,
cancelButtonText: 'Tunggu, Lihat sebentar',
confirmButtonText: 'Ya, tolak transaksi ini'
}).then((result) => {
if (result.isConfirmed) {
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
allowEscapeKey: false,
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('admin-transaction.deny-transaction') }}",
data: {
id: id
},
type: 'PUT',
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil' :
'Gagal',
text: response.message,
icon: response.status ? 'success' : 'error'
}).then(function() {
if (response.status) {
location.reload();
}
});
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Terjadi kesalahan di server',
icon: 'error'
});
console.log(error);
}
});
}
});
});
});
</script>
@endsection

View File

@ -13,7 +13,7 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-4">
<table class="table table-striped" id="table-transaction" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">
@ -24,83 +24,151 @@
<th>Penjual</th>
<th>Total</th>
<th>Tanggal Transaksi</th>
<th>Tanggal Update</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($transactions as $transaction)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $transaction->nama_barang }}</td>
<td>{{ $transaction->data_pembeli->nama_depan . ' ' . $transaction->data_pembeli->nama_belakang }}
</td>
<td>{{ $transaction->data_penjual->nama_depan . ' ' . $transaction->data_penjual->nama_belakang }}
</td>
<td>Rp {{ number_format($transaction->total_bayar, 2, ',', '.') }}</td>
<td>{{ $transaction->created_at }}</td>
<td>{{ $transaction->updated_at }}</td>
<td><a href="#" data-toggle="modal" data-target="#modalKeteranganStatus"
class="badge {{ in_array($transaction->status_transaksi, ['created'])
? 'badge-light'
: (in_array($transaction->status_transaksi, ['success'])
? 'badge-info'
: (in_array($transaction->status_transaksi, ['process', 'sending', 'sent'])
? 'badge-warning'
: (in_array($transaction->status_transaksi, ['cancel', 'failure', 'refund'])
? 'badge-danger'
: ($transaction->status_transaksi == 'finished'
? 'badge-success'
: 'bagde-dark')))) }}">{{ ucwords($transaction->status_transaksi) }}</a>
</td>
<td>
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
....
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="{{ route('admin-transaction.show', $transaction->id) }}">Detail</a>
</li>
@if (!$transaction->transactionDescription->isEmpty())
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalTracking"
data-transaction="{{ $transaction->transactionDescription }}">Tracking</a>
</li>
@endif
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
</div>
@include('admin.transaction.modal-tracking')
@include('admin.transaction.modal-keterangan-status')
<script>
$(document).ready(function() {
let listTransaction = $('#table-transaction').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('admin-transaction.list-transaction') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
}, {
data: 'nama_barang',
name: 'nama_barang',
className: 'text-center'
}, {
data: 'nama_pembeli',
name: 'nama_pembeli',
className: 'text-center'
}, {
data: 'nama_penjual',
name: 'nama_penjual',
className: 'text-center'
}, {
data: 'total_harga',
name: 'total_harga',
render: function(data, type, row) {
// Memastikan bahwa ini adalah tampilan (bukan sorting atau filtering)
if (type === 'display') {
// Mengubah nilai 'total' menjadi format mata uang Indonesia
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR'
}).format(data);
}
// Untuk tipe yang lain, kembalikan nilai asli
return data;
},
className: 'text-center'
}, {
data: 'created_at',
name: 'created_at',
render: function(data, type, row) {
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
},
className: 'text-center'
}, {
data: 'status_transaksi',
name: 'status_transaksi',
render: function(data, type, row) {
if (row.status_transaksi == 'created') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'success') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['process', 'sending', 'sent'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['cancel', 'failure', 'refund'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'finished') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
}
},
className: 'text-center'
}, {
data: 'action',
name: 'action',
orderable: false,
searchable: false,
className: 'text-center'
}]
});
$('#modalTracking').on('show.bs.modal', function(event) {
var triggerLink = $(event.relatedTarget); // Tombol yang memicu modal
var transactionDatas = triggerLink.data('transaction'); // Ambil data dari tombol
var transactionId = triggerLink.data('id'); // Ambil data dari tombol
const csrfToken = $('meta[name="csrf-token"]').attr('content');
var modal = $(this);
// Buat variabel untuk menyimpan HTML aktivitas
transactionDatas = transactionDatas.reverse();
var activitiesHtml = '';
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
$.ajax({
url: "{{ route('admin.transaction-tracking') }}",
type: 'GET',
data: {
id: transactionId
},
success: function(response) {
var transactionDatas = response.data;
// Buat variabel untuk menyimpan HTML aktivitas
var activitiesHtml = '';
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
transactionDatas = transactionDatas.reverse();
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
<div class="activity">
<div class="activity-icon ${transactionDescription.background} text-white shadow-primary">
<i class="${transactionDescription.judul}" style="font-size: 36px;"></i>
@ -113,10 +181,10 @@
</div>
</div>
`;
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
<div class="activity">
<div class="activity-icon bg-primary text-white shadow-primary">
<i class="fas fa-ban" style="font-size: 36px;"></i>
@ -129,11 +197,22 @@
</div>
</div>
`;
}
}
// Menampilkan data dalam modal
var modal = $(this);
modal.find('.activities').html(activitiesHtml);
// Menampilkan data dalam modal
modal.find('.activities').html(activitiesHtml);
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Gagal mendapatkan data',
icon: 'error'
}).then(function() {
Swal.close();
modal.modal('hide');
});
}
});
});
});

View File

@ -186,6 +186,15 @@
cancelButtonText: 'Tidak'
}).then((result) => {
if (result.isConfirmed) {
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
allowEscapeKey: false,
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
@ -193,8 +202,10 @@
});
$.ajax({
url: "{{ route('admin-user.approve', ':id') }}".replace(
':id', id),
url: "{{ route('admin-user.approve') }}",
data: {
id: id
},
type: 'PUT',
success: function(response) {
Swal.fire({
@ -234,6 +245,15 @@
cancelButtonText: 'Tidak'
}).then((result) => {
if (result.isConfirmed) {
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
allowEscapeKey: false,
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
@ -241,8 +261,10 @@
});
$.ajax({
url: "{{ route('admin-user.deny', ':id') }}".replace(
':id', id),
url: "{{ route('admin-user.deny') }}",
data: {
id: id
}
type: 'PUT',
success: function(response) {
Swal.fire({

View File

@ -13,11 +13,10 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-user">
<table class="table table-striped" id="table-user" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">#</th>
<th>UID</th>
<th>Foto Profil</th>
<th>Nama Lengkap</th>
<th>Email</th>
@ -47,11 +46,7 @@
name: 'DT_RowIndex',
orderable: false,
searchable: false,
}, {
data: 'id',
name: 'id',
orderable: false,
searchable: true,
className: 'text-center'
}, {
data: 'foto_profile',
name: 'foto_profile',
@ -64,27 +59,33 @@
},
orderable: false,
searchable: false,
className: 'text-center'
}, {
data: 'nama_lengkap',
name: 'nama_lengkap'
name: 'nama_lengkap',
className: 'text-center'
}, {
data: 'email',
name: 'email'
name: 'email',
className: 'text-center'
}, {
data: 'tanggal_daftar',
name: 'tanggal_daftar',
render: function(data, type, row) {
if (type == 'display') {
if (type === 'display') {
var date = new Date(data);
var formattedDate = date.toLocaleDateString('en-US', {
year: '2-digit',
month: '2-digit',
day: '2-digit'
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
}
},
className: 'text-center'
}, {
data: 'status',
render: function(data, type, row) {
@ -97,12 +98,14 @@
}
},
orderable: true,
searchable: true
searchable: true,
className: 'text-center'
}, {
data: 'action',
name: 'action',
orderable: false,
searchable: false
searchable: false,
className: 'text-center'
}],
});
@ -127,10 +130,10 @@
});
$.ajax({
url: "{{ route('admin-user.destroy', ':admin_user') }}"
.replace(
':admin_user',
dataId),
url: "{{ route('admin-user.destroy') }}"
data: {
id: dataId
},
type: 'DELETE',
processData: false,
contentType: false,

View File

@ -23,7 +23,7 @@
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-contact">
<table class="table table-striped" id="table-contact" style="font-size: 16px;">
<thead>
<tr class="text-center">
<th>#</th>
@ -32,6 +32,7 @@
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
@ -46,27 +47,45 @@
<script>
$(document).ready(function() {
let check = false;
var teksArea = document.getElementById('resultArea');
var teksNama = document.getElementById('teksNama');
var teksNohp = document.getElementById('teksNoHP');
var teksEmail = document.getElementById('teksEmail');
var teksAlamat = document.getElementById('teksAlamat');
$('#modaldetail').on('show.bs.modal', function(event) {
var triggerLink = $(event.relatedTarget);
let dataNama = triggerLink.data('nama');
let dataEmail = triggerLink.data('email');
let dataNoHP = triggerLink.data('nohp');
let dataAlamat = triggerLink.data('alamat');
let dataProvince = triggerLink.data('province');
let dataCity = triggerLink.data('city');
let dataDistrict = triggerLink.data('district');
let dataVillage = triggerLink.data('village');
teksNama.innerHTML = dataNama;
teksAlamat.innerHTML = dataNama + ", " + capital(dataVillage) + ", " + capital(
dataDistrict) + ", " + capital(dataCity) + ", " + capital(dataProvince);
teksNohp.innerHTML = dataNoHP;
teksEmail.innerHTML = dataEmail;
let dataId = triggerLink.data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
var modal = $(this);
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('user-contact.detail-contact') }}",
type: "GET",
data: {
id: dataId
},
success: function(response) {
let alamat = response.data.alamat + ", Kel. " + capital(response.data
.kelurahan) + ", Kec. " + capital(response.data.kecamatan) +
", Kab. " + capital(response.data.kota) + ", " + capital(
response.data.provinsi);
$('#teksNama').text(response.data.nama_lengkap);
$('#teksAlamat').text(alamat);
$('#teksNoHP').text(response.data.nohp);
$('#teksEmail').text(response.data.email);
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Terjadi error di server',
icon: 'error'
}).then(function() {
modal.modal('hide');
});
}
});
});
function capital(text) {
@ -128,9 +147,10 @@
$.ajax({
url: "{{ route('user-contact.destroy', ':id') }}".replace(
':id',
dataId),
url: "{{ route('user-contact.destroy') }}",
data: {
id: dataId
}
type: 'DELETE',
contentType: false,
processType: false,
@ -184,7 +204,10 @@
});
$.ajax({
url: "{{ route('user-contact.email', ':email') }}".replace(':email', email),
url: "{{ route('user-contact.email') }}",
data: {
email: email
}
type: 'GET',
success: function(response) {
if (response.status) {

View File

@ -18,7 +18,7 @@
<form role="form" id="formContact">
<div class="form-group">
<label for="inputemail">Email</label>
<input type="text" class="form-control" name="email" placeholder="Enter your email" />
<input type="text" class="form-control" name="email" placeholder="Masukan email" />
</div>
<div class="form-group">
<button type="button" class="btn btn-primary" id="checkButton">Check</button>
@ -26,7 +26,7 @@
<div class="form-group">
<label for="exampleFormControlTextarea1" class="form-label">Hasil</label>
<textarea class="form-control" rows="10" cols="10" readonly id="resultArea""></textarea>
<textarea class="form-control" rows="10" cols="10" readonly id="resultArea"></textarea>
</div>
</form>
</div>
@ -34,7 +34,7 @@
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Tutup</button>
<button type="button" class="btn btn-primary submitBtn" id="tambahkanContact">Tambahkan Data</button>
</div>
</div>

View File

@ -9,34 +9,27 @@
</div>
<div class="modal-body">
<div class="card-body">
@isset($user)
<div class="alert alert-primary" role="alert">
<div class="form-group">
<label for="teksNama" style="font-size: 1.1em;">Nama</label>
{{-- <p class="form-control-static" id="teksNama"></p> --}}
<span
class="text-muted ">{{ ucwords(strtolower($user->nama_depan . ' ' . $user->nama_belakang)) }}</span>
<p class="form-control-static" id="teksNama"></p>
</div>
<hr style="border-top: 1px solid #fff;">
<div class="form-group">
<label for="teksNoHP" style="font-size: 1.1em;">No HP</label>
{{-- <p class="form-control-static" id="teksNoHP"></p> --}}
<span class="text-muted ">{{ $user->nohp }}</span>
<p class="form-control-static" id="teksNoHP"></p>
</div>
<hr style="border-top: 1px solid #fff;">
<div class="form-group">
<label for="teksEmail" style="font-size: 1.1em;">Email</label>
{{-- <p class="form-control-static" id="teksEmail"></p> --}}
<span class="text-muted ">{{ $user->email }}</span>
<p class="form-control-static" id="teksEmail"></p>
</div>
<hr style="border-top: 1px solid #fff;">
<div class="form-group">
<label for="teksAlamat" style="font-size: 1.1em;">Alamat</label>
{{-- <p class="form-control-static" id="teksAlamat"></p> --}}
<span class="text-muted ">{{ $user->alamat }}</span>
<p class="form-control-static" id="teksAlamat"></p>
</div>
</div>
@endisset
</div>
</div>
<div class="modal-footer">

View File

@ -15,7 +15,7 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-refund">
<table class="table table-striped" id="table-refund" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">
@ -30,37 +30,9 @@
<th>Aksi</th>
</tr>
</thead>
{{-- <tbody>
@foreach ($refunds as $refund)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $refund->transaction->nama_barang }}
</td>
<td>{{ $refund->transaction->data_penjual->nama_depan }}
</td>
<td>{{ $refund->total }}</td>
<td>{{ $refund->created_at }}</td>
<td>{{ $refund->due_date }}</td>
<td><a href="#" data-toggle="modal"
data-target="#modalKeteranganStatus"
class="badge {{ $refund->status == 'refund' ? 'badge-succes' : ($refund->status == 'pending' ? 'badge-warning' : 'badge-danger') }}">{{ ucwords($refund->status) }}</a>
</td>
<td>
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
...
</button>
<div class="dropdown-menu">
<a class="dropdown-item"
href="{{ route('user-refund.show', $refund->id) }}">Detail</a>
</div>
</div>
</td>
</tr>
@endforeach
</tbody> --}}
<tbody>
</tbody>
</table>
</div>
</div>
@ -69,6 +41,7 @@
</div>
</section>
</div>
@include('user.refund.modal-keterangan-status')
<script>
$(function() {
let listRefund = $('#table-refund').DataTable({
@ -76,69 +49,97 @@
serverSide: true,
ajax: "{{ route('user-refund.list-refund') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: true,
},
{
data: 'id',
name: 'id',
orderable: false,
searchable: true,
},
{
data: 'nama_barang',
name: 'nama_barang'
},
{
data: 'penjual',
name: 'penjual'
},
{
date: 'total',
name: 'total'
},
{
data: 'tanggal_pengajuan',
name: 'tanggal_pengajuan',
render: function(data, type, row) {
if (type == 'display') {
var date = new Date(data);
var formattedDate = date.toLocaleDateString('en-US', {
year: '2-digit',
month: '2-digit',
day: '2-digit'
});
return formattedDate;
}
return data;
}
},
{
data: 'batas_konfirmasi',
name: 'batas_konfirmasi'
},
{
data: null,
render: function(data, type, row) {
if (row.status == 'partial refund') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status}</a>`;
}else if (row.status == 'pending') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">${row.status}</a>`;
}else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">${row.status}</a>`;
}
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
},
orderable: true,
searchable: true
},
{
data: 'aksi',
name: 'aksi',
orderable: false,
searchable: true
}
{
data: 'nama_barang',
name: 'nama_barang',
className: 'text-center'
},
{
data: 'nama_penjual',
name: 'nama_penjual',
className: 'text-center'
},
{
data: 'total',
name: 'total',
render: function(data, type, row) {
// Memastikan bahwa ini adalah tampilan (bukan sorting atau filtering)
if (type === 'display') {
// Mengubah nilai 'total' menjadi format mata uang Indonesia
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR'
}).format(data);
}
// Untuk tipe yang lain, kembalikan nilai asli
return data;
},
className: 'text-center'
},
{
data: 'created_at',
name: 'created_at',
render: function(data, type, row) {
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
},
className: 'text-center'
},
{
data: 'due_date',
name: 'due_date',
render: function(data, type, row) {
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
},
className: 'text-center'
},
{
data: 'status',
render: function(data, type, row) {
if (row.status == 'partial refund') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
} else if (row.status == 'pending') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
} else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">${row.status.charAt(0).toUpperCase()}${row.status.slice(1)}</a>`;
}
},
className: 'text-center'
},
{
data: 'action',
name: 'action',
orderable: false,
searchable: false,
className: 'text-center'
}
],
})
})

View File

@ -0,0 +1,57 @@
<div class="modal fade" id="modalKeteranganStatus" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header d-flex justify-content-center">
<h3 class="modal-title fs-5" id="staticBackdropLabel">Keterangan Status Transaksi</h3>
</div>
<div class="modal-body">
<div class="mb-3">
<label class="badge badge-light">Created</label>
<p class="form-control">Transaksi baru telah dibuat oleh pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-dark">Challenge</label>
<p class="form-control">Transaksi diduga penipuan dan perlu direview oleh admin.</p>
</div>
<div class="mb-3">
<label class="badge badge-info">Success</label>
<p class="form-control">Transaksi sukses dibayar dan akan dilanjutkan ke pihak penjual</p>
</div>
<div class="mb-3">
<label class="badge badge-danger">Failure</label>
<p class="form-control">Terjadi kesalahan pada transaksi seperti pembatalan, pembayaran sudah
kedaluwarsa atau kerusakan di server.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Process</label>
<p class="form-control">Transaksi/pesanan pembeli sedang diproses oleh penjual.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Sending</label>
<p class="form-control">Pesanan sedang dikirim oleh penjual.</p>
</div>
<div class="mb-3">
<label class="badge badge-warning">Sent</label>
<p class="form-control">Pesanan sudah sampai di tujuan pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-success">Finished</label>
<p class="form-control">Transaksi telah selesai dan diselesaikan oleh pembeli.</p>
</div>
<div class="mb-3">
<label class="badge badge-danger">Refund</label>
<p class="form-control">Transaksi ditandai oleh pembeli untuk dikembalikan/retur dikarenakan
kemungkinan barang/jasa yang salah atau terjadi kerusakan.</p>
</div>
</div>
</div>
</div>
</div>

View File

@ -30,21 +30,23 @@
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-pembeli">
<table class="table table-striped" id="table-pembeli" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">
#
</th>
<th>Penjual</th>
<th>Nama Barang</th>
<th>Penjual</th>
<th>Total</th>
<th>Tanggal Transaksi</th>
<th>Tanggal Update</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
@ -67,86 +69,104 @@
serverSide: true,
ajax: "{{ route('user-pembeli.list-pembeli') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
},
{
data: 'id',
name: 'id',
orderable: false,
searchable: true,
},
{
data: 'penjual',
name: 'penjual',
},
{
data: 'nama_barang',
name: 'nama_barang'
},
{
data: 'total',
name: 'total'
},
{
data: 'tanggal_transaksi',
name: 'tanggal_transaksi',
render: function(data, type, row) {
if (type == 'display') {
var date = new Date(data);
var formattedDate = date.toLocaleDateString('en-US', {
year: '2-digit',
month: '2-digit',
day: '2-digit'
});
return formattedDate;
}
return data;
}
},
{
data: 'tanggal_update',
name: 'tanggal_update',
render: function(data, type, row) {
if (type == 'display') {
var date = new Date(data);
var formattedDate = date.toLocaleDateString('en-US', {
year: '2-digit',
month: '2-digit',
day: '2-digit'
});
return formattedDate;
}
return data;
}
},
{
data: null,
render: function(data, type, row) {
if (row.status == 'partial refund') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status}</a>`;
}else if (row.status == 'pending') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">${row.status}</a>`;
}else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">${row.status}</a>`;
}
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
},
orderable: true,
searchable: true
},
{
data: 'aksi',
name: 'aksi',
orderable: false,
searchable: false
}],
{
data: 'nama_barang',
name: 'nama_barang',
className: 'text-center'
},
{
data: 'nama_penjual',
name: 'nama_penjual',
className: 'text-center'
},
{
data: 'total_harga',
name: 'total_harga',
render: function(data, type, row) {
// Memastikan bahwa ini adalah tampilan (bukan sorting atau filtering)
if (type === 'display') {
// Mengubah nilai 'total' menjadi format mata uang Indonesia
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR'
}).format(data);
}
// Untuk tipe yang lain, kembalikan nilai asli
return data;
},
className: 'text-center'
},
{
data: 'created_at',
name: 'created_at',
render: function(data, type, row) {
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
},
className: 'text-center'
},
{
data: 'status_transaksi',
name: 'status_transaksi',
render: function(data, type, row) {
if (row.status_transaksi == 'created') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'success') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['process', 'sending', 'sent'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['cancel', 'failure', 'refund'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'finished') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
}
},
className: 'text-center'
},
{
data: 'action',
name: 'action',
orderable: false,
searchable: false,
className: 'text-center'
}
],
});
// Bayar
$('#table-3').on('click', '#bayar', function() {
$('#table-pembeli').on('click', '#bayar', function() {
const id = $(this).data('id');
const token = $(this).data('token');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
@ -183,7 +203,7 @@
'error'
}).then(function() {
if (response.status) {
location.reload();
listPembeli.ajax.reload();
}
});
},
@ -226,6 +246,10 @@
icon: response.status ? 'info' :
'error',
confirmButtonText: 'OK'
}).then(function() {
if (response.status) {
listPembeli.ajax.reload();
}
});
},
error: function(error) {
@ -265,6 +289,10 @@
'Pembayaran Gagal' : 'Gagal',
text: response.message,
icon: 'error',
}).then(function() {
if (response.status) {
listPembeli.ajax.reload();
}
});
},
error: function(error) {
@ -306,6 +334,10 @@
text: response.message,
icon: response.status ? 'info' :
'error',
}).then(function() {
if (response.status) {
listPembeli.ajax.reload();
}
});
},
error: function(fail) {
@ -320,7 +352,7 @@
});
});
$('#table-3').on('click', '#cancel', function() {
$('#table-pembeli').on('click', '#cancel', function() {
const id = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
@ -363,7 +395,7 @@
icon: response.status ? 'success' : 'error'
}).then(function() {
if (response.status) {
location.reload();
listPembeli.ajax.reload();
}
});
},
@ -386,17 +418,33 @@
$(document).ready(function() {
$('#modalTracking').on('show.bs.modal', function(event) {
var triggerLink = $(event.relatedTarget); // Tombol yang memicu modal
var transactionDatas = triggerLink.data('transaction'); // Ambil data dari tombol
var transactionId = triggerLink.data('id'); // Ambil data dari tombol
const csrfToken = $('meta[name="csrf-token"]').attr('content');
var modal = $(this);
// Buat variabel untuk menyimpan HTML aktivitas
transactionDatas = transactionDatas.reverse();
var activitiesHtml = '';
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
$.ajax({
url: "{{ route('user.transaction-tracking') }}",
type: 'GET',
data: {
id: transactionId
},
success: function(response) {
var transactionDatas = response.data;
// Buat variabel untuk menyimpan HTML aktivitas
var activitiesHtml = '';
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
transactionDatas = transactionDatas.reverse();
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
<div class="activity">
<div class="activity-icon ${transactionDescription.background} text-white shadow-primary">
<i class="${transactionDescription.judul}" style="font-size: 36px;"></i>
@ -409,10 +457,10 @@
</div>
</div>
`;
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
<div class="activity">
<div class="activity-icon bg-primary text-white shadow-primary">
<i class="fas fa-ban" style="font-size: 36px;"></i>
@ -425,11 +473,22 @@
</div>
</div>
`;
}
}
// Menampilkan data dalam modal
var modal = $(this);
modal.find('.activities').html(activitiesHtml);
// Menampilkan data dalam modal
modal.find('.activities').html(activitiesHtml);
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Gagal mendapatkan data',
icon: 'error'
}).then(function() {
Swal.close();
modal.modal('hide');
});
}
});
});
$('#modalFinish').on('show.bs.modal', function(event) {

View File

@ -24,104 +24,22 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-3">
<table class="table table-striped" id="table-penjual" style="font-size: 16px;">
<thead>
<tr>
<th class="text-center">
#
</th>
<th>Pembeli</th>
<th>Nama Barang</th>
<th>Pembeli</th>
<th>Total</th>
<th>Tanggal Pembuatan</th>
<th>Tanggal Update</th>
<th>Tanggal Transaksi</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@forelse ($transactions as $transaction)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $transaction->data_pembeli->nama_depan . ' ' . $transaction->data_pembeli->nama_belakang }}
</td>
<td>{{ $transaction->nama_barang }}</td>
<td>Rp {{ number_format($transaction->total_bayar, 2, ',', '.') }}</td>
<td>{{ $transaction->created_at }}</td>
<td>{{ $transaction->updated_at }}</td>
<td><a href="#" data-toggle="modal"
data-target="#modalKeteranganStatus"
class="badge {{ in_array($transaction->status_transaksi, ['created'])
? 'badge-light'
: (in_array($transaction->status_transaksi, ['success', 'challenge'])
? 'badge-info'
: (in_array($transaction->status_transaksi, ['process', 'sending', 'sent'])
? 'badge-warning'
: (in_array($transaction->status_transaksi, ['cancel', 'failure', 'refund'])
? 'badge-danger'
: ($transaction->status_transaksi == 'finished'
? 'badge-success'
: 'badge-dark')))) }}">{{ ucwords($transaction->status_transaksi) }}</a>
</td>
<td>
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
...
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item"
href="{{ route('user-penjual.show', $transaction->id) }}">Detail</a>
</li>
@if (!$transaction->transactionDescription->isEmpty())
<li><a class="dropdown-item" data-toggle="modal"
data-target="#modalTracking"
data-transaction="{{ $transaction->transactionDescription }}">Tracking</a>
</li>
@endif
{{-- Setelah dibayar --}}
@if ($transaction->status_transaksi == 'success')
<li><a class="dropdown-item" href="#"
id="processTransaction"
data-id="{{ $transaction->id }}">Proses
Transaksi</a>
</li>
@endif
{{-- Pengiriman barang --}}
@if ($transaction->status_transaksi == 'process')
<li><a class="dropdown-item" href="#"
id="sendOrder"
data-id="{{ $transaction->id }}">Kirim
Barang</a>
</li>
@endif
{{-- Barang sudah sampai --}}
@if ($transaction->status_transaksi == 'sending')
<li><a class="dropdown-item" href="#"
data-toggle="modal"
data-target="#modalOrderSent" id="sentOrder"
data-id="{{ $transaction->id }}">Barang sudah
sampai</a>
</li>
@endif
{{-- Transaksi sudah selesai --}}
@if ($transaction->status_transaksi == 'finished')
<li><a class="dropdown-item" href="#"
id="acceptResult"
data-id="{{ $transaction->id }}">Terima
Uang</a>
</li>
@endif
</ul>
</div>
</td>
</tr>
@empty
@endforelse
</tbody>
</table>
</div>
@ -137,19 +55,136 @@
@include('user.transaction.penjual.modal-keterangan-status')
<script>
$(document).ready(function() {
let listPenjual = $('#table-penjual').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('user-penjual.list-penjual') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
},
{
data: 'nama_barang',
name: 'nama_barang',
className: 'text-center'
},
{
data: 'nama_pembeli',
name: 'nama_pembeli',
className: 'text-center'
},
{
data: 'total_harga',
name: 'total_harga',
render: function(data, type, row) {
// Memastikan bahwa ini adalah tampilan (bukan sorting atau filtering)
if (type === 'display') {
// Mengubah nilai 'total' menjadi format mata uang Indonesia
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR'
}).format(data);
}
// Untuk tipe yang lain, kembalikan nilai asli
return data;
},
className: 'text-center'
},
{
data: 'created_at',
name: 'created_at',
render: function(data, type, row) {
if (type === 'display') {
var date = new Date(data);
var day = date.getDate();
var month = date.toLocaleString('id-ID', {
month: 'short'
});
var year = date.getFullYear();
var formattedDate = day + ' ' + month + ' ' + year;
return formattedDate;
}
return data;
},
className: 'text-center'
},
{
data: 'status_transaksi',
name: 'status_transaksi',
render: function(data, type, row) {
if (row.status_transaksi == 'created') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'success') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['process', 'sending', 'sent'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (['cancel', 'failure', 'refund'].includes(row
.status_transaksi)) {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else if (row.status_transaksi == 'finished') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
} else {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark">
${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)}
</a>`;
}
},
className: 'text-center'
},
{
data: 'action',
name: 'action',
orderable: false,
searchable: false,
className: 'text-center'
}
],
});
$('#modalTracking').on('show.bs.modal', function(event) {
var triggerLink = $(event.relatedTarget); // Tombol yang memicu modal
var transactionDatas = triggerLink.data('transaction'); // Ambil data dari tombol
var transactionId = triggerLink.data('id'); // Ambil data dari tombol
const csrfToken = $('meta[name="csrf-token"]').attr('content');
var modal = $(this);
// Buat variabel untuk menyimpan HTML aktivitas
transactionDatas = transactionDatas.reverse();
var activitiesHtml = '';
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
$.ajax({
url: "{{ route('user.transaction-tracking') }}",
type: 'GET',
data: {
id: transactionId
},
success: function(response) {
var transactionDatas = response.data;
// Buat variabel untuk menyimpan HTML aktivitas
var activitiesHtml = '';
// Periksa apakah ada data transaksi
if (transactionDatas && transactionDatas.length > 0) {
transactionDatas = transactionDatas.reverse();
// Iterasi melalui data transaksi dan tambahkan ke activitiesHtml
$.each(transactionDatas, function(index, transactionDescription) {
activitiesHtml += `
<div class="activity">
<div class="activity-icon ${transactionDescription.background} text-white shadow-primary">
<i class="${transactionDescription.judul}" style="font-size: 36px;"></i>
@ -162,10 +197,10 @@
</div>
</div>
`;
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
});
} else {
// Tidak ada data transaksi, tambahkan pesan kosong
activitiesHtml += `
<div class="activity">
<div class="activity-icon bg-primary text-white shadow-primary">
<i class="fas fa-ban" style="font-size: 36px;"></i>
@ -178,14 +213,25 @@
</div>
</div>
`;
}
}
// Menampilkan data dalam modal
var modal = $(this);
modal.find('.activities').html(activitiesHtml);
// Menampilkan data dalam modal
modal.find('.activities').html(activitiesHtml);
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Gagal mendapatkan data',
icon: 'error'
}).then(function() {
Swal.close();
modal.modal('hide');
});
}
});
});
$('#table-3').on('click', '#processTransaction', function() {
$('#table-penjual').on('click', '#processTransaction', function() {
const id = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
@ -215,10 +261,10 @@
title: response.status ? 'Berhasil' : 'Gagal',
text: response.message,
icon: response.status ? 'success' : 'error',
}).then((result) => {
}).then(function() {
Swal.close();
if (result.isConfirmed) {
location.reload();
if (response.status) {
listPenjual.ajax.reload();
}
});
},
@ -232,7 +278,7 @@
});
});
$('#table-3').on('click', '#sendOrder', function() {
$('#table-penjual').on('click', '#sendOrder', function() {
const id = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
@ -274,9 +320,9 @@
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK',
}).then((result) => {
}).then(function() {
if (response.status) {
location.reload();
listPenjual.ajax.reload();
}
});
},
@ -368,7 +414,9 @@
icon: response.status ? 'success' : 'error'
}).then(function() {
if (response.status) {
location.reload();
$('#formBukti').trigger('reset');
$('#modalOrderSent').modal('hide');
listPenjual.ajax.reload();
}
});
},
@ -383,7 +431,7 @@
});
$('#acceptResult').on('click', function() {
const csrfToken = $('meta[name="csrf-token"]').attr('content');
});
});
</script>

View File

@ -1,130 +0,0 @@
@extends('layouts.main')
@section('content')
<div class="main-content">
<section class="section">
<div class="section-header">
<h1>Invoice</h1>
<div class="section-header-breadcrumb">
<div class="breadcrumb-item active"><a href="{{ route('user.index') }}">Dashboard</a></div>
<div class="breadcrumb-item"><a href="{{ route('user-pembeli.index') }}"> Transaction</a></div>
<div class="breadcrumb-item">Invoice</div>
</div>
</div>
<div class="section-body">
<div class="invoice">
<div class="invoice-print">
<div class="row">
<div class="col-lg-12">
<div class="invoice-title">
<h2>Invoice</h2>
<div class="invoice-number">Order #NVI-1234</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
<address>
<strong>Billed To:</strong><br>
npannisa<br>
1234 Main<br>
Apt. 4B<br>
Depok City, Indonesia
</address>
</div>
<div class="col-md-6 text-md-right">
<address>
<strong>Shipped To:</strong><br>
Jilhan Haura<br>
12345 Main<br>
Apt. 5B<br>
Bogor Barat, Indonesia
</address>
</div>
</div>
<div class="row">
<div class="col-md-6">
<address>
<strong>Payment Method:</strong><br>
Visa ending **** 4242<br>
npannisa@gmail.com
</address>
</div>
<div class="col-md-6 text-md-right">
<address>
<strong>Order Date:</strong><br>
September 19, 2023<br><br>
</address>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<div class="section-title">Order Summary</div>
<p class="section-lead">All items here cannot be deleted.</p>
<div class="table-responsive">
<table class="table table-striped table-hover table-md">
<tr>
<th data-width="40">#</th>
<th>Item</th>
<th class="text-center">Price</th>
<th class="text-center">Quantity</th>
<th class="text-right">Totals</th>
</tr>
<tr>
<td>1</td>
<td>Ayam Warna Warni</td>
<td class="text-center">Rp. 50.000.000</td>
<td class="text-center">1</td>
<td class="text-right">Rp. 50.000.000</td>
</tr>
</table>
</div>
<div class="row mt-4">
<div class="col-lg-8">
<div class="section-title">Payment Method</div>
<p class="section-lead">The payment method that we provide is to make it easier for
you to pay invoices.</p>
<div class="images">
<img src="assets/img/visa.png" alt="visa">
<img src="assets/img/jcb.png" alt="jcb">
<img src="assets/img/mastercard.png" alt="mastercard">
<img src="assets/img/paypal.png" alt="paypal">
</div>
</div>
<div class="col-lg-4 text-right">
<div class="invoice-detail-item">
<div class="invoice-detail-name">Subtotal</div>
<div class="invoice-detail-value">Rp.670.000.000</div>
</div>
<div class="invoice-detail-item">
<div class="invoice-detail-name">Shipping</div>
<div class="invoice-detail-value">Rp.15.000</div>
</div>
<hr class="mt-2 mb-2">
<div class="invoice-detail-item">
<div class="invoice-detail-name">Total</div>
<div class="invoice-detail-value invoice-detail-value-lg">Rp.6715.000.000</div>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="text-md-right">
<div class="float-lg-left mb-lg-0 mb-3">
<a href="/pembeli" class="btn btn-primary btn-icon icon-left"><i class="fas fa-credit-card"
id="payment"></i> Process
Payment</a>
<a href="/pembeli" class="btn btn-danger btn-icon icon-left"><i class="fas fa-times"></i>
Cancel</a>
</div>
<button class="btn btn-warning btn-icon icon-left"><i class="fas fa-print"></i> Print</button>
</div>
</div>
</div>
</section>
</div>
@endsection

View File

@ -97,7 +97,8 @@
<!-- ======= END SIGN IN FORM ======= -->
<!-- ======= SIGN UP FORM ======= -->
<form action="#" class="sign-up-form" id="msform" enctype="multipart/form-data" method="POST">
<form action="javascript:void(0)" class="sign-up-form" id="msform" enctype="multipart/form-data"
method="POST">
@csrf
<h2 class="title">Daftar</h2>
<p style="width: 90%">
@ -145,20 +146,21 @@
<div class="input-field-signup-flex" style="margin-left: 3%">
<i class="fas fa-user"></i>
<input type="text" placeholder="Nama Belakang" class="last-name-input"
name="nama_belakang" />
name="nama_belakang" required />
</div>
</div>
<div class="input-field up">
<i class="fa fa-id-card" aria-hidden="true"></i>
<input type="text" placeholder="NIK" class="email-input" name="nik"
maxlength="16"
oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 16);" />
oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 16);"
required />
</div>
<div class="flex-input-btn">
<div class="input">
<i class="fa fa-envelope" aria-hidden="true"></i>
<input type="email" placeholder="Email" class="email-input" name="new_email"
id="newEmail" />
id="newEmail" required />
</div>
<button id="verifikasiEmail" class="btn-otp" type="button"
disabled=true>Verifikasi</button>
@ -167,19 +169,20 @@
<i class="fa fa-ellipsis-h" aria-hidden="true"></i>
<input type="text" class="telp-input-signup"
oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 6);"
placeholder="Kode Verifikasi Email" name="email_verification">
placeholder="Kode Verifikasi Email" name="email_verification" required
id="emailVerification">
</div>
<div class="input-field up">
<i class="fa fa-phone" aria-hidden="true"></i>
<input type="text" class="telp-input-signup" maxlength="13"
oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 13);"
placeholder="Nomer Telepon" name="nohp">
oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 15);"
placeholder="Nomer Telepon. cth: 08xxx" name="nohp" required>
</div>
<div style="display: flex;">
<div class="input-field-signup-flex up gender-select-menu" style="width: 190%">
<div class="gender-select-input" style="width: 100%; padding-left: 1rem;">
<select style="width: 190%;" class="gender-select" id="gender-select"
name="gender">
name="gender" required>
<option value="Laki-laki">Laki-laki</option>
<option value="Perempuan">Perempuan</option>
</select>
@ -187,7 +190,8 @@
</div>
<div class="input-field-signup-flex up" style="margin-left: 3%">
<i class="fa fa-calendar" aria-hidden="true"></i>
<input type="date" placeholder="Tanggal Lahir" name="tanggal_lahir" />
<input type="date" placeholder="Tanggal Lahir" name="tanggal_lahir"
required />
</div>
</div>
@ -226,14 +230,14 @@
<select id="selectVillage"
style="width: 100%; border: 1px solid transparent; margin-top: 0; outline: none;"
class="input-field" aria-label="Default select example"
name="village_code">
name="village_code" required>
</select>
</div>
</div>
<input type="text" class="input-field" id="alamat" name="alamat"
placeholder="Alamat lengkap Anda" cols="50" rows="4"
style="width: 190%; padding: 0rem 1rem;">
style="width: 190%; padding: 0rem 1rem;" required>
</div>
<!-- ======= END FORM ADDRESS ======= -->
@ -250,7 +254,7 @@
</div>
<video id="webcamKtp" autoplay playsinline></video>
<div id="foto-preview-ktp"></div>
<input type="hidden" id="fotoKtp" name="ktp">
<input type="hidden" id="fotoKtp" name="ktp" required>
<div style="display: flex; margin-top: 1rem">
<button type="button" class="btn-foto" id="startButtonKtp"
data-state="off">Mulai Kamera</button>
@ -272,7 +276,7 @@
</div>
<video id="webcamEkyc" autoplay playsinline></video>
<div id="foto-preview-ekyc"></div>
<input type="hidden" id="fotoEkyc" name="wajah">
<input type="hidden" id="fotoEkyc" name="wajah" required>
<div style="display: flex; margin-top: 1rem">
<button type="button" class="btn-foto" id="startButtonEkyc"
data-state="off">Mulai Kamera</button>
@ -302,12 +306,12 @@
<div class="input-field-signup-flex">
<i class="fa fa-unlock-alt" aria-hidden="true"></i>
<input type="password" class="pin-input" placeholder="Password"
name="new_password">
name="new_password" required>
</div>
<div class="input-field-signup-flex" style="margin-left: 3%">
<i class="fa fa-unlock-alt" aria-hidden="true"></i>
<input type="password" class="konfir-pin-input"
placeholder="Konfirmasi Password" name="confirm_password">
placeholder="Konfirmasi Password" name="confirm_password" required>
</div>
</div>
@ -335,7 +339,7 @@
<div class="common_btns form_4_btns" style="display: none;">
<button type="button" class="btn_back"><span class="icon"><ion-icon
name="arrow-back-sharp"></ion-icon></span>Back</button>
<button type="button" class="btn_done" id="signUp">Daftar</button>
<button type="submit" class="btn_done" id="signUp">Daftar</button>
</div>
</div>
<!-- ======= BTN FORM NEXT & BACK ======= -->
@ -357,7 +361,7 @@
<button class="btn transparent" id="sign-up-btn">
Daftar
</button>
<p><a href="{{ route('login') }}">kembali</a></p>
<p><a href="{{ route('login') }}">Kembali</a></p>
</div>
<img src="{{ asset('assets/img/login_register/Payment Information-pana.svg') }}" class="image"
alt="" />
@ -371,7 +375,7 @@
<button class="btn transparent" id="sign-in-btn">
Masuk
</button>
<p><a href="{{ route('login') }}">kembali</a></p>
<p><a href="{{ route('login') }}">Kembali</a></p>
</div>
<img src="{{ asset('assets/img/login_register/Payment Information-pana.svg') }}" class="image"
alt="" />
@ -447,7 +451,10 @@
});
$.ajax({
url: "{{ route('status-akun', ':email') }}".replace(':email', email),
url: "{{ route('status-akun') }}",
data: {
email: email
},
type: 'GET',
success: function(response) {
let status = response.message[0].status
@ -560,6 +567,7 @@
clearInterval(timerInterval);
newEmail.text("Verifikasi"); // Mengembalikan teks awal tombol
newEmail.prop('disabled', false); // Mengaktifkan kembali tombol
verificationStatus = false;
}
}, 1000); // Setiap 1 detik
@ -581,7 +589,6 @@
text: response.message,
icon: response.status ? 'success' : 'error',
});
verificationStatus = true;
},
error: function(error) {
Swal.fire({
@ -589,7 +596,7 @@
text: 'Gagal karena kesalahan inputan atau jaringan',
icon: 'error',
});
console.log(error);
verificationStatus = false;
},
});
} else {
@ -598,159 +605,74 @@
text: 'Inputan yang anda masukan bukan alamat email. Silahkan masukan alamat email yang benar.',
icon: 'error'
});
verificationStatus = false;
}
});
$('#signUp').on('click', function() {
let emptyInput = [];
$('#msform').on('submit', function(e) {
e.preventDefault();
const csrfToken = $('meta[name="csrf-token"]').attr('content');
let namaDepan = document.querySelector('[name="nama_depan"]').value;
let namaBelakang = document.querySelector('[name="nama_belakang"]').value;
let nik = document.querySelector('[name="nik"]').value;
let email = document.querySelector('[name="new_email"]').value;
let nohp = document.querySelector('[name="nohp"]').value;
let gender = document.querySelector('[name="gender"]').value;
let emailVerification = document.querySelector('[name="email_verification"]').value;
let kode = $('#emailVerification').val();
// Tanggal lahir
let tanggalLahir = document.querySelector('[name="tanggal_lahir"]').value;
// Mencari selisih tahun lahir dengan tahun sekarang
// Parse tanggal lahir ke objek Date
let tanggalLahirDate = new Date(tanggalLahir);
let form = this;
// Dapatkan tahun dari tanggal lahir
let tahunLahir = tanggalLahirDate.getFullYear();
// Dapatkan tahun sekarang
let tahunSekarang = new Date().getFullYear();
// Hitung selisih tahun
let selisihTahun = tahunSekarang - tahunLahir;
// Akhir mencari selisih tahun
let kodeKelurahan = document.querySelector('[name="village_code"]').value;
let alamat = document.querySelector('[name="alamat"]').value;
let wajah = document.querySelector('[name="wajah"]').value;
let ktp = document.querySelector('[name="ktp"]').value;
let newPassword = document.querySelector('[name="new_password"]').value;
let confirmPassword = document.querySelector('[name="confirm_password"]').value;
// Pengecekan inputan yang kosong
if (namaDepan.trim() === "" && namaBelakang.trim() === "") {
emptyInput.push("Nama depan dan nama belakang tidak boleh kosong");
if (!form.checkValidity()) {
form.reportValidity();
return;
}
if (nik.trim() === "") {
emptyInput.push("Nik tidak boleh kosong");
if (verificationCode == kode && waktuSekarangDetik > 0) {
verificationStatus = true;
}
if (email.trim() === "") {
emptyInput.push("Email tidak boleh kosong");
}
if (!verificationStatus) {
emptyInput.push("Verifikasi email terlebih dahulu");
}
if (emailVerification.trim() === "") {
emptyInput.push("Kode verifikasi harus diisi");
}
if (emailVerification != verificationCode) {
emptyInput.push('Kode verifikasi harus sama dengan kode yang dikirim ke email');
}
let formData = new FormData(this);
formData.append('kode_verifikasi', verificationCode);
formData.append('verification_status', verificationStatus ? 'true' : 'false');
if (nohp.trim() === "") {
emptyInput.push("nomor HP tidak boleh kosong");
}
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
allowEscapeKey: false,
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
if (gender.trim() === "") {
emptyInput.push("Jenis kelamin tidak boleh kosong");
}
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
if (tanggalLahir.trim() === "") {
emptyInput.push("Tanggal lahir tidak boleh kosong");
} else if (selisihTahun < 17) {
// kondisi dimana usia dibawah 18 tahun
emptyInput.push("Anda harus berusia 17 keatas");
}
if (kodeKelurahan.trim() === "" || alamat.trim() === "") {
emptyInput.push("Alamat tidak boleh kosong");
}
if (wajah.trim() === "") {
emptyInput.push("Silahkan ambil foto wajah anda");
}
if (ktp.trim() === "") {
emptyInput.push("Silahkan ambil foto KTP anda");
}
if (newPassword.trim() === "" && confirmPassword === "") {
emptyInput.push("Password tidak boleh kosong");
} else if (newPassword.trim() != confirmPassword) {
emptyInput.push("Password baru harus sama dengan password yang dikonfirmasi");
}
// kalau terdapat inputan kosong
if (emptyInput.length > 0) {
const emptyInputError = emptyInput.join(', ');
Swal.fire({
title: 'Gagal',
text: emptyInputError,
icon: 'error',
confirmButtonText: 'OK',
});
} else {
const formData = new FormData();
formData.append('nama-depan', namaDepan);
formData.append('nama-belakang', namaBelakang);
formData.append('nik', nik);
formData.append('email', email);
formData.append('nohp', nohp);
formData.append('gender', gender);
formData.append('tanggal-lahir', tanggalLahir);
formData.append('kode-kelurahan', kodeKelurahan);
formData.append('alamat', alamat);
formData.append('wajah', wajah);
formData.append('ktp', ktp);
formData.append('new-password', newPassword);
formData.append('confirm-password', confirmPassword);
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('register') }}",
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil' : 'Gagal',
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK',
}).then(function() {
if (response.status == true) {
location.reload();
}
});
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Ada form yang kosong atau kesalahan internet. penyebab ' +
error,
icon: 'error',
});
}
});
}
$.ajax({
url: "{{ route('register') }}",
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil' : 'Gagal',
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK',
}).then(function() {
if (response.status) {
location.reload();
}
});
},
error: function(error) {
Swal.fire({
title: 'Gagal',
text: 'Ada form yang kosong atau kesalahan internet. penyebab ' +
error,
icon: 'error',
});
}
});
});
// Register Akhir
});

View File

@ -114,14 +114,7 @@
</div>
<hr>
<div class="text-md-right">
<div class="float-lg-left mb-lg-0 mb-3">
<a href="/pembeli" class="btn btn-primary btn-icon icon-left"><i class="fas fa-credit-card"
id="payment"></i> Process
Payment</a>
<a href="/pembeli" class="btn btn-danger btn-icon icon-left"><i class="fas fa-times"></i>
Cancel</a>
</div>
<button class="btn btn-warning btn-icon icon-left"><i class="fas fa-print"></i> Print</button>
<button class="btn btn-warning btn-icon icon-left"><i class="fas fa-print"></i>Print</button>
</div>
</div>
</div>

View File

@ -431,7 +431,10 @@
$("#selectCity").select2({
placeholder: "Pilih Kabupaten/Kota",
ajax: {
url: "/cari-kota/" + code,
url: "/cari-kota/",
data: {
code: code,
},
processResults: function({
data
}) {
@ -462,7 +465,10 @@
$("#selectDistrict").select2({
placeholder: "Pilih Kecamatan",
ajax: {
url: "/cari-kecamatan/" + code, // Isi dengan URL yang sesuai
url: "/cari-kecamatan/", // Isi dengan URL yang sesuai
data: {
code: code,
},
processResults: function({
data
}) {
@ -493,7 +499,10 @@
$("#selectVillage").select2({
placeholder: "Pilih Kelurahan",
ajax: {
url: "/cari-kelurahan/" + code, // Isi dengan URL yang sesuai
url: "/cari-kelurahan/", // Isi dengan URL yang sesuai
data: {
code: code,
},
processResults: function({
data
}) {

View File

@ -2,11 +2,10 @@
use App\Models\Refunds;
use App\Models\Transactions;
//Admin
use Illuminate\Support\Facades\Route;
//Admin
use App\Http\Controllers\Login\LoginController;
use App\Http\Controllers\Admin\AdminUserController;
use App\Http\Controllers\Profile\ProfileController;
use App\Http\Controllers\User\UserRefundController;
//Login
use App\Http\Controllers\User\UserContactController;
@ -18,6 +17,12 @@ use App\Http\Controllers\Admin\AdminDashboardController;
use App\Http\Controllers\User\UserTransactionController;
use App\Http\Controllers\Admin\AdminTransactionController;
//Profile
use App\Http\Controllers\Profile\ProfileController;
//Invoice
use App\Http\Controllers\Invoice\InvoiceController;
// use Illuminate\Foundation\Auth\User;
/*
@ -65,11 +70,11 @@ Route::controller(LoginController::class)->group(function(){
Route::get('logout','logout')->name('logout');
Route::post('authenticate','authenticate')->name('autentikasi');
Route::post('register','register')->name('register');
Route::get('cek-email/{email}','accountStatus')->name('status-akun');
Route::get('cek-email','accountStatus')->name('status-akun');
Route::get('cari-provinsi','searchProvince')->name('cari-provinsi');
Route::get('cari-kota/{code}','searchCity')->name('cari-kota');
Route::get('cari-kecamatan/{code}','searchDistrict')->name('cari-kecamatan');
Route::get('cari-kelurahan/{code}','searchVillage')->name('cari-kelurahan');
Route::get('cari-kota','searchCity')->name('cari-kota');
Route::get('cari-kecamatan','searchDistrict')->name('cari-kecamatan');
Route::get('cari-kelurahan','searchVillage')->name('cari-kelurahan');
Route::post('kode-verifikasi','sendVerificationCode')->name('kirim-kode');
Route::get('ocr','getOcr');
});
@ -85,6 +90,13 @@ Route::middleware(['auth'])->group(function(){
});
});
Route::prefix('invoice')->group(function(){
Route::controller(InvoiceController::class)->group(function(){
Route::get('/{id}','getInvoice')->name('invoice.get');
Route::get('export-invoice','exportInvoice')->name('invoice.export');
});
});
Route::middleware(['admin'])->group(function(){
Route::prefix('admin')->group(function(){
@ -98,9 +110,9 @@ Route::middleware(['auth'])->group(function(){
Route::get('admin-user','index')->name('admin-user.index');
Route::get('admin-user/list-user','listUser')->name('admin-user.list-user');
Route::get('admin-user/{id}','show')->name('admin-user.show');
Route::delete('admin-user/{id}','delete')->name('admin-user.destroy');
Route::put('admin-user/approve-user/{id}', 'approveUser')->name('admin-user.approve');
Route::put('admin-user/deny-user/{id}', 'denyUser')->name('admin-user.deny');
Route::delete('admin-user/hapus-user','delete')->name('admin-user.destroy');
Route::put('admin-user/approve-user', 'approveUser')->name('admin-user.approve');
Route::put('admin-user/deny-user', 'denyUser')->name('admin-user.deny');
});
// Tampilan transaksi (Sudah)
@ -108,6 +120,9 @@ Route::middleware(['auth'])->group(function(){
Route::get('admin-transaction','index')->name('admin-transaction.index');
Route::get('admin-transaction/detail/{id}','show')->name('admin-transaction.show');
Route::get('admin-transaction/list-transaction','listTransaction')->name('admin-transaction.list-transaction');
Route::get('admin-transacion/transaction-tracking','transactionTracking')->name('admin.transaction-tracking');
Route::put('admin-transaction/accept-transaction','approveTransaction')->name('admin-transaction.accept-transaction');
Route::put('admin-transaction/deny-transaction','denyTransaction')->name('admin-transaction.deny-transaction');
});
// Tampilan, approve atau deny dan hapus refund
@ -135,8 +150,6 @@ Route::middleware(['auth'])->group(function(){
// Tampilan dashboard user beserta perhitungan
Route::controller(UserDashboardController::class)->group(function(){
Route::get('/','index')->name('user.index');
//
});
// Tampilan, tambah dan hapus kontak
@ -145,9 +158,10 @@ Route::middleware(['auth'])->group(function(){
Route::get('user-contact/list-contact','listContact')->name('user-contact.list-contact');
Route::post('user-contact','store')->name('user-contact.store');
Route::get('admin-contact/{id}','show')->name('admin-contact.show');
Route::delete('user-contact/delete/{id}','destroy')->name('user-contact.destroy');
Route::delete('user-contact/delete','destroy')->name('user-contact.destroy');
Route::get('user-contact/get-user-contact','getContact')->name('user-contact.get');
Route::get('user-contact/cek-contact/{email}','cekEmail')->name('user-contact.email');
Route::get('user-contact/cek-contact','cekEmail')->name('user-contact.email');
Route::get('user-contact/detailContact','detailContact')->name('user-contact.detail-contact');
});
// Tampilan transaksi, bayar, update status pengiriman dan refund
@ -157,7 +171,6 @@ Route::middleware(['auth'])->group(function(){
Route::get('user-pembeli/list-pembeli','listPembeli')->name('user-pembeli.list-pembeli');
Route::get('user-pembeli/detail-transaksi/{id}','show')->name('user-pembeli.show');
Route::get('user-pembeli/tambah-transaksi','create')->name('user-pembeli.create');
Route::get('user-pembeli/invoice/{id}','invoice')->name('user-pembeli.invoice');
Route::post('user-pembeli','store')->name('user-pembeli.store');
Route::put('user-pembeli/bayar-transaksi','payTransaction')->name('user-pembeli.pay');
Route::put('user-pembeli/batal-transaksi','cancelTransaction')->name('user-pembeli.cancel');
@ -176,7 +189,7 @@ Route::middleware(['auth'])->group(function(){
Route::put('user-penjual/kirim-pesanan','sendingOrder')->name('user-penjual.sending');
Route::post('user-penjual/selesai-kirim-pesanan','sentOrder')->name('user-penjual.sent');
Route::get('user-pembeli/invoice','invoiceTransaction');
Route::get('transaction-tracking','transactionTracking')->name('user.transaction-tracking');
});
// Tampilan refund