Compare commits

...

6 Commits

9 changed files with 345 additions and 104 deletions

View File

@ -1956,28 +1956,37 @@ class DashboardController extends Controller
$hasAtasanScope = !empty($objectpegawaifk); $hasAtasanScope = !empty($objectpegawaifk);
// 51 / Komite Mutu // 51 / Komite Mutu
// 22 / turt // 22 / turt
$query = FileDirectory::where('statusenabled', true); $query = FileDirectory::query()
->from('public.file_directory as fd')
->select([
'fd.*',
'k.nama_kategori_directory',
'u.name as nama_unit',
])
->where('fd.statusenabled', true)
->leftJoin('public.master_kategori_directory as k', 'k.master_kategori_directory_id', '=','fd.master_kategori_directory_id')
->leftJoin('public.unitkerjapegawai_m as u', 'u.id', '=', 'fd.id_unit_kerja');
$query->where(function ($root) use ($isKomiteMutu, $isTurt, $hasAtasanScope, $objectpegawaifk) { $query->where(function ($root) use ($isKomiteMutu, $isTurt, $hasAtasanScope, $objectpegawaifk) {
if ($hasAtasanScope) { if ($hasAtasanScope) {
$root->where(function ($atasanQuery) use ($objectpegawaifk, $hasAtasanScope) { $root->where(function ($atasanQuery) use ($objectpegawaifk, $hasAtasanScope) {
$atasanQuery->whereIn('pegawai_id_entry', $objectpegawaifk)->where(function ($qsa) { $atasanQuery->whereIn('fd.pegawai_id_entry', $objectpegawaifk)->where(function ($qsa) {
$qsa->where('status_action', '!=', 'approved') $qsa->where('fd.status_action', '!=', 'approved')
->orWhereNull('status_action') ->orWhereNull('fd.status_action')
->orWhere(function ($approvedButPending) { ->orWhere(function ($approvedButPending) {
$approvedButPending->where(function ($needFurtherApproval) { $approvedButPending->where(function ($needFurtherApproval) {
$needFurtherApproval $needFurtherApproval
->where(function ($needTurt) { ->where(function ($needTurt) {
$needTurt->whereNotNull('master_kategori_directory_id') $needTurt->whereNotNull('fd.master_kategori_directory_id')
->where(function ($pendingTurt) { ->where(function ($pendingTurt) {
$pendingTurt->whereNull('status_turt') $pendingTurt->whereNull('fd.status_turt')
->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); ->orWhereIn('fd.status_turt', ['rejected Turt', 'revised Turt']);
}); });
}) })
->orWhere(function ($needMutu) { ->orWhere(function ($needMutu) {
$needMutu->where('is_akre', true) $needMutu->where('fd.is_akre', true)
->where(function ($pendingMutu) { ->where(function ($pendingMutu) {
$pendingMutu->whereNull('status_mutu') $pendingMutu->whereNull('fd.status_mutu')
->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); ->orWhereIn('fd.status_mutu', ['rejected Mutu', 'revised Mutu']);
}); });
}); });
}); });
@ -1989,24 +1998,24 @@ class DashboardController extends Controller
if ($isKomiteMutu || $isTurt) { if ($isKomiteMutu || $isTurt) {
$method = $hasAtasanScope ? 'orWhere' : 'where'; $method = $hasAtasanScope ? 'orWhere' : 'where';
$root->{$method}(function ($roleQuery) use ($isKomiteMutu, $isTurt) { $root->{$method}(function ($roleQuery) use ($isKomiteMutu, $isTurt) {
$roleQuery->where('status_action', 'approved') $roleQuery->where('fd.status_action', 'approved')
->where(function ($q) use ($isKomiteMutu, $isTurt) { ->where(function ($q) use ($isKomiteMutu, $isTurt) {
if ($isTurt) { if ($isTurt) {
$q->where(function ($sub) { $q->where(function ($sub) {
$sub->whereNotNull('master_kategori_directory_id') $sub->whereNotNull('fd.master_kategori_directory_id')
->where(function ($pendingTurt) { ->where(function ($pendingTurt) {
$pendingTurt->whereNull('status_turt') $pendingTurt->whereNull('fd.status_turt')
->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); ->orWhereIn('fd.status_turt', ['rejected Turt', 'revised Turt']);
}); });
}); });
} }
if ($isKomiteMutu) { if ($isKomiteMutu) {
$innerMethod = $isTurt ? 'orWhere' : 'where'; $innerMethod = $isTurt ? 'orWhere' : 'where';
$q->{$innerMethod}(function ($sub) { $q->{$innerMethod}(function ($sub) {
$sub->where('is_akre', true) $sub->where('fd.is_akre', true)
->where(function ($pendingMutu) { ->where(function ($pendingMutu) {
$pendingMutu->whereNull('status_mutu') $pendingMutu->whereNull('fd.status_mutu')
->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); ->orWhereIn('fd.status_mutu', ['rejected Mutu', 'revised Mutu']);
}); });
}); });
} }
@ -2016,20 +2025,47 @@ class DashboardController extends Controller
}); });
$query->when($keyword, function ($q) use ($keyword) { $query->when($keyword, function ($q) use ($keyword) {
$q->where(function ($sub) use ($keyword) { $q->where(function ($sub) use ($keyword) {
$sub->where('nama_dokumen', 'ILIKE', "%{$keyword}%") $sub->where('fd.nama_dokumen', 'ILIKE', "%{$keyword}%")
->orWhere('no_dokumen', 'ILIKE', "%{$keyword}%"); ->orWhere('fd.no_dokumen', 'ILIKE', "%{$keyword}%");
}); });
}); });
if($start){ if($start){
$query->whereDate('entry_at','>=',$start); $query->whereDate('fd.entry_at','>=',$start);
} }
if($end){ if($end){
$query->whereDate('entry_at','<=',$end); $query->whereDate('fd.entry_at','<=',$end);
} }
$paginated = $query->paginate($perPage); $paginated = $query->paginate($perPage);
$data = $paginated->getCollection()->map(function($item) use($objectpegawaifk, $pegawaiId){ $data = $paginated->getCollection()->map(function($item) use($objectpegawaifk, $pegawaiId){
$dataSlice = array_values(array_filter(explode('/', $item->file))); $dataSlice = array_values(array_filter(explode('/', $item->file)));
$kategori = null;
if ($item->is_akre) {
$kategori = 'Dokumen Akreditasi (' . $dataSlice[0] . '/' . $dataSlice[1] . ')';
if (!empty($item->nama_kategori_directory)) {
$kategori .= ' ' . $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ' - ' . $item->kategori_hukum;
}
} else {
$kategori = '';
if (!empty($item->nama_kategori_directory)) {
$kategori .= $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ($kategori ? ' - ' : '') . $item->kategori_hukum;
}
// Jika keduanya kosong
if ($kategori === '') {
$kategori = '-';
}
}
return [ return [
'file_directory_id' => $item->file_directory_id, 'file_directory_id' => $item->file_directory_id,
'pegawai_nama_entry' => $item->pegawai_nama_entry, 'pegawai_nama_entry' => $item->pegawai_nama_entry,
@ -2055,6 +2091,8 @@ class DashboardController extends Controller
'can_approve_atasan' => in_array($item->pegawai_id_entry, $objectpegawaifk), 'can_approve_atasan' => in_array($item->pegawai_id_entry, $objectpegawaifk),
'can_edit_submission' => (int) $item->pegawai_id_entry === (int) $pegawaiId, 'can_edit_submission' => (int) $item->pegawai_id_entry === (int) $pegawaiId,
'revision' => $item->revision, 'revision' => $item->revision,
'kategori' => $kategori,
'nama_unit' => $item->nama_unit,
]; ];
}); });
return response()->json([ return response()->json([
@ -2873,51 +2911,60 @@ class DashboardController extends Controller
}) })
->exists(); ->exists();
$query = FileDirectory::with('kategori')->where('statusenabled', true); $query = FileDirectory::query()
->from('public.file_directory as fd')
->select([
'fd.*',
'k.nama_kategori_directory',
'u.name as nama_unit',
])
->leftJoin('public.master_kategori_directory as k', 'k.master_kategori_directory_id', '=', 'fd.master_kategori_directory_id')
->leftJoin('public.unitkerjapegawai_m as u', 'u.id', '=', 'fd.id_unit_kerja')
->where('fd.statusenabled', true);
if ($mode === 'persetujuan' && ($isKomiteMutu || $isTurt || $isAtasan)) { if ($mode === 'persetujuan' && ($isKomiteMutu || $isTurt || $isAtasan)) {
$query->where(function ($root) use ($isKomiteMutu, $isTurt, $isAtasan, $pegawaiId) { $query->where(function ($root) use ($isKomiteMutu, $isTurt, $isAtasan, $pegawaiId) {
if ($isKomiteMutu || $isTurt) { if ($isKomiteMutu || $isTurt) {
$root->where(function ($q) use ($isKomiteMutu, $isTurt) { $root->where(function ($q) use ($isKomiteMutu, $isTurt) {
if ($isTurt) { if ($isTurt) {
$q->whereNotNull('master_kategori_directory_id') $q->whereNotNull('fd.master_kategori_directory_id')
->where(function ($pendingTurt) { ->where(function ($pendingTurt) {
$pendingTurt->whereNull('status_turt') $pendingTurt->whereNull('fd.status_turt')
->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); ->orWhereIn('fd.status_turt', ['rejected Turt', 'revised Turt']);
}); });
} }
if ($isKomiteMutu) { if ($isKomiteMutu) {
$method = $isTurt ? 'orWhere' : 'where'; $method = $isTurt ? 'orWhere' : 'where';
$q->{$method}(function ($sub) { $q->{$method}(function ($sub) {
$sub->where('is_akre', true) $sub->where('fd.is_akre', true)
->where(function ($pendingMutu) { ->where(function ($pendingMutu) {
$pendingMutu->whereNull('status_mutu') $pendingMutu->whereNull('fd.status_mutu')
->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); ->orWhereIn('fd.status_mutu', ['rejected Mutu', 'revised Mutu']);
}); });
}); });
} }
})->where('status_action', 'approved'); })->where('fd.status_action', 'approved');
} }
if ($isAtasan) { if ($isAtasan) {
$method = ($isKomiteMutu || $isTurt) ? 'orWhere' : 'where'; $method = ($isKomiteMutu || $isTurt) ? 'orWhere' : 'where';
$root->{$method}(function ($ownSubmission) use ($pegawaiId) { $root->{$method}(function ($ownSubmission) use ($pegawaiId) {
$ownSubmission->where('pegawai_id_entry', $pegawaiId) $ownSubmission->where('fd.pegawai_id_entry', $pegawaiId)
->where('status_action', 'approved') ->where('fd.status_action', 'approved')
->where(function ($needFurtherApproval) { ->where(function ($needFurtherApproval) {
$needFurtherApproval $needFurtherApproval
->where(function ($needTurt) { ->where(function ($needTurt) {
$needTurt->whereNotNull('master_kategori_directory_id') $needTurt->whereNotNull('fd.master_kategori_directory_id')
->where(function ($pendingTurt) { ->where(function ($pendingTurt) {
$pendingTurt->whereNull('status_turt') $pendingTurt->whereNull('fd.status_turt')
->orWhereIn('status_turt', ['rejected Turt', 'revised Turt']); ->orWhereIn('fd.status_turt', ['rejected Turt', 'revised Turt']);
}); });
}) })
->orWhere(function ($needMutu) { ->orWhere(function ($needMutu) {
$needMutu->where('is_akre', true) $needMutu->where('fd.is_akre', true)
->where(function ($pendingMutu) { ->where(function ($pendingMutu) {
$pendingMutu->whereNull('status_mutu') $pendingMutu->whereNull('fd.status_mutu')
->orWhereIn('status_mutu', ['rejected Mutu', 'revised Mutu']); ->orWhereIn('fd.status_mutu', ['rejected Mutu', 'revised Mutu']);
}); });
}); });
}); });
@ -2925,38 +2972,38 @@ class DashboardController extends Controller
} }
}); });
} else { } else {
$query->where('pegawai_id_entry', $pegawaiId) $query->where('fd.pegawai_id_entry', $pegawaiId)
->when($isHistory, function($q){ ->when($isHistory, function($q){
$q->where('status_action', 'approved') $q->where('fd.status_action', 'approved')
->where(function ($sub) { ->where(function ($sub) {
$sub->whereNull('master_kategori_directory_id') $sub->whereNull('fd.master_kategori_directory_id')
->orWhere('status_turt', 'approved'); ->orWhere('fd.status_turt', 'approved');
}) })
->where(function ($sub) { ->where(function ($sub) {
$sub->where('is_akre', '!=', true) $sub->where('fd.is_akre', '!=', true)
->orWhereNull('is_akre') ->orWhereNull('fd.is_akre')
->orWhere('status_mutu', 'approved'); ->orWhere('fd.status_mutu', 'approved');
}); });
}, function($q){ }, function($q){
$q->where(function($sub){ $q->where(function($sub){
$sub->where('status_action', '!=', 'approved') $sub->where('fd.status_action', '!=', 'approved')
->orWhereNull('status_action') ->orWhereNull('fd.status_action')
->orWhere(function ($approvedButPending) { ->orWhere(function ($approvedButPending) {
$approvedButPending->where('status_action', 'approved') $approvedButPending->where('fd.status_action', 'approved')
->where(function ($needFurtherApproval) { ->where(function ($needFurtherApproval) {
$needFurtherApproval $needFurtherApproval
->where(function ($needTurt) { ->where(function ($needTurt) {
$needTurt->whereNotNull('master_kategori_directory_id') $needTurt->whereNotNull('fd.master_kategori_directory_id')
->where(function ($pendingTurt) { ->where(function ($pendingTurt) {
$pendingTurt->whereNull('status_turt') $pendingTurt->whereNull('fd.status_turt')
->orWhere('status_turt', ['revised Turt', 'rejected Turt']); ->orWhereIn('fd.status_turt', ['revised Turt', 'rejected Turt']);
}); });
}) })
->orWhere(function ($needMutu) { ->orWhere(function ($needMutu) {
$needMutu->where('is_akre', true) $needMutu->where('fd.is_akre', true)
->where(function ($pendingMutu) { ->where(function ($pendingMutu) {
$pendingMutu->whereNull('status_mutu') $pendingMutu->whereNull('fd.status_mutu')
->orWhereIn('status_mutu', ['revised Mutu', 'rejected Mutu']); ->orWhereIn('fd.status_mutu', ['revised Mutu', 'rejected Mutu']);
}); });
}); });
}); });
@ -2965,23 +3012,50 @@ class DashboardController extends Controller
}); });
} }
$query->orderBy('entry_at','desc'); $query->orderBy('fd.entry_at','desc');
if($keyword){ if($keyword){
$query->where(function($q) use ($keyword){ $query->where(function($q) use ($keyword){
$q->where('file', 'ILIKE', "%{$keyword}%") $q->where('fd.file', 'ILIKE', "%{$keyword}%")
->orWhere('no_dokumen', 'ILIKE', "%{$keyword}%") ->orWhere('fd.no_dokumen', 'ILIKE', "%{$keyword}%")
->orWhere('nama_dokumen', 'ILIKE', "%{$keyword}%"); ->orWhere('fd.nama_dokumen', 'ILIKE', "%{$keyword}%");
}); });
} }
if($start){ if($start){
$query->whereDate('entry_at','>=',$start); $query->whereDate('fd.entry_at','>=',$start);
} }
if($end){ if($end){
$query->whereDate('entry_at','<=',$end); $query->whereDate('fd.entry_at','<=',$end);
} }
$paginated = $query->paginate($perPage); $paginated = $query->paginate($perPage);
$data = $paginated->getCollection()->map(function($item){ $data = $paginated->getCollection()->map(function($item){
$dataSlice = array_values(array_filter(explode('/', $item->file))); $dataSlice = array_values(array_filter(explode('/', $item->file)));
$kategori = null;
if ($item->is_akre) {
$kategori = 'Dokumen Akreditasi (' . $dataSlice[0] . '/' . $dataSlice[1] . ')';
if (!empty($item->nama_kategori_directory)) {
$kategori .= ' ' . $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ' - ' . $item->kategori_hukum;
}
} else {
$kategori = '';
if (!empty($item->nama_kategori_directory)) {
$kategori .= $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ($kategori ? ' - ' : '') . $item->kategori_hukum;
}
// Jika keduanya kosong
if ($kategori === '') {
$kategori = '-';
}
}
return [ return [
'file_directory_id' => $item->file_directory_id, 'file_directory_id' => $item->file_directory_id,
'pegawai_nama_entry' => $item->pegawai_nama_entry, 'pegawai_nama_entry' => $item->pegawai_nama_entry,
@ -3006,9 +3080,9 @@ class DashboardController extends Controller
'master_kategori_directory_id' => $item->master_kategori_directory_id, 'master_kategori_directory_id' => $item->master_kategori_directory_id,
'is_akre' => $item->is_akre, 'is_akre' => $item->is_akre,
'kategori_hukum' => $item->kategori_hukum, 'kategori_hukum' => $item->kategori_hukum,
'name_kategori' => $item->kategori_hukum ?? $item->kategori?->nama_kategori_directory ?? null, 'name_kategori' => $item->kategori_hukum ?? $item->nama_kategori_directory ?? null,
'name_unit' => $item->unit?->name ?? null, 'nama_unit' => $item->nama_unit,
'unit_kerja_name' => $item->unit?->name ?? null 'kategori' => $kategori,
]; ];
}); });
return response()->json([ return response()->json([
@ -3296,6 +3370,8 @@ class DashboardController extends Controller
$query = LogActivity::query() $query = LogActivity::query()
->from('logging.log_activity_file_directory as log') ->from('logging.log_activity_file_directory as log')
->leftJoin('public.file_directory as fd', 'fd.file_directory_id', '=', 'log.file_directory_id') ->leftJoin('public.file_directory as fd', 'fd.file_directory_id', '=', 'log.file_directory_id')
->leftJoin('public.master_kategori_directory as k', 'k.master_kategori_directory_id', '=','fd.master_kategori_directory_id')
->leftJoin('public.unitkerjapegawai_m as u', 'u.id', '=', 'log.id_unit_kerja')
->where('log.statusenabled', true) ->where('log.statusenabled', true)
->whereNotIn('log.action_type', ['Membuka Dokumen', 'Download Dokumen']) ->whereNotIn('log.action_type', ['Membuka Dokumen', 'Download Dokumen'])
->select([ ->select([
@ -3311,6 +3387,10 @@ class DashboardController extends Controller
'fd.permission_file', 'fd.permission_file',
'fd.tanggal_terbit', 'fd.tanggal_terbit',
'fd.tgl_expired', 'fd.tgl_expired',
'fd.is_akre',
'fd.kategori_hukum',
'u.name as nama_unit',
'k.nama_kategori_directory'
]); ]);
if ($isAtasan) { if ($isAtasan) {
@ -3322,7 +3402,7 @@ class DashboardController extends Controller
->values() ->values()
->all(); ->all();
if (!empty($unitIds)) { if (!empty($unitIds)) {
$query->whereIn('log.id_unit_kerja', $unitIds); $query->whereIn('log.id_unit_kerja', $unitIds)->orWhere('log.pegawai_id_entry', auth()->user()->objectpegawaifk);
} else { } else {
$query->whereRaw('1 = 0'); $query->whereRaw('1 = 0');
} }
@ -3348,6 +3428,33 @@ class DashboardController extends Controller
$paginated = $query->orderBy('log.entry_at', 'desc')->paginate($perPage); $paginated = $query->orderBy('log.entry_at', 'desc')->paginate($perPage);
$data = $paginated->getCollection()->map(function ($item) { $data = $paginated->getCollection()->map(function ($item) {
$parts = array_values(array_filter(explode('/', (string) $item->file))); $parts = array_values(array_filter(explode('/', (string) $item->file)));
$kategori = null;
if ($item->is_akre) {
$kategori = 'Dokumen Akreditasi (' . $parts[0] . '/' . $parts[1] . ')';
if (!empty($item->nama_kategori_directory)) {
$kategori .= ' ' . $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ' - ' . $item->kategori_hukum;
}
} else {
$kategori = '';
if (!empty($item->nama_kategori_directory)) {
$kategori .= $item->nama_kategori_directory;
}
if (!empty($item->kategori_hukum)) {
$kategori .= ($kategori ? ' - ' : '') . $item->kategori_hukum;
}
// Jika keduanya kosong
if ($kategori === '') {
$kategori = '-';
}
}
return [ return [
'file_directory_id' => $item->file_directory_id, 'file_directory_id' => $item->file_directory_id,
'pegawai_nama_entry' => $item->pegawai_nama_entry, 'pegawai_nama_entry' => $item->pegawai_nama_entry,
@ -3362,6 +3469,8 @@ class DashboardController extends Controller
'tgl_expired' => $item->tgl_expired, 'tgl_expired' => $item->tgl_expired,
'permission_file' => $item->permission_file, 'permission_file' => $item->permission_file,
'action_type' => $item->action_type, 'action_type' => $item->action_type,
'nama_unit' => $item->nama_unit,
'kategori' => $kategori ?? '-',
]; ];
}); });
@ -3855,10 +3964,26 @@ class DashboardController extends Controller
'mod_change' => null, 'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null, 'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null, 'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Approved Dokumen Mutu', 'action_type' => 'Approved Dokumen Mutu By ' . auth()->user()?->dataUser?->namalengkap,
]; ];
LogActivity::create($payloadLog); LogActivity::create($payloadLog);
$payloadLogApprovedByMutu = [
'file_directory_id' => $data->file_directory_id,
'pegawai_id_entry' => auth()->user()->objectpegawaifk,
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
'entry_at' => now(),
'file' => $data->file,
'statusenabled' => true,
'nama_dokumen' => $data->nama_dokumen ?? null,
'no_dokumen' => $data->no_dokumen ?? null,
'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Approved Dokumen Mutu',
];
LogActivity::create($payloadLogApprovedByMutu);
DB::connection('dbDirectory')->commit(); DB::connection('dbDirectory')->commit();
return response()->json([ return response()->json([
'status' => true, 'status' => true,
@ -3927,10 +4052,26 @@ class DashboardController extends Controller
'mod_change' => null, 'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null, 'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null, 'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Approved Dokumen Turt', 'action_type' => 'Approved Dokumen Turt By '. auth()->user()?->dataUser?->namalengkap ,
]; ];
LogActivity::create($payloadLog); LogActivity::create($payloadLog);
$payloadLogApprovedTurt = [
'file_directory_id' => $data->file_directory_id,
'pegawai_id_entry' => auth()->user()?->objectpegawaifk,
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
'entry_at' => now(),
'file' => $data->file,
'statusenabled' => true,
'nama_dokumen' => $data->nama_dokumen ?? null,
'no_dokumen' => $data->no_dokumen ?? null,
'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Approved Dokumen Turt',
];
LogActivity::create($payloadLogApprovedTurt);
DB::connection('dbDirectory')->commit(); DB::connection('dbDirectory')->commit();
return response()->json([ return response()->json([
'status' => true, 'status' => true,
@ -4006,9 +4147,25 @@ class DashboardController extends Controller
'no_dokumen' => $data->no_dokumen ?? null, 'no_dokumen' => $data->no_dokumen ?? null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null, 'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null, 'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Rejected Dokumen Mutu', 'action_type' => 'Rejected Dokumen Mutu By '. auth()->user()?->dataUser?->namalengkap,
]; ];
LogActivity::create($payloadLog); LogActivity::create($payloadLog);
$payloadLogRejectedByMutu = [
'file_directory_id' => $data->file_directory_id,
'pegawai_id_entry' => auth()->user()->objectpegawaifk,
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
'entry_at' => now(),
'file' => $data->file,
'statusenabled' => true,
'nama_dokumen' => $data->nama_dokumen ?? null,
'no_dokumen' => $data->no_dokumen ?? null,
'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Rejected Dokumen Mutu',
];
LogActivity::create($payloadLogRejectedByMutu);
DB::connection('dbDirectory')->commit(); DB::connection('dbDirectory')->commit();
return response()->json([ return response()->json([
'status' => true, 'status' => true,
@ -4084,9 +4241,25 @@ class DashboardController extends Controller
'mod_change' => null, 'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null, 'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null, 'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Rejected Dokumen Turt', 'action_type' => 'Rejected Dokumen Turt By ' . auth()->user()?->dataUser?->namalengkap
]; ];
LogActivity::create($payloadLog); LogActivity::create($payloadLog);
$payloadLogApprovedByTurt = [
'file_directory_id' => $data->file_directory_id,
'pegawai_id_entry' => auth()->user()->objectpegawaifk,
'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap,
'entry_at' => now(),
'file' => $data->file,
'statusenabled' => true,
'nama_dokumen' => $data->nama_dokumen ?? null,
'no_dokumen' => $data->no_dokumen ?? null,
'mod_change' => null,
'id_unit_kerja' => $data ? $data->id_unit_kerja : null,
'id_sub_unit_kerja' => $data ? $data->id_sub_unit_kerja : null,
'action_type' => 'Rejected Dokumen Turt',
];
LogActivity::create($payloadLogApprovedByTurt);
DB::connection('dbDirectory')->commit(); DB::connection('dbDirectory')->commit();
return response()->json([ return response()->json([
'status' => true, 'status' => true,

View File

@ -1,8 +1,10 @@
<?php <?php
use Illuminate\Http\Request;
use Illuminate\Foundation\Application; use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware; use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Session\TokenMismatchException;
return Application::configure(basePath: dirname(__DIR__)) return Application::configure(basePath: dirname(__DIR__))
->withRouting( ->withRouting(
@ -17,5 +19,24 @@ return Application::configure(basePath: dirname(__DIR__))
]); ]);
}) })
->withExceptions(function (Exceptions $exceptions): void { ->withExceptions(function (Exceptions $exceptions): void {
// $exceptions->render(function (TokenMismatchException $exception, Request $request) {
$message = 'Sesi halaman sudah habis. Silakan login ulang.';
if ($request->is('login')) {
return redirect()
->route('login')
->withInput($request->only('namauser'))
->with('alertError', 'expired');
}
if (!$request->expectsJson()) {
return redirect()
->guest(route('login'))
->with('alertError', 'expired-session');
}
return response()->json([
'message' => $message,
], 419);
});
})->create(); })->create();

View File

@ -323,8 +323,8 @@ document.addEventListener('DOMContentLoaded', () => {
data-no_dokumen="${item.no_dokumen || '-'}" data-no_dokumen="${item.no_dokumen || '-'}"
data-tanggal_terbit="${item.tanggal_terbit || '-'}" data-tanggal_terbit="${item.tanggal_terbit || '-'}"
data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td> data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td>
<td class="col-kategori"><div class="cell-wrap">${safeText(item.folder)}</div></td> <td class="col-kategori"><div class="cell-wrap">${safeText(item.kategori)}</div></td>
<td class="col-unit"><div class="cell-wrap">${safeText(item.part)}</div></td> <td class="col-unit"><div class="cell-wrap">${safeText(item.nama_unit)}</div></td>
<td class="text-nowrap">${tanggalTerbit}</td> <td class="text-nowrap">${tanggalTerbit}</td>
<td class="text-nowrap">${tanggalExp}</td> <td class="text-nowrap">${tanggalExp}</td>
<td class="text-nowrap">${tanggal}</td> <td class="text-nowrap">${tanggal}</td>
@ -334,6 +334,7 @@ document.addEventListener('DOMContentLoaded', () => {
} }
function buildHistoryRow(item){ function buildHistoryRow(item){
const tanggal = item.entry_at ? formatTanggal(item.entry_at) : '-'; const tanggal = item.entry_at ? formatTanggal(item.entry_at) : '-';
const tanggalExp = item.tgl_expired ? formatTanggal(item.tgl_expired) : '-'; const tanggalExp = item.tgl_expired ? formatTanggal(item.tgl_expired) : '-';
const tanggalTerbit = item.tanggal_terbit ? formatTanggal(item.tanggal_terbit) : '-'; const tanggalTerbit = item.tanggal_terbit ? formatTanggal(item.tanggal_terbit) : '-';
@ -349,11 +350,9 @@ document.addEventListener('DOMContentLoaded', () => {
data-no_dokumen="${item.no_dokumen || '-'}" data-no_dokumen="${item.no_dokumen || '-'}"
data-tanggal_terbit="${item.tanggal_terbit || '-'}" data-tanggal_terbit="${item.tanggal_terbit || '-'}"
data-permission_file="${item.permission_file || '-'}">${safeText(item.nama_dokumen)}</a></td> data-permission_file="${item.permission_file || '-'}">${safeText(item.nama_dokumen)}</a></td>
<td>${safeText(item.folder)}</td> <td>${safeText(item.kategori)}</td>
<td>${safeText(item.part)}</td> <td>${safeText(item.nama_unit)}</td>
<td><span class="badge bg-info">${actionType}</span></td> <td><span class="badge bg-info">${actionType}</span></td>
<td class="text-nowrap">${tanggalTerbit}</td>
<td class="text-nowrap">${tanggalExp}</td>
<td class="text-nowrap">${tanggal}</td> <td class="text-nowrap">${tanggal}</td>
</tr> </tr>
`; `;

View File

@ -285,15 +285,8 @@ document.addEventListener('DOMContentLoaded', () => {
data-no_dokumen="${item.no_dokumen || '-'}" data-no_dokumen="${item.no_dokumen || '-'}"
data-tanggal_terbit="${item.tanggal_terbit || '-'}" data-tanggal_terbit="${item.tanggal_terbit || '-'}"
data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td> data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td>
${item.is_akre ? `<td colspan="2" class="text-center">Dokumen akreditasi</td>` : <td class="">${item.kategori}</td>
` <td class="text-nowrap">${item.nama_unit}</td>
<td>${item.name_kategori || '-'}</td>
<td>${item.name_unit || '-'}</td>
`
}
<td class="text-nowrap">${tanggalTerbit}</td>
<td class="text-nowrap">${tanggalExp}</td>
<td class="text-nowrap">${tanggal}</td> <td class="text-nowrap">${tanggal}</td>
</tr> </tr>
`; `;
@ -349,9 +342,8 @@ document.addEventListener('DOMContentLoaded', () => {
data-no_dokumen="${item.no_dokumen || '-'}" data-no_dokumen="${item.no_dokumen || '-'}"
data-tanggal_terbit="${item.tanggal_terbit || '-'}" data-tanggal_terbit="${item.tanggal_terbit || '-'}"
data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td> data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen}</a></td>
${item.is_akre ? `<td colspan="2" class="text-center">Dokumen akreditasi</td>` : `<td>${item.name_kategori || '-'}</td><td>${item.name_unit || '-'}</td>`} <td>${item?.kategori}</td>
<td class="text-nowrap">${tanggalTerbit}</td> <td>${item?.nama_unit}</td>
<td class="text-nowrap">${tanggalExp}</td>
<td class="text-nowrap">${tanggal}</td> <td class="text-nowrap">${tanggal}</td>
</tr> </tr>
`; `;
@ -373,8 +365,8 @@ document.addEventListener('DOMContentLoaded', () => {
data-no_dokumen="${item.no_dokumen || '-'}" data-no_dokumen="${item.no_dokumen || '-'}"
data-tanggal_terbit="${item.tanggal_terbit || '-'}" data-tanggal_terbit="${item.tanggal_terbit || '-'}"
data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen || '-'}</a></td> data-permission_file="${item.permission_file || '-'}">${item.nama_dokumen || '-'}</a></td>
<td>${item.folder || '-'}</td> <td>${item.kategori || '-'}</td>
<td>${item.part || '-'}</td> <td>${item.nama_unit || '-'}</td>
<td><span class="badge bg-info">${item.action_type}</span></td> <td><span class="badge bg-info">${item.action_type}</span></td>
<td class="text-nowrap">${tanggal}</td> <td class="text-nowrap">${tanggal}</td>
</tr> </tr>

View File

@ -159,7 +159,11 @@
@csrf @csrf
@if (session()->has('alertError')) @if (session()->has('alertError'))
<div class="alert alert-danger fw-bold" role="alert"> <div class="alert alert-danger fw-bold" role="alert">
@if(session('alertError') === 'captcha') @if(session('alertError') === 'expired')
Sesi login sudah habis karena halaman terlalu lama terbuka. Silakan coba lagi.
@elseif(session('alertError') === 'expired-session')
Sesi Anda sudah habis. Silakan login kembali.
@elseif(session('alertError') === 'captcha')
Captcha salah! Captcha salah!
@elseif(session('alertError') === 'rate') @elseif(session('alertError') === 'rate')
Terlalu banyak percobaan login. Coba lagi dalam 1 menit. Terlalu banyak percobaan login. Coba lagi dalam 1 menit.
@ -177,7 +181,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="exampleInputEmail1" class="form-label">Username</label> <label for="exampleInputEmail1" class="form-label">Username</label>
<input type="text" name="namauser" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" required> <input type="text" name="namauser" value="{{ old('namauser') }}" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" required>
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label for="exampleInputPassword1" class="form-label">Password</label> <label for="exampleInputPassword1" class="form-label">Password</label>

View File

@ -53,18 +53,24 @@
<li class="nav-small-cap"><span class="hide-menu">Aktivitas</span></li> <li class="nav-small-cap"><span class="hide-menu">Aktivitas</span></li>
@php @php
$pegawaiId = auth()->user()->objectpegawaifk; $pegawaiId = auth()->user()->objectpegawaifk;
$userUnitIds = auth()->user()->dataUser->mappingUnitKerjaPegawai() $userUnitIds = auth()->user()->dataUser?->mappingUnitKerjaPegawai()
->where('statusenabled', true) ->where('statusenabled', true)
->pluck('objectunitkerjapegawaifk') ->pluck('objectunitkerjapegawaifk')
->unique() ->unique()
->values() ->values()
->all(); ->all();
$isAtasan = \App\Models\MappingUnitKerjaPegawai::where('statusenabled', true) if($userUnitIds){
->where(function ($q) use ($pegawaiId) { $isAtasan = \App\Models\MappingUnitKerjaPegawai::where('statusenabled', true)
$q->where('objectatasanlangsungfk', $pegawaiId) ->where(function ($q) use ($pegawaiId) {
->orWhere('objectpejabatpenilaifk', $pegawaiId); $q->where('objectatasanlangsungfk', $pegawaiId)
})->exists(); ->orWhere('objectpejabatpenilaifk', $pegawaiId);
$isRoleApprover = in_array(51, $userUnitIds, true) || in_array(22, $userUnitIds, true); })->exists();
$isRoleApprover = in_array(51, $userUnitIds, true) || in_array(22, $userUnitIds, true);
}else{
$isAtasan = null;
}
@endphp @endphp
@if($isAtasan) @if($isAtasan)
@if(!Auth::guard('admin')->check()) @if(!Auth::guard('admin')->check())

View File

@ -1,3 +1,22 @@
{{-- @php
$globalUpdateItems = [
[
'date' => '29 Juni 2026',
'title' => 'Metadata preview dokumen diperluas',
'description' => 'Modal preview sekarang menampilkan nomor dokumen, tanggal terbit, tanggal kedaluwarsa, tanggal upload, akses dokumen, jenis dokumen akreditasi/non-akreditasi, dan kategori.',
],
[
'date' => '29 Juni 2026',
'title' => 'Nama unit ditampilkan lebih jelas',
'description' => 'Data persetujuan dan pengajuan file sekarang memakai nama unit langsung dari tabel unit agar lebih mudah dibaca.',
],
[
'date' => '29 Juni 2026',
'title' => 'Perbaikan query persetujuan',
'description' => 'Query halaman persetujuan dan pengajuan file dirapikan supaya aman saat join tabel dan tidak gagal karena kolom ambigu.',
],
];
@endphp --}}
<style> <style>
.message-body { .message-body {
@ -57,7 +76,12 @@
</li> </li>
</ul> </ul>
<div class="navbar-collapse justify-content-end px-0" id="navbarNav"> <div class="navbar-collapse justify-content-end px-0" id="navbarNav">
<ul class="navbar-nav flex-row ms-auto align-items-center justify-content-end"> <ul class="navbar-nav flex-row ms-auto align-items-center justify-content-end">
{{-- <li class="nav-item me-2">
<button type="button" class="btn btn-outline-primary btn-sm" data-bs-toggle="modal" data-bs-target="#updatesInfoModal">
<i class="fa-solid fa-bullhorn me-1"></i> Info Update
</button>
</li> --}}
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link position-relative" href="javascript:void(0)" id="dropExpired" data-bs-toggle="dropdown" aria-expanded="false"> <a class="nav-link position-relative" href="javascript:void(0)" id="dropExpired" data-bs-toggle="dropdown" aria-expanded="false">
<span class="d-inline-flex align-items-center justify-content-center rounded-circle bg-light" style="width:46px;height:46px;"> <span class="d-inline-flex align-items-center justify-content-center rounded-circle bg-light" style="width:46px;height:46px;">
@ -177,6 +201,33 @@
</div> </div>
</div> </div>
</div> </div>
{{-- <div class="modal fade" id="updatesInfoModal" tabindex="-1" aria-labelledby="updatesInfoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="updatesInfoModalLabel">Info Update Terbaru</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="d-flex flex-column gap-3">
@foreach ($globalUpdateItems as $update)
<div class="border rounded p-3">
<div class="d-flex flex-column flex-md-row align-items-md-center justify-content-between gap-2 mb-2">
<h6 class="mb-0">{{ $update['title'] }}</h6>
<span class="badge bg-light text-dark border">{{ $update['date'] }}</span>
</div>
<div class="text-muted small">{{ $update['description'] }}</div>
</div>
@endforeach
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div> --}}
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content || ''; const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content || '';

View File

@ -1,6 +1,5 @@
@extends('layout.main') @extends('layout.main')
@section('body_main') @section('body_main')
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="card"> <div class="card">
@ -96,9 +95,7 @@
<th>Kategori</th> <th>Kategori</th>
<th>Unit</th> <th>Unit</th>
<th>Aksi</th> <th>Aksi</th>
<th>Tanggal Terbit</th> <th>Tanggal Aksi</th>
<th>Tanggal Kedaluwarsa Dokumen</th>
<th>Tanggal Upload</th>
</tr> </tr>
</thead> </thead>
<tbody id="tableHistoryFile"> <tbody id="tableHistoryFile">

View File

@ -122,8 +122,6 @@
<th>Nama</th> <th>Nama</th>
<th>Kategori</th> <th>Kategori</th>
<th>Unit</th> <th>Unit</th>
<th>Tanggal Terbit</th>
<th>Tanggal Kedaluwarsa Dokumen</th>
<th>Tanggal Upload</th> <th>Tanggal Upload</th>
</tr> </tr>
</thead> </thead>