376 lines
16 KiB
PHP
376 lines
16 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\AksesFile;
|
|
use App\Models\FileDirectory;
|
|
use App\Models\MasterKategori;
|
|
use App\Models\MasterKlasifikasi;
|
|
use App\Models\SubUnitKerja;
|
|
use App\Models\UnitKerja;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Str;
|
|
use ZipArchive;
|
|
|
|
use function PHPUnit\Framework\isEmpty;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
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();
|
|
|
|
$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);
|
|
}
|
|
}
|