<?php
namespace App\Controller\Backend;
use App\Controller\Base\BaseController;
use App\Entity\TFileGrafik;
use App\Entity\TGrafik;
use App\Form\TGrafikType;
use App\Entity\TGrafikDinamis;
use App\Entity\THeader;
use App\Entity\TProgres;
use App\Entity\TRawData;
use App\Entity\TVariabelGrafik;
use App\Entity\TWeeklyEploreReport;
use App\Repository\MKategoriDetailRepository;
use App\Repository\MKategoriRepository;
use App\Repository\TDivRepository;
use App\Repository\TGrafikDinamisRepository;
use App\Repository\TGrafikRepository;
use App\Repository\TLogRepository;
use App\Repository\TVariabelGrafikRepository;
use App\Repository\TFileGrafikRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Kematjaya\ImportBundle\Manager\ImportManagerInterface;
use Kematjaya\ImportBundle\DataSource\RemoteDataSource;
use App\Transformer\PublikasiTransformer;
use App\Transformer\VariabelTransformer;
use DateTime;
use Sonata\SeoBundle\Seo\SeoPageInterface;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Knp\Component\Pager\PaginatorInterface;
use App\Filter\TGrafikDinamisFilterType;
use App\Kernel;
use App\Repository\TDataGrafikRepository;
use App\Repository\THeaderRepository;
use App\Repository\TPostingLaporanRepository;
use App\Repository\TProgresRepository;
use App\Repository\TRawDataRepository;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class TRawDataController extends BaseController
{
private $pageName = 't_raw_data';
private $class = TRawData::class;
/**
* @Route("/t/raw/data", name="t_raw_data")
*/
public function index(SeoPageInterface $seoPage, BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface): Response
{
$userRoles = $this->getUser()->getRoles();
$seoPage->addTitlePrefix("Dataset");
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('Raw Data');
// $array = $this->getDataTableRawData(null, null, null, null);
// print_r($array); exit;
$filter = TGrafikDinamisFilterType::class;
$form = $this->get('form.factory')->create($filter, $this->getFilters($filter));
$queryBuilder = $this->getQueryBuilder($this->class);
// if ($userRoles[0] != 'ROLE_ADMINISTRATOR' && $userRoles[0] != 'ROLE_WALIDATA' && $userRoles[0] != 'ROLE_SUPER_USER'){
// $queryBuilder = $queryBuilder->where('this.div = ' . $this->getUser()->getDiv()->getId());
// }
$queryBuilder = $this->buildFilter($request, $form, $queryBuilder)->addOrderBy("this.id", "DESC");
$this->setSessionLimit($request);
$maxPerPage = $request->getSession()->get("limit") ? $request->getSession()->get("limit") : $this->getLimit();
$pagination = $paginatorInterface->paginate($queryBuilder, $request->query->getInt('page', 1), $maxPerPage);
// $raw_data = $this->getDataTableRawData(null, null, null, null);
$header = $this->getDataHeader();
if (isset($header[0]['head1'])) {
$head1 = $header[0]['head1'];
$processedHeaders = [];
$keys = array_keys($head1);
$total = count($keys);
$i = 0;
while ($i < $total) {
$key = $keys[$i];
$label = $head1[$key];
if ($label !== null) {
$colspan = 1;
$j = $i + 1;
while ($j < $total && $head1[$keys[$j]] === null) {
$colspan++;
$j++;
}
$processedHeaders[] = [
'label' => $label,
'colspan' => $colspan,
];
$i += $colspan;
} else {
$i++;
}
}
} else {
$processedHeaders = null;
}
// print_r($raw_data); exit;
return $this->render('backend/t_raw_data/index.html.twig', [
'page_name' => $this->pageName,
'header' => $header,
'headers_grouped' => $processedHeaders,
'button_credential' => $this->buttonCredentials(),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/t/raw/data_table", name="t_raw_data_table")
*/
public function raw_data_table(SeoPageInterface $seoPage, BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface): Response
{
$userRoles = $this->getUser()->getRoles();
$seoPage->addTitlePrefix("Dataset");
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('Raw Data');
$filter = TGrafikDinamisFilterType::class;
$form = $this->get('form.factory')->create($filter, $this->getFilters($filter));
$queryBuilder = $this->getQueryBuilder($this->class);
// if ($userRoles[0] != 'ROLE_ADMINISTRATOR' && $userRoles[0] != 'ROLE_WALIDATA' && $userRoles[0] != 'ROLE_SUPER_USER'){
// $queryBuilder = $queryBuilder->where('this.div = ' . $this->getUser()->getDiv()->getId());
// }
$queryBuilder = $this->buildFilter($request, $form, $queryBuilder)->addOrderBy("this.id", "DESC");
$this->setSessionLimit($request);
$maxPerPage = $request->getSession()->get("limit") ? $request->getSession()->get("limit") : $this->getLimit();
$pagination = $paginatorInterface->paginate($queryBuilder, $request->query->getInt('page', 1), $maxPerPage);
$raw_data = $this->getDataTableRawData(null, null, null, null);
$head1 = $raw_data[0]['head1'];
$processedHeaders = [];
$keys = array_keys($head1);
$total = count($keys);
$i = 0;
while ($i < $total) {
$key = $keys[$i];
$label = $head1[$key];
if ($label !== null) {
$colspan = 1;
$j = $i + 1;
while ($j < $total && $head1[$keys[$j]] === null) {
$colspan++;
$j++;
}
$processedHeaders[] = [
'label' => $label,
'colspan' => $colspan,
];
$i += $colspan;
} else {
$i++;
}
}
// print_r($raw_data); exit;
return $this->render('backend/t_raw_data/raw_data_table.html.twig', [
'page_name' => $this->pageName,
'raw_data' => $raw_data,
'headers_grouped' => $processedHeaders,
'button_credential' => $this->buttonCredentials(),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/t_raw_data/{id}/delete_t_raw_data", name="t_raw_data_delete", methods={"GET"})
*/
public function delete(?string $id = null, TGrafikDinamisRepository $tGrafikDinamisRepo, TLogRepository $tLogRepo)
{
$publikasi = $tGrafikDinamisRepo->find($id);
// dump($kategori); exit;
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($publikasi);
$entityManager->flush();
$tLogRepo->setLog($this->getDoctrine()->getManager(), null, $publikasi->getDiv()->getId(), "Ubah Dataset " . $publikasi->getJudul(), $this->getUser()->getName());
$this->addFlash('notice', 'Dataset "' . $publikasi->getJudul() . '" berhasil dihapus');
return $this->redirectToRoute('publikasi');
}
/**
* @Route("/t_raw_data/form_file", name="t_raw_data_form_file", methods={"GET", "POST"})
*/
// public function form_file(?string $id, Request $request, THeaderRepository $tHeaderRepo, TRawDataRepository $tRawDataRepo, TProgresRepository $tProgresRepo, ManagerRegistry $managerRegistry, Kernel $kernel)
// {
// $em = $managerRegistry->getManager();
// // $raw_data = $tRawDataRepo->find($id);
// // if(!$raw_data){
// // throw new NotFoundHttpException();
// // }
// // if($file_id){
// // $file = $tFileGrafikRepo->find($file_id);
// // } else {
// // $file = new TFileGrafik();
// // }
// // if(!$file){
// // throw new NotFoundHttpException();
// // }
// if ($request->isMethod('POST')) {
// // $files = $tFileGrafikRepo->findBy(['grafik'=>$publikasi]);
// // // $fileFound = $publikasi->getTFiles()->count();
// // $fileFound = count($files);
// // if (!$file_id) {
// // $periode_desk = "";
// // $periode_order = 0;
// // $file->setGrafik($publikasi);
// // $file->setDeskripsi($periode_desk);
// // // $file->setPeriodeAwal(\DateTime::createFromFormat('Y-m-d', $periode_awal));
// // // $file->setPeriodeAkhir(\DateTime::createFromFormat('Y-m-d', $periode_akhir));
// // $file->setPeriodeOrder($periode_order);
// // $file->setCreatedAt(new \DateTimeImmutable());
// // } else {
// // $file->setUpdatedAt(new \DateTimeImmutable());
// // $datafile = $tDataGrafikRepo->findBy(['file'=>$file]);
// // // $tempFileData = $file->getTData();
// // $tempFileData = $datafile;
// // foreach ($tempFileData as $temp) {
// // $em->remove($temp);
// // $em->flush();
// // }
// // }
// $uploads_directory = $this->getParameter('uploads_directory');
// $dataFile = $request->files->get('file');
// $filename = md5(uniqid() . $dataFile->getClientOriginalName()) . '.' . $dataFile->guessExtension();
// $dataFile->move(
// $uploads_directory,
// $filename
// );
// $spreadsheet = IOFactory::load($uploads_directory . '/' . $filename);
// $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
// // $header1 = array_values($sheetData[1]);
// // if (!$fileFound) {
// // foreach ($header as $head) {
// // $var = new TVariabelGrafik();
// // $var->setGrafik($publikasi);
// // $var->setNama(str_replace(" ", "_", strtolower($head)));
// // $var->setIsTampil(true);
// // $var->setCreatedAt(new \DateTimeImmutable());
// // $em->persist($var);
// // $em->flush();
// // }
// // }
// $header1 = $sheetData[1];
// $header2 = $sheetData[2];
// unset($sheetData[1]);
// unset($sheetData[2]);
// // print_r(strtolower(json_encode($header1)))."<br>";
// // print_r(strtolower(json_encode($header2)));exit;
// //cek header
// $connection = $this->getDoctrine()->getConnection();
// $sql = "SELECT * FROM t_header WHERE LOWER(head_1::text) = LOWER(:head_1) AND LOWER(head_2::text) = LOWER(:head_2)";
// $stmt = $connection->prepare($sql);
// $result = $stmt->executeQuery(['head_1' => strtolower(json_encode($header1)), 'head_2' => strtolower(json_encode($header2)),]);
// $header = $result->fetchAssociative();
// // print_r($header); exit;
// if ($header) {
// $header = $tHeaderRepo->find(['id' => $header['id']]);
// $header->setHead1($header1);
// $header->setHead2($header2);
// $header->setUpdatedAt(new \DateTimeImmutable());
// } else {
// // unlink($filename);
// // $this->addFlash('error', 'Header Tidak Sesuai');
// // return $this->redirectToRoute('t_raw_data');
// //belum dipake dlu karena pasti 1 header
// $header = new THeader();
// $header->setHead1($header1);
// $header->setHead2($header2);
// $header->setCreatedAt(new \DateTimeImmutable());
// }
// $header->setFile($filename);
// $em->persist($header);
// $em->flush();
// // exit;
// $isi = $sheetData;
// // print_r(count($isi)); exit;
// $batchSize = 50;
// $firstBatch = array_slice($sheetData, 0, $batchSize);
// $remainingBatch = array_slice($sheetData, $batchSize);
// $no = 1;
// // foreach ($isi as $key => $value) {
// // //cek raw_data
// // $connection = $this->getDoctrine()->getConnection();
// // $sql = "SELECT * FROM t_raw_data WHERE isi::text = :isi";
// // $stmt = $connection->prepare($sql);
// // $result = $stmt->executeQuery(['isi' => json_encode($value)]);
// // $raw_data = $result->fetchAssociative();
// // if ($raw_data) {
// // $raw_data = $tRawDataRepo->find(['id' => $raw_data['id']]);
// // $raw_data->setIsi($value);
// // $raw_data->setUpdatedAt(new \DateTimeImmutable());
// // } else {
// // $raw_data = new TRawData();
// // $raw_data->setHeaderId($header->getId());
// // $raw_data->setIsi($value);
// // $raw_data->setCreatedAt(new \DateTimeImmutable());
// // }
// // // $raw_data->setFile($filename);
// // $em->persist($raw_data);
// // $em->flush();
// // }
// $t_progres = new TProgres();
// $t_progres->setCreatedAt(new \DateTimeImmutable());
// $t_progres->setReffKode('RAW_DATA');
// $t_progres->setFile($filename);
// $t_progres->setJumlahData(count($isi));
// $em->persist($t_progres);
// $em->flush();
// $data_masuk = 1;
// foreach ($firstBatch as $value) {
// //cek raw_data
// $connection = $this->getDoctrine()->getConnection();
// $sql = "SELECT * FROM t_raw_data WHERE isi::text = :isi";
// $stmt = $connection->prepare($sql);
// $result = $stmt->executeQuery(['isi' => json_encode($value)]);
// $raw_data = $result->fetchAssociative();
// if ($raw_data) {
// $raw_data = $tRawDataRepo->find(['id' => $raw_data['id']]);
// $raw_data->setIsi($value);
// $raw_data->setUpdatedAt(new \DateTimeImmutable());
// } else {
// $raw_data = new TRawData();
// $raw_data->setHeaderId($header->getId());
// $raw_data->setIsi($value);
// $raw_data->setCreatedAt(new \DateTimeImmutable());
// }
// //progress upload
// $t_progres = $tProgresRepo->findOneBy(['reff_kode' => 'RAW_DATA']);
// $t_progres->setDataMasuk($data_masuk);
// $em->persist($t_progres);
// $em->flush();
// $tahun_anggaran = $request->request->get('tahun_anggaran');
// $raw_data->setTahunAnggaran($tahun_anggaran);
// $em->persist($raw_data);
// $em->flush();
// $data_masuk +=1;
// }
// $tempPath = $uploads_directory . '/batch_pending.json';
// file_put_contents($tempPath, json_encode([
// 'header_id' => $header->getId(),
// 'data' => $remainingBatch
// ]));
// $baseCmd = sprintf('%s/bin/console app:rawdata "%s" "%s"', $this->getParameter('kernel.project_dir'), $tempPath,$tahun_anggaran);
// if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
// $cmd = 'start /B php ' . $baseCmd;
// } else {
// $cmd = 'php7.4 ' . $baseCmd . ' > /dev/null 2>&1 &';
// }
// $process = Process::fromShellCommandline($cmd);
// $process->disableOutput();
// $process->start();
// // if (!$process->isStarted()) {
// // $managerRegistry->getManager()->remove($entity);
// // $managerRegistry->getManager()->flush();
// // }
// // $vars = $tVariabelGrafikRepo->findBy(['grafik'=>$publikasi->getId()], ['id'=>'asc']);
// // $lastData = $tDataGrafikRepo->findOneBy(['grafik'=>$publikasi->getId()], ['id'=>'desc']);
// // $rowNum = 1;
// // if ($lastData) {
// // $rowNum += $lastData->getRowId();
// // }
// // foreach ($sheetData as $value) {
// // $arrData = array_values($value);
// // $isEmpty = trim(implode('', $arrData));
// // if ($isEmpty != '') {
// // foreach ($arrData as $key => $val) {
// // $data = new TDataGrafik();
// // $data->setGrafik($publikasi);
// // $data->setVariabel($vars[$key]);
// // $data->setIsi($val);
// // $data->setFile($file);
// // $data->setRowId($rowNum);
// // $data->setCreatedAt(new \DateTimeImmutable());
// // $em->persist($data);
// // $em->flush();
// // }
// // }
// // $rowNum++;
// // }
// $this->addFlash('notice', 'Upload file berhasil');
// return $this->redirectToRoute('t_raw_data');
// }
// return $this->render('/backend/t_raw_data/form_file.html.twig', [
// // 't_raw_data' => $raw_data,
// // 'file' => $file,
// // 'bulan' => $this->getBulan(),
// // 'periode' => $this->getArrayPeriode()
// ]);
// }
public function form_file(?string $id, Request $request, THeaderRepository $tHeaderRepo, TRawDataRepository $tRawDataRepo, TProgresRepository $tProgresRepo, TPostingLaporanRepository $tPostingLaporanRepo, ManagerRegistry $managerRegistry, Kernel $kernel)
{
$em = $managerRegistry->getManager();
// $raw_data = $tRawDataRepo->find($id);
// if(!$raw_data){
// throw new NotFoundHttpException();
// }
// if($file_id){
// $file = $tFileGrafikRepo->find($file_id);
// } else {
// $file = new TFileGrafik();
// }
// if(!$file){
// throw new NotFoundHttpException();
// }
if ($request->isMethod('POST')) {
$uploads_directory = $this->getParameter('uploads_directory');
// $tahun_anggaran = $request->get('tahun_anggaran');
$periode_upload = $request->get('periode_upload');
// print_r($tahun_anggaran); exit;
// Upload file1'
$dataFile = $request->files->get('file');
// --- 1. Cek ekstensi ---
$allowedExtensions = ['xls', 'xlsx'];
$extension = strtolower($dataFile->getClientOriginalExtension());
if (!in_array($extension, $allowedExtensions)) {
// throw new \Exception('File harus berupa Excel (.xls atau .xlsx).');
$this->addFlash('error', 'Upload Gagal!, File harus berupa Excel (.xls atau .xlsx).');
return $this->redirectToRoute('t_raw_data');
}
// --- 2. Cek MIME type ---
$allowedMimeTypes = [
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/octet-stream' // beberapa browser kadang kirim ini
];
$mimeType = $dataFile->getMimeType();
if (!in_array($mimeType, $allowedMimeTypes)) {
// throw new \Exception('Tipe file tidak valid, bukan file Excel.');
$this->addFlash('error', 'Upload Gagal!, Tipe file tidak valid, bukan file Excel.');
return $this->redirectToRoute('t_raw_data');
}
// --- 3. Cek isi file (signature sederhana) ---
// Buka beberapa byte pertama untuk pastikan tidak mengandung kode PHP
$firstBytes = file_get_contents($dataFile->getPathname(), false, null, 0, 2048);
$dangerousPatterns = [
'/<\?php/i', // PHP
'/<script\b/i', // JS/HTML
'/#!\/usr\/bin\/(python|bash|sh|perl)/i', // shebang
'/eval\s*\(/i',
'/base64_decode/i',
'/shell_exec/i',
'/exec\s*\(/i',
'/os\.system/i',
'/import\s+[a-z0-9_]+/i',
'/function\s+[a-z0-9_]+\s*\(/i'
];
foreach ($dangerousPatterns as $p) {
if (preg_match($p, $firstBytes)) {
// hapus tmp file untuk kebersihan, lalu tolak
@unlink($dataFile->getPathname());
$this->addFlash('error', 'Upload Gagal!, File berisi kode PHP dan ditolak.');
return $this->redirectToRoute('t_raw_data');
}
}
// --- 4. Simpan dengan nama aman ---
$safeFilename = md5(uniqid() . $dataFile->getClientOriginalName());
$filename = $safeFilename . '.' . $extension;
try {
$dataFile->move($uploads_directory, $filename);
} catch (FileException $e) {
// throw new \Exception('Gagal menyimpan file: ' . $e->getMessage());
$this->addFlash('error', 'Gagal menyimpan file: ' . $e->getMessage());
return $this->redirectToRoute('t_raw_data');
}
// $filename = md5(uniqid() . $dataFile->getClientOriginalName()) . '.' . $dataFile->guessExtension();
// $dataFile->move($uploads_directory, $filename);
// Upload file2 (monitoring)
// $dataFileMonitoringFull = $request->files->get('file_monitoring_full');
// $filename_monitoring_full = md5(uniqid() . $dataFileMonitoringFull->getClientOriginalName()) . '.' . $dataFileMonitoringFull->guessExtension();
// $dataFileMonitoringFull->move($uploads_directory, $filename_monitoring_full);
// Convert keduanya jadi array
// $spreadsheet1 = IOFactory::load($uploads_directory . '/' . $filename);
// $sheetData1 = $spreadsheet1->getActiveSheet()->toArray(null, true, true, true);
// $spreadsheet2 = IOFactory::load($uploads_directory . '/' . $filename_monitoring_full);
// $sheetData2 = $spreadsheet2->getActiveSheet()->toArray(null, true, true, true);
//cek header
$reader = IOFactory::createReader('Xlsx'); // atau 'Xls'
// Anonymous class implement IReadFilter
$reader->setReadFilter(new class implements IReadFilter {
public function readCell($column, $row, $worksheetName = '')
{
// hanya ambil baris 1–2
return $row <= 2;
}
});
$spreadsheet = $reader->load($uploads_directory . '/' . $filename);
$sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
// print_r($data);
// exit;
$header1 = $sheetData[1];
$header2 = $sheetData[2];
unset($sheetData[1]);
unset($sheetData[2]);
//cek header
$connection = $this->getDoctrine()->getConnection();
$sql = "SELECT * FROM t_header WHERE LOWER(head_1::text) = LOWER(:head_1) AND LOWER(head_2::text) = LOWER(:head_2)";
$stmt = $connection->prepare($sql);
$result = $stmt->executeQuery(['head_1' => strtolower(json_encode($header1)), 'head_2' => strtolower(json_encode($header2)),]);
$header = $result->fetchAssociative();
// print_r($header); exit;
if ($header) {
$header = $tHeaderRepo->find(['id' => $header['id']]);
$header->setHead1($header1);
$header->setHead2($header2);
$header->setUpdatedAt(new \DateTimeImmutable());
$header->setPeriodeUpload(new \DateTime($periode_upload));
} else {
// unlink($filename);
$this->addFlash('error', 'Header Tidak Sesuai');
return $this->redirectToRoute('t_raw_data');
//belum dipake dlu karena pasti 1 header
// $header = new THeader();
// $header->setHead1($header1);
// $header->setHead2($header2);
// $header->setCreatedAt(new \DateTimeImmutable());
}
$header->setFile($filename);
$em->persist($header);
$em->flush();
// print_r('aa'); exit;
//initializing
$t_progres = new TProgres();
$t_progres->setCreatedAt(new \DateTimeImmutable());
$t_progres->setReffKode('INISIALISASI_DATA');
$em->persist($t_progres);
$em->flush();
// Jalankan background job
$baseCmd = sprintf(
'%s/bin/console app:rawdata "%s" "%s"',
$this->getParameter('kernel.project_dir'),
$filename,
$periode_upload
);
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
$cmd = 'start /B php ' . $baseCmd;
} else {
$cmd = 'php7.4 ' . $baseCmd . ' > /dev/null 2>&1 &';
}
$process = Process::fromShellCommandline($cmd);
$process->disableOutput();
$process->start();
// $baseCmd = sprintf(
// '%s/bin/console app:rawdata "%s" "%s"',
// $this->getParameter('kernel.project_dir'),
// $filename,
// $tahun_anggaran
// );
// $php = PHP_BINARY;
// if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
// // Windows → jalankan lewat cmd.exe
// $cmd = 'cmd /c start /B ' . $php . ' ' . $baseCmd;
// } else {
// // Linux/Unix → async pakai &
// $cmd = $php . ' ' . $baseCmd . ' > /dev/null 2>&1 &';
// }
// $process = Process::fromShellCommandline($cmd);
// $process->disableOutput();
// $process->start();
// $php = PHP_BINARY;
// $console = $this->getParameter('kernel.project_dir') . '/bin/console';
// // print_r($console); exit;
// try {
// // --- Utama: Symfony Process (aman, cross-platform) ---
// $process = new Process([
// $php,
// $console,
// 'app:rawdata',
// $filename,
// $tahun_anggaran
// ]);
// $process->setWorkingDirectory($this->getParameter('kernel.project_dir'));
// $process->disableOutput();
// $process->start();
// print_r('aa'); exit;
// } catch (\Throwable $e) {
// // --- Fallback: exec() (string command) ---
// if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
// print_r('bb'); exit;
// // Windows background
// $cmd = sprintf(
// 'start /B %s %s app:rawdata %s %s',
// $php,
// $console,
// escapeshellarg($filename),
// escapeshellarg($tahun_anggaran)
// );
// } else {
// // Linux/Unix background
// $cmd = sprintf(
// '%s %s app:rawdata %s %s > /dev/null 2>&1 &',
// $php,
// $console,
// escapeshellarg($filename),
// escapeshellarg($tahun_anggaran)
// );
// }
// exec($cmd);
// }
$this->addFlash('notice', 'Upload file berhasil');
return $this->redirectToRoute('t_raw_data');
}
$lastUpdate = $tPostingLaporanRepo->findOneBy([], ['tanggal' => 'DESC']);
$lastUpdate = ($lastUpdate) ? $lastUpdate->getTanggal()->format("Y-m-d") : null;
return $this->render('/backend/t_raw_data/form_file.html.twig', [
// 't_raw_data' => $raw_data,
'lastUpdate' => $lastUpdate,
// 'bulan' => $this->getBulan(),
// 'periode' => $this->getArrayPeriode()
]);
}
/**
* @Route("/t_raw_data/{id}/delete_t_raw_data_file", name="t_raw_data_delete_file", methods={"GET"})
*/
public function delete_file(
?string $id = null,
TFileGrafikRepository $tFileGrafikRepo,
ManagerRegistry $managerRegistry,
TGrafikDinamisRepository $tGrafikDinamisRepo
) {
$em = $managerRegistry->getManager();
$file = $tFileGrafikRepo->find($id);
$pubId = $file->getGrafik()->getId();
// $countFiles = $file->getPub()->getTFiles()->count();
$files = $tFileGrafikRepo->findBy(['grafik' => $pubId]);
$countFiles = count($files);
if ($countFiles == 1) {
$grafik = $file->getGrafik()->getTGrafik();
if ($grafik) {
$em->remove($grafik);
}
foreach ($file->getPub()->getTVariabels() as $var) {
$em->remove($var);
}
}
$em->remove($file);
$em->flush();
$this->addFlash('notice', 'File berhasil dihapus');
return $this->redirectToRoute('publikasi_detail', ['id' => $pubId]);
}
/**
* @Route("/t_raw_data/progres", name="t_raw_data_progres", methods={"POST"})
*/
public function progress(TProgresRepository $tProgresRepo)
{
$progress = $tProgresRepo->findOneBy(['reff_kode' => 'RAW_DATA']);
$current = null;
$total = null;
if ($progress) {
$current = $progress->getDataMasuk();
$total = $progress->getJumlahData();
}
return new JsonResponse([
'show' => $progress ? true : false,
'current' => $current,
'total' => $total
]);
}
/**
* @Route("/publikasi/verifAll", name="publikasi_verif_all", methods={"GET"})
*/
public function verifall(TPublikasiRepository $tPublikasiRepo, MStatusRepository $mStatusRepo, ManagerRegistry $managerRegistry)
{
$em = $managerRegistry->getManager();
$user = $this->getUser();
if ($user->getRoles()[0] == 'ROLE_OPERATOR') {
$tPublikasi = $tPublikasiRepo->findBy(['status' => 13, 'div' => $user->getDiv()->getId()]);
foreach ($tPublikasi as $pub) {
$pub->setStatus($mStatusRepo->find(1));
$em->persist($pub);
}
$this->addFlash('notice', 'Dataset berhasil diajukan publik');
} else {
$tPublikasi = $tPublikasiRepo->findBy(['status' => 1]);
foreach ($tPublikasi as $pub) {
$pub->setStatus($mStatusRepo->find(3));
$em->persist($pub);
}
$this->addFlash('notice', 'Dataset berhasil diverifikasi');
}
$em->flush();
return $this->redirectToRoute('publikasi');
}
/**
* @Route("/t_raw_data_table", name="t_raw_data_table", methods={"GET", "POST"})
*/
public function dataset_table(?string $id, Request $request)
{
// Ambil data dari sumber
$array = $this->getDataTableRawData(null, null, null, null);
$items = $array['isi'] ?? [];
// Ambil parameter datatables
$draw = (int) $request->get('draw', 1);
$start = (int) $request->get('start', 0);
$length = (int) $request->get('length', 10);
// Ambil parameter pencarian per kolom
$columns = $request->get("columns", []);
$columnSearch = [];
foreach ($columns as $col) {
$columnName = $col["data"] ?? '';
$searchValue = $col["search"]["value"] ?? '';
if ($columnName !== '') {
$columnSearch[$columnName] = $searchValue;
}
}
// Filter data berdasarkan input pencarian
$filteredData = array_filter($items, function ($row) use ($columnSearch) {
foreach ($columnSearch as $columnName => $search) {
if ($search !== '') {
if (!isset($row[$columnName]) || stripos($row[$columnName], $search) === false) {
return false;
}
}
}
return true;
});
// Total & filtered
$recordsTotal = count($items);
$recordsFiltered = count($filteredData);
// Pagination
$pagedData = array_slice($filteredData, $start, $length);
// Response JSON untuk DataTables
return new JsonResponse([
'draw' => $draw,
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
'data' => array_values($pagedData),
]);
}
/**
* @Route("/t_raw_data/inisialisasi", name="t_raw_data_inisialisasi", methods={"POST"})
*/
public function inisialisasi(TProgresRepository $tProgresRepo)
{
$progress = $tProgresRepo->findOneBy(['reff_kode' => 'INISIALISASI_DATA']);
return new JsonResponse([
'show' => $progress ? true : false
]);
}
/**
* @Route("/t_raw_data/download_template", name="t_raw_data_download_template", methods={"GET", "POST"})
*/
public function download_template()
{
$filePath = $this->getParameter('kernel.project_dir') . '/public/template_upload.xlsx';
if (!file_exists($filePath)) {
throw $this->createNotFoundException('File tidak ditemukan.');
}
$response = new BinaryFileResponse($filePath);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'template_upload.xlsx'
);
return $response;
}
}