project_directory/app/Http/Controllers/DashboardController.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);
}
}