diff --git a/app/Exports/JenisKartuExport.php b/app/Exports/JenisKartuExport.php new file mode 100644 index 0000000..36d5d78 --- /dev/null +++ b/app/Exports/JenisKartuExport.php @@ -0,0 +1,67 @@ +id, + $row->code, + $row->name, + $row->biaya, + $row->authorized_status ? 'Yes' : 'No', + $row->created_at->format('Y-m-d H:i:s'), + $row->updated_at ? $row->updated_at->format('Y-m-d H:i:s') : '', + ]; + } + + /** + * @param Worksheet $sheet + * @return array + */ + public function styles(Worksheet $sheet) + { + return [ + // Style the first row as bold text + 1 => ['font' => ['bold' => true]], + ]; + } +} diff --git a/app/Http/Controllers/JenisKartuController.php b/app/Http/Controllers/JenisKartuController.php new file mode 100644 index 0000000..4e33cdd --- /dev/null +++ b/app/Http/Controllers/JenisKartuController.php @@ -0,0 +1,207 @@ +validated(); + + if ($validate) { + try { + // Add created_by field + $validate['created_by'] = auth()->id(); + + // Save to database + JenisKartu::create($validate); + + return redirect() + ->route('jenis-kartu.index') + ->with('success', 'Jenis Kartu created successfully'); + } catch (Exception $e) { + return redirect() + ->route('jenis-kartu.create') + ->with('error', 'Failed to create Jenis Kartu'); + } + } + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('webstatement::jenis-kartu.create'); + } + + /** + * Show the specified resource. + */ + public function show($id) + { + $jenisKartu = JenisKartu::find($id); + return view('webstatement::jenis-kartu.show', compact('jenisKartu')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $jenisKartu = JenisKartu::find($id); + return view('webstatement::jenis-kartu.create', compact('jenisKartu')); + } + + /** + * Update the specified resource in storage. + */ + public function update(JenisKartuRequest $request, $id) + { + $validate = $request->validated(); + + if ($validate) { + try { + // Add updated_by field + $validate['updated_by'] = auth()->id(); + + // Update in database + $jenisKartu = JenisKartu::find($id); + $jenisKartu->update($validate); + + return redirect() + ->route('jenis-kartu.index') + ->with('success', 'Jenis Kartu updated successfully'); + } catch (Exception $e) { + return redirect() + ->route('jenis-kartu.edit', $id) + ->with('error', 'Failed to update Jenis Kartu'); + } + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + // Add deleted_by field + $jenisKartu = JenisKartu::find($id); + $jenisKartu->deleted_by = auth()->id(); + $jenisKartu->save(); + + // Delete from database + $jenisKartu->delete(); + + echo json_encode(['success' => true, 'message' => 'Jenis Kartu deleted successfully']); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Failed to delete Jenis Kartu']); + } + } + + /** + * Provide data for datatables. + */ + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('jenis-kartu.view')) { + //abort(403, 'Sorry! You are not allowed to view jenis kartu.'); + } + + // Retrieve data from the database + $query = JenisKartu::query(); + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('code', 'LIKE', "%$search%"); + $q->orWhere('name', 'LIKE', "%$search%"); + $q->orWhere('biaya', 'LIKE', "%$search%"); + }); + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + // Calculate the page count + $pageCount = ceil($filteredRecords / ($request->get('size') ?: 1)); + + // Calculate the current page number + $currentPage = $request->get('page') ?: 1; + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); + } + + /** + * Delete multiple records. + */ + public function deleteMultiple(Request $request) + { + $ids = $request->input('ids'); + JenisKartu::whereIn('id', $ids)->delete(); + return response()->json(['message' => 'Jenis Kartu deleted successfully']); + } + + /** + * Export data to Excel. + */ + public function export() + { + return Excel::download(new JenisKartuExport, 'jenis-kartu.xlsx'); + } + } diff --git a/app/Http/Requests/JenisKartuRequest.php b/app/Http/Requests/JenisKartuRequest.php new file mode 100644 index 0000000..ab9ea0f --- /dev/null +++ b/app/Http/Requests/JenisKartuRequest.php @@ -0,0 +1,41 @@ + 'required|string|max:50', + 'name' => 'required|string|max:255', + 'biaya' => 'required|numeric', + 'authorized_status' => 'nullable|boolean', + ]; + + // Add unique validation for code field on create + if ($this->isMethod('post')) { + $rules['code'] .= '|unique:jenis_kartu,code'; + } + + // Add unique validation for code field on update, excluding the current record + if ($this->isMethod('put') || $this->isMethod('patch')) { + $rules['code'] .= '|unique:jenis_kartu,code,' . $this->id; + } + + return $rules; + } +} diff --git a/app/Models/Base.php b/app/Models/Base.php new file mode 100644 index 0000000..e64fd63 --- /dev/null +++ b/app/Models/Base.php @@ -0,0 +1,51 @@ +connection = $module->database; + } + + /** + * Retrieves the activity log options for the User Management. + * + * @return LogOptions The activity log options. + */ + public function getActivitylogOptions() + : LogOptions + { + return LogOptions::defaults()->logAll()->useLogName('User Management : '); + } + } diff --git a/app/Models/JenisKartu.php b/app/Models/JenisKartu.php new file mode 100644 index 0000000..d37382c --- /dev/null +++ b/app/Models/JenisKartu.php @@ -0,0 +1,22 @@ +id(); + $table->string('code')->unique(); + $table->string('name'); + $table->decimal('biaya', 10, 2)->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->timestamp('crreated_at')->nullable(); + $table->string('authorized_status', 1)->default('0'); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jenis_kartu'); + } +}; diff --git a/database/seeders/JenisKartuSeeder.php b/database/seeders/JenisKartuSeeder.php new file mode 100644 index 0000000..866227e --- /dev/null +++ b/database/seeders/JenisKartuSeeder.php @@ -0,0 +1,56 @@ + 'CLASSIC', + 'name' => 'Kartu Classic', + 'biaya' => 3000, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'code' => 'CLAS', + 'name' => 'Kartu Classic (Singkatan)', + 'biaya' => 3000, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'code' => 'SILVER', + 'name' => 'Kartu Silver', + 'biaya' => 5000, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'code' => 'SILV', + 'name' => 'Kartu Silver (Singkatan)', + 'biaya' => 5000, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'code' => 'GOLD', + 'name' => 'Kartu Gold', + 'biaya' => 10000, + 'created_at' => now(), + 'updated_at' => now(), + ], + ]; + + JenisKartu::insert($jenisKartu); + } + +} diff --git a/database/seeders/WebstatementDatabaseSeeder.php b/database/seeders/WebstatementDatabaseSeeder.php index 81cf7b6..de346f6 100644 --- a/database/seeders/WebstatementDatabaseSeeder.php +++ b/database/seeders/WebstatementDatabaseSeeder.php @@ -11,6 +11,8 @@ class WebstatementDatabaseSeeder extends Seeder */ public function run(): void { - // $this->call([]); + $this->call([ + JenisKartuSeeder::class + ]); } } diff --git a/module.json b/module.json index b57f975..d8f6836 100644 --- a/module.json +++ b/module.json @@ -10,40 +10,48 @@ ], "files": [], "menu": { - "main": [{ - "title": "Staging Data", - "path": "", - "icon": "ki-filled ki-questionnaire-tablet text-lg text-primary", - "classes": "", - "attributes": [], - "permission": "", - "roles": [] - },{ - "title": "Nasabah", - "path": "customer", - "icon": "ki-filled ki-people text-lg text-primary", - "classes": "", - "attributes": [], - "permission": "", - "roles": [] - },{ - "title": "Email Blast", - "path": "emailblast", - "icon": "ki-filled ki-sms text-lg text-primary", - "classes": "", - "attributes": [], - "permission": "", - "roles": [] - }], - "master": [{ - "title": "Pesan Sponsor", - "path": "migrasi", - "icon": "ki-filled ki-category text-lg", - "classes": "", - "attributes": [], - "permission": "", - "roles": [] - }], + "main": [ + { + "title": "Nasabah", + "path": "customer", + "icon": "ki-filled ki-people text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [] + }, + { + "title": "Email Blast", + "path": "emailblast", + "icon": "ki-filled ki-sms text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [] + } + ], + "master": [ + { + "title": "Jenis Kartu", + "path": "jenis-kartu", + "icon": "ki-filled ki-category text-lg", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator" + ] + }, + { + "title": "Pesan Sponsor", + "path": "migrasi", + "icon": "ki-filled ki-category text-lg", + "classes": "", + "attributes": [], + "permission": "", + "roles": [] + } + ], "system": [] } } diff --git a/resources/views/jenis-kartu/create.blade.php b/resources/views/jenis-kartu/create.blade.php new file mode 100644 index 0000000..606c986 --- /dev/null +++ b/resources/views/jenis-kartu/create.blade.php @@ -0,0 +1,74 @@ +@extends('layouts.main') + +@section('breadcrumbs') + @if(isset($jenisKartu->id)) + {{ Breadcrumbs::render(request()->route()->getName(),$jenisKartu) }} + @else + {{ Breadcrumbs::render(request()->route()->getName()) }} + + @endif +@endsection + +@section('content') +
+ @if(isset($jenisKartu->id)) +
+ + @method('PUT') + @else + + @endif + @csrf +
+
+

+ {{ isset($jenisKartu->id) ? 'Edit' : 'Tambah' }} Jenis Kartu +

+
+ Back +
+
+
+
+ +
+ + @error('code') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('name') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('biaya') + {{ $message }} + @enderror +
+
+
+ +
+
+
+
+
+@endsection diff --git a/resources/views/jenis-kartu/index.blade.php b/resources/views/jenis-kartu/index.blade.php new file mode 100644 index 0000000..4b59bfc --- /dev/null +++ b/resources/views/jenis-kartu/index.blade.php @@ -0,0 +1,228 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection + +@section('content') +
+
+
+

+ Daftar Jenis Kartu +

+
+
+ +
+
+
+ Export to Excel + Tambah Jenis Kartu + +
+
+
+
+
+ + + + + + + + + + +
+ + + Code + + + Nama + + + Biaya + + Action
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 9e1771f..3c1f5fc 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -55,3 +55,25 @@ $trail->parent('emailblast.index'); $trail->push('Edit Email Blast', route('emailblast.edit', $emailBlast->id)); }); + + Breadcrumbs::for('jenis-kartu.index', function (BreadcrumbTrail $trail) { + $trail->parent('home'); + $trail->push('Jenis Kartu', route('jenis-kartu.index')); + }); + + Breadcrumbs::for('jenis-kartu.create', function (BreadcrumbTrail $trail) { + $trail->parent('jenis-kartu.index'); + $trail->push('Create Jenis Kartu', route('jenis-kartu.create')); + }); + + // Home > Jenis Kartus > View Jenis Kartu + Breadcrumbs::for('jenis-kartu.view', function (BreadcrumbTrail $trail, $data) { + $trail->parent('jenis-kartu.index'); + $trail->push('View Jenis Kartu', route('jenis-kartu.view', $data->id)); + }); + + // Home > Jenis Kartus > Edit Jenis Kartu + Breadcrumbs::for('jenis-kartu.edit', function (BreadcrumbTrail $trail, $data) { + $trail->parent('jenis-kartu.index'); + $trail->push('Edit Jenis Kartu', route('jenis-kartu.edit', $data->id)); + }); diff --git a/routes/web.php b/routes/web.php index 6296da8..58e3235 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,32 +2,42 @@ use Illuminate\Support\Facades\Route; use Modules\Webstatement\Http\Controllers\BiayaKartuController; + use Modules\Webstatement\Http\Controllers\JenisKartuController; use Modules\Webstatement\Http\Controllers\MigrasiController; use Modules\Webstatement\Http\Controllers\WebstatementController; use Modules\Webstatement\Http\Controllers\CustomerController; use Modules\Webstatement\Http\Controllers\EmailBlastController; -/* -|-------------------------------------------------------------------------- -| Web Routes -|-------------------------------------------------------------------------- -| -| Here is where you can register web routes for your application. These -| routes are loaded by the RouteServiceProvider within a group which -| contains the "web" middleware group. Now create something great! -| -*/ + /* + |-------------------------------------------------------------------------- + | Web Routes + |-------------------------------------------------------------------------- + | + | Here is where you can register web routes for your application. These + | routes are loaded by the RouteServiceProvider within a group which + | contains the "web" middleware group. Now create something great! + | + */ Route::middleware(['auth'])->group(function () { //Route::get('/', [WebstatementController::class, 'index'])->name('webstatement.index'); // Customer routes + Route::get('datatables', [CustomerController::class, 'dataForDatatables'])->name('customer.datatables'); Route::get('export', [CustomerController::class, 'export'])->name('customer.export'); + Route::post('delete-multiple', [CustomerController::class, 'deleteMultiple'])->name('deleteMultiple'); Route::resource('customer', CustomerController::class); + Route::prefix('jenis-kartu')->name('jenis-kartu.')->group(function () { + Route::get('datatables', [JenisKartuController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [JenisKartuController::class, 'export'])->name('export'); + Route::post('delete-multiple', [JenisKartuController::class, 'deleteMultiple'])->name('deleteMultiple'); + }); + Route::resource('jenis-kartu', JenisKartuController::class); + Route::prefix('emailblast')->group(function () { Route::get('/', [EmailBlastController::class, 'index'])->name('emailblast.index'); Route::get('/create', [EmailBlastController::class, 'create'])->name('emailblast.create');