*/ class LampiranSyaratTeknisController extends Controller { /** * Display and edit technical requirements attachment form * * @param int $idMcIpal * @param string $kodeKomponen * @return \Illuminate\Http\Response */ public function edit($idMcIpal, $kodeKomponen) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Get models data $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan); $data = [ 'nama_ipal' => $ipal->nama, 'idmcipal' => $idMcIpal, 'editable' => Pelaporan::checkEditable($ipal->idmcpelaporan, 'al') && Gate::allows('pelaporan.edit'), 'kode_komponen' => $kodeKomponen, 'nama_komponen' => Lampiran::getKomponenByKode($kodeKomponen)->nama ]; return view('pelaporan.ipal.lampiran_syarat_teknis', $data); } /** * Upload files via dropzone * * @param Request $request * @param int $idMcIpal * @param string $kodeKomponen * @return void */ public function uploadFile(Request $request, $idMcIpal, $kodeKomponen) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } // Get IPAL data $ipal = Ipal::getOneBy(['id' => $idMcIpal]); // Get upload directory $dirUpload = $this->_getDirectory($idMcIpal, $kodeKomponen); // Create directory if it doesn't exist if (!Storage::disk('public')->exists($dirUpload)) { Storage::disk('public')->makeDirectory($dirUpload, 0777, true); } // Handle file uploads if ($request->hasFile('file')) { $files = $request->file('file'); foreach ($files as $file) { $name = $file->getClientOriginalName(); $ext = $file->getClientOriginalExtension(); $baseName = pathinfo($name, PATHINFO_FILENAME); $newName = $baseName . '_' . date('Ymd_His') . '.' . $ext; $filePath = $file->storeAs($dirUpload, $newName, 'public'); $fullPath = storage_path('app/public/' . $filePath); // Set file permissions chmod($fullPath, 0777); // Save file data to database if ($kodeKomponen != 'A5') { $idRefKomponen = Lampiran::getKomponenByKode($kodeKomponen)->id; $insert = [ 'PelapranId' => $ipal->idmcpelaporan, 'IpalId' => $idMcIpal, 'KomponenId' => $idRefKomponen, 'Dokumen' => $fullPath, 'TanggalUnggah' => Carbon::now()->format('Y-m-d H:i:s') ]; Lampiran::saveFile($insert); } else { // For A5, update IPAL's lampiran field if ($ipal->lampiran && File::exists($ipal->lampiran)) { File::delete($ipal->lampiran); } Ipal::editMcIpal($idMcIpal, ['Lamapiran' => $fullPath]); } } } } /** * List all uploaded files for dropzone * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function listFiles(Request $request) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } // Get parameters from request $idMcIpal = $request->input('idmcipal'); $kodeKomponen = $request->input('kode_komponen'); $idRefKomponen = Lampiran::getKomponenByKode($kodeKomponen)->id; $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $result = []; // Get all attachments if ($kodeKomponen != 'A5') { $allLampiran = Lampiran::getLampiran([ 'idmcipal' => $idMcIpal, 'idrefkomponen' => $idRefKomponen ]); foreach ($allLampiran as $lampiran) { if (File::exists($lampiran->dokumen)) { $pathExplode = explode('/', $lampiran->dokumen); $obj = [ 'name' => end($pathExplode), 'size' => File::size($lampiran->dokumen), 'path' => $lampiran->dokumen ]; $result[] = $obj; } } } else { // For A5, get from IPAL's lampiran field $lampiran = $ipal->lampiran; if ($lampiran && File::exists($lampiran)) { $pathExplode = explode('/', $lampiran); $obj = [ 'name' => end($pathExplode), 'size' => File::size($lampiran), 'path' => $lampiran ]; $result[] = $obj; } } return response()->json($result); } /** * Delete files from dropzone * * @param Request $request * @return void */ public function deleteFile(Request $request) { // Check authorization if (!Gate::allows('pelaporan.edit')) { abort(403); } // Get parameters from request $filePath = $request->input('filePath'); $idMcIpal = $request->input('idmcipal'); $kodeKomponen = $request->input('kode_komponen'); $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $idRefKomponen = Lampiran::getKomponenByKode($kodeKomponen)->id; if ($kodeKomponen != 'A5') { // Delete file physically if (File::exists($filePath)) { File::delete($filePath); } // Delete from database $filter = [ 'idmcipal' => $idMcIpal, 'idrefkomponen' => $idRefKomponen, 'dokumen' => $filePath ]; Lampiran::deleteFile($filter); } else { // For A5, clear IPAL's lampiran field if ($ipal->lampiran && File::exists($ipal->lampiran)) { File::delete($ipal->lampiran); } Ipal::editMcIpal($idMcIpal, ['lampiran' => '']); } return response()->json(['success' => true]); } /** * Check if attachments exist * * @param int $idMcIpal * @param string $kodeKomponen * @return \Illuminate\Http\JsonResponse */ public function cekAdaLampiran($idMcIpal, $kodeKomponen) { // Check authorization if (!Gate::allows('pelaporan.view')) { abort(403); } $ipal = Ipal::getOneBy(['id' => $idMcIpal]); if ($kodeKomponen == 'all') { $filter = [ 'idmcpelaporan' => $ipal->idmcpelaporan, 'idmcipal' => $idMcIpal ]; $allLampiran = Lampiran::getLampiran($filter); $idA5 = Lampiran::getKomponenByKode('A5')->id; $lampiranExists = []; foreach ($allLampiran as $lampiran) { if ($lampiran->idrefkomponen != $idA5) { if (File::exists($lampiran->dokumen)) { if (!in_array($lampiran->idrefkomponen, $lampiranExists)) { array_push($lampiranExists, $lampiran->idrefkomponen); } } } } if ($ipal->lampiran && File::exists($ipal->lampiran)) { array_push($lampiranExists, $idA5); } $response = $lampiranExists; } else { $idRefKomponen = Lampiran::getKomponenByKode($kodeKomponen)->id; $response = ['lampiran' => false, 'refkomponen' => $idRefKomponen]; if ($kodeKomponen != 'A5') { $filter = [ 'idmcpelaporan' => $ipal->idmcpelaporan, 'idmcipal' => $idMcIpal, 'idrefkomponen' => $idRefKomponen ]; $allLampiran = Lampiran::getLampiran($filter); if ($allLampiran) { foreach ($allLampiran as $lampiran) { if (File::exists($lampiran->dokumen)) { $response['lampiran'] = true; break; } } } } else { if ($ipal->lampiran && File::exists($ipal->lampiran)) { $response['lampiran'] = true; } } } return response()->json($response); } /** * Get directory for file storage * * @param int $idMcIpal * @param string $kodeKomponen * @return string */ private function _getDirectory($idMcIpal, $kodeKomponen) { $ipal = Ipal::getOneBy(['id' => $idMcIpal]); $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan); $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan); $notAllowedChar = [' ', '.', '/', '-', ',', ':']; $noInduk = $perusahaan->nomorinduk; $tahun = $pelaporan->tahun; $periode = strtolower(str_replace($notAllowedChar, '_', $pelaporan->periode)); $kodeRefPelaporan = 'al'; $ipalName = str_replace($notAllowedChar, '_', $ipal->nama); $dirUpload = 'data_perusahaan/' . $noInduk . '/lampiran' . '/' . $kodeRefPelaporan . '/' . $tahun . '_' . $periode . '/' . $ipalName . '/' . $kodeKomponen . '/'; return $dirUpload; } }