Penambahan fungsi pada user dan setting admin

This commit is contained in:
Muhammad Raihan Surya 2023-09-06 15:28:51 +07:00
parent cf16994497
commit 35bc68bd4c
37 changed files with 1939 additions and 398 deletions

View File

@ -7,7 +7,7 @@ use App\Models\Refunds;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class RefundController extends Controller
class AdminRefundController extends Controller
{
/**
* Display a listing of the resource.

View File

@ -0,0 +1,110 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Setting;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AdminSettingController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$settings = Setting::all();
return view('admin.setting.index', [
'name' => 'Jilhan Haura',
'settings' => $settings,
]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// dd($request->persentase);
[$tahun, $bulan] = explode('-', $request->bulan_tahun);
Setting::create([
'bulan' => $bulan,
'tahun' => $tahun,
'persentase' => $request->persentase,
'status' => 'Active',
]);
return redirect()->route('admin-setting.index');
}
/**
* Display the specified resource.
*/
public function show(Setting $setting)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Setting $setting)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
// dd($setting['status'] );
$setting = Setting::findOrFail($id);
if ($setting->status == 'Active') {
$setting->status = 'Nonactive';
$result = $setting->save();
if ($result) {
return response()->json([
'message' => "Berhasil update kebijakan",
'status' => true,
]);
} else {
return response()->json([
'message' => "Gagal update kebijakan",
'status' => true,
]);
}
} else {
$setting->status = 'Active';
$result = $setting->save();
if ($result) {
return response()->json([
'message' => "Berhasil update kebijakan",
'status' => true,
]);
} else {
return response()->json([
'message' => "Gagal update kebijakan",
'status' => true,
]);
}
}
// return response()->json($id);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Setting $setting)
{
//
}
}

View File

@ -7,7 +7,7 @@ use App\Models\Transactions;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class TransactionController extends Controller
class AdminTransactionController extends Controller
{
/**
* Display a listing of the resource.

View File

@ -0,0 +1,118 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class AdminUserController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$list_users = User::where('role','User')->get();
return view('admin.users.list-user', ['name' => 'Muhammad Raihan Surya', 'list_users' => $list_users]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show($id)
{
$user = User::find($id);
return view('admin.users.detail-user',['name'=>"Muhammad Raihan Surya", 'detail_user'=>$user]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(User $user)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
return response()->json([
'user' => $request,
'id' => $id,
]);
}
/**
* Remove the specified resource from storage.
*/
public function destroy($id)
{
try{
$result = User::destroy($id);
if($result){
return response()->json([
'message' => 'Berhasil hapus data',
'status' => true
]);
}
}catch(\Exception $e){
return response()->json([
'message' => 'Gagal hapus data, karena '.$e,
'status' => false
]);
}
}
public function approveUser($id){
$user = User::findOrFail($id);
$user->status = 'Finished';
$result = $user->save();
if($result){
return response()->json([
'message' => "Akun telah disetujui dan dapat digunakan",
'status' => true,
]);
}else{
return response()->json([
'message' => "Akun gagal disetujui karena "+$result,
'status' => false,
]);
}
}
public function denyUser($id){
$user = User::findOrFail($id);
$user->status = 'Rejected';
$result = $user->save();
if($result){
return response()->json([
'message' => "Akun telah ditolak dan tidak dapat digunakan",
'status' => true,
]);
}else{
return response()->json([
'message' => "Akun gagal ditolak karena "+$result,
'status' => false,
]);
}
}
}

View File

@ -1,70 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Setting;
use App\Models\Settings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class SettingController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('admin/setting/index',[
'name'=>"Jilhan Haura",
"setting" => Settings:: HistorySetting()
]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Setting $setting)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Setting $setting)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Setting $setting)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Setting $setting)
{
//
}
}

View File

