Compare commits

..

19 Commits

Author SHA1 Message Date
mikhailkusuma 21ae8c7d7e Merge branch 'main-gitea-akuncoa' of https://git.indoserv.net/wewmantap/resto-dhepot into mico 2024-02-01 22:10:45 +07:00
mikhailkusuma 865faec964 Add: UpdateMenu
Refactor: Paket Irit (Transaksi)
2024-02-01 22:07:48 +07:00
Zelda Ababil 52a37b0bc6 pengeluaran 2024-02-01 15:29:34 +07:00
Zelda Ababil 78e6e30a60 role 2024-02-01 13:04:06 +07:00
Zelda Ababil 2724413e20 dashboard tipis" 2024-01-31 19:10:03 +07:00
mikhailkusuma 9cac2a6be3 Merge branch 'main-gitea-akuncoa' of https://git.indoserv.net/wewmantap/resto-dhepot into mico 2024-01-26 20:04:22 +07:00
mikhailkusuma 00628de085 Add: menu 2024-01-26 20:01:03 +07:00
Zelda Ababil 81a14c5d8a merging mas sofyan 2024-01-26 18:48:11 +07:00
Akhmad Sofyan 28ed616aa1 add laporan pengeluaran, add pengeluaran 2024-01-26 18:47:06 +07:00
Zelda Ababil fc9557d37f merging mas sofyan 2024-01-25 16:55:29 +07:00
Zelda Ababil d25ebb2d09 fix seeder 2024-01-25 16:52:45 +07:00
Akhmad Sofyan 173ee9d33a edit file transaksi tampilan dan bayar uang pas 2024-01-25 16:13:09 +07:00
mikhailkusuma ce3308d673 Merge branch 'main-gitea-akuncoa' of https://git.indoserv.net/wewmantap/resto-dhepot into mico 2024-01-25 15:31:16 +07:00
mikhailkusuma 81f95d8a42 updae: _blank on js.blade 2024-01-25 15:31:05 +07:00
Zelda Ababil d3288c7cd4 seeder 2024-01-25 15:26:26 +07:00
Zelda Ababil bcc3d8b575 merging mas sofyan mico and akuncoa 2024-01-25 12:40:59 +07:00
Zelda Ababil dbe920e45f Merge branch 'sofyan' of https://git.indoserv.net/wewmantap/resto-dhepot into main-gitea-akuncoa 2024-01-25 12:39:07 +07:00
Zelda Ababil 44fda60efe uac 2024-01-25 12:36:37 +07:00
Akhmad Sofyan c13313e87d add transaksi non tunai 2024-01-24 17:46:58 +07:00
55 changed files with 3751 additions and 364 deletions

View File

@ -0,0 +1,74 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
class CreateAtasCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:generate-atas';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Migration started..');
$migrate = Artisan::call('migrate');
$this->info('Migrate successfully.');
$this->info('Truncate started..');
// Nonaktifkan constraint
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->info('Foreign key check disabled.');
DB::statement('TRUNCATE table roles');
$this->info('Truncate roles successfully.');
DB::statement('TRUNCATE table model_has_roles');
$this->info('Truncate model_has_roles successfully.');
DB::statement('TRUNCATE table model_has_permissions');
$this->info('Truncate model_has_permissions successfully.');
DB::statement('TRUNCATE table permissions');
$this->info('Truncate permissions successfully.');
DB::statement('TRUNCATE table role_has_permissions');
$this->info('Truncate role_has_permissions successfully.');
// Aktifkan kembali constraint
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
$this->info('Foreign key check enabled.');
$this->info('Truncate successfully.');
$this->info('Permission started..');
Artisan::call('route:clear');
$this->info('Route cache cleared successfully.');
Artisan::call('permission:cache-reset');
$this->info('Permission cache reset successfully.');
Artisan::call('permission:create-permission-routes');
$this->info('Permission successfully.');
$this->info('Seeder started..');
Artisan::call('db:seed', [
'--class' => 'GenerateAtasSeeder',
'--force' => true
]);
$this->info('Seeder successfully.');
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;
class CreateFreshCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:generate-fresh';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Migration started..');
$migrate = Artisan::call('migrate:fresh --seed');
$this->info('Migrate successfully.');
$this->info('Permission started..');
Artisan::call('permission:create-permission-routes');
$this->info('Permission successfully.');
$this->info('Seeder started..');
Artisan::call('db:seed', [
'--class' => 'GenerateFreshSeeder',
'--force' => true
]);
$this->info('Seeder successfully.');
}
}

View File

@ -42,10 +42,11 @@ class CreateRoutePermissionCommand extends Command
}
if (is_null($permission)) {
permission::create(['name' => $data, 'group_name' => $first_group, 'desc' => $comment]);
$this->info('Permission routes ' . $route->getName() . ' added successfully.');
}
}
}
$this->info('Permission routes added successfully.');
$this->info('All Permission routes added successfully.');
}
}

View File

@ -90,3 +90,7 @@ function RemoveSpecialCharPlus($str)
// Returning the result
return $res;
}
function toDmy($date){
return date("d-m-Y", strtotime($date));
}

View File

@ -0,0 +1,323 @@
<?php
namespace App\Http\Controllers\Admins;
use App\Helpers\ResponseFormatter;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Kasir\Menu;
use App\Models\MenuTerlarisView;
use App\Models\Pengeluaran;
use App\Models\Pesanan;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Yajra\DataTables\Facades\DataTables;
class DashboardController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('pages.admin.dashboard');
}
/**
* @Author: xelz
* @Date: 2024-01-26 18:59:12
* @Desc: Display Menu Terlaris
*/
public function menuTerlaris()
{
$data = MenuTerlarisView::where([['kategori_produk_id', '=', 2], ['tgl_start_promo', '=', null]])->get();
return DataTables::of($data)
->addIndexColumn()
->make(true);
}
public function getCalculationPendapatan()
{
$pendapatanBulan = $this->calculatePendapatanBulan();
$pendapatanHari = $this->calculatePendapatanHari();
$pengeluaranBulan = $this->calculatePengeluaranBulan();
$pengeluaranHari = $this->calculatePengeluaranHari();
return ResponseFormatter::success(['pendapatanBulan' => $pendapatanBulan, 'pendapatanHari' => $pendapatanHari, 'pengeluaranBulan' => $pengeluaranBulan, 'pengeluaranHari' => $pengeluaranHari]);
}
private function calculatePendapatanBulan()
{
// tanggal bulan ini
$first_day_of_the_current_month = Carbon::today()->startOfMonth();
$last_day_of_the_current_month = $first_day_of_the_current_month->copy()->endOfMonth();
// tanggal bulan lalu
$first_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->startOfMonth();
$last_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->endOfMonth();
// get data jumlah penjualan keseluruhan dalam satu bulan
$penjualanSatuBulan = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_current_month, $last_day_of_the_current_month])->sum('grand_total');
$penjualanBulanLalu = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_previous_month, $last_day_of_the_previous_month])->sum('grand_total');
/**
* @Author: xelz
* @Date: 2024-01-30 15:52:41
* @Desc: constant status
* 1 netral
* 2 plus
* 3 minus
*/
$statusCalculation = 1;
// calculate percentage of sales growth in the last month and this month
if ($penjualanBulanLalu != 0) {
$statusCalculation = 2;
$percentageOfSalesGrowth = ($penjualanSatuBulan - $penjualanBulanLalu) / $penjualanBulanLalu * 100;
// minus or not
if ($percentageOfSalesGrowth < 0) {
$statusCalculation = 3;
$percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
}
} else {
$statusCalculation = 1;
$percentageOfSalesGrowth = 0;
}
return [
'penjualanSatuBulan' => $penjualanSatuBulan,
'penjualanBulanLalu' => $penjualanBulanLalu,
'statusCalculation' => $statusCalculation,
'percentageOfSalesGrowth' => $percentageOfSalesGrowth
];
}
private function calculatePendapatanHari()
{
// tanggal hari ini
$first_day_of_the_current_day = Carbon::today()->startOfDay();
$last_day_of_the_current_day = $first_day_of_the_current_day->copy()->endOfDay();
// tanggal kemarin
$first_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->startOfDay();
$last_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->endOfDay();
// get data jumlah penjualan keseluruhan dalam satu bulan
$penjualanHariIni = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_current_day, $last_day_of_the_current_day])->sum('grand_total');
$penjualanKemarin = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_previous_day, $last_day_of_the_previous_day])->sum('grand_total');
/**
* @Author: xelz
* @Date: 2024-01-30 15:52:41
* @Desc: constant status
* 1 netral
* 2 plus
* 3 minus
*/
$statusCalculation = 1;
// calculate percentage of sales growth in the last month and this month
if ($penjualanKemarin != 0) {
$statusCalculation = 2;
$percentageOfSalesGrowth = ($penjualanHariIni - $penjualanKemarin) / $penjualanKemarin * 100;
// minus or not
if ($percentageOfSalesGrowth < 0) {
$statusCalculation = 3;
$percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
}
} else {
$statusCalculation = 1;
$percentageOfSalesGrowth = 0;
}
return [
'penjualanHariIni' => $penjualanHariIni,
'penjualanKemarin' => $penjualanKemarin,
'statusCalculation' => $statusCalculation,
'percentageOfSalesGrowth' => $percentageOfSalesGrowth
];
}
private function calculatePengeluaranBulan()
{
// tanggal bulan ini
$first_day_of_the_current_month = Carbon::today()->startOfMonth();
$last_day_of_the_current_month = $first_day_of_the_current_month->copy()->endOfMonth();
// tanggal bulan lalu
$first_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->startOfMonth();
$last_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->endOfMonth();
// get data jumlah penjualan keseluruhan dalam satu bulan
$penjualanSatuBulan = pengeluaran::whereBetween('tanggal', [$first_day_of_the_current_month, $last_day_of_the_current_month])->sum('nominal');
$penjualanBulanLalu = pengeluaran::whereBetween('tanggal', [$first_day_of_the_previous_month, $last_day_of_the_previous_month])->sum('nominal');
/**
* @Author: xelz
* @Date: 2024-01-30 15:52:41
* @Desc: constant status
* 1 netral
* 2 plus
* 3 minus
*/
$statusCalculation = 1;
// calculate percentage of sales growth in the last month and this month
if ($penjualanBulanLalu != 0) {
$statusCalculation = 2;
$percentageOfSalesGrowth = ($penjualanSatuBulan - $penjualanBulanLalu) / $penjualanBulanLalu * 100;
// minus or not
if ($percentageOfSalesGrowth < 0) {
$statusCalculation = 3;
$percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
}
} else {
$statusCalculation = 1;
$percentageOfSalesGrowth = 0;
}
return [
'penjualanSatuBulan' => $penjualanSatuBulan,
'penjualanBulanLalu' => $penjualanBulanLalu,
'statusCalculation' => $statusCalculation,
'percentageOfSalesGrowth' => $percentageOfSalesGrowth
];
}
private function calculatePengeluaranHari()
{
// tanggal hari ini
$first_day_of_the_current_day = Carbon::today()->startOfDay();
$last_day_of_the_current_day = $first_day_of_the_current_day->copy()->endOfDay();
// tanggal kemarin
$first_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->startOfDay();
$last_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->endOfDay();
// get data jumlah penjualan keseluruhan dalam satu bulan
$penjualanHariIni = Pengeluaran::whereBetween('tanggal', [$first_day_of_the_current_day, $last_day_of_the_current_day])->sum('nominal');
$penjualanKemarin = pengeluaran::whereBetween('tanggal', [$first_day_of_the_previous_day, $last_day_of_the_previous_day])->sum('nominal');
/**
* @Author: xelz
* @Date: 2024-01-30 15:52:41
* @Desc: constant status
* 1 netral
* 2 plus
* 3 minus
*/
$statusCalculation = 1;
// calculate percentage of sales growth in the last month and this month
if ($penjualanKemarin != 0) {
$statusCalculation = 2;
$percentageOfSalesGrowth = ($penjualanHariIni - $penjualanKemarin) / $penjualanKemarin * 100;
// minus or not
if ($percentageOfSalesGrowth < 0) {
$statusCalculation = 3;
$percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
}
} else {
$statusCalculation = 1;
$percentageOfSalesGrowth = 0;
}
return [
'penjualanHariIni' => $penjualanHariIni,
'penjualanKemarin' => $penjualanKemarin,
'statusCalculation' => $statusCalculation,
'percentageOfSalesGrowth' => $percentageOfSalesGrowth
];
}
public function getChart()
{
$allPenjualan = Pesanan::sum('grand_total');
$weekThisMonth = $this->getDataEachWeekThisMonth();
$weekLastMonth = $this->getDataEachWeekLastMonth();
return ResponseFormatter::success(['allPenjualan' => $allPenjualan, 'weekThisMonth' => $weekThisMonth, 'weekLastMonth' => $weekLastMonth]);
}
private function getDataEachWeekThisMonth()
{
//format string
$f = 'Y-m-d';
//if you want to record time as well, then replace today() with now()
//and remove startOfDay()
$today = Carbon::today();
$date = $today->copy()->firstOfMonth()->startOfDay();
$eom = $today->copy()->endOfMonth()->startOfDay();
$dates = [];
for ($i = 1; $date->lte($eom); $i++) {
//record start date
$startDate = $date->copy();
//loop to end of the week while not crossing the last date of month
while ($date->dayOfWeek != Carbon::SUNDAY && $date->lte($eom)) {
$date->addDay();
}
$dates['Minggu ke ' . $i] = $startDate->format($f) . ' 00:00:00 |' . $date->format($f) . ' 23:59:59';
$date->addDay();
}
$datapenjualan = [];
foreach ($dates as $key => $value) {
$dataPenjualan = Pesanan::whereBetween('tanggal_pesanan', explode('|', $value))->sum('grand_total');
$datapenjualan[$key] = $dataPenjualan;
}
return $datapenjualan;
}
private function getDataEachWeekLastMonth()
{
//format string
$f = 'Y-m-d';
//if you want to record time as well, then replace today() with now()
//and remove startOfDay()
$today = Carbon::today()->subMonth();
$date = $today->copy()->firstOfMonth()->startOfDay();
$eom = $today->copy()->endOfMonth()->startOfDay();
$dates = [];
for ($i = 1; $date->lte($eom); $i++) {
//record start date
$startDate = $date->copy();
//loop to end of the week while not crossing the last date of month
while ($date->dayOfWeek != Carbon::SUNDAY && $date->lte($eom)) {
$date->addDay();
}
$dates['Minggu ke ' . $i] = $startDate->format($f) . ' 00:00:00 |' . $date->format($f) . ' 23:59:59';
$date->addDay();
}
$datapenjualan = [];
foreach ($dates as $key => $value) {
$dataPenjualan = Pesanan::whereBetween('tanggal_pesanan', explode('|', $value))->sum('grand_total');
$datapenjualan[$key] = $dataPenjualan;
}
return $datapenjualan;
}
}

View File

