src/Controller/Backend/TExploreDataController.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Backend;
  3. use App\Controller\Base\BaseController;
  4. use App\Entity\TExploreData;
  5. use App\Entity\TExploreDataDetail;
  6. use App\Entity\TMetaData;
  7. use App\Filter\TExploreDataDetailFilterType;
  8. use App\Filter\TExploreDataFilterType;
  9. use App\Filter\TGrafikFilterType;
  10. use App\Form\TExploreDataType;
  11. use App\Form\TGrafikType;
  12. use App\Repository\TDataRepository;
  13. use App\Repository\TGrafikRepository;
  14. use App\Repository\TLogRepository;
  15. use App\Repository\TPublikasiRepository;
  16. use App\Repository\TVariabelRepository;
  17. use App\Repository\MKotaRepository;
  18. use App\Repository\TDeskripsiDataRepository;
  19. use App\Repository\TExploreDataDetailRepository;
  20. use App\Repository\TExploreDataRepository;
  21. use App\Repository\TMetaDataRepository;
  22. use App\Transformer\DataTransformer;
  23. use App\Transformer\NewPublikasiTransformer;
  24. use App\Utils\ObjectManager;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
  28. use Knp\Component\Pager\PaginatorInterface;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  32. use Kematjaya\ImportBundle\Manager\ImportManagerInterface;
  33. use Kematjaya\ImportBundle\DataSource\RemoteDataSource;
  34. use App\Transformer\PublikasiTransformer;
  35. use App\Transformer\VariabelTransformer;
  36. use Doctrine\Persistence\ManagerRegistry;
  37. use Kematjaya\Export\Manager\ManagerInterface;
  38. use Kematjaya\Export\Processor\Excel\SpreadsheetFromArrayProcessor;
  39. use Psr\Log\LoggerInterface;
  40. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  41. use Symfony\Component\Security\Core\Security;
  42. use Exception;
  43. class TExploreDataController extends BaseController
  44. {
  45.     private $pageName 'explore_data';
  46.     private $class TExploreDataDetail::class;
  47.     /**
  48.      * @Route("/explore_data", name="explore_data")
  49.      */
  50.     public function index(BreacrumbBuilder $builderRequest $requestPaginatorInterface $paginatorInterfaceSecurity $security): Response
  51.     {
  52.         $builder->add('Dashboard '"dashboard", array(), "&nbsp;<i class='fa fa-home'></i>");
  53.         $builder->add('ANALYTICS');
  54.         $user $security->getUser();
  55.         // dump($user->getRoles()); exit;
  56.         $form $this->createFormFilter(TExploreDataDetailFilterType::class);
  57.         $queryBuilder $this->getQueryBuilder($this->class);
  58.         $queryBuilder $this->buildFilter($request$form$queryBuilder)->addOrderBy("this.id""DESC");
  59.         $this->setSessionLimit($request);
  60.         $maxPerPage $request->getSession()->get("limit") ? $request->getSession()->get("limit") : $this->getLimit();
  61.         $pagination $paginatorInterface->paginate($queryBuilder$request->query->getInt('page'1), $maxPerPage);
  62.         return $this->render('backend/explore_data/index.html.twig', [
  63.             'page_name' => $this->pageName,
  64.             'button_credential' => $this->buttonCredentials($this->pageName),
  65.             'filter' => $form->createView(),
  66.             'pagination' => $pagination,
  67.         ]);
  68.     }
  69.     /**
  70.      * @Route("/explore_data/{id}/detail", name="explore_data_detail", methods={"GET", "POST"})
  71.      */
  72.     public function detail(
  73.         BreacrumbBuilder $builder,
  74.         TExploreData $tExploreData,
  75.         TVariabelRepository $tVariabelRepo,
  76.         TExploreDataRepository $tExploreDataRepo,
  77.         TExploreDataDetailRepository $tExploreDataDetailRepo,
  78.         Request $request,
  79.         TDeskripsiDataRepository $tDeskripsiDataRepository
  80.     ) {
  81.         $builder->add('Dashboard '"dashboard", array(), "&nbsp;<i class='fa fa-home'></i>");
  82.         $builder->add('ANALYTICS'"explore_data");
  83.         $builder->add('Detail');
  84.         $variable $request->get('variable');
  85.         $tahun $request->get('year') == "" ? (new \DateTime())->format('Y') : $request->get('year');
  86.         $explore $tExploreDataRepo->find($tExploreData);
  87.         $detail_explore $tExploreDataDetailRepo->findBy(['explore_id' => $explore->getId()], ['id' => 'ASC']);
  88.         // $tipe_grafik = ($explore) ? $grafik->getTipe() : null;
  89.         $grafik_info = [];
  90.         return $this->render('backend/explore_data/detail.html.twig', [
  91.             'page_name' => $this->pageName,
  92.             'button_credential' => $this->buttonCredentials($this->pageName),
  93.             // '' => $detail,
  94.             // 'kategori' => $kategori,
  95.             // 'variabel' => $variabel,
  96.             'explore' => $explore,
  97.             'detail_explore' => $detail_explore,
  98.             // 'columns' => $columns,
  99.             // 'grafik_info' => $grafik_info,
  100.             // // 'indikator' => $indikator,
  101.             // 'tipe_grafik' => $tipe_grafik,
  102.             // // 'pub_id' => $detail->getId(),
  103.             // 'deskripsi' => $grafik ? $grafik->getDeskripsi() : '',
  104.             // 'choiced_field' => json_encode($variable),
  105.             // 'total' => $total,
  106.             // // 'average_year' => $tahunRataRata,
  107.             // // 'average_value' => $valueRataRata,
  108.             // 'label_min' => $labelMin,
  109.             // 'label_max' => $labelMax,
  110.             // 'value_min' => $valueMin,
  111.             // 'value_max' => $valueMax,
  112.             // 'variabel_name' => $variable_name,
  113.             // 'value_name' => $value_name
  114.         ]);
  115.     }
  116.     /**
  117.      * @Route("/explore_data/{id}/delete_explore_data", name="explore_data_delete", methods={"GET"})
  118.      */
  119.     public function delete(?string $id nullTExploreDataDetailRepository $tExploreDataDetailRepoTLogRepository $tLogRepoLoggerInterface $dbLoggerSecurity $security)
  120.     {
  121.         $user $security->getUser();
  122.         $explore $tExploreDataDetailRepo->find($id);
  123.         // dump($kategori); exit;
  124.         $entityManager $this->getDoctrine()->getManager();
  125.         $entityManager->remove($explore);
  126.         $entityManager->flush();
  127.         $dbLogger->info("Hapus Eksplorasi " $explore->getNama(), ["reff_name" => "delete_explorasi""reff_id" => $explore->getId(), "created_by" => $user->getId()]);
  128.         $this->addFlash('notice''Eksplorasi Data "' $explore->getNama() . '" berhasil dihapus');
  129.         return $this->redirectToRoute('explore_data');
  130.     }
  131.     /**
  132.      * @Route("/add_selected", name="publikasi_add_selected", methods={"POST"})
  133.      */
  134.     public function add_selected(Request $requestObjectManager $objectManager)
  135.     {
  136.         $sessionName $request->get("name");
  137.         $this->get('session')->set($sessionName$request->get('selected'));
  138.         $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  139.         return $this->json($selected);
  140.     }
  141.     /**
  142.      * @Route("/action_selected", name="publikasi_action_selected", methods={"POST"})
  143.      */
  144.     public function action_selected(Request $requestObjectManager $objectManager)
  145.     {
  146.         $sessionName $request->get("name");
  147.         if ($this->isCsrfTokenValid($sessionName '_action_selected'$request->request->get('_token'))) {
  148.             $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  149.             $deleted $objectManager->deleteByIds($this->class$selected);
  150.             if ($deleted) {
  151.                 $this->get('session')->set($sessionName, []);
  152.                 $this->addFlash('success'$this->getTranslator()->trans('messages.deleted.success'));
  153.             } else {
  154.                 $this->addFlash('error'$this->getTranslator()->trans('messages.deleted.error'));
  155.             }
  156.         }
  157.         return $this->redirectToRoute('publikasi');
  158.     }
  159.     /**
  160.      * @Route("/explore_data/form_explore{id}", defaults={"id"= null}, name="explore_data_form_explore", methods={"GET", "POST"})
  161.      */
  162.     public function form_explore(
  163.         ?string $id,
  164.         Request $request,
  165.         TMetaDataRepository $tMetaDataRepo,
  166.         TExploreDataRepository $tExploreDataRepo,
  167.         TVariabelRepository $tVariabelRepo,
  168.         LoggerInterface $dbLogger,
  169.         Security $security,
  170.         ManagerRegistry $managerRegistry
  171.     ) {
  172.         $user $security->getUser();
  173.         $column_select = array('x' => 0'y' => 0);
  174.         if ($id) {
  175.             $explore $tExploreDataRepo->findOneBy(['id' => $id]);
  176.         } else {
  177.             $explore = new TExploreData();
  178.         }
  179.         // if(!$grafik){
  180.         //     throw new NotFoundHttpException();
  181.         // }
  182.         $form $this->createForm(TExploreDataType::class, $explore, ['action' => $this->generateUrl('explore_data_form_explore', ['id' => $id])]);
  183.         $form->handleRequest($request);
  184.         if ($form->isSubmitted() && $form->isValid()) {
  185.             // dump($request->request->get('axisy'));exit;
  186.             $data $form->getData();
  187.             $data->setCreatedAt(new \DateTime());
  188.             $entityManager $this->getDoctrine()->getManager();
  189.             $entityManager->persist($data);
  190.             $entityManager->flush();
  191.             $dbLogger->info("Membuat Explore data " $data->getNama(), ["reff_name" => "buat_explore_data""reff_id" => $data->getId(), "created_by" => $user->getId()]);
  192.             $this->addFlash('notice''berhasil Buat Data');
  193.             return $this->redirectToRoute('explore_data');
  194.         }
  195.         return $this->render('/backend/explore_data/form_explore.html.twig', [
  196.             'form' => $form->createView()
  197.         ]);
  198.     }
  199.     /**
  200.      * @Route("/explore_data/form_detail", name="explore_data_form_explore_detail", methods={"GET", "POST"})
  201.      */
  202.     public function form_detail(
  203.         Request $request,
  204.         TMetaDataRepository $tMetaDataRepo,
  205.         TExploreDataRepository $tExploreDataRepo,
  206.         TExploreDataDetailRepository $tExploreDataDetailRepo,
  207.         TVariabelRepository $tVariabelRepo,
  208.         LoggerInterface $dbLogger,
  209.         Security $security,
  210.         ManagerRegistry $managerRegistry
  211.     ) {
  212.         $user $security->getUser();
  213.         $header $this->getDataHeader();
  214.         // print_r($header); exit;
  215.         $header $header[1]['head2'];
  216.         $column_select = array('x' => 0'y' => 0);
  217.         // print_r($request->request->get('id')); exit;
  218.         if ($request->request->get('id')) {
  219.             $detail $tExploreDataDetailRepo->findOneBy(['id' => $request->request->get('id')]);
  220.             $columns $this->getKolomTabel($detail->getTabel());
  221.         } else {
  222.             $detail = new TExploreDataDetail();
  223.             $columns = [];
  224.         }
  225.         // if(!$grafik){
  226.         //     throw new NotFoundHttpException();
  227.         // }
  228.         // $tabels = $tMetaDataRepo->findAll(['id' => 'asc']);
  229.         $tabels $tMetaDataRepo->findBy(['id' => 40], ['id' => 'asc']);
  230.         $view_explorasi $tExploreDataDetailRepo->findBy(['is_create_view' => 'true']);
  231.         $res_view = [];
  232.         foreach ($view_explorasi as $explore) {
  233.             $res_view[$explore->getView()] = $explore->getNama() . ' (Analytic)';
  234.         }
  235.         // $res_table = ['t_weekly_explore_report' => 'Weekly Eksplore Report'];
  236.         $res_table = [];
  237.         foreach ($tabels as $table) {
  238.             $res_table[$table->getNamaTabel()] = $table->getJudul() . ' (Meta Data)';
  239.         }
  240.         $res_table array_merge($res_table$res_view);
  241.         // print_r($request->get('explore')); exit;
  242.         // $operations = ['SUM' => 'SUM', 'COUNT' => 'COUNT', 'AVG' => 'AVERAGE', 'PERSENTASE' => 'PERSENTASE'];
  243.         $operations = ['SUM' => 'SUM''COUNT' => 'COUNT''AVG' => 'AVERAGE'];
  244.         // if ($request->request->get('explore_id')) {
  245.         if ($request->isMethod('POST')) {
  246.             // dump($request->request->get('variabel'));exit;
  247.             $where = [];
  248.             $variabels $request->request->get('variabel');
  249.             $operators $request->request->get('where');
  250.             $isians    $request->request->get('isian');
  251.             if ($variabels) {
  252.                 foreach ($variabels as $key => $field) {
  253.                     $operator strtoupper(trim($operators[$key]));
  254.                     $isian strtolower(trim($isians[$key])); // konversi ke huruf kecil
  255.                     if ($operator === 'IN') {
  256.                         // Pisahkan dan lowercase semua nilai
  257.                         $values array_map('trim'explode(','$isian));
  258.                         $quotedValues array_map(fn($v) => "'" strtolower($v) . "'"$values);
  259.                         $formattedValue '(' implode(', '$quotedValues) . ')';
  260.                         $where[] = "LOWER($field) IN $formattedValue";
  261.                     } else {
  262.                         $formattedValue "'" $isian "'";
  263.                         $where[] = "LOWER($field$operator $formattedValue";
  264.                     }
  265.                 }
  266.                 $whereClause implode(' AND '$where);
  267.             }
  268.             $tabel $request->request->get('table');
  269.             $kolom $request->request->get('kolom');
  270.             $operation $request->request->get('operation');
  271.             $connection $this->getDoctrine()->getConnection();
  272.             if ($operation == 'SUM') {
  273.                 $sql "SELECT SUM(CASE
  274.                     WHEN NULLIF(TRIM(REPLACE($kolom::text, ',', '')), '') IS NOT NULL
  275.                      THEN (REPLACE($kolom::text, ',', ''))::numeric
  276.                     ELSE 0
  277.                      END) as jumlah FROM  $tabel ";
  278.             } else if ($operation == 'PERSENTASE') {
  279.                 $sql "SELECT COUNT($kolom) * 100.0 / (SELECT COUNT($kolom) FROM $tabel) as jumlah";
  280.                 $sql .= " FROM $tabel";
  281.             } else {
  282.                 $sql "SELECT $operation($kolom) as jumlah FROM  $tabel ";
  283.             }
  284.             if ($variabels) {
  285.                 $sql .= " WHERE $whereClause";
  286.             }
  287.             if ($request->request->get('is_create_view') && $request->request->get('periode')) {
  288.                 $periode $request->request->get('periode');
  289.                 if ($variabels) {
  290.                     $sql .= " AND $periode IS NOT NULL";
  291.                 } else {
  292.                     $sql .= " WHERE $periode IS NOT NULL";
  293.                 }
  294.             }
  295.             $stmt $connection->prepare($sql);
  296.             $stmt->execute();
  297.             $result $stmt->fetchAll();
  298.             // print_r($result); exit;
  299.             $detail->setExploreId($request->request->get('explore_id'));
  300.             $detail->setNama($request->request->get('nama'));
  301.             $detail->setDeskripsi($request->request->get('deskripsi'));
  302.             $detail->setTabel($request->request->get('table'));
  303.             $detail->setKolom($request->request->get('kolom'));
  304.             $detail->setFrekuensi($request->request->get('frekuensi'));
  305.             $detail->setNilai($result[0][strtolower('jumlah')]);
  306.             $detail->setOperation($request->request->get('operation'));
  307.             $detail->setPeriode($request->request->get('periode'));
  308.             $detail->setFilter($where);
  309.             $detail->setCreatedAt(new \DateTime());
  310.             $entityManager $this->getDoctrine()->getManager();
  311.             $entityManager->persist($detail);
  312.             $entityManager->flush();
  313.             if ($request->request->get('is_create_view')) {
  314.                 $view 'v_' $detail->getId();
  315.                 $detail->setView($view);
  316.                 $detail->setIsCreateView(true);
  317.             }
  318.             // $query = $connection->prepare("select view_definition from information_schema.views where table_name = '$view'");
  319.             //create view
  320.             if ($request->request->get('is_create_view') && $request->request->get('periode')) {
  321.                 $periode $request->request->get('periode');
  322.                 $table $request->request->get('table');
  323.                 if ($operation == 'SUM') {
  324.                     $operationx "SUM(CASE
  325.                      WHEN NULLIF(TRIM(REPLACE($kolom::text, ',', '')), '') IS NOT NULL
  326.                     THEN (REPLACE($kolom::text, ',', ''))::numeric
  327.                     ELSE 0
  328.                      END) AS nilai";
  329.                 } else if ($operation == 'PERSENTASE') {
  330.                     if ($variabels) {
  331.                         $operationx " COUNT($kolom) FILTER (WHERE $whereClause) * 100.0 / COUNT($kolom) AS nilai";
  332.                     }
  333.                 } else {
  334.                     $operationx "$operation($kolom) AS nilai";
  335.                 }
  336.                 $sql1 "WITH data_bersih AS ( 
  337.                         SELECT 
  338.                         kategori_plant,
  339.                         sumber_dana,
  340.                         TO_CHAR($periode, 'MONYYYY') || '.' ||
  341.                         CASE 
  342.                         WHEN EXTRACT(DAY FROM $periode) BETWEEN 1 AND 7 THEN 'I'
  343.                         WHEN EXTRACT(DAY FROM $periode) BETWEEN 8 AND 14 THEN 'II'
  344.                         WHEN EXTRACT(DAY FROM $periode) BETWEEN 15 AND 21 THEN 'III'
  345.                         ELSE 'IV'
  346.                         END AS periode,
  347.                         $operationx 
  348.                     FROM $tabel";
  349.                 if ($variabels) {
  350.                     // if ($operation != 'PERSENTASE') {
  351.                     $sql1 .= " WHERE $whereClause";
  352.                     $sql1 .= "AND $periode IS NOT NULL";
  353.                     // }
  354.                     $sql1 .= " GROUP BY kategori_plant, sumber_dana, periode
  355.                     )
  356.                     SELECT 
  357.                     kategori_plant,
  358.                     sumber_dana,
  359.                     periode,
  360.                     ROUND(nilai, 2) AS nilai
  361.                     FROM data_bersih
  362.                     ORDER BY kategori_plant, sumber_dana, periode;";
  363.                 } else {
  364.                     $sql1 .= " GROUP BY kategori_plant, sumber_dana, periode
  365.                     )
  366.                     SELECT 
  367.                     kategori_plant,
  368.                     sumber_dana,
  369.                     periode,
  370.                     ROUND(nilai, 2) AS nilai
  371.                     FROM data_bersih
  372.                     ORDER BY kategori_plant, sumber_dana, periode;";
  373.                 }
  374.                 if ($request->request->get('is_create_view')) {
  375.                     $stmt $connection->prepare("CREATE VIEW $view  AS $sql1");
  376.                     $stmt->execute();
  377.                 }
  378.             }
  379.             $entityManager->persist($detail);
  380.             $entityManager->flush();
  381.             $dbLogger->info("Membuat Explore Data " $detail->getNama(), ["reff_name" => "buat_detail_explore_data""reff_id" => $detail->getId(), "created_by" => $user->getId()]);
  382.             $this->addFlash('notice''Tambah Berhasil');
  383.             return $this->redirectToRoute('explore_data');
  384.         }
  385.         return $this->render('/backend/explore_data/form_detail.html.twig', [
  386.             'columns' => $columns,
  387.             'explore_id' => ($detail->getExploreId()) ? $detail->getExploreId() : $request->get('explore'),
  388.             'tables' => $res_table,
  389.             'operations' => $operations,
  390.             'detail' => $detail,
  391.             'header' => $header,
  392.             'isForm' => true
  393.         ]);
  394.     }
  395.     /**
  396.      * @Route("/explore_data/{id}/delete_detail", name="explore_data_delete_detail", methods={"GET"})
  397.      */
  398.     public function delete_detail(?string $id nullTExploreDataDetailRepository $tExploreDataDetailRepoTLogRepository $tLogRepo)
  399.     {
  400.         $detail $tExploreDataDetailRepo->find($id);
  401.         // dump($meta_data); exit;
  402.         $entityManager $this->getDoctrine()->getManager();
  403.         $entityManager->remove($detail);
  404.         $entityManager->flush();
  405.         //hapus view
  406.         // $connection = $this->getDoctrine()->getConnection();
  407.         // $tbl = $detail->getView();
  408.         // $query = $connection->prepare("select * from information_schema.tables WHERE table_schema='public' AND table_name='$tbl'");
  409.         // $query->execute();
  410.         // $hasil = $query->fetchAll();
  411.         // if ($hasil) {
  412.         //     $stmt = $connection->prepare("DROP TABLE $tbl");
  413.         //     $stmt->execute();
  414.         // }
  415.         $tLogRepo->setLog($this->getDoctrine()->getManager(), null$detail->getId(), "Hapus Explore detail " $detail->getNama(), $this->getUser()->getName());
  416.         $this->addFlash('notice''Eksplorasi "' $detail->getNama() . '" berhasil dihapus');
  417.         return $this->redirectToRoute('explore_data_detail', ['id' => $detail->getExploreId()]);
  418.     }
  419.     /**
  420.      * @Route("/explore_data/view_nilai", name="explore_data_view_nilai", methods={"GET", "POST"})
  421.      */
  422.     public function view_nilai(
  423.         ?string $id,
  424.         Request $request,
  425.         TMetaDataRepository $tMetaDataRepo,
  426.         TExploreDataRepository $tExploreDataRepo,
  427.         TVariabelRepository $tVariabelRepo,
  428.         LoggerInterface $dbLogger,
  429.         Security $security,
  430.         ManagerRegistry $managerRegistry
  431.     ) {
  432.         $user $security->getUser();
  433.         return $this->render('backend/explore_data/view_nilai.html.twig', [
  434.             'explorasi' => $request->get('explorasi')
  435.         ]);
  436.     }
  437.     /**
  438.      * @Route("/explore_data/detail_data_table_view", name="explore_data_detail_datatable_periode", methods={"GET", "POST"})
  439.      */
  440.     public function data_table_periode(Request $requestTExploreDataDetailRepository $tExploreDataDetailRepo)
  441.     {
  442.         $item_per_page $_POST['length'];
  443.         $page = ($_POST['start'] / $item_per_page) + 1;
  444.         $page = ($page 1) * 10;
  445.         $explorasi $tExploreDataDetailRepo->findOneBy(['id' => $request->get('explorasi')]);
  446.         $table = ($explorasi->isIsCreateView() == 1) ? $explorasi->getView() : $explorasi->getTabel();
  447.         // print_r($table); exit;
  448.         $detail $this->getDataTableDetailExplorasiPeriode(10$page$_POST$table$explorasi->getId());
  449.         $jumlah count($this->getDataTableDetailExplorasiPeriode(nullnull$_POST$table$explorasi->getId()));
  450.         $arrJson['aaData']                 = $detail;
  451.         $arrJson['iTotalRecords']        = $jumlah;
  452.         $arrJson['iTotalDisplayRecords'] = $jumlah;
  453.         return new JsonResponse($arrJson);
  454.     }
  455.     /**
  456.      * @Route("/explore_data/get_column", name="explore_data_get_column", methods={"POST", "GET"})
  457.      */
  458.     public function get_column(
  459.         Request $request,
  460.         TMetaDataRepository $tMetaDataRepo,
  461.         TVariabelRepository $tVariabelRepo,
  462.         ManagerRegistry $managerRegistry
  463.     ) {
  464.         $id $request->get('id');
  465.         // $meta_data  = $tMetaDataRepo->findOneBy(['id' => $id]);
  466.         // $variabel = $tVariabelRepo->findBy(['reff_id' => $meta_data->getId(), 'reff_kode' => 'METADATA'], ['id' => 'ASC']);
  467.         $hasil $this->getKolomTabel($id);
  468.         $optKolom '<option value=""></option>';
  469.         $optPeriode '<option value=""></option>';
  470.         if ($hasil) {
  471.             // $kategoriPlant = ['column_name' => 'kategori_plant'];
  472.             // array_unshift($hasil, $kategoriPlant);
  473.             foreach ($hasil as $value) {
  474.                 if (in_array($value['column_name'], ['id''created_at''updated_at'])) {
  475.                     continue;
  476.                 }
  477.                 // Semua kolom untuk dropdown "kolom"
  478.                 $optKolom .= '<option value="' $value['column_name'] . '">' $value['column_name'] . '</option>';
  479.                 // Khusus kolom yang mengandung "tgl_" untuk dropdown "periode"
  480.                 if (strpos($value['column_name'], 'tgl_') !== false) {
  481.                     $optPeriode .= '<option value="' $value['column_name'] . '">' $value['column_name'] . '</option>';
  482.                 }
  483.             }
  484.         }
  485.         return new JsonResponse([
  486.             'kolom' => $optKolom,
  487.             'periode' => $optPeriode,
  488.         ]);
  489.     }
  490.     /**
  491.      * @Route("/t_grafik/{id}/chartJson", name="t_grafik_chart_json", methods={"POST", "GET"})
  492.      */
  493.     public function chartJson(
  494.         Request $request,
  495.         // TPublikasi $tPublikasi,
  496.         TGrafik $tGrafik,
  497.         TGrafikRepository $tGrafikRepo,
  498.         TVariabelRepository $tVariabelRepo,
  499.         TDataRepository $tDataRepo,
  500.         ManagerRegistry $managerRegistry
  501.     ) {
  502.         $detail $tGrafikRepo->find($tGrafik);
  503.         $graph =  $this->getTabelGrafik($detail->getId(), 'chart');
  504.         return $graph;
  505.     }
  506.     /**
  507.      * @Route("/t_grafik/{id}/dataTable", name="t_grafik_data_table", methods={"POST", "GET"})
  508.      */
  509.     public function dataTable(
  510.         Request $request,
  511.         // TPublikasi $tPublikasi,
  512.         TGrafik $tGrafik,
  513.         TGrafikRepository $tGrafikRepo,
  514.         TVariabelRepository $tVariabelRepo,
  515.         TDataRepository $tDataRepo,
  516.         ManagerRegistry $managerRegistry
  517.     ) {
  518.         $detail $tGrafikRepo->find($tGrafik);
  519.         $graph =  $this->getTabelGrafik($detail->getId(), 'table');
  520.         return $graph;
  521.     }
  522. }