skl/app/Http/Controllers/Pelaporan/AL/LampiranSyaratTeknisControl...

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;
}
}