@ -1,79 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$list_users = User::where('role','User')->get();
return view('admin.users.list-user', ['name' => 'Muhammad Raihan Surya', 'list_users' => $list_users]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(User $user)
{
// dd($user);
return view('admin.users.detail-user',['name'=>"Muhammad Raihan Surya", 'detail_user'=>$user]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(User $user)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, User $users)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(User $user)
{
try{
User::destroy($user->id);
return response()->json([
'message' => 'Berhasil hapus data',
'status' => true
]);
}catch(\Exception $e){
return response()->json([
'message' => 'Gagal hapus data, karena '.$e,
'status' => false
]);
}
}
}

View File

@ -52,7 +52,7 @@ class LoginController extends Controller
return redirect()->intended('/');
}
} else {
Session::flash('message', 'Akun Tidak Ditemukan');
Session::flash('message', 'Akun tidak ditemukan atau sedang dalam pengajuan');
return redirect()->back();
}
}
@ -102,26 +102,26 @@ class LoginController extends Controller
// $validatedData['email_verified_at'] = now();
$fotoKTP = '';
$fotoWajah = '';
$fotoProfil ='';
$validatedData['foto-ktp'] = '';
$validatedData['foto-wajah'] = '';
$validatedData['foto-profil'] ='';
if ($request->hasFile('foto_ktp') && $request->hasFile('foto_wajah')) {
// $namaGambarOri = $request->file('foto-gambar')->getClientOriginalName();
// $namaGambar = round(microtime(true) * 1000) . '-' . str_replace(' ', '-', $namaGambarOri);
$tipeFotoKtp = $request->file('foto_ktp')->getClientMimeType();
$tipeFotoWajah = $request->file('foto_wajah')->getClientMimeType();
$fotoKTP = 'Foto-KTP-' . $request->nama . '.' . $tipeFotoKtp;
$fotoWajah = 'Foto-Wajah' . $request->nama . '.' . $tipeFotoWajah;
$validatedData['foto-ktp'] = 'Foto-KTP-' . $request->nama . '.' . $tipeFotoKtp;
$validatedData['foto-wajah'] = 'Foto-Wajah' . $request->nama . '.' . $tipeFotoWajah;
// Simpan foto
$request->file('foto-ktp')->storeAs('public/foto-ktp', $fotoKTP);
$request->file('foto-wajah')->storeAs('public/foto-wajah', $fotoWajah);
$request->file('foto-ktp')->storeAs('public/foto-ktp', $validatedData['foto-ktp']);
$request->file('foto-wajah')->storeAs('public/foto-wajah', $validatedData['foto-wajah']);
}
if($request->hasFile('foto_profil')){
$tipeFotoProfil = $request->file('foto_profil')->getClientMimeType();
$fotoProfil = 'Foto-Profil-' . $request->nama . '.' . $tipeFotoProfil;
$validatedData['foto-profil'] = 'Foto-Profil-' . $request->nama . '.' . $tipeFotoProfil;
// Simpan foto
$request->file('foto-profil')->storeAs('public/foto-profil', $fotoProfil);
$request->file('foto-profil')->storeAs('public/foto-profil', $validatedData['foto-profil']);
}
//OCR
@ -185,8 +185,9 @@ class LoginController extends Controller
'nohp' => $validatedData['nohp'],
'nik' => $validatedData['nik'],
'alamat' => $validatedData['alamat'],
'foto_ktp' => $fotoKTP,
'foto_wajah' => $fotoWajah,
'foto_ktp' => $validatedData['foto-ktp'],
'foto_wajah' => $validatedData['foto-wajah'],
'foto_profil' => $validatedData['foto-profil'],
'status' => $validatedData['status'],
'gender' => $validatedData['gender'],
'remember_token' => Str::random(10),

View File

@ -59,8 +59,19 @@ class ContactController extends Controller
/**
* Remove the specified resource from storage.
*/
public function destroy(Contact $contact)
public function destroy(Contact $contact, $id)
{
//
try{
Contact::destroy($id);
return response()->json([
'message' => 'Berhasil hapus data',
'status' => true
]);
}catch(\Exception $e){
return response()->json([
'message' => 'Gagal hapus data, karena '.$e,
'status' => false
]);
}
}
}

View File

@ -17,7 +17,7 @@ class Setting extends Model
protected $fillable = [
'bulan',
'tahun',
'diskon',
'persentase',
'status',
];
}

View File

@ -95,6 +95,10 @@ class User extends Authenticatable
public function penjual(){
return $this->hasMany(Transaction::class, 'email', 'penjual');
}
public function kelurahan(){
return $this->belongsTo('Laravolt\Indonesia\Models\Village', 'code', 'kode_kelurahan');
}
//Relasi
}

View File

@ -10,14 +10,16 @@
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
"intervention/image": "^2.7",
"laravel/framework": "^10.10",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8",
"laravolt/indonesia": "^0.34.0",
"nesbot/carbon": "^2.69",
"pusher/pusher-php-server": "^7.2",
"ramsey/uuid": "^4.7",
"thiagoalessio/tesseract_ocr": "^2.12",
"tymon/jwt-auth": "^2.0",
"intervention/image": "^2.7"
"tymon/jwt-auth": "^2.0"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",

84
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "051f567ac5cf2db555525f2a0ee59015",
"content-hash": "eb6424bf82942b6b939788b88ee6586b",
"packages": [
{
"name": "brick/math",
@ -1497,6 +1497,88 @@
},
"time": "2023-08-15T14:27:00+00:00"
},
{
"name": "laravolt/indonesia",
"version": "v0.34",
"source": {
"type": "git",
"url": "https://github.com/laravolt/indonesia.git",
"reference": "dfb584207f277e38c7706412d7414c8753dc78d5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravolt/indonesia/zipball/dfb584207f277e38c7706412d7414c8753dc78d5",
"reference": "dfb584207f277e38c7706412d7414c8753dc78d5",
"shasum": ""
},
"require": {
"illuminate/support": "^8.0|^9.0|^10.0",
"php": "^7.3|^8.0"
},
"require-dev": {
"orchestra/testbench": "^6.0|^7.0|^8.0",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^9.0"
},
"suggest": {
"laravolt/suitable": "Required if you want to access editor panel",
"spatie/geocoder": "Synchronize latitude longitude data directly using Google's Geocoding Service"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
},
"laravel": {
"providers": [
"Laravolt\\Indonesia\\ServiceProvider"
],
"aliases": {
"Indonesia": "Laravolt\\Indonesia\\Facade"
}
}
},
"autoload": {
"psr-4": {
"Laravolt\\Indonesia\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bayu Hendra Winata",
"email": "bayu.hendra@javan.co.id"
},
{
"name": "Akbar Adhatama",
"email": "am.adhatama@gmail.com"
},
{
"name": "Deri Ramdani",
"email": "deri.ramdani1@gmail.com"
}
],
"description": "Package Laravel yang berisi data Provinsi, Kabupaten/Kota, Kecamatan, dan Keluarahan/Desa di seluruh Indonesia.",
"keywords": [
"desa",
"indonesia",
"kabupaten",
"kecamatan",
"kelurahan",
"kota",
"laravel",
"laravolt",
"provinsi"
],
"support": {
"issues": "https://github.com/laravolt/indonesia/issues",
"source": "https://github.com/laravolt/indonesia/tree/v0.34"
},
"time": "2023-03-05T15:16:54+00:00"
},
{
"name": "lcobucci/clock",
"version": "2.3.0",

View File

@ -0,0 +1,16 @@
<?php
return [
'table_prefix' => 'indonesia_',
'route' => [
'enabled' => false,
'middleware' => ['web', 'auth'],
'prefix' => 'indonesia',
],
'view' => [
'layout' => 'ui::layouts.app',
],
'menu' => [
'enabled' => false,
],
];

View File

@ -30,6 +30,7 @@ class UserFactory extends Factory
'nohp'=> $this->faker->phoneNumber(),
'status'=> $this->faker->randomElement(['Progress', 'Finished']),
'gender' => $this->faker->randomElement(['Laki-laki', 'Perempuan']),
'kode_kelurahan' => '1101012002',
];
}