@ -0,0 +1,155 @@
<?php
namespace App\Http\Controllers\Admins\Pengeluaran;
use App\Http\Controllers\Controller;
use App\Models\BukuBesar;
use App\Models\Pengeluaran;
use App\Models\RekeningCoa;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PengeluaranController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$coaBiaya = RekeningCoa::where('kode_coa', 5)->get();
$rekeningCoaTf = RekeningCoa::where('kode_coa', 1)->where('sub_kode_coa', 200)->get();
return view('pages.admin.pengeluaran.index', compact('coaBiaya', 'rekeningCoaTf'));
}
public function simpan(Request $request)
{
try {
DB::beginTransaction();
$user = request()->user();
Pengeluaran::create([
'faktur' => "PG-" . date('YmdHis'),
'tanggal' => $request->tanggal,
'jenis_transaksi' => $request->jenis_transaksi,
'nominal' => $request->nominal,
'keterangan' => $request->keterangan,
'user_id' => $user->id
]);
if ($request->jenis_transaksi == "1") {
BukuBesar::create([
'faktur' => "PG-" . date('YmdHis'),
'tanggal' => $request->tanggal,
'rekening_coa_id' => "2",
'kode_rekening_coa' => "1.100.01",
'keterangan_coa' => "Kas Kasir",
'keterangan' => $request->keterangan,
'debet' => 0,
'kredit' => $request->nominal
]);
BukuBesar::create([
'faktur' => "PG-" . date('YmdHis'),
'tanggal' => $request->tanggal,
'rekening_coa_id' => $request->id_rekening_coa,
'kode_rekening_coa' => $request->kode_coa,
'keterangan_coa' => $request->keterangan_coa,
'keterangan' => $request->keterangan,
'debet' => $request->nominal,
'kredit' => 0,
]);
} else {
BukuBesar::create([
'faktur' => "PG-" . date('YmdHis'),
'tanggal' => $request->tanggal,
'rekening_coa_id' => $request->id_rekening_coa_transfer,
'kode_rekening_coa' => $request->kode_coa_transfer,
'keterangan_coa' => $request->keterangan_coa_transfer,
'keterangan' => $request->keterangan,
'debet' => 0,
'kredit' => $request->nominal
]);
BukuBesar::create([
'faktur' => "PG-" . date('YmdHis'),
'tanggal' => $request->tanggal,
'rekening_coa_id' => $request->id_rekening_coa,
'kode_rekening_coa' => $request->kode_coa,
'keterangan_coa' => $request->keterangan_coa,
'keterangan' => $request->keterangan,
'debet' => $request->nominal,
'kredit' => 0,
]);
}
DB::commit();
return response()->json(['status' => true, 'message' => 'Data berhasil tersimpan']);
} catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage());
return response()->json(['status' => false, 'message' => 'Kesalahan menyimpan data']);
}
}
public function laporan(Request $request)
{
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'orientation' => 'portrait',
'margin_left' => 15,
'margin_right' => 15,
'margin_top' => 10,
'margin_bottom' => 10,
'default_font_size' => 9,
'default_font' => 'arial',
]);
$mpdf->AddPage();
$mpdf->setFooter('{PAGENO}');
$data = Pengeluaran::with('user')->whereDate('tanggal', '>=', $request->filter_tanggal_1)
->whereDate('tanggal', '<=', $request->filter_tanggal_2)
->get();
$html = view('pages.admin.pengeluaran.laporan', [
'data' => $data,
'filter_tanggal_1' => $request->filter_tanggal_1,
'filter_tanggal_2' => $request->filter_tanggal_2,
]);
$mpdf->writeHTML($html);
$mpdf->Output('Laporan_Pengeluaran.pdf', 'I');
return response()->header('Content-Type', 'application/pdf');
}
public function getDatapengeluaran(Request $request)
{
$nomor = 1;
$filter_tanggal_1 = $request->filter_tanggal_1;
$filter_tanggal_2 = $request->filter_tanggal_2;
$data = Pengeluaran::with('user')
->when($filter_tanggal_1, function ($query) use ($filter_tanggal_1) {
return $query->whereDate('tanggal', '>=', $filter_tanggal_1);
})
->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) {
return $query->whereDate('tanggal', '<=', $filter_tanggal_2);
})
->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) {
return $query->whereDate('tanggal', Carbon::today());
})
->orderBy('tanggal', 'desc')
->get();
return datatables()
->of($data)
->addColumn('nomor', function ($data) use (&$nomor) {
return $nomor++;
})
->addColumn('ubah', function ($data) {
return '<div class="btn-group">
<a href="javascript:void(0)" onclick="detail(\'' . $data->id . '\')"><span class="btn btn-xs btn-warning mr-1"><i class="fas fa-eye"></i></span></a>
<a href="javascript:void(0)" onclick="print(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i></span></a></div>';
})
->rawColumns(['ubah'])
->make(true);
}
}

View File

@ -29,7 +29,7 @@ class RoleController extends Controller
// call table user with pagination
$datas = Role::latest()->paginate(10);
return view('pages.admins.roles.index', compact('datas'));
return view('pages.admin.roles.index', compact('datas'));
}
/**
@ -38,7 +38,7 @@ class RoleController extends Controller
public function create()
{
$permissions = Permission::all()->groupBy('group_name');
return view('pages.admins.roles.create', compact('permissions'));
return view('pages.admin.roles.create', compact('permissions'));
}
/**
@ -48,36 +48,28 @@ class RoleController extends Controller
{
// validation
$rules = array(
'name' => 'required',
'email' => 'required|email',
'password' => 'required|min:8'
'name' => 'required|unique:roles',
'permission' => 'required|min:8',
);
$validator = Validator::make($request->all(), $rules);
// check validation
if ($validator->fails()) {
return Redirect::to('admin/roles/create')
return Redirect::to('roles/create')
->withErrors($validator)
->withInput($request->except('password'));
} else {
// create new account
$user = Role::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
// Create role for user
$role = Role::findOrFail($request->role); // Pengunjung
$user->assignRole($role);
$role = Role::create(['name' => $request->input('name')]);
$role->syncPermissions($request->get('permission'));
// Create Session message
Session::flash('roles-message', [
'type' => 'success',
'msg' => 'Anda berhasil menambahkan data!'
'msg' => 'Berhasil menambah data!'
]);
return Redirect::to('admin/roles');
return Redirect::to('roles');
}
}
@ -100,7 +92,7 @@ class RoleController extends Controller
$permissions = Permission::get()->groupBy('group_name');
// call view pages
return view('pages.admins.roles.edit', compact('role', 'permissions', 'rolePermissions'));
return view('pages.admin.roles.edit', compact('role', 'permissions', 'rolePermissions'));
}
/**
@ -110,14 +102,14 @@ class RoleController extends Controller
{
// validation
$rules = array(
'name' => 'required|min:5',
'name' => 'required|unique:roles,name,' . $id . ',id',
'permission' => 'required|min:8',
);
$validator = Validator::make($request->all(), $rules);
// process the login
if ($validator->fails()) {
return Redirect::to('admin/roles/edit/' . $id)
return Redirect::to('roles/edit/' . $id)
->withErrors($validator)
->withInput();
} else {
@ -129,10 +121,10 @@ class RoleController extends Controller
// Create Session message
Session::flash('roles-message', [
'type' => 'success',
'msg' => 'Anda berhasil mengubah data!'
'msg' => 'Berhasil mengubah data!'
]);
return Redirect::to('admin/roles');
return Redirect::to('roles');
}
}

View File

@ -2,10 +2,13 @@
namespace App\Http\Controllers\Admins\Users;
use App\Helpers\ResponseFormatter;
use App\Http\Controllers\Controller;
use App\Models\User;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
@ -19,21 +22,36 @@ class UserController extends Controller
*/
public function index()
{
// call table user with pagination
$users = User::latest()->paginate(10);
return view('pages.admins.users.index', compact('users'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
// fetch data role
$roles = Role::latest()->get();
// call view users.create
return view('pages.admins.users.create', compact('roles'));
return view('pages.admin.users.index', compact('roles'));
}
public function getDataUser()
{
$users = User::with('role')->latest()->get();
return datatables()->of($users)
->addColumn('rolenya', function ($users) {
$roles = '';
foreach ($users->role as $role) {
$roles .= '<span class="badge badge-primary">' . $role->name . '</span> ';
}
return $roles;
})
->addColumn('action', function ($users) {
return '
<button class="btn btn-sm btn-warning btn-edit-user" data-user=' . $users . '><i class="fas fa-edit"></i></button>
<button class="btn btn-sm btn-danger btn-hapus-user" data-user=' . $users . '><i class="fas fa-trash"></i></button>
';
})
->addColumn('updated_atnya', function ($users) {
return tanggal_indonesia($users->updated_at) . ' ' . $users->updated_at->format('H:i:s');
})
->rawColumns(['action' => 'action', 'rolenya' => 'rolenya', 'updated_atnya' => 'updated_atnya'])
->addIndexColumn()
->make(true);
}
/**
@ -42,19 +60,30 @@ class UserController extends Controller
public function store(Request $request)
{
// validation
$rules = array(
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required|min:8'
);
$validator = Validator::make($request->all(), $rules);
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'role_id' => 'required'
], [
'name.required' => 'Nama tidak boleh kosong!',
'email.required' => 'Email tidak boleh kosong!',
'email.email' => 'Email tidak valid!',
'email.unique' => 'Email sudah terdaftar!',
'password.required' => 'Password tidak boleh kosong!',
'password.min' => 'Password minimal 8 karakter!',
'password.confirmed' => 'Password tidak sama!',
'role_id.required' => 'Role tidak boleh kosong!',
]);
// check validation
if ($validator->fails()) {
return Redirect::to('admin/users/create')
->withErrors($validator)
->withInput($request->except('password'));
} else {
return ResponseFormatter::error($validator->errors()->first());
}
try {
DB::beginTransaction();
// create new account
$user = User::create([
'name' => $request->name,
@ -63,16 +92,15 @@ class UserController extends Controller
]);
// Create role for user
$role = Role::findOrFail($request->role); // Pengunjung
$user->assignRole($role);
// Create Session message
Session::flash('users-message', [
'type' => 'success',
'msg' => 'Anda berhasil menambahkan data!'
]);
return Redirect::to('admin/users');
foreach ($request->role_id as $key => $value) {
$role = Role::findOrFail($value); // Pengunjung
$user->assignRole($role);
}
DB::commit();
return ResponseFormatter::success($user, "User berhasil ditambahkan");
} catch (\Throwable $th) {
DB::rollBack();
return ResponseFormatter::error($th->getMessage());
}
}
@ -90,11 +118,10 @@ class UserController extends Controller
public function edit(string $id)
{
// get data from user
$user = User::findOrFail($id);
$roles = Role::latest()->get();
// call view pages
return view('pages.admins.users.edit', compact('user', 'roles'));
$user = User::with('role')->findOrFail($id);
return ResponseFormatter::success([
'user' => $user
]);
}
/**
@ -103,45 +130,54 @@ class UserController extends Controller
public function update(Request $request, string $id)
{
// validation
$rules = array(
'name' => 'required|min:5',
'password' => 'required|min:8',
);
$validator = Validator::make($request->all(), $rules);
$validator = Validator::make($request->all(), [
'name_edit' => 'required',
'email_edit' => 'required|email|unique:users,email,' . $id,
'role_id_edit' => 'required'
], [
'name_edit.required' => 'Nama tidak boleh kosong!',
'email_edit.required' => 'Email tidak boleh kosong!',
'email_edit.email' => 'Email tidak valid!',
'email_edit.unique' => 'Email sudah terdaftar!',
'role_id.required' => 'Role tidak boleh kosong!',
]);
// process the login
// check validation
if ($validator->fails()) {
return Redirect::to('admin/users/edit/' . $id)
->withErrors($validator)
->withInput($request->except('password'));
} else {
return ResponseFormatter::error($validator->errors()->first());
}
try {
DB::beginTransaction();
// create new account
$user = User::findOrFail($id);
if (!$user) {
// Create Session message
Session::flash('users-message', [
'type' => 'warning',
'msg' => 'Data pengguna tidak ditemukan!'
]);
return Redirect::to('admin/users');
}
$user->update([
'name' => $request->name,
'password' => bcrypt($request->password),
'name' => $request->name_edit,
'email' => $request->email_edit,
]);
// Update role for user
$user->removeRole($user->roles[0]->name);
$user->assignRole($request->role);
// Password change
if ($request->password_edit) {
$user->update([
'password' => bcrypt($request->password_edit),
]);
}
// Create Session message
Session::flash('users-message', [
'type' => 'success',
'msg' => 'Anda berhasil mengubah data!'
]);
// Delete role for user
$user->roles()->detach();
return Redirect::to('admin/users');
// Assing role for user
foreach ($request->role_id_edit as $key => $value) {
$role = Role::findOrFail($value); // Pengunjung
$user->assignRole($role);
}
DB::commit();
return ResponseFormatter::success($user, "User berhasil diubah");
} catch (\Throwable $th) {
DB::rollBack();
return ResponseFormatter::error($th->getMessage());
}
}
@ -150,29 +186,17 @@ class UserController extends Controller
*/
public function destroy(string $id)
{
// get data from role
$role = Role::findOrFail($id);
// get data from user
$user = User::findOrFail($id);
// check role
if (!$role) {
// Create Session message
Session::flash('roles-message', [
'type' => 'warning',
'msg' => 'Data pengguna tidak ditemukan!'
]);
return Redirect::to('admin/roles');
// check user
if (!$user) {
return ResponseFormatter::error("Data pengguna tidak ditemukan!");
}
// delete role
$role->delete();
// delete user
$user->delete();
// Create Session message
Session::flash('roles-message', [
'type' => 'success',
'msg' => 'Anda berhasil menghapus data!'
]);
return Redirect::to('admin/roles');
return ResponseFormatter::success(null, "User berhasil dihapus!");
}
}

View File

@ -102,12 +102,15 @@ class AuthController extends Controller
try {
if (Auth::attempt($validator->validated(), $request->has('remember_me') ? true : false)) {
$user = auth()->user();
session()->put('id', $user->id);
session()->put('name', $user->name);
Session::flash('login-message', [
'type' => 'success',
'msg' => 'Anda berhasil melakukan Login!'
]);
return redirect()->intended('/transaksi');
return Redirect::to($this->redirectTo());
}
// Create Session message
@ -130,6 +133,23 @@ class AuthController extends Controller
}
}
public function redirectTo()
{
$role = Auth::user()->role;
switch ($role[0]->name) {
case 'Admin':
return '/dashboard';
break;
case 'Kasir':
return '/transaksi';
break;
default:
return '/transaksi';
break;
}
}
/**
* Logout and back to form login
*/

View File

@ -22,15 +22,15 @@ class History extends Controller
$filter_tanggal_2 = $request->filter_tanggal_2;
$data = Pesanan::with(['detailPesanan', 'user'])
->when($filter_tanggal_1, function ($query) use ($filter_tanggal_1) {
return $query->whereDate('created_at', '>=', $filter_tanggal_1);
return $query->whereDate('tanggal_pesanan', '>=', $filter_tanggal_1);
})
->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) {
return $query->whereDate('created_at', '<=', $filter_tanggal_2);
return $query->whereDate('tanggal_pesanan', '<=', $filter_tanggal_2);
})
->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) {
return $query->whereDate('created_at', Carbon::today());
return $query->whereDate('tanggal_pesanan', Carbon::today());
})
->orderBy('created_at', 'desc')
->orderBy('tanggal_pesanan', 'desc')
->get();
return datatables()
@ -70,7 +70,8 @@ class History extends Controller
return view('pages.Kasir.print_dapur', compact('pesanan'));
}
public function getDataDetailHistory(Request $request){
public function getDataDetailHistory(Request $request)
{
$data = DetailPesanan::with('pesanan')->where('pesanan_id', $request->id_pesanan)->get();
return response()->json(['status' => true, 'data' => $data]);

View File

@ -3,20 +3,37 @@
namespace App\Http\Controllers\Kasir;
use App\Http\Controllers\Controller;
use App\Models\KategoriProduk;
use App\Models\KelompokKategori;
use App\Models\KelompokKategoriPivot;
use App\Models\Pesanan;
use App\Models\Produk;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
class Menu extends Controller
{
public function index()
{
return view('pages.Menu.index');
// return $data = KelompokKategoriPivot::with(['kelompokKategori', 'produk'])->first();
$kategori_produks = KategoriProduk::get();
return view('pages.Menu.index', compact('kategori_produks'));
}
public function kelompokKategori($id) {
$kelompok_kategoris = KelompokKategori::where('kategori_produk_id', $id)->get();
return $kelompok_kategoris;
}
public function getDataMenu()
{
$data = Produk::with(['kategori_produk'])->get();
// $data = Produk::with(['kategori_produk'])->get();
$data = KelompokKategoriPivot::with(['kelompokKategori', 'produk'])->get();
$nomor = 1;
return $datatables = datatables()
@ -24,15 +41,117 @@ class Menu extends Controller
->addColumn('nomor', function ($data) use (&$nomor) {
return $nomor++;
})
->addColumn('kode_produk', function ($data) {
return $data->produk->kode_produk;
})
->addColumn('nama_produk', function ($data) {
return $data->produk->nama_produk;
})
->addColumn('harga_produk', function ($data) {
return $data->produk->harga_produk;
})
->addColumn('nama_kelompok_kategori', function ($data) {
return $data->kelompokKategori->nama_kelompok_kategori;
})
->addColumn('kategori_produk', function ($data) {
return $data->kategori_produk->nama_kategori_produk;
return $data->produk->kategori_produk->nama_kategori_produk;
})
->addColumn('ubah', function ($data) {
return '<div class="btn-group">
<a href="javascript:void(0)" onclick="print(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i></span></a>
<a href="javascript:void(0)" onclick="editMenu(\'' . $data->id . '\')">
<span class="btn btn-md btn-warning"><i class="fas fa-edit"></i> Edit</span>
</a>
</div>';
})
->rawColumns(['nomor', 'kode_produk', 'ubah'])
->rawColumns(['nomor', 'ubah'])
->make(true);
}
// Tambah Menu
public function store(Request $request) {
// validation
$rules = array(
'kategori_produk' => 'required',
'kelompok_produk' => 'required',
'kode_produk' => 'required',
'nama_produk' => 'required',
'harga_produk' => 'required',
'tersedia' => 'required',
'deskripsi_produk' => 'required',
);
$validator = Validator::make($request->all(), $rules);
// check validation
if ($validator->fails()) {
// If validation fails, return with errors
return response()->json(['errors' => $validator->errors()], 422);
} else {
// create product
$produk = Produk::create([
'kategori_produk_id' => $request->kategori_produk,
'kode_produk' => $request->kode_produk,
'nama_produk' => $request->nama_produk,
'harga_produk' => $request->harga_produk,
'tersedia' => $request->tersedia,
'deskripsi_produk' => $request->deskripsi_produk,
'created_at' => Carbon::now()
]);
$pivot_produk = KelompokKategoriPivot::create([
'kelompok_kategori_id' => $request->kelompok_produk,
'produk_id' => $produk->id,
'created_at' => Carbon::now()
]);
// Return a success response
return response()->json(['message' => 'Data created successfully']);
}
}
public function show($id) {
$data = KelompokKategoriPivot::with(['kelompokKategori', 'produk'])->findOrFail($id);
return response()->json($data);
}
// Ubah Menu
public function update(Request $request, $id) {
// validation
$rules = array(
'kategori_produk' => 'required',
'kelompok_produk' => 'required',
'kode_produk' => 'required',
'nama_produk' => 'required',
'harga_produk' => 'required',
'tersedia' => 'required',
'deskripsi_produk' => 'required',
);
$validator = Validator::make($request->all(), $rules);
// check validation
if ($validator->fails()) {
// If validation fails, return with errors
return response()->json(['errors' => $validator->errors()], 422);
} else {
$pivot = KelompokKategoriPivot::findOrFail($id);
$produk = Produk::find($pivot->produk_id);
// update pivot produk
$pivot->update([
'kelompok_ketegori_id' => $request->kelompok_produk,
]);
// update produk
$produk->update([
'kategori_produk_id' => $request->kategori_produk,
'kode_produk' => $request->kode_produk,
'nama_produk' => $request->nama_produk,
'harga_produk' => $request->harga_produk,
'tersedia' => $request->tersedia,
'deskripsi_produk' => $request->deskripsi_produk,
]);
// Return a success response
return response()->json(['message' => 'Data created successfully']);
}
}
}

View File

@ -118,6 +118,8 @@ class Transaksi extends Controller
'orderMenus.required' => 'Pesanan tidak boleh kosong',
]);
$user = request()->user();
try {
DB::beginTransaction();
@ -131,28 +133,50 @@ class Transaksi extends Controller
$lastCountPesanan = Pesanan::whereDate('created_at', date('Y-m-d'))->count() + 1;
// calculate nomor antrian
$nomorAntrian = $lastCountPesanan;
$pesananDatas = [
'kode_pesanan' => $request->orderCode,
'nama_pemesan' => $request->namaPemesan,
'nomor_pemesan' => $request->nomorPemesan,
'nomor_meja' => $request->nomorMeja,
'status_pesanan' => '1',
'tanggal_pesanan' => date('Y-m-d H:i:s'),
'keterangan_pesanan' => $request->keteranganPesanan ?? null,
'nomor_antrian' => $nomorAntrian,
'total_pesanan' => $orderMenusQty,
'total_bayar' => $orderMenusRupiah,
'grand_total' => $request->totalDiskon,
'nominal_bayar' => $request->nominalBayar,
'diskon_persen' => $request->diskon,
'nominal_kembali' => $request->kembali,
'status_bayar' => '1',
'user_id' => '1',
'jenis_pembayaran' => $request->jenis_pembayaran,
'coa_kas' => $request->coa_kas,
];
$pesananModels = \App\Models\Pesanan::create($pesananDatas);
if($request->jenis_pembayaran == "1"){
$pesananDatas = [
'kode_pesanan' => $request->orderCode,
'nama_pemesan' => $request->namaPemesan,
'nomor_pemesan' => $request->nomorPemesan,
'nomor_meja' => $request->nomorMeja,
'status_pesanan' => '1',
'tanggal_pesanan' => date('Y-m-d H:i:s'),
'keterangan_pesanan' => $request->keteranganPesanan ?? null,
'nomor_antrian' => $nomorAntrian,
'total_pesanan' => $orderMenusQty,
'total_bayar' => $orderMenusRupiah,
'grand_total' => $request->totalDiskon,
'nominal_bayar' => $request->nominalBayar,
'diskon_persen' => $request->diskon,
'nominal_kembali' => $request->kembali,
'status_bayar' => '1',
'user_id' => $user->id,
'jenis_pembayaran' => $request->jenis_pembayaran,
];
$pesananModels = \App\Models\Pesanan::create($pesananDatas);
}else{
$pesananDatas = [
'kode_pesanan' => $request->orderCode,
'nama_pemesan' => $request->namaPemesan,
'nomor_pemesan' => $request->nomorPemesan,
'nomor_meja' => $request->nomorMeja,
'status_pesanan' => '1',
'tanggal_pesanan' => date('Y-m-d H:i:s'),
'keterangan_pesanan' => $request->keteranganPesanan ?? null,
'nomor_antrian' => $nomorAntrian,
'total_pesanan' => $orderMenusQty,
'total_bayar' => $orderMenusRupiah,
'grand_total' => $request->totalDiskon,
'nominal_bayar' => $request->totalDiskon,
'diskon_persen' => $request->diskon,
'nominal_kembali' => 0,
'status_bayar' => '1',
'user_id' => $user->id,
'jenis_pembayaran' => $request->jenis_pembayaran,
];
$pesananModels = \App\Models\Pesanan::create($pesananDatas);
}
foreach ($request->orderMenus as $key => $value) {
// calculate produk promo untuk mengurangi stok
@ -181,12 +205,37 @@ class Transaksi extends Controller
}
// keuangan
// jika pembayaran tunai
if($request->jenis_pembayaran == "1"){
// jika pembayaran non tunai
if($request->jenis_pembayaran == "2"){
BukuBesar::create([
'faktur' => 'PJ-'.date('YmdHis'),
'tanggal' => date('Y-m-d'),
'rekening_coa_id' => $request->id_rekening_coa,
'pesanans_id' => $pesananModels->id,
'kode_rekening_coa' => $request->kode_coa,
'keterangan_coa' => $request->keterangan_coa,
'keterangan' => 'Penjualan Non Tunai['.$request->orderCode.']',
'debet' => $request->totalDiskon,
'kredit' => 0
]);
BukuBesar::create([
'faktur' => 'PJ-'.date('YmdHis'),
'tanggal' => date('Y-m-d'),
'rekening_coa_id' => "35",
'pesanans_id' => $pesananModels->id,
'kode_rekening_coa' => "4.100.01",
'keterangan_coa' => "Pendapatan Penjualan",
'keterangan' => 'Penjualan Non Tunai['.$request->orderCode.']',
'debet' => 0,
'kredit' => $request->totalDiskon
]);
// jika pembayaran tunai
}else{
BukuBesar::create([
'faktur' => 'PJ-'.date('YmdHis'),
'tanggal' => date('Y-m-d'),
'rekening_coa_id' => "2",
'pesanans_id' => $pesananModels->id,
'kode_rekening_coa' => "1.100.01",
'keterangan_coa' => "Kas Kasir",
'keterangan' => 'Penjualan Tunai['.$request->orderCode.']',
@ -197,15 +246,13 @@ class Transaksi extends Controller
'faktur' => 'PJ-'.date('YmdHis'),
'tanggal' => date('Y-m-d'),
'rekening_coa_id' => "35",
'pesanans_id' => $pesananModels->id,
'kode_rekening_coa' => "4.100.01",
'keterangan_coa' => "Pendapatan Penjualan",
'keterangan' => 'Penjualan Tunai['.$request->orderCode.']',
'debet' => 0,
'kredit' => $request->totalDiskon
]);
// jika pembayaran non tunai
}else{
}
DB::commit();

View File

@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class LaporanController extends Controller
{
public function index()
{
return view('pages.admin.laporan.index');
}
}

View File

@ -65,7 +65,7 @@ class Kernel extends HttpKernel
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'permission' => \App\Http\Middleware\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
];
}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Spatie\Permission\Exceptions\UnauthorizedException;
use Symfony\Component\HttpFoundation\Response;
class PermissionMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle($request, Closure $next, $permission = null, $guard = null)
{
$authGuard = app('auth')->guard($guard);
if ($authGuard->guest()) {
throw UnauthorizedException::notLoggedIn();
}
if (!is_null($permission)) {
$permissions = is_array($permission)
? $permission
: explode('|', $permission);
}
if (is_null($permission)) {
$permission = $request->route()->getName();
$permissions = array($permission);
}
foreach ($permissions as $permission) {
if ($authGuard->user()->can($permission)) {
return $next($request);
}
}
throw UnauthorizedException::forPermissions($permissions);
}
}

