src/Controller/Backend/TGrafikController.php line 87

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Backend;
  3. use App\Controller\Base\BaseController;
  4. use App\Entity\MKategoriDetail;
  5. use App\Entity\TData;
  6. use App\Entity\TDeskripsiData;
  7. use App\Entity\TGrafik;
  8. use App\Entity\TMetaData;
  9. use App\Filter\TGrafikFilterType;
  10. use App\Form\TGrafikType;
  11. use App\Repository\MKategoriDetailRepository;
  12. use App\Repository\MKategoriRepository;
  13. use App\Repository\MPeriodeRepository;
  14. use App\Repository\MStatusRepository;
  15. use App\Repository\MUrusanRepository;
  16. use App\Repository\TDataRepository;
  17. use App\Repository\TGrafikRepository;
  18. use App\Repository\TLogRepository;
  19. use App\Repository\TPublikasiRepository;
  20. use App\Repository\TVariabelRepository;
  21. use App\Repository\MKotaRepository;
  22. use App\Repository\TDeskripsiDataRepository;
  23. use App\Repository\TMetaDataRepository;
  24. use App\Transformer\DataTransformer;
  25. use App\Transformer\NewPublikasiTransformer;
  26. use App\Utils\ObjectManager;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Kematjaya\Breadcrumb\Lib\Builder as BreacrumbBuilder;
  30. use Knp\Component\Pager\PaginatorInterface;
  31. use Symfony\Component\HttpFoundation\JsonResponse;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  34. use Kematjaya\ImportBundle\Manager\ImportManagerInterface;
  35. use Kematjaya\ImportBundle\DataSource\RemoteDataSource;
  36. use App\Transformer\PublikasiTransformer;
  37. use App\Transformer\VariabelTransformer;
  38. use Doctrine\Persistence\ManagerRegistry;
  39. use Kematjaya\Export\Manager\ManagerInterface;
  40. use Kematjaya\Export\Processor\Excel\SpreadsheetFromArrayProcessor;
  41. use Psr\Log\LoggerInterface;
  42. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  43. use Symfony\Component\Security\Core\Security;
  44. use Exception;
  45. class TGrafikController extends BaseController
  46. {
  47.     private $pageName 't_grafik';
  48.     private $class TGrafik::class;
  49.     /**
  50.      * @Route("/t_grafik", name="t_grafik")
  51.      */
  52.     public function index(BreacrumbBuilder $builderRequest $requestPaginatorInterface $paginatorInterfaceSecurity $security): Response
  53.     {
  54.         $builder->add('Dashboard '"dashboard", array(), "&nbsp;<i class='fa fa-home'></i>");
  55.         $builder->add('View Data');
  56.         $user $security->getUser();
  57.         // dump($user->getRoles()); exit;
  58.         $form $this->createFormFilter(TGrafikFilterType::class);
  59.         $queryBuilder $this->getQueryBuilder($this->class);
  60.         $queryBuilder $this->buildFilter($request$form$queryBuilder)->addOrderBy("this.id""DESC");
  61.         $this->setSessionLimit($request);
  62.         $maxPerPage $request->getSession()->get("limit") ? $request->getSession()->get("limit") : $this->getLimit();
  63.         $pagination $paginatorInterface->paginate($queryBuilder$request->query->getInt('page'1), $maxPerPage);
  64.         return $this->render('backend/t_grafik/index.html.twig', [
  65.             'page_name' => $this->pageName,
  66.             'button_credential' => $this->buttonCredentials($this->pageName),
  67.             'filter' => $form->createView(),
  68.             'pagination' => $pagination,
  69.         ]);
  70.     }
  71.     /**
  72.      * @Route("/t_grafik/{id}/detail", name="t_grafik_detail", methods={"GET", "POST"})
  73.      */
  74.     public function detail(
  75.         BreacrumbBuilder $builder,
  76.         TGrafik $tGrafik,
  77.         TVariabelRepository $tVariabelRepo,
  78.         TGrafikRepository $tGrafikRepo,
  79.         Request $request,
  80.         TDeskripsiDataRepository $tDeskripsiDataRepository
  81.     ) {
  82.         $builder->add('Dashboard '"dashboard", array(), "&nbsp;<i class='fa fa-home'></i>");
  83.         $builder->add('View Data'"t_grafik");
  84.         $builder->add('Detail');
  85.         $variable $request->get('variable');
  86.         $tahun $request->get('year') == "" ? (new \DateTime())->format('Y') : $request->get('year');
  87.         $grafik $tGrafikRepo->find($tGrafik);
  88.         $tipe_grafik = ($grafik) ? $grafik->getTipe() : null;
  89.         $grafik_info = [];
  90.         if ($grafik) {
  91.             $sumbu_x = ($grafik->getAxisx() == 'kategori_plant') ? 'plant' :  $grafik->getAxisx(); // Misalnya: plant
  92.             $sumbu_y $grafik->getAxisYIds(); // Misalnya: ['count_days', 'nilai_investasi']
  93.             if ($grafik->getAxisx() == 'all') {
  94.                 $columns $sumbu_y;
  95.             } else {
  96.                 $columns array_merge([$sumbu_x], $sumbu_y);
  97.             }
  98.             // print_r($columns); exit;
  99.             $grafik_info = [
  100.                 'title' => $grafik->getJudul(),
  101.                 'tipe' => $grafik->getTipe(),
  102.                 // 'varX' => $variabel_x->getNama(),
  103.                 'varX' => $grafik->getAxisX(),
  104.                 // 'varY' => $variabel_y->getNama()
  105.             ];
  106.         }
  107.         return $this->render('backend/t_grafik/detail.html.twig', [
  108.             'page_name' => $this->pageName,
  109.             'button_credential' => $this->buttonCredentials($this->pageName),
  110.             // '' => $detail,
  111.             // 'kategori' => $kategori,
  112.             // 'variabel' => $variabel,
  113.             'grafik' => $grafik,
  114.             'columns' => $columns,
  115.             'grafik_info' => $grafik_info,
  116.             // 'indikator' => $indikator,
  117.             'tipe_grafik' => $tipe_grafik,
  118.             // 'pub_id' => $detail->getId(),
  119.             'deskripsi' => $grafik $grafik->getDeskripsi() : '',
  120.             // 'choiced_field' => json_encode($variable),
  121.             // 'total' => $total,
  122.             // // 'average_year' => $tahunRataRata,
  123.             // // 'average_value' => $valueRataRata,
  124.             // 'label_min' => $labelMin,
  125.             // 'label_max' => $labelMax,
  126.             // 'value_min' => $valueMin,
  127.             // 'value_max' => $valueMax,
  128.             // 'variabel_name' => $variable_name,
  129.             // 'value_name' => $value_name
  130.         ]);
  131.     }
  132.     /**
  133.      * @Route("/t_grafik/{id}/delete_grafik", name="t_grafik_delete", methods={"GET"})
  134.      */
  135.     public function delete(?string $id nullTGrafikRepository $tGrafikRepoTLogRepository $tLogRepoLoggerInterface $dbLoggerSecurity $security)
  136.     {
  137.         $user $security->getUser();
  138.         $grafik $tGrafikRepo->find($id);
  139.         // dump($kategori); exit;
  140.         $entityManager $this->getDoctrine()->getManager();
  141.         $entityManager->remove($grafik);
  142.         $entityManager->flush();
  143.         $dbLogger->info("Hapus dataset " $grafik->getJudul(), ["reff_name" => "delete_grafik""reff_id" => $grafik->getId(), "created_by" => $user->getId()]);
  144.         $this->addFlash('notice''Grafik "' $grafik->getJudul() . '" berhasil dihapus');
  145.         return $this->redirectToRoute('t_grafik');
  146.     }
  147.     /**
  148.      * @Route("/add_selected", name="publikasi_add_selected", methods={"POST"})
  149.      */
  150.     public function add_selected(Request $requestObjectManager $objectManager)
  151.     {
  152.         $sessionName $request->get("name");
  153.         $this->get('session')->set($sessionName$request->get('selected'));
  154.         $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  155.         return $this->json($selected);
  156.     }
  157.     /**
  158.      * @Route("/action_selected", name="publikasi_action_selected", methods={"POST"})
  159.      */
  160.     public function action_selected(Request $requestObjectManager $objectManager)
  161.     {
  162.         $sessionName $request->get("name");
  163.         if ($this->isCsrfTokenValid($sessionName '_action_selected'$request->request->get('_token'))) {
  164.             $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  165.             $deleted $objectManager->deleteByIds($this->class$selected);
  166.             if ($deleted) {
  167.                 $this->get('session')->set($sessionName, []);
  168.                 $this->addFlash('success'$this->getTranslator()->trans('messages.deleted.success'));
  169.             } else {
  170.                 $this->addFlash('error'$this->getTranslator()->trans('messages.deleted.error'));
  171.             }
  172.         }
  173.         return $this->redirectToRoute('publikasi');
  174.     }
  175.     /**
  176.      * @Route("/publikasi/{id}/{choiced_field}/{tahun}/dataset_table", name="publikasi_dataset_table", methods={"GET", "POST"})
  177.      */
  178.     public function dataset_table(?string $id, ?string $choiced_field, ?string $tahunRequest $request)
  179.     {
  180.         $item_per_page $_POST['length'];
  181.         $page = ($_POST['start'] / $item_per_page) + 1;
  182.         $page = ($page 1) * 10;
  183.         $dataset $this->getDataTable($id10$page$_POSTnullnulljson_decode($choiced_field), $tahun);
  184.         $jumlah count($this->getDataTable($idnullnull$_POSTnullnulljson_decode($choiced_field), $tahun));
  185.         $arrJson['aaData']                 = $dataset;
  186.         $arrJson['iTotalRecords']        = $jumlah;
  187.         $arrJson['iTotalDisplayRecords'] = $jumlah;
  188.         return new JsonResponse($arrJson);
  189.     }
  190.     /**
  191.      * @Route("/t_grafik/form_grafik{id}", defaults={"id"= null}, name="t_grafik_form_grafik", methods={"GET", "POST"})
  192.      */
  193.     public function form_grafik(
  194.         ?string $id,
  195.         Request $request,
  196.         TMetaDataRepository $tMetaDataRepo,
  197.         TGrafikRepository $tGrafikRepo,
  198.         TVariabelRepository $tVariabelRepo,
  199.         LoggerInterface $dbLogger,
  200.         Security $security,
  201.         ManagerRegistry $managerRegistry
  202.     ) {
  203.         $user $security->getUser();
  204.         $column_select = array('x' => 0'y' => 0);
  205.         if ($id) {
  206.             $grafik $tGrafikRepo->findOneBy(['id' => $id]);
  207.             $columns $this->getKolomTabel($grafik->getTabel());
  208.             $column_select['x'] = $grafik->getAxisX();
  209.             $column_select['y'] = $grafik->getAxisYIds();
  210.             $column_tipe['tipe'] = $grafik->getTipe();
  211.         } else {
  212.             $columns = [];
  213.             $grafik = new TGrafik();
  214.             $column_tipe['tipe'] = null;
  215.         }
  216.         // if(!$grafik){
  217.         //     throw new NotFoundHttpException();
  218.         // }
  219.         $form $this->createForm(TGrafikType::class, $grafik, ['action' => $this->generateUrl('t_grafik_form_grafik', ['id' => $id])]);
  220.         $tabels $tMetaDataRepo->findAll(['id' => 'asc']);
  221.         $res_table = ['t_weekly_explore_report' => 'Weekly Eksplore Report'];
  222.         foreach ($tabels as $table) {
  223.             $res_table[$table->getNamaTabel()] = $table->getJudul();
  224.         }
  225.         // print_r($res_table); exit;
  226.         $tipe_grafik = ['line' => 'Line''column' => 'Column'];
  227.         $operations = ['SUM' => 'SUM''COUNT' => 'COUNT'];
  228.         $selectedAxisX $grafik->getAxisx(); // 1 kolom string
  229.         $selectedAxisY $grafik->getAxisYIds(); // array kolom
  230.         $form->handleRequest($request);
  231.         if ($form->isSubmitted() && $form->isValid()) {
  232.             // set filter
  233.             $where = [];
  234.             $variabels $request->request->get('variabel');
  235.             $operators $request->request->get('where');
  236.             $isians    $request->request->get('isian');
  237.             if ($variabels) {
  238.                 foreach ($variabels as $key => $field) {
  239.                     $operator strtoupper(trim($operators[$key]));
  240.                     $isian strtolower(trim($isians[$key])); // konversi ke huruf kecil
  241.                     if ($operator === 'IN') {
  242.                         // Pisahkan dan lowercase semua nilai
  243.                         $values array_map('trim'explode(','$isian));
  244.                         $quotedValues array_map(fn($v) => "'" strtolower($v) . "'"$values);
  245.                         $formattedValue '(' implode(', '$quotedValues) . ')';
  246.                         $where[] = "LOWER($field) IN $formattedValue";
  247.                     } else {
  248.                         $formattedValue "'" $isian "'";
  249.                         $where[] = "LOWER($field$operator $formattedValue";
  250.                     }
  251.                 }
  252.                 $whereClause implode(' AND '$where);
  253.             }
  254.             $tabel $request->request->get('table');
  255.             $kolom $request->request->get('kolom');
  256.             $operation $request->request->get('operation');
  257.             $connection $this->getDoctrine()->getConnection();
  258.             if ($operation == 'SUM') {
  259.                 $sql "SELECT SUM(CASE
  260.                     WHEN NULLIF(TRIM(REPLACE($kolom::text, ',', '')), '') IS NOT NULL
  261.                      THEN (REPLACE($kolom::text, ',', ''))::numeric
  262.                     ELSE 0
  263.                      END) as jumlah FROM  $tabel ";
  264.             } else if ($operation == 'PERSENTASE') {
  265.                 $sql "SELECT COUNT($kolom) * 100.0 / (SELECT COUNT($kolom) FROM $tabel) as jumlah";
  266.                 $sql .= " FROM $tabel";
  267.             } else {
  268.                 $sql "SELECT $operation($kolom) as jumlah FROM  $tabel ";
  269.             }
  270.             if ($variabels) {
  271.                 $sql .= " WHERE $whereClause";
  272.             }
  273.             if ($request->request->get('is_create_view') && $request->request->get('periode')) {
  274.                 $periode $request->request->get('periode');
  275.                 if ($variabels) {
  276.                     $sql .= " AND $periode IS NOT NULL";
  277.                 } else {
  278.                     $sql .= " WHERE $periode IS NOT NULL";
  279.                 }
  280.             }
  281.             // dump($request->request->get('axisy'));exit;
  282.             $meta_data $tMetaDataRepo->findOneBy(['nama_tabel' => $request->request->get('table')]);
  283.             // $axisY = $tVariabelRepo->find($request->request->get('axisy'));
  284.             // print_r($request->request->get('tipe')); exit;
  285.             $data $form->getData();
  286.             $data->setReffId(($meta_data) ? $meta_data->getId() : null);
  287.             $data->setAxisX($request->request->get('axisx'));
  288.             // $data->setTipe($request->request->get('tipe'));
  289.             // $data->setAxisY($axisY->getId());
  290.             $data->setAxisYIds($request->request->get('axisy'));
  291.             $data->setOperation($request->request->get('operation'));
  292.             $data->setTabel($request->request->get('table'));
  293.             $data->setCreatedAt(new \DateTime());
  294.             $data->setFilter($where);
  295.             $entityManager $this->getDoctrine()->getManager();
  296.             $entityManager->persist($data);
  297.             $entityManager->flush();
  298.             $dbLogger->info("Membuat Grafik " $data->getJudul(), ["reff_name" => "buat_grafik""reff_id" => $data->getId(), "created_by" => $user->getId()]);
  299.             $this->addFlash('notice''Grafik berhasil tidak ditampilkan');
  300.             return $this->redirectToRoute('t_grafik');
  301.         }
  302.         return $this->render('/backend/t_grafik/form_grafik.html.twig', [
  303.             'form' => $form->createView(),
  304.             'columns' => $columns,
  305.             'tables' => $res_table,
  306.             'operations' => $operations,
  307.             'tipe_grafik' => $tipe_grafik,
  308.             'grafik' => $grafik,
  309.             'column_select' => $column_select,
  310.             'column_tipe' => $column_tipe,
  311.             'selectedAxisX' => $selectedAxisX,
  312.             'selectedAxisY' => $selectedAxisY,
  313.             'isForm' => true
  314.         ]);
  315.     }
  316.     /**
  317.      * @Route("/t_grafik/get_column", name="t_grafik_get_column", methods={"POST", "GET"})
  318.      */
  319.     public function get_column(
  320.         Request $request,
  321.         TMetaDataRepository $tMetaDataRepo,
  322.         TVariabelRepository $tVariabelRepo,
  323.         ManagerRegistry $managerRegistry
  324.     ) {
  325.         $id $request->get('id');
  326.         $hasil $this->getKolomTabel($id);
  327.         $opt '<option value=""></option>';
  328.         $opt .= '<option value="all">All</option>';
  329.         if ($hasil) {
  330.             // $kategoriPlant = ['column_name' => 'kategori_plant'];
  331.             // array_unshift($hasil, $kategoriPlant);
  332.             foreach ($hasil as $key => $value) {
  333.                 if ($value['column_name'] == 'id' || $value['column_name'] == 'created_at' || $value['column_name'] == 'updated_at') {
  334.                     continue;
  335.                 }
  336.                 // $selected = ($request->getParameter('jenis') == $o->getId()) ? 'selected="selected"' : '';
  337.                 $opt .= '<option  value="' $value['column_name'] . '">' $value['column_name'] . '</option>';
  338.             }
  339.         }
  340.         return new JsonResponse($opt);
  341.     }
  342.     /**
  343.      * @Route("/t_grafik/{id}/chartJson", name="t_grafik_chart_json", methods={"POST", "GET"})
  344.      */
  345.     public function chartJson(
  346.         Request $request,
  347.         // TPublikasi $tPublikasi,
  348.         TGrafik $tGrafik,
  349.         TGrafikRepository $tGrafikRepo,
  350.         TVariabelRepository $tVariabelRepo,
  351.         TDataRepository $tDataRepo,
  352.         ManagerRegistry $managerRegistry
  353.     ) {
  354.         $detail $tGrafikRepo->find($tGrafik);
  355.         $tahun $request->get("tahun");
  356.         $graph =  $this->getTabelGrafik($detail->getId(), 'chart',$tahun);
  357.         // print_r($graph); exit;
  358.         return $graph;
  359.     }
  360.     /**
  361.      * @Route("/t_grafik/{id}/dataTable", name="t_grafik_data_table", methods={"POST", "GET"})
  362.      */
  363.     public function dataTable(
  364.         Request $request,
  365.         // TPublikasi $tPublikasi,
  366.         TGrafik $tGrafik,
  367.         TGrafikRepository $tGrafikRepo,
  368.         TVariabelRepository $tVariabelRepo,
  369.         TDataRepository $tDataRepo,
  370.         ManagerRegistry $managerRegistry
  371.     ) {
  372.         $detail $tGrafikRepo->find($tGrafik);
  373.         $tahun $request->get("tahun");
  374.         $graph =  $this->getTabelGrafik($detail->getId(), 'table'$tahun);
  375.         return $graph;
  376.     }
  377. }