View File

@ -24,10 +24,13 @@ return new class extends Migration
$table->string('foto_ktp')->nullable();
$table->string('foto_wajah')->nullable();
$table->string('foto_profil')->nullable();
$table->string('status',10);
$table->enum('status',['Finished','Progress','Rejected'])->default('Progress');
$table->string('gender',15);
$table->char('kode_kelurahan',10);
$table->rememberToken();
$table->timestamps();
// $table->foreign('kode_kelurahan')->on('villages')->references('code');
});
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProvincesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(config('laravolt.indonesia.table_prefix').'provinces', function (Blueprint $table) {
$table->bigIncrements('id');
$table->char('code', 2)->unique();
$table->string('name', 255);
$table->text('meta')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop(config('laravolt.indonesia.table_prefix').'provinces');
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCitiesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(config('laravolt.indonesia.table_prefix').'cities', function (Blueprint $table) {
$table->bigIncrements('id');
$table->char('code', 4)->unique();
$table->char('province_code', 2);
$table->string('name', 255);
$table->text('meta')->nullable();
$table->timestamps();
$table->foreign('province_code')
->references('code')
->on(config('laravolt.indonesia.table_prefix').'provinces')
->onUpdate('cascade')->onDelete('restrict');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop(config('laravolt.indonesia.table_prefix').'cities');
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateDistrictsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(config('laravolt.indonesia.table_prefix').'districts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->char('code', 7)->unique();
$table->char('city_code', 4);
$table->string('name', 255);
$table->text('meta')->nullable();
$table->timestamps();
$table->foreign('city_code')
->references('code')
->on(config('laravolt.indonesia.table_prefix').'cities')
->onUpdate('cascade')->onDelete('restrict');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop(config('laravolt.indonesia.table_prefix').'districts');
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateVillagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(config('laravolt.indonesia.table_prefix').'villages', function (Blueprint $table) {
$table->bigIncrements('id');
$table->char('code', 10)->unique();
$table->char('district_code', 7);
$table->string('name', 255);
$table->text('meta')->nullable();
$table->timestamps();
$table->foreign('district_code')
->references('code')
->on(config('laravolt.indonesia.table_prefix').'districts')
->onUpdate('cascade')->onDelete('restrict');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop(config('laravolt.indonesia.table_prefix').'villages');
}
}

View File

@ -24,7 +24,7 @@ return new class extends Migration
$table->double('total_harga'); // gross amount
$table->string('signature_key');
$table->string('metode_pembayaran');
$table->string('status'); // transaction_status
$table->enum('status',['settlement','capture','pending','cancel','refund','expire','failure','progress','failed'])->default('pending'); // transaction_status
$table->timestamp('batas_pembayaran');
$table->timestamp('batas_pengiriman_barang');
$table->timestamps();

View File

@ -16,7 +16,7 @@ return new class extends Migration
$table->foreignUuid('order_id');
$table->double('total',10);
$table->timestamp('due_date');
$table->string('status',20);
$table->enum('status',['partial_refund','deny','pending'])->default('pending');
$table->foreign('order_id')->on('transactions')->references('order_id');
});

View File

@ -15,7 +15,7 @@ return new class extends Migration
$table->id();
$table->string('bulan',20);
$table->string('tahun',5);
$table->double('diskon',5);
$table->string('persentase',5);
$table->string('status',15);
$table->timestamps();
});

View File

@ -14,6 +14,7 @@ return new class extends Migration
Schema::create('transaction_descriptions', function (Blueprint $table) {
$table->id();
$table->foreignUuid('order_id');
$table->string('status',15);
$table->string('user');
$table->string('judul');
$table->string('deskripsi');

View File

@ -8,6 +8,10 @@ use App\Models\User;
use Illuminate\Support\Str;
use Faker\Factory as FakerFactory;
use Faker\Provider\id_ID\Person as Person;
use Laravolt\Indonesia\Seeds\CitiesSeeder;
use Laravolt\Indonesia\Seeds\VillagesSeeder;
use Laravolt\Indonesia\Seeds\DistrictsSeeder;
use Laravolt\Indonesia\Seeds\ProvincesSeeder;
class DatabaseSeeder extends Seeder
{
@ -30,10 +34,18 @@ class DatabaseSeeder extends Seeder
'nik' => $faker->nik($faker->randomElement(['male','female']), $faker->dateTimeBetween('-65 years', '-18 years')),
'alamat'=> $faker->address,
'nohp'=> $faker->phoneNumber(),
'status'=> $faker->randomElement(['Progress', 'Finished']),
'status'=> 'Finished',
'gender' => $faker->randomElement(['Laki-laki', 'Perempuan']),
'kode_kelurahan' => '1101012002',
]);
User::factory(20)->create();
$this->call([
ProvincesSeeder::class,
CitiesSeeder::class,
DistrictsSeeder::class,
VillagesSeeder::class,
]);
User::factory(100)->create();
}
}

