diff --git a/app/Console/Commands/CreateRoutePermissionCommand.php b/app/Console/Commands/CreateRoutePermissionCommand.php new file mode 100644 index 0000000..7274239 --- /dev/null +++ b/app/Console/Commands/CreateRoutePermissionCommand.php @@ -0,0 +1,51 @@ +getRoutesByName(); + // dd($routes); + foreach ($routes as $route) { + if ($route->getName() != '' && count($route->getAction()['middleware']) >= 2) { + $permission = Permission::where('name', $route->getName())->first(); + + $data = $route->getName(); + [$first_group] = explode('.', $data); + $comment = $route->getComment(); + if (is_null($comment)) { + $comment = Str::title(str_replace('.', ' ', $route->getName())); + } + if (is_null($permission)) { + permission::create(['name' => $data, 'group_name' => $first_group, 'desc' => $comment]); + } + } + } + + $this->info('Permission routes added successfully.'); + } +} diff --git a/app/Helpers/RouteCommandDescriptor.php b/app/Helpers/RouteCommandDescriptor.php new file mode 100644 index 0000000..11b0c52 --- /dev/null +++ b/app/Helpers/RouteCommandDescriptor.php @@ -0,0 +1,25 @@ +_comment = $params; + }); + } + if (!Route::hasMacro('getComment')) { + Route::macro('getComment', function () { + if (!property_exists($this, '_comment')) + return null; + return $this->_comment; + }); + } + } +} diff --git a/app/Http/Controllers/Admins/Users/RoleController.php b/app/Http/Controllers/Admins/Users/RoleController.php new file mode 100644 index 0000000..cd3eeeb --- /dev/null +++ b/app/Http/Controllers/Admins/Users/RoleController.php @@ -0,0 +1,162 @@ +uac = $uac; + } + /** + * Display a listing of the resource. + */ + public function index() + { + // call table user with pagination + $datas = Role::latest()->paginate(10); + + return view('pages.admins.roles.index', compact('datas')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $permissions = Permission::all()->groupBy('group_name'); + return view('pages.admins.roles.create', compact('permissions')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // validation + $rules = array( + 'name' => 'required', + 'email' => 'required|email', + 'password' => 'required|min:8' + ); + $validator = Validator::make($request->all(), $rules); + + // check validation + if ($validator->fails()) { + return Redirect::to('admin/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); + + // Create Session message + Session::flash('roles-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil menambahkan data!' + ]); + + return Redirect::to('admin/roles'); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // get data from user + $role = Role::findOrFail($id); + $rolePermissions = $role->permissions()->pluck('name')->toArray(); + $permissions = Permission::get()->groupBy('group_name'); + + // call view pages + return view('pages.admins.roles.edit', compact('role', 'permissions', 'rolePermissions')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // validation + $rules = array( + 'name' => 'required|min:5', + 'permission' => 'required|min:8', + ); + $validator = Validator::make($request->all(), $rules); + + // process the login + if ($validator->fails()) { + return Redirect::to('admin/roles/edit/' . $id) + ->withErrors($validator) + ->withInput(); + } else { + // create new account + $role = Role::findOrFail($id); + $role->update($request->only('name')); + + $role->syncPermissions($request->get('permission')); + // Create Session message + Session::flash('roles-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil mengubah data!' + ]); + + return Redirect::to('admin/roles'); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } + + public function refreshRoutes() + { + try { + $result = $this->uac->generate(); + + if ($result['status' == 'success']) { + return back()->with('success', $result['message']); + } else { + return back()->with('error', $result['message']); + } + } catch (\Throwable $th) { + //throw $th; + } + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/Admins/Users/UserAccessController.php b/app/Http/Controllers/Admins/Users/UserAccessController.php new file mode 100644 index 0000000..eca40df --- /dev/null +++ b/app/Http/Controllers/Admins/Users/UserAccessController.php @@ -0,0 +1,50 @@ +getRoutesByName(); + + foreach ($routes as $route) { + if ($route->getName() != '' && count($route->getAction()['middleware']) >= 2) { + $permission = Permission::where('name', $route->getName())->first(); + + $data = $route->getName(); + [$first_group] = explode('.', $data); + $comment = $route->getComment(); + if (is_null($comment)) { + $comment = Str::title(str_replace('.', ' ', $route->getName())); + } + if (is_null($permission)) { + + permission::create(['name' => $data, 'group_name' => $first_group, 'desc' => $comment]); + } + } + } + + return [ + 'status' => 'success', + 'message' => 'Permission routes refreshed' + ]; + } catch (\Throwable $th) { + return [ + 'status' => 'error', + 'message' => $th->getMessage() + ]; + } + } +} diff --git a/app/Http/Controllers/Admins/Users/UserController.php b/app/Http/Controllers/Admins/Users/UserController.php new file mode 100644 index 0000000..dcfbad0 --- /dev/null +++ b/app/Http/Controllers/Admins/Users/UserController.php @@ -0,0 +1,178 @@ +paginate(10); + + return view('pages.admins.users.index', compact('users')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $roles = Role::latest()->get(); + + // call view users.create + return view('pages.admins.users.create', compact('roles')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // validation + $rules = array( + 'name' => 'required', + 'email' => 'required|email', + 'password' => 'required|min:8' + ); + $validator = Validator::make($request->all(), $rules); + + // check validation + if ($validator->fails()) { + return Redirect::to('admin/users/create') + ->withErrors($validator) + ->withInput($request->except('password')); + } else { + // create new account + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => bcrypt($request->password), + ]); + + // 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'); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + 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')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // validation + $rules = array( + 'name' => 'required|min:5', + 'password' => 'required|min:8', + ); + $validator = Validator::make($request->all(), $rules); + + // process the login + if ($validator->fails()) { + return Redirect::to('admin/users/edit/' . $id) + ->withErrors($validator) + ->withInput($request->except('password')); + } else { + // 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), + ]); + + // Update role for user + $user->removeRole($user->roles[0]->name); + $user->assignRole($request->role); + + // Create Session message + Session::flash('users-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil mengubah data!' + ]); + + return Redirect::to('admin/users'); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // get data from role + $role = Role::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'); + } + + // delete role + $role->delete(); + + // Create Session message + Session::flash('roles-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil menghapus data!' + ]); + + return Redirect::to('admin/roles'); + } +} diff --git a/app/Http/Controllers/Auths/AuthController.php b/app/Http/Controllers/Auths/AuthController.php new file mode 100644 index 0000000..4474129 --- /dev/null +++ b/app/Http/Controllers/Auths/AuthController.php @@ -0,0 +1,142 @@ + 'required|email', + 'password' => 'required' + ); + $validator = Validator::make($request->all(), $rules); + + // process the login + if ($validator->fails()) { + return Redirect::to('login') + ->withErrors($validator) + ->withInput($request->except('password')); + } else { + try { + $user = User::where('email', $request->email)->first(); + + if (Hash::check($request->password, $user->password)) { + // Set Auth + Auth::login($user); + + // Create Session message + Session::flash('login-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil melakukan Login!' + ]); + + // redirect + return Redirect::to('/transaksi'); + } else { + // Create Session message + Session::flash('message', [ + 'type' => 'warning', + 'msg' => 'Username atau password anda salah!' + ]); + + // redirect + return Redirect::to('login')->withInput($request->except('password')); + } + } catch (Exception $e) { + // Create Session message + Session::flash('message', [ + 'type' => 'warning', + 'msg' => 'Username atau password anda salah!' + ]); + + // redirect + return Redirect::to('login')->withInput($request->except('password')); + } + } + } + + public function login_proses(Request $request) + { + $validator = Validator::make( + $request->all(), + [ + 'email' => ['required', 'string', 'email', 'exists:users,email'], + 'password' => ['required', 'string'], + ], + ['email.exists' => 'Akun anda belum terdaftar'] + ); + $errors = $validator->errors(); + $emailErrorMessage = $errors->first('email'); + + if ($validator->fails()) { + // dd($validator->errors()); + Session::flash('message', [ + 'type' => 'warning', + 'msg' => $emailErrorMessage + ]); + return Redirect::to('login')->withInput($request->except('password')); + } + + try { + if (Auth::attempt($validator->validated(), $request->has('remember_me') ? true : false)) { + Session::flash('login-message', [ + 'type' => 'success', + 'msg' => 'Anda berhasil melakukan Login!' + ]); + + return redirect()->intended('/transaksi'); + } + + // Create Session message + Session::flash('message', [ + 'type' => 'warning', + 'msg' => 'Username atau password anda salah!' + ]); + + // redirect + return Redirect::to('login')->withInput($request->except('password')); + } catch (\Exception $e) { + // Create Session message + Session::flash('message', [ + 'type' => 'warning', + 'msg' => 'Terjadi Kesalahan!' + ]); + + // redirect + return Redirect::to('login')->withInput($request->except('password')); + } + } + + /** + * Logout and back to form login + */ + public function logout() + { + // logout and clear data Auth + Auth::logout(); + return Redirect::to('login'); + } +} diff --git a/app/Http/Controllers/Kasir/History.php b/app/Http/Controllers/Kasir/History.php index 5cd4045..f673b86 100644 --- a/app/Http/Controllers/Kasir/History.php +++ b/app/Http/Controllers/Kasir/History.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Kasir; use App\Http\Controllers\Controller; use App\Models\DetailPesanan; use App\Models\Pesanan; +use Carbon\Carbon; use Illuminate\Http\Request; class History extends Controller @@ -14,27 +15,48 @@ class History extends Controller return view('pages.History.index'); } - public function getDataHistory() + public function getDataHistory(Request $request) { - $data = Pesanan::with(['detailPesanan', 'user'])->orderBy('created_at', 'desc')->get(); $nomor = 1; + $filter_tanggal_1 = $request->filter_tanggal_1; + $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); + }) + ->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) { + return $query->whereDate('created_at', '<=', $filter_tanggal_2); + }) + ->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) { + return $query->whereDate('created_at', Carbon::today()); + }) + ->orderBy('created_at', 'desc') + ->get(); - return $datatables = datatables() + return datatables() ->of($data) ->addColumn('nomor', function ($data) use (&$nomor) { return $nomor++; }) - ->addColumn('nama_user', function ($data) { - return $data->user->name; + ->addColumn('nama_pemesan', function ($data) { + $nomor = $data->nomor_pemesan != null ? '(' . $data->nomor_pemesan . ')' : ''; + return $data->nama_pemesan . ' ' . $nomor; + }) + ->addColumn('nomor_meja', function ($data) { + return $data->nomor_meja != null ? $data->nomor_meja : '-'; }) ->addColumn('created_at', function ($data) { return \Carbon\Carbon::parse($data->created_at)->format('d F Y H:i:s'); }) - ->addColumn('grand_total', function ($data) { + ->addColumn('total_bayar_rp', function ($data) { + return 'Rp ' . number_format($data->total_bayar, 0, ',', '.'); + }) + ->addColumn('grand_total_rp', function ($data) { return 'Rp ' . number_format($data->grand_total, 0, ',', '.'); }) ->addColumn('ubah', function ($data) { return '
'; }) ->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah']) @@ -47,4 +69,10 @@ class History extends Controller return view('pages.Kasir.print_dapur', compact('pesanan')); } + + public function getDataDetailHistory(Request $request){ + $data = DetailPesanan::with('pesanan')->where('pesanan_id', $request->id_pesanan)->get(); + + return response()->json(['status' => true, 'data' => $data]); + } } diff --git a/app/Http/Controllers/Kasir/Transaksi.php b/app/Http/Controllers/Kasir/Transaksi.php index 601e684..29d8a68 100644 --- a/app/Http/Controllers/Kasir/Transaksi.php +++ b/app/Http/Controllers/Kasir/Transaksi.php @@ -21,7 +21,7 @@ class Transaksi extends Controller public function index() { - $orderCode = "ORD -" . strtoupper(random_str(6, random_str())); + $orderCode = "ORD-" . strtoupper(random_str(6, random_str())); $KelompokKategori = KelompokKategori::with('kelompokKategoriPivot.produk')->get(); // dd($KelompokKategori); @@ -77,7 +77,7 @@ class Transaksi extends Controller return view('pages.Kasir.print_dapur_3x', compact('pesanan')); } - + public function printDapurDuaKali($id) { $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id); @@ -102,6 +102,7 @@ class Transaksi extends Controller public function store(Request $request) { + $request->validate([ 'orderCode' => 'required', 'namaPemesan' => 'required', @@ -123,6 +124,10 @@ class Transaksi extends Controller $orderMenusQty += $value['qty']; $orderMenusRupiah += $value['total']; } + // $ get last count pesanan by date now and add 1 for next count pesanan today + $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, @@ -131,6 +136,7 @@ class Transaksi extends Controller '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, diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 494c050..6bd7139 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -40,7 +40,7 @@ class Kernel extends HttpKernel 'api' => [ // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\ThrottleRequests::class . ':api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; @@ -64,5 +64,8 @@ class Kernel extends HttpKernel 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'role' => \Spatie\Permission\Middleware\RoleMiddleware::class, + 'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class, + 'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class, ]; } diff --git a/app/Models/Pesanan.php b/app/Models/Pesanan.php index c6a7199..f0b16e0 100644 --- a/app/Models/Pesanan.php +++ b/app/Models/Pesanan.php @@ -21,6 +21,7 @@ class Pesanan extends Model 'tanggal_pesanan', 'nomor_meja', 'keterangan_pesanan', + 'nomor_antrian', 'total_pesanan', 'total_bayar', 'grand_total', diff --git a/app/Models/User.php b/app/Models/User.php index 4d7f70f..0ee52f6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,10 +7,11 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; +use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { - use HasApiTokens, HasFactory, Notifiable; + use HasApiTokens, HasFactory, Notifiable, HasRoles; /** * The attributes that are mass assignable. diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..30a21bb 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,8 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use App\Helpers\RouteCommentDescriptor; +use Illuminate\Support\Facades\Blade; class AppServiceProvider extends ServiceProvider { @@ -11,7 +13,7 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + RouteCommentDescriptor::register(); } /** @@ -19,6 +21,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + // add fucntion on blade + Blade::if('role', function ($name) { + return auth()->check() && auth()->user()->hasRole($name); + }); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 1cf5f15..0a88a64 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider * * @var string */ - public const HOME = '/home'; + public const HOME = '/transaksi'; /** * Define your route model bindings, pattern filters, and other route configuration. diff --git a/composer.json b/composer.json index 37344e6..d06ead0 100644 --- a/composer.json +++ b/composer.json @@ -13,9 +13,9 @@ "laravel/framework": "^10.10", "laravel/sanctum": "^3.3", "laravel/tinker": "^2.8", - "yajra/laravel-datatables": "^10.1", - "spatie/laravel-permission": "^5.9", - "realrashid/sweet-alert": "^6.0" + "realrashid/sweet-alert": "^6.0", + "spatie/laravel-permission": "^6.3", + "yajra/laravel-datatables": "^10.1" }, "require-dev": { "fakerphp/faker": "^1.9.1", @@ -38,7 +38,8 @@ "app/Helpers/ResponseFormatter.php", "app/Helpers/RandomString.php", "app/Helpers/RupiahConverter.php", - "app/Helpers/RupiahRounding.php" + "app/Helpers/RupiahRounding.php", + "app/Helpers/RouteCommandDescriptor.php" ] }, "autoload-dev": { diff --git a/composer.lock b/composer.lock index aa741fb..1b0357e 100644 --- a/composer.lock +++ b/composer.lock @@ -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": "78bf9d94ab2c24700fe6d8f867021e87", + "content-hash": "c2a087156cf7cdb5fbd03918562d593c", "packages": [ { "name": "brick/math", @@ -3867,35 +3867,35 @@ }, { "name": "spatie/laravel-permission", - "version": "5.11.1", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "7090824cca57e693b880ce3aaf7ef78362e28bbd" + "reference": "4d119986c862ac0168b77338c85d8236bb559a88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/7090824cca57e693b880ce3aaf7ef78362e28bbd", - "reference": "7090824cca57e693b880ce3aaf7ef78362e28bbd", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/4d119986c862ac0168b77338c85d8236bb559a88", + "reference": "4d119986c862ac0168b77338c85d8236bb559a88", "shasum": "" }, "require": { - "illuminate/auth": "^7.0|^8.0|^9.0|^10.0", - "illuminate/container": "^7.0|^8.0|^9.0|^10.0", - "illuminate/contracts": "^7.0|^8.0|^9.0|^10.0", - "illuminate/database": "^7.0|^8.0|^9.0|^10.0", - "php": "^7.3|^8.0" + "illuminate/auth": "^8.12|^9.0|^10.0|^11.0", + "illuminate/container": "^8.12|^9.0|^10.0|^11.0", + "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0", + "illuminate/database": "^8.12|^9.0|^10.0|^11.0", + "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0", - "phpunit/phpunit": "^9.4", - "predis/predis": "^1.1" + "laravel/passport": "^11.0", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.4|^10.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.x-dev", - "dev-master": "5.x-dev" + "dev-main": "6.x-dev", + "dev-master": "6.x-dev" }, "laravel": { "providers": [ @@ -3923,7 +3923,7 @@ "role": "Developer" } ], - "description": "Permission handling for Laravel 6.0 and up", + "description": "Permission handling for Laravel 8.0 and up", "homepage": "https://github.com/spatie/laravel-permission", "keywords": [ "acl", @@ -3937,7 +3937,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/5.11.1" + "source": "https://github.com/spatie/laravel-permission/tree/6.3.0" }, "funding": [ { @@ -3945,7 +3945,7 @@ "type": "github" } ], - "time": "2023-10-25T05:12:01+00:00" + "time": "2023-12-24T06:58:02+00:00" }, { "name": "symfony/console", diff --git a/config/app.php b/config/app.php index c303137..477f1df 100644 --- a/config/app.php +++ b/config/app.php @@ -168,6 +168,7 @@ return [ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + Spatie\Permission\PermissionServiceProvider::class, ])->toArray(), /* diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 0000000..5b6e184 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,161 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => Spatie\Permission\Models\Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => Spatie\Permission\Models\Role::class, + + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + /* + * Change this if you want to name the related pivots other than defaults + */ + 'role_pivot_key' => null, //default 'role_id', + 'permission_pivot_key' => null, //default 'permission_id', + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + + /* + * Change this if you want to use the teams feature and your related model's + * foreign key is other than `team_id`. + */ + + 'team_foreign_key' => 'team_id', + ], + + /* + * When set to true, the method for checking permissions will be registered on the gate. + * Set this to false, if you want to implement custom logic for checking permissions. + */ + + 'register_permission_check_method' => true, + + /* + * When set to true the package implements teams using the 'team_foreign_key'. If you want + * the migrations to register the 'team_foreign_key', you must set this to true + * before doing the migration. If you already did the migration then you must make a new + * migration to also add 'team_foreign_key' to 'roles', 'model_has_roles', and + * 'model_has_permissions'(view the latest version of package's migration file) + */ + + 'teams' => false, + + /* + * When set to true, the required permission names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + /* + * When set to true, the required role names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_role_in_exception' => false, + + /* + * By default wildcard permission lookups are disabled. + */ + + 'enable_wildcard_permission' => false, + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/database/migrations/2024_01_21_123052_add_nomor_antrian_in_pesanans_table.php b/database/migrations/2024_01_21_123052_add_nomor_antrian_in_pesanans_table.php new file mode 100644 index 0000000..2e47873 --- /dev/null +++ b/database/migrations/2024_01_21_123052_add_nomor_antrian_in_pesanans_table.php @@ -0,0 +1,28 @@ +string('nomor_antrian')->nullable()->after('keterangan_pesanan'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('pesanans', function (Blueprint $table) { + $table->dropColumn('nomor_antrian'); + }); + } +}; diff --git a/database/migrations/2024_01_22_153605_create_permission_tables.php b/database/migrations/2024_01_22_153605_create_permission_tables.php new file mode 100644 index 0000000..b865d48 --- /dev/null +++ b/database/migrations/2024_01_22_153605_create_permission_tables.php @@ -0,0 +1,138 @@ +bigIncrements('id'); // permission id + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) { + $table->bigIncrements('id'); // role id + if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing + $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable(); + $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index'); + } + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + if ($teams || config('permission.testing')) { + $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']); + } else { + $table->unique(['name', 'guard_name']); + } + }); + + Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) { + $table->unsignedBigInteger($pivotPermission); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } else { + $table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } + + }); + + Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) { + $table->unsignedBigInteger($pivotRole); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } else { + $table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } + }); + + Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) { + $table->unsignedBigInteger($pivotPermission); + $table->unsignedBigInteger($pivotRole); + + $table->foreign($pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign($pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $tableNames = config('permission.table_names'); + + if (empty($tableNames)) { + throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + } + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +}; diff --git a/database/seeders/AddRoles.php b/database/seeders/AddRoles.php new file mode 100644 index 0000000..e8ea12e --- /dev/null +++ b/database/seeders/AddRoles.php @@ -0,0 +1,46 @@ + 'Admin', + 'guard_name' => 'web', + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString() + ], + [ + 'name' => 'Manager', + 'guard_name' => 'web', + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString() + ], + [ + 'name' => 'Kasir', + 'guard_name' => 'web', + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString() + ], + [ + 'name' => 'Karyawan', + 'guard_name' => 'web', + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString() + ], + ]; + + DB::table('roles')->insert($data_roles); + } +} diff --git a/database/seeders/AddUsers.php b/database/seeders/AddUsers.php new file mode 100644 index 0000000..c2723c0 --- /dev/null +++ b/database/seeders/AddUsers.php @@ -0,0 +1,31 @@ + 'Admin', + 'email' => 'admin@mail.id', + 'password' => bcrypt('password') + ]); + + $permissions = Permission::pluck('id', 'id')->all(); + $role = Role::findById(1); + $role->givePermissionTo($permissions); + $role->syncPermissions($permissions); + $data->assignRole([$role->id]); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 163b874..1a3ebf8 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,7 +18,8 @@ class DatabaseSeeder extends Seeder KelompokKategoriSeeder::class, ProdukSeeder::class, KelompokKategoriPivotSeeder::class, - UserSeeder::class, + + // UserSeeder::class, ]; foreach ($classes as $class) { diff --git a/database/seeders/KasirSeeder.php b/database/seeders/KasirSeeder.php new file mode 100644 index 0000000..af8d421 --- /dev/null +++ b/database/seeders/KasirSeeder.php @@ -0,0 +1,38 @@ + 'kasir', + 'email' => 'kasir@mail.com', + 'email_verified_at' => now(), + 'password' => bcrypt('kasirsaja') + ], + ]; + + $role = Role::create(['name' => 'Kasir']); + + $permissions = Permission::pluck('id', 'id')->all(); + $role->givePermissionTo($permissions); + $role->syncPermissions($permissions); + + foreach ($user as $key => $value) { + $data = User::create($value); + $data->assignRole([$role->id]); + } + } +} diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php new file mode 100644 index 0000000..356fd84 --- /dev/null +++ b/database/seeders/PermissionSeeder.php @@ -0,0 +1,23 @@ +call($class); + } +} diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..429209f --- /dev/null +++ b/database/seeders/RoleSeeder.php @@ -0,0 +1,40 @@ + 'Admin']); + + $permissions = Permission::pluck('id', 'id')->all(); + $role->givePermissionTo($permissions); + $role->syncPermissions($permissions); + + $user = User::find(1); + + $user->assignRole([$role->id]); + + $role = Role::create(['name' => 'Kasir']); + + $permissions = Permission::pluck('id', 'id')->all(); + $role->givePermissionTo($permissions); + $role->syncPermissions($permissions); + + $user = User::find(2); + + $user->assignRole([$role->id]); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index d4d13a9..268b7b2 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -2,8 +2,11 @@ namespace Database\Seeders; +use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Spatie\Permission\Models\Permission; +use Spatie\Permission\Models\Role; class UserSeeder extends Seeder { @@ -12,21 +15,24 @@ class UserSeeder extends Seeder */ public function run(): void { - $data = [ + $user = [ [ - 'name' => 'Admin', - 'email' => 'Admin@mail.com', - 'password' => bcrypt('adminsaja'), - ], - [ - 'name' => 'Kasir', - 'email' => 'Kasir@mail.com', - 'password' => bcrypt('kasirsaja'), + 'name' => 'admin', + 'email' => 'admin@mail.id', + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password ], ]; - foreach ($data as $key => $value) { - \App\Models\User::create($value); + $role = Role::create(['name' => 'Admin']); + + $permissions = Permission::pluck('id', 'id')->all(); + $role->givePermissionTo($permissions); + $role->syncPermissions($permissions); + + foreach ($user as $key => $value) { + $data = User::create($value); + $data->assignRole([$role->id]); } } } diff --git a/database/seeders/data_csv/kelompok_kategori_pivot.csv b/database/seeders/data_csv/kelompok_kategori_pivot.csv index 95a0bbc..5707f04 100644 --- a/database/seeders/data_csv/kelompok_kategori_pivot.csv +++ b/database/seeders/data_csv/kelompok_kategori_pivot.csv @@ -480,7 +480,6 @@ 2,291 9,439 9,440 -2,440 2,441 2,442 2,443 diff --git a/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.png b/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.png new file mode 100644 index 0000000..db43b0a Binary files /dev/null and b/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.png differ diff --git a/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.svg b/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.svg new file mode 100644 index 0000000..bf5da30 --- /dev/null +++ b/public/assets/images/logo bulat Sepiring Telur Keriting lengkap-04 1.svg @@ -0,0 +1,9 @@ + diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..b564d87 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,126 @@ + + + + + + +No | -Kode Pesanan | -Kasir | -Tanggal & Jam | -Total Pesanan | -Diskon(%) | -Total | -- |
---|
Jln. Jawa No. 28A, Jember
{{ tanggal_indonesia($pesanan->tanggal_pesanan) }}
{{ date('H:i', strtotime($pesanan->tanggal_pesanan)) }}
-Meja: {{ $pesanan->nomor_meja }}
{{ $pesanan->kode_pesanan }}
Kasir: {{ $pesanan->user->name }}
-Order: {{ $pesanan->nama_pemesan }}
+
+ Meja: {{ $pesanan->nomor_meja }}+ |
+
+ Antrian: {{ $pesanan->nomor_antrian }}+ |
+
+ Pemesan: {{ $pesanan->nama_pemesan }}+ |
+
{{ $item->nama_produk }} | -||||
- | {{ $item->jumlah_produk }} | -{{ convert_to_rupiah($item->harga_produk) }} | -- {{ $item->diskon_persen != '' || $item->diskon_persen != 0 || $item->diskon_persen != null ? $item->diskon_persen . '%' : '' }} - | -{{ convert_to_rupiah($item->total_harga_produk) }} | -
{{ $item->nama_produk }} | +||||
+ | {{ $item->jumlah_produk }} | +{{ convert_to_rupiah($item->harga_produk) }} | ++ {{ $item->diskon_persen != '' || $item->diskon_persen != 0 || $item->diskon_persen != null ? $item->diskon_persen . '%' : '' }} + | +{{ convert_to_rupiah($item->total_harga_produk) }} | +
Terima Kasih, Selamat Datang Kembali
@sepiringtelurkeriting
untuk dapur
+{{ tanggal_indonesia($pesanan->tanggal_pesanan) }}
+{{ date('H:i', strtotime($pesanan->tanggal_pesanan)) }}
+ + +{{ $pesanan->kode_pesanan }}
+Kasir: {{ $pesanan->user->name }}
+ + +
+ Meja: {{ $pesanan->nomor_meja }}+ |
+
+ Antrian: {{ $pesanan->nomor_antrian }}+ |
+
+ Pemesan: {{ $pesanan->nama_pemesan }}+ |
+
+ + ({{ $item->jumlah_produk }} X) + {{ $item->nama_produk }} ++ @if ($item->keterangan_produk != '') ++ ket: {{ $item->keterangan_produk }} + ++ @endif + |
+
Keterangan Pesanan Keseluruhan
+
+ {{ $pesanan->keterangan_pesanan != '' ? $pesanan->keterangan_pesanan : '-' }}+ |
+