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') \ No newline at end of file diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index 823c5f9..b276992 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -170,7 +170,7 @@