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

206 lines
7.6 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class ActivityController extends Controller
{
private function apiUrl($endpoint = '')
{
return rtrim(env('BACKEND_API_URL'), '/') . '/' . ltrim($endpoint, '/');
}
/**
* FUNGSI DASHBOARD ADMIN
*/
public function dashboard()
{
$response = Http::withToken(session('api_token'))
->acceptJson()
->get($this->apiUrl('/dashboard'));
$stats = ['total' => 0, 'selesai' => 0, 'proses' => 0, 'users' => 0];
$activities = [];
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;
$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'],
'status' => $item['status'] == 'proses' ? 'on_progres' : $item['status'],
'user' => (object) ['name' => $petugasNames],
'keterangan' => $item['keterangan'] ?? $item['kegiatan'] ?? '-',
];
});
}
}
$topUsers = [];
$weeklyData = [0, 0, 0, 0, 0, 0, 0];
$divisionProgress = [
['name' => 'Operasional', 'pct' => 75, 'clr' => 'linear-gradient(90deg,#3b82f6,#6366f1)'],
['name' => 'IT', 'pct' => 45, 'clr' => 'linear-gradient(90deg,#a855f7,#ec4899)'],
['name' => 'SDM', 'pct' => 90, 'clr' => 'linear-gradient(90deg,#f97316,#f59e0b)'],
['name' => 'Keuangan', 'pct' => 64, 'clr' => 'linear-gradient(90deg,#22c55e,#10b981)'],
];
return view('admin.dashboard', compact(
'stats',
'activities',
'topUsers',
'weeklyData',
'divisionProgress'
));
}
/**
* HALAMAN INDEX (DAFTAR KEGIATAN DENGAN FILTER)
*/
public function index(Request $request)
{
$response = Http::withToken(session('api_token'))
->acceptJson()
->get($this->apiUrl('/penugasan'));
$items = collect([]);
if ($response->successful()) {
$data = $response->json();
$items = collect($data['data'])->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'],
'status' => $item['status'] == 'proses' ? 'on_progres' : $item['status'],
'user' => (object) ['name' => $petugasNames],
];
});
// Sembunyikan kegiatan yang sudah dibatalkan
$items = $items->filter(function($item) {
return $item->status !== 'dibatalkan';
})->values();
}
// Simpan semua item sebelum filter untuk statistik
$allItems = $items;
// FILTER SEARCH
if ($request->search) {
$search = strtolower($request->search);
$items = $items->filter(function($item) use ($search) {
return str_contains(strtolower($item->nama_kegiatan), $search) ||
str_contains(strtolower($item->user->name), $search);
});
}
// FILTER STATUS
if ($request->status && $request->status != 'semua') {
$items = $items->filter(function($item) use ($request) {
return $item->status === $request->status;
});
}
// Manual Pagination
$perPage = 8;
$currentPage = \Illuminate\Pagination\Paginator::resolveCurrentPage();
$currentItems = $items->slice(($currentPage - 1) * $perPage, $perPage)->all();
$activities = new \Illuminate\Pagination\LengthAwarePaginator($currentItems, count($items), $perPage, $currentPage, [
'path' => \Illuminate\Pagination\Paginator::resolveCurrentPath(),
'query' => $request->query(),
]);
$divisis = collect(['-']);
return view('admin.kegiatan.index', compact('activities', 'divisis', 'allItems'));
}
// DETAIL
public function show($id)
{
$response = Http::withToken(session('api_token'))
->acceptJson()
->get($this->apiUrl('/penugasan/' . $id));
if (!$response->successful()) {
return redirect()->route('admin.kegiatan.index')->with('error', 'Data tidak ditemukan');
}
$data = $response->json()['data'];
$petugas = collect($data['petugas'] ?? []);
$petugasNames = 'System';
if ($petugas->isNotEmpty()) {
$names = [];
foreach ($petugas as $p) {
if (isset($p['username'])) {
$names[] = $p['username'];
} elseif (isset($p['name'])) {
$names[] = $p['name'];
}
}
if (!empty($names)) {
$petugasNames = implode(', ', $names);
}
}
$activity = (object) [
'id' => $data['id'],
'nomor_surat' => $data['nomor_surat'] ?? '-',
'nama_kegiatan' => $data['kegiatan'],
'tanggal' => $data['tanggal_mulai'],
'tanggal_selesai' => $data['tanggal_selesai'] ?? null,
'lokasi' => '-',
'deskripsi' => '-',
'updated_at' => $data['updated_at'] ?? now(),
'status' => $data['status'] == 'proses' ? 'on_progres' : $data['status'],
'user' => (object) ['name' => $petugasNames],
'petugas' => $petugas,
];
return view('admin.kegiatan.detail', compact('activity'));
}
}