View File

@ -21,7 +21,20 @@ class RedirectIfAuthenticated
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
// return redirect(RouteServiceProvider::HOME);
$role = Auth::user()->role;
switch ($role[0]->name) {
case 'Admin':
return redirect('/dashboard');
break;
case 'Kasir':
return redirect('/transaksi');
break;
default:
return redirect('/transaksi');
break;
}
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MenuTerlarisView extends Model
{
use HasFactory;
protected $table = 'menu_terlaris_view';
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Pengeluaran extends Model
{
use HasFactory;
protected $table = 'pengeluaran';
protected $guarded = [];
public function user(){
return $this->belongsTo(User::class, 'user_id');
}
}

View File

@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
@ -43,4 +44,17 @@ class User extends Authenticatable
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $guard_name = 'web';
// role
public function role()
{
return $this->belongsToMany(Role::class, 'model_has_roles', 'model_id', 'role_id');
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Traits;
use App\Helpers\ResponseFormatter;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;
trait FailedValidation
{
/**
* Useful for auto create id with uuid when first call create function.
*
* @return void
*/
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(ResponseFormatter::error($validator->errors()->first(), 400));
}
}

View File

@ -13,6 +13,7 @@
"laravel/framework": "^10.10",
"laravel/sanctum": "^3.3",
"laravel/tinker": "^2.8",
"mpdf/mpdf": "^8.2",
"realrashid/sweet-alert": "^6.0",
"spatie/laravel-permission": "^6.3",
"yajra/laravel-datatables": "^10.1"

415
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": "c2a087156cf7cdb5fbd03918562d593c",
"content-hash": "622a1b44adad65bf17c6308f5e4f8fe0",
"packages": [
{
"name": "brick/math",
@ -2387,6 +2387,238 @@
],
"time": "2023-10-27T15:32:31+00:00"
},
{
"name": "mpdf/mpdf",
"version": "v8.2.2",
"source": {
"type": "git",
"url": "https://github.com/mpdf/mpdf.git",
"reference": "596a87b876d7793be7be060a8ac13424de120dd5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/596a87b876d7793be7be060a8ac13424de120dd5",
"reference": "596a87b876d7793be7be060a8ac13424de120dd5",
"shasum": ""
},
"require": {
"ext-gd": "*",
"ext-mbstring": "*",
"mpdf/psr-http-message-shim": "^1.0 || ^2.0",
"mpdf/psr-log-aware-trait": "^2.0 || ^3.0",
"myclabs/deep-copy": "^1.7",
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
"php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0",
"psr/http-message": "^1.0 || ^2.0",
"psr/log": "^1.0 || ^2.0 || ^3.0",
"setasign/fpdi": "^2.1"
},
"require-dev": {
"mockery/mockery": "^1.3.0",
"mpdf/qrcode": "^1.1.0",
"squizlabs/php_codesniffer": "^3.5.0",
"tracy/tracy": "~2.5",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-bcmath": "Needed for generation of some types of barcodes",
"ext-xml": "Needed mainly for SVG manipulation",
"ext-zlib": "Needed for compression of embedded resources, such as fonts"
},
"type": "library",
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"Mpdf\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-only"
],
"authors": [
{
"name": "Matěj Humpál",
"role": "Developer, maintainer"
},
{
"name": "Ian Back",
"role": "Developer (retired)"
}
],
"description": "PHP library generating PDF files from UTF-8 encoded HTML",
"homepage": "https://mpdf.github.io",
"keywords": [
"pdf",
"php",
"utf-8"
],
"support": {
"docs": "http://mpdf.github.io",
"issues": "https://github.com/mpdf/mpdf/issues",
"source": "https://github.com/mpdf/mpdf"
},
"funding": [
{
"url": "https://www.paypal.me/mpdf",
"type": "custom"
}
],
"time": "2023-11-07T13:52:14+00:00"
},
{
"name": "mpdf/psr-http-message-shim",
"version": "v2.0.1",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-http-message-shim.git",
"reference": "f25a0153d645e234f9db42e5433b16d9b113920f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f",
"reference": "f25a0153d645e234f9db42e5433b16d9b113920f",
"shasum": ""
},
"require": {
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Mpdf\\PsrHttpMessageShim\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Dorison",
"email": "mark@chromatichq.com"
},
{
"name": "Kristofer Widholm",
"email": "kristofer@chromatichq.com"
},
{
"name": "Nigel Cunningham",
"email": "nigel.cunningham@technocrat.com.au"
}
],
"description": "Shim to allow support of different psr/message versions.",
"support": {
"issues": "https://github.com/mpdf/psr-http-message-shim/issues",
"source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1"
},
"time": "2023-10-02T14:34:03+00:00"
},
{
"name": "mpdf/psr-log-aware-trait",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-log-aware-trait.git",
"reference": "a633da6065e946cc491e1c962850344bb0bf3e78"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78",
"reference": "a633da6065e946cc491e1c962850344bb0bf3e78",
"shasum": ""
},
"require": {
"psr/log": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Mpdf\\PsrLogAwareTrait\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Dorison",
"email": "mark@chromatichq.com"
},
{
"name": "Kristofer Widholm",
"email": "kristofer@chromatichq.com"
}
],
"description": "Trait to allow support of different psr/log versions.",
"support": {
"issues": "https://github.com/mpdf/psr-log-aware-trait/issues",
"source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0"
},
"time": "2023-05-03T06:19:36+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.11.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2023-03-08T13:26:56+00:00"
},
{
"name": "nesbot/carbon",
"version": "2.72.1",
@ -2879,6 +3111,56 @@
],
"time": "2024-01-09T09:30:37+00:00"
},
{
"name": "paragonie/random_compat",
"version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
"php": ">= 7"
},
"require-dev": {
"phpunit/phpunit": "4.*|5.*",
"vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com"
}
],
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
"polyfill",
"pseudorandom",
"random"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "1.29.0",
@ -3865,6 +4147,78 @@
],
"time": "2023-02-15T07:13:11+00:00"
},
{
"name": "setasign/fpdi",
"version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/Setasign/FPDI.git",
"reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad",
"reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad",
"shasum": ""
},
"require": {
"ext-zlib": "*",
"php": "^5.6 || ^7.0 || ^8.0"
},
"conflict": {
"setasign/tfpdf": "<1.31"
},
"require-dev": {
"phpunit/phpunit": "~5.7",
"setasign/fpdf": "~1.8.6",
"setasign/tfpdf": "~1.33",
"squizlabs/php_codesniffer": "^3.5",
"tecnickcom/tcpdf": "~6.2"
},
"suggest": {
"setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured."
},
"type": "library",
"autoload": {
"psr-4": {
"setasign\\Fpdi\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jan Slabon",
"email": "jan.slabon@setasign.com",
"homepage": "https://www.setasign.com"
},
{
"name": "Maximilian Kresse",
"email": "maximilian.kresse@setasign.com",
"homepage": "https://www.setasign.com"
}
],
"description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.",
"homepage": "https://www.setasign.com/fpdi",
"keywords": [
"fpdf",
"fpdi",
"pdf"
],
"support": {
"issues": "https://github.com/Setasign/FPDI/issues",
"source": "https://github.com/Setasign/FPDI/tree/v2.6.0"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/setasign/fpdi",
"type": "tidelift"
}
],
"time": "2023-12-11T16:03:32+00:00"
},
{
"name": "spatie/laravel-permission",
"version": "6.3.0",
@ -7388,65 +7742,6 @@
},
"time": "2023-12-10T02:24:34+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.11.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2023-03-08T13:26:56+00:00"
},
{
"name": "nunomaduro/collision",
"version": "v7.10.0",

View File

@ -12,7 +12,7 @@ return new class extends Migration
public function up(): void
{
Schema::table('pesanans', function (Blueprint $table) {
$table->foreignId('coa_kas')->nullable()->after('jenis_pembayaran')->references('id')->on('rekening_coa')->onUpdate('cascade')->onDelete('cascade');
$table->foreignId('coa_kas')->nullable()->after('jenis_pembayaran')->comment('kolom ini tidak terpakai')->references('id')->on('rekening_coa')->onUpdate('cascade')->onDelete('cascade');
});
}

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('buku_besar', function (Blueprint $table) {
$table->foreignId('pesanans_id')->nullable()->after('rekening_coa_id')->references('id')->on('pesanans')->onUpdate('cascade')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('buku_besar', function (Blueprint $table) {
$table->dropColumn('coa_kas');
});
}
};

View File

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('permissions', function (Blueprint $table) {
$table->string('group_name'); // For MySQL 8.0 use string('guard_name', 125);
$table->string('desc'); // For MySQL 8.0 use string('guard_name', 125);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('permissions', function (Blueprint $table) {
$table->dropColumn('group_name');
$table->dropColumn('desc');
});
}
};

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pengeluaran', function (Blueprint $table) {
$table->id();
$table->string('faktur')->nullable();
$table->date('tanggal')->nullable();
$table->integer('jenis_transaksi')->nullable()->comment('1 = Tunai, 2 = Transfer');
$table->integer('nominal')->nullable();
$table->string('keterangan')->nullable();
$table->foreignId('user_id')->nullable()->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pengeluaran');
}
};

