src/Controller/Base/BaseController.php line 2316

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Base;
  3. use App\Entity\FeedbackIsi;
  4. use App\Entity\MKategori;
  5. use App\Entity\MKategoriDetail;
  6. use App\Entity\MSetting;
  7. use App\Entity\PtiGroup;
  8. use App\Entity\PtiRule;
  9. use App\Entity\TData;
  10. use App\Entity\TDokumen;
  11. use App\Entity\TGrafik;
  12. use App\Entity\TPublikasi;
  13. use App\Entity\TVariabel;
  14. use App\Entity\TVariabelGrafik;
  15. use App\Entity\MKota;
  16. use App\Entity\TExploreDataDetail;
  17. use App\Entity\TMetaData;
  18. use App\Repository\MFeedbackRepository;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use App\Utils\ObjectManager;
  21. use App\Utils\Breadcrumb\BreadcrumbBuilder;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderUpdaterInterface;
  24. use Symfony\Component\Form\FormInterface;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Doctrine\ORM\QueryBuilder;
  27. use Doctrine\ORM\Query;
  28. use Doctrine\Persistence\ManagerRegistry;
  29. use Pagerfanta\Adapter\DoctrineORMAdapter;
  30. use Pagerfanta\Pagerfanta;
  31. use Ob\HighchartsBundle\Highcharts\Highchart;
  32. use Symfony\Component\Security\Core\Security;
  33. use Doctrine\Common\Proxy\Proxy;
  34. use App\Repository\FeedbackIsiRepository;
  35. use App\Repository\FeedbackRepository;
  36. use App\Repository\MSettingRepository;
  37. use App\Repository\MKotaRepository;
  38. use App\Repository\TExploreDataDetailRepository;
  39. use DateTime;
  40. use Symfony\Component\CssSelector\Parser\Handler\WhitespaceHandler;
  41. use Symfony\Component\HttpFoundation\JsonResponse;
  42. class BaseController extends AbstractController
  43. {
  44.     /**
  45.      * @var limit
  46.      */
  47.     private $limit 10;
  48.     /**
  49.      * @var max_per_page
  50.      */
  51.     private $max_per_page = array(1050100);
  52.     private $translation;
  53.     private $filterBuilder;
  54.     private $objectManager;
  55.     private $breadcrumbBuilder;
  56.     private $managerRegistry;
  57.     private $MFeedback;
  58.     private $feedbackIsi;
  59.     private $mKota;
  60.     public $currentMaxLink 1;
  61.     public function __construct(
  62.         ObjectManager $objectManager,
  63.         TranslatorInterface $translation,
  64.         FilterBuilderUpdaterInterface $filterBuilder,
  65.         BreadcrumbBuilder $breadcrumbBuilder,
  66.         MFeedbackRepository $MFeedback,
  67.         FeedbackIsiRepository $feedbackIsi,
  68.         MKotaRepository $mKota,
  69.         ManagerRegistry $managerRegistry
  70.     ) {
  71.         $this->translation $translation;
  72.         $this->filterBuilder $filterBuilder;
  73.         $this->objectManager $objectManager;
  74.         $this->breadcrumbBuilder $breadcrumbBuilder;
  75.         $this->managerRegistry $managerRegistry;
  76.         $this->MFeedback $MFeedback;
  77.         $this->feedbackIsi $feedbackIsi;
  78.         $this->mKota $mKota;
  79.     }
  80.     protected function getBreadcrumb()
  81.     {
  82.         return $this->breadcrumbBuilder;
  83.     }
  84.     /**
  85.      * @return Symfony\Component\Translation\TranslatorInterface
  86.      */
  87.     public function getTranslator(): TranslatorInterface
  88.     {
  89.         return $this->translation;
  90.     }
  91.     public function getQueryBuilder(string $entityClassName): QueryBuilder
  92.     {
  93.         $queryBuilder $this->getDoctrine()->getManager()->createQueryBuilder()
  94.             ->select('this')
  95.             ->from($entityClassName'this');
  96.         return $queryBuilder;
  97.     }
  98.     protected function buildFilter(Request $requestFormInterface $formQueryBuilder $queryBuilder): QueryBuilder
  99.     {
  100.         // if ($request->query->get('_reset') and Request::METHOD_GET === $request->getMethod()) {
  101.         if ($request->query->get('_reset') and  $request->getMethod() === 'GET') {
  102.             // dump($request->getMethod()); exit;
  103.             // if ($request->query->get('_reset') == 1) {
  104.             $type get_class($form->getConfig()->getType()->getInnerType());
  105.             $options $form->getConfig()->getOptions();
  106.             $options['data'] = null;
  107.             $form parent::createForm($typenull$options);
  108.             $this->get('session')->set($form->getName(), null);
  109.             return $this->getFilterAdapter()->addFilterConditions($form$queryBuilder);
  110.             // return $form;
  111.         }
  112.         $filters $request->get($form->getName());
  113.         if ($filters) {
  114.             $form->submit($filters);
  115.             $this->get('session')->set($form->getName(), $form->getData());
  116.         }
  117.         return $this->getFilterAdapter()->addFilterConditions($form$queryBuilder);
  118.     }
  119.     public function createPaginator(Request $requestQuery $query): Pagerfanta
  120.     {
  121.         if ($request->get('_limit') && is_numeric($request->get('_limit'))) {
  122.             $request->getSession()->set('limit'$request->get('_limit'));
  123.         } else {
  124.             $request->getSession()->set('limit'$this->limit);
  125.         }
  126.         // if(!$request->getSession()->get("limit")) {
  127.         //     $request->getSession()->set('limit', $this->limit);
  128.         // }
  129.         $adapter = new DoctrineORMAdapter($queryfalse);
  130.         $paginator = new Pagerfanta($adapter);
  131.         $paginator->setAllowOutOfRangePages(true);
  132.         //  Set pages based on the request parameters.
  133.         $paginator->setMaxPerPage($request->getSession()->get("limit"));
  134.         $paginator->setCurrentPage($request->query->get('page'1));
  135.         return $paginator;
  136.     }
  137.     public function setSessionLimit($request)
  138.     {
  139.         if ($request->get('_limit') && is_numeric($request->get('_limit'))) {
  140.             $request->getSession()->set('limit'$request->get('_limit'));
  141.             $this->limit $request->getSession()->get('limit');
  142.             // } else {
  143.             // $request->getSession()->set('limit', $this->limit);
  144.         }
  145.     }
  146.     public function getLimit()
  147.     {
  148.         return $this->limit;
  149.     }
  150.     public function setMaxPerPage($max_page = array())
  151.     {
  152.         $this->max_per_page $max_page;
  153.     }
  154.     public function getMaxPerPage()
  155.     {
  156.         return $this->max_per_page;
  157.     }
  158.     public function setFilters($filters = array(), $name)
  159.     {
  160.         $this->get('session')->set($name$filters);
  161.     }
  162.     public function getFilters($name)
  163.     {
  164.         $filters $this->get('session')->get($namenull);
  165.         if (!is_array($filters)) {
  166.             return null;
  167.         }
  168.         foreach ($filters as $k => $v) {
  169.             if (!is_object($v)) {
  170.                 continue;
  171.             }
  172.             $manager $this->getDoctrine()->getManager();
  173.             if (!$manager->getMetadataFactory()->isTransient(get_class($v)) or $v instanceof Proxy) {
  174.                 $filters[$k] = $manager->getRepository(get_class($v))->find($v->getId());
  175.             }
  176.         }
  177.         return $filters;
  178.     }
  179.     public function getFilterAdapter()
  180.     {
  181.         return $this->filterBuilder;
  182.     }
  183.     protected function createFormFilter(string $type, array $options = array()): FormInterface
  184.     {
  185.         // $reflection = new \ReflectionClass($type);
  186.         // $name = sprintf("%s", strtolower($reflection->getShortName()));
  187.         $form parent::createForm($type);
  188.         $data $this->getFilters($form->getName());
  189.         $form parent::createForm($type$data$options);
  190.         // dump($form->getData());exit;
  191.         return $form;
  192.     }
  193.     protected function processFormAjax(FormInterface $formRequest $request)
  194.     {
  195.         $form->handleRequest($request);
  196.         if ($form->isSubmitted()) {
  197.             $type = ($form->getData() && !is_array($form->getData()) && $form->getData()->getId()) ? "update" "add";
  198.             if ($form->isValid()) {
  199.                 $result $this->objectManager->save($form->getData());
  200.                 if ($result) {
  201.                     return ["process" => true"status" => true"message" => $this->getTranslator()->trans('messages.' $type '.success'), "errors" => null];
  202.                 } else {
  203.                     return ["process" => true"status" => false"message" => $this->getTranslator()->trans('messages.' $type '.error'), "errors" => 'error while saved data.'];
  204.                 }
  205.             } else {
  206.                 $errors $this->getErrorsFromForm($form);
  207.                 return ["process" => true"status" => false"message" => $this->getTranslator()->trans('messages.' $type '.error'), "errors" => implode(", "$errors)];
  208.             }
  209.         }
  210.         return ["process" => false];
  211.     }
  212.     protected function getErrorsFromForm(FormInterface $form)
  213.     {
  214.         $errors = array();
  215.         foreach ($form->getErrors() as $error) {
  216.             $errors[] = $error->getMessage();
  217.         }
  218.         foreach ($form->all() as $childForm) {
  219.             if ($childForm instanceof FormInterface) {
  220.                 if ($childErrors $this->getErrorsFromForm($childForm)) {
  221.                     $errors[$childForm->getName()] = $childForm->getName() . ': ' implode(", "$childErrors);
  222.                 }
  223.             }
  224.         }
  225.         return $errors;
  226.     }
  227.     protected function doDelete($object)
  228.     {
  229.         return $this->objectManager->delete($object);
  230.     }
  231.     public function addSelected(Request $request)
  232.     {
  233.         $sessionName $request->get("name");
  234.         $this->get('session')->set($sessionName$request->get('selected'));
  235.         $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  236.         return $this->json($selected);
  237.     }
  238.     public function actionSelected($classNameRequest $requestObjectManager $objectManager)
  239.     {
  240.         $sessionName $request->get("name");
  241.         if ($this->isCsrfTokenValid($sessionName '_action_selected'$request->request->get('_token'))) {
  242.             $selected = (!empty($this->get('session')->get($sessionName))) ? $this->get('session')->get($sessionName) : [];
  243.             $deleted $objectManager->deleteByIds($className$selected);
  244.             if ($deleted) {
  245.                 $this->get('session')->set($sessionName, []);
  246.                 $this->addFlash('success'$this->getTranslator()->trans('messages.deleted.success'));
  247.             } else {
  248.                 $this->addFlash('error'$this->getTranslator()->trans('messages.deleted.error'));
  249.             }
  250.         }
  251.     }
  252.     public function doDeleted(Request $request$objectObjectManager $objectManager)
  253.     {
  254.         if ($this->isCsrfTokenValid('delete' $object->getId(), $request->request->get('_token'))) {
  255.             if ($this->doDelete($object$objectManager)) {
  256.                 $this->addFlash('success'$this->getTranslator()->trans('messages.deleted.success'));
  257.             } else {
  258.                 $this->addFlash('error'$this->getTranslator()->trans('messages.deleted.error'));
  259.             }
  260.         } else {
  261.             $this->addFlash('error'$this->getTranslator()->trans('messages.deleted.error'));
  262.         }
  263.     }
  264.     public function getSetting()
  265.     {
  266.         $mSetting $this->getDoctrine()->getRepository(MSetting::class);
  267.         $setting $mSetting->findOneBy(['is_active' => true], ['id' => 'desc']);
  268.         return $setting;
  269.     }
  270.     public function getHeaderKategori()
  271.     {
  272.         $mKategoriRepo $this->getDoctrine()->getRepository(MKategori::class);
  273.         $kategori $mKategoriRepo->findBy([], ['id' => 'asc']);
  274.         return $kategori;
  275.     }
  276.     public function getVariable($id)
  277.     {
  278.         $mVariableRepo $this->getDoctrine()->getRepository(TVariabel::class);
  279.         $variabel $mVariableRepo->find($id);
  280.         return $variabel;
  281.     }
  282.     public function getDataTable($id$limit$page$get$state null$row null$choiced_field null$tahun null)
  283.     {
  284.         $connection $this->getDoctrine()->getConnection();
  285.         // $connection = DriverManager::getConnection($this->connParams);
  286.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  287.         $stmt $connection->prepare($tbl_func);
  288.         $stmt->execute();
  289.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  290.         $periode_update $variabel_repo->getPeriodeVariableByPubId($id)[0]->getId();
  291.         $period_update_status false;
  292.         if ($choiced_field) {
  293.             in_array($periode_update$choiced_field) ? $period_update_status true array_push($choiced_field"{$periode_update}");
  294.             $variabel $variabel_repo->findBy(['id' => $choiced_field'is_tampil' => true], ['id' => 'asc']);
  295.         } else {
  296.             $period_update_status true;
  297.             $variabel $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  298.         }
  299.         $as_columns "";
  300.         foreach ($variabel as $var) {
  301.             $as_columns .= ", " $var->getNama() . " text";
  302.         }
  303.         if ($choiced_field) {
  304.             $count 0;
  305.             $choiced "(";
  306.             foreach ($choiced_field as $field) {
  307.                 $count $count 1;
  308.                 if ($count == count($choiced_field)) {
  309.                     $choiced $choiced $field;
  310.                 } else {
  311.                     $choiced $choiced $field ',';
  312.                 }
  313.             }
  314.             $choiced $choiced ')';
  315.             $sql "SELECT * FROM crosstab('select a.row_id, b.id, a.isi 
  316.                 from t_data a 
  317.                 join t_variabel b 
  318.                 on a.variabel_id = b.id 
  319.                 where a.pub_id = " $id " and b.is_tampil is true and a.variabel_id IN " $choiced;
  320.         } else {
  321.             $sql "SELECT * FROM crosstab('select a.row_id, b.id, a.isi 
  322.                 from t_data a 
  323.                 join t_variabel b 
  324.                 on a.variabel_id = b.id 
  325.                 where a.pub_id = " $id " and b.is_tampil is true";
  326.         }
  327.         $sql .= " order by 1, 2')
  328.                 AS ct (row_id int" $as_columns ") where 1=1";
  329.         // $sql .= " and ct.periode_update ilike '%" . $tahun . "%'";
  330.         // dd($choiced_field);
  331.         // foreach($choiced_field as $field) {
  332.         //     if($this->getVariable($field)->getNama() == 'periode_update') {
  333.         //         $sql .= " and ct.periode_update ilike '%" . $tahun . "%'";
  334.         //     }
  335.         // }
  336.         $sql .= " and ct.periode_update ilike '%" $tahun "%'";
  337.         if ($row) {
  338.             $sql .= " and row_id = " $row;
  339.         }
  340.         if (!$period_update_status) {
  341.             $variabel array_filter($variabel, function ($var) use ($periode_update) {
  342.                 return $var->getId() != $periode_update;
  343.             });
  344.         }
  345.         if ($get) {
  346.             foreach ($variabel as $var) {
  347.                 if ($value $get[$var->getNama()]) {
  348.                     $sql .= " and " $var->getNama() . " ILIKE '%" $value "%'";
  349.                 }
  350.                 // if($var->getNama() == 'periode_update') {
  351.                 //     continue;
  352.                 // } else {
  353.                 //     if ($value = $get[$var->getNama()]) {
  354.                 //         $sql .= " and " . $var->getNama() . " ILIKE '%" . $value . "%'";
  355.                 //     }
  356.                 // }  
  357.             }
  358.         }
  359.         if ($limit) {
  360.             $sql .= " LIMIT " $limit;
  361.         }
  362.         if ($page) {
  363.             $sql .= " OFFSET " $page;
  364.         }
  365.         $stmt $connection->prepare($sql);
  366.         $stmt->execute();
  367.         $result = array();
  368.         foreach ($stmt->fetchAll() as $data) {
  369.             $temp = array();
  370.             if ($state) {
  371.                 $temp['id'] = $data['row_id'];
  372.             }
  373.             foreach ($variabel as $var) {
  374.                 if ($var->getNama() == 'periode_update') {
  375.                     if (!$period_update_status) {
  376.                         continue;
  377.                     }
  378.                 }
  379.                 $temp[] = $data[$var->getNama()];
  380.             }
  381.             $result[] = $temp;
  382.         }
  383.         // print_r($result);exit;
  384.         return $result;
  385.     }
  386.     public function getDataDownload($id)
  387.     {
  388.         $connection $this->getDoctrine()->getConnection();
  389.         // $connection = DriverManager::getConnection($this->connParams);
  390.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  391.         $stmt $connection->prepare($tbl_func);
  392.         $stmt->execute();
  393.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  394.         $pub_rebo $this->managerRegistry->getRepository(TPublikasi::class);
  395.         $periode_update $variabel_repo->getPeriodeVariableByPubId($id)[0]->getId();
  396.         $period_update_status false;
  397.         $variabel $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  398.         $as_columns "";
  399.         foreach ($variabel as $var) {
  400.             $as_columns .= ", " $var->getNama() . " text";
  401.         }
  402.         $sql "SELECT * FROM crosstab('select a.row_id, b.id, a.isi 
  403.                 from t_data a 
  404.                 join t_variabel b 
  405.                 on a.variabel_id = b.id 
  406.                 where a.pub_id = " $id " and b.is_tampil is true";
  407.         $sql .= " order by 1, 2')
  408.                 AS ct (row_id int" $as_columns ") where 1=1";
  409.         $stmt $connection->prepare($sql);
  410.         $stmt->execute();
  411.         $result = array();
  412.         $sqlResult $stmt->fetchAll();
  413.         $years = [];
  414.         $orderedPeriode = [];
  415.         foreach ($sqlResult as $key => $value) {
  416.             if (!in_array(preg_replace('/[^0-9]/'''$value['periode_update']), $years)) {
  417.                 $years[] = preg_replace('/[^0-9]/'''$value['periode_update']);
  418.             }
  419.         }
  420.         $publikasi $pub_rebo->find($id);
  421.         $opt_periode $this->getPeriodeName($publikasi->getPeriode()->getId());
  422.         sort($years);
  423.         foreach ($years as $k => $v) {
  424.             foreach ($opt_periode as $periode_key => $periode_v) {
  425.                 $orderedPeriode[] = $periode_v ' ' $v;
  426.             }
  427.         }
  428.         $orderedData = [];
  429.         foreach ($orderedPeriode as $k => $v) {
  430.             foreach ($sqlResult as $k_result => $v_result) {
  431.                 if ($v_result['periode_update'] == $v) {
  432.                     $orderedData[] = $v_result;
  433.                 }
  434.             }
  435.         }
  436.         foreach ($orderedData as $data) {
  437.             $temp = array();
  438.             foreach ($variabel as $var) {
  439.                 $temp[] = $data[$var->getNama()];
  440.             }
  441.             $result[] = $temp;
  442.         }
  443.         // print_r($result);exit;
  444.         return $result;
  445.     }
  446.     public function getDataTableRawData($id$limit$page$get$state null$row null)
  447.     {
  448.         $connection $this->getDoctrine()->getConnection();
  449.         // $connection = DriverManager::getConnection($this->connParams);
  450.         $sql "SELECT * FROM t_raw_data";
  451.         if ($limit) {
  452.             $sql .= " LIMIT " $limit;
  453.         }
  454.         if ($page) {
  455.             $sql .= " OFFSET " $page;
  456.         }
  457.         $stmt $connection->prepare($sql);
  458.         $stmt->execute();
  459.         $result = array();
  460.         foreach ($stmt->fetchAll() as $key => $data) {
  461.             // $result[$key]['head1'] = json_decode($data['head_1'], true);
  462.             // $result[$key]['head2'] = json_decode($data['head_2'], true);
  463.             $result['isi'][$key] = json_decode($data['isi'], true);
  464.         }
  465.         // print_r($result);exit;
  466.         return $result;
  467.     }
  468.     public function getDataTableCleansing($id$limit$page$get$state null$row null)
  469.     {
  470.         $connection $this->getDoctrine()->getConnection();
  471.         // $connection = DriverManager::getConnection($this->connParams);
  472.         $sql "SELECT * FROM t_cleansing_raw";
  473.         if ($limit) {
  474.             $sql .= " LIMIT " $limit;
  475.         }
  476.         if ($page) {
  477.             $sql .= " OFFSET " $page;
  478.         }
  479.         $stmt $connection->prepare($sql);
  480.         $stmt->execute();
  481.         $result['isi'] = [];
  482.         foreach ($stmt->fetchAll() as $key => $data) {
  483.             $kategori_plant $data['kategori_plant'];
  484.             $regional $data['regional'];
  485.             $status_pp_update $data['status_pp_update'];
  486.             $kategori_tahap $data['kategori_tahap'];
  487.             $nilai_saving_terhadap_anggaran $data['nilai_saving_terhadap_anggaran'];
  488.             $nilai_saving_terhadap_hps $data['nilai_saving_terhadap_hps'];
  489.             $saving_persen_terhadap_angggaran $data['saving_persen_terhadap_angggaran'];
  490.             $saving_persen_terhadap_hps $data['saving_persen_terhadap_hps'];
  491.             $decoded json_decode($data['isi'], true);
  492.             if (!is_array($decoded)) continue;
  493.             // Jika bukan array of array, bungkus ke array
  494.             if (!isset($decoded[0]) || !is_array($decoded[0])) {
  495.                 $decoded = [$decoded];
  496.             }
  497.             $items array_map(function ($item) use ($kategori_plant$regional$status_pp_update$kategori_tahap$nilai_saving_terhadap_anggaran$nilai_saving_terhadap_hps$saving_persen_terhadap_angggaran$saving_persen_terhadap_hps) {
  498.                 $item['kategori_plant'] = $kategori_plant;
  499.                 $item['regional'] = $regional;
  500.                 $item['status_pp_update'] = $status_pp_update;
  501.                 $item['kategori_tahap'] = $kategori_tahap;
  502.                 $item['nilai_saving_terhadap_anggaran'] = $nilai_saving_terhadap_anggaran;
  503.                 $item['nilai_saving_terhadap_hps'] = $nilai_saving_terhadap_hps;
  504.                 $item['saving_persen_terhadap_angggaran'] = $saving_persen_terhadap_angggaran;
  505.                 $item['saving_persen_terhadap_hps'] = $saving_persen_terhadap_hps;
  506.                 return $item;
  507.             }, $decoded);
  508.             $result['isi'] = array_merge($result['isi'], $items);
  509.             // $result['isi'][$key] = json_decode($data['isi'], true);
  510.             // print_r($result);exit;
  511.         }
  512.         return $result;
  513.     }
  514.     public function getDataHeader()
  515.     {
  516.         $connection $this->getDoctrine()->getConnection();
  517.         // $connection = DriverManager::getConnection($this->connParams);
  518.         $sql "SELECT * FROM t_header";
  519.         $stmt $connection->prepare($sql);
  520.         $stmt->execute();
  521.         $result = array();
  522.         foreach ($stmt->fetchAll() as $data) {
  523.             $result[]['head1'] = json_decode($data['head_1'], true);
  524.             $result[]['head2'] = json_decode($data['head_2'], true);
  525.         }
  526.         // print_r($result);exit;
  527.         return $result;
  528.     }
  529.     public function highlight()
  530.     {
  531.         $connection $this->getDoctrine()->getConnection();
  532.         // $connection = DriverManager::getConnection($this->connParams);
  533.         $sql "SELECT id, judul, 'INFOGRAFIK'::text as tipe, created_at as tanggal, 'detail_infografik' as link FROM t_infografik
  534.                 WHERE is_arsip is false AND tipe = 1
  535.                 -- UNION ALL
  536.                 -- SELECT id, judul, 'DATASET'::text as tipe, updated_at as tanggal, 'dataset_detail' as link FROM t_publikasi
  537.                 -- WHERE status_id = 3
  538.                 ORDER BY
  539.                 tanggal DESC
  540.                 LIMIT 5
  541.                 ";
  542.         $stmt $connection->query($sql);
  543.         // $stmt->execute();
  544.         $result $stmt->fetchAllAssociative();
  545.         $TDokumenRepo $this->getDoctrine()->getRepository(TDokumen::class);
  546.         $mKategoriDetailRepo $this->getDoctrine()->getRepository(MKategoriDetail::class);
  547.         foreach ($result as $k => $rs) {
  548.             $result[$k]['icon'] = '';
  549.             if ($rs['tipe'] == 'INFOGRAFIK') {
  550.                 $dokumen $TDokumenRepo->findBy(['reff_id' => $rs['id'], 'reff_name' => 'INFOGRAFIK'], ['id' => 'asc'], 1);
  551.                 if ($dokumen) {
  552.                     $result[$k]['icon'] = $dokumen[0]->getPath();
  553.                 }
  554.             } else {
  555.                 $kategori $mKategoriDetailRepo->findBy(['reff_id' => $rs['id'], 'reff_name' => 'PUBLIKASI'], ['id' => 'asc'], 1);
  556.                 if ($kategori) {
  557.                     $result[$k]['icon'] = $kategori[0]->getKategori()->getIcon();
  558.                 }
  559.             }
  560.         }
  561.         return $result;
  562.     }
  563.     public function getGrafikDataset(TPublikasi $detail$p_order)
  564.     {
  565.         $tGrafikRepo $this->getDoctrine()->getRepository(TGrafik::class);
  566.         $tDataRepo $this->getDoctrine()->getRepository(TData::class);
  567.         $tVariabelRepo $this->getDoctrine()->getRepository(TVariabel::class);
  568.         $grafik $tGrafikRepo->findOneBy(['pub' => $detail->getId()]);
  569.         if ($grafik) {
  570.             $tdataIsi $tDataRepo->findBy(['pub' => $detail->getId(), 'variabel' => $grafik->getAxisX()], ['id' => 'asc']);
  571.             $tdataKategori $tDataRepo->findBy(['pub' => $detail->getId(), 'variabel' => $grafik->getAxisY()], ['id' => 'asc']);
  572.             $variabel_x $tVariabelRepo->find($grafik->getAxisX());
  573.             $variabel_y $tVariabelRepo->find($grafik->getAxisY());
  574.             $data_chart $this->getTabelGrafik($detail->getId(), $variabel_x->getNama(), $p_order);
  575.             // dump($test); exit;
  576.             // $data_chart = array();
  577.             // foreach($tdataIsi as $td){
  578.             //     $data_chart[] = floatval($td->getIsi());
  579.             // }
  580.             $data_kategori = array();
  581.             foreach ($tdataKategori as $td) {
  582.                 $data_kategori[] = $td->getIsi();
  583.             }
  584.             // Chart
  585.             $series = array(
  586.                 array("name" => $variabel_x->getNama(), "data" => $data_chart)
  587.             );
  588.             $ob = new Highchart();
  589.             $ob->chart->renderTo('linechart');  // The #id of the div where to render the chart
  590.             $ob->chart->type($grafik->getTipe());
  591.             $ob->title->text($grafik->getJudul());
  592.             $ob->xAxis->title(array('text'  => ""));
  593.             $ob->xAxis->categories($data_kategori);
  594.             $ob->yAxis->title(array('text'  => ""));
  595.             $ob->series($series);
  596.             return $ob;
  597.         }
  598.         return false;
  599.     }
  600.     public function dashboardSearch($search)
  601.     {
  602.         $connection $this->getDoctrine()->getConnection();
  603.         $sql =
  604.             "SELECT * from
  605.             (
  606.                 select distinct on (x.tipe, x.id) b.nama as kategori, x.*
  607.                 from m_kategori_detail a
  608.                 join m_kategori b
  609.                 on a.kategori_id = b.id
  610.                 right join
  611.                 (
  612.                     select * from (
  613.                         select 'DATASET'::text as tipe, a.id as id, a.judul as judul, a.deskripsi as deskripsi, c.nama as urusan, d.nama as sektor, b.div_nama as div, a.updated_at as tanggal
  614.                         from t_publikasi a
  615.                         join t_div b
  616.                         on a.div_id = b.id
  617.                         join m_urusan c
  618.                         on a.urusan_id = c.id
  619.                         join m_sektor d
  620.                         on a.sektor_id = d.id
  621.                         where a.status_id = 3
  622.                         UNION ALL
  623.                         select 'INFOGRAFIK'::text as tipe, a.id as id, a.judul as judul, a.deskripsi as deskripsi, ''::text as urusan, ''::text as sektor, a.sumber::text as div, a.created_at as tanggal
  624.                         from t_infografik a
  625.                         where a.is_arsip = false
  626.                     ) as search
  627.                 ) as x
  628.                 on a.reff_id = x.id and a.reff_name = x.tipe 
  629.             ) as fix
  630.             where judul ilike '%$search%' or tipe ilike '%$search%' or deskripsi ilike '%$search%' or urusan ilike '%$search%' or sektor ilike '%$search%' or div ilike '%$search%'
  631.             order by tanggal desc
  632.             limit 5";
  633.         $stmt $connection->prepare($sql);
  634.         $stmt->execute();
  635.         $result $stmt->fetchAll();
  636.         return $result;
  637.     }
  638.     public function buttonCredentials(string $name null)
  639.     {
  640.         $ptiRuleRepo $this->getDoctrine()->getRepository(PtiRule::class);
  641.         $user_group $this->getUser()->getRoles()[0];
  642.         $qb $ptiRuleRepo->createQueryBuilder('t')
  643.             ->join('t.groups''g')
  644.             ->join('t.module_action''ma')
  645.             ->join('ma.module''m')
  646.             ->select('t.id, m.url, ma.action')
  647.             ->andWhere('g.credential = :credential')->setParameter('credential'$user_group)
  648.             ->andWhere('t.is_allowed = true');
  649.         if (null !== $name) {
  650.             $qb
  651.                 ->andWhere('m.url = :url')->setParameter('url'$name);
  652.         }
  653.         $rules $qb->getQuery()->getResult();
  654.         $credentials = [];
  655.         foreach ($rules as $rule) {
  656.             if (!isset($credentials[$rule['url']])) {
  657.                 $credentials[$rule['url']] = [];
  658.             }
  659.             $credentials[$rule['url']][$rule['action']] = $rule['id'];
  660.         }
  661.         return $credentials;
  662.     }
  663.     public function getPeriodeName($pId)
  664.     {
  665.         $tipex = array();
  666.         // Hari
  667.         // if ($pId == 5) {
  668.         //     return intval($key);
  669.         // }
  670.         // Bulan
  671.         if ($pId == 6) {
  672.             $tipex = array(
  673.                 => 'Januari',
  674.                 => 'Februari',
  675.                 => 'Maret',
  676.                 => 'April',
  677.                 => 'Mei',
  678.                 => 'Juni',
  679.                 => 'Juli',
  680.                 => 'Agustus',
  681.                 => 'September',
  682.                 10 => 'Oktober',
  683.                 11 => 'November',
  684.                 12 => 'Desember'
  685.             );
  686.         }
  687.         // Triwulan
  688.         else if ($pId == 7) {
  689.             $tipex = array(
  690.                 => 'Triwulan I',
  691.                 => 'Triwulan II',
  692.                 => 'Triwulan III',
  693.                 => 'Triwulan IV',
  694.             );
  695.         }
  696.         // Semester
  697.         else if ($pId == 8) {
  698.             $tipex = array(
  699.                 => 'Semester I',
  700.                 => 'Semester II',
  701.             );
  702.         }
  703.         // Tahun
  704.         else if ($pId == 9) {
  705.             $tipex = array(
  706.                 => 'Tahun',
  707.             );
  708.         }
  709.         return $tipex;
  710.     }
  711.     public function experimentGrouping($id$variabel$tahun)
  712.     {
  713.         $connection $this->getDoctrine()->getConnection();
  714.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  715.         $stmt $connection->prepare($tbl_func);
  716.         $stmt->execute();
  717.         $publikasi_repo $this->getDoctrine()->getRepository(TPublikasi::class);
  718.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  719.         $as_columns "";
  720.         $newVariable =
  721.             $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  722.         foreach ($newVariable as $var) {
  723.             $as_columns .= ", " $var->getNama() . " text";
  724.         }
  725.         $selCols = [];
  726.         $selCols[] = "ct.periode_update";
  727.         $containPeriodeUpdate false;
  728.         foreach ($variabel as $col) {
  729.             if ($col->getNama() == 'periode_update') {
  730.                 $containPeriodeUpdate true;
  731.                 continue;
  732.             }
  733.             $selCols[] = "ct." $col->getNama();
  734.         }
  735.         $selCols implode(", "$selCols);
  736.         // $this->hitungRataRata($id);
  737.         $newSql "SELECT $selCols FROM crosstab('select a.row_id, b.id, a.isi 
  738.                 from t_data a 
  739.                 join t_variabel b 
  740.                 on a.variabel_id = b.id 
  741.                 where a.pub_id = " $id " and b.is_tampil is true";
  742.         $newSql .= " order by 1, 2')
  743.                 AS ct (row_id int" $as_columns ") where 1=1";
  744.         $newSql .= " and ct.periode_update ilike '%" $tahun "%'";
  745.         $stmt $connection->prepare($newSql);
  746.         $stmt->execute();
  747.         $result $stmt->fetchAll();
  748.         $newResult $result;
  749.         if (!$containPeriodeUpdate) {
  750.             foreach ($newResult as $key => $value) {
  751.                 unset($value['periode_update']);
  752.                 $newResult[$key] = $value;
  753.             }
  754.         }
  755.         $data array_map('array_values'$newResult);
  756.         $periode = [];
  757.         $kategori = [];
  758.         $series = [];
  759.         $length_x_axis 1;
  760.         $first reset($newResult);
  761.         $header array_keys($first);
  762.         foreach ($data as $key => $dt) {
  763.             $periode[$key] = $dt[0];
  764.             foreach ($dt as $k => $val) {
  765.                 if ($k 0) {
  766.                     $series[$k][$key] = $val;
  767.                 }
  768.             }
  769.         }
  770.         $periode array_unique($periode);
  771.         $kategori array_unique($kategori);
  772.         //jika periode_update kosong atau hanya memilih periode  update
  773.         if ($containPeriodeUpdate) {
  774.             $minValue null;
  775.             $maxValue null;
  776.             $looped_variabel $length_x_axis == $periode $kategori;
  777.             $tahunData = [];
  778.             foreach ($periode as $k => $v) {
  779.                 $result array_filter($newResult, function ($data) use ($v) {
  780.                     return str_contains($data['periode_update'], $v);
  781.                 });
  782.                 foreach ($result as $key_result => $value_result) {
  783.                     $tahunData[$v][] = $value_result['periode_update'];
  784.                 }
  785.             }
  786.             foreach ($series as $k => $v) {
  787.                 $index 0;
  788.                 $total 0;
  789.                 $decrementValue 0;
  790.                 foreach ($tahunData as $key_tahun => $value_tahun) {
  791.                     for ($x 0$x count($value_tahun); $x++) {
  792.                         $total += round(str_replace(','''$v[$index]));
  793.                         $index++;
  794.                         $decrementValue++;
  795.                     }
  796.                     $series[$k][$index $decrementValue] = $total;
  797.                     $total 0;
  798.                     $decrementValue 0;
  799.                 }
  800.             }
  801.             // foreach ($looped_variabel as $k => $val) {
  802.             //     if ($minValue === null) {
  803.             //         $minValue = $k;
  804.             //     } else {
  805.             //         $maxValue = $k;
  806.             //         break;
  807.             //     }
  808.             // }
  809.             // $selisih = $maxValue - $minValue;
  810.             // $looped_variabel = $length_x_axis == 1 ? $periode : $kategori;
  811.             // foreach($series as $key_series => $value_series) {
  812.             //     if($selisih == 0) {
  813.             //     } else {
  814.             //         $total = 0;
  815.             //         $countJump = 0;
  816.             //         foreach ($looped_variabel as $key => $value) {
  817.             //             for ($x = 0; $x < $selisih; $x++) {
  818.             //                 $total = $total + round(str_replace(',', '', ($value_series[$minValue + $x + ($selisih *  $countJump)])));
  819.             //             }
  820.             //             $series[$key_series][$key] = $total;
  821.             //             $total = 0;
  822.             //             $countJump++;
  823.             //         }
  824.             //     } 
  825.             // }
  826.         } else {
  827.             $maxValue null;
  828.             $minValue null;
  829.             $jumptCount 0;
  830.             $jump 0;
  831.             $looped_variabel $length_x_axis == $periode $kategori;
  832.             foreach ($looped_variabel as $k => $val) {
  833.                 if ($minValue === null) {
  834.                     $minValue $k;
  835.                     $maxValue $k;
  836.                 } else if ($k  $maxValue) {
  837.                     $maxValue $k;
  838.                 }
  839.             }
  840.             $selisih count($looped_variabel);
  841.             foreach ($series as $key_series => $value_series) {
  842.                 $total 0;
  843.                 for ($x 0$x $selisih$x++) {
  844.                     while (true) {
  845.                         if (isset($value_series[$minValue $x + (($selisih) * $jumptCount)])) {
  846.                             $total $total round(str_replace(',''', ($value_series[$minValue $x + (($selisih) * $jumptCount)])));
  847.                             $jumptCount++;
  848.                             $jump++;
  849.                         } else {
  850.                             $series[$key_series][$minValue $x] = $total;
  851.                             $total 0;
  852.                             $jumptCount 0;
  853.                             break;
  854.                         }
  855.                     }
  856.                 }
  857.             }
  858.         }
  859.         foreach ($series as $k => $v) {
  860.             $series[$k] = array_filter($series[$k], function ($data) {
  861.                 return gettype($data) == 'double';
  862.             });
  863.         }
  864.         $minMax $this->hitungMinMaxValues($series$header$periode);
  865.         $total 0;
  866.         foreach ($series as $k => $v) {
  867.             foreach ($v as $ke_value => $value) {
  868.                 $total += $value;
  869.             }
  870.         }
  871.         return ['total' => $total'min-max' => $minMax];
  872.         // $rs = [];
  873.         // $i = 0;
  874.         // foreach ($periode as $k => $p) {
  875.         //     if ($length_x_axis == 1) {
  876.         //         $rs['categories'][] = $p;
  877.         //     } else {
  878.         //         $rs[$i]['categories']['name'] = $p;
  879.         //         foreach ($kategori as $kat) {
  880.         //             $rs[$i]['categories'][] = $kat;
  881.         //         }
  882.         //     }
  883.         //     $i++;
  884.         // }
  885.         // $i = 0;
  886.         // foreach ($series as $k => $seri) {
  887.         //     $rs['series'][$i]['name'] = $header[$k];
  888.         //     foreach ($seri as $s) {
  889.         //         $rs['series'][$i]['data'][] = round($s);
  890.         //     }
  891.         //     $i++;
  892.         // }
  893.     }
  894.     public function expereimentGrafik($id)
  895.     {
  896.         $connection $this->managerRegistry->getConnection();
  897.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  898.         $stmt $connection->prepare($tbl_func);
  899.         $stmt->execute();
  900.         $publikasi_repo $this->managerRegistry->getRepository(TPublikasi::class);
  901.         $variabel_repo $this->managerRegistry->getRepository(TVariabel::class);
  902.         $x_axis $variabel_repo->findBy(['id' => [1302113022]]);
  903.         $y_axis $variabel_repo->findBy(['id' => [1302313024]]);
  904.         $as_columns "";
  905.         $selCols = [];
  906.         $variabel $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  907.         foreach ($variabel as $var) {
  908.             $as_columns .= ", " $var->getNama() . " text";
  909.         }
  910.         foreach ($variabel as $col) {
  911.             $selCols[] = "ct." $col->getNama();
  912.         }
  913.         $selCols implode(", "$selCols);
  914.         $newSql ";with C as (
  915.                 Select $selCols from
  916.                 crosstab('select a.row_id, b.id, a.isi 
  917.                                 from t_data a 
  918.                                 join t_variabel b 
  919.                                 on a.variabel_id = b.id 
  920.                                 where a.pub_id = " .  $id " and b.is_tampil is true";
  921.         $newSql .= " order by 1, 2')
  922.                                 AS ct (row_id int" $as_columns ") 
  923.                                 where 1=1
  924.                 )
  925.                 select C.periode_update, C.jenis_kunjungan ,SUM(CAST (replace(C.laki_laki, ',', '') AS FLOAT)) as laki_laki
  926.                 from C
  927.                 group by C.periode_update, C.jenis_kunjungan
  928.                 ;";
  929.         $stmt $connection->prepare($newSql);
  930.         $stmt->execute();
  931.         $result $stmt->fetchAll();
  932.         //contain periode update
  933.         if (true) {
  934.             $label_grafik = [];
  935.             $value_grafik = [];
  936.             $years = [];
  937.             $orderedPeriode = [];
  938.             $orderedData = [];
  939.             foreach ($result as $key => $value) {
  940.                 if (!in_array(preg_replace('/[^0-9]/'''$value['periode_update']), $years)) {
  941.                     $years[] = preg_replace('/[^0-9]/'''$value['periode_update']);
  942.                 }
  943.             }
  944.             $publikasi $publikasi_repo->find($id);
  945.             $opt_periode $this->getPeriodeName($publikasi->getPeriode()->getId());
  946.             sort($years);
  947.             foreach ($years as $k => $v) {
  948.                 foreach ($opt_periode as $periode_key => $periode_v) {
  949.                     $orderedPeriode[] = $periode_v ' ' $v;
  950.                 }
  951.             }
  952.             foreach ($orderedPeriode as $k => $v) {
  953.                 foreach ($result as $k_result => $v_result) {
  954.                     if ($v_result['periode_update'] == $v) {
  955.                         $orderedData[] = $v_result;
  956.                     }
  957.                 }
  958.             }
  959.             $data array_map('array_values'$orderedData);
  960.             $first reset($orderedData);
  961.             $header array_keys($first);
  962.             foreach ($data as $k => $v) {
  963.                 foreach ($v as $key => $value) {
  964.                     if ($key count($x_axis)) {
  965.                         $label_grafik[$key][] = $value;
  966.                     } else {
  967.                         $value_grafik[$header[$key]][] = $value;
  968.                     }
  969.                 }
  970.             }
  971.             foreach ($label_grafik as $k => $v) {
  972.                 $label_grafik[$k] = array_unique($v);
  973.             }
  974.             dump($label_grafik);
  975.             $categories = [];
  976.             $count 0;
  977.             while (true) {
  978.                 foreach ($label_grafik[$count] as $k => $v) {
  979.                     if ($count == 0) {
  980.                         $categories[] = [
  981.                             'name' => $v,
  982.                             'categories' => []
  983.                         ];
  984.                     } else {
  985.                         foreach ($categories as $category) {
  986.                             $tempCategory null;
  987.                             while (true) {
  988.                                 if ($tempCategory == null) {
  989.                                     $tempCategory $category['categories'];
  990.                                 }
  991.                                 if (isset($tempCategory['categories'])) {
  992.                                     $tempCategory $tempCategory['categories']['categories'];
  993.                                 } else {
  994.                                     if ($count == count($label_grafik) - 1) {
  995.                                         foreach ($label_grafik[$count] as $value) {
  996.                                             $tempCategory['categories'][] = $v;
  997.                                         }
  998.                                     } else {
  999.                                         $cats = [];
  1000.                                         foreach ($label_grafik[$count] as $value) {
  1001.                                             $cats[] = $v;
  1002.                                         }
  1003.                                         $tempCategory['categories'] = [
  1004.                                             'nama' => $v,
  1005.                                             'categories' => $cats
  1006.                                         ];
  1007.                                     }
  1008.                                     break;
  1009.                                 }
  1010.                             }
  1011.                         }
  1012.                     }
  1013.                 }
  1014.                 if ($count == count($label_grafik) - 1) {
  1015.                     break;
  1016.                 } else {
  1017.                     $count++;
  1018.                 }
  1019.             }
  1020.             dump($categories);
  1021.             exit;
  1022.         }
  1023.     }
  1024.     public function getCrossTabData($id)
  1025.     {
  1026.         $connection $this->getDoctrine()->getConnection();
  1027.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  1028.         $stmt $connection->prepare($tbl_func);
  1029.         $stmt->execute();
  1030.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  1031.         $as_columns "";
  1032.         $newVariable =
  1033.             $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  1034.         foreach ($newVariable as $var) {
  1035.             $as_columns .= ", " $var->getNama() . " text";
  1036.         }
  1037.         $newSql "SELECT * FROM crosstab('select a.row_id, b.id, a.isi 
  1038.                 from t_data a 
  1039.                 join t_variabel b 
  1040.                 on a.variabel_id = b.id 
  1041.                 where a.pub_id = " $id " and b.is_tampil is true";
  1042.         $newSql .= " order by 1, 2')
  1043.                 AS ct (row_id int" $as_columns ") where 1=1";
  1044.         $stmt $connection->prepare($newSql);
  1045.         $stmt->execute();
  1046.         $result $stmt->fetchAll();
  1047.         $tahun = [];
  1048.         foreach ($result as $key => $value) {
  1049.             if (!in_array(preg_replace('/[^0-9]/'''$value['periode_update']), $tahun)) {
  1050.                 $tahun[] = preg_replace('/[^0-9]/'''$value['periode_update']);
  1051.             }
  1052.         }
  1053.         sort($tahun);
  1054.         return [
  1055.             'crosstab' => $result[0],
  1056.             'tahun' => $tahun
  1057.         ];
  1058.     }
  1059.     public function hitungMinMaxValues($series$header$periode)
  1060.     {
  1061.         $results = [];
  1062.         // dump($series);
  1063.         // dump($header);
  1064.         // dump($periode);
  1065.         // exit;
  1066.         foreach ($series as $k => $v) {
  1067.             // $total = 0;
  1068.             // foreach($v as $key_value => $value) {
  1069.             //     $total += $value;
  1070.             // }
  1071.             // $results[$k] = $total;
  1072.             $maxValue max($v);
  1073.             $minValue min($v);
  1074.             $labelValue $header[$k];
  1075.             $keyMax =  array_keys($vmax($v))[0];
  1076.             $keyMin array_keys($vmin($v))[0];
  1077.             $labelVarMin $periode[$keyMin];
  1078.             $labelVarMax $periode[$keyMax];
  1079.         }
  1080.         return ['max' => [
  1081.             "$labelValue / $labelVarMax=> $maxValue,
  1082.         ], 'min' => [
  1083.             "$labelValue / $labelVarMin=> $minValue,
  1084.         ]];
  1085.     }
  1086.     public function hitungRataRata($id$variabel)
  1087.     {
  1088.         $connection $this->getDoctrine()->getConnection();
  1089.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  1090.         $stmt $connection->prepare($tbl_func);
  1091.         $stmt->execute();
  1092.         $publikasi_repo $this->getDoctrine()->getRepository(TPublikasi::class);
  1093.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  1094.         $as_columns "";
  1095.         $newVariable =
  1096.             $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  1097.         foreach ($newVariable as $var) {
  1098.             $as_columns .= ", " $var->getNama() . " text";
  1099.         }
  1100.         $selCols[] = 'ct.periode_update';
  1101.         foreach ($variabel as $col) {
  1102.             $selCols[] = "ct." $col->getNama();
  1103.         }
  1104.         $selCols implode(", "$selCols);
  1105.         $newSql "SELECT $selCols FROM crosstab('select a.row_id, b.id, a.isi 
  1106.                 from t_data a 
  1107.                 join t_variabel b 
  1108.                 on a.variabel_id = b.id 
  1109.                 where a.pub_id = " $id " and b.is_tampil is true";
  1110.         $newSql .= " order by 1, 2')
  1111.                 AS ct (row_id int" $as_columns ") where 1=1";
  1112.         $stmt $connection->prepare($newSql);
  1113.         $stmt->execute();
  1114.         $result $stmt->fetchAll();
  1115.         $tahun = array();
  1116.         $indexTahun = [];
  1117.         $newResult $result;
  1118.         //extract tahun rata-rata
  1119.         foreach ($newResult as $key => $value) {
  1120.             if (!in_array(preg_replace('/[^0-9]/'''$value['periode_update']), $tahun)) {
  1121.                 $tahun[] = preg_replace('/[^0-9]/'''$value['periode_update']);
  1122.             }
  1123.         }
  1124.         sort($tahun);
  1125.         $orderedResult = array();
  1126.         $tahunData = [];
  1127.         foreach ($tahun as $k => $v) {
  1128.             $result array_filter($newResult, function ($data) use ($v) {
  1129.                 return str_contains($data['periode_update'], $v);
  1130.             });
  1131.             foreach ($result as $key_result => $value_result) {
  1132.                 $orderedResult[] = $value_result;
  1133.                 $tahunData[$v][] = $value_result['periode_update'];
  1134.             }
  1135.         }
  1136.         $data array_map('array_values'$orderedResult);
  1137.         $periode = [];
  1138.         $kategori = [];
  1139.         $series = [];
  1140.         $length_x_axis 1;
  1141.         $first reset($newResult);
  1142.         $header array_keys($first);
  1143.         foreach ($data as $key => $dt) {
  1144.             $periode[$key] = $dt[0];
  1145.             foreach ($dt as $k => $val) {
  1146.                 if ($k 0) {
  1147.                     $series[$k][$key] = $val;
  1148.                 }
  1149.             }
  1150.         }
  1151.         $periode array_unique($periode);
  1152.         $kategori array_unique($kategori);
  1153.         $results = [];
  1154.         $index 0;
  1155.         foreach ($tahunData as $k => $v) {
  1156.             $total 0;
  1157.             foreach ($series as $key_series => $value_series) {
  1158.                 for ($x 0$x count($v); $x++) {
  1159.                     $total += round(str_replace(','''$value_series[$index]));
  1160.                     $index++;
  1161.                 }
  1162.                 $results[$k][] = $total;
  1163.                 $total 0;
  1164.             }
  1165.         }
  1166.         $totalData 0;
  1167.         foreach ($results as $k => $v) {
  1168.             $totalData += $v[0];
  1169.         }
  1170.         $hasil = ['tahun' => count($tahun), 'rata-rata' => $totalData count($tahun)];
  1171.         return $hasil;
  1172.         // //hitung rata-rata
  1173.         // foreach ($tahun as $year) {
  1174.         //     foreach ($periode as $k => $v) {
  1175.         //         if (str_contains($v, $year)) {
  1176.         //             $indexTahun[$year][] = $k;
  1177.         //         }
  1178.         //     }
  1179.         // }
  1180.         // $lastIndexOfIndexTahun = [];
  1181.         // foreach ($indexTahun as $k => $values) {
  1182.         //     $lastIndexOfIndexTahun[$k][] = count($values);
  1183.         // }
  1184.         // $minValue = null;
  1185.         // $maxValue = null;
  1186.         // $looped_variabel = $length_x_axis == 1 ? $periode : $kategori;
  1187.         // foreach ($looped_variabel as $k => $val) {
  1188.         //     if ($minValue === null) {
  1189.         //         $minValue = $k;
  1190.         //     } else {
  1191.         //         $maxValue = $k;
  1192.         //         break;
  1193.         //     }
  1194.         // }
  1195.         // $selisih = $maxValue - $minValue;
  1196.         // dump($periode);
  1197.         // dump($selisih);
  1198.         // dump($series);
  1199.         // exit;
  1200.         // $looped_variabel = $length_x_axis == 1 ? $periode : $kategori;
  1201.         // foreach ($series as $key_series => $value_series) {
  1202.         //     $total = 0;
  1203.         //     $countJump = 0;
  1204.         //     foreach ($looped_variabel as $key => $value) {
  1205.         //         for ($x = 0; $x < $selisih; $x++) {
  1206.         //             $total = $total + round(str_replace(',', '', ($value_series[$minValue + $x + ($selisih *  $countJump)])));
  1207.         //         }
  1208.         //         $series[$key_series][$key] = $total;
  1209.         //         $total = 0;
  1210.         //         $countJump++;
  1211.         //     }
  1212.         // }
  1213.         // foreach ($series as $k => $v) {
  1214.         //     $series[$k] = array_filter($series[$k], function ($data) {
  1215.         //         return gettype($data) == 'double';
  1216.         //     });
  1217.         // }
  1218.         // $totalData = 0;
  1219.         // foreach ($series as $key => $value) {
  1220.         //     $totalData += count($value);
  1221.         //     foreach ($indexTahun as $key_tahun => $value_tahun) {
  1222.         //         foreach ($value_tahun as $index_tahun) {
  1223.         //             foreach ($value as $k => $v) {
  1224.         //                 if ($index_tahun == $k) {
  1225.         //                     if (isset($indexTahun[$key_tahun][$lastIndexOfIndexTahun[$key_tahun][0]])) {
  1226.         //                         $indexTahun[$key_tahun][$lastIndexOfIndexTahun[$key_tahun][0]] += $value[$k];
  1227.         //                     } else {
  1228.         //                         $indexTahun[$key_tahun][$lastIndexOfIndexTahun[$key_tahun][0]] = $value[$k];
  1229.         //                     }
  1230.         //                 }
  1231.         //             }
  1232.         //         }
  1233.         //     }
  1234.         // }
  1235.         // $total = 0;
  1236.         // foreach ($indexTahun as $kunci => $nilai) {
  1237.         //     $total += end($nilai);
  1238.         // }
  1239.         // $totalData = 0;
  1240.         // foreach ($oldSeries as $key_old => $value_old) {
  1241.         //     $totalData += count($value_old);
  1242.         // }
  1243.     }
  1244.     public function getKategori($id$periode$x_axis)
  1245.     {
  1246.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  1247.         $connection $this->getDoctrine()->getConnection();
  1248.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  1249.         $stmt $connection->prepare($tbl_func);
  1250.         $stmt->execute();
  1251.         $as_columns "";
  1252.         $newVariable =
  1253.             $variabel_repo->findBy(['pub' => $id'is_tampil' => true], ['id' => 'asc']);
  1254.         foreach ($newVariable as $var) {
  1255.             $as_columns .= ", " $var->getNama() . " text";
  1256.         }
  1257.         $sql "SELECT * FROM crosstab('select a.row_id, b.id, a.isi 
  1258.                 from t_data a 
  1259.                 join t_variabel b 
  1260.                 on a.variabel_id = b.id 
  1261.                 where a.pub_id = " $id " and b.is_tampil is true";
  1262.         $sql .= " order by 1, 2')
  1263.                 AS ct (row_id int" $as_columns ") where 1=1";
  1264.         $sql .= " and ct.periode_update ilike '%" $periode "%'";
  1265.         $stmt $connection->prepare($sql);
  1266.         $stmt->execute();
  1267.         $result $stmt->fetchAll();
  1268.         return $result;
  1269.     }
  1270.     public function getTabelGrafikDinamis($id$cols$p_order)
  1271.     {
  1272.         $connection $this->getDoctrine()->getConnection();
  1273.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  1274.         $stmt $connection->prepare($tbl_func);
  1275.         $stmt->execute();
  1276.         $variabel_repo $this->getDoctrine()->getRepository(TVariabelGrafik::class);
  1277.         $variabel $variabel_repo->findBy(['grafik' => $id], ['id' => 'asc']);
  1278.         $as_columns "";
  1279.         foreach ($variabel as $var) {
  1280.             $as_columns .= ", " $var->getNama() . " varchar";
  1281.         }
  1282.         $selCols = [];
  1283.         foreach ($cols as $col) {
  1284.             $selCols[] = "ct." $col->getNama();
  1285.         }
  1286.         $selCols implode(", "$selCols);
  1287.         // $sql = "SELECT $selCols, ct.periode_order, ct.periode_update
  1288.         $sql "SELECT $selCols
  1289.                 FROM crosstab('select a.row_id, b.id, a.isi 
  1290.                 from tdata_grafik a 
  1291.                 join tvariabel_grafik b 
  1292.                 on a.variabel_id = b.id 
  1293.                 where a.grafik_id = " $id;
  1294.         $sql .= " order by 1, 2')
  1295.                 AS ct (row_id int" $as_columns ") where 1=1";
  1296.         // $sql .= " and ct.periode_update = '$p_order'";
  1297.         $stmt $connection->prepare($sql);
  1298.         $stmt->execute();
  1299.         $result $stmt->fetchAll();
  1300.         // foreach ($stmt->fetchAll() as $data) {
  1301.         //     $result[] = floatval($data[$col]);
  1302.         // }
  1303.         return $result;
  1304.     }
  1305.     public function datasetCkanQuery($request$limit null$offset null$doCount false)
  1306.     {
  1307.         $connection $this->managerRegistry->getConnection();
  1308.         $sql =
  1309.             "SELECT * from
  1310.             (";
  1311.         if ($request->get('kategori')) {
  1312.             $sql .= "SELECT a.kategori_id as kategori_id, b.nama as kategori, x.*
  1313.                 from m_kategori_detail a
  1314.                 join m_kategori b
  1315.                 on a.kategori_id = b.id
  1316.                 right join
  1317.                 (";
  1318.         }
  1319.         if ($request->get('opd')) {
  1320.             $sql .= "SELECT * from (
  1321.                         select 'PUBLIKASI'::text as tipe, a.id as id, a.judul as judul, b.id as div_id, b.div_nama as div, a.sektor_id as sektor, a.created_at as tanggal, a.view as view, b.parent as parent
  1322.                         from t_publikasi a
  1323.                         join t_div b
  1324.                         on a.div_id = b.id
  1325.                         where a.status_id = 3
  1326.                         and a.id NOT IN (select distinct(t_publikasi.id) from t_publikasi inner join t_ckan on t_publikasi.judul = t_ckan.title and t_ckan.div_id_id = {$request->get('opd')})
  1327.                         UNION ALL
  1328.                         select 'CKAN'::text as tipe, a.id as id, a.title as judul, b.id as div_id, b.div_nama as div, null::integer as sektor, a.metadata_created as tanggal, a.view as view, b.parent as parent
  1329.                         from t_ckan a
  1330.                         join t_div b
  1331.                         on a.div_id_id = b.id
  1332.                     ) as search";
  1333.         } else {
  1334.             $sql .= "SELECT * from (
  1335.                         select 'PUBLIKASI'::text as tipe, a.id as id, a.judul as judul, b.id as div_id, b.div_nama as div, a.sektor_id as sektor, a.created_at as tanggal, a.view as view, b.parent as parent
  1336.                         from t_publikasi a
  1337.                         join t_div b
  1338.                         on a.div_id = b.id
  1339.                         where a.status_id = 3
  1340.                         
  1341.                         UNION ALL
  1342.                         select 'CKAN'::text as tipe, a.id as id, a.title as judul, b.id as div_id, b.div_nama as div, null::integer as sektor, a.metadata_created as tanggal, a.view as view, b.parent as parent
  1343.                         from t_ckan a
  1344.                         join t_div b
  1345.                         on a.div_id_id = b.id
  1346.                     ) as search";
  1347.         }
  1348.         if ($request->get('opd')) {
  1349.             $sql .= " where div_id=" $request->get('opd');
  1350.         }
  1351.         // else if ($request->get('opdx')) {
  1352.         //     $sql .= " where div_id=".$request->get('opdx') . " and tipe='CKAN' ";
  1353.         // }
  1354.         $sql .= ") as x";
  1355.         if ($request->get('kategori')) {
  1356.             $sql .= " on a.reff_id = x.id and a.reff_name = x.tipe ";
  1357.             $sql .= " where b.id=" $request->get('kategori');
  1358.             $sql .= ") as fix where 1=1";
  1359.         }
  1360.         if ($request->get('judul') || $request->get('sektor')) {
  1361.             $sql .= " where 1=1";
  1362.         }
  1363.         if ($request->get('judul')) {
  1364.             $sql .= " and judul ilike '%" $request->get('judul') . "%'";
  1365.         }
  1366.         if ($request->get('sektor')) {
  1367.             $sql .= " and sektor =" $request->get('sektor');
  1368.         }
  1369.         $sql .= " order by parent asc, tanggal desc";
  1370.         if ($limit) {
  1371.             $sql .= " limit $limit";
  1372.         }
  1373.         if ($offset) {
  1374.             $sql .= " offset $offset";
  1375.         }
  1376.         $stmt $connection->prepare($sql);
  1377.         $stmt->execute();
  1378.         if ($doCount) {
  1379.             $result $stmt->rowCount();
  1380.         } else {
  1381.             $result $stmt->fetchAll();
  1382.         }
  1383.         return $result;
  1384.     }
  1385.     public function getLinks($page$lastPage$nb_links 5)
  1386.     {
  1387.         $links = array();
  1388.         $tmp   $page floor($nb_links 2);
  1389.         $check $lastPage $nb_links 1;
  1390.         $limit $check $check 1;
  1391.         $begin $tmp ? ($tmp $limit $limit $tmp) : 1;
  1392.         $i = (int) $begin;
  1393.         while ($i $begin $nb_links && $i <= $lastPage) {
  1394.             $links[] = $i++;
  1395.         }
  1396.         $this->currentMaxLink count($links) ? $links[count($links) - 1] : 1;
  1397.         return $links;
  1398.     }
  1399.     public function genCodeDataset()
  1400.     {
  1401.         # code...
  1402.     }
  1403.     public function getDataTableFeedback($limit$page$get$survey$cetak false$doCount false)
  1404.     {
  1405.         $isiRepo $this->getDoctrine()->getRepository(FeedbackIsi::class);
  1406.         $MFeedback $this->MFeedback->findBy(['is_active' => true'survey' => $survey], ['no_urut' => 'asc']);
  1407.         $dataFeedback = array();
  1408.         if ($doCount) {
  1409.             foreach ($MFeedback as $key => $value) {
  1410.                 $dataFeedback[] = count($value->getFeedbackIsis());
  1411.             }
  1412.             return max($dataFeedback);
  1413.         }
  1414.         foreach ($MFeedback as $key => $value) {
  1415.             $qb $isiRepo->createQueryBuilder('t')
  1416.                 ->andWhere("t.feedback_id = :feedback_id")->setParameter('feedback_id'$value->getId());
  1417.             if ($get["q" $value->getId()]) {
  1418.                 $search strtolower($get["q" $value->getId()]);
  1419.                 $qb->andWhere("lower(t.isi) like :isi")->setParameter('isi'"%" $search "%");
  1420.             }
  1421.             $qb->setMaxResults($limit)->setFirstResult($page);
  1422.             $qb->addOrderBy('t.id''desc');
  1423.             $feedbackIsi $qb->getQuery()->getResult();
  1424.             // $feedbackIsi = $this->feedbackIsi->findBy(['feedback_id' => $value->getId()], ['id' => 'desc'], $limit, $page);
  1425.             $dataFeedback[$value->getId()] = [];
  1426.             foreach ($feedbackIsi as $isi) {
  1427.                 if ($cetak) {
  1428.                     $isinya $isi->getIsi();
  1429.                 } else {
  1430.                     if ($value->getTipe() == 4) {
  1431.                         $isinya '';
  1432.                         for ($i 1$i <= intval($isi->getIsi()); $i++) {
  1433.                             $isix '<i class="fa fa-star text-warning"></i>';
  1434.                             $isinya .= $isix;
  1435.                         }
  1436.                         if (intval($isi->getIsi()) != 5) {
  1437.                             for ($i 1$i <= $isi->getIsi(); $i++) {
  1438.                                 $isix '<i class="fa fa-star"></i>';
  1439.                                 $isinya .= $isix;
  1440.                             }
  1441.                         }
  1442.                     } else {
  1443.                         $isinya $isi->getIsi();
  1444.                     }
  1445.                 }
  1446.                 $dataFeedback[$value->getId()][] = $isinya;
  1447.             }
  1448.         }
  1449.         $map array_map('count'$dataFeedback);
  1450.         arsort($map);
  1451.         $keyMax array_keys($map)[0];
  1452.         $result = [];
  1453.         foreach ($dataFeedback as $data) {
  1454.             foreach ($dataFeedback[$keyMax] as $k => $v) {
  1455.                 $result[$k][] = (isset($data[$k])) ? $data[$k] : '';
  1456.             }
  1457.         }
  1458.         return $result;
  1459.     }
  1460.     public function getTipeFeedback()
  1461.     {
  1462.         $tipe = ['1' => 'Input''2' => 'Select''3' => 'Text Area''4' => 'Rating'];
  1463.         return $tipe;
  1464.     }
  1465.     public function getTipeInfoGrafik()
  1466.     {
  1467.         $tipe = ['1' => 'Infografik''2' => 'E-Book'];
  1468.         return $tipe;
  1469.     }
  1470.     public function getIp()
  1471.     {
  1472.         return ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') ? $_SERVER['REMOTE_ADDR'] : $_SERVER['HTTP_X_FORWARDED_FOR'];
  1473.     }
  1474.     public function countJumlahFeedback()
  1475.     {
  1476.         $connection $this->getDoctrine()->getConnection();
  1477.         // $connection = DriverManager::getConnection($this->connParams);
  1478.         $today date("Y-m-d");
  1479.         $mulai date("Y-m-d") . " 00:00:01";
  1480.         $sampai date("Y-m-d") . " 23:59:59";
  1481.         $ip_user self::getIp();
  1482.         $sql "SELECT id, ip_user, created_at as tanggal FROM feedback WHERE created_at >= '" $mulai "'" " AND created_at <= '" $sampai "'" "  AND ip_user = '" $ip_user "'";
  1483.         $stmt $connection->query($sql);
  1484.         $result $stmt->fetchAllAssociative();
  1485.         return count($result);
  1486.     }
  1487.     public function countJumlahDownload($reffid null)
  1488.     {
  1489.         $connection $this->getDoctrine()->getConnection();
  1490.         // $connection = DriverManager::getConnection($this->connParams);
  1491.         $today date("Y-m-d");
  1492.         $mulai date("Y-m-d") . " 00:00:01";
  1493.         $sampai date("Y-m-d") . " 23:59:59";
  1494.         $ip_user self::getIp();
  1495.         if ($reffid) {
  1496.             $sql "SELECT id, ip_user, created_at as tanggal FROM tdownload WHERE created_at >= '" $mulai "'" " AND created_at <= '" $sampai "'" "  AND reff_id = '" $reffid "'" " AND ip_user = '" $ip_user "'";
  1497.         } else {
  1498.             $sql "SELECT id, ip_user, created_at as tanggal FROM tdownload WHERE created_at >= '" $mulai "'" " AND created_at <= '" $sampai "'" "  AND ip_user = '" $ip_user "'";
  1499.         }
  1500.         $stmt $connection->query($sql);
  1501.         $result $stmt->fetchAllAssociative();
  1502.         return count($result);
  1503.     }
  1504.     public function mapArray($obj)
  1505.     {
  1506.         $mKotaRepository $this->getDoctrine()->getRepository(MKota::class);
  1507.         $data = array();
  1508.         $count 0;
  1509.         foreach ($obj as $key => $arr) {
  1510.             $data[$arr['kota_id']] = $arr['count'];
  1511.         }
  1512.         return $data;
  1513.     }
  1514.     public function getGrafikPeta($id$cols$axisX$p_order)
  1515.     {
  1516.         $period explode("#"$p_order);
  1517.         // $periode = ($period[1] == 'All') ? $period[0] :  $period[0].' '.$period[1];
  1518.         $connection $this->getDoctrine()->getConnection();
  1519.         // print_r($periode); exit;
  1520.         $tbl_func "CREATE EXTENSION IF NOT EXISTS tablefunc; ";
  1521.         $stmt $connection->prepare($tbl_func);
  1522.         $stmt->execute();
  1523.         $publikasi_repo $this->getDoctrine()->getRepository(TPublikasi::class);
  1524.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  1525.         $variabel $variabel_repo->findBy(['pub' => $id], ['id' => 'asc']);
  1526.         $publikasi $publikasi_repo->find($id);
  1527.         if ($period[1] == 'All') {
  1528.             $opt_periode $this->getPeriodeName($publikasi->getPeriode()->getId());
  1529.             foreach ($opt_periode as $k => $v) {
  1530.                 if ($period[0] == $v) {
  1531.                     $periodex $k;
  1532.                 }
  1533.             }
  1534.         } else {
  1535.             $periodex $period[0] . ' ' $period[1];
  1536.         }
  1537.         //    dump($variabel); exit;
  1538.         $as_columns "";
  1539.         foreach ($variabel as $var) {
  1540.             $as_columns .= ", " $var->getNama() . " varchar";
  1541.         }
  1542.         $selCols = [];
  1543.         foreach ($cols as $col) {
  1544.             $selCols[] = "ct." $col->getNama();
  1545.         }
  1546.         $selCols implode(", "$selCols);
  1547.         $sql "SELECT $selCols, ct.periode_order, ct.periode_update,$axisX
  1548.                 FROM crosstab('select a.row_id, b.id, a.isi 
  1549.                 from t_data a 
  1550.                 join t_variabel b 
  1551.                 on a.variabel_id = b.id 
  1552.                 where a.pub_id = " $id;
  1553.         $sql .= " order by 1, 2')
  1554.                 AS ct (row_id int" $as_columns ") where 1=1";
  1555.         if ($period[0] == 'All' && $period[1] == 'All') {
  1556.         } else {
  1557.             if ($period[0] == 'All' && $period[1] != 'All') {
  1558.                 $sql .= " and ct.periode_update ilike '%$period[1]%'";
  1559.             } else if ($period[1] == 'All') {
  1560.                 $sql .= " and ct.periode_update ilike '%$period[0]%'";
  1561.                 // $sql .= " and ct.periode_order = '$periodex'";
  1562.             } else {
  1563.                 $sql .= " and ct.periode_update = '$periodex'";
  1564.             }
  1565.         }
  1566.         $stmt $connection->prepare($sql);
  1567.         $stmt->execute();
  1568.         $result $stmt->fetchAll();
  1569.         return $result;
  1570.     }
  1571.     public function getBulan()
  1572.     {
  1573.         return array('01' => 'Januari''02' => 'Februari''03' => 'Maret''04' => 'April''05' => 'Mei''06' => 'Juni''07' => 'Juli''08' => 'Agustus''09' => 'September''10' => 'Oktober''11' => 'Nopember''12' => 'Desember');
  1574.     }
  1575.     public function getDataTableMetaData($id$limit$page$get$state null$row null)
  1576.     {
  1577.         $connection $this->getDoctrine()->getConnection();
  1578.         // $connection = DriverManager::getConnection($this->connParams);
  1579.         $meta_data_repo $this->getDoctrine()->getRepository(TMetaData::class);
  1580.         $variabel_repo $this->getDoctrine()->getRepository(TVariabel::class);
  1581.         $variabel $variabel_repo->findBy(['reff_id' => $id'reff_kode' => 'METADATA'], ['id' => 'asc']);
  1582.         $meta_data $meta_data_repo->findOneBy(['id' => $id]);
  1583.         $sql "SELECT * FROM " $meta_data->getNamaTabel();
  1584.         // if ($row) {
  1585.         //     $sql .= " and row_id = " . $row;
  1586.         // }
  1587.         if ($get) {
  1588.             foreach ($variabel as $var) {
  1589.                 if ($value $get[$var->getNama()]) {
  1590.                     $sql .= " WHERE " $var->getNama() . "::text ILIKE '%" $value "%'";
  1591.                 }
  1592.             }
  1593.         }
  1594.         if ($limit) {
  1595.             $sql .= " LIMIT " $limit;
  1596.         }
  1597.         if ($page) {
  1598.             $sql .= " OFFSET " $page;
  1599.         }
  1600.         $stmt $connection->prepare($sql);
  1601.         $stmt->execute();
  1602.         $result = array();
  1603.         foreach ($stmt->fetchAll() as $data) {
  1604.             $temp = array();
  1605.             foreach ($variabel as $var) {
  1606.                 $temp[] = $data[$var->getNama()];
  1607.             }
  1608.             $result[] = $temp;
  1609.         }
  1610.         // print_r($result);exit;
  1611.         return $result;
  1612.     }
  1613.     public function getCardDashboard($tabel$tahap$count$kolom_periode$tanggal_awal$tanggal_akhir$tipe_tahun$tahun$sumber_dana)
  1614.     {
  1615.         $connection $this->getDoctrine()->getConnection();
  1616.         $filter = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.$kolom_periode BETWEEN '$tanggal_awal' AND '$tanggal_akhir'";
  1617.         if ($count) {
  1618.             //     $sql = "SELECT count(*) from $tabel t WHERE  t.tahun_anggaran IS NOT NULL
  1619.             // AND t.sumber_dana IS NOT NULL  AND t.$kolom_periode BETWEEN '$tanggal_awal' AND '$tanggal_akhir'";
  1620.             $sql "SELECT count(*) from $tabel t WHERE  $filter";
  1621.             if ($tahap == 'tahap_pembuatan_paket') {
  1622.                 $sql .= " AND  t.kategori_tahap='Tahap pembuatan paket'";
  1623.             } else if ($tahap == 'tahap_penyusunan_hps') {
  1624.                 $sql .= " AND  t.kategori_tahap='Tahap penyusunan hps'";
  1625.             } else if ($tahap == 'tahap_pemilihan_penyedia') {
  1626.                 $sql .= " AND  t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  1627.             } else if ($tahap == 'dalam_proses') {
  1628.                 $sql .= " AND  t.kategori_tahap='Dalam proses (pemilihan penyedia)'";
  1629.             } else if ($tahap == 'selesai') {
  1630.                 $sql .= " AND  t.kategori_tahap='Selesai (pemilihan penyedia)'";
  1631.             }
  1632.         } else {
  1633.             //     $sql = "SELECT * FROM $tabel t  WHERE t.tahun_anggaran IS NOT NULL
  1634.             // AND t.sumber_dana IS NOT NULL  AND t.$kolom_periode BETWEEN '$tanggal_awal' AND '$tanggal_akhir'";
  1635.             $sql "SELECT * FROM $tabel t  WHERE $filter";
  1636.             if ($tahap == 'tahap_pembuatan_paket') {
  1637.                 $sql .= " AND  t.kategori_tahap='Tahap pembuatan paket'";
  1638.             } else if ($tahap == 'tahap_penyusunan_hps') {
  1639.                 $sql .= " AND  t.kategori_tahap='Tahap penyusunan hps'";
  1640.             } else if ($tahap == 'tahap_pemilihan_penyedia') {
  1641.                 $sql .= " AND  t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  1642.             } else if ($tahap == 'dalam_proses') {
  1643.                 $sql .= " AND  t.kategori_tahap='Dalam proses (pemilihan penyedia)'";
  1644.             } else if ($tahap == 'selesai') {
  1645.                 $sql .= " AND  t.kategori_tahap='Selesai (pemilihan penyedia)'";
  1646.             }
  1647.         }
  1648.         $stmt $connection->prepare($sql);
  1649.         $stmt->execute();
  1650.         $result $stmt->fetchAll();
  1651.         return $result;
  1652.     }
  1653.     public function getDashboard($tabel$tipe,  $tahap null$count)
  1654.     {
  1655.         $connection $this->getDoctrine()->getConnection();
  1656.         if ($count) {
  1657.             $sql "SELECT count(no_pr) from $tabel t WHERE t.kategori_tahap !=''";
  1658.             if ($tipe == 'jumlah_pk') {
  1659.                 $sql .= " AND t.status_pr IN( 'approve','submit' )";
  1660.             }
  1661.             if ($tahap) {
  1662.                 if ($tahap == 'tahap_pembuatan_paket') {
  1663.                     $sql .= " AND  t.kategori_tahap='Tahap pembuatan paket'";
  1664.                 } else if ($tahap == 'tahap_penyusunan_hps') {
  1665.                     $sql .= " AND  t.kategori_tahap='Tahap penyusunan hps'";
  1666.                 } else if ($tahap == 'tahap_pemilihan_penyedia') {
  1667.                     $sql .= " AND  t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  1668.                 } else if ($tahap == 'dalam_proses') {
  1669.                     $sql .= " AND  t.kategori_tahap='Dalam proses (pemilihan penyedia)'";
  1670.                 } else if ($tahap == 'selesai') {
  1671.                     $sql .= " AND  t.kategori_tahap='Selesai (pemilihan penyedia)'";
  1672.                 }
  1673.             }
  1674.         } else {
  1675.             $sql "SELECT * FROM $tabel t  WHERE t.kategori_tahap !=''";
  1676.             if ($tahap == 'tahap_pembuatan_paket') {
  1677.                 $sql .= " AND  t.kategori_tahap='Tahap pembuatan paket'";
  1678.             } else if ($tahap == 'tahap_penyusunan_hps') {
  1679.                 $sql .= " AND  t.kategori_tahap='Tahap penyusunan hps'";
  1680.             } else if ($tahap == 'tahap_pemilihan_penyedia') {
  1681.                 $sql .= " AND  t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  1682.             } else if ($tahap == 'dalam_proses') {
  1683.                 $sql .= " AND  t.kategori_tahap='Dalam proses (pemilihan penyedia)'";
  1684.             } else if ($tahap == 'selesai') {
  1685.                 $sql .= " AND  t.kategori_tahap='Selesai (pemilihan penyedia)'";
  1686.             }
  1687.         }
  1688.         $stmt $connection->prepare($sql);
  1689.         $stmt->execute();
  1690.         $result $stmt->fetchAll();
  1691.         return $result;
  1692.     }
  1693.     public function getTabelGrafik($grafik_id$tipe$tahun)
  1694.     {
  1695.         $connection $this->getDoctrine()->getConnection();
  1696.         $grafik_repo $this->getDoctrine()->getRepository(TGrafik::class);
  1697.         $grafik $grafik_repo->find($grafik_id);
  1698.         $meta_repo $this->getDoctrine()->getRepository(TMetaData::class);
  1699.         $meta_reop $meta_repo->findOneBy(['id' => $grafik->getReffId()]);
  1700.         $table $grafik->getTabel(); // Nama tabel
  1701.         $sumbu_x $grafik->getAxisx(); // Misalnya: plant
  1702.         $sumbu_y $grafik->getAxisYIds(); // Misalnya: ['count_days', 'nilai_investasi']
  1703.         $operation $grafik->getOperation();
  1704.         $filter $grafik->getFilter();
  1705.         $res = [];
  1706.         $where_clauses = [];
  1707.         $t = ($sumbu_x == 'kategori_plant') ? 't.' null;
  1708.         foreach ($sumbu_y as $value) {
  1709.             if ($operation == 'SUM') {
  1710.                 $res[] = "$operation(CASE WHEN $t$value IS NOT NULL THEN $t$value ELSE 0 END) AS $value"// atau AVG($value) sesuai kebutuhan
  1711.             } else if ($operation == 'COUNT') {
  1712.                 // $res[] = "$operation(CASE WHEN $t$value IS NOT NULL THEN 1 END) AS $value"; 
  1713.                 $res[] = "COUNT(DISTINCT CASE WHEN $t$value IS NOT NULL THEN $t$value END) AS $value";
  1714.             } else {
  1715.                 $res[] = "$operation($t$value) AS $t$value";
  1716.             }
  1717.             // $where_clauses[] = "$value IS NOT NULL";
  1718.         }
  1719.         // Gabungkan bagian SELECT dan WHERE
  1720.         if ($filter) {
  1721.             $filter implode(" AND "$filter);
  1722.             $filter " AND $filter";
  1723.         } else {
  1724.             $filter null;
  1725.         }
  1726.         $y implode(", "$res);
  1727.         // $where = implode(" AND ", $where_clauses);
  1728.         // $sql = "SELECT $sumbu_x, $y FROM $table WHERE $where GROUP BY $sumbu_x";
  1729.         if ($sumbu_x == 'kategori_plant') {
  1730.             // $sql = "SELECT m_plant.kategori as plant, $y FROM  $table t JOIN  m_plant ON t.plant = m_plant.nama GROUP BY m_plant.kategori;";
  1731.             //left join
  1732.             $sql "SELECT m_plant.kategori as plant, $y FROM m_plant LEFT JOIN  $table t  ON UPPER(t.plant) = UPPER(m_plant.nama) GROUP BY m_plant.kategori;";
  1733.         } elseif ($sumbu_x == 'all') {
  1734.             // $sql = "SELECT m_plant.kategori as plant, $y FROM  $table t JOIN  m_plant ON t.plant = m_plant.nama GROUP BY m_plant.kategori;";
  1735.             //left join
  1736.             $sql "SELECT $y FROM $table WHERE tahun_anggaran = '$tahun' ";
  1737.         } else {
  1738.             $sql "SELECT $sumbu_x$y FROM $table WHERE  $sumbu_x IS NOT NULL AND tahun_anggaran = '$tahun' AND $sumbu_x != '' $filter GROUP BY $sumbu_x";
  1739.         }
  1740.         // print_r($filter); exit;
  1741.         $stmt $connection->prepare($sql);
  1742.         $stmt->execute();
  1743.         $result $stmt->fetchAll();
  1744.         // print_r($result); exit;
  1745.         if ($tipe == 'chart') {
  1746.             $columns = [];
  1747.             $seriesData = [];
  1748.             // Inisialisasi array data kosong untuk tiap Y
  1749.             $seriesTemplate = [];
  1750.             foreach ($sumbu_y as $y) {
  1751.                 $seriesTemplate[$y] = [];
  1752.             }
  1753.             // Loop data SQL
  1754.             foreach ($result as $row) {
  1755.                 if ($sumbu_x != 'all') {
  1756.                     $columns[] = $row[($sumbu_x == 'kategori_plant') ? 'plant' $sumbu_x];
  1757.                 }
  1758.                 foreach ($sumbu_y as $y) {
  1759.                     $seriesTemplate[$y][] = (float)$row[$y];
  1760.                 }
  1761.             }
  1762.             // Susun dalam format Highcharts
  1763.             $series = [];
  1764.             foreach ($seriesTemplate as $name => $values) {
  1765.                 $series[] = [
  1766.                     'name' => $name,
  1767.                     'data' => $values
  1768.                 ];
  1769.             }
  1770.             // Return JSON (Symfony style)
  1771.             return new JsonResponse([
  1772.                 'columns' => $columns,
  1773.                 'datas' => $series
  1774.             ]);
  1775.         } else {
  1776.             $request $this->get('request_stack')->getCurrentRequest();
  1777.             $draw = (int) $request->request->get('draw'1);
  1778.             $start = (int) $request->request->get('start'0);
  1779.             $length = (int) $request->request->get('length'10);
  1780.             $search $request->request->get('search')['value'] ?? '';
  1781.             // Mapping kolom
  1782.             $columns array_merge([($sumbu_x == 'kategori_plant') ? 'plant' $sumbu_x], $sumbu_y);
  1783.             // Total data sebelum filtering
  1784.             $totalData count($result);
  1785.             // Filtering
  1786.             if ($search !== '') {
  1787.                 $result array_filter($result, function ($row) use ($search) {
  1788.                     foreach ($row as $value) {
  1789.                         if (stripos((string)$value$search) !== false) return true;
  1790.                     }
  1791.                     return false;
  1792.                 });
  1793.             }
  1794.             // Total data setelah filtering
  1795.             $totalFiltered count($result);
  1796.             // Slice/pagination
  1797.             $data array_slice($result$start$length);
  1798.             // Return JSON sesuai format DataTables
  1799.             return new JsonResponse([
  1800.                 'draw' => $draw,
  1801.                 'recordsTotal' => $totalData,
  1802.                 'recordsFiltered' => $totalFiltered,
  1803.                 'data' => array_values($data),
  1804.             ]);
  1805.         }
  1806.     }
  1807.     public function getKolomTabel($table)
  1808.     {
  1809.         $connection $this->getDoctrine()->getConnection();
  1810.         $query $connection->prepare("select column_name from information_schema.columns WHERE table_name='$table'");
  1811.         $query->execute();
  1812.         $hasil $query->fetchAll();
  1813.         return $hasil;
  1814.     }
  1815.     public function getTabelReport($group)
  1816.     {
  1817.         $connection $this->getDoctrine()->getConnection();
  1818.         // $query = $connection->prepare("select column_name from information_schema.columns WHERE table_name='$table'");
  1819.         $query $connection->prepare("WITH sumber_dana_list AS (
  1820.         SELECT DISTINCT sumber_dana FROM t_weekly_explore_report  UNION SELECT 'investasi' UNION SELECT 'eksploitasi'),
  1821.         -- 2. Daftar kategori_plant dari m_plant
  1822.         kategori_list AS (
  1823.         SELECT DISTINCT $group FROM m_plant
  1824.         ),
  1825.         -- 3. Buat semua kombinasi sumber_dana × kategori
  1826.         kombinasi AS (
  1827.         SELECT s.sumber_dana, k.$group
  1828.         FROM sumber_dana_list s
  1829.         CROSS JOIN kategori_list k
  1830.         ),
  1831.         -- 4. Ambil data riil dengan join m_plant dan t_weekly_explore_report
  1832.         data_riil AS (
  1833.         SELECT 
  1834.             t.sumber_dana,
  1835.             mp.$group,
  1836.             t.anggaran,
  1837.             t.hps,
  1838.             t.nilai_akhir,
  1839.             t.tahap_pembuatan_paket,
  1840.             t.tahap_penyusunan_hps,
  1841.             t.tahap_pemilihan_penyedia,
  1842.             t.selesai,
  1843.             t.dalam_proses,
  1844.             t.rata_rata_countdays_proses,
  1845.             t.nilai_paket_tahap_penyusunan_penyedia,
  1846.             t.nilai_paket_tahap_penysunan_hps
  1847.         FROM 
  1848.             t_weekly_explore_report t
  1849.         JOIN 
  1850.             m_plant mp ON UPPER(t.plant) = UPPER(mp.nama)
  1851.         WHERE 
  1852.             t.sumber_dana IS NOT NULL
  1853.         )
  1854.         -- 5. LEFT JOIN kombinasi dengan data riil
  1855.         SELECT 
  1856.         k.sumber_dana,
  1857.         k.$group,
  1858.         SUM(CASE WHEN (d.anggaran IS NOT NULL) THEN d.anggaran ELSE 0 END) AS anggaran,
  1859.         SUM(CASE WHEN (d.hps IS NOT NULL) THEN d.hps ELSE 0 END) AS hps,
  1860.         SUM(CASE WHEN (d.nilai_akhir IS NOT NULL) THEN d.nilai_akhir ELSE 0 END) AS nilai_akhir,
  1861.         COUNT(CASE WHEN d.tahap_pembuatan_paket IS NOT NULL THEN 1 END) AS tahap_pembuatan_paket,
  1862.         COUNT(CASE WHEN d.tahap_penyusunan_hps IS NOT NULL THEN 1 END) AS tahap_penyusunan_hps,
  1863.         COUNT(CASE WHEN d.tahap_pemilihan_penyedia IS NOT NULL THEN 1 END) AS tahap_pemilihan_penyedia,
  1864.         COUNT(CASE WHEN d.selesai IS NOT NULL THEN 1 END) AS selesai,
  1865.         COUNT(CASE WHEN d.dalam_proses IS NOT NULL THEN 1 END) AS dalam_proses,
  1866.         COUNT(CASE WHEN d.rata_rata_countdays_proses IS NOT NULL THEN 1 END) AS rata_rata_countdays_proses,
  1867.         SUM(CASE WHEN (d.nilai_paket_tahap_penyusunan_penyedia IS NOT NULL) THEN d.nilai_paket_tahap_penyusunan_penyedia ELSE 0 END) AS nilai_paket_tahap_penyusunan_penyedia,
  1868.         SUM(CASE WHEN (d.nilai_paket_tahap_penysunan_hps IS NOT NULL) THEN d.nilai_paket_tahap_penysunan_hps ELSE 0 END) AS nilai_paket_tahap_penysunan_hps
  1869.         -- AVG(d.rata_rata_countdays_proses) AS rata_rata_proses
  1870.         FROM 
  1871.         kombinasi k
  1872.         LEFT JOIN 
  1873.         data_riil d 
  1874.             ON d.sumber_dana = k.sumber_dana 
  1875.             AND d.$group = k.$group
  1876.             WHERE k.sumber_dana IS NOT NULL
  1877.         GROUP BY 
  1878.         k.sumber_dana, k.$group
  1879.         ORDER BY 
  1880.         k.sumber_dana, k.$group;");
  1881.         $query->execute();
  1882.         $hasil $query->fetchAll();
  1883.         return $hasil;
  1884.     }
  1885.     public function getTabelLaporan($tabel$group$kolom_periode$tgl_awal$tgl_akhir$tipe_tahun$tahun$sumber_dana$kategori_plant null$realisasi null)
  1886.     {
  1887.         $connection $this->getDoctrine()->getConnection();
  1888.         // $query = $connection->prepare("select column_name from information_schema.columns WHERE table_name='$table'");
  1889.         $filter_periode_pr = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_verifikasi_pr BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  1890.         if ($realisasi) {
  1891.             $filter_periode_pk = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun' AND t.kategori_tahap = 'Selesai (pemilihan penyedia)'"  "t.tgl_submit_pk_ke_hps BETWEEN '$tgl_awal' AND '$tgl_akhir' AND t.kategori_tahap = 'Selesai (pemilihan penyedia)'";
  1892.         } else {
  1893.             $filter_periode_pk = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_submit_pk_ke_hps BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  1894.         }
  1895.         $filter_periode_pp = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_approval_sppbj BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  1896.         $filter_periode_submit_ke_pengadaan = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_submit_ke_pengadaan BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  1897.         $filter_periode = ($tipe_tahun == 1) ? " WHERE t.tahun_anggaran = '$tahun'" "";
  1898.         $filter_periode_and = ($tipe_tahun == 1) ? " AND t.tahun_anggaran = '$tahun'" "";
  1899.         if ($kategori_plant) {
  1900.             $filter_kategori_plant_kombinasi " WHERE kategori_plant IN ($kategori_plant)";
  1901.             $filter_kategori_plant " AND t.kategori_plant IN ($kategori_plant)";
  1902.         } else {
  1903.             $filter_kategori_plant_kombinasi null;
  1904.             $filter_kategori_plant null;
  1905.         }
  1906.         $query $connection->prepare("WITH 
  1907.     kombinasi AS (
  1908.         SELECT
  1909.             s.sumber_dana,
  1910.             p.$group
  1911.         FROM
  1912.             (SELECT DISTINCT $group FROM $tabel $filter_kategori_plant_kombinasi) p 
  1913.         CROSS JOIN
  1914.             (SELECT UNNEST(ARRAY['investasi', 'eksploitasi']) AS sumber_dana) s
  1915.     ),
  1916.     agregasi AS (
  1917.         SELECT
  1918.             t.sumber_dana,
  1919.             t.$group,
  1920.             -- COUNT(DISTINCT t.no_pr) FILTER (WHERE $filter_periode_pr) AS total_pr,
  1921.             -- COUNT(DISTINCT t.no_pk) FILTER (WHERE $filter_periode_pk) AS total_pk,
  1922.             -- COUNT(DISTINCT t.no_pp) FILTER (WHERE $filter_periode_pp) AS total_pp,
  1923.             COUNT(DISTINCT t.no_pr) FILTER (WHERE $filter_periode_pr AND t.status_pr IN ('approve','submit')) AS total_pr,
  1924.             COUNT(DISTINCT t.no_pk) FILTER (WHERE $filter_periode_pk  AND t.status_pk IN ('draft','assign','pengadaan','submit')) AS total_pk,
  1925.             COUNT(DISTINCT t.no_pp) FILTER (WHERE $filter_periode_pp AND t.status_pp_ IN ('draft','laksanakan','finish') ) AS total_pp,
  1926.             COUNT(DISTINCT t.no_sppbj) FILTER (WHERE $filter_periode_pp AND t.kategori_tahap = 'Selesai (pemilihan penyedia)' AND t.no_sppbj IS NOT NULL AND t.no_sppbj != '') AS total_sppbj,
  1927.             COUNT(DISTINCT NULLIF(UPPER(TRIM(t.vendor_pemenang)), '')) FILTER (WHERE $filter_periode_pp AND t.kategori_tahap = 'Selesai (pemilihan penyedia)') AS total_vendor_pemenang,
  1928.             
  1929.             SUM(CASE WHEN $filter_periode_pr
  1930.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  1931.                      ELSE 0 END) AS total_nilai,
  1932.             SUM(CASE WHEN t.kategori_tahap = 'Selesai (pemilihan penyedia)' 
  1933.                      AND $filter_periode_pr
  1934.                      THEN NULLIF(NULLIF(btrim(t.nilai_akhir_hasil::text), ''), '-')::numeric 
  1935.                      ELSE 0 END) AS total_nilai_akhir,
  1936.             SUM(CASE WHEN t.kategori_tahap = 'Selesai (pemilihan penyedia)' 
  1937.                      AND  $filter_periode_pr
  1938.                      THEN NULLIF(NULLIF(btrim(t.anggaran_hasil::text), ''), '-')::numeric 
  1939.                      ELSE 0 END) AS total_anggaran,
  1940.             SUM(CASE WHEN t.kategori_tahap = 'Selesai (pemilihan penyedia)'
  1941.                      AND $filter_periode_pr
  1942.                      THEN NULLIF(NULLIF(btrim(t.hps_hasil::text), ''), '-')::numeric 
  1943.                      ELSE 0 END) AS total_hps,
  1944.             SUM(CASE WHEN t.kategori_tahap = 'Tahap penyusunan hps'
  1945.                      AND $filter_periode_pr
  1946.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  1947.                      ELSE 0 END) AS nilai_penyusunan_hps,
  1948.             SUM(CASE WHEN t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)', 'Selesai (pemilihan penyedia)')
  1949.                      AND $filter_periode_submit_ke_pengadaan
  1950.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  1951.                      ELSE 0 END) AS nilai_pemilihan_penyedia,
  1952.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Tahap pembuatan paket' AND $filter_periode_pr) AS tahap_pembuatan_paket,
  1953.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Tahap penyusunan hps' AND $filter_periode_pr) AS tahap_penyusunan_hps,
  1954.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Dalam proses (pemilihan penyedia)' AND $filter_periode_submit_ke_pengadaan) AS dalam_proses,
  1955.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Selesai (pemilihan penyedia)' AND $filter_periode_submit_ke_pengadaan) AS selesai
  1956.         FROM $tabel t
  1957.         WHERE t.tahun_anggaran IS NOT NULL $filter_kategori_plant
  1958.           AND t.sumber_dana IS NOT NULL
  1959.         GROUP BY t.sumber_dana, t.$group
  1960.     ),
  1961.     hari_kerja AS (
  1962.         SELECT
  1963.             sumber_dana,
  1964.             $group,
  1965.             COUNT(*) AS total_hari_kerja
  1966.         FROM (
  1967.             SELECT
  1968.                 t.sumber_dana,
  1969.                 t.$group,
  1970.                 generate_series(
  1971.                     t.tgl_submit_ke_pengadaan::date,
  1972.                     CURRENT_DATE,
  1973.                     interval '1 day'
  1974.                 )::date AS tanggal
  1975.             FROM $tabel t 
  1976.             WHERE t.kategori_tahap = 'Dalam proses (pemilihan penyedia)'
  1977.         ) tanggalan
  1978.         LEFT JOIN m_libur l ON tanggalan.tanggal = l.tanggal::date
  1979.         WHERE EXTRACT(DOW FROM tanggalan.tanggal) NOT IN (0, 6)
  1980.           AND l.tanggal IS NULL
  1981.         GROUP BY sumber_dana, $group
  1982.     )
  1983. SELECT
  1984.     k.sumber_dana,
  1985.     k.$group,
  1986.     COALESCE(a.total_vendor_pemenang, 0) AS total_vendor_pemenang,
  1987.     COALESCE(a.total_pk, 0) AS total_pk,
  1988.     COALESCE(a.total_pr, 0) AS total_pr,
  1989.     COALESCE(a.total_pp, 0) AS total_pp,
  1990.     COALESCE(a.total_nilai, 0) AS total_nilai,
  1991.     COALESCE(a.total_nilai_akhir, 0) AS total_nilai_akhir,
  1992.     COALESCE(a.total_anggaran, 0) AS total_anggaran,
  1993.     COALESCE(a.total_hps, 0) AS total_hps,
  1994.     COALESCE(a.nilai_penyusunan_hps, 0) AS nilai_penyusunan_hps,
  1995.     COALESCE(a.nilai_pemilihan_penyedia, 0) AS nilai_pemilihan_penyedia,
  1996.     COALESCE(a.tahap_pembuatan_paket, 0) AS tahap_pembuatan_paket,
  1997.     COALESCE(a.tahap_penyusunan_hps, 0) AS tahap_penyusunan_hps,
  1998.     COALESCE(a.dalam_proses, 0) AS dalam_proses,
  1999.     COALESCE(a.selesai, 0) AS selesai,
  2000.     COALESCE(h.total_hari_kerja, 0) AS total_hari_kerja
  2001. FROM kombinasi k
  2002. LEFT JOIN agregasi a 
  2003.     ON a.sumber_dana = k.sumber_dana 
  2004.    AND a.$group = k.$group
  2005. LEFT JOIN hari_kerja h
  2006.     ON h.sumber_dana = k.sumber_dana
  2007.    AND h.$group = k.$group
  2008. ORDER BY k.sumber_dana, k.$group;");
  2009.         $query->execute();
  2010.         $hasil $query->fetchAll();
  2011.         return $hasil;
  2012.     }
  2013.     public function getLaporanUnGroup($tabel$tgl_awal$tgl_akhir$tipe_tahun$tahun)
  2014.     {
  2015.         $connection $this->getDoctrine()->getConnection();
  2016.         // $query = $connection->prepare("select column_name from information_schema.columns WHERE table_name='$table'");
  2017.         $filter_periode_pk = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_submit_pk_ke_hps BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2018.         $filter_periode_pr = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_verifikasi_pr BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2019.         $filter_periode_pp = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_approval_sppbj BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2020.         $filter_periode_submit_ke_pengadaan = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.tgl_submit_ke_pengadaan BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2021.         $query $connection->prepare("SELECT
  2022.             -- COUNT(DISTINCT t.no_pr) FILTER (WHERE $filter_periode_pr) AS total_pr,
  2023.             -- COUNT(DISTINCT t.no_pk) FILTER (WHERE $filter_periode_pk) AS total_pk,
  2024.             -- COUNT(DISTINCT t.no_pp) FILTER (WHERE $filter_periode_pp) AS total_pp,
  2025.             COUNT(DISTINCT t.no_pr) FILTER (WHERE $filter_periode_pr AND t.status_pr IN ('approve','submit')) AS total_pr,
  2026.             COUNT(DISTINCT t.no_pk) FILTER (WHERE $filter_periode_pk  AND t.status_pk IN ('draft','assign','pengadaan','submit')) AS total_pk,
  2027.             COUNT(DISTINCT t.no_pp) FILTER (WHERE $filter_periode_pp AND t.status_pp_ IN ('draft','laksanakan','finish') ) AS total_pp,
  2028.             COUNT(DISTINCT t.no_sppbj) FILTER (WHERE $filter_periode_pp AND t.kategori_tahap = 'Selesai (pemilihan penyedia)' AND t.no_sppbj IS NOT NULL AND t.no_sppbj != '') AS total_sppbj,
  2029.             COUNT(DISTINCT NULLIF(UPPER(TRIM(t.vendor_pemenang)), '')) FILTER (WHERE $filter_periode_pp AND t.kategori_tahap = 'Selesai (pemilihan penyedia)') AS total_vendor_pemenang,
  2030.             
  2031.             SUM(CASE WHEN $filter_periode_pr
  2032.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  2033.                      ELSE 0 END) AS total_nilai,
  2034.             SUM(CASE WHEN t.kategori_tahap = 'Selesai (pemilihan penyedia)' 
  2035.                      AND $filter_periode_pr
  2036.                      THEN NULLIF(NULLIF(btrim(t.nilai_akhir_hasil::text), ''), '-')::numeric 
  2037.                      ELSE 0 END) AS total_nilai_akhir,
  2038.             SUM(CASE WHEN $filter_periode_pr
  2039.                      THEN NULLIF(NULLIF(btrim(t.anggaran_hasil::text), ''), '-')::numeric 
  2040.                      ELSE 0 END) AS total_anggaran,
  2041.             SUM(CASE WHEN $filter_periode_pr
  2042.                      THEN NULLIF(NULLIF(btrim(t.hps_hasil::text), ''), '-')::numeric 
  2043.                      ELSE 0 END) AS total_hps,
  2044.             SUM(CASE WHEN t.kategori_tahap = 'Tahap penyusunan hps'
  2045.                      AND $filter_periode_pr
  2046.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  2047.                      ELSE 0 END) AS nilai_penyusunan_hps,
  2048.             SUM(CASE WHEN t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)', 'Selesai (pemilihan penyedia)')
  2049.                      AND $filter_periode_submit_ke_pengadaan
  2050.                      THEN NULLIF(NULLIF(btrim(t.total_nilai_hasil::text), ''), '-')::numeric 
  2051.                      ELSE 0 END) AS nilai_pemilihan_penyedia,
  2052.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Tahap pembuatan paket' AND $filter_periode_pr) AS tahap_pembuatan_paket,
  2053.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Tahap penyusunan hps' AND $filter_periode_pr) AS tahap_penyusunan_hps,
  2054.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Dalam proses (pemilihan penyedia)' AND $filter_periode_submit_ke_pengadaan) AS dalam_proses,
  2055.             COUNT(DISTINCT t.no_pk) FILTER (WHERE t.kategori_tahap = 'Selesai (pemilihan penyedia)' AND $filter_periode_submit_ke_pengadaan) AS selesai
  2056.         FROM $tabel t
  2057.         WHERE t.tahun_anggaran IS NOT NULL AND t.sumber_dana IS NOT NULL");
  2058.         $query->execute();
  2059.         $hasil $query->fetchAll();
  2060.         return $hasil;
  2061.     }
  2062.     public function getDashbord($tabel$group)
  2063.     {
  2064.         $connection $this->getDoctrine()->getConnection();
  2065.         // $query = $connection->prepare("select column_name from information_schema.columns WHERE table_name='$table'");
  2066.         $query $connection->prepare("WITH 
  2067.         cleaned_data AS (
  2068.                 SELECT
  2069.                     *,
  2070.                     CASE WHEN TRIM(REPLACE(total_nilai::text, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(total_nilai::text, ',', ''))::numeric END AS total_nilai_bersih,
  2071.                     CASE WHEN TRIM(REPLACE(anggaran::text, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(anggaran::text, ',', ''))::numeric END AS anggaran_bersih,
  2072.                     CASE WHEN TRIM(REPLACE(hps::text, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(hps::text, ',', ''))::numeric END AS hps_bersih,
  2073.                     CASE WHEN TRIM(REPLACE(nilai_akhir::text, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(nilai_akhir::text, ',', ''))::numeric END AS nilai_akhir_bersih,
  2074.                     CASE WHEN TRIM(REPLACE(nilai_saving_terhadap_anggaran, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(nilai_saving_terhadap_anggaran, ',', ''))::numeric END AS saving_anggaran_bersih,
  2075.                     CASE WHEN TRIM(REPLACE(nilai_saving_terhadap_hps, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(nilai_saving_terhadap_hps, ',', ''))::numeric END AS saving_hps_bersih,
  2076.                     CASE WHEN TRIM(REPLACE(saving_persen_terhadap_angggaran, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(saving_persen_terhadap_angggaran, ',', ''))::numeric END AS persen_saving_anggaran_bersih,
  2077.                     CASE WHEN TRIM(REPLACE(saving_persen_terhadap_hps, ',', '')) = '' THEN NULL ELSE TRIM(REPLACE(saving_persen_terhadap_hps, ',', ''))::numeric END AS persen_saving_hps_bersih
  2078.                 FROM $tabel
  2079.             ),
  2080.             pk_per_pp AS (
  2081.                 SELECT no_pp, no_pk, COUNT(*) AS jumlah
  2082.                 FROM cleaned_data
  2083.                 GROUP BY no_pp, no_pk
  2084.             ),
  2085.             cek_duplikat_pk AS (
  2086.                 SELECT no_pp, COUNT(*) FILTER (WHERE jumlah > 1) AS jumlah_pk_duplikat
  2087.                 FROM pk_per_pp
  2088.                 GROUP BY no_pp
  2089.             ),
  2090.             gabung AS (
  2091.                 SELECT t.*, COALESCE(d.jumlah_pk_duplikat, 0) AS jumlah_pk_duplikat
  2092.                 FROM cleaned_data t
  2093.                 LEFT JOIN cek_duplikat_pk d ON t.no_pp = d.no_pp
  2094.             ),
  2095.             aggregated AS (
  2096.                 SELECT
  2097.                     regional,
  2098.                     COUNT(DISTINCT no_pk) AS distinct_pk,
  2099.                     COUNT(no_pk) AS total_pk,
  2100.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(total_nilai_bersih), 2) ELSE SUM(total_nilai_bersih) END AS total_total_nilai,
  2101.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(nilai_akhir_bersih), 2) ELSE SUM(nilai_akhir_bersih) END AS total_nilai_akhir,
  2102.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(anggaran_bersih), 2) ELSE SUM(anggaran_bersih) END AS total_anggaran,
  2103.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(hps_bersih), 2) ELSE SUM(hps_bersih) END AS total_hps,
  2104.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(saving_anggaran_bersih), 2) ELSE SUM(saving_anggaran_bersih) END AS total_saving_anggaran,
  2105.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(saving_hps_bersih), 2) ELSE SUM(saving_hps_bersih) END AS total_saving_hps,
  2106.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(persen_saving_anggaran_bersih), 2) ELSE SUM(persen_saving_anggaran_bersih) END AS total_persen_saving_anggaran,
  2107.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) THEN ROUND(AVG(persen_saving_hps_bersih), 2) ELSE SUM(persen_saving_hps_bersih) END AS total_persen_saving_hps,
  2108.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) 
  2109.                         THEN ROUND(AVG(CASE WHEN kategori_tahap = 'Tahap penyusunan hps' THEN total_nilai_bersih END), 2)
  2110.                         ELSE SUM(CASE WHEN kategori_tahap = 'Tahap penyusunan hps' THEN total_nilai_bersih ELSE 0 END)
  2111.                     END AS nilai_penyusunan_hps,
  2112.                     CASE WHEN COUNT(DISTINCT no_pk) < COUNT(no_pk) 
  2113.                         THEN ROUND(AVG(CASE WHEN kategori_tahap IN ('Dalam proses (pemilihan penyedia)', 'Selesai (pemilihan penyedia)') THEN total_nilai_bersih END), 2)
  2114.                         ELSE SUM(CASE WHEN kategori_tahap IN ('Dalam proses (pemilihan penyedia)', 'Selesai (pemilihan penyedia)') THEN total_nilai_bersih ELSE 0 END)
  2115.                     END AS nilai_pemilihan_penyedia,
  2116.                     COUNT(DISTINCT no_pk) FILTER (WHERE kategori_tahap = 'Tahap pembuatan paket') AS tahap_pembuatan_paket,
  2117.                     COUNT(DISTINCT no_pk) FILTER (WHERE kategori_tahap = 'Tahap penyusunan hps') AS tahap_penyusunan_hps,
  2118.                     COUNT(DISTINCT no_pk) FILTER (WHERE kategori_tahap = 'Dalam proses (pemilihan penyedia)') AS dalam_proses,
  2119.                     COUNT(DISTINCT no_pk) FILTER (WHERE kategori_tahap = 'Selesai (pemilihan penyedia)') AS selesai
  2120.                 FROM gabung
  2121.                 GROUP BY $group
  2122.             )
  2123.             SELECT
  2124.                 $group,
  2125.                 total_total_nilai AS total_nilai,
  2126.                 total_nilai_akhir,
  2127.                 total_anggaran,
  2128.                 total_hps,
  2129.                 total_saving_anggaran,
  2130.                 total_saving_hps,
  2131.                 total_persen_saving_anggaran,
  2132.                 total_persen_saving_hps,
  2133.                 nilai_penyusunan_hps,
  2134.                 nilai_pemilihan_penyedia,
  2135.                 tahap_pembuatan_paket,
  2136.                 tahap_penyusunan_hps,
  2137.                 dalam_proses,
  2138.                 selesai
  2139.             FROM aggregated
  2140.             ORDER BY regional;");
  2141.         $query->execute();
  2142.         $hasil $query->fetchAll();
  2143.         return $hasil;
  2144.     }
  2145.     public function getDataTableDetail($limit$page$get$group$nama$tahap$sumber_dana$tabel$kolom_periode$tgl_awal$tgl_akhir$tipe_tahun$tahun)
  2146.     {
  2147.         $connection $this->getDoctrine()->getConnection();
  2148.         $sql "SELECT * FROM $tabel t ";
  2149.         $sql .= " WHERE  t.kategori_tahap !=''";
  2150.         if ($tipe_tahun == 1) {
  2151.             $sql .= " AND tahun_anggaran = '$tahun'";
  2152.         } else {
  2153.             $sql .= " AND tahun_anggaran IS NOT NULL AND sumber_dana IS NOT NULL AND $kolom_periode BETWEEN '$tgl_awal' AND '$tgl_akhir' ";
  2154.         }
  2155.         if ($tahap == 'tahap_pembuatan_paket') {
  2156.             $sql .= " AND  t.kategori_tahap='Tahap pembuatan paket'";
  2157.         } else if ($tahap == 'tahap_penyusunan_hps') {
  2158.             $sql .= " AND  t.kategori_tahap='Tahap penyusunan hps'";
  2159.         } else if ($tahap == 'tahap_pemilihan_penyedia') {
  2160.             $sql .= " AND  t.kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  2161.         } else if ($tahap == 'dalam_proses') {
  2162.             $sql .= " AND  t.kategori_tahap='Dalam proses (pemilihan penyedia)'";
  2163.         } else if ($tahap == 'selesai') {
  2164.             $sql .= " AND  t.kategori_tahap='Selesai (pemilihan penyedia)'";
  2165.         }
  2166.         if ($group == 'all') {
  2167.         } else {
  2168.             if ($group == 'kategori_plant') {
  2169.                 // $sql = "SELECT * FROM $tabel t JOIN m_plant  ON UPPER(t.plant) = UPPER(m_plant.nama)";
  2170.                 $sql .= " AND UPPER(t.kategori_plant) = UPPER('$nama')";
  2171.             } else {
  2172.                 $sql .= " AND UPPER(t.plant) = UPPER('$nama')";
  2173.             }
  2174.             $sql .= " AND  t.sumber_dana ='$sumber_dana'";
  2175.         }
  2176.         if (!empty($get['filters']['no_pr'])) {
  2177.             $sql .= " AND  t.no_pr::text ILIKE '%" $get['filters']['no_pr'] . "%'";
  2178.         }
  2179.         if (!empty($get['filters']['plant'])) {
  2180.             if ($group == 'kategori_plant') {
  2181.                 $sql .= " AND  t.kategori_plant::text ILIKE '%" $get['filters']['plant'] . "%'";
  2182.             } else {
  2183.                 $sql .= " AND  t.plant::text ILIKE '%" $get['filters']['plant'] . "%'";
  2184.             }
  2185.         }
  2186.         if (!empty($get['filters']['sumber_dana'])) {
  2187.             $sql .= " AND  t.sumber_dana:text ILIKE '%" $get['filters']['sumber_dana'] . "%'";
  2188.         }
  2189.         if (!empty($get['filters']['no_pp'])) {
  2190.             $sql .= " AND  t.no_pp:text ILIKE '%" $get['filters']['no_pp'] . "%'";
  2191.         }
  2192.         if (!empty($get['filters']['no_pk'])) {
  2193.             $sql .= " AND  t.no_pk:text ILIKE '%" $get['filters']['no_pk'] . "%'";
  2194.         }
  2195.         if (!empty($get['filters']['anggaran'])) {
  2196.             $sql .= " AND  t.anggaran::text ILIKE '%" $get['filters']['anggaran'] . "%'";
  2197.         }
  2198.         if (!empty($get['filters']['tahun_anggaran'])) {
  2199.             $sql .= " AND  t.tahun_anggaran::text ILIKE '%" $get['filters']['tahun_anggaran'] . "%'";
  2200.         }
  2201.         if ($limit) {
  2202.             $sql .= " LIMIT " intval($limit);
  2203.         }
  2204.         if ($page) {
  2205.             $sql .= " OFFSET " intval($page);
  2206.         }
  2207.         $stmt $connection->prepare($sql);
  2208.         $stmt->execute();
  2209.         $result $stmt->fetchAll();
  2210.         $res = [];
  2211.         $no 1;
  2212.         foreach ($result as $key => $value) {
  2213.             $res[$key]['no'] = $no++;
  2214.             $res[$key]['no_pr'] = $value['no_pr'];
  2215.             $res[$key]['plant'] = ($group == 'kategori_plant') ? $value['kategori_plant'] : $value['plant'];
  2216.             $res[$key]['sumber_dana'] = $value['sumber_dana'];
  2217.             $res[$key]['tahun_anggaran'] = $value['tahun_anggaran'];
  2218.             $res[$key]['anggaran'] = $value['anggaran'];
  2219.             $res[$key]['no_pk'] = $value['no_pk'];
  2220.             if ($tahap == 'tahap_pemilihan_penyedia') {
  2221.                 $res[$key]['no_pp'] = $value['no_pp'];
  2222.             }
  2223.         }
  2224.         // print_r($result); exit;
  2225.         return $res;
  2226.     }
  2227.     public function getDataTableDetailExplorasiPeriode($limit$page$get$tabel$explorasi_detail_id)
  2228.     {
  2229.         $exploreDetail $this->getDoctrine()->getRepository(TExploreDataDetail::class);
  2230.         $explorasi $exploreDetail->findOneBy(['id' => $explorasi_detail_id]);
  2231.         // print_r($explorasi); exit;
  2232.         $filter $explorasi->getFilter();
  2233.         $connection $this->getDoctrine()->getConnection();
  2234.         $whereClause implode(' AND '$filter);
  2235.         $kondisi = ($explorasi->isIsCreateView() != 1) ? ' AND ' $whereClause null;
  2236.         $sql "SELECT periode, SUM(nilai) AS nilai FROM  $tabel t WHERE t.periode != ''  $kondisi
  2237.                 -- filter tambahan
  2238.                 " . (!empty($get['filters']['periode']) ? " AND t.periode ILIKE '%" $get['filters']['periode'] . "%'" "") . "
  2239.                 " . (!empty($get['filters']['nilai']) ? " AND t.nilai::text ILIKE '%" $get['filters']['nilai'] . "%'" "") . "
  2240.                 GROUP BY 
  2241.                 periode
  2242.                 ORDER BY 
  2243.                 TO_DATE(LEFT(periode, 3) || ' ' || SUBSTRING(periode, 4, 4), 'Mon YYYY') ASC,
  2244.                 CASE SPLIT_PART(periode, '.', 2)
  2245.                     WHEN 'I' THEN 1
  2246.                     WHEN 'II' THEN 2
  2247.                     WHEN 'III' THEN 3
  2248.                     WHEN 'IV' THEN 4
  2249.                     ELSE 0
  2250.                 END ASC";
  2251.         if ($limit) {
  2252.             $sql .= " LIMIT " intval($limit);
  2253.         }
  2254.         if ($page) {
  2255.             $sql .= " OFFSET " intval($page);
  2256.         }
  2257.         $stmt $connection->prepare($sql);
  2258.         $stmt->execute();
  2259.         $result $stmt->fetchAll();
  2260.         // print_r($result); exit;
  2261.         $res = [];
  2262.         $no 1;
  2263.         foreach ($result as $key => $value) {
  2264.             $res[$key]['no'] = $no++;
  2265.             $res[$key]['periode'] = $value['periode'];
  2266.             $res[$key]['nilai'] = $value['nilai'];
  2267.         }
  2268.         return $res;
  2269.     }
  2270.     public function getGrafikReport($tahun$bulan)
  2271.     {
  2272.         $connection $this->getDoctrine()->getConnection();
  2273.         $tahun_sebelumnya $tahun 1;
  2274.         $sql "WITH all_dates AS (
  2275.     SELECT d::date AS tanggal
  2276.     FROM generate_series('$tahun_sebelumnya-10-01'::date, '$tahun-$bulan'::date - INTERVAL '1 day', INTERVAL '1 day') d
  2277. ),
  2278. minggu_fixed AS (
  2279.     SELECT
  2280.         TO_CHAR(tanggal, 'MONYYYY') || '.' ||
  2281.         CASE
  2282.             WHEN EXTRACT(DAY FROM tanggal) BETWEEN 1 AND 7 THEN 'I'
  2283.             WHEN EXTRACT(DAY FROM tanggal) BETWEEN 8 AND 14 THEN 'II'
  2284.             WHEN EXTRACT(DAY FROM tanggal) BETWEEN 15 AND 21 THEN 'III'
  2285.             ELSE 'IV'
  2286.         END AS periode,
  2287.         tanggal
  2288.     FROM all_dates
  2289. ),
  2290. periode_final AS (
  2291.     SELECT 
  2292.         periode,
  2293.         MIN(tanggal) AS start_date,
  2294.         MAX(tanggal) AS end_date
  2295.     FROM minggu_fixed
  2296.     GROUP BY periode
  2297. ),
  2298. data_dengan_periode AS (
  2299.     SELECT 
  2300.         sumber_dana,
  2301.         TO_CHAR(tgl_submit_ke_pengadaan, 'MONYYYY') || '.' ||
  2302.         CASE
  2303.             WHEN EXTRACT(DAY FROM tgl_submit_ke_pengadaan) BETWEEN 1 AND 7 THEN 'I'
  2304.             WHEN EXTRACT(DAY FROM tgl_submit_ke_pengadaan) BETWEEN 8 AND 14 THEN 'II'
  2305.             WHEN EXTRACT(DAY FROM tgl_submit_ke_pengadaan) BETWEEN 15 AND 21 THEN 'III'
  2306.             ELSE 'IV'
  2307.         END AS periode,
  2308.         COUNT(*) AS jumlah
  2309.     FROM tabel_35
  2310.     WHERE status_pr = 'approve'
  2311.         AND sumber_dana IS NOT NULL
  2312.         AND tgl_submit_ke_pengadaan >= '$tahun_sebelumnya-10-01'
  2313.         AND tgl_submit_ke_pengadaan < '$tahun-$bulan'
  2314.     GROUP BY sumber_dana, periode
  2315. )
  2316. SELECT 
  2317.     p.periode,
  2318.     s.sumber_dana,
  2319.     COALESCE(d.jumlah, 0) AS jumlah_pengajuan
  2320. FROM periode_final p
  2321. CROSS JOIN (
  2322.     SELECT DISTINCT sumber_dana
  2323.     FROM tabel_35
  2324.     WHERE status_pr = 'approve'
  2325.         AND sumber_dana IS NOT NULL
  2326. ) s
  2327. LEFT JOIN data_dengan_periode d
  2328.     ON p.periode = d.periode AND s.sumber_dana = d.sumber_dana
  2329. ORDER BY p.start_date, s.sumber_dana";
  2330.         $stmt $connection->prepare($sql);
  2331.         $stmt->execute();
  2332.         $result $stmt->fetchAll();
  2333.         $res = [];
  2334.         foreach ($result as $key => $value) {
  2335.             $res[$value['sumber_dana']][$key] = $value;
  2336.         }
  2337.         $res array_reverse($res);
  2338.         return $res;
  2339.     }
  2340.     public function getDataTerbaruTerlama($table$kolom_periode$kategori_tahap null$tahun$sumber_dana)
  2341.     {
  2342.         $connection $this->getDoctrine()->getConnection();
  2343.         if ($kategori_tahap == 'tahap_pembuatan_paket') {
  2344.             $kategori " AND  kategori_tahap='Tahap pembuatan paket'";
  2345.         } else if ($kategori_tahap == 'tahap_penyusunan_hps') {
  2346.             $kategori " AND  kategori_tahap='Tahap penyusunan hps'";
  2347.         } else if ($kategori_tahap == 'tahap_pemilihan_penyedia') {
  2348.             $kategori " AND  kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  2349.         } else if ($kategori_tahap == 'dalam_proses') {
  2350.             $kategori " AND  kategori_tahap='Dalam proses (pemilihan penyedia)'";
  2351.         } else if ($kategori_tahap == 'selesai') {
  2352.             $kategori " AND  kategori_tahap='Selesai (pemilihan penyedia)'";
  2353.         } else {
  2354.             $kategori "";
  2355.         }
  2356.         $sql "
  2357.             (
  2358.                 SELECT 'terlama' AS tipe, *
  2359.                 FROM $table
  2360.                     WHERE tahun_anggaran = '$tahun'
  2361.                     AND $kolom_periode IS NOT NULL AND sumber_dana IS NOT NULL
  2362.                     $kategori
  2363.                 ORDER BY $kolom_periode ASC
  2364.                 LIMIT 1
  2365.                
  2366.             )
  2367.                 UNION ALL
  2368.             (
  2369.                 SELECT 'terbaru' AS tipe, *
  2370.                 FROM $table
  2371.                     WHERE tahun_anggaran = '$tahun'
  2372.                     AND $kolom_periode IS NOT NULL AND sumber_dana IS NOT NULL
  2373.                     $kategori
  2374.                 ORDER BY $kolom_periode DESC
  2375.                 LIMIT 1
  2376.             );";
  2377.         $stmt $connection->prepare($sql);
  2378.         $stmt->execute();
  2379.         $result $stmt->fetchAll();
  2380.         if ($result) {
  2381.             $periode = [
  2382.                 'periode_awal' => $result[0][$kolom_periode],
  2383.                 'periode_akhir' => $result[1][$kolom_periode]
  2384.             ];
  2385.         } else {
  2386.             $periode = [
  2387.                 'periode_awal' => date("$tahun-m-d"),
  2388.                 'periode_akhir' => date("$tahun-m-d")
  2389.             ];
  2390.         }
  2391.         return $periode;
  2392.     }
  2393.     public function getGrafikTotalPkPpPr($table$kolom$kolom_periode$tanggal_awal$tanggal_akhir$kategori_tahap null$tipe_tahun$tahun$sumber_dana)
  2394.     {
  2395.         $connection $this->getDoctrine()->getConnection();
  2396.         if ($kategori_tahap == 'tahap_pembuatan_paket') {
  2397.             $kategori " AND  kategori_tahap='Tahap pembuatan paket'";
  2398.         } else if ($kategori_tahap == 'tahap_penyusunan_hps') {
  2399.             $kategori " AND  kategori_tahap='Tahap penyusunan hps'";
  2400.         } else if ($kategori_tahap == 'tahap_pemilihan_penyedia') {
  2401.             $kategori " AND  kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  2402.         } else if ($kategori_tahap == 'dalam_proses') {
  2403.             $kategori " AND  kategori_tahap='Dalam proses (pemilihan penyedia)'";
  2404.         } else if ($kategori_tahap == 'selesai') {
  2405.             $kategori " AND  kategori_tahap='Selesai (pemilihan penyedia)'";
  2406.         } else {
  2407.             $kategori "";
  2408.         }
  2409.         if ($tipe_tahun == 1) {
  2410.             // $tahun_sebelumnya = $tahun - 1;
  2411.             // // --- Tentukan tanggal awal (Jumat pertama >= 1 Oktober) ---
  2412.             // $tanggal_awal_obj = new DateTime("$tahun_sebelumnya-10-01");
  2413.             // if ($tanggal_awal_obj->format('N') != 5) { // 5 = Jumat
  2414.             //     $tanggal_awal_obj->modify('next friday');
  2415.             // }
  2416.             // $tanggal_awal = $tanggal_awal_obj->format('Y-m-d');
  2417.             // // --- Tentukan tanggal akhir (Kamis terakhir <= 30 September) ---
  2418.             // $bulan_tanggal = ($tahun == date("Y") && date("m") < 9) ? date("m-d") : "09-30";
  2419.             // $tanggal_akhir_obj = new DateTime("$tahun-$bulan_tanggal");
  2420.             // if ($tanggal_akhir_obj->format('N') != 4) { // 4 = Kamis
  2421.             //     $tanggal_akhir_obj->modify('last thursday');
  2422.             // }
  2423.             // $tanggal_akhir = $tanggal_akhir_obj->format('Y-m-d');
  2424.             $periode_tanggal $this->getDataTerbaruTerlama($table$kolom_periode$kategori_tahap$tahun$sumber_dana);
  2425.             $tanggal_awal $periode_tanggal['periode_awal'];
  2426.             $tanggal_akhir $periode_tanggal['periode_akhir'];
  2427.             $tahun_anggaran " tahun_anggaran='$tahun'";
  2428.         } else {
  2429.             $tahun_anggaran " tahun_anggaran IS NOT NULL";
  2430.         }
  2431.         $sql "WITH parameter AS (
  2432.     SELECT 
  2433.         '$tanggal_awal'::date AS tanggal_awal,  
  2434.         '$tanggal_akhir'::date AS tanggal_akhir
  2435. ),
  2436. bulan_series AS (
  2437.     SELECT generate_series(
  2438.         date_trunc('month', tanggal_awal),
  2439.         date_trunc('month', tanggal_akhir),
  2440.         interval '1 month'
  2441.     )::date AS bulan
  2442.     FROM parameter
  2443. ),
  2444. all_weeks AS (
  2445.     SELECT 
  2446.         bulan + interval '0 day' AS start_date,
  2447.         bulan + interval '7 day' AS start_date_2,
  2448.         bulan + interval '14 day' AS start_date_3,
  2449.         bulan + interval '21 day' AS start_date_4,
  2450.         (date_trunc('month', bulan) + interval '1 month - 1 day')::date AS end_of_month
  2451.     FROM bulan_series
  2452. ),
  2453. periode_final AS (
  2454.     SELECT bulan,
  2455.            (bulan)::date AS start_date,
  2456.            (bulan + interval '6 day')::date AS end_date
  2457.     FROM bulan_series
  2458.     UNION ALL
  2459.     SELECT bulan,
  2460.            (bulan + interval '7 day')::date,
  2461.            (bulan + interval '13 day')::date
  2462.     FROM bulan_series
  2463.     UNION ALL
  2464.     SELECT bulan,
  2465.            (bulan + interval '14 day')::date,
  2466.            (bulan + interval '20 day')::date
  2467.     FROM bulan_series
  2468.     UNION ALL
  2469.     SELECT bulan,
  2470.            (bulan + interval '21 day')::date,
  2471.            (date_trunc('month', bulan) + interval '1 month - 1 day')::date
  2472.     FROM bulan_series
  2473. ),
  2474. data_dengan_periode AS (
  2475.     SELECT 
  2476.         sumber_dana,
  2477.         date_trunc('month', $kolom_periode)::date 
  2478.         + CASE 
  2479.             WHEN extract(day from $kolom_periode) BETWEEN 1 AND 7 THEN 0
  2480.             WHEN extract(day from $kolom_periode) BETWEEN 8 AND 14 THEN 7
  2481.             WHEN extract(day from $kolom_periode) BETWEEN 15 AND 21 THEN 14
  2482.             ELSE 21
  2483.           END * interval '1 day' AS start_date,
  2484.         COUNT(DISTINCT $kolom) AS jumlah,
  2485.         SUM(
  2486.             NULLIF(REPLACE(REPLACE(total_nilai, ',', ''), ' ', ''), '')::numeric
  2487.         ) AS total_nilai
  2488.     FROM $table
  2489.     WHERE $tahun_anggaran
  2490.     AND sumber_dana IS NOT NULL
  2491.     $kategori
  2492.     AND $kolom_periode >= (SELECT tanggal_awal FROM parameter)
  2493.     AND $kolom_periode <= (SELECT tanggal_akhir FROM parameter)
  2494.     GROUP BY sumber_dana, start_date
  2495. )
  2496. SELECT 
  2497.     to_char(p.start_date, 'YYYY-MM-DD') || ' s/d ' || 
  2498.     to_char(p.end_date, 'YYYY-MM-DD') AS periode_tanggal,
  2499.     -- Label periode seperti OCT2024.1, OCT2024.8, OCT2024.15, OCT2024.22
  2500.     to_char(p.start_date, 'MONYYYY') || '.' || 
  2501.     extract(day from p.start_date)::text AS periode,
  2502.     s.sumber_dana,
  2503.     COALESCE(d.jumlah, 0) AS jumlah_pengajuan,
  2504.     COALESCE(d.total_nilai, 0) AS total_nilai
  2505. FROM periode_final p
  2506. CROSS JOIN (
  2507.     SELECT DISTINCT sumber_dana
  2508.     FROM $table
  2509.     WHERE $tahun_anggaran
  2510.     AND sumber_dana IS NOT NULL
  2511. ) s
  2512. LEFT JOIN data_dengan_periode d
  2513.     ON p.start_date = d.start_date 
  2514.     AND s.sumber_dana = d.sumber_dana
  2515. ORDER BY p.start_date, s.sumber_dana";
  2516.         $stmt $connection->prepare($sql);
  2517.         $stmt->execute();
  2518.         $result $stmt->fetchAll();
  2519.         $res = [];
  2520.         foreach ($result as $key => $value) {
  2521.             $res[$value['sumber_dana']][$key] = $value;
  2522.         }
  2523.         $res array_reverse($res);
  2524.         return $res;
  2525.     }
  2526.     // public function getGrafikTotalPkPpPr($table, $kolom, $kolom_periode, $tanggal_awal, $tanggal_akhir, $kategori_tahap = null, $tipe_tahun, $tahun, $sumber_dana)
  2527.     // {
  2528.     //     $connection = $this->getDoctrine()->getConnection();
  2529.     //     if ($kategori_tahap == 'tahap_pembuatan_paket') {
  2530.     //         $kategori = " AND  kategori_tahap='Tahap pembuatan paket'";
  2531.     //     } else if ($kategori_tahap == 'tahap_penyusunan_hps') {
  2532.     //         $kategori = " AND  kategori_tahap='Tahap penyusunan hps'";
  2533.     //     } else if ($kategori_tahap == 'tahap_pemilihan_penyedia') {
  2534.     //         $kategori = " AND  kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  2535.     //     } else if ($kategori_tahap == 'dalam_proses') {
  2536.     //         $kategori = " AND  kategori_tahap='Dalam proses (pemilihan penyedia)'";
  2537.     //     } else if ($kategori_tahap == 'selesai') {
  2538.     //         $kategori = " AND  kategori_tahap='Selesai (pemilihan penyedia)'";
  2539.     //     } else {
  2540.     //         $kategori = "";
  2541.     //     }
  2542.     //     if ($tipe_tahun == 1) {
  2543.     //         $tahun_sebelumnya = $tahun - 1;
  2544.     //         // --- Tentukan tanggal awal (Jumat pertama >= 1 Oktober) ---
  2545.     //         $tanggal_awal_obj = new DateTime("$tahun_sebelumnya-10-01");
  2546.     //         if ($tanggal_awal_obj->format('N') != 5) { // 5 = Jumat
  2547.     //             $tanggal_awal_obj->modify('next friday');
  2548.     //         }
  2549.     //         $tanggal_awal = $tanggal_awal_obj->format('Y-m-d');
  2550.     //         // --- Tentukan tanggal akhir (Kamis terakhir <= 30 September) ---
  2551.     //         $bulan_tanggal = ($tahun == date("Y") && date("m") < 9) ? date("m-d") : "09-30";
  2552.     //         $tanggal_akhir_obj = new DateTime("$tahun-$bulan_tanggal");
  2553.     //         if ($tanggal_akhir_obj->format('N') != 4) { // 4 = Kamis
  2554.     //             $tanggal_akhir_obj->modify('last thursday');
  2555.     //         }
  2556.     //         $tanggal_akhir = $tanggal_akhir_obj->format('Y-m-d');
  2557.     //         $tahun_anggaran = " tahun_anggaran='$tahun'";
  2558.     //     } else {
  2559.     //         $tahun_anggaran = " tahun_anggaran IS NOT NULL";
  2560.     //     }
  2561.     //     $sql = "WITH parameter AS (
  2562.     //                 SELECT 
  2563.     //                     '$tanggal_awal'::date AS tanggal_awal,  -- awal tahun anggaran
  2564.     //                     '$tanggal_akhir'::date AS tanggal_akhir  -- akhir tahun anggaran
  2565.     //             ),
  2566.     //             minggu_awal AS (
  2567.     //                 SELECT 
  2568.     //                     -- cari Jumat pertama >= tanggal_awal
  2569.     //                     tanggal_awal 
  2570.     //                     + mod(5 - CAST(EXTRACT(dow FROM tanggal_awal) AS int) + 7, 7) * interval '1 day' 
  2571.     //                     AS first_friday,
  2572.     //                     tanggal_akhir
  2573.     //                 FROM parameter
  2574.     //             ),
  2575.     //             all_weeks AS (
  2576.     //                 SELECT 
  2577.     //                     generate_series(
  2578.     //                         first_friday,
  2579.     //                         tanggal_akhir,
  2580.     //                         interval '7 day'
  2581.     //                     )::date AS start_week
  2582.     //                 FROM minggu_awal
  2583.     //             ),
  2584.     //             periode_final AS (
  2585.     //                 SELECT 
  2586.     //                     start_week,
  2587.     //                     start_week AS start_date,
  2588.     //                     start_week + interval '6 day' AS end_date
  2589.     //                 FROM all_weeks
  2590.     //             ),
  2591.     //             data_dengan_periode AS (
  2592.     //                 SELECT 
  2593.     //                     sumber_dana,
  2594.     //                     (
  2595.     //                         $kolom_periode::date 
  2596.     //                         + mod(5 - CAST(EXTRACT(dow FROM $kolom_periode) AS int) + 7, 7) * interval '1 day'
  2597.     //                     )::date AS start_week,
  2598.     //                     COUNT(DISTINCT $kolom) AS jumlah,
  2599.     //                     SUM(
  2600.     //                         NULLIF(REPLACE(REPLACE(total_nilai, ',', ''), ' ', ''), '')::numeric
  2601.     //                     ) AS total_nilai
  2602.     //                 FROM $table
  2603.     //                 WHERE $tahun_anggaran
  2604.     //                 AND sumber_dana IS NOT NULL
  2605.     //                 $kategori
  2606.     //                 AND $kolom_periode >= (SELECT tanggal_awal FROM parameter)
  2607.     //                 AND $kolom_periode <= (SELECT tanggal_akhir FROM parameter)
  2608.     //                 GROUP BY sumber_dana, start_week
  2609.     //             )
  2610.     //             SELECT 
  2611.     //                 -- Periode tanggal (Jumat s/d Kamis)
  2612.     //                 to_char(p.start_week, 'YYYY-MM-DD') || ' s/d ' || 
  2613.     //                 to_char(p.end_date, 'YYYY-MM-DD') AS periode_tanggal,
  2614.     //                 -- Label periode (contoh: OCT2024.1, OCT2024.2, dst)
  2615.     //                 to_char(p.start_week, 'MONYYYY') || '.' || 
  2616.     //                 (dense_rank() OVER (
  2617.     //                     PARTITION BY date_trunc('month', p.start_week) 
  2618.     //                     ORDER BY p.start_week
  2619.     //                 ))::text AS periode,
  2620.     //                 s.sumber_dana,
  2621.     //                 COALESCE(d.jumlah, 0) AS jumlah_pengajuan,
  2622.     //                 COALESCE(d.total_nilai, 0) AS total_nilai
  2623.     //             FROM periode_final p
  2624.     //             CROSS JOIN (
  2625.     //                 SELECT DISTINCT sumber_dana
  2626.     //                 FROM $table
  2627.     //                 WHERE $tahun_anggaran
  2628.     //                 AND sumber_dana IS NOT NULL
  2629.     //             ) s
  2630.     //             LEFT JOIN data_dengan_periode d
  2631.     //                 ON p.start_week = d.start_week 
  2632.     //                 AND s.sumber_dana = d.sumber_dana
  2633.     //             ORDER BY p.start_week, s.sumber_dana;";
  2634.     //     $stmt = $connection->prepare($sql);
  2635.     //     $stmt->execute();
  2636.     //     $result = $stmt->fetchAll();
  2637.     //     $res = [];
  2638.     //     foreach ($result as $key => $value) {
  2639.     //         $res[$value['sumber_dana']][$key] = $value;
  2640.     //     }
  2641.     //     $res = array_reverse($res);
  2642.     //     return $res;
  2643.     // }
  2644.     public function getGrafikPertahap($table$kolom$kolom_periode$tanggal_awal$tanggal_akhir$kategori_tahap null$tipe_tahun$tahun$sumber_dana)
  2645.     {
  2646.         $connection $this->getDoctrine()->getConnection();
  2647.         if ($kategori_tahap == 'tahap_pembuatan_paket') {
  2648.             $kategori " AND  kategori_tahap='Tahap pembuatan paket'";
  2649.         } else if ($kategori_tahap == 'tahap_penyusunan_hps') {
  2650.             $kategori " AND  kategori_tahap='Tahap penyusunan hps'";
  2651.         } else if ($kategori_tahap == 'tahap_pemilihan_penyedia') {
  2652.             $kategori " AND  kategori_tahap IN ('Dalam proses (pemilihan penyedia)','Selesai (pemilihan penyedia)')";
  2653.         } else if ($kategori_tahap == 'dalam_proses') {
  2654.             $kategori " AND  kategori_tahap='Dalam proses (pemilihan penyedia)'";
  2655.         } else if ($kategori_tahap == 'selesai') {
  2656.             $kategori " AND  kategori_tahap='Selesai (pemilihan penyedia)'";
  2657.         } else {
  2658.             $kategori "";
  2659.         }
  2660.         if ($tipe_tahun == 1) {
  2661.             // $tahun_sebelumnya = $tahun - 1;
  2662.             // $tanggal_awal = "$tahun_sebelumnya-10-01";
  2663.             // $bulan_tanggal = ($tahun == date("Y") && date("m") < 9) ? date("m-d") : "09-30";
  2664.             // $tanggal_akhir = "$tahun-$bulan_tanggal";
  2665.             $filter " tahun_anggaran='$tahun'";
  2666.         } else {
  2667.             $filter " tahun_anggaran IS NOT NULL AND $kolom_periode BETWEEN '$tanggal_awal' AND '$tanggal_akhir'";
  2668.         }
  2669.         $sql "WITH sumber AS (
  2670.                     SELECT unnest(ARRAY['investasi','eksploitasi']) AS sumber_dana
  2671.                 ),
  2672.                 tahap AS (
  2673.                     SELECT DISTINCT kategori_tahap AS tahap
  2674.                     FROM $table
  2675.                     WHERE $filter $kategori
  2676.                 ),
  2677.                 data AS (
  2678.                     SELECT 
  2679.                         kategori_tahap AS tahap,
  2680.                         sumber_dana,
  2681.                         COUNT(DISTINCT $kolom) AS jumlah_pengajuan,
  2682.                         SUM(NULLIF(REPLACE(REPLACE(total_nilai, ',', ''), ' ', ''), '')::numeric) AS total_nilai
  2683.                     FROM $table
  2684.                     WHERE $filter $kategori
  2685.                     GROUP BY kategori_tahap, sumber_dana
  2686.                 )
  2687.                 SELECT 
  2688.                     t.tahap,
  2689.                     s.sumber_dana,
  2690.                     COALESCE(d.jumlah_pengajuan, 0) AS jumlah_pengajuan,
  2691.                     COALESCE(d.total_nilai, 0) AS total_nilai
  2692.                 FROM tahap t
  2693.                 CROSS JOIN sumber s
  2694.                 LEFT JOIN data d ON d.tahap = t.tahap AND d.sumber_dana = s.sumber_dana
  2695.                 ORDER BY t.tahap, s.sumber_dana;";
  2696.         $stmt $connection->prepare($sql);
  2697.         $stmt->execute();
  2698.         $result $stmt->fetchAll();
  2699.         //         $res = [];
  2700.         //         foreach ($result as $key => $value) {
  2701.         //             $res[$value['tahap']][$key] = $value;
  2702.         //         }
  2703.         // $res = array_reverse($res);
  2704.         return $result;
  2705.     }
  2706.     public function cek_karakter($str)
  2707.     {
  2708.         $data str_replace(array(" ""\"""/""("")""&quot;""-"), "_"htmlspecialchars($str));
  2709.         return $data;
  2710.     }
  2711.     public function buang($str)
  2712.     {
  2713.         $data str_replace(array(",""'"'.'"%"), ""htmlspecialchars($str));
  2714.         return $data;
  2715.     }
  2716.     public function getJumlahHariKerja($table$periode_awal$periode_akhir$tipe_pengadaan null$tanggal_awal$tanggal_akhir$tipe_tahun$tahun$sumber_dana)
  2717.     {
  2718.         $connection $this->getDoctrine()->getConnection();
  2719.         $filter_periode = ($tipe_tahun == 1) ? "t.tahun_anggaran = '$tahun'" "t.$periode_awal BETWEEN '$tanggal_awal' AND '$tanggal_akhir'";
  2720.         // $sql = "SELECT 
  2721.         //     t.no_pr,t.$tanggal_awal,t.$tanggal_akhir,
  2722.         //     COUNT(g.tanggal) AS jumlah_hari_kerja
  2723.         // FROM 
  2724.         //     tabel_40 t
  2725.         // JOIN LATERAL (
  2726.         //     SELECT tanggal
  2727.         //     FROM generate_series(t.$tanggal_awal, t.$tanggal_akhir, interval '1 day') AS tanggal
  2728.         //     WHERE EXTRACT(DOW FROM tanggal) NOT IN (0, 6) -- bukan Sabtu atau Minggu
  2729.         //     AND tanggal NOT IN (SELECT tanggal FROM m_libur)
  2730.         // ) g ON true
  2731.         // GROUP BY t.id";
  2732.         if ($tipe_pengadaan) {
  2733.             $sql "SELECT 
  2734.                 CASE 
  2735.                     WHEN sub.metode_pengadaan = 'Penunjukan Langsung' THEN 'PL'
  2736.                     WHEN sub.metode_pengadaan IN ('Tender Umum', 'Tender Terbatas', 'Seleksi Terbatas') THEN 'Tender'
  2737.                     ELSE 'Lainnya'
  2738.                 END AS tipe_pengadaan,
  2739.                 
  2740.                 ROUND(AVG(sub.jumlah_hari_kerja)::numeric, 2) AS rata_rata_hari_kerja
  2741.             FROM (
  2742.                 SELECT 
  2743.                     t.metode_pengadaan,
  2744.                     COUNT(g.tanggal) AS jumlah_hari_kerja
  2745.                 FROM 
  2746.                     $table t
  2747.                 JOIN LATERAL (
  2748.                     SELECT tanggal
  2749.                     FROM generate_series(t.$periode_awal, t.$periode_akhir, interval '1 day') AS tanggal
  2750.                     WHERE EXTRACT(DOW FROM tanggal) NOT IN (0, 6)
  2751.                     AND tanggal NOT IN (SELECT tanggal FROM m_libur)
  2752.                 ) g ON true
  2753.                 WHERE $filter_periode
  2754.                 GROUP BY t.id, t.metode_pengadaan
  2755.             ) sub
  2756.             GROUP BY 
  2757.                 CASE 
  2758.                     WHEN sub.metode_pengadaan = 'Penunjukan Langsung' THEN 'PL'
  2759.                     WHEN sub.metode_pengadaan IN ('Tender Umum', 'Tender Terbatas', 'Seleksi Terbatas') THEN 'Tender'
  2760.                     ELSE 'Lainnya'
  2761.                 END;";
  2762.         } else {
  2763.             $sql "SELECT 
  2764.                         ROUND(AVG(jumlah_hari_kerja)::numeric, 2) AS rata_rata_hari_kerja
  2765.                     FROM (
  2766.                         SELECT 
  2767.                             COUNT(g.tanggal) AS jumlah_hari_kerja
  2768.                         FROM 
  2769.                             $table t
  2770.                         JOIN LATERAL (
  2771.                             SELECT tanggal
  2772.                             FROM generate_series(t.$periode_awal, t.$periode_akhir, interval '1 day') AS tanggal
  2773.                             WHERE EXTRACT(DOW FROM tanggal) NOT IN (0, 6)
  2774.                             AND tanggal NOT IN (SELECT tanggal FROM m_libur)
  2775.                         ) g ON true
  2776.                         WHERE $filter_periode
  2777.                         GROUP BY t.id
  2778.                     ) AS sub";
  2779.         }
  2780.         $stmt $connection->prepare($sql);
  2781.         $stmt->execute();
  2782.         $result $stmt->fetchAll();
  2783.         return $result;
  2784.     }
  2785.     public function getJumlahBerdasrkanMetode($table$kolom_periode$tgl_awal$tgl_akhir$tipe_tahun$tahun$sumber_dana)
  2786.     {
  2787.         $periode_filter =  ($tipe_tahun == 1) ? "tahun_anggaran = '$tahun'" "$kolom_periode BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2788.         $connection $this->getDoctrine()->getConnection();
  2789.         $sql "SELECT 
  2790.                 CASE 
  2791.                     WHEN sub.metode_pengadaan = 'Penunjukan Langsung' THEN 'PL'
  2792.                     WHEN sub.metode_pengadaan IN ('Tender Umum', 'Tender Terbatas', 'Seleksi Terbatas') THEN 'Tender'
  2793.                     ELSE 'Lainnya'
  2794.                 END AS tipe_pengadaan,
  2795.                 COUNT(DISTINCT no_pk) AS jumlah,
  2796.                 SUM(total_nilai_hasil) AS total_nilai
  2797.             FROM $table  AS sub
  2798.             WHERE status_pr IN ('approve', 'submit') 
  2799.                 AND tahun_anggaran IS NOT NULL AND sumber_dana IS NOT NULL
  2800.                 -- AND $kolom_periode BETWEEN '$tgl_awal' AND '$tgl_akhir'
  2801.                 AND $periode_filter
  2802.             GROUP BY 
  2803.                 CASE 
  2804.                     WHEN sub.metode_pengadaan = 'Penunjukan Langsung' THEN 'PL'
  2805.                     WHEN sub.metode_pengadaan IN ('Tender Umum', 'Tender Terbatas', 'Seleksi Terbatas') THEN 'Tender'
  2806.                     ELSE 'Lainnya'
  2807.                 END;";
  2808.         $stmt $connection->prepare($sql);
  2809.         $stmt->execute();
  2810.         $result $stmt->fetchAll();
  2811.         return $result;
  2812.     }
  2813.     public function getRangeNilaiPk($table$kolom_periode$tgl_awal$tgl_akhir$tipe_tahun$tahun$sumber_dana)
  2814.     {
  2815.         $connection $this->getDoctrine()->getConnection();
  2816.         $periode_filter =  ($tipe_tahun == 1) ? "tahun_anggaran = '$tahun'" "$kolom_periode BETWEEN '$tgl_awal' AND '$tgl_akhir'";
  2817.         $sql "SELECT
  2818.                 CASE
  2819.                     WHEN total_nilai_hasil BETWEEN 1 AND 50000000 THEN '≤ 50 JT'
  2820.                 WHEN total_nilai_hasil BETWEEN 50000001 AND 200000000 THEN '> 50-200 JT'
  2821.                 ELSE '> 200 JT'
  2822.                 END AS range_nilai,
  2823.                 COUNT(DISTINCT no_pk) AS jumlah_pk
  2824.                 FROM $table
  2825.                 WHERE status_pr IN ('approve', 'submit') 
  2826.                 AND total_nilai_hasil IS NOT NULL AND tahun_anggaran IS NOT NULL AND sumber_dana IS NOT NULL AND $kolom_periode IS NOT NULL
  2827.                 AND $periode_filter
  2828.                 GROUP BY
  2829.                 CASE
  2830.                     WHEN total_nilai_hasil BETWEEN 1 AND 50000000 THEN '≤ 50 JT'
  2831.                 WHEN total_nilai_hasil BETWEEN 50000001 AND 200000000 THEN '> 50-200 JT'
  2832.                 ELSE '> 200 JT'
  2833.                 END
  2834.                 ORDER BY MIN(total_nilai_hasil);";
  2835.         $stmt $connection->prepare($sql);
  2836.         $stmt->execute();
  2837.         $result $stmt->fetchAll();
  2838.         return $result;
  2839.     }
  2840.     public function getKategoriPlant()
  2841.     {
  2842.         $connection $this->getDoctrine()->getConnection();
  2843.         $sql "select kategori, count(*) as jumlah from m_plant GROUP BY kategori order by kategori desc";
  2844.         $stmt $connection->prepare($sql);
  2845.         $stmt->execute();
  2846.         $result $stmt->fetchAll();
  2847.         return $result;
  2848.     }
  2849.     public function getBulanList()
  2850.     {
  2851.         $bulanList = [
  2852.             '01' => 'Januari',
  2853.             '02' => 'Februari',
  2854.             '03' => 'Maret',
  2855.             '04' => 'April',
  2856.             '05' => 'Mei',
  2857.             '06' => 'Juni',
  2858.             '07' => 'Juli',
  2859.             '08' => 'Agustus',
  2860.             '09' => 'September',
  2861.             '10' => 'Oktober',
  2862.             '11' => 'November',
  2863.             '12' => 'Desember'
  2864.         ];
  2865.         return $bulanList;
  2866.     }
  2867. }