<?php
namespace App\Controller\Backend;
use App\Controller\Base\BaseController;
use App\Entity\TCleansingRaw;
use App\Entity\TFileGrafik;
use App\Entity\TGrafik;
use App\Form\TGrafikType;
use App\Entity\TGrafikDinamis;
use App\Entity\THeader;
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\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\TProgresRepository;
use App\Repository\TRawDataRepository;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Kematjaya\Export\Manager\ManagerInterface;
use Kematjaya\Export\Processor\Excel\SpreadsheetFromArrayProcessor;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
use Symfony\Component\HttpFoundation\Response;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class TCleansingRawController extends BaseController
{
private $pageName = 'cleansing_raw';
private $class = TCleansingRaw::class;
/**
* @Route("/cleansing_raw", name="cleansing_raw")
*/
public function index(SeoPageInterface $seoPage, BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface): Response
{
$userRoles = $this->getUser()->getRoles();
$seoPage->addTitlePrefix("Cleansing");
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('Cleansing Raw Data');
$array = $this->getDataTableCleansing(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/cleansing_raw/index.html.twig', [
'page_name' => $this->pageName,
'header' => $header,
'headers_grouped' => $processedHeaders,
'button_credential' => $this->buttonCredentials(),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/cleansing_raw/export",name="cleansing_raw_export")
*/
public function export(Request $request, ManagerInterface $managerInterface)
{
$header = $this->getDataHeader();
// print_r($header); exit;
$head1 = $header[0]['head1'];
$head2 = $header[1]['head2'];
$head_tambahan = ['kategori_plant' => 'KATEGORI PLANT', 'regional' => 'REGIONAL', 'status_pp_update' => 'STATUS PP UPDATE', 'kategori_tahap' => 'KATEGORI TAHAP', 'nilai_saving_terhadap_anggaran' => 'NILAI SAVING TERHADAP ANGGARAN', 'nilai_saving_terhadap_hps' => 'NILAI SAVING TERHADAP HPS', 'saving_persen_terhadap_angggaran' => 'NILAI SAVING TERHADAP ANGGARAN (%)', 'saving_persen_terhadap_hps' => 'NILAI SAVING TERHADAP HPS (%)'];
// Gabungkan semua field-key
$all_keys = array_merge(array_keys($head2), array_keys($head_tambahan));
// Gabungkan label head2
$head2 = array_merge($head2, $head_tambahan);
// Head1 untuk tambahan diisi kosong
foreach ($head_tambahan as $key => $label) {
$head1[$key] = ''; // tidak merge
}
// Ambil data
$array = $this->getDataTableCleansing(null, null, null, null);
$data = $array['isi'] ?? [];
// Buat spreadsheet
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// == HEADER ==
$colIndex = 1;
foreach ($all_keys as $key) {
$colLetter = Coordinate::stringFromColumnIndex($colIndex);
// Head 1
$label1 = $head1[$key] ?? '';
$sheet->setCellValue("{$colLetter}1", $label1);
// Head 2
$label2 = $head2[$key] ?? '';
$sheet->setCellValue("{$colLetter}2", $label2);
$colIndex++;
}
// Merge Head1 yang perlu digabung (sama seperti sebelumnya)
$prevVal = null;
$mergeStart = 1;
$colIndex = 1;
foreach ($all_keys as $i => $key) {
$label = $head1[$key] ?? '';
if ($label !== '' && $label !== $prevVal) {
if ($prevVal !== null && $colIndex - 1 > $mergeStart) {
$startLetter = Coordinate::stringFromColumnIndex($mergeStart);
$endLetter = Coordinate::stringFromColumnIndex($colIndex - 1);
$sheet->mergeCells("{$startLetter}1:{$endLetter}1");
}
$mergeStart = $colIndex;
$prevVal = $label;
}
$colIndex++;
}
// merge terakhir
if ($prevVal !== null && $colIndex - 1 >= $mergeStart) {
$startLetter = Coordinate::stringFromColumnIndex($mergeStart);
$endLetter = Coordinate::stringFromColumnIndex($colIndex - 1);
$sheet->mergeCells("{$startLetter}1:{$endLetter}1");
}
// == ISI DATA ==
$rowIndex = 3;
foreach ($data as $rowData) {
$colIndex = 1;
foreach ($all_keys as $key) {
$colLetter = Coordinate::stringFromColumnIndex($colIndex);
$sheet->setCellValue("{$colLetter}{$rowIndex}", $rowData[$key] ?? '');
$colIndex++;
}
$rowIndex++;
}
// Styling
$lastColLetter = Coordinate::stringFromColumnIndex(count($all_keys));
$sheet->getStyle("A1:{$lastColLetter}2")->getFont()->setBold(true);
foreach (range('A', $lastColLetter) as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Output
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$content = ob_get_clean();
return new \Symfony\Component\HttpFoundation\Response(
$content,
200,
[
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Content-Disposition' => 'attachment; filename="export_cleansing_data.xlsx"',
]
);
}
/**
* @Route("/cleansing_raw_data_table", name="cleansing_raw_data_table", methods={"GET", "POST"})
*/
public function dataset_table(?string $id, Request $request)
{
// Ambil data dari sumber
$array = $this->getDataTableCleansing(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("/cleansing_raw/progres", name="cleansing_raw_progres", methods={"POST"})
*/
public function progress(TProgresRepository $tProgresRepo)
{
$progress = $tProgresRepo->findOneBy(['reff_kode' => 'CLEANSING_RAW']);
$current = null;
$total = null;
if ($progress) {
$current = $progress->getDataMasuk();
$total = $progress->getJumlahData();
}
return new JsonResponse([
'show' => $progress ? true : false,
'current' => $current,
'total' => $total
]);
}
}