diff --git a/app/Enums/JenisWorkshop.php b/app/Enums/JenisWorkshop.php
new file mode 100644
index 0000000..b66c380
--- /dev/null
+++ b/app/Enums/JenisWorkshop.php
@@ -0,0 +1,10 @@
+ Workshop::count(),
+ 'lokakarya' => Workshop::where('jenis', 'lokakarya')->count(),
+ 'pelatihan' => Workshop::where('jenis', 'pelatihan')->count(),
+ 'sosialisasi' => Workshop::where('jenis', 'sosialisasi')->count(),
+ 'sesi' => SesiWorkshop::count(),
+ 'peserta' => PesertaWorkshop::count(),
+ ]);
+
+ $query = Workshop::query();
+
+ if ($request->filled('search')) {
+ $search = $request->search;
+ $query->where(function($q) use ($search) {
+ $q->where('judul', 'ilike', "%{$search}%")
+ ->orWhere('deskripsi', 'ilike', "%{$search}%");
+ });
+ }
+
+ if ($request->filled('jenis')) {
+ $query->where('jenis', $request->jenis);
+ }
+
+ if ($request->filled('status')) {
+ $query->where('status', $request->status);
+ }
+
+ if ($request->filled('tanggal_awal') && $request->filled('tanggal_akhir')) {
+ $query->whereBetween('tanggal_awal', [$request->tanggal_awal, $request->tanggal_akhir]);
+ } elseif ($request->filled('tanggal_awal')) {
+ $query->where('tanggal_awal', '>=', $request->tanggal_awal);
+ } elseif ($request->filled('tanggal_akhir')) {
+ $query->where('tanggal_akhir', '<=', $request->tanggal_akhir);
+ }
+
+ $perPage = $request->input('per_page', 10);
+ $workshops = $query->latest()->paginate($perPage);
+
+ return view('program.workshop.index', compact('workshops', 'summary', 'title'));
+ }
+
+ public function create()
+ {
+ $programs = Aktivitas::latest()->get();
+ return view('program.workshop.add', compact('programs'));
+ }
+
+ public function store(Request $request)
+ {
+ $validated = $request->validate([
+ 'program_aktivitas_id' => 'nullable|integer',
+ 'judul' => 'required|string|max:255',
+ 'jenis' => 'required|string',
+ 'tanggal_awal' => 'required|date',
+ 'tanggal_akhir' => 'required|date|after_or_equal:tanggal_awal',
+ 'status' => 'required|string',
+ 'deskripsi' => 'nullable|string',
+ ], [
+ 'program_aktivitas_id.integer' => 'Program aktivitas harus berupa angka.',
+
+ 'judul.required' => 'Judul wajib diisi.',
+ 'judul.string' => 'Judul harus berupa teks.',
+ 'judul.max' => 'Judul maksimal 255 karakter.',
+
+ 'jenis.required' => 'Jenis wajib diisi.',
+ 'jenis.string' => 'Jenis harus berupa teks.',
+
+ 'tanggal_awal.required' => 'Tanggal awal wajib diisi.',
+ 'tanggal_awal.date' => 'Tanggal awal harus berupa tanggal yang valid.',
+
+ 'tanggal_akhir.required' => 'Tanggal akhir wajib diisi.',
+ 'tanggal_akhir.date' => 'Tanggal akhir harus berupa tanggal yang valid.',
+ 'tanggal_akhir.after_or_equal' => 'Tanggal akhir harus setelah atau sama dengan tanggal awal.',
+
+ 'status.required' => 'Status wajib diisi.',
+ 'status.string' => 'Status harus berupa teks.',
+
+ 'deskripsi.string' => 'Deskripsi harus berupa teks.',
+ ]);
+
+ $workshop = Workshop::create([
+ 'judul' => $request->judul,
+ 'jenis' => $request->jenis,
+ 'tanggal_awal' => $request->tanggal_awal,
+ 'tanggal_akhir' => $request->tanggal_akhir,
+ 'status' => $request->status,
+ 'deskripsi' => $request->deskripsi,
+ 'program_aktivitas_id' => $request->program_aktivitas_id ?? null,
+ 'created_by' => auth()->user()->id,
+ 'updated_by' => auth()->user()->id,
+ ]);
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Workshop berhasil disimpan sebagai Draft.'
+ ]);
+ }
+
+ public function edit($id)
+ {
+ $workshop = Workshop::findOrFail($id);
+ $programs = Aktivitas::latest()->get();
+
+ return view('program.workshop.edit', compact('workshop', 'programs'));
+ }
+
+ public function update(Request $request, $id)
+ {
+ $validated = $request->validate([
+ 'program_aktivitas_id' => 'nullable|integer',
+ 'judul' => 'required|string|max:255',
+ 'jenis' => 'required|string',
+ 'tanggal_awal' => 'required|date',
+ 'tanggal_akhir' => 'required|date|after_or_equal:tanggal_awal',
+ 'status' => 'required|string',
+ 'deskripsi' => 'nullable|string',
+ ], [
+ 'program_aktivitas_id.integer' => 'Program aktivitas harus berupa angka.',
+
+ 'judul.required' => 'Judul wajib diisi.',
+ 'judul.string' => 'Judul harus berupa teks.',
+ 'judul.max' => 'Judul maksimal 255 karakter.',
+
+ 'jenis.required' => 'Jenis wajib diisi.',
+ 'jenis.string' => 'Jenis harus berupa teks.',
+
+ 'tanggal_awal.required' => 'Tanggal awal wajib diisi.',
+ 'tanggal_awal.date' => 'Tanggal awal harus berupa tanggal yang valid.',
+
+ 'tanggal_akhir.required' => 'Tanggal akhir wajib diisi.',
+ 'tanggal_akhir.date' => 'Tanggal akhir harus berupa tanggal yang valid.',
+ 'tanggal_akhir.after_or_equal' => 'Tanggal akhir harus setelah atau sama dengan tanggal awal.',
+
+ 'status.required' => 'Status wajib diisi.',
+ 'status.string' => 'Status harus berupa teks.',
+
+ 'deskripsi.string' => 'Deskripsi harus berupa teks.',
+ ]);
+
+ $workshop = Workshop::findOrFail($id);
+
+ $workshop->update([
+ 'judul' => $request->judul,
+ 'jenis' => $request->jenis,
+ 'tanggal_awal' => $request->tanggal_awal,
+ 'tanggal_akhir' => $request->tanggal_akhir,
+ 'status' => $request->status,
+ 'deskripsi' => $request->deskripsi,
+ 'program_aktivitas_id' => $request->program_aktivitas_id ?? null,
+ 'updated_by' => auth()->user()->id,
+ ]);
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Perubahan workshop berhasil disimpan.'
+ ]);
+ }
+
+ public function destroy($id)
+ {
+ $workshop = Workshop::findOrFail($id);
+ $workshop->update(['deleted_by' => auth()->user()->id]);
+
+ $workshop->delete();
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Workshop berhasil dihapus.'
+ ]);
+ }
+}
diff --git a/app/Models/Program/PesertaWorkshop.php b/app/Models/Program/PesertaWorkshop.php
new file mode 100644
index 0000000..f199f62
--- /dev/null
+++ b/app/Models/Program/PesertaWorkshop.php
@@ -0,0 +1,36 @@
+belongsTo(Profile::class, 'profil_id');
+ }
+
+ public function sesiWorkshop()
+ {
+ return $this->belongsTo(SesiWorkshop::class, 'sesi_workshop_id');
+ }
+}
diff --git a/app/Models/Program/SesiWorkshop.php b/app/Models/Program/SesiWorkshop.php
new file mode 100644
index 0000000..ef696a2
--- /dev/null
+++ b/app/Models/Program/SesiWorkshop.php
@@ -0,0 +1,40 @@
+belongsTo(Workshop::class, 'workshop_id');
+ }
+
+ public function pesertaWorkshop()
+ {
+ return $this->hasMany(PesertaWorkshop::class, 'sesi_workshop_id');
+ }
+}
diff --git a/app/Models/Program/Workshop.php b/app/Models/Program/Workshop.php
new file mode 100644
index 0000000..aaba7ac
--- /dev/null
+++ b/app/Models/Program/Workshop.php
@@ -0,0 +1,47 @@
+ StatusWorkshop::class,
+ 'jenis' => JenisWorkshop::class,
+ ];
+
+ protected $fillable = [
+ 'program_aktivitas_id',
+ 'judul',
+ 'deskripsi',
+ 'jenis',
+ 'tanggal_awal',
+ 'tanggal_akhir',
+ 'status',
+ 'created_by',
+ 'updated_by',
+ 'deleted_by',
+ ];
+
+ public function program()
+ {
+ return $this->belongsTo(Aktivitas::class, 'program_aktivitas_id');
+ }
+ public function sesiWorkshop()
+ {
+ return $this->hasMany(SesiWorkshop::class, 'workshop_id');
+ }
+}
diff --git a/database/migrations/2026_02_12_110653_create_wilayah_table.php b/database/migrations/2026_02_12_110653_create_wilayah_table.php
index 3d2b528..b9240be 100644
--- a/database/migrations/2026_02_12_110653_create_wilayah_table.php
+++ b/database/migrations/2026_02_12_110653_create_wilayah_table.php
@@ -15,7 +15,7 @@ return new class extends Migration
$table->id();
$table->string('kode', 2)->unique();
$table->string('nama', 100);
- $table->string('path', 10000);
+ $table->jsonb('path')->nullable();
$table->string('iso', 100);
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
@@ -28,7 +28,7 @@ return new class extends Migration
$table->id();
$table->string('kode', 4)->unique();
$table->string('nama', 100);
- $table->string('path', 10000);
+ $table->jsonb('path')->nullable();
$table->foreignId('provinsi_id')->constrained('master_provinsi')->onDelete('set null');
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
@@ -41,7 +41,7 @@ return new class extends Migration
$table->id();
$table->string('kode', 6)->unique();
$table->string('nama', 100);
- $table->string('path', 10000);
+ $table->jsonb('path')->nullable();
$table->foreignId('kabupaten_kota_id')->constrained('master_kabupaten_kota')->onDelete('set null');
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
@@ -54,7 +54,7 @@ return new class extends Migration
$table->id();
$table->string('kode', 10)->unique();
$table->string('nama', 100);
- $table->string('path', 10000);
+ $table->jsonb('path')->nullable();
$table->foreignId('kecamatan_id')->constrained('master_kecamatan')->onDelete('set null');
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
diff --git a/database/migrations/2026_04_29_111840_create_workshop_table.php b/database/migrations/2026_04_29_111840_create_workshop_table.php
new file mode 100644
index 0000000..0d0efd2
--- /dev/null
+++ b/database/migrations/2026_04_29_111840_create_workshop_table.php
@@ -0,0 +1,78 @@
+id();
+
+ $table->foreignId('program_aktivitas_id')->nullable()->constrained('program_aktivitas')->nullOnDelete();
+ $table->string('judul');
+ $table->text('deskripsi')->nullable();
+ $table->string('jenis')->nullable();
+ $table->date('tanggal_awal')->nullable();
+ $table->date('tanggal_akhir')->nullable();
+ $table->string('status')->nullable();
+
+ $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
+
+ $table->timestamps();
+ $table->softDeletes();
+ });
+
+ Schema::create('sesi_workshop', function (Blueprint $table) {
+ $table->id();
+
+ $table->foreignId('workshop_id')->nullable()->constrained('workshop')->nullOnDelete();
+ $table->string('judul');
+ $table->text('deskripsi')->nullable();
+ $table->foreignId('desa_kelurahan_id')->nullable()->constrained('master_desa_kelurahan');
+ $table->string('lokasi')->nullable();
+ $table->timestamp('tanggal_awal')->nullable();
+ $table->timestamp('tanggal_akhir')->nullable();
+ $table->string('status')->nullable();
+
+ $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
+
+ $table->timestamps();
+ $table->softDeletes();
+ });
+
+ Schema::create('peserta_workshop', function (Blueprint $table) {
+ $table->id();
+
+ $table->foreignId('sesi_workshop_id')->nullable()->constrained('sesi_workshop')->nullOnDelete();
+ $table->foreignId('profile_id')->nullable()->constrained('profiles')->nullOnDelete();
+ $table->string('status')->nullable();
+
+ $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
+ $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
+
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('peserta_workshop');
+ Schema::dropIfExists('sesi_workshop');
+ Schema::dropIfExists('workshop');
+ }
+};
diff --git a/resources/views/dashboard/produktivitas.blade.php b/resources/views/dashboard/produktivitas.blade.php
index 91b2c36..4e9e7b7 100644
--- a/resources/views/dashboard/produktivitas.blade.php
+++ b/resources/views/dashboard/produktivitas.blade.php
@@ -338,7 +338,6 @@
@push('scripts')
diff --git a/resources/views/layout/main.blade.php b/resources/views/layout/main.blade.php
index 69a6a34..5e59cbe 100644
--- a/resources/views/layout/main.blade.php
+++ b/resources/views/layout/main.blade.php
@@ -82,6 +82,10 @@
+
+
+
+
-
+
-
+ -->
@stack('scripts')