diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 3ee9d16..6ed516c 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -12,6 +12,7 @@ use App\Models\MasterKlasifikasi; use App\Models\Notifkasi; use App\Models\SubUnitKerja; use App\Models\UnitKerja; +use App\Models\DataUser; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -88,6 +89,41 @@ class PdfFpdiWithAlpha extends Fpdi class DashboardController extends Controller { + private function attachDeleteRecommendationMeta($items, $viewerPegawaiId) + { + $collection = collect($items); + $recommenderIds = $collection->pluck('turt_by') + ->filter(fn ($id) => !empty($id)) + ->map(fn ($id) => (int) $id) + ->unique() + ->values(); + + $recommenderNames = $recommenderIds->isEmpty() + ? collect() + : DataUser::whereIn('id', $recommenderIds->all())->pluck('namalengkap', 'id'); + + return $collection->map(function ($item) use ($viewerPegawaiId, $recommenderNames) { + $viewerId = $viewerPegawaiId ? (int) $viewerPegawaiId : null; + $entryId = !empty($item->pegawai_id_entry) ? (int) $item->pegawai_id_entry : null; + $recommenderId = !empty($item->turt_by) ? (int) $item->turt_by : null; + + $canViewRecommendation = (bool) ($item->hapus_turt ?? false) + && !empty($item->note_hapus_turt) + && $viewerId !== null + && ($viewerId === $entryId || $viewerId === $recommenderId); + + $item->delete_recommendation = $canViewRecommendation ? [ + 'visible' => true, + 'note' => $item->note_hapus_turt, + 'actor_name' => $recommenderNames->get($recommenderId) ?? 'TURT', + 'actor_role' => 'TURT', + 'created_at' => $item->turt_at, + ] : null; + + return $item; + }); + } + // public function index(){ // $katDok = MasterKategori::where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get(); // $klasifikasiDok = MasterKlasifikasi::where('statusenabled', true)->select('master_klasifikasi_directory_id', 'nama_klasifikasi_directory')->get(); @@ -131,9 +167,7 @@ class DashboardController extends Controller public function index(){ $katDok = MasterKategori::where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get(); - $authMapping = auth()->user()?->dataUser?->mappingUnitKerjaPegawai() - ->where('isprimary', true) - ->first(); + $authMapping = auth()->user()?->dataUser?->mappingUnitKerjaPegawai()->where('isprimary', true)->first(); // dd(auth()->user()?->dataUser); $authUnitKerja = $authMapping->objectunitkerjapegawaifk ?? null; $authSubUnitKerja = $authMapping->objectsubunitkerjapegawaifk ?? null; @@ -287,6 +321,7 @@ class DashboardController extends Controller $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; return $item; }); + $items = $this->attachDeleteRecommendationMeta($items, $pegawaiId); $kategoriList = (clone $baseQuery)->get()->map(function($item){ if (!empty($item->kategori_hukum)) { return ['id' => 'hukum:' . $item->kategori_hukum, 'label' => $item->kategori_hukum]; @@ -1219,10 +1254,12 @@ class DashboardController extends Controller $data = $query->orderBy('entry_at', 'desc') ->paginate($perPage); + $pegawaiId = auth()->user()?->dataUser?->id; $items = collect($data->items())->map(function($item){ $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; return $item; }); + $items = $this->attachDeleteRecommendationMeta($items, $pegawaiId); $kategoriList = (clone $baseQuery)->get()->map(function($item){ if (!empty($item->kategori_hukum)) { @@ -1398,18 +1435,18 @@ class DashboardController extends Controller ]; $fd = FileDirectory::create($payload); - $disk = Storage::disk('s3'); + // $disk = Storage::disk('s3'); $imageName = $this->buildStoredFileName( $fd->nama_dokumen ?? null, $fd->file_directory_id, $uploadedFile->getClientOriginalExtension() ); - $disk->putFileAs( - $path, - $uploadedFile, - $imageName, - ['visibility' => 'private'] - ); + // $disk->putFileAs( + // $path, + // $uploadedFile, + // $imageName, + // ['visibility' => 'private'] + // ); $fd->update([ 'file' => $path . '/' . $imageName ]); @@ -1933,14 +1970,14 @@ class DashboardController extends Controller $needTurt->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); }); }) ->orWhere(function ($needMutu) { $needMutu->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); }); }); }); @@ -1959,7 +1996,7 @@ class DashboardController extends Controller $sub->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); }); }); } @@ -1969,7 +2006,7 @@ class DashboardController extends Controller $sub->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); }); }); } @@ -2393,7 +2430,7 @@ class DashboardController extends Controller $sub->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhereIn('status_turt', ['revised Turt']); }); }); } @@ -2403,7 +2440,7 @@ class DashboardController extends Controller $sub->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['revised Mutu']); }); }); } @@ -2846,7 +2883,7 @@ class DashboardController extends Controller $q->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); }); } if ($isKomiteMutu) { @@ -2855,7 +2892,7 @@ class DashboardController extends Controller $sub->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); }); }); } @@ -2873,14 +2910,14 @@ class DashboardController extends Controller $needTurt->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); }); }) ->orWhere(function ($needMutu) { $needMutu->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); }); }); }); @@ -2912,14 +2949,14 @@ class DashboardController extends Controller $needTurt->whereNotNull('master_kategori_directory_id') ->where(function ($pendingTurt) { $pendingTurt->whereNull('status_turt') - ->orWhere('status_turt', 'rejected'); + ->orWhere('status_turt', ['revised Turt', 'rejected Turt']); }); }) ->orWhere(function ($needMutu) { $needMutu->where('is_akre', true) ->where(function ($pendingMutu) { $pendingMutu->whereNull('status_mutu') - ->orWhere('status_mutu', 'rejected'); + ->orWhereIn('status_mutu', ['revised Mutu', 'rejected Mutu']); }); }); }); @@ -3124,34 +3161,32 @@ class DashboardController extends Controller } } $targetRoleNotifications = []; - $resetMutuApproval = $data->status_mutu === 'rejected'; - $resetTurtApproval = $data->status_turt === 'rejected'; + $resetMutuApproval = $data->status_mutu === 'rejected Mutu'; + $resetTurtApproval = $data->status_turt === 'rejected Turt'; $resetAtasanApproval = $data->status_action === 'rejected'; - + // dd($resetTurtApproval, $resetMutuApproval); if ($resetMutuApproval) { $payload['status_mutu'] = 'revised Mutu'; - $payload['mutu_revision'] = null; + // $payload['mutu_revision'] = null; $payload['action_mutu_at'] = null; $payload['action_mutu_by'] = null; $targetRoleNotifications[] = 51; } - if ($resetTurtApproval) { - $payload['status_turt'] = 'revised TURT'; - $payload['turt_revision'] = null; + $payload['status_turt'] = 'revised Turt'; + // $payload['turt_revision'] = null; $payload['action_turt_at'] = null; $payload['action_turt_by'] = null; $targetRoleNotifications[] = 22; } if($resetAtasanApproval){ - $payload['revision'] = null; + // $payload['revision'] = null; $payload['status_action'] = 'revised'; $payload['action_at'] = null; $payload['action_by'] = null; } - if (!empty($payload)) { $data->update($payload); } @@ -3940,14 +3975,11 @@ class DashboardController extends Controller ], 422); } $data->update([ - 'status_mutu' => 'rejected', + 'status_mutu' => 'rejected Mutu', 'action_mutu_at' => now(), 'action_mutu_by' => auth()->user()->dataUser->id, 'mutu_revision' => $revision, - 'revision' => 'Komite Mutu: ' . $revision, - 'status_action' => 'rejected', - 'action_at' => now(), - 'action_by' => auth()->user()->objectpegawaifk, + 'revision' => 'Komite Mutu: ' . $revision ]); $parts = array_values(array_filter(explode('/', $data->file))); @@ -4020,14 +4052,11 @@ class DashboardController extends Controller ], 422); } $data->update([ - 'status_turt' => 'rejected', + 'status_turt' => 'rejected Turt', 'action_turt_at' => now(), 'action_turt_by' => auth()->user()->dataUser->id, 'turt_revision' => $revision, 'revision' => 'TURT: ' . $revision, - 'status_action' => 'rejected', - 'action_at' => now(), - 'action_by' => auth()->user()->objectpegawaifk, ]); $parts = array_values(array_filter(explode('/', $data->file))); diff --git a/public/js/pendingFile/index.js b/public/js/pendingFile/index.js index dad946e..3765049 100644 --- a/public/js/pendingFile/index.js +++ b/public/js/pendingFile/index.js @@ -66,30 +66,49 @@ document.addEventListener('DOMContentLoaded', () => { } function approvalBadge(status, label){ - if (status === 'approved') return `Approved ${label}`; - if (status === 'rejected') return `Rejected ${label}`; + const normalized = String(status || '').toLowerCase(); + if (normalized === 'approved') return `Approved ${label}`; + if (normalized.startsWith('rejected')) return `Rejected ${label}`; + if (normalized.startsWith('revised')) return `Revised ${label}`; return `Pending ${label}`; } function getWorkflowStatusBadges(item){ - if (item?.status_mutu === 'rejected') return [`Rejected Mutu`]; - if (item?.status_turt === 'rejected') return [`Rejected TURT`]; - if (item?.status_action === 'rejected') return [`Rejected Atasan`]; - if (item?.status_action === 'revised') return [`Revised`]; + const actionStatus = String(item?.status_action || '').toLowerCase(); + const mutuStatus = String(item?.status_mutu || '').toLowerCase(); + const turtStatus = String(item?.status_turt || '').toLowerCase(); - if (item?.status_action !== 'approved') { + if (actionStatus.startsWith('revised')) { + return [`Revised`]; + } + + if (actionStatus.startsWith('rejected')) { + return [`Rejected Atasan`]; + } + + if (actionStatus !== 'approved') { return [`Pending Atasan`]; } const statuses = []; - if (item?.is_akre && item?.status_mutu !== 'approved') { - statuses.push(`Pending Mutu`); - } - if (item?.master_kategori_directory_id && item?.status_turt !== 'approved') { - statuses.push(`Pending TURT`); + + if (item?.is_akre) { + if (mutuStatus.startsWith('rejected')) { + statuses.push(`Rejected Mutu`); + } else if (mutuStatus !== 'approved') { + statuses.push(`Pending Mutu`); + } } - if (statuses.length) { + if (item?.master_kategori_directory_id) { + if (turtStatus.startsWith('rejected')) { + statuses.push(`Rejected TURT`); + } else if (turtStatus !== 'approved') { + statuses.push(`Pending TURT`); + } + } + + if (statuses.length > 0) { return statuses; } @@ -108,11 +127,18 @@ document.addEventListener('DOMContentLoaded', () => { } function isRejected(item){ - return item?.status_action === 'rejected' || item?.status_mutu === 'rejected' || item?.status_turt === 'rejected'; + return String(item?.status_action || '').toLowerCase().startsWith('rejected') + || String(item?.status_mutu || '').toLowerCase().startsWith('rejected') + || String(item?.status_turt || '').toLowerCase().startsWith('rejected'); } function isAtasanApproved(item){ - return item?.status_action === 'approved'; + return String(item?.status_action || '').toLowerCase() === 'approved'; + } + + function canProcessRoleStatus(status){ + const normalized = String(status || '').toLowerCase(); + return normalized === '' || normalized.startsWith('revised'); } function canApproveAsAtasan(item){ @@ -123,6 +149,62 @@ document.addEventListener('DOMContentLoaded', () => { return item?.can_edit_submission === true || item?.can_edit_submission === 1 || item?.can_edit_submission === '1'; } + function hasRevisionInfo(item){ + return !!(item?.revision || item?.mutu_revision || item?.turt_revision); + } + + function collectRevisionNotes(item){ + const notes = []; + const genericRevision = String(item?.revision || '').trim(); + const mutuRevision = String(item?.mutu_revision || '').trim(); + const turtRevision = String(item?.turt_revision || '').trim(); + + if (genericRevision) { + const lowerGeneric = genericRevision.toLowerCase(); + if (!lowerGeneric.startsWith('komite mutu:') && !lowerGeneric.startsWith('turt:')) { + notes.push({ label: 'Atasan', text: genericRevision }); + } + } + if (mutuRevision) { + notes.push({ label: 'Komite Mutu', text: mutuRevision }); + } + if (turtRevision) { + notes.push({ label: 'TURT', text: turtRevision }); + } + + return notes; + } + + function escapeHtml(value){ + return String(value ?? '') + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + function buildRevisionNotesHtml(notes){ + if (!notes.length) { + return '