View File

@ -2,39 +2,48 @@
$("[data-checkboxes]").each(function () {
var me = $(this),
group = me.data('checkboxes'),
role = me.data('checkbox-role');
group = me.data("checkboxes"),
role = me.data("checkbox-role");
me.change(function () {
var all = $('[data-checkboxes="' + group + '"]:not([data-checkbox-role="dad"])'),
checked = $('[data-checkboxes="' + group + '"]:not([data-checkbox-role="dad"]):checked'),
dad = $('[data-checkboxes="' + group + '"][data-checkbox-role="dad"]'),
var all = $(
'[data-checkboxes="' +
group +
'"]:not([data-checkbox-role="dad"])'
),
checked = $(
'[data-checkboxes="' +
group +
'"]:not([data-checkbox-role="dad"]):checked'
),
dad = $(
'[data-checkboxes="' + group + '"][data-checkbox-role="dad"]'
),
total = all.length,
checked_length = checked.length;
if(role == 'dad') {
if(me.is(':checked')) {
all.prop('checked', true);
if (role == "dad") {
if (me.is(":checked")) {
all.prop("checked", true);
} else {
all.prop('checked', false);
all.prop("checked", false);
}
} else {
if (checked_length >= total) {
dad.prop('checked', true);
dad.prop("checked", true);
} else {
dad.prop('checked', false);
dad.prop("checked", false);
}
}
});
});
// User
$("#table-1").dataTable({
"columnDefs": [
{ "sortable": false, "targets": [2,3] }
]
columnDefs: [{ sortable: false, targets: [2, 7] }],
});
// Refund, Setting, Transaction
$("#table-2").dataTable({
"columnDefs": [
{ "sortable": false, "targets": [0,2,3] }
]
ordering: true,
});

File diff suppressed because one or more lines are too long

View File

@ -135,7 +135,7 @@
</div>
</div>
<div class="card-body">
<canvas id="myChart1" height="130"></canvas>
<canvas id="myChart1"></canvas>
{{-- <div class="statistic-details mt-sm-4">
<div class="statistic-details-item">
<span class="text-muted"><span class="text-primary"><i
@ -372,4 +372,221 @@
</section>
</div>
@include('admin.transaction.tracking')
<script src="{{ asset('assets/modules/chart.min.js') }}"></script>
<script>
// Set new default font family and font color to mimic Bootstrap's default styling
Chart.defaults.global.defaultFontFamily = 'Nunito',
'-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif';
Chart.defaults.global.defaultFontColor = '#858796';
var ctx = document.getElementById("myChart1").getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December"],
datasets: [{
label: 'Transaction',
data: [3200, 18009, 4305, 3022, 6310, 5120, 5880, 6154, 0],
borderWidth: 2,
backgroundColor: 'rgba(63,82,227,.8)',
borderWidth: 0,
borderColor: 'transparent',
pointBorderWidth: 0,
pointRadius: 3.5,
pointBackgroundColor: 'transparent',
pointHoverBackgroundColor: 'rgba(63,82,227,.8)',
},
{
label: 'Refund',
data: [2207, 3403, 220000, 5025, 2302, 4208, 3880, 4880, 5000],
borderWidth: 2,
backgroundColor: 'rgba(254,86,83,.7)',
borderWidth: 0,
borderColor: 'transparent',
pointBorderWidth: 0,
pointRadius: 3.5,
pointBackgroundColor: 'transparent',
pointHoverBackgroundColor: 'rgba(254,86,83,.8)',
}
]
},
options: {
layout:{
padding: 20,
},
legend: {
display: true,
labels:{
padding: 20,
}
},
scales: {
yAxes: [{
gridLines: {
// display: false,
drawBorder: false,
color: '#f2f2f2',
},
ticks: {
beginAtZero: true,
stepSize: 15000,
callback: function(value, index, values) {
// return 'Rp.' + value;
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR',
}).format(value);
}
}
}],
xAxes: [{
gridLines: {
display: true,
tickMarkLength: 15,
}
}]
},
}
});
var balance_chart = document.getElementById("balance-chart").getContext('2d');
var balance_chart_bg_color = balance_chart.createLinearGradient(0, 0, 0, 70);
balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)');
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
var myChart = new Chart(balance_chart, {
type: 'line',
data: {
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018',
'22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018',
'28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'
],
datasets: [{
label: 'Balance',
data: [50, 61, 80, 50, 72, 52, 60, 41, 30, 45, 70, 40, 93, 63, 50, 62],
backgroundColor: balance_chart_bg_color,
borderWidth: 3,
borderColor: 'rgba(63,82,227,1)',
pointBorderWidth: 0,
pointBorderColor: 'transparent',
pointRadius: 3,
pointBackgroundColor: 'transparent',
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
}]
},
options: {
layout: {
padding: {
bottom: -1,
left: -1
}
},
legend: {
display: false
},
scales: {
yAxes: [{
gridLines: {
display: false,
drawBorder: false,
},
ticks: {
beginAtZero: true,
display: false
}
}],
xAxes: [{
gridLines: {
drawBorder: false,
display: false,
},
ticks: {
display: false
}
}]
},
}
});
var sales_chart = document.getElementById("sales-chart").getContext('2d');
var sales_chart_bg_color = sales_chart.createLinearGradient(0, 0, 0, 80);
balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)');
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
var myChart = new Chart(sales_chart, {
type: 'line',
data: {
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018',
'22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018',
'28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'
],
datasets: [{
label: 'Sales',
data: [70, 62, 44, 40, 21, 63, 82, 52, 50, 31, 70, 50, 91, 63, 51, 60],
borderWidth: 2,
backgroundColor: balance_chart_bg_color,
borderWidth: 3,
borderColor: 'rgba(63,82,227,1)',
pointBorderWidth: 0,
pointBorderColor: 'transparent',
pointRadius: 3,
pointBackgroundColor: 'transparent',
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
}]
},
options: {
layout: {
padding: {
bottom: -1,
left: -1
}
},
legend: {
display: false
},
scales: {
yAxes: [{
gridLines: {
display: false,
drawBorder: false,
},
ticks: {
beginAtZero: true,
display: false
}
}],
xAxes: [{
gridLines: {
drawBorder: false,
display: false,
},
ticks: {
display: false
}
}]
},
}
});
// $("#products-carousel").owlCarousel({
// items: 3,
// margin: 10,
// autoplay: true,
// autoplayTimeout: 5000,
// loop: true,
// responsive: {
// 0: {
// items: 2
// },
// 768: {
// items: 2
// },
// 1200: {
// items: 3
// }
// }
// });
</script>
@endsection

