select('master_kategori_directory_id', 'nama_kategori_directory')->get(); $klasifikasiDok = MasterKlasifikasi::where('statusenabled', true)->select('master_klasifikasi_directory_id', 'nama_klasifikasi_directory')->get(); $authMapping = auth()->user()?->dataUser?->mappingUnitKerjaPegawai[0]; $authUnitKerja = $authMapping->objectunitkerjapegawaifk; $authSubUnitKerja = $authMapping->objectsubunitkerjapegawaifk; $allAkses = AksesFile::where(['statusenabled' => true, 'pegawai_id' => auth()->user()?->dataUser->id])->first(); $payload = [ 'title' => 'Dashboard', 'katDok' => $katDok, 'klasifikasiDok' => $klasifikasiDok, 'authUnitKerja' => $authUnitKerja, 'authSubUnitKerja' => $authSubUnitKerja, 'allAkses' => $allAkses ?? null ]; return view('dashboard.index', $payload); } public function dataUnitKerja(){ $user = auth()->user()?->dataUser; $akses = AksesFile::where(['pegawai_id' => $user->id, 'statusenabled' => true])->first(); $kategori = request('kategori'); $filterUnit = request('unitKerja'); $subUnit = request('subUnit'); $klasifikasi = request('klasifikasi'); $keyword = request('keyword'); $subArray = $subUnit ? explode(',', $subUnit) : []; $katArray = $kategori ? explode(',', $kategori) : []; $klaArray = $klasifikasi ? explode(',', $klasifikasi) : []; $katDok = MasterKategori::when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))->where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get(); if ($katArray && $filterUnit && $subArray && $klaArray) { /* mode pencarian lengkap */ $unitKerja = UnitKerja::where('statusenabled', true) ->where('id', $filterUnit) ->with(['subUnitKerja' => fn($q) => $q->whereIn('id', $subArray) ->with(['fileDirectory' => fn($q) => $q ->where('id_unit_kerja', $filterUnit) ->when($subArray, fn($q) => $q->whereIn('id_sub_unit_kerja', $subArray)) ->when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray)) ->when($klaArray, fn($q) => $q->whereIn('master_klasifikasi_directory_id', $klaArray)) ->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { $query->where('file', 'ilike', "%{$keyword}%") ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); }) ) ]) ]) ->select('id', 'name') ->get(); } elseif ($akses?->all_akses) { /* all akses */ $unitKerja = UnitKerja::where('statusenabled', true)->with([ // muat relasi 'subUnitKerja' => fn($q) => $q->with([ // sub-unit 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => $q->where('file', 'ilike', "%{$keyword}%") ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%") ) ]) ]) ->select('id', 'name') ->get(); } elseif ($akses?->unit_akses) { /* akses per unit */ $unitKerja = UnitKerja::where(['statusenabled' => true, 'id' => $akses->unit_akses]) ->with([ // muat relasi 'subUnitKerja' => fn($q) => $q->with([ // sub-unit 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { $query->where('file', 'ilike', "%{$keyword}%") ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); }) ) ]) ]) ->select('id', 'name') ->get(); } else { /* default : unit & sub milik sendiri */ $authUnit = $user?->mappingUnitKerjaPegawai[0]?->objectunitkerjapegawaifk; $authSub = $user?->mappingUnitKerjaPegawai[0]?->objectsubunitkerjapegawaifk; $unitKerja = UnitKerja::where('statusenabled', true) ->where('id', $authUnit) ->with([ // 1. sub-unit milik user 'subUnitKerja' => fn($q) => $q->where('id', $authSub) ->with([ // 2. file-directory + filter keyword 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { $query->where('file', 'ilike', "%{$keyword}%") ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); }) ) ]) ]) ->select('id', 'name') ->get(); } $data = [ 'unitKerja' => $unitKerja ?? null, 'katDok' => $katDok ?? null ]; return response()->json([ 'status' => true, 'data' => $data, ], 200); } public function store(){ DB::connection('dbDirectory')->beginTransaction(); try { $datas = request()->input('data'); $result = []; foreach($datas as $index => $value){ $files = request()->file("data.fileUpload$index"); if(!empty($files)){ foreach ($files['file'] as $file) { list($id_unit_kerja, $nama_unit_kerja) = explode('/', $value['id_unit_kerja'],2); list($id_sub_unit_kerja, $nama_sub_unit_kerja) = explode('/', $value['id_sub_unit_kerja'],2); list($master_kategori_directory_id, $nama_kategori) = explode('/', $value['master_kategori_directory_id'],2); list($klasifikasi, $nama_klasifikasi) = explode('/', $value['klasifikasi'],2); $payload = [ 'master_klasifikasi_directory_id' => $klasifikasi, 'id_unit_kerja' => $id_unit_kerja, 'id_sub_unit_kerja' => $id_sub_unit_kerja, 'master_kategori_directory_id' => $master_kategori_directory_id, 'pegawai_id_entry' => auth()->user()->dataUser->id ?? 1, 'pegawai_nama_entry' => auth()->user()->dataUser->namalengkap ?? 'tes', ]; if($file){ $imageName = $file->getClientOriginalName(); $path = "{$nama_unit_kerja}/{$nama_sub_unit_kerja}/{$nama_kategori}/{$nama_klasifikasi}"; $file->storeAs($path, $imageName, 'file_directory'); $payload['file'] =$path .'/' .$imageName; } FileDirectory::create($payload); } } } DB::connection('dbDirectory')->commit(); return response()->json([ 'status' => true, 'message' => 'Data berhasil disimpan', 'data' => count($result) == 1 ? $result[0] : $result ], 200); } catch (\Throwable $th) { DB::connection('dbDirectory')->rollBack(); return response()->json([ 'status' => false, 'message' => $th->getMessage() ], 500); } } public function OptionUnitKerja(){ $q = request()->get('q'); $authPegawai = auth()->user()?->dataUser; $authUnitKerja = optional($authPegawai->mappingUnitKerjaPegawai[0] ?? null)->objectunitkerjapegawaifk; $authSubUnitKerja = optional($authPegawai->mappingUnitKerjaPegawai[0] ?? null)->objectsubunitkerjapegawaifk; $aksesFile = AksesFile::where('pegawai_id', $authPegawai->id) ->where('statusenabled', true) ->first(); $query = UnitKerja::where('statusenabled', true); if($aksesFile){ if($aksesFile->all_akses){ }elseif($aksesFile->unit_akses){ $query->where('id', $aksesFile->unit_akses); } }else{ $data= $query->where('id', $authUnitKerja) ->with(['subUnitKerja' => function($query) use($authSubUnitKerja){ $query->where('id', $authSubUnitKerja); }])->select('id', 'name')->get(); return response()->json([ 'status' => true, 'data' => $data ], 200); } $data = $query->when($q, function ($query, $q){ $query->where('name', 'ILIKE', '%' .$q . '%'); }) ->select('id', 'name')->get(); return response()->json([ 'status' => true, 'data' => $data ], 200); } public function deleteFile(string $id){ $data = FileDirectory::where('file_directory_id', $id)->first(); if(!$data){ return response()->json([ 'success' => false, 'message' => 'File tidak ditemukan' ]); } $oldPath= public_path('file/' . $data->file); $fileInfo = pathinfo($data->file); $newFileName = $fileInfo['filename'] . '_deleted.' . $fileInfo['extension']; $newPath = public_path('file/' . $fileInfo['dirname'] . '/' . $newFileName); if (file_exists($oldPath)) { // pastikan folder tujuan ada if (!is_dir(dirname($newPath))) { mkdir(dirname($newPath), 0777, true); } rename($oldPath, $newPath); } $data->update(['statusenabled' => false, 'file' => $fileInfo['dirname'].'/'. $newFileName]); return response()->json([ 'success' => true, 'message' => 'Berhasil menghapus data' ]); } public function optionSubUnitKerja(string $id){ $data = SubUnitKerja::where('statusenabled', true)->where('objectunitkerjapegawaifk', $id)->get(); return response()->json([ 'status' => true, 'data' => $data, ]); } public function getFile($id_unit_kerja, $id_sub_unit_kerja, $master_kategori_directory_id){ $klasifikasi = request('klasifikasi'); $klaArray = explode(',', $klasifikasi); $data = FileDirectory::where(['statusenabled' => true, 'id_unit_kerja' => $id_unit_kerja, 'id_sub_unit_kerja' => $id_sub_unit_kerja, 'master_kategori_directory_id' => $master_kategori_directory_id])->whereIn('master_klasifikasi_directory_id', $klaArray)->get(); return response()->json([ 'data' => $data, 'status' => true, ]); } public function downloadDataMultiple(){ try { $rows = request('ids', []); // [[unit_id=>u, sub_unit_id=>s], ...] if (empty($rows)) { return response()->json(['message' => 'Tidak ada data'], 422); } $paths = []; foreach ($rows as $r) { if(!empty($r['sub_unit_id'])){ $files = FileDirectory::where('id_sub_unit_kerja', $r['sub_unit_id'])->where('statusenabled', true)->pluck('file'); $paths = array_merge($paths, $files->toArray()); } } $paths = array_unique($paths); if (empty($paths)) { return response()->json(['message' => 'File tidak ditemukan'], 404); } $zipName = 'files_' . time() . '.zip'; $zipPath = public_path('zip/' . $zipName); $zip = new ZipArchive; if($zip->open($zipPath, ZipArchive::CREATE) === TRUE){ foreach ($paths as $path) { $fullPath = public_path('file/' . $path); if(file_exists($fullPath)){ $relativePathInZip = $path; $zip->addFile($fullPath, $relativePathInZip); }else{ throw new \Exception("File tidak ditemukan: " . $path); } } $zip->close(); } return response()->download(public_path('zip/' . $zipName))->deleteFileAfterSend(true); //code... } catch (\Throwable $th) { return response()->json([ 'message' => 'Terjadi kesalahan', 'error' => $th->getMessage() ], 500); } } public function downloadDataFolder(){ try { $id = request('id'); $type = request('type'); if($type === "unit"){ $data = FileDirectory::where('id_unit_kerja', $id)->where('statusenabled', true)->pluck('file'); }else{ $data = FileDirectory::where('id_sub_unit_kerja', $id)->where('statusenabled', true)->pluck('file'); } if (empty($data)) { return response()->json(['message' => 'File tidak ditemukan'], 404); } $zipName = 'files_' . time() . '.zip'; $zipPath = public_path('zip/' . $zipName); $zip = new ZipArchive; if($zip->open($zipPath, ZipArchive::CREATE) === TRUE){ foreach ($data as $path) { $fullPath = public_path('file/' . $path); if(file_exists($fullPath)){ $relativePathInZip = $path; $zip->addFile($fullPath, $relativePathInZip); }else{ throw new \Exception("File tidak ditemukan: " . $path); } } $zip->close(); } return response()->download(public_path('zip/' . $zipName))->deleteFileAfterSend(true); } catch (\Throwable $th) { return response()->json([ 'message' => 'Terjadi kesalahan', 'error' => $th->getMessage() ], 500); } } public function dashboardVersion2(){ $data = [ 'title' => 'Dashboard', ]; return view('dashboardV2.index', $data); } public function dataDocumentLast(){ $perPage = request('per_page', 10); $data = FileDirectory::where('statusenabled', true) ->orderBy('entry_at', 'desc') ->paginate($perPage); $payload = [ 'status' => true, 'message' => 'Berhasil mendapatkan data', 'data' => $data->items(), 'pagination' => [ 'current_page' => $data->currentPage(), 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, 'has_more' => $data->hasMorePages() ] ]; return response()->json($payload); } }