<?php
namespace App\Controller\Backend;
use App\Controller\Base\BaseController;
use App\Entity\MKategoriDetail;
use App\Entity\TData;
use App\Entity\TDeskripsiData;
use App\Entity\TGrafik;
use App\Entity\TMetaData;
use App\Filter\TGrafikFilterType;
use App\Form\TGrafikType;
use App\Repository\MKategoriDetailRepository;
use App\Repository\MKategoriRepository;
use App\Repository\MPeriodeRepository;
use App\Repository\MStatusRepository;
use App\Repository\MUrusanRepository;
use App\Repository\TDataRepository;
use App\Repository\TGrafikRepository;
use App\Repository\TLogRepository;
use App\Repository\TPublikasiRepository;
use App\Repository\TVariabelRepository;
use App\Repository\MKotaRepository;
use App\Repository\TDeskripsiDataRepository;
use App\Repository\TMetaDataRepository;
use App\Transformer\DataTransformer;
use App\Transformer\NewPublikasiTransformer;
use App\Utils\ObjectManager;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
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 Doctrine\Persistence\ManagerRegistry;
use Kematjaya\Export\Manager\ManagerInterface;
use Kematjaya\Export\Processor\Excel\SpreadsheetFromArrayProcessor;
use Psr\Log\LoggerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Exception;
class TGrafikController extends BaseController
{
private $pageName = 't_grafik';
private $class = TGrafik::class;
/**
* @Route("/t_grafik", name="t_grafik")
*/
public function index(BreacrumbBuilder $builder, Request $request, PaginatorInterface $paginatorInterface, Security $security): Response
{
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('View Data');
$user = $security->getUser();
// dump($user->getRoles()); exit;
$form = $this->createFormFilter(TGrafikFilterType::class);
$queryBuilder = $this->getQueryBuilder($this->class);
$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);
return $this->render('backend/t_grafik/index.html.twig', [
'page_name' => $this->pageName,
'button_credential' => $this->buttonCredentials($this->pageName),
'filter' => $form->createView(),
'pagination' => $pagination,
]);
}
/**
* @Route("/t_grafik/{id}/detail", name="t_grafik_detail", methods={"GET", "POST"})
*/
public function detail(
BreacrumbBuilder $builder,
TGrafik $tGrafik,
TVariabelRepository $tVariabelRepo,
TGrafikRepository $tGrafikRepo,
Request $request,
TDeskripsiDataRepository $tDeskripsiDataRepository
) {
$builder->add('Dashboard ', "dashboard", array(), " <i class='fa fa-home'></i>");
$builder->add('View Data', "t_grafik");
$builder->add('Detail');
$variable = $request->get('variable');
$tahun = $request->get('year') == "" ? (new \DateTime())->format('Y') : $request->get('year');
$grafik = $tGrafikRepo->find($tGrafik);
$tipe_grafik = ($grafik) ? $grafik->getTipe() : null;
$grafik_info = [];
if ($grafik) {
$sumbu_x = ($grafik->getAxisx() == 'kategori_plant') ? 'plant' : $grafik->getAxisx(); // Misalnya: plant
$sumbu_y = $grafik->getAxisYIds(); // Misalnya: ['count_days', 'nilai_investasi']
if ($grafik->getAxisx() == 'all') {
$columns = $sumbu_y;
} else {
$columns = array_merge([$sumbu_x], $sumbu_y);
}
// print_r($columns); exit;
$grafik_info = [
'title' => $grafik->getJudul(),
'tipe' => $grafik->getTipe(),
// 'varX' => $variabel_x->getNama(),
'varX' => $grafik->getAxisX(),
// 'varY' => $variabel_y->getNama()
];
}
return $this->render('backend/t_grafik/detail.html.twig', [
'page_name' => $this->pageName,
'button_credential' => $this->buttonCredentials($this->pageName),
// '' => $detail,
// 'kategori' => $kategori,
// 'variabel' => $variabel,
'grafik' => $grafik,
'columns' => $columns,
'grafik_info' => $grafik_info,
// 'indikator' => $indikator,
'tipe_grafik' => $tipe_grafik,
// 'pub_id' => $detail->getId(),
'deskripsi' => $grafik ? $grafik->getDeskripsi() : '',
// 'choiced_field' => json_encode($variable),
// 'total' => $total,
// // 'average_year' => $tahunRataRata,
// // 'average_value' => $valueRataRata,
// 'label_min' => $labelMin,
// 'label_max' => $labelMax,
// 'value_min' => $valueMin,
// 'value_max' => $valueMax,
// 'variabel_name' => $variable_name,
// 'value_name' => $value_name
]);
}
/**
* @Route("/t_grafik/{id}/delete_grafik", name="t_grafik_delete", methods={"GET"})
*/
public function delete(?string $id = null, TGrafikRepository $tGrafikRepo, TLogRepository $tLogRepo, LoggerInterface $dbLogger, Security $security)
{
$user = $security->getUser();
$grafik = $tGrafikRepo->find($id);
// dump($kategori); exit;
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($grafik);
$entityManager->flush();
$dbLogger->info("Hapus dataset " . $grafik->getJudul(), ["reff_name" => "delete_grafik", "reff_id" => $grafik->getId(), "created_by" => $user->getId()]);
$this->addFlash('notice', 'Grafik "' . $grafik->getJudul() . '" berhasil dihapus');
return $this->redirectToRoute('t_grafik');
}
/**
* @Route("/add_selected", name="publikasi_add_selected", methods={"POST"})
*/
public function add_selected(Request $request, ObjectManager $objectManager)
{
$sessionName = $request->get("name");
$this->get('session')->set($sessionName, $request->get('selected'));
$selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
return $this->json($selected);
}
/**
* @Route("/action_selected", name="publikasi_action_selected", methods={"POST"})
*/
public function action_selected(Request $request, ObjectManager $objectManager)
{
$sessionName = $request->get("name");
if ($this->isCsrfTokenValid($sessionName . '_action_selected', $request->request->get('_token'))) {
$selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
$deleted = $objectManager->deleteByIds($this->class, $selected);
if ($deleted) {
$this->get('session')->set($sessionName, []);
$this->addFlash('success', $this->getTranslator()->trans('messages.deleted.success'));
} else {
$this->addFlash('error', $this->getTranslator()->trans('messages.deleted.error'));
}
}
return $this->redirectToRoute('publikasi');
}
/**
* @Route("/publikasi/{id}/{choiced_field}/{tahun}/dataset_table", name="publikasi_dataset_table", methods={"GET", "POST"})
*/
public function dataset_table(?string $id, ?string $choiced_field, ?string $tahun, Request $request)
{
$item_per_page = $_POST['length'];
$page = ($_POST['start'] / $item_per_page) + 1;
$page = ($page - 1) * 10;
$dataset = $this->getDataTable($id, 10, $page, $_POST, null, null, json_decode($choiced_field), $tahun);
$jumlah = count($this->getDataTable($id, null, null, $_POST, null, null, json_decode($choiced_field), $tahun));
$arrJson['aaData'] = $dataset;
$arrJson['iTotalRecords'] = $jumlah;
$arrJson['iTotalDisplayRecords'] = $jumlah;
return new JsonResponse($arrJson);
}
/**
* @Route("/t_grafik/form_grafik{id}", defaults={"id"= null}, name="t_grafik_form_grafik", methods={"GET", "POST"})
*/
public function form_grafik(
?string $id,
Request $request,
TMetaDataRepository $tMetaDataRepo,
TGrafikRepository $tGrafikRepo,
TVariabelRepository $tVariabelRepo,
LoggerInterface $dbLogger,
Security $security,
ManagerRegistry $managerRegistry
) {
$user = $security->getUser();
$column_select = array('x' => 0, 'y' => 0);
if ($id) {
$grafik = $tGrafikRepo->findOneBy(['id' => $id]);
$columns = $this->getKolomTabel($grafik->getTabel());
$column_select['x'] = $grafik->getAxisX();
$column_select['y'] = $grafik->getAxisYIds();
$column_tipe['tipe'] = $grafik->getTipe();
} else {
$columns = [];
$grafik = new TGrafik();
$column_tipe['tipe'] = null;
}
// if(!$grafik){
// throw new NotFoundHttpException();
// }
$form = $this->createForm(TGrafikType::class, $grafik, ['action' => $this->generateUrl('t_grafik_form_grafik', ['id' => $id])]);
$tabels = $tMetaDataRepo->findAll(['id' => 'asc']);
$res_table = ['t_weekly_explore_report' => 'Weekly Eksplore Report'];
foreach ($tabels as $table) {
$res_table[$table->getNamaTabel()] = $table->getJudul();
}
// print_r($res_table); exit;
$tipe_grafik = ['line' => 'Line', 'column' => 'Column'];
$operations = ['SUM' => 'SUM', 'COUNT' => 'COUNT'];
$selectedAxisX = $grafik->getAxisx(); // 1 kolom string
$selectedAxisY = $grafik->getAxisYIds(); // array kolom
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// set filter
$where = [];
$variabels = $request->request->get('variabel');
$operators = $request->request->get('where');
$isians = $request->request->get('isian');
if ($variabels) {
foreach ($variabels as $key => $field) {
$operator = strtoupper(trim($operators[$key]));
$isian = strtolower(trim($isians[$key])); // konversi ke huruf kecil
if ($operator === 'IN') {
// Pisahkan dan lowercase semua nilai
$values = array_map('trim', explode(',', $isian));
$quotedValues = array_map(fn($v) => "'" . strtolower($v) . "'", $values);
$formattedValue = '(' . implode(', ', $quotedValues) . ')';
$where[] = "LOWER($field) IN $formattedValue";
} else {
$formattedValue = "'" . $isian . "'";
$where[] = "LOWER($field) $operator $formattedValue";
}
}
$whereClause = implode(' AND ', $where);
}
$tabel = $request->request->get('table');
$kolom = $request->request->get('kolom');
$operation = $request->request->get('operation');
$connection = $this->getDoctrine()->getConnection();
if ($operation == 'SUM') {
$sql = "SELECT SUM(CASE
WHEN NULLIF(TRIM(REPLACE($kolom::text, ',', '')), '') IS NOT NULL
THEN (REPLACE($kolom::text, ',', ''))::numeric
ELSE 0
END) as jumlah FROM $tabel ";
} else if ($operation == 'PERSENTASE') {
$sql = "SELECT COUNT($kolom) * 100.0 / (SELECT COUNT($kolom) FROM $tabel) as jumlah";
$sql .= " FROM $tabel";
} else {
$sql = "SELECT $operation($kolom) as jumlah FROM $tabel ";
}
if ($variabels) {
$sql .= " WHERE $whereClause";
}
if ($request->request->get('is_create_view') && $request->request->get('periode')) {
$periode = $request->request->get('periode');
if ($variabels) {
$sql .= " AND $periode IS NOT NULL";
} else {
$sql .= " WHERE $periode IS NOT NULL";
}
}
// dump($request->request->get('axisy'));exit;
$meta_data = $tMetaDataRepo->findOneBy(['nama_tabel' => $request->request->get('table')]);
// $axisY = $tVariabelRepo->find($request->request->get('axisy'));
// print_r($request->request->get('tipe')); exit;
$data = $form->getData();
$data->setReffId(($meta_data) ? $meta_data->getId() : null);
$data->setAxisX($request->request->get('axisx'));
// $data->setTipe($request->request->get('tipe'));
// $data->setAxisY($axisY->getId());
$data->setAxisYIds($request->request->get('axisy'));
$data->setOperation($request->request->get('operation'));
$data->setTabel($request->request->get('table'));
$data->setCreatedAt(new \DateTime());
$data->setFilter($where);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($data);
$entityManager->flush();
$dbLogger->info("Membuat Grafik " . $data->getJudul(), ["reff_name" => "buat_grafik", "reff_id" => $data->getId(), "created_by" => $user->getId()]);
$this->addFlash('notice', 'Grafik berhasil tidak ditampilkan');
return $this->redirectToRoute('t_grafik');
}
return $this->render('/backend/t_grafik/form_grafik.html.twig', [
'form' => $form->createView(),
'columns' => $columns,
'tables' => $res_table,
'operations' => $operations,
'tipe_grafik' => $tipe_grafik,
'grafik' => $grafik,
'column_select' => $column_select,
'column_tipe' => $column_tipe,
'selectedAxisX' => $selectedAxisX,
'selectedAxisY' => $selectedAxisY,
'isForm' => true
]);
}
/**
* @Route("/t_grafik/get_column", name="t_grafik_get_column", methods={"POST", "GET"})
*/
public function get_column(
Request $request,
TMetaDataRepository $tMetaDataRepo,
TVariabelRepository $tVariabelRepo,
ManagerRegistry $managerRegistry
) {
$id = $request->get('id');
$hasil = $this->getKolomTabel($id);
$opt = '<option value=""></option>';
$opt .= '<option value="all">All</option>';
if ($hasil) {
// $kategoriPlant = ['column_name' => 'kategori_plant'];
// array_unshift($hasil, $kategoriPlant);
foreach ($hasil as $key => $value) {
if ($value['column_name'] == 'id' || $value['column_name'] == 'created_at' || $value['column_name'] == 'updated_at') {
continue;
}
// $selected = ($request->getParameter('jenis') == $o->getId()) ? 'selected="selected"' : '';
$opt .= '<option value="' . $value['column_name'] . '">' . $value['column_name'] . '</option>';
}
}
return new JsonResponse($opt);
}
/**
* @Route("/t_grafik/{id}/chartJson", name="t_grafik_chart_json", methods={"POST", "GET"})
*/
public function chartJson(
Request $request,
// TPublikasi $tPublikasi,
TGrafik $tGrafik,
TGrafikRepository $tGrafikRepo,
TVariabelRepository $tVariabelRepo,
TDataRepository $tDataRepo,
ManagerRegistry $managerRegistry
) {
$detail = $tGrafikRepo->find($tGrafik);
$tahun = $request->get("tahun");
$graph = $this->getTabelGrafik($detail->getId(), 'chart',$tahun);
// print_r($graph); exit;
return $graph;
}
/**
* @Route("/t_grafik/{id}/dataTable", name="t_grafik_data_table", methods={"POST", "GET"})
*/
public function dataTable(
Request $request,
// TPublikasi $tPublikasi,
TGrafik $tGrafik,
TGrafikRepository $tGrafikRepo,
TVariabelRepository $tVariabelRepo,
TDataRepository $tDataRepo,
ManagerRegistry $managerRegistry
) {
$detail = $tGrafikRepo->find($tGrafik);
$tahun = $request->get("tahun");
$graph = $this->getTabelGrafik($detail->getId(), 'table', $tahun);
return $graph;
}
}