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] ?? '';
|
|
}
|
|
}
|