View File

@ -19,7 +19,7 @@
<div class="dropdown-list-content dropdown-list-message">
<a href="#" class="dropdown-item dropdown-item-unread">
<div class="dropdown-item-avatar">
<img alt="image" src="assets/img/avatar/avatar-1.png" class="rounded-circle">
<img alt="image" src="{{asset('assets/img/avatar/avatar-1.png')}}" class="rounded-circle">
<div class="is-online"></div>
</div>
<div class="dropdown-item-desc">
@ -30,7 +30,7 @@
</a>
<a href="#" class="dropdown-item dropdown-item-unread">
<div class="dropdown-item-avatar">
<img alt="image" src="assets/img/avatar/avatar-2.png" class="rounded-circle">
<img alt="image" src="{{asset('assets/img/avatar/avatar-2.png')}}" class="rounded-circle">
</div>
<div class="dropdown-item-desc">
<b>Dedik Sugiharto</b>
@ -40,7 +40,7 @@
</a>
<a href="#" class="dropdown-item dropdown-item-unread">
<div class="dropdown-item-avatar">
<img alt="image" src="assets/img/avatar/avatar-3.png" class="rounded-circle">
<img alt="image" src="{{asset('assets/img/avatar/avatar-3.png')}}" class="rounded-circle">
<div class="is-online"></div>
</div>
<div class="dropdown-item-desc">
@ -51,7 +51,7 @@
</a>
<a href="#" class="dropdown-item">
<div class="dropdown-item-avatar">
<img alt="image" src="assets/img/avatar/avatar-4.png" class="rounded-circle">
<img alt="image" src="{{asset('assets/img/avatar/avatar-4.png')}}" class="rounded-circle">
</div>
<div class="dropdown-item-desc">
<b>Ardian Rahardiansyah</b>
@ -61,7 +61,7 @@
</a>
<a href="#" class="dropdown-item">
<div class="dropdown-item-avatar">
<img alt="image" src="assets/img/avatar/avatar-5.png" class="rounded-circle">
<img alt="image" src="{{asset('assets/img/avatar/avatar-5.png')}}" class="rounded-circle">
</div>
<div class="dropdown-item-desc">
<b>Alfa Zulkarnain</b>
@ -137,7 +137,7 @@
</li>
<li class="dropdown"><a href="#" data-toggle="dropdown"
class="nav-link dropdown-toggle nav-link-lg nav-link-user">
<img alt="image" src="assets/img/avatar/avatar-1.png" class="rounded-circle mr-1">
<img alt="image" src="{{asset('assets/img/avatar/avatar-1.png')}}" class="rounded-circle mr-1">
<div class="d-sm-none d-lg-inline-block">Hi, {{ $name }}</div>
</a>
<div class="dropdown-menu dropdown-menu-right">

View File