View File

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
DB::statement('CREATE OR REPLACE VIEW menu_terlaris_view AS
SELECT
detail_pesanans.produk_id,
produks.*,
COUNT(detail_pesanans.produk_id) AS jumlah_produk_terjual
FROM
detail_pesanans
JOIN produks ON produks.id = detail_pesanans.produk_id
GROUP BY
detail_pesanans.produk_id,
produks.nama_produk
ORDER BY
jumlah_produk_terjual DESC
');
}
/**
* Reverse the migrations.
*/
public function down(): void
{
DB::statement('DROP VIEW IF EXISTS menu_terlaris_view');
}
};

View File

@ -18,8 +18,8 @@ class AddUsers extends Seeder
// Add Users
$data = User::create([
'name' => 'Admin',
'email' => 'admin@mail.id',
'password' => bcrypt('password')
'email' => 'admin@mail.com',
'password' => bcrypt('adminsaja')
]);
$permissions = Permission::pluck('id', 'id')->all();

View File

@ -20,6 +20,7 @@ class DatabaseSeeder extends Seeder
KelompokKategoriPivotSeeder::class,
// UserSeeder::class,
// KasirSeeder::class,
RekeningCoaSeeder::class
];

View File

@ -0,0 +1,22 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
class GenerateAtasSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$classes = [
RoleSeeder::class,
];
foreach ($classes as $class) $this->call($class);
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class GenerateFreshSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$classes = [
UserSeeder::class,
KasirSeeder::class,
];
foreach ($classes as $class) $this->call($class);
}
}

View File

@ -13,10 +13,8 @@ class PermissionSeeder extends Seeder
public function run(): void
{
$classes = [
// UserSeeder::class,
// KasirSeeder::class,
// AddRoles::class,
RoleSeeder::class,
GenerateAtasSeeder::class,
// GenerateFreshSeeder::class,
];
foreach ($classes as $class) $this->call($class);
}

View File

