Files
ProjectKP/KP-ASOY FIX (2)/KP-ASOY/app/Http/Controllers/ActivityController.php
T
2026-06-28 15:14:51 +07:00

431 lines
16 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ActivityController extends Controller
{
/**
* ==========================================
* AREA USER (PENGAWAS / PETUGAS)
* ==========================================
*/
private function apiUrl($endpoint = '')
{
return rtrim(env('BACKEND_API_URL'), '/') . '/' . ltrim($endpoint, '/');
}
// 🔥 DASHBOARD USER
public function index()
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->get($this->apiUrl('/dashboard'));
$activities = collect([]);
$stats = ['status_proses' => 0, 'status_selesai' => 0];
if ($response->successful()) {
$data = $response->json();
if (isset($data['data']['recent_activities'])) {
// Mapping penugasan ke format yang diexpect view
$activities = collect($data['data']['recent_activities'])->map(function($item) {
$petugasNames = [];
if(isset($item['petugas']) && is_array($item['petugas'])) {
foreach($item['petugas'] as $p) {
$petugasNames[] = $p['name'];
}
}
$assignedTo = !empty($petugasNames) ? implode(', ', $petugasNames) : (session('user_name') ?? 'Pegawai');
return (object) [
'id' => $item['id'],
'nama_kegiatan' => $item['kegiatan'],
'tanggal' => $item['tanggal_mulai'],
'tanggal_selesai' => $item['tanggal_selesai'] ?? null,
'status' => $item['status'] == 'proses' ? 'on_progres' : $item['status'],
'lokasi' => $item['lokasi'] ?? null,
'reviewed_at' => $item['reviewed_at'] ?? null,
'user' => (object) ['name' => $assignedTo],
];
});
}
if (isset($data['data']['stats'])) {
$stats = $data['data']['stats'];
}
}
$onProgres = $stats['status_proses'] ?? 0;
$selesai = ($stats['status_selesai'] ?? 0) + ($stats['status_ditinjau'] ?? 0);
// Ambil notifikasi
$notifResponse = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->get($this->apiUrl('/notifications'));
$notifications = [];
if ($notifResponse->successful()) {
$notifications = $notifResponse->json()['data'] ?? [];
}
$unreadCount = collect($notifications)->where('read_at', null)->count();
return view('user.dashboard', compact(
'activities',
'onProgres',
'selesai',
'notifications',
'unreadCount'
));
}
// 🔥 LIST SEMUA KEGIATAN USER
public function list()
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->get($this->apiUrl('/penugasan'));
$activities = collect([]);
if ($response->successful()) {
$data = $response->json();
$activities = collect($data['data'])->map(function($item) {
$petugasNames = [];
if(isset($item['petugas']) && is_array($item['petugas'])) {
foreach($item['petugas'] as $p) {
$petugasNames[] = $p['name'];
}
}
$assignedTo = !empty($petugasNames) ? implode(', ', $petugasNames) : (session('user_name') ?? 'Pegawai');
return (object) [
'id' => $item['id'],
'nama_kegiatan' => $item['kegiatan'],
'tanggal' => $item['tanggal_mulai'],
'tanggal_selesai' => $item['tanggal_selesai'] ?? null,
'lokasi' => $item['lokasi'] ?? null,
'status' => $item['status'] == 'proses' ? 'on_progres' : $item['status'],
'user' => (object) ['name' => $assignedTo],
];
});
}
return view('user.activity-list', compact('activities'));
}
// 🔥 SIMPAN ACTIVITY BARU
public function store(Request $request)
{
$request->validate([
'nama_kegiatan' => 'required|string|max:255',
'tanggal' => 'required|date',
'lokasi' => 'nullable|string|max:255',
'deskripsi' => 'nullable|string',
'image' => 'nullable|mimes:jpeg,png,jpg,pdf|max:2048',
]);
$payload = [
'nomor_surat' => null, // Tidak perlu generate karena ini laporan pegawai
'kegiatan' => $request->nama_kegiatan,
'tanggal_mulai' => $request->tanggal,
'lokasi' => $request->lokasi,
'keterangan' => $request->deskripsi,
'status_note' => $request->status_note,
];
$http = \Illuminate\Support\Facades\Http::withToken(session('api_token'));
if ($request->hasFile('image')) {
$file = $request->file('image');
$http = $http->attach('lampiran', file_get_contents($file), $file->getClientOriginalName());
$payload['pegawai_ids[0]'] = session('user_id');
} else {
$payload['pegawai_ids'] = [session('user_id')];
}
$response = $http->post($this->apiUrl('/penugasan'), $payload);
if ($response->successful()) {
return redirect()->route('activity.list')->with('success', 'Kegiatan berhasil ditambahkan');
}
return back()->with('error', 'Gagal menambahkan kegiatan: ' . $response->json('message', 'Error API'));
}
// 🔥 DETAIL ACTIVITY
public function show($id)
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->get($this->apiUrl('/penugasan/' . $id));
if (!$response->successful()) {
return redirect()->route('activity.list')->with('error', 'Data tidak ditemukan');
}
$data = $response->json()['data'];
$activity = (object) [
'id' => $data['id'],
'nama_kegiatan' => $data['kegiatan'],
'tanggal' => $data['tanggal_mulai'],
'tanggal_selesai' => $data['tanggal_selesai'] ?? null,
'lokasi' => $data['lokasi'] ?? '-',
'deskripsi' => $data['keterangan'] ?? '-',
'status_note' => $data['status_note'] ?? '-',
'lampiran' => $data['lampiran'] ?? null,
'updated_at' => $data['updated_at'] ?? now(),
'status' => $data['status'] == 'proses' ? 'on_progres' : $data['status'],
'user' => (object) ['name' => $data['pembuat']['name'] ?? session('user_name')],
'progress' => $data['progress'] ?? [],
'petugas' => $data['petugas'] ?? []
];
return view('user.activity-detail', compact('activity'));
}
// 🔥 EDIT ACTIVITY
public function edit($id)
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->get($this->apiUrl('/penugasan/' . $id));
if (!$response->successful()) {
return redirect()->route('activity.list')->with('error', 'Data tidak ditemukan');
}
$data = $response->json()['data'];
$isPetugas = false;
if(isset($data['petugas'])) {
foreach($data['petugas'] as $p) {
if($p['id'] == session('user_id')) {
$isPetugas = true;
break;
}
}
}
if (!$isPetugas) {
return redirect()->route('activity.list')->with('error', 'Anda tidak memiliki hak untuk mengedit laporan ini.');
}
$activity = (object) [
'id' => $data['id'],
'nama_kegiatan' => $data['kegiatan'],
'tanggal' => $data['tanggal_mulai'],
'lokasi' => $data['lokasi'] ?? '',
'deskripsi' => $data['keterangan'] ?? '',
'status_note' => $data['status_note'] ?? '',
];
return view('user.activity-edit', compact('activity'));
}
// 🔥 UPDATE ACTIVITY
public function update(Request $request, $id)
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))->get($this->apiUrl('/penugasan/' . $id));
if ($response->successful()) {
$data = $response->json()['data'];
$isPetugas = false;
if(isset($data['petugas'])) {
foreach($data['petugas'] as $p) {
if($p['id'] == session('user_id')) {
$isPetugas = true;
break;
}
}
}
if (!$isPetugas) {
return redirect()->route('activity.list')->with('error', 'Anda tidak memiliki hak untuk mengedit laporan ini.');
}
}
$request->validate([
'nama_kegiatan' => 'required|string|max:255',
'tanggal' => 'required|date',
'lokasi' => 'nullable|string|max:255',
'deskripsi' => 'nullable|string',
'image' => 'nullable|mimes:jpeg,png,jpg,pdf|max:2048',
]);
$payload = [
'nomor_surat' => null, // Tidak perlu generate
'kegiatan' => $request->nama_kegiatan,
'tanggal_mulai' => $request->tanggal,
'lokasi' => $request->lokasi,
'keterangan' => $request->deskripsi,
'status_note' => $request->status_note,
// Laravel HTTP client sometimes fails PUT with multipart, we can simulate it with POST + _method=PUT
'_method' => 'PUT',
];
$http = \Illuminate\Support\Facades\Http::withToken(session('api_token'));
if ($request->hasFile('image')) {
$file = $request->file('image');
$http = $http->attach('lampiran', file_get_contents($file), $file->getClientOriginalName());
$payload['pegawai_ids[0]'] = session('user_id');
} else {
$payload['pegawai_ids'] = [session('user_id')];
}
// Post with _method=PUT to handle multipart update safely
$response = $http->post($this->apiUrl('/penugasan/' . $id), $payload);
if ($response->successful()) {
return redirect()->route('activity.detail', $id)
->with('success', 'Data berhasil diperbarui');
}
return back()->with('error', 'Gagal memperbarui: ' . $response->json('message'));
}
// 🔥 SELESAIKAN ACTIVITY
public function selesai($id)
{
$responseCheck = \Illuminate\Support\Facades\Http::withToken(session('api_token'))->get($this->apiUrl('/penugasan/' . $id));
if ($responseCheck->successful()) {
$data = $responseCheck->json()['data'];
$isPetugas = false;
if(isset($data['petugas'])) {
foreach($data['petugas'] as $p) {
if($p['id'] == session('user_id')) {
$isPetugas = true; break;
}
}
}
if (!$isPetugas) {
return redirect()->route('activity.list')->with('error', 'Anda tidak memiliki hak untuk menyelesaikan laporan ini.');
}
}
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->post($this->apiUrl("/penugasan/{$id}/update-status"), [
'status' => 'selesai'
]);
if ($response->successful()) {
return back()->with('success', 'Kegiatan telah ditandai sebagai Selesai');
}
return back()->with('error', 'Gagal menandai selesai');
}
public function storeProgress(Request $request, $id)
{
$responseCheck = \Illuminate\Support\Facades\Http::withToken(session('api_token'))->get($this->apiUrl('/penugasan/' . $id));
if ($responseCheck->successful()) {
$data = $responseCheck->json()['data'];
$isPetugas = false;
if(isset($data['petugas'])) {
foreach($data['petugas'] as $p) {
if($p['id'] == session('user_id')) {
$isPetugas = true; break;
}
}
}
if (!$isPetugas) {
return redirect()->route('activity.list')->with('error', 'Anda tidak memiliki hak untuk menambahkan progress pada laporan ini.');
}
}
$request->validate([
'note' => 'required|string',
'attachment' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048'
]);
$http = \Illuminate\Support\Facades\Http::withToken(session('api_token'));
if ($request->hasFile('attachment')) {
$file = $request->file('attachment');
$http = $http->attach(
'attachment',
file_get_contents($file->getPathname()),
$file->getClientOriginalName()
);
}
$response = $http->post($this->apiUrl("/penugasan/{$id}/progress"), [
'note' => $request->note,
]);
if ($response->successful()) {
return back()->with('success', 'Progres / Log pembaruan berhasil ditambahkan.');
}
return back()->with('error', 'Gagal menambahkan progres: ' . $response->json('message', 'Error'));
}
/**
* ==========================================
* AREA ADMIN (KASI / KABID)
* ==========================================
*/
public function adminDashboard()
{
$response = \Illuminate\Support\Facades\Http::withToken(session('api_token'))
->acceptJson()
->get($this->apiUrl('/dashboard'));
$stats = ['total' => 0, 'selesai' => 0, 'proses' => 0, 'users' => 0];
$activities = collect([]);
if ($response->successful()) {
$data = $response->json();
if (isset($data['data']['stats'])) {
$st = $data['data']['stats'];
$stats['total'] = $st['total_tugas'] ?? 0;
$stats['selesai'] = ($st['status_selesai'] ?? 0) + ($st['status_ditinjau'] ?? 0);
$stats['proses'] = $st['status_proses'] ?? 0;
}
if (isset($data['data']['recent_activities'])) {
$activities = collect($data['data']['recent_activities'])->map(function($item) {
$petugasNames = 'System';
if (!empty($item['petugas']) && is_array($item['petugas'])) {
$names = [];
foreach ($item['petugas'] as $p) {
if (isset($p['username'])) {
$names[] = $p['username'];
} elseif (isset($p['name'])) {
$names[] = $p['name'];
}
}
if (!empty($names)) {
$petugasNames = implode(', ', $names);
}
}
return (object) [
'id' => $item['id'],
'nama_kegiatan' => $item['kegiatan'],
'tanggal' => $item['tanggal_mulai'],
'tanggal_selesai' => $item['tanggal_selesai'] ?? null,
'status' => $item['status'] == 'proses' ? 'on_progres' : $item['status'],
'user' => (object) ['name' => $petugasNames],
'keterangan' => $item['keterangan'] ?? $item['kegiatan'] ?? '-',
'status_note' => $item['status_note'] ?? null,
'lokasi' => $item['lokasi'] ?? '-',
'lampiran' => $item['lampiran'] ?? null
];
});
}
}
// Mock data karena backend belum support
$topUsers = [];
$weeklyData = [0, 0, 0, 0, 0, 0, 0];
$divisionProgress = [
['name' => 'Operasional', 'value' => 75, 'color' => '#378ADD'],
['name' => 'IT', 'value' => 45, 'color' => '#E24B4A'],
['name' => 'SDM', 'value' => 90, 'color' => '#EF9F27'],
];
return view('admin.dashboard', compact(
'activities',
'stats',
'weeklyData',
'topUsers',
'divisionProgress'
));
}
}