@ -55,7 +55,7 @@
href="{{ asset('assets/modules/datatables/DataTables-1.10.16/css/dataTables.bootstrap4.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/modules/datatables/Select-1.2.4/css/select.bootstrap4.min.css') }}">
<!-- Start GA -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-94034622-3"></script>
{{-- <script async src="https://www.googletagmanager.com/gtag/js?id=UA-94034622-3"></script>
<script>
window.dataLayer = window.dataLayer || [];
@ -65,8 +65,30 @@
gtag('js', new Date());
gtag('config', 'UA-94034622-3');
</script>
</script> --}}
<!-- /END GA -->
{{-- JS --}}
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<header class="header-area header-sticky">
@include('admin.layout.header')
</header>
<main id="main" style="min-height: 100vh;">
@include('admin.layout.sidebar')
@yield('content')
</main>
<footer id="footer">
@include('admin.layout.footer')
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script>
$(document).ready(function() {
@ -110,23 +132,6 @@
});
});
</script>
<!-- /END GA -->
</head>
<body>
<header class="header-area header-sticky">
@include('admin.layout.header')
</header>
<main id="main" style="min-height: 100vh;">
@include('admin.layout.sidebar')
@yield('content')
</main>
<footer id="footer">
@include('admin.layout.footer')
</footer>
<!-- General JS Scripts -->
<script src="{{ asset('assets/modules/jquery.min.js') }}"></script>
@ -145,11 +150,10 @@
<script src="{{ asset('assets/modules/summernote/summernote-bs4.js') }}"></script>
<script src="{{ asset('assets/modules/chocolat/dist/js/jquery.chocolat.min.js') }}"></script>
<!-- Page Specific JS File -->
<script src="{{ asset('assets/js/page/index.js') }}"></script>
<script src="{{ asset('assets/js/page/index-0.js') }}"></script>
<!-- JS Libraies -->
<script src="{{ asset('assets/modules/datatables/datatables.min.js') }}"></script>
{{-- <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.5/css/jquery.dataTables.css"> --}}
{{-- <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.11.5/js/jquery.dataTables.js"></script> --}}
<script src="{{ asset('assets/modules/datatables/DataTables-1.10.16/js/dataTables.bootstrap4.min.js') }}"></script>
<script src="{{ asset('assets/modules/datatables/Select-1.2.4/js/dataTables.select.min.js') }}"></script>
<script src="{{ asset('assets/modules/jquery-ui/jquery-ui.min.js') }}"></script>
@ -176,28 +180,6 @@
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const toggleSwitches = document.querySelectorAll('.switch input[type="checkbox"]');
toggleSwitches.forEach(toggleSwitch => {
toggleSwitch.addEventListener('change', function() {
const parentRow = toggleSwitch.closest('tr');
const statusBadge = parentRow.querySelector('.badge');
const onText = toggleSwitch.nextElementSibling.getAttribute('data-on-text');
const offText = toggleSwitch.nextElementSibling.getAttribute('data-off-text');
if (toggleSwitch.checked) {
statusBadge.textContent = onText === 'Yes' ? 'Active' : 'Non Active';
statusBadge.classList.remove('badge-danger');
statusBadge.classList.add('badge-success');
} else {
statusBadge.textContent = offText === 'No' ? 'Non Active' : 'Active';
statusBadge.classList.remove('badge-success');
statusBadge.classList.add('badge-danger');
}
});
});
});
</script>
</body>

View File

@ -10,12 +10,12 @@
<li class="menu-header">Dashboard</li>
<li ><a class="nav-link active" href="{{route('index')}}"><i class="fas fa-fire"></i> <span>Dashboard</span></a></li>
<li class="menu-header">Starter</li>
<li><a class="nav-link" href="{{route('user.index')}}"><i class="far fa-user"></i> <span>User</span></a></li>
<li><a class="nav-link" href="{{route('transaction.index')}}"><i
<li><a class="nav-link" href="{{route('admin-user.index')}}"><i class="far fa-user"></i> <span>User</span></a></li>
<li><a class="nav-link" href="{{route('admin-transaction.index')}}"><i
class="fas fa-columns"></i><span>Transaction</span></a></li>
<li><a class="nav-link" href="{{route('refund.index')}}"><i class="far fa-square"></i> <span>List Refund</span></a>
<li><a class="nav-link" href="{{route('admin-refund.index')}}"><i class="far fa-square"></i> <span>List Refund</span></a>
</li>
<li><a class="nav-link" href="{{route('setting.index')}}"><i class="fas fa-cog"></i> <span>Setting</span></a></li>
<li><a class="nav-link" href="{{route('admin-setting.index')}}"><i class="fas fa-cog"></i> <span>Setting</span></a></li>
</ul>
</aside>
</div>

View File

@ -14,7 +14,7 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-1">
<table class="table table-striped" id="table-2">
<thead>
<tr>
<th class="text-center">

View File

@ -12,30 +12,27 @@
<div class="section-body">
<div class="row">
<div class="col-12">
<form>
<form action="{{route('admin-setting.store')}}" method="POST">
@csrf
<div class="card-header">
<h4>Add Data Setting</h4>
</div>
<div class="card-body">
<div class="form-group">
<label>Bulan</label>
<input type="text" class="form-control" required="">
<input type="month" class="form-control" name="bulan_tahun" required>
</div>
<div class="form-group">
{{-- <div class="form-group">
<label>Tahun</label>
<input type="number" class="form-control" required="">
</div>
<input type="number" class="form-control" name="tahun" required>
</div> --}}
<div class="form-group">
<label>Persentase</label>
<input type="text" class="form-control">
</div>
<div class="form-group mb-0">
<label>Status</label>
<input type="text" class="form-control" required=""></input>
<input type="number" class="form-control" name="persentase" required>
</div>
</div>
<div class="card-footer text-right">
<button class="btn btn-primary">Submit</button>
<button class="btn btn-primary" id="simpan" type="submit">Simpan</button>
</div>
</form>
</div>

View File

@ -1,4 +1,4 @@
@extends('Admin.layout.main')
@extends('admin.layout.main')
@section('content')
<div class="main-content">
<section class="section">
@ -17,39 +17,36 @@
data-target="#ModalSetting">Add Data</a>
</div>
<div class="table-responsive">
<table class="table table-striped" id="table-1">
<table class="table table-striped" id="table-2">
<thead>
<tr>
<th>#</th>
<th>Bulan</th>
<th>Tahun</th>
<th>Persentase</th>
<th>Persentase (%)</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach ($setting as $settings)
@foreach ($settings as $setting)
<tr>
<td>{{ $settings['no'] }}</td>
<td>{{ $settings['month'] }}</td>
<td>{{ $settings['year'] }}</td>
<td>{{ $settings['persentase'] }}</td>
<td>{{ $loop->iteration }}</td>
<td>{{ DateTime::createFromFormat('!m', $setting->bulan)->format('F') }}</td>
<td>{{ $setting->tahun }}</td>
<td>{{ $setting->persentase }}</td>
{{-- <td hidden>{{$setting->id}}</td> --}}
<td>
@php
$statusClass = '';
if ($settings['status'] === 'Active') {
$statusClass = 'badge-success';
} elseif ($settings['status'] === 'Non Active') {
$statusClass = 'badge-danger';
}
@endphp
<div class="badge {{ $statusClass }}">{{ $settings['status'] }}</div>
<div
class="badge {{ $setting->status == 'Active' ? 'badge-success' : 'badge-danger' }}">
{{ $setting->status }}</div>
</td>
<td>
<label class="switch">
<input type="checkbox" @if ($settings['status'] === 'Active') checked @endif>
<span class="slider round" data-on-text="Yes" data-off-text="No" id="checkOnOf"></span>
<input type="checkbox" @if ($setting->status === 'Active') checked @endif
data-id="{{ $setting->id }}">
<span class="slider round" data-on-text="Yes" data-off-text="No"
id="checkOnOf"></span>
</label>
</td>
</tr>
@ -62,5 +59,59 @@
</div>
</section>
</div>
@include('Admin.setting.add-Data')
@include('admin.setting.add-data')
<script>
$(document).ready(function() {
const table = $('#table-2').DataTable(); // Inisialisasi DataTable
$('#table-2').on('change', '.switch input[type="checkbox"]', function() {
const parentRow = $(this).closest('tr');
const csrfToken = $('meta[name="csrf-token"]').attr('content');
const statusBadge = parentRow.find('.badge');
const onText = $(this).next().data('on-text');
const offText = $(this).next().data('off-text');
const isChecked = $(this).prop('checked');
let dataId = $(this).data("id");
const rowData = table.row(parentRow).data(); // Dapatkan data baris dari DataTable
$.ajax({
url: "{{ route('admin-setting.update', ':admin_setting') }}".replace(':admin_setting', dataId),
type: 'PUT',
data: {
_token: csrfToken,
},
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil!' : 'Gagal!',
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK'
}).then(function() {
if (isChecked) {
// location.reload();
statusBadge.text(onText === 'Yes' ? 'Active' :
'Nonactive');
statusBadge.removeClass('badge-danger').addClass(
'badge-success');
} else {
statusBadge.text(offText === 'No' ? 'Nonactive' :
'Active');
statusBadge.removeClass('badge-success').addClass(
'badge-danger');
}
});
},
error: function(error) {
Swal.fire({
title:'Error!',
text:'Terjadi error, '+error,
icon:'error',
confirmButtonText : 'OK'
});
}
});
});
});
</script>
@endsection

