243 lines
8.9 KiB
PHP
243 lines
8.9 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use Illuminate\Http\Request;
|
||
use App\Models\PengajuanSurat;
|
||
use App\Models\User; // Tambahkan ini
|
||
use Illuminate\Support\Facades\File;
|
||
use Illuminate\Support\Facades\Auth;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Http;
|
||
use Illuminate\Support\Facades\Hash; // Tambahkan ini untuk enkripsi password
|
||
|
||
class PengajuanController extends Controller
|
||
{
|
||
/**
|
||
* FUNGSI INTERNAL: Mengirim Notifikasi ke Telegram
|
||
*/
|
||
private function sendTelegramNotification($pengajuan, $statusBaru)
|
||
{
|
||
$token = env('TELEGRAM_BOT_TOKEN');
|
||
$chatId = env('TELEGRAM_CHAT_ID');
|
||
|
||
if (!$token || !$chatId) return;
|
||
|
||
// Eager load user jika belum ada
|
||
$namaUser = $pengajuan->user ? $pengajuan->user->nama_lengkap : 'Penduduk';
|
||
|
||
// Penyesuaian emoji berdasarkan status
|
||
$statusEmoji = 'ℹ️';
|
||
if ($statusBaru === 'disetujui') $statusEmoji = '✅';
|
||
if ($statusBaru === 'ditolak') $statusEmoji = '❌';
|
||
|
||
$message = "📢 *NOTIFIKASI E-SURAT*\n\n"
|
||
. "Halo, *{$namaUser}*\n"
|
||
. "Surat *{$pengajuan->jenis_surat}* Anda telah *" . strtoupper($statusBaru) . "* {$statusEmoji}\n"
|
||
. "🔢 *No Surat:* " . ($pengajuan->nomor_surat ?? '-') . "\n\n"
|
||
. "--- _E-Surat Desa_ ---";
|
||
|
||
try {
|
||
Http::withoutVerifying()->post("https://api.telegram.org/bot{$token}/sendMessage", [
|
||
'chat_id' => $chatId,
|
||
'text' => $message,
|
||
'parse_mode' => 'Markdown',
|
||
]);
|
||
} catch (\Exception $e) {
|
||
\Log::error("Telegram Gagal: " . $e->getMessage());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* FUNGSI BARU: Admin & Super Admin menambah User baru
|
||
*/
|
||
public function storeUser(Request $request)
|
||
{
|
||
// Proteksi tingkat tinggi: Hanya admin/super admin
|
||
if (!in_array(Auth::user()->role, ['admin', 'super admin'])) {
|
||
return redirect()->back()->with('error', 'Akses ditolak! Anda bukan admin.');
|
||
}
|
||
|
||
$request->validate([
|
||
'username' => 'required|unique:users,username|max:255',
|
||
'nama_lengkap' => 'required|string|max:255',
|
||
'password' => 'required|min:6',
|
||
'role' => 'required|in:admin,user', // Super admin hanya bisa dibuat via DB/Seeder demi keamanan
|
||
]);
|
||
|
||
try {
|
||
User::create([
|
||
'username' => $request->username,
|
||
'nama_lengkap' => $request->nama_lengkap,
|
||
'password' => Hash::make($request->password), // Gunakan Hash agar aman
|
||
'role' => $request->role,
|
||
]);
|
||
|
||
return redirect()->back()->with('success', 'User baru berhasil ditambahkan!');
|
||
} catch (\Exception $e) {
|
||
return redirect()->back()->with('error', 'Gagal menambah user: ' . $e->getMessage());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* HALAMAN UTAMA ADMIN (INDEX)
|
||
*/
|
||
public function index()
|
||
{
|
||
$pengajuan = PengajuanSurat::with('user')->orderBy('created_at', 'desc')->paginate(7);
|
||
$totalMenunggu = PengajuanSurat::where('status', 'menunggu')->count();
|
||
$totalDisetujui = PengajuanSurat::where('status', 'disetujui')->count();
|
||
|
||
// Ambil data user untuk ditampilkan di form tambah user jika perlu
|
||
$users = User::all();
|
||
|
||
return view('pengajuan', compact('pengajuan', 'totalMenunggu', 'totalDisetujui', 'users'));
|
||
}
|
||
|
||
/**
|
||
* HALAMAN DASHBOARD USER (INDEX USER)
|
||
*/
|
||
public function indexUser()
|
||
{
|
||
$userId = Auth::id();
|
||
$dataValidasi = DB::table('validasi')->where('user_id', $userId)->first();
|
||
$status_validasi = $dataValidasi ? strtoupper($dataValidasi->status) : 'BELUM_ISI';
|
||
|
||
$pengajuan = PengajuanSurat::where('user_id', $userId)
|
||
->orderBy('created_at', 'desc')
|
||
->paginate(7);
|
||
|
||
$totalMenunggu = PengajuanSurat::where('user_id', $userId)->where('status', 'menunggu')->count();
|
||
$totalDisetujui = PengajuanSurat::where('user_id', $userId)->where('status', 'disetujui')->count();
|
||
$totalDitolak = PengajuanSurat::where('user_id', $userId)->where('status', 'ditolak')->count();
|
||
|
||
return view('user.pengajuan', compact('pengajuan', 'totalMenunggu', 'totalDisetujui', 'totalDitolak', 'status_validasi'));
|
||
}
|
||
|
||
/**
|
||
* MENYIMPAN PENGAJUAN BARU (STORE)
|
||
*/
|
||
public function store(Request $request)
|
||
{
|
||
$user = Auth::user();
|
||
$isAdmin = in_array($user->role, ['admin', 'super admin']);
|
||
|
||
if (!$isAdmin) {
|
||
$validasi = DB::table('validasi')->where('user_id', $user->id)->first();
|
||
if (!$validasi || strtoupper($validasi->status) !== 'DISETUJUI') {
|
||
return redirect()->back()->with('error', 'Akses ditolak! Anda belum divalidasi sebagai penduduk.');
|
||
}
|
||
}
|
||
|
||
$request->validate([
|
||
'nomor_surat' => 'required|string|max:100',
|
||
'jenis_surat' => 'required|string',
|
||
'tanggal_pengajuan' => 'required|date',
|
||
'keterangan' => 'required|string',
|
||
'berkas_persyaratan' => 'required|file|mimes:pdf|max:2048',
|
||
]);
|
||
|
||
try {
|
||
$namaFile = null;
|
||
if ($request->hasFile('berkas_persyaratan')) {
|
||
$file = $request->file('berkas_persyaratan');
|
||
$namaFile = time() . '_' . $file->getClientOriginalName();
|
||
$file->move(public_path('berkas_pengajuan'), $namaFile);
|
||
}
|
||
|
||
PengajuanSurat::create([
|
||
'user_id' => $user->id,
|
||
'nomor_surat' => $request->nomor_surat,
|
||
'jenis_surat' => $request->jenis_surat,
|
||
'tanggal_pengajuan' => $request->tanggal_pengajuan,
|
||
'keterangan' => $request->keterangan,
|
||
'status' => 'menunggu',
|
||
'berkas_persyaratan' => $namaFile,
|
||
]);
|
||
|
||
return redirect()->back()->with('success', 'Pengajuan berhasil dikirim!');
|
||
} catch (\Exception $e) {
|
||
return redirect()->back()->with('error', 'Gagal menyimpan: ' . $e->getMessage());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* MENGUBAH DATA PENGAJUAN (UPDATE)
|
||
*/
|
||
public function update(Request $request, $id)
|
||
{
|
||
$pengajuan = PengajuanSurat::findOrFail($id);
|
||
$user = Auth::user();
|
||
$isAdmin = in_array($user->role, ['admin', 'super admin']);
|
||
|
||
if (!$isAdmin && $pengajuan->user_id !== $user->id) {
|
||
return redirect()->back()->with('error', 'Akses ditolak.');
|
||
}
|
||
|
||
// Validasi diperingkas
|
||
$request->validate([
|
||
'nomor_surat' => 'required',
|
||
'jenis_surat' => 'required',
|
||
'berkas_persyaratan' => 'nullable|file|mimes:pdf|max:2048',
|
||
]);
|
||
|
||
$statusLama = $pengajuan->status;
|
||
$statusBaru = $request->status;
|
||
|
||
$pengajuan->nomor_surat = $request->nomor_surat;
|
||
$pengajuan->jenis_surat = $request->jenis_surat;
|
||
$pengajuan->keterangan = $request->keterangan;
|
||
|
||
if ($request->has('tanggal_pengajuan')) {
|
||
$pengajuan->tanggal_pengajuan = $request->tanggal_pengajuan;
|
||
}
|
||
|
||
if ($isAdmin && $request->has('status')) {
|
||
$pengajuan->status = $statusBaru;
|
||
}
|
||
|
||
if ($request->hasFile('berkas_persyaratan')) {
|
||
if ($pengajuan->berkas_persyaratan && File::exists(public_path('berkas_pengajuan/' . $pengajuan->berkas_persyaratan))) {
|
||
File::delete(public_path('berkas_pengajuan/' . $pengajuan->berkas_persyaratan));
|
||
}
|
||
$file = $request->file('berkas_persyaratan');
|
||
$namaFile = time() . '_' . $file->getClientOriginalName();
|
||
$file->move(public_path('berkas_pengajuan'), $namaFile);
|
||
$pengajuan->berkas_persyaratan = $namaFile;
|
||
}
|
||
|
||
$pengajuan->save();
|
||
|
||
// Kirim notifikasi jika status berubah oleh Admin
|
||
if ($isAdmin && $statusBaru && $statusBaru !== $statusLama) {
|
||
$this->sendTelegramNotification($pengajuan, $statusBaru);
|
||
}
|
||
|
||
return redirect()->back()->with('success', 'Data pengajuan berhasil diperbarui!');
|
||
}
|
||
|
||
/**
|
||
* MENGHAPUS PENGAJUAN (DESTROY)
|
||
*/
|
||
public function destroy($id)
|
||
{
|
||
$pengajuan = PengajuanSurat::findOrFail($id);
|
||
$user = Auth::user();
|
||
$isAdmin = in_array($user->role, ['admin', 'super admin']);
|
||
|
||
if (!$isAdmin && $pengajuan->user_id !== $user->id) {
|
||
return redirect()->back()->with('error', 'Akses ditolak.');
|
||
}
|
||
|
||
// Hapus file fisik
|
||
if ($pengajuan->berkas_persyaratan) {
|
||
$path = public_path('berkas_pengajuan/' . $pengajuan->berkas_persyaratan);
|
||
if (File::exists($path)) {
|
||
File::delete($path);
|
||
}
|
||
}
|
||
|
||
$pengajuan->delete();
|
||
return redirect()->back()->with('success', 'Data berhasil dihapus');
|
||
}
|
||
} |