266 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			7.8 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\HasilUjiAL;
 | |
| use App\Models\LampiranAL;
 | |
| 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 Hasil Uji
 | |
|  *
 | |
|  * @author Beti Tuntari <beti.tuntari@gmail.com>
 | |
|  */
 | |
| class LampiranHasilUjiController extends Controller
 | |
| {
 | |
|     /**
 | |
|      * Display and edit attachment form
 | |
|      *
 | |
|      * @param int $idMcIpal
 | |
|      * @param string $bulan
 | |
|      * @return \Illuminate\Http\Response
 | |
|      */
 | |
|     public function edit($idMcIpal, $bulan)
 | |
|     {
 | |
|         // Check authorization
 | |
|         if (!Gate::allows('pelaporan.view')) {
 | |
|             abort(403);
 | |
|         }
 | |
| 
 | |
|         // Get IPAL and pelaporan data
 | |
|         $ipal = Ipal::getOneBy(['id' => $idMcIpal]);
 | |
|         $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan);
 | |
| 
 | |
|         // Determine if upload is allowed in current period
 | |
|         $blnAwal = (($pelaporan->idrefperiodepelaporan - 1) * 3) + 1;
 | |
|         $blnAkhir = $blnAwal + 3;
 | |
|         $editable = Pelaporan::checkEditable($ipal->idmcpelaporan, 'al') && Gate::allows('pelaporan.edit');
 | |
| 
 | |
|         if (($bulan >= $blnAwal && $bulan <= $blnAkhir) && $editable) {
 | |
|             $enableUpload = 1;
 | |
|         } else {
 | |
|             $enableUpload = 0;
 | |
|         }
 | |
| 
 | |
|         $data = [
 | |
|             'idmcipal' => $idMcIpal,
 | |
|             'tahun' => $pelaporan->tahun,
 | |
|             'periode' => $pelaporan->periode,
 | |
|             'nama_ipal' => $ipal->nama,
 | |
|             'bulan' => $this->_mcMonth($bulan),
 | |
|             'enableUpload' => $enableUpload
 | |
|         ];
 | |
| 
 | |
|         return view('pelaporan.ipal.lampiran', $data);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Upload files via dropzone
 | |
|      *
 | |
|      * @param Request $request
 | |
|      * @param int $idMcIpal
 | |
|      * @param string $bulan
 | |
|      * @return void
 | |
|      */
 | |
|     public function uploadFile(Request $request, $idMcIpal, $bulan)
 | |
|     {
 | |
|         // Check authorization
 | |
|         if (!Gate::allows('pelaporan.edit')) {
 | |
|             abort(403);
 | |
|         }
 | |
| 
 | |
|         // Get IPAL and pelaporan data
 | |
|         $ipal = Ipal::getOneBy(['id' => $idMcIpal]);
 | |
|         $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan);
 | |
| 
 | |
|         // Get upload directory
 | |
|         $dirUpload = $this->_getDirectory($pelaporan->id, $idMcIpal, 'al', 'A6', $bulan);
 | |
| 
 | |
|         // 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
 | |
|                 $data = [
 | |
|                     'idmcipal' => $idMcIpal,
 | |
|                     'tahun' => $pelaporan->tahun,
 | |
|                     'idrefperusahaan' => $pelaporan->idrefperusahaan,
 | |
|                     'bulan' => $bulan,
 | |
|                     'dokumen' => $fullPath,
 | |
|                     'tanggalunggah' => Carbon::now()->format('Y-m-d H:i:s')
 | |
|                 ];
 | |
| 
 | |
|                 Ipal::saveLampiranHasilUji($data);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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') || Gate::allows('verifikasi.view'))) {
 | |
|             abort(403);
 | |
|         }
 | |
| 
 | |
|         // Get parameters from request
 | |
|         $idMcIpal = $request->input('idmcipal');
 | |
|         $bulan = $request->input('bulan');
 | |
| 
 | |
|         // Get IPAL and pelaporan data
 | |
|         $ipal = Ipal::getOneBy(['id' => $idMcIpal]);
 | |
|         $pelaporan = Pelaporan::findOrFail($ipal->idmcpelaporan);
 | |