@ -17,6 +17,7 @@ class RoleSeeder extends Seeder
*/
public function run(): void
{
// admin
$role = Role::create(['name' => 'Admin']);
$permissions = Permission::pluck('id', 'id')->all();
@ -27,6 +28,7 @@ class RoleSeeder extends Seeder
$user->assignRole([$role->id]);
// kasir
$role = Role::create(['name' => 'Kasir']);
$permissions = Permission::pluck('id', 'id')->all();

View File

@ -18,9 +18,9 @@ class UserSeeder extends Seeder
$user = [
[
'name' => 'admin',
'email' => 'admin@mail.id',
'email' => 'admin@mail.com',
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'password' => bcrypt('adminsaja')
],
];

View File

@ -1,90 +1,67 @@
<!-- Navbar -->
<nav class="main-header navbar navbar-expand-lg navbar-light navbar-warning">
<div class="container" style="display: contents">
<a href="/" class="navbar-brand">
<a href="{{ route('transaksi.index') }}" class="navbar-brand">
<span class="brand-text font-weight-bold ml-2" style="color: rgba(62, 62, 62, 0.526)">Sepiring Telur
Keriting</span>
</a>
{{-- <div class="collapse navbar-collapse order-3" id="navbarCollapse">
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a href="index3.html" class="nav-link">Home</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">Contact</a>
</li>
@can('dashboard.index', auth()->user())
<li class="nav-item">
<a href="{{ route('dashboard.index') }}" class="nav-link">Dashboard</a>
</li>
@endcan
<li class="nav-item dropdown">
<a id="dropdownSubMenu1" href="#" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" class="nav-link dropdown-toggle">Dropdown</a>
<a id="dropdownSubMenu1" href="javascript:void(0)" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" class="nav-link dropdown-toggle">Transaksi</a>
<ul aria-labelledby="dropdownSubMenu1" class="dropdown-menu border-0 shadow">
<li><a href="#" class="dropdown-item">Some action </a></li>
<li><a href="#" class="dropdown-item">Some other action</a></li>
<li class="dropdown-divider"></li>
<!-- Level two dropdown-->
<li class="dropdown-submenu dropdown-hover">
<a id="dropdownSubMenu2" href="#" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false" class="dropdown-item dropdown-toggle">Hover
for action</a>
<ul aria-labelledby="dropdownSubMenu2" class="dropdown-menu border-0 shadow">
<li>
<a tabindex="-1" href="#" class="dropdown-item">level 2</a>
</li>
<!-- Level three dropdown-->
<li class="dropdown-submenu">
<a id="dropdownSubMenu3" href="#" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false"
class="dropdown-item dropdown-toggle">level 2</a>
<ul aria-labelledby="dropdownSubMenu3" class="dropdown-menu border-0 shadow">
<li><a href="#" class="dropdown-item">3rd level</a></li>
<li><a href="#" class="dropdown-item">3rd level</a></li>
</ul>
</li>
<!-- End Level three -->
<li><a href="#" class="dropdown-item">level 2</a></li>
<li><a href="#" class="dropdown-item">level 2</a></li>
</ul>
</li>
<!-- End Level two -->
<li><a href="#" class="dropdown-item">Order </a></li>
<li><a href="{{ route('pengeluaran.index') }}" class="dropdown-item">Pengeluaran</a></li>
</ul>
</li>
@canany(['users.index', 'menu.index'], auth()->user())
<li class="nav-item dropdown">
<a id="dropdownSubMenu1" href="#" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" class="nav-link dropdown-toggle">Master Data</a>
<ul aria-labelledby="dropdownSubMenu1" class="dropdown-menu border-0 shadow">
<li><a href="#" class="dropdown-item">Data Jenis Menu</a></li>
@can('menu.index', auth()->user())
<li><a href="{{ route('menu.index') }}" class="dropdown-item">Data Menu</a></li>
@endcan
@can('users.index', auth()->user())
<li class="dropdown-divider"></li>
<li><a href="{{ route('users.index') }}" class="dropdown-item">Setting User</a></li>
<li><a href="{{ route('roles.index') }}" class="dropdown-item">Setting Role</a></li>
@endcan
</ul>
</li>
@endcanany
</ul>
<!-- SEARCH FORM -->
<form class="form-inline ml-0 ml-md-3">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search"
aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
</div> --}}
</div>
<!-- Right navbar links -->
<ul class="order-1 order-md-3 navbar-nav navbar-no-expand ml-auto">
<!-- Messages Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" id="transaksi @if (Request::is('transaksi')) active @endif"
href="{{ route('transaksi.index') }}" role="button">
Transaksi
</a>
</li>
@can('transaksi.index', auth()->user())
<li class="nav-item dropdown">
<a class="nav-link" id="transaksi @if (Request::is('transaksi')) active @endif"
href="{{ route('transaksi.index') }}" role="button">
Transaksi
</a>
</li>
@endcan
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link @if (Request::is('history')) active @endif" id="history"
href="{{ route('history.index') }}" role="button">
History
</a>
</li>
@can('history.index', auth()->user())
<li class="nav-item dropdown">
<a class="nav-link @if (Request::is('history')) active @endif" id="history"
href="{{ route('history.index') }}" role="button">
History
</a>
</li>
@endcan
<li class="nav-item">
<a class="nav-link" id="full-screen" data-widget="control-sidebar" data-slide="true"
href="javascript:void(0)" role="button">
@ -93,7 +70,8 @@
</li>
<li class="nav-item dropdown">
<a id="dropdownSubMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
class="nav-link" href="#">
class="nav-link row" href="#">
{{ auth()->user()->name }}
<i class="fas fa-user"></i>
</a>
<ul aria-labelledby="dropdownSubMenu1" class="dropdown-menu border-0 shadow">

View File

@ -18,6 +18,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
<link rel="stylesheet" href="{{ asset('assets/plugins/fontawesome-free/css/fontawesome.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/fontawesome-free/css/all.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/plugins/fontawesome-free/css/solid.min.css') }}">
@stack('style2')
<!-- Theme style -->
<link rel="stylesheet" href="{{ asset('assets/dist/css/adminlte.min.css') }}">

View File

@ -36,7 +36,8 @@
<input type="date" class="form-control form-control-sm" id="filter_tanggal_2">
</div>
<div class="col-md-2">
<a href="javascript:void(0)" class="btn btn-sm btn-primary" id="btn_filter"><i class="fas fa-search mr-1"></i>Filter data</a>
<a href="javascript:void(0)" class="btn btn-sm btn-primary" id="btn_filter"><i
class="fas fa-search mr-1"></i>Filter data</a>
</div>
</div>
</div>
@ -79,4 +80,3 @@
@include('pages.History.style')
@include('pages.History.js')

View File

@ -93,10 +93,7 @@
.reduce((a, b) => intVal(a) + intVal(b), 0);
// GrandTotal over all pages
diskonTotal = api
.column(7)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Total over this page
pageTotal = api
@ -116,7 +113,6 @@
api.column(5).footer().innerHTML = totalPesanan + ' Item';
api.column(6).footer().innerHTML =
'Rp. ' + pageTotal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
api.column(7).footer().innerHTML = diskonTotal + ' %';
api.column(8).footer().innerHTML =
'Rp. ' + totalAll.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
@ -133,7 +129,8 @@
<script>
function print(id) {
var url = "{{ route('history.print', '') }}/" + id + '?print=true'
window.open(url, '_blank');
// window.open(url, '_blank');
window.open(url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
}
</script>
<script>

View File

@ -71,18 +71,21 @@
function printDapurTigaKali(id) {
var url = "{{ route('transaksi.printDapurTigaKali', '') }}/" + id + '?print=true'
window.open(url, '_blank');
// window.open(result.url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
location.reload(true);
}
function printDapurDuaKali(id) {
var url = "{{ route('transaksi.printDapurDuaKali', '') }}/" + id + '?print=true'
window.open(url, '_blank');
// window.open(result.url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
location.reload(true);
}
function printDapurSatuKali(id) {
var url = "{{ route('transaksi.printDapurSatuKali', '') }}/" + id + '?print=true'
window.open(url, '_blank');
// window.open(result.url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
location.reload(true);
}
</script>
@ -110,11 +113,11 @@
minute: 'numeric',
second: 'numeric'
};
// tampilkan pada id datetime-order
document.getElementById('datetime-order').innerHTML = utc.toLocaleDateString("id-ID", options);
}
// show time every second
setInterval(showTime, 1000);
@ -187,7 +190,7 @@
<br>
${(diskonSatuan > 0) ? '<small class="text-primary"><s>Rp. ' + (harga * qty) + '</s></small> | <small class="text-danger">Rp. ' + total + '</small>' : '<small class="text-primary">Rp. ' + totalLama + '</small>'}
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-0" placeholder="Keterangan.." value='${paketFreenyaini}'>
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-3" placeholder="Keterangan.." value='${paketFreenyaini}'>
</div>
</td>
`;
@ -198,7 +201,7 @@
<br>
${(diskonSatuan > 0) ? '<small class="text-primary"><s>Rp. ' + (harga * qty) + '</s></small> | <small class="text-danger">Rp. ' + total + '</small>' : '<small class="text-primary">Rp. ' + totalLama + '</small>'}
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-0" placeholder="Keterangan..">
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-3" placeholder="Keterangan..">
</div>
</td>
`;
@ -210,7 +213,7 @@
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat tai" onclick="decrementMenu(${globalId}, '${params.nama_produk}')"><b>-</b></button>
</span>
<input type="text" name="bayar" class="form-control rounded-0" readonly value="${qty}">
<input type="text" name="bayar" class="form-control rounded-3" readonly value="${qty}">
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="incrementMenu(${globalId}, '${params.nama_produk}')">+</button>
</span>
@ -220,7 +223,7 @@
table.rows[index].cells[2].innerHTML = `
<td class="text-center">
<div class="input-group input-group-sm">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-0" value="${diskonSatuan}" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-3" value="${diskonSatuan}" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
</div>
</td>
`;
@ -249,7 +252,7 @@
<br>
<small class="text-primary">Rp. ${params.harga_produk}</small>
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" class="form-control rounded-0" data-keterangan="${paketFreenyaini}" placeholder="Keterangan.." value="${paketFreenyaini}">
<input type="text" name="keterangan_satuan" class="form-control rounded-3" data-keterangan="${paketFreenyaini}" placeholder="Keterangan.." value="${paketFreenyaini}">
</div>
</td>
<td class="text-center">
@ -257,7 +260,7 @@
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="decrementMenu(${globalId}, '${params.nama_produk}')"><b>-</b></button>
</span>
<input type="text" name="bayar" class="form-control rounded-0" readonly value="${menuQty}">
<input type="text" name="bayar" class="form-control rounded-3" readonly value="${menuQty}">
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="incrementMenu(${globalId}, '${params.nama_produk}')">+</button>
</span>
@ -265,7 +268,7 @@
</td>
<td class="text-center">
<div class="input-group input-group-sm">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-0" value="0" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-3" value="0" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
</div>
</td>
<td class="text-center">
@ -283,7 +286,7 @@
<br>
<small class="text-primary">Rp. ${params.harga_produk}</small>
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-0" placeholder="Keterangan..">
<input type="text" name="keterangan_satuan" data-keterangan="" class="form-control rounded-3" placeholder="Keterangan..">
</div>
</td>
<td class="text-center">
@ -291,7 +294,7 @@
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="decrementMenu(${globalId}, '${params.nama_produk}')"><b>-</b></button>
</span>
<input type="text" name="bayar" class="form-control rounded-0" readonly value="${menuQty}">
<input type="text" name="bayar" class="form-control rounded-3" readonly value="${menuQty}">
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="incrementMenu(${globalId}, '${params.nama_produk}')">+</button>
</span>
@ -299,7 +302,7 @@
</td>
<td class="text-center">
<div class="input-group input-group-sm">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-0" value="0" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
<input type="number" name="diskon_satuan" oninput="inputNum(this)" class="form-control rounded-3" value="0" onkeyup="diskonSatuanMenu(${globalId}, '${params.nama_produk}', this.value)">
</div>
</td>
<td class="text-center">
@ -396,7 +399,7 @@
<br>
${(diskonSatuan > 0) ? '<small class="text-primary"><s>Rp. ' + (harga * qty) + '</s></small> | <small class="text-danger">Rp. ' + total + '</small>' : '<small class="text-primary">Rp. ' + totalLama + '</small>'}
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-0" placeholder="Keterangan..">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-3" placeholder="Keterangan..">
</div>
</td>
`;
@ -407,13 +410,12 @@
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="decrementMenu(${params}, '${nama_produk}')"><b>-</b></button>
</span>
<input type="text" name="bayar" class="form-control rounded-0" readonly value="${qty}">
<input type="text" name="bayar" class="form-control rounded-3" readonly value="${qty}">
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="incrementMenu(${params}, '${nama_produk}')">+</button>
</span>
</div>
</td>
`;
</td>`;
calculateTotal();
}
@ -435,7 +437,8 @@
var diskonSatuan = table.rows[index].getAttribute('data-diskon-satuan');
var total = table.rows[index].getAttribute('data-total');
var harga = table.rows[index].getAttribute('data-harga');
var valueKeterangan = table.rows[index].cells[0].getElementsByTagName('input')[0].getAttribute('data-keterangan');
var valueKeterangan = table.rows[index].cells[0].getElementsByTagName('input')[0].getAttribute(
'data-keterangan');
if (qty > 1) {
qty = parseInt(qty) - 1;
@ -453,7 +456,7 @@
<br>
${(diskonSatuan > 0) ? '<small class="text-primary"><s>Rp. ' + (harga * qty) + '</s></small> | <small class="text-danger">Rp. ' + total + '</small>' : '<small class="text-primary">Rp. ' + totalLama + '</small>'}
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-0" placeholder="Keterangan..">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-3" placeholder="Keterangan..">
</div>
</td>
`;
@ -464,7 +467,7 @@
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="decrementMenu(${params}, '${nama_produk}')"><b>-</b></button>
</span>
<input type="text" name="bayar" class="form-control rounded-0" readonly value="${qty}">
<input type="text" name="bayar" class="form-control rounded-3" readonly value="${qty}">
<span class="input-group-append">
<button type="button" class="btn btn-default btn-xs btn-flat" onclick="incrementMenu(${params}, '${nama_produk}')">+</button>
</span>
@ -493,7 +496,8 @@
var diskonSatuan = parseInt(diskon);
var total = table.rows[index].getAttribute('data-total');
var harga = table.rows[index].getAttribute('data-harga');
var valueKeterangan = table.rows[index].cells[0].getElementsByTagName('input')[0].getAttribute('data-keterangan');
var valueKeterangan = table.rows[index].cells[0].getElementsByTagName('input')[0].getAttribute(
'data-keterangan');
// if (diskonSatuan >= 1) {
// console.log(diskonSatuan);
@ -512,7 +516,7 @@
<br>
${(diskonSatuan >= 1) ? '<small class="text-primary"><s>Rp. ' + (harga * qty) + '</s></small> | <small class="text-danger">Rp. ' + total + '</small>' : '<small class="text-primary">Rp. ' + totalLama + '</small>'}
<div class="input-group input-group-sm mt-1">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-0" placeholder="Keterangan..">
<input type="text" name="keterangan_satuan" data-keterangan="${valueKeterangan}" value="${valueKeterangan}" class="form-control rounded-3" placeholder="Keterangan..">
</div>
</td>
`;
@ -540,6 +544,7 @@
dengan_rupiah.value = formatRupiah(this.value, 'Rp. ');
});
/* Fungsi */
function formatRupiah(angka, prefix) {
var number_string = angka.replace(/[^,\d]/g, '').toString(),
@ -595,6 +600,21 @@
})
})
// bayar uang pas
$(document).ready(function() {
$('#bayar_uang_pas').on('click', function() {
// Mengambil teks dari elemen dengan menggunakan innerText
let grandTotalText = document.getElementById('total-diskon').innerText;
// Mengisi nilai ke input dengan format Rupiah
$("#nominal-bayar").val(formatRupiah(grandTotalText, 'Rp. '));
calculatekembali();
});
});
// kirim pembayaran
$(document).ready(function() {
$('#pesan-bayar-tunai').on('click', function() {
@ -644,12 +664,6 @@
var kode_coa = split_rekening_coa_aba_penarikan[1]
var keterangan_coa = split_rekening_coa_aba_penarikan[2]
// if (rekening_coa_aba_penarikan == '') {
// alert('Pilih kas tujuan');
// document.getElementById('pesan-bayar-tunai').disabled = false;
// return false;
// }
if (orderMenus.length == 0) {
alert('Menu tidak boleh kosong');
document.getElementById('pesan-bayar-tunai').disabled = false;
@ -691,7 +705,7 @@
nominalBayar: nominalBayar,
kembali: kembaliHidden,
jenis_pembayaran: jenis_pembayaran,
coa_kas: id_rekening_coa,
id_rekening_coa: id_rekening_coa,
kode_coa: kode_coa,
keterangan_coa: keterangan_coa,
};
@ -706,6 +720,7 @@
timeOut: 2000
});
window.open(result.url, '_blank');
// window.open(result.url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
setTimeout(function() {
window.location.reload(1);
@ -719,9 +734,134 @@
}
});
})
// modal bayar non tunai
$('#pesan-bayar-nontunai').on('click', function() {
$("#modal_nontunai").modal('show')
})
// pembayaran non tunai
$('#pembayaran-nontunai').on('click', function() {
let jenis_pembayaran = "2"
// return console.log(jenis_pembayaran);
var table = document.getElementById("order-menus");
var orderMenus = [];
for (var i = 1, row; row = table.rows[i]; i++) {
var id = row.getAttribute('data-id');
var nama = row.getAttribute('data-nama');
var qty = row.getAttribute('data-qty');
var diskonSatuan = row.getAttribute('data-diskon-satuan');
var harga = row.getAttribute('data-harga');
var total = row.getAttribute('data-total');
if (diskonSatuan != 0 && diskonSatuan != null && diskonSatuan != undefined) {
total = total - (total * (diskonSatuan / 100));
} else {
total = total
}
if (id != null || qty != null || total != null) {
orderMenus.push({
id: id,
nama: nama,
qty: qty,
diskonSatuan: diskonSatuan,
harga: harga,
total: total,
keterangan: document.getElementsByName('keterangan_satuan')[i - 1].value
});
}
}
var diskon = document.getElementsByName('diskon')[0].value;
var totalDiskon = document.getElementById('total-diskon-hidden').innerHTML;
var bayar = document.getElementsByName('nominal-bayar')[0].value;
var nominalBayar = bayar.replace(/[^,\d]/g, '').toString();
var kembaliHidden = document.getElementById('kembali-hidden').innerHTML;
var namaPemesan = document.getElementsByName('nama-pemesan')[0].value;
var nomorPemesan = document.getElementsByName('nomor-pemesan')[0].value;
var nomorMeja = document.getElementsByName('nomor-meja')[0].value;
var rekening_coa_aba_penarikan = $("#rekening_coa_aba_penarikan").val()
var split_rekening_coa_aba_penarikan = rekening_coa_aba_penarikan.split("|")
var id_rekening_coa = split_rekening_coa_aba_penarikan[0]
var kode_coa = split_rekening_coa_aba_penarikan[1]
var keterangan_coa = split_rekening_coa_aba_penarikan[2]
if (rekening_coa_aba_penarikan == '') {
alert('Pilih kas tujuan');
return false;
}
if (orderMenus.length == 0) {
alert('Menu tidak boleh kosong');
document.getElementById('pesan-bayar-tunai').disabled = false;
return false;
}
// if (totalDiskon != 0) {
// if (nominalBayar == '' || nominalBayar == 0) {
// alert('Pembayaran tidak boleh kosong');
// document.getElementById('pesan-bayar-tunai').disabled = false;
// return false;
// }
// }
// if (kembaliHidden < 0) {
// alert('Pembayaran kurang');
// document.getElementById('pesan-bayar-tunai').disabled = false;
// return false;
// }
if (namaPemesan == '' || namaPemesan == null || namaPemesan == undefined) {
alert('Nama pemesan tidak boleh kosong');
document.getElementById('pesan-bayar-tunai').disabled = false;
return false;
}
if (nomorMeja == '' || nomorMeja == null || nomorMeja == undefined) {
alert('Nomor meja tidak boleh kosong');
document.getElementById('pesan-bayar-tunai').disabled = false;
return false;
}
var data = {
_token: "{{ csrf_token() }}",
orderCode: "{{ $orderCode }}",
orderMenus: orderMenus,
namaPemesan: namaPemesan,
nomorPemesan: nomorPemesan,
nomorMeja: nomorMeja,
keteranganPesanan: document.getElementsByName('keterangan-pesanan')[0].value,
diskon: diskon,
totalDiskon: totalDiskon,
nominalBayar: nominalBayar,
kembali: kembaliHidden,
jenis_pembayaran: jenis_pembayaran,
id_rekening_coa: id_rekening_coa,
kode_coa: kode_coa,
keterangan_coa: keterangan_coa,
};
$.ajax({
url: "{{ route('transaksi.store') }}",
method: "POST",
data: data,
success: function(result) {
document.getElementById('pesan-bayar-tunai').disabled = false;
toastr.success(result.message, 'Success', {
timeOut: 2000
});
window.open(result.url, '_blank');
// window.open(result.url, '_blank', "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=900,height=600");
setTimeout(function() {
window.location.reload(1);
}, 1000);
},
error: function(xhr, status, error) {
document.getElementById('pesan-bayar-tunai').disabled = false;
toastr.error(xhr.responseJSON.message, 'Error', {
timeOut: 3000
});
}
});
})
});
// select paket

View File

@ -46,7 +46,7 @@
aria-labelledby="custom-tabs-four-{{ $item->kode_kelompok_kategori }}-tab">
<div class="row">
@if ($item->kode_kelompok_kategori == 'PAK-SKOM')
<div class="col-lg-12 col-md-6 col-sm-6" style="padding: 0px">
<div class="col-lg-12 col-md-12 col-sm-12" style="padding: 0px">
<div class="row" style="padding: 0px">
<div class="col-xl-3 col-lg-4 col-md-4 col-sm-3"
style="margin-left: 0px;padding-left: 0px;">
@ -105,7 +105,7 @@
@foreach ($item->kelompokKategoriPivot as $key2 => $kelompokKategoriPivot)
@if ($kelompokKategoriPivot->produk->urutan == 1)
<div
class="col-xl-4 col-lg-6 col-md-4 col-sm-4">
class="col-xl-4 col-lg-6 col-md-12 col-sm-6">
<div onclick="selectPaket( {{ $kelompokKategoriPivot->produk }} );changeTab('vert-tabs-telur')"
class="card card-warning card-outline btn">
<div class="card-header">
@ -135,7 +135,7 @@
@foreach ($item->kelompokKategoriPivot as $key2 => $kelompokKategoriPivot)
@if ($kelompokKategoriPivot->produk->urutan == 2)
<div
class="col-xl-4 col-lg-6 col-md-4 col-sm-4">
class="col-xl-4 col-lg-6 col-md-12 col-sm-6">
<div onclick="selectPaket( {{ $kelompokKategoriPivot->produk }} );changeTab('vert-tabs-sambel')"
class="card card-warning card-outline btn">
<div class="card-header">
@ -165,7 +165,7 @@
@foreach ($item->kelompokKategoriPivot as $key2 => $kelompokKategoriPivot)
@if ($kelompokKategoriPivot->produk->urutan == 3)
<div
class="col-xl-4 col-lg-6 col-md-4 col-sm-4">
class="col-xl-4 col-lg-6 col-md-12 col-sm-6">
<div onclick="selectPaket( {{ $kelompokKategoriPivot->produk }} );changeTab('vert-tabs-topping')"
class="card card-warning card-outline btn">
<div class="card-header">
@ -195,7 +195,7 @@
@foreach ($item->kelompokKategoriPivot as $key2 => $kelompokKategoriPivot)
@if ($kelompokKategoriPivot->produk->urutan == 4)
<div
class="col-xl-4 col-lg-6 col-md-4 col-sm-4">
class="col-xl-4 col-lg-6 col-md-12 col-sm-6">
<div onclick="selectPaket( {{ $kelompokKategoriPivot->produk }} );changeTab('vert-tabs-free')"
class="card card-warning card-outline btn">
<div class="card-header">
@ -224,7 +224,7 @@
@foreach ($item->kelompokKategoriPivot as $key2 => $kelompokKategoriPivot)
@if ($kelompokKategoriPivot->produk->urutan == 5)
<div
class="col-xl-4 col-lg-6 col-md-4 col-sm-4">
class="col-xl-4 col-lg-6 col-md-12 col-sm-6">
<div onclick="selectPaket( {{ $kelompokKategoriPivot->produk }} )"
class="card card-warning card-outline btn">
<div class="card-header">
@ -337,6 +337,28 @@
@endif
@endif
@else
@if ($kelompokKategoriPivot->kelompok_kategori_id == 2)
<div class="col-xl-4 col-lg-6 col-md-6 col-sm-12">
<div class="card card-warning card-outline btn"
onclick="aadMenu( {{ $kelompokKategoriPivot->produk }} )">
<div class="card-header px-0">
<h6 class="m-0 text-sm text-bold">
{{ $kelompokKategoriPivot->produk->nama_produk ?? '' }}
</h6>
</div>
<div class="card-body px-0">
<div class="col-md-12 px-0">
<div class="col-md-12 text-sm d-flex py-2 rounded bg-secondary" style="background-color: rgb(230, 230, 230)">
<h5 class="my-auto text-bold" style="align-items: center;">
{{ convert_to_rupiah($kelompokKategoriPivot->produk->harga_produk) }}
</h5>
<a class="btn btn-warning ml-auto" id="ordered-menus"><i class="fa fa-shopping-cart"></i></a>
</div>
</div>
</div>
</div>
</div>
@else
<div class="col-xl-4 col-lg-6 col-md-6 col-sm-12">
<div class="card card-warning card-outline btn"
onclick="aadMenu( {{ $kelompokKategoriPivot->produk }} )">
@ -364,6 +386,7 @@
</div>
</div>
</div>
@endif
@endif
@endforeach
@endif
@ -387,8 +410,8 @@
</h5>
</div>
<div class="card-body">
<table class="table table-bordered table-striped" id="order-menus" width="100%">
<thead style="background-color: lightgray">
<table class="table table-bordered table-striped" id="order-menus" style="border-collapse: collapse; width: 100%; max-width: 600px; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);">
<thead style="background-color: rgb(230, 230, 230)">
<tr>
<th class="text-center">Menu</th>
<th class="text-center" width="110px">Qty</th>
@ -400,7 +423,7 @@
</thead>
<tbody id="tbody-order-menus">
</tbody>
<tfoot style="background-color: lightgray">
<tfoot style="background-color: rgb(230, 230, 230)">
<tr>
<th class="text-center">Total</th>
<th colspan="3">
@ -415,7 +438,7 @@
<th class="text-center">Diskon (%)</th>
<th colspan="3">
<div class="input-group input-group-sm">
<input type="number" name="diskon" class="form-control rounded-0">
<input type="number" name="diskon" class="form-control rounded-3">
</div>
</th>
</tr>
@ -433,7 +456,7 @@
<th class="text-center">Bayar</th>
<th colspan="3">
<div class="input-group input-group-sm">
<input type="text" name="nominal-bayar" class="form-control rounded-0"
<input type="text" name="nominal-bayar" class="form-control rounded-3"
required id="nominal-bayar">
</div>
</th>
@ -448,20 +471,25 @@
</span>
</th>
</tr>
<tr>
<th colspan="4" class="text-center">
<button class="btn btn-outline-primary col-sm-12 col-md-12 col-lg-12" id="bayar_uang_pas">Uang Pas</button>
</th>
</tr>
<tr>
<th colspan="4">
<span class="row">
<input type="text" name="nama-pemesan"
class="form-control rounded-0 col-lg-6" placeholder="Nama Pemesan"
class="form-control rounded-3 col-lg-6" placeholder="Nama Pemesan"
id="nama-pemesan" required>
<input type="text" name="nomor-pemesan"
class="form-control rounded-0 col-lg-6" placeholder="Nomor Pemesan"
class="form-control rounded-3 col-lg-6" placeholder="Nomor Pemesan"
id="nomor-pemesan" oninput="inputNum(this)" required>
<input type="number" min="1" name="nomor-meja"
class="form-control rounded-0" placeholder="Nomor Meja" id="nomor-meja"
class="form-control rounded-3 mt-1" placeholder="Nomor Meja" id="nomor-meja"
required>
<input type="text" name="keterangan-pesanan"
placeholder="Keterangan Pesanan" class="form-control rounded-0"
placeholder="Keterangan Pesanan" class="form-control rounded-3 mt-1"
id="keterangan-pesanan">
</span>
</th>
@ -469,9 +497,9 @@
<tr style="background-color: white">
<th colspan="4">
<div class="btn-group btn-block">
<button class="btn btn-warning btn-block col-sm-10 col-md-10 col-lg-10"
<button class="btn btn-warning btn-block col-sm-8 col-md-8 col-lg-8"
id="pesan-bayar-tunai">Bayar</button>
<button type="button" class="btn btn-success" id="nonTunaiSaja">
<button type="button" class="btn btn-success" id="pesan-bayar-nontunai">
Non Tunai
</button>
</div>

View File

@ -1,22 +1,22 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Kasir <small>kasir 3.0</small></h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Kasir</a></li>
<li class="breadcrumb-item active">History</li>
</ol>
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h3 class="m-0"> Master Data</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Menus</li>
</ol>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('content')
@ -88,15 +88,15 @@
@endsection
@push('styles')
<!-- Toastr -->
<style>
@media only screen and (max-width : 991px) {
/* Styles */
}
<!-- Toastr -->
<style>
@media only screen and (max-width : 991px) {
/* Styles */
}
@media only screen and (max-width : 768px) {
/* Styles */
}
@media only screen and (max-width : 768px) {
/* Styles */
}
@media only screen and (max-width : 414px) {
/* Styles */
@ -145,4 +145,4 @@
})
})
</script>
@endpush
@endpush

View File

@ -0,0 +1,365 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Dashboard</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item active">Dashboard</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="row">
<div class="col-md-12">
<div class="card" id="calculationPendapatan">
<div class="card-header">
<h5 class="card-title">Laporan Pendapatan dan Pengeluaran</h5>
</div>
<!-- /.card-header -->
<!-- ./card-body -->
<div class="card-footer">
<div class="row">
<div class="col-sm-3 col-6">
<div class="description-block border-right">
<span class="description-percentage" id="penjualanHaripercentageOfSalesGrowth">
</span>
<h5 class="description-header" id="penjualanHari"></h5>
<span class="description-text">Pendapatan Hari ini</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-6">
<div class="description-block border-right">
<span class="description-percentage" id="pengeluaranHaripercentageOfSalesGrowth">
</span>
<h5 class="description-header" id="pengeluaranHari"></h5>
<span class="description-text">Pengeluaran Hari ini</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-6">
<div class="description-block border-right">
<span class="description-percentage" id="penjualanBulanpercentageOfSalesGrowth">
</span>
<h5 class="description-header" id="penjualanBulan"></h5>
<span class="description-text">Pendapatan Bulan ini</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-6">
<div class="description-block">
<span class="description-percentage" id="pengeluaranBulanpercentageOfSalesGrowth">
</span>
<h5 class="description-header" id="pengeluaranBulan"></h5>
<span class="description-text">Pengeluaran Bulan ini</span>
</div>
<!-- /.description-block -->
</div>
</div>
<!-- /.row -->
</div>
<!-- /.card-footer -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
<!-- Main content -->
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-lg-6">
<div class="card">
<div class="card-header border-0">
<h3 class="card-title">Menu Terlaris</h3>
<div class="card-tools">
<a href="#" class="btn btn-tool btn-sm">
<i class="fas fa-download"></i>
</a>
<a href="#" class="btn btn-tool btn-sm">
<i class="fas fa-bars"></i>
</a>
</div>
</div>
<div class="card-body table-responsive p-0">
<table class="table table-striped table-valign-middle" id="table-terlaris">
<thead>
<tr>
<th>No</th>
<th>Menu</th>
<th>Harga</th>
<th>Terjual</th>
</tr>
</thead>
</table>
</div>
</div>
<!-- /.card -->
</div>
<!-- /.col-md-6 -->
<div class="col-lg-6">
<!-- /.card -->
<div class="card">
<div class="card-header border-0">
<div class="d-flex justify-content-between">
<h3 class="card-title">Penjualan</h3>
<a href="javascript:void(0);">View Report</a>
</div>
</div>
<div class="card-body">
<div class="d-flex">
<p class="d-flex flex-column">
<span class="text-bold text-lg" id="penjualanSepanjangWaktu"></span>
<span>Penjualan Keseluruhan</span>
</p>
<p class="ml-auto d-flex flex-column text-right">
<span class="text-success" id="persentaseSepanjangWaktu">
<i class="fas fa-arrow-up"></i> 33.1%
</span>
<span class="text-muted">dari bulan lalu</span>
</p>
</div>
<!-- /.d-flex -->
<div class="position-relative mb-4">
<canvas id="sales-chart" height="200"></canvas>
</div>
<div class="d-flex flex-row justify-content-end">
<span class="mr-2">
<i class="fas fa-square text-primary"></i> Bulan ini
</span>
<span>
<i class="fas fa-square text-gray"></i> Bulan Kemarin
</span>
</div>
</div>
</div>
</div>
<!-- /.col-md-6 -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
</div>
<!-- /.content -->
@endsection
@push('styles')
<link rel="stylesheet" href="{{ asset('assets/datatables/datatables.min.css') }} ">
@endpush
@push('scripts')
<script src="{{ asset('assets/datatables/datatables.min.js') }}"></script>
<!-- ChartJS -->
<script src="{{ asset('assets/plugins/chart.js/Chart.min.js') }}"></script>
<script type="text/javascript">
$(function() {
'use strict'
var ticksStyle = {
fontColor: '#495057',
fontStyle: 'bold'
}
var mode = 'index'
var intersect = true
$.ajax({
url: "{{ route('dashboard.getChart') }}",
type: "GET",
cache: false,
async: false,
success: function(response) {
var data = response.data;
console.log(data);
$('#penjualanSepanjangWaktu').append(converRp(data.allPenjualan));
var $salesChart = $('#sales-chart')
var salesChart = new Chart($salesChart, {
type: 'bar',
data: {
labels: Object.keys(data.weekThisMonth),
datasets: [{
backgroundColor: '#007bff',
borderColor: '#007bff',
data: Object.values(data.weekThisMonth)
},
{
backgroundColor: '#ced4da',
borderColor: '#ced4da',
data: Object.values(data.weekLastMonth)
}
]
},
options: {
maintainAspectRatio: false,
tooltips: {
mode: mode,
intersect: intersect
},
hover: {
mode: mode,
intersect: intersect
},
legend: {
display: false
},
scales: {
yAxes: [{
// display: false,
gridLines: {
display: true,
lineWidth: '4px',
color: 'rgba(0, 0, 0, .2)',
zeroLineColor: 'transparent'
},
ticks: $.extend({
beginAtZero: true,
// Include a dollar sign in the ticks
callback: function(value, index,
values) {
return converRp(value)
}
}, ticksStyle)
}],
xAxes: [{
display: true,
gridLines: {
display: false
},
ticks: ticksStyle
}]
}
}
})
},
error: function(response) {
console.log(response);
}
})
})
$(document).ready(function() {
$('#table-terlaris').DataTable({
processing: true,
serverSide: true,
searching: false,
"bLengthChange": false,
"bFilter": true,
"bInfo": false,
ajax: "{{ route('dashboard.menuTerlaris') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
className: 'text-center'
},
{
data: 'nama_produk',
name: 'nama_produk'
},
{
data: 'harga_produk',
name: 'harga_produk',
'render': function(data, type, full, meta) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
},
className: 'text-right'
},
{
data: 'jumlah_produk_terjual',
name: 'jumlah_produk_terjual'
}
]
})
})
$(document).ready(function() {
getCalculationPendapatan();
})
function getCalculationPendapatan() {
$.ajax({
url: "{{ route('dashboard.getCalculationPendapatan') }}",
type: "GET",
cache: false,
async: false,
success: function(response) {
var data = response.data;
changeDataFromCalculate('penjualanBulan', data.pendapatanBulan
.penjualanSatuBulan, data.pendapatanBulan.percentageOfSalesGrowth,
data.pendapatanBulan.statusCalculation)
changeDataFromCalculate('penjualanHari', data.pendapatanHari
.penjualanHariIni, data.pendapatanHari.percentageOfSalesGrowth,
data.pendapatanHari.statusCalculation)
changeDataFromCalculate('pengeluaranBulan', data.pengeluaranBulan
.pengeluaranSatuBulan, data.pengeluaranBulan.percentageOfSalesGrowth,
data.pengeluaranBulan.statusCalculation)
changeDataFromCalculate('pengeluaranHari', data.pengeluaranHari
.pengeluaranHariIni, data.pengeluaranHari.percentageOfSalesGrowth,
data.pengeluaranHari.statusCalculation)
},
error: function(response) {
console.log(response);
}
})
}
function changeDataFromCalculate(id, penjualanSatuBulan, percentageOfSalesGrowth, statusCalculation) {
// change to IDR
if (penjualanSatuBulan == null) {
penjualanSatuBulan = 0;
} else {
penjualanSatuBulan;
}
$('#' + id).append(converRp(penjualanSatuBulan));
// pembulatan 2 angka di belakang koma
percentageOfSalesGrowth = percentageOfSalesGrowth.toFixed(2);
switch (statusCalculation) {
case 1:
$('#' + id + 'percentageOfSalesGrowth').append('<i class="fas fa-caret-left"></i> ' +
percentageOfSalesGrowth + '%')
$('#' + id + 'percentageOfSalesGrowth').addClass('text-warning')
break;
case 2:
$('#' + id + 'percentageOfSalesGrowth').append('<i class="fas fa-caret-up"></i> ' +
percentageOfSalesGrowth + '%')
$('#' + id + 'percentageOfSalesGrowth').addClass('text-success')
break;
case 3:
$('#' + id + 'percentageOfSalesGrowth').append('<i class="fas fa-caret-down"></i> ' +
percentageOfSalesGrowth + '%')
$('#' + id + 'percentageOfSalesGrowth').addClass('text-danger')
break;
default:
$('#' + id + 'percentageOfSalesGrowth').append('<i class="fas fa-caret-left"></i> ' +
percentageOfSalesGrowth + '%')
$('#' + id + 'percentageOfSalesGrowth').addClass('text-warning')
break;
}
}
function converRp(params) {
return ('Rp. ' + params.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.') ?? 0);
}
</script>
@endpush

View File

@ -0,0 +1,33 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Laporan</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Laporan</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="col-12 mt-2">
<div class="container" style="display: contents">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-body">
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,165 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0"> Pengeluaran</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item">Home</li>
<li class="breadcrumb-item">Transaksi</li>
<li class="breadcrumb-item active">Pengeluaran</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="content__boxed">
<div class="content__wrap">
<div class="row">
<div class="col-sm-12 mt-2">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-body">
<div class="col-md-12">
<div class="row">
<div class="col-md-12">
<h5>Form Input Data</h5>
</div>
<div class="col-md-6 mt-3">
<label>Tanggal</label>
<input type="date" class="form-control" id="tanggal"
value="{{ date('Y-m-d') }}">
</div>
<div class="col-md-6 mt-3">
<label>Jenis Transaksi</label>
<select class="form-control" id="jenis_transaksi">
<option value="" selected>--Pilih Jenis Transkasi--</option>
<option value="1">Tunai</option>
<option value="2">Transfer</option>
</select>
</div>
<div class="col-md-6 mt-3">
<label>Rekening Coa Kebutuhan</label>
<select class="form-control" id="rekening_coa_kebutuhan">
<option value="" selected>--Pilih Rekening Coa--</option>
@foreach ($coaBiaya as $biaya)
@if ($biaya->status == 0)
<optgroup label="{{ $biaya->coa }} | {{ $biaya->keterangan_coa }}">
@else
<option
value="{{ $biaya->id }}|{{ $biaya->coa }}|{{ $biaya->keterangan_coa }}">
{{ $biaya->coa }} | {{ $biaya->keterangan_coa }}</option>
@endif
@endforeach
</select>
</div>
<div class="col-md-6 mt-3">
<label>Nominal</label>
<input type="number" min="0" class="form-control" id="nominal"
placeholder="Nominal Pengeluaran">
</div>
<div class="col-md-6 mt-3">
<label>Keterangan</label>
<textarea class="form-control" id="keterangan" placeholder="Keterangan"></textarea>
</div>
<div hidden class="transfer col-6 mt-3">
<label class="form-label">Rekening Coa Jenis Transaksi</label>
<select class="form-control" id="rekening_coa_transfer">
<option selected disabled>--Pilih Rekening Coa--</option>
@foreach ($rekeningCoaTf as $coaTf)
@if ($coaTf->status == 0)
<optgroup label="{{ $coaTf->coa }} | {{ $coaTf->keterangan_coa }}">
@else
<option
value="{{ $biaya->id }}|{{ $coaTf->coa }}|{{ $coaTf->keterangan_coa }}">
{{ $coaTf->coa }} | {{ $coaTf->keterangan_coa }}</option>
@endif
@endforeach
</select>
</div>
</div>
<hr>
<a href="javascript:void(0)" class="btn btn-warning" id="simpan_pengeluaran">Simpan Data</a>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 mt-2">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-body">
<div class="col-md-12">
<form action="{{ route('pengeluaran.laporan') }}" method="POST">
@csrf
<div class="row">
<div class="col-md-12">
<h5>Form Laporan</h5>
</div>
<div class="col-md-4 mt-3">
<label>Dari Tanggal</label>
<input type="date" class="form-control" name="filter_tanggal_1"
id="filter_tanggal_1" value="{{ date('Y-m-d') }}">
</div>
<div class="col-md-4 mt-3">
<label>Sampai Tanggal</label>
<input type="date" class="form-control" name="filter_tanggal_2"
id="filter_tanggal_2" value="{{ date('Y-m-d') }}">
</div>
<div class="col-md-4 mt-5">
<div class="row">
<a href="javascript:void(0)" class="btn btn-sm btn-primary"
id="btn_filter"><i class="fas fa-search mr-1"></i>Filter
data</a>
<button class="btn btn-sm btn-warning" type="submit" id="filter_laporan"><i
class="fas fa-print mr-1"></i>Cetak</button>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-12">
<div class="table-responsive mt-3">
<table id="tabelku" class="table table-hover display" style="width: 100%">
<thead>
<tr>
<th class="text-center">No</th>
<th>Faktur</th>
<th>Kebutuhan</th>
<th>Jenis Transaksi</th>
<th>Jenis Transaksi</th>
<th>Tanggal Transaksi</th>
<th>User</th>
<th>Nominal</th>
<th class="text-center"><i class="fas fa-cog"></i></th>
</tr>
</thead>
<tfoot>
<tr>
<th class="text-right"></th>
<th class="text-right"></th>
<th class="text-right" colspan="4">Total</th>
<th class="text-right"></th>
<th class="text-center"><i class="fas fa-cog"></i></th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@include('pages.admin.pengeluaran.js')

View File

@ -0,0 +1,191 @@
@push('scripts')
<script src="{{ asset('assets/datatables/datatables.min.js') }}"></script>
<script src="{{ asset('assets/plugins/toastr/toastr.min.js') }}"></script>
<script>
$(document).ready(function() {
let dataTable = $('#tabelku').DataTable({
aLengthMenu: [
[25, 50, 100, 200, -1],
[25, 50, 100, 200, "All"]
],
processing: true,
serverSide: true,
ajax: {
url: '{{ route('pengeluaran.getDataPengeluaran') }}',
data: function(d) {
d.filter_tanggal_1 = $("#filter_tanggal_1").val();
d.filter_tanggal_2 = $("#filter_tanggal_2").val();
}
},
columns: [{
data: 'nomor',
name: 'nomor',
orderable: false,
className: 'text-center'
},
{
data: 'faktur',
name: 'faktur'
},
{
data: 'keterangan',
name: 'keterangan'
},
{
data: 'jenis_trasaksi',
name: 'jenis_trasaksi',
className: 'text-center',
render: function(data) {
if (data == 1) {
return "Tunai"
} else {
return "Transfer"
}
}
},
{
data: 'tanggal',
name: 'tanggal'
},
{
data: 'user.name',
name: 'user.name'
},
{
data: 'nominal',
name: 'nominal',
className: 'text-right',
render: function(data) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
},
{
data: 'ubah',
name: 'ubah',
className: 'text-center'
},
],
footerCallback: function(row, data, start, end, display) {
let api = this.api();
// Remove the formatting to get integer data for summation
let intVal = function(i) {
return typeof i === 'string' ?
i.replace(/[\$,]/g, '') * 1 :
typeof i === 'number' ?
i :
0;
};
// GrandTotal over all pages
totalAll = api
.column(6)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Update footer
api.column(6).footer().innerHTML =
'Rp. ' + totalAll.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
})
$('#btn_filter').on('click', function() {
if ($("#filter_tanggal_1").val() == "" || $("#filter_tanggal_2").val() == "") {
alert("Input pencarian tidak boleh kosong")
} else {
dataTable.ajax.reload();
}
});
})
</script>
<script>
$(document).ready(function() {
$('#jenis_transaksi').on('change', function() {
if ($("#jenis_transaksi").val() == "1") {
$(".transfer").prop('hidden', true)
} else if ($("#jenis_transaksi").val() == "2") {
$(".transfer").prop('hidden', false)
} else {
$(".transfer").prop('hidden', true)
}
})
})
</script>
<script>
$(document).ready(function() {
$('#simpan_pengeluaran').on('click', function() {
// Jika jenis transaksi tunai
if ($("#jenis_transaksi").val() == "1") {
let rekening_coa_kebutuhan = $("#rekening_coa_kebutuhan").val()
let split_rekening_coa_kebutuhan = rekening_coa_kebutuhan.split("|")
let id_rekening_coa = split_rekening_coa_kebutuhan[0]
let kode_coa = split_rekening_coa_kebutuhan[1]
let keterangan_coa = split_rekening_coa_kebutuhan[2]
let dataTunai = {
tanggal: $("#tanggal").val(),
jenis_transaksi: $("#jenis_transaksi").val(),
nominal: $("#nominal").val(),
keterangan: $("#keterangan").val(),
id_rekening_coa: id_rekening_coa,
kode_coa: kode_coa,
keterangan_coa: keterangan_coa,
}
// return console.log(dataTunai);
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: "POST",
url: "{{ route('pengeluaran.simpan') }}",
data: dataTunai,
success: function(result) {
if (result) {
alert(result.message)
location.reload()
}
}
})
} else {
let rekening_coa_kebutuhan = $("#rekening_coa_kebutuhan").val()
let split_rekening_coa_kebutuhan = rekening_coa_kebutuhan.split("|")
let id_rekening_coa = split_rekening_coa_kebutuhan[0]
let kode_coa = split_rekening_coa_kebutuhan[1]
let keterangan_coa = split_rekening_coa_kebutuhan[2]
let rekening_coa_transfer = $("#rekening_coa_transfer").val()
let split_rekening_coa_transfer = rekening_coa_transfer.split("|")
let id_rekening_coa_transfer = split_rekening_coa_transfer[0]
let kode_coa_transfer = split_rekening_coa_transfer[1]
let keterangan_coa_transfer = split_rekening_coa_transfer[2]
let dataTranfer = {
tanggal: $("#tanggal").val(),
jenis_transaksi: $("#jenis_transaksi").val(),
nominal: $("#nominal").val(),
keterangan: $("#keterangan").val(),
id_rekening_coa: id_rekening_coa,
kode_coa: kode_coa,
keterangan_coa: keterangan_coa,
id_rekening_coa_transfer: id_rekening_coa_transfer,
kode_coa_transfer: kode_coa_transfer,
keterangan_coa_transfer: keterangan_coa_transfer,
}
// return console.log(dataTranfer);
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: "POST",
url: "{{ route('pengeluaran.simpan') }}",
data: dataTranfer,
success: function(result) {
if (result) {
alert(result.message)
location.reload()
}
}
})
}
})
})
</script>
@endpush

View File

@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Laporan Pengeluaran</title>
</head>
<body>
<table style="width: 100%;">
<tr>
<td>Tanggal Unduh: {{ date('d-m-Y H:i:s') }}</td>
</tr>
<tr>
<td>Dicetak Oleh: {{ Session::get('name') }}</td>
</tr>
</table>
<hr>
<table style="width: 100%;">
<tr>
<td style="text-align: center; font-size: 20px; font-weight: bold;">Laporan Pengeluaran</td>
</tr>
<tr>
<td style="text-align: center;">Pencarian: {{ 'Antara Tanggal '.toDmy($filter_tanggal_1).' s/d Tanggal '.toDmy($filter_tanggal_2).'' }}</td>
</tr>
</table>
<br>
<table style="width: 100%; border-collapse:collapse; border:1px solid black;">
<thead style="border-collapse:collapse; border:1px solid black;">
<tr style="border-collapse:collapse; border:1px solid black;">
<th style="border-collapse:collapse; border:1px solid black;">No</th>
<th style="border-collapse:collapse; border:1px solid black;">Faktur</th>
<th style="border-collapse:collapse; border:1px solid black;">Tanggal</th>
<th style="border-collapse:collapse; border:1px solid black;">Jenis Transaksi</th>
<th style="border-collapse:collapse; border:1px solid black;">Nominal</th>
<th style="border-collapse:collapse; border:1px solid black;">Keterangan</th>
<th style="border-collapse:collapse; border:1px solid black;">User</th>
</tr>
</thead>
<tbody style="border-collapse:collapse; border:1px solid black;">
@foreach ($data as $key => $val)
<tr>
<td style="text-align: center; border-collapse:collapse; border:1px solid black;">{{ $key+1 }}</td>
<td style="border-collapse:collapse; border:1px solid black;">{{ $val->faktur }}</td>
<td style="text-align:center; border-collapse:collapse; border:1px solid black;">{{ toDmy($val->tanggal) }}</td>
<td style="text-align:center; border-collapse:collapse; border:1px solid black;">{{ $val->jenis_transaksi == "1" ? "Tunai" : "Transfer" }}</td>
<td style="text-align: left; border-collapse:collapse; border:1px solid black;">Rp {{ format_uang($val->nominal) }}</td>
<td style="border-collapse:collapse; border:1px solid black;">{{ $val->keterangan }}</td>
<td style="text-align:center; border-collapse:collapse; border:1px solid black;">{{ $val->user->name }}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>

View File

@ -0,0 +1,132 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h3 class="m-0"> Master Data</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Tambah Roles</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="col-lg-12 col-md-12 col-sm-12 mt-2">
<div class="container" style="display: contents">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-header mt-0 pt-0">
<div class="d-flex">
<h4>Tambah Role</h4>
<!-- Button trigger modal -->
<div class="ml-auto">
<button type="button" class="btn btn-warning" href="{{ route('roles.refresh-routes') }}">
Refresh Role
</button>
</div>
</div>
</div>
<div class="card-body border-top">
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ route('roles.store') }}" id="formCreate">
@method('post')
@csrf
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 mt-2">
<div class="form-group">
<strong>Name:</strong>
<input type="text" class="form-control" placeholder="Role Name" name="name">
</div>
</div>
<span>
<h5 for="permissions" class="form-label mt-3 mb-3">Assign Permissions
</h5>
<h6 for="permissions" class="form-label mt-3 mb-3">Check All Permission
<input type="checkbox" name="all_permission" class="check" id="allpermission">
</h6>
</span>
<div class="row">
@foreach ($permissions as $key => $permission)
<div class="col-md-4">
<h5>{{ $key }}</h5>
<table class="table table-hover table-bordered">
<tr id="checkboxnya" style="background: grey !important">
<td scope="col" width="1%" style="background: grey !important">
<input type="checkbox" name="all_permission" class="check"
id="allpermission">
</td>
<td scope="col" width="20%" style="background: grey !important">
Name</td>
<td scope="col" width="1%" style="background: grey !important">
Route</td>
<td scope="col" width="1%" style="background: grey !important">
Guard</td>
</tr>
@foreach ($permission as $item)
<tr>
<td>
<input type="checkbox" name="permission[{{ $item->name }}]"
value="{{ $item->name }}" class='permission'>
</td>
<td>{{ $item->desc }}</td>
<td>{{ $item->name }}</td>
<td>{{ $item->guard_name }}</td>
</tr>
@endforeach
</table>
</div>
@endforeach
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-end mt-3">
<a href="{{ route('roles.index') }}" class="btn btn-info">Batalkan</a>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
@push('scripts')
<script>
$('input[type="checkbox"].check').on('change', function() {
var check = this;
$(check).closest('tr').nextUntil('tr[id]').find('input[type="checkbox"]').prop(
'checked',
check
.checked);
});
$(document).ready(function() {
$('#allpermission').click(function() {
if ($(this).is(':checked')) {
$('.check').prop('checked', true);
$('.permission').prop('checked', true);
} else {
$('.check').prop('checked', false);
$('.permission').prop('checked', false);
}
});
});
</script>
@endpush

View File

@ -0,0 +1,136 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h3 class="m-0"> Master Data</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Edit Roles</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="col-lg-12 col-md-12 col-sm-12 mt-2">
<div class="container" style="display: contents">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-header mt-0 pt-0">
<div class="d-flex">
<h4>Edit Role</h4>
<!-- Button trigger modal -->
<div class="ml-auto">
<button type="button" class="btn btn-warning" href="{{ route('roles.refresh-routes') }}">
Refresh Role
</button>
</div>
</div>
</div>
<div class="card-body border-top">
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ route('roles.update', $role->id) }}" id="formCreate">
@method('PUT')
@csrf
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 mt-2">
<div class="form-group">
<strong>Name:</strong>
<input type="text" class="form-control" placeholder="Role Name" name="name"
value="{{ $role->name }}">
</div>
</div>
<span>
<h5 for="permissions" class="form-label mt-3 mb-3">Assign Permissions
</h5>
<h6 for="permissions" class="form-label mt-3 mb-3">Check All Permission
<input type="checkbox" name="all_permission" class="check" id="allpermission">
</h6>
</span>
<div class="row">
@foreach ($permissions as $key => $permission)
<div class="col-md-4">
<h5>{{ $key }}</h5>
<table class="table table-hover table-bordered">
<tr id="checkboxnya" style="background: grey !important">
<td scope="col" width="1%" style="background: grey !important">
<input type="checkbox" name="all_permission" class="check"
id="allpermission">
</td>
<td scope="col" width="20%" style="background: grey !important">
Name</td>
<td scope="col" width="1%" style="background: grey !important">
Route</td>
<td scope="col" width="1%" style="background: grey !important">
Guard</td>
</tr>
@foreach ($permission as $item)
<tr>
<td>
<input type="checkbox" name="permission[{{ $item->name }}]"
value="{{ $item->name }}" value="{{ $item->name }}"
class='permission'
{{ in_array($item->name, $rolePermissions) ? 'checked' : '' }}>
</td>
<td>{{ $item->desc }}</td>
<td>{{ $item->name }}</td>
<td>{{ $item->guard_name }}</td>
</tr>
@endforeach
</table>
</div>
@endforeach
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-end mt-3">
<a href="{{ route('roles.index') }}" class="btn btn-info">Batalkan</a>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
@push('scripts')
<script>
$('input[type="checkbox"].check').on('change', function() {
var check = this;
$(check).closest('tr').nextUntil('tr[id]').find('input[type="checkbox"]').prop(
'checked',
check
.checked);
});
$(document).ready(function() {
$('#allpermission').click(function() {
if ($(this).is(':checked')) {
$('.check').prop('checked', true);
$('.permission').prop('checked', true);
} else {
$('.check').prop('checked', false);
$('.permission').prop('checked', false);
}
});
});
</script>
@endpush

View File

@ -0,0 +1,98 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h3 class="m-0"> Master Data</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Roles</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="col-lg-12 col-md-12 col-sm-12 mt-2">
<div class="container" style="display: contents">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-header mt-0 pt-0">
<div class="d-flex">
<h4>Daftar Role</h4>
<!-- Button trigger modal -->
<div class="ml-auto">
<a href="{{ route('roles.create') }}" class="btn btn-sm btn-primary"><i class="ti ti-edit"></i>
Tambah Role</a>
</div>
</div>
</div>
<div class="card-body">
<div class="table-responsive mt-3">
<table id="tabelku" class="table table-hover display" style="width: 100%">
<thead>
<tr>
<th class="text-center">No</th>
<th>Nama Role</th>
<th>Terakhir Diupdate</th>
<th class="text-center"><i class="fas fa-cog"></i></th>
</tr>
</thead>
<tbody>
@forelse ($datas as $role)
<tr>
<td class="border-bottom-0">
<h6 class="fw-normal mb-0 text-center">
{{ ($datas->currentPage() - 1) * $datas->perPage() + $loop->index + 1 }}.
</h6>
</td>
<td class="border-bottom-0">
<h6 class="fw-semibold mb-1">{{ $role->name }}</h6>
<span class="fw-normal">{{ $role->email }}</span>
</td>
<td class="border-bottom-0">
<h6 class="fw-normal mb-0 fs-4">{{ $role->updated_at }}</h6>
</td>
<td class="border-bottom-0 text-center">
<div class="d-flex align-items-center gap-2 text-center"
style="justify-content: center">
<a href="{{ route('roles.edit', $role->id) }}"
class="btn btn-sm btn-warning"><i class="ti ti-edit"></i> Ubah</a>
</div>
</td>
</tr>
@empty
<div class="alert alert-danger">
Data Belum Tersedia.
</div>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection
@push('styles')
<!-- Toastr -->
<link rel="stylesheet" href="{{ asset('assets/plugins/toastr/toastr.min.css') }}">
@endpush
@push('scripts')
<!-- Toastr -->
<script src="{{ asset('assets/plugins/toastr/toastr.min.js') }}"></script>
<script>
// show toast
@if (Session::has('roles-message'))
toastr.{{ Session::get('roles-message.type') }}("{{ Session::get('roles-message.msg') }}")
@endif
</script>
@endpush

View File

@ -0,0 +1,74 @@
@extends('layouts.app')
@section('content')
<!-- Button Back -->
<a href="{{ URL::to('admin/users') }}" class="mb-3 badge text-bg-light text-primary">
<i class="ti ti-arrow-left">&nbsp;</i> Kembali
</a>
<div class="row d-flex align-items-strech">
<div class="col-lg-6 mx-auto">
<div class="card">
<div class="card-header">
<h3>Edit Pengguna</h3>
</div>
<div class="card-body border-top">
<form method="post" action="{{ route('users.update', $user->id) }}">
@csrf
@method('PUT')
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" id="name" name="name"
placeholder="Contoh: Ardito Pratama" value="{{ isset($user->name) ? $user->name : '' }}"
required>
<div id="emailHelp" class="form-text">Silahkan masukkan nama lengkap anda.</div>
<!-- error message-->
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email"
value="{{ isset($user->email) ? $user->email : '' }}" disabled>
</div>
<div class="mb-3">
<label for="role" class="form-label">Level Pengguna</label>
<select class="form-select @error('role') is-invalid @enderror" id="role" name="role"
required>
<option value="">Pilih Level Pengguna</option>
@forelse ($roles as $role)
<option value="{{ $role->name }}"
{{ $user->roles[0]->name == $role->name ? 'selected' : '' }}>{{ $role->name }}
</option>
@empty
<option value="">Data Kosong</option>
@endforelse
</select>
<!-- error message -->
@error('role')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control @error('password') is-invalid @enderror"
id="password" name="password">
<!-- error message -->
@error('password')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
</form>
</div>
</div>
</div>
</div>
@stop

View File

@ -0,0 +1,73 @@
@extends('layouts.app')
@section('title', 'Buat Data Pengguna')
@section('content')
<!-- Button Back -->
<a href="{{ URL::to('admin/users') }}" class="mb-3 badge text-bg-light text-primary">
<i class="ti ti-arrow-left">&nbsp;</i> Kembali
</a>
<div class="row d-flex align-items-strech">
<div class="col-lg-6 mx-auto">
<div class="card">
<div class="card-header">
<h3>Tambah Pengguna</h3>
</div>
<div class="card-body border-top">
<form method="post" action="{{ route('users.index') }}">
@csrf
@method('POST')
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Contoh: Ardito Pratama" value="{{ old('name') }} " required>
<div id="emailHelp" class="form-text">Silahkan masukkan nama lengkap anda.</div>
<!-- error message-->
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" required>
<!-- error message -->
@error('email')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="role" class="form-label">Level Pengguna</label>
<select class="form-select @error('role') is-invalid @enderror" id="role" name="role" required>
<option value="" selected>Pilih Level Pengguna</option>
@forelse ($roles as $role)
<option value="{{ $role->id }}">{{ $role->name }}</option>
@empty
<option value="">Data Kosong</option>
@endforelse
</select>
<!-- error message -->
@error('role')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control @error('password') is-invalid @enderror" id="password" name="password" required>
<!-- error message -->
@error('password')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
</form>
</div>
</div>
</div>
</div>
@stop

View File

@ -0,0 +1,68 @@
@extends('layouts.app')
@section('title', 'Ubah Data Pengguna')
@section('content')
<!-- Button Back -->
<a href="{{ URL::to('admin/users') }}" class="mb-3 badge text-bg-light text-primary">
<i class="ti ti-arrow-left">&nbsp;</i> Kembali
</a>
<div class="row d-flex align-items-strech">
<div class="col-lg-6 mx-auto">
<div class="card">
<div class="card-header">
<h3>Edit Pengguna</h3>
</div>
<div class="card-body border-top">
<form method="post" action="{{ route('users.update', $user->id) }}">
@csrf
@method('PUT')
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Contoh: Ardito Pratama" value="{{ isset($user->name) ? $user->name : '' }}" required>
<div id="emailHelp" class="form-text">Silahkan masukkan nama lengkap anda.</div>
<!-- error message-->
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" value="{{ isset($user->email) ? $user->email : '' }}" disabled>
</div>
<div class="mb-3">
<label for="role" class="form-label">Level Pengguna</label>
<select class="form-select @error('role') is-invalid @enderror" id="role" name="role" required>
<option value="">Pilih Level Pengguna</option>
@forelse ($roles as $role)
<option value="{{ $role->name }}" {{ $user->roles[0]->name == $role->name ? 'selected' : '' }}>{{ $role->name }}
</option>
@empty
<option value="">Data Kosong</option>
@endforelse
</select>
<!-- error message -->
@error('role')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control @error('password') is-invalid @enderror" id="password" name="password">
<!-- error message -->
@error('password')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
</form>
</div>
</div>
</div>
</div>
@stop

View File

@ -0,0 +1,388 @@
@extends('layouts.base')
@section('content-header')
<div class="col-12">
<div class="container" style="display: contents">
<div class="row mb-2">
<div class="col-sm-6">
<h3 class="m-0"> Master Data</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item"><a href="#">Admin</a></li>
<li class="breadcrumb-item active">Users</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('content')
<div class="col-lg-12 col-md-12 col-sm-12 mt-2">
<div class="container" style="display: contents">
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-header mt-0 pt-0">
<div class="d-flex">
<h4>Daftar User</h4>
<!-- Button trigger modal -->
<div class="ml-auto">
<button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#modal-default-add">
Tambah User
</button>
</div>
</div>
</div>
<div class="card-body">
{{-- <h5 class="card-title">Form List Data</h5> --}}
<div class="table-responsive mt-3">
<table id="tabelku" class="table table-hover display" style="width: 100%">
<thead>
<tr>
<th class="text-center">No</th>
<th>Nama User</th>
<th>Email User</th>
<th>Role</th>
<th>Terakhir Diupdate</th>
<th class="text-center"><i class="fas fa-cog"></i></th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Modal Tambah Menu -->
<div class="modal fade" id="modal-default-add">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Tambah User</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form id="form-tambah-user" method="post" enctype="multipart/form-data">
@csrf
<div class="form-group">
<label for="user-name" class="col-form-label">Nama User:</label>
<input type="text" class="form-control" id="user-name" name="name" required>
</div>
<div class="form-group">
<label for="user-email" class="col-form-label">Email User:</label>
<input type="text" class="form-control" id="user-email" name="email" required>
</div>
<div class="form-group">
<label for="password-input" class="col-form-label">Password User:</label>
<input type="text" class="form-control" id="password-input" name="password" required>
</div>
<div class="form-group">
<label for="konfirmasi-password-input" class="col-form-label">Konfirmasi Password User:</label>
<input type="text" class="form-control" id="konfirmasi-password-input"
name="password_confirmation" required>
</div>
<div class="form-group">
<label for="role-text" class="col-form-label">Role:</label>
<div class="form-group select2-primary">
<select class="select2" multiple="multiple" data-placeholder="Pilih role user" required
name="role_id[]" style="width: 100%;">
@foreach ($roles as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
</select>
</div>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-default" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary" id="simpan-form-tambah">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal-default-edit">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Edit User</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form id="form-edit-user" method="put" enctype="multipart/form-data">
@csrf
<div class="form-group">
<label for="user-name-edit" class="col-form-label">Nama User:</label>
<input type="text" class="form-control" id="user-name_edit" name="name_edit" required>
</div>
<div class="form-group">
<label for="user-email_edit" class="col-form-label">Email User:</label>
<input type="text" class="form-control" id="user-email_edit" name="email_edit" required>
</div>
<div class="form-group">
<label for="password-input_edit" class="col-form-label">Password User:</label>
<input type="text" class="form-control" id="password-input_edit" name="password_edit"
placeholder="Kosongkan jika tidak ingin mengubah password">
</div>
<div class="form-group" id="password_confirm_edit" style="display: none">
<label for="konfirmasi-password-input_edit" class="col-form-label">Konfirmasi Password
User:</label>
<input type="text" class="form-control" id="konfirmasi-password-input_edit"
placeholder="Kosongkan jika tidak ingin mengubah password"
name="password_confirmation_edit">
</div>
<div class="form-group">
<label for="role-text" class="col-form-label">Role:</label>
<div class="form-group select2-primary">
<select class="edit_select2" multiple="multiple" data-placeholder="Pilih role user"
required name="role_id_edit[]" style="width: 100%;">
@foreach ($roles as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
</select>
</div>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-default" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary" id="simpan-form-tambah">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal-default-hapus">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Hapus User</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p id="title-terhapus">&hellip;</p>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-default" data-dismiss="modal">Batal</button>
<button type="button" class="btn btn-danger button-hapus">Hapus</button>
</div>
</div>
</div>
</div>
@endsection
@push('styles')
<!-- Toastr -->
<link rel="stylesheet" href="{{ asset('assets/plugins/toastr/toastr.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/datatables/datatables.min.css') }}">
<!-- Select2 -->
<link rel="stylesheet" href="{{ asset('assets/plugins/select2/css/select2.min.css') }}">
@endpush
@push('scripts')
<!-- Toastr -->
<script src="{{ asset('assets/plugins/toastr/toastr.min.js') }}"></script>
<!-- Select2 -->
<script src="{{ asset('assets/plugins/select2/js/select2.full.min.js') }}"></script>
<script src="{{ asset('assets/datatables/datatables.min.js') }}"></script>
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
});
// check password dan konfirmasi password
$('#konfirmasi-password-input').on('keyup', function() {
if ($('#password-input').val() == $('#konfirmasi-password-input').val()) {
$('#konfirmasi-password-input').removeClass('is-invalid')
$('#konfirmasi-password-input').addClass('is-valid')
} else {
$('#konfirmasi-password-input').removeClass('is-valid')
$('#konfirmasi-password-input').addClass('is-invalid')
}
})
//Initialize Select2 Elements
$('.select2').select2({
dropdownParent: $("#modal-default-add")
})
$('.edit_select2').select2({
dropdownParent: $("#modal-default-edit")
})
$(document).ready(function() {
$('#tabelku').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('users.getDataUser') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
className: 'text-center'
},
{
data: 'name',
name: 'name'
},
{
data: 'email',
name: 'email'
},
{
data: 'rolenya',
name: 'rolenya'
},
{
data: 'updated_atnya',
name: 'updated_atnya',
className: 'text-center'
},
{
data: 'action',
name: 'action',
className: 'text-center'
},
]
})
})
// handle password edit user keyup
$('#password-input_edit').on('keyup', function() {
if ($('#password-input_edit').val() != '') {
$('#password_confirm_edit').show()
if ($('#password-input_edit').val() == $('#konfirmasi-password-input_edit').val()) {
$('#konfirmasi-password-input_edit').removeClass('is-invalid')
$('#konfirmasi-password-input_edit').addClass('is-valid')
} else {
$('#konfirmasi-password-input_edit').removeClass('is-valid')
$('#konfirmasi-password-input_edit').addClass('is-invalid')
}
} else {
$('#password_confirm_edit').hide()
}
})
$('#konfirmasi-password-input_edit').on('keyup', function() {
if ($('#password-input_edit').val() == $('#konfirmasi-password-input_edit').val()) {
$('#konfirmasi-password-input_edit').removeClass('is-invalid')
$('#konfirmasi-password-input_edit').addClass('is-valid')
} else {
$('#konfirmasi-password-input_edit').removeClass('is-valid')
$('#konfirmasi-password-input_edit').addClass('is-invalid')
}
})
$(document).ready(function() {
// ajax tambah user
$('#form-tambah-user').on('submit', function(e) {
e.preventDefault();
$.ajax({
url: "{{ route('users.store') }}",
type: "POST",
dataType: "json",
data: $(this).serialize(),
cache: false,
async: false,
success: function(response) {
toastr.success(response.meta.message)
$('#modal-default-add').modal('hide')
$('#form-tambah-user')[0].reset()
$('.select2').val(null).trigger('change')
$('#konfirmasi-password-input').removeClass('is-valid')
$('#tabelku').DataTable().ajax.reload()
},
error: function(response) {
toastr.error(response.responseJSON.meta.message)
}
})
})
// ajax edit user
$(document).on('click', '.btn-edit-user', function() {
var data = JSON.parse($(this).attr('data-user'));
$('#user-name_edit').val(data.name)
$('#user-email_edit').val(data.email)
$('.edit_select2').val(data.role.map(x => x.id)).trigger('change')
$('#modal-default-edit').modal('show')
$('#form-edit-user').on('submit', function(e) {
// disable button submit
$('#simpan-form-tambah').attr('disabled', true)
e.preventDefault();
$.ajax({
url: "{{ url('users/update') }}" + '/' + data.id,
type: "PUT",
dataType: "json",
data: $(this).serialize(),
cache: false,
async: false,
success: function(response) {
// enable button submit on interval 1 detik
setTimeout(function() {
$('#simpan-form-tambah').attr('disabled', false)
}, 500);
toastr.success(response.meta.message)
$('#modal-default-edit').modal('hide')
$('#form-edit-user')[0].reset()
$('.edit_select2').val(null).trigger('change')
$('#konfirmasi-password-input_edit').removeClass('is-valid')
$('#tabelku').DataTable().ajax.reload()
},
error: function(response) {
// enable button submit on interval 1 detik
setTimeout(function() {
$('#simpan-form-tambah').attr('disabled', false)
}, 500);
toastr.error(response.responseJSON.meta.message)
}
})
})
})
// ajax hapus user
$(document).on('click', '.btn-hapus-user', function() {
var data = JSON.parse($(this).attr('data-user'));
var dataAppend = '<p>Apakah anda yakin ingin menghapus user <b>' + data.name +
'</b> email <b>' +
data.email + '</b> ?</p>';
$('#title-terhapus').html(dataAppend);
$('.button-hapus').attr('data-id', data.id);
$('#modal-default-hapus').modal('show');
})
$(document).on('click', '.button-hapus', function() {
var id = $(this).attr('data-id');
$.ajax({
url: "{{ url('users/delete') }}" + '/' + id,
type: "DELETE",
dataType: "json",
cache: false,
async: false,
success: function(response) {
toastr.success(response.meta.message)
$('#modal-default-hapus').modal('hide')
$('#tabelku').DataTable().ajax.reload()
},
error: function(response) {
toastr.error(response.responseJSON.meta.message)
}
})
})
})
</script>
@endpush

View File

@ -1,9 +1,14 @@
<?php
use App\Http\Controllers\Admins\DashboardController;
use App\Http\Controllers\Admins\Pengeluaran\PengeluaranController;
use App\Http\Controllers\Admins\Users\RoleController;
use App\Http\Controllers\Admins\Users\UserController;
use App\Http\Controllers\Auths\AuthController;
use App\Http\Controllers\Kasir\History;
use App\Http\Controllers\Kasir\Menu;
use App\Http\Controllers\Kasir\Transaksi;
use App\Http\Controllers\LaporanController;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Route;
@ -27,7 +32,7 @@ Route::group(['middleware' => 'guest'], function () {
Route::post('login', [AuthController::class, 'login_proses'])->name('login.process')->comment("Login Action");
});
Route::group(['middleware' => ['auth']], function () {
Route::group(['middleware' => ['auth', 'permission']], function () {
// Logout
Route::get('logout', [AuthController::class, 'logout'])->name('logout')->comment("Logout Action");
@ -51,7 +56,52 @@ Route::group(['middleware' => ['auth']], function () {
});
Route::group(['prefix' => 'menu'], function () {
Route::get('/', [Menu::class, 'index'])->name('menu.index')->comment("Halaman Menu");
Route::resource('menu', Menu::class);
// Route::get('/', [Menu::class, 'index'])->name('menu.index')->comment("Halaman Menu");
Route::get('/kelompok-kategori/{id}', [Menu::class, 'kelompokKategori'])->name('menu.kelompok-kategori')->comment("Ambil Data Kelompok Kategori");
Route::get('/getDataMenu', [Menu::class, 'getDataMenu'])->name('menu.getDataMenu')->comment("Ambil data Menu");
});
// Dashboard
Route::group(['prefix' => 'dashboard'], function () {
Route::get('/', [DashboardController::class, 'index'])->name('dashboard.index')->comment('Halaman Dashboard');
Route::get('/menuTerlaris', [DashboardController::class, 'menuTerlaris'])->name('dashboard.menuTerlaris')->comment("Ambil data Menu Terlaris");
Route::get('/getCalculationPendapatan', [DashboardController::class, 'getCalculationPendapatan'])->name('dashboard.getCalculationPendapatan')->comment("Ambil data Total Penjualan");
Route::get('/getChart', [DashboardController::class, 'getChart'])->name('dashboard.getChart')->comment("Ambil data Total Penjualan");
});
// Profile
// Route::get('profile', [ProfileController::class, 'index'])->name('profile.index')->comment('Halaman Profile');
// Route::post('profile', [ProfileController::class, 'update'])->name('profile.update')->comment('Update Profile');
// Users
Route::group(['prefix' => 'users'], function () {
Route::get('/', [UserController::class, 'index'])->name('users.index')->comment('Halaman User');
Route::get('/getDataUser', [UserController::class, 'getDataUser'])->name('users.getDataUser')->comment('Ambil data User');
Route::get('/create', [UserController::class, 'create'])->name('users.create')->comment('Halaman Tambah User');
Route::post('/', [UserController::class, 'store'])->name('users.store')->comment('Tambah User');
Route::get('/{id}/edit', [UserController::class, 'edit'])->name('users.edit')->comment('Halaman Edit User');
Route::put('/update/{id}', [UserController::class, 'update'])->name('users.update')->comment('Perbarui User');
Route::delete('/delete/{id}', [UserController::class, 'destroy'])->name('users.delete')->comment('Menghapus User');
});
// Roles
Route::group(['prefix' => 'roles'], function () {
Route::get('/', [RoleController::class, 'index'])->name('roles.index')->comment('Halaman Roles');
Route::get('/create', [RoleController::class, 'create'])->name('roles.create')->comment('Halaman Tambah Roles');
Route::post('/', [RoleController::class, 'store'])->name('roles.store')->comment('Tambah Roles');
Route::get('/edit/{id}', [RoleController::class, 'edit'])->name('roles.edit')->comment('Halaman Edit Roles');
Route::put('/update/{id}', [RoleController::class, 'update'])->name('roles.update')->comment('Perbarui Roles');
Route::delete('/delete/{id}', [RoleController::class, 'destroy'])->name('roles.delete')->comment('Menghapus Roles');
Route::get('/refresh-routes', [RoleController::class, 'refreshRoutes'])->name('roles.refresh-routes')->comment('Refresh Permission Routes');
});
// Pengeluaran
Route::group(['prefix' => 'pengeluaran'], function () {
Route::get('/', [PengeluaranController::class, 'index'])->name('pengeluaran.index')->comment('Halaman Pengeluaran');
Route::post('/simpan', [PengeluaranController::class, 'simpan'])->name('pengeluaran.simpan')->comment('Halaman Simpan Pengeluaran');
Route::post('/laporan', [PengeluaranController::class, 'laporan'])->name('pengeluaran.laporan')->comment('Halaman Laporan');
Route::get('/getDatapengeluaran', [PengeluaranController::class, 'getDatapengeluaran'])->name('pengeluaran.getDataPengeluaran')->comment("Ambil data Riwayat Transaksi");
});
});