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