320 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace App\Http\Controllers\Pelaporan\AL;
 | |
| 
 | |
| use App\Http\Controllers\Controller;
 | |
| use Illuminate\Http\Request;
 | |
| use App\Models\Pelaporan;
 | |
| use App\Models\Ipal;
 | |
| use App\Models\IpalParameter;
 | |
| use App\Models\Pelaporan\Lampiran;
 | |
| use Illuminate\Support\Facades\Auth;
 | |
| use Illuminate\Support\Facades\Gate;
 | |
| use Illuminate\Support\Facades\Storage;
 | |
| use Illuminate\Support\Facades\File;
 | |
| use Carbon\Carbon;
 | |
| 
 | |
| /**
 | |
|  * Controller untuk Lampiran Komponen di Persyaratan Teknis
 | |
|  *
 | |
|  * @author Beti Tuntari <beti.tuntari@gmail.com>
 | |
|  */
 | |
| 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;
 | |
|     }
 | |
| }
 |