View File

@ -75,7 +75,7 @@
</div>
</div>
<div class="modal-footer">
<a href="{{route('transaction.index')}}" class="btn btn-primary mx-1">Back</a>
<a href="{{route('admin-transaction.index')}}" class="btn btn-primary mx-1">Back</a>
</div>
</div>
</div>

View File

@ -14,7 +14,7 @@
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped" id="table-1">
<table class="table table-striped" id="table-2">
<thead>
<tr>
<th class="text-center">

View File

@ -28,22 +28,22 @@
</tr>
</thead>
<tbody>
@foreach ($list_users as $list_user)
@foreach ($list_users as $user)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $list_user->id }}</td>
<td>{{ $user->id }}</td>
<td>
<figure class="avatar mr-2 avatar-xl">
<img src="{{ asset('assets/img/avatar/avatar-6.png') }}" alt="...">
</figure>
</td>
<td>{{ $list_user->nama }}</td>
<td>{{ $list_user->email }}</td>
<td>{{ $list_user->created_at }}</td>
<td>{{ $user->nama }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->created_at }}</td>
<td>
<div
class="badge {{ $list_user->status == 'Finished' ? 'badge-success' : 'badge-danger' }}">
{{ $list_user->status }}</div>
class="badge {{ $user->status == 'Finished' ? 'badge-success' : ($user->status == 'Progress' ? 'badge-info' : 'badge-warning') }}">
{{ $user->status }}</div>
</td>
<td>
<div class="btn-group">
@ -53,9 +53,14 @@
</button>
<div class="dropdown-menu">
<a class="dropdown-item"
href="{{ route('user.show', $list_user->id) }}">Details</a>
href="{{ route('admin-user.show', $user->id) }}">Details</a>
@if ($user->status == 'Progress')
<a class="dropdown-item" href="#"
data-id="{{ $list_user->id }}" id="deleteUser">Delete</a>
data-id="{{ $user->id }}" id="approveUser">Setujui
Akun</a>
@endif
<a class="dropdown-item" href="#"
data-id="{{ $user->id }}" id="deleteUser">Delete</a>
</div>
</div>
</td>
@ -71,6 +76,7 @@
</div>
<script>
$(function() {
// Hapus data
$('#table-1').on('click', '#deleteUser', function() {
const csrfToken = $('meta[name="csrf-token"]').attr('content');
let dataId = $(this).data("id");
@ -91,9 +97,11 @@
});
$.ajax({
'url': "{{ route('user.destroy', ':user') }}".replace(':user',
url: "{{ route('admin-user.destroy', ':admin_user') }}"
.replace(
':admin_user',
dataId),
'type': 'DELETE',
type: 'DELETE',
processData: false,
contentType: false,
success: function(response) {
@ -103,6 +111,9 @@
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK'
}).then(function() {
// location.reload();
console.log(response);
});
},
error: function(error) {
@ -122,7 +133,90 @@
});
}
});
})
});
// Approved dan deny Akun
$('#table-1').on('click', '#approveUser', function() {
const csrfToken = $('meta[name="csrf-token"]').attr('content');
let dataId = $(this).data("id");
Swal.fire({
title: '',
text: 'Apakah yakin ingin menyutuji akun user ini?',
icon: 'info',
confirmButtonText: 'Ya, setuju!',
showDenyButton: true,
denyButtonText: 'Tidak, jangan setujui!',
}).then((result) => {
if (result.isConfirmed) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('admin-user.approve', ':id') }}".replace(
':id', dataId),
type: 'PUT',
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil!' :
'Gagal!',
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK'
}).then(function() {
location.reload();
});
},
error: function(error) {
Swal.fire({
title: 'Gagal!',
text: 'Tidak ada data yang dihapus, karena ' +
error,
icon: 'error'
}).then(function() {
location.reload();
});
}
});
} else if (result.isDenied) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
$.ajax({
url: "{{ route('admin-user.deny', ':id') }}".replace(
':id', dataId),
type: 'PUT',
success: function(response) {
Swal.fire({
title: response.status ? 'Berhasil!' :
'Gagal!',
text: response.message,
icon: response.status ? 'success' : 'error',
confirmButtonText: 'OK'
}).then(function() {
location.reload();
});
},
error: function(error) {
Swal.fire({
title: 'Gagal!',
text: 'Gagal mengubah status akun, karena ' +
error,
icon: 'info'
});
}
});
}
});
});
});
</script>
@endsection