| 
 | |
|         $result = [];
 | |
| 
 | |
|         // Get all attachments
 | |
|         $allLampiran = Ipal::getLampiranHasilUji([
 | |
|             'b.idrefipal' => $ipal->idrefipal,
 | |
|             'a.idrefperusahaan' => $pelaporan->idrefperusahaan,
 | |
|             'a.bulan' => $bulan,
 | |
|             'a.tahun' => $pelaporan->tahun
 | |
|         ]);
 | |
| 
 | |
|         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;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         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
 | |
|         $idMcIpal = $request->input('idmcipal');
 | |
|         $bulan = $request->input('bulan');
 | |
|         $fileName = $request->input('fileName');
 | |
| 
 | |
|         // Get IPAL data
 | |
|         $ipal = Ipal::getOneBy(['id' => $idMcIpal]);
 | |
| 
 | |
|         // Get upload directory
 | |
|         $dirUpload = storage_path('app/public/') . $this->_getDirectory($ipal->idmcpelaporan, $idMcIpal, 'al', 'A6', $bulan);
 | |
| 
 | |
|         // Delete file
 | |
|         $fullPath = $dirUpload . basename($fileName);
 | |
|         if (File::exists($fullPath)) {
 | |
|             File::delete($fullPath);
 | |
|         }
 | |
| 
 | |
|         // Delete from database
 | |
|         $filter = [
 | |
|             'idmcipal' => $idMcIpal,
 | |
|             'bulan' => $bulan,
 | |
|             'dokumen' => $dirUpload . basename($fileName)
 | |
|         ];
 | |
| 
 | |
|         Ipal::deleteLampiranHasilUji($filter);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get directory for file storage
 | |
|      *
 | |
|      * @param int $idMcPelaporan
 | |
|      * @param int $idMcIpal
 | |
|      * @param string $kodeRefPelaporan
 | |
|      * @param string $kodeKomponen
 | |
|      * @param string $bulan
 | |
|      * @return string
 | |
|      */
 | |
|     private function _getDirectory($idMcPelaporan, $idMcIpal, $kodeRefPelaporan, $kodeKomponen, $bulan)
 | |
|     {
 | |
|         $pelaporan = Pelaporan::findOrFail($idMcPelaporan);
 | |
|         $perusahaan = Pelaporan::getPerusahaan($pelaporan->idrefperusahaan);
 | |
|         $ipal = Ipal::getOneBy(['id' => $idMcIpal]);
 | |
| 
 | |
|         $notAllowedChar = [' ', '.', '/', '-', ',', ':'];
 | |
| 
 | |
|         $noInduk = $perusahaan->nomorinduk;
 | |
|         $noIpal = $ipal->nomor;
 | |
|         $tahun = $pelaporan->tahun;
 | |
|         $periode = strtolower(str_replace($notAllowedChar, '_', $pelaporan->periode));
 | |
| 
 | |
|         $dirUpload = 'data_perusahaan/' . $noInduk . '/lampiran' . '/' . $kodeRefPelaporan . '/' .
 | |
|                     $kodeKomponen . '/' . $tahun . '_' . $periode . '/lampiran_hasiluji' . '/' .
 | |
|                     $bulan . '/' . $noIpal . '/';
 | |
| 
 | |
|         return $dirUpload;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Convert month number to name
 | |
|      *
 | |
|      * @param int $monthNum
 | |
|      * @return string
 | |
|      */
 | |
|     private function _mcMonth($monthNum)
 | |
|     {
 | |
|         $months = [
 | |
|             1 => 'January',
 | |
|             2 => 'February',
 | |
|             3 => 'March',
 | |
|             4 => 'April',
 | |
|             5 => 'May',
 | |
|             6 => 'June',
 | |
|             7 => 'July',
 | |
|             8 => 'August',
 | |
|             9 => 'September',
 | |
|             10 => 'October',
 | |
|             11 => 'November',
 | |
|             12 => 'December'
 | |
|         ];
 | |
| 
 | |
|         return $months[$monthNum] ?? '';
 | |
|     }
 | |
| }
 |