View File

@ -1,17 +1,12 @@
<?php
use App\Http\Controllers\Admin\RefundController;
use Illuminate\Support\Facades\Route;
use App\Models\Refunds;
use App\Models\Refund;
use App\Models\Settings;
use App\Models\Setting;
use App\Models\Transactions;
use App\Models\Transaction;
use App\Models\User;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\SettingController;
use App\Http\Controllers\Admin\TransactionController;
use App\Http\Controllers\Admin\AdminRefundController;
use App\Http\Controllers\Admin\AdminUserController;
use App\Http\Controllers\Admin\AdminSettingController;
use App\Http\Controllers\Admin\AdminTransactionController;
use App\Http\Controllers\Login\LoginController;
// use Illuminate\Foundation\Auth\User;
@ -103,7 +98,7 @@ Route::get('/profile',function() {
// });
Route::resource('/',LoginController::class);
Route::resource('/login',LoginController::class);
@ -111,17 +106,24 @@ Route::resource('/',LoginController::class);
// admin dan user
Route::middleware(['auth'])->group(function(){
// Route::middleware(['auth'])->group(function(){
Route::prefix('admin')->group(function(){
// Tampilan dashboard admin beserta perhitungan
// Tampilan, aprove atau deny dan hapus user
Route::resource('user', UserController::class);
// Route::resource('admin-user', AdminUserController::class);
Route::controller(AdminUserController::class)->group(function(){
Route::get('admin-user','index')->name('admin-user.index');
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');
});
// Tampilan transaksi
Route::resource('transaction', TransactionController::class);
Route::resource('admin-transaction', AdminTransactionController::class);
// Tampilan, approve atau deny dan hapus refund
Route::resource('refund',RefundController::class);
Route::resource('admin-refund',AdminRefundController::class);
// Tampilan, tambah, ubah dan hapus kebijakan persentase perusahaan
Route::resource('setting',SettingController::class);
Route::resource('admin-setting',AdminSettingController::class);
});
Route::prefix('user')->group(function(){
// Tampilan dashboard user beserta perhitungan
@ -129,5 +131,6 @@ Route::middleware(['auth'])->group(function(){
// Tampilan transaksi, bayar, update status pengiriman dan refund
// Tampilan refund
// Tampilan
// Route::resource('user', UserController::class);
});
});
// });