templates/backend/dashboard/index.html.twig line 1

Open in your IDE?
  1. {% extends "backend/base/base.html.twig" %}
  2. {% block body %}
  3.     <style>
  4.         /* Animasi fade-in */
  5.         .fade-in {
  6.             opacity: 0;
  7.             transition: opacity 0.5s ease-in-out;
  8.         }
  9.         .fade-in.show {
  10.             opacity: 1;
  11.         }
  12.     </style>
  13.     <div class="row">
  14.         {{ include('backend/dashboard/_filter.html.twig', {last_update: last_update, tipe_tahun: tipe_tahun, tahun: tahun, tanggal_awal: tanggal_awal, tanggal_akhir: tanggal_akhir, full:0}) }}
  15.         {{ include('backend/dashboard/_filter_perbandingan.html.twig', {bulan_list:bulan_list}) }}
  16.         
  17.         {{ include('backend/dashboard/_card1.html.twig', {ungroup: ungroup, res_dash:res_dash}) }}
  18.         <div class="col-12 col-lg-6 col-xxl-4 d-flex">
  19.             <div class="card rounded-4 w-100">
  20.                 <div class="card-body">
  21.                     <div class="card-header p-3 bg-transparent">
  22.                         <div class="d-flex align-items-center justify-content-between">
  23.                             <div class="">
  24.                                 <h5 class="mb-0">Waktu Proses</h5>
  25.                             </div>
  26.                         </div>
  27.                     </div>
  28.                     <div id="card_waktu_proses"></div>
  29.                 </div>
  30.             </div>
  31.         </div>
  32.         <div class="col-12 col-lg-6  col-xxl-4 d-flex flex-column d-flex align-items-stretch">
  33.             <div class="card rounded-4 w-100">
  34.                 <div class="card-body">
  35.                     <div class="d-flex align-items-center justify-content-between mb-3" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Saving Terhadap Anggaran diambil dari Total Anggaran - Total Realisasi Berdasarkan Filter Tahun Anggaran atau Tahun Kalender  ">
  36.                         <div>
  37.                             <h3 class="mb-0">{{ (res_dash['saving_thd_anggaran']/1000000000) | number_format(2, '.', ',') }}M</h3>
  38.                             <p class="mb-1">Saving Terhadap Anggaran</p>
  39.                         </div>
  40.                         {# <div class="wh-42 d-flex align-items-center justify-content-center rounded-circle bg-grd-danger">
  41.                                                     <span class="material-icons-outlined fs-5 text-white">shopping_cart</span>
  42.                                                 </div> #}
  43.                         <div class="sebelumnya d-none">
  44.                             <p
  45.                                 id="sebelumnya-content-anggaran" class="dash-lable d-flex align-items-center gap-1 rounded mb-0 fade-in"><!-- ajax isi di sini -->
  46.                             </p>
  47.                         </div>
  48.                     </div>
  49.                     <div class="mt-4" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Saving Terhadap Anggaran (%) diambil dari (Nilai Saving Terhadap Anggaran / Total Anggaran) * 100 Berdasarkan Filter Tahun Anggaran atau Tahun Kalender  ">
  50.                         <p class="mb-2 d-flex align-items-center justify-content-between">
  51.                             Saving(%) terhadap Anggaran
  52.                             <span>{{ res_dash['saving_thd_anggaran_persen'] }}%</span>
  53.                         </p>
  54.                         <div class="progress w-100" style="height: 6px;">
  55.                             <div class="progress-bar bg-grd-danger" style="width: {{ res_dash['saving_thd_anggaran_persen'] }}%"></div>
  56.                         </div>
  57.                     </div>
  58.                 </div>
  59.             </div>
  60.             <div class="card rounded-4 w-100 d-flex align-items-stretch">
  61.                 <div class="card-body">
  62.                     <div class="d-flex align-items-center justify-content-between mb-3" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Saving Terhadap HPS diambil dari Total HPS - Total Realisasi Berdasarkan Filter Tahun Anggaran atau Tahun Kalender  ">
  63.                         <div>
  64.                             <h3 class="mb-0">{{ (res_dash['saving_thd_hps']/1000000000) | number_format(2, '.', ',') }}M</h3>
  65.                             <p class="mb-1">Saving Terhadap HPS</p>
  66.                         </div>
  67.                         {# <div class="wh-42 d-flex align-items-center justify-content-center rounded-circle bg-grd-danger">
  68.                                                     <span class="material-icons-outlined fs-5 text-white">shopping_cart</span>
  69.                                                 </div> #}
  70.                         <div class="sebelumnya d-none">
  71.                             <p
  72.                                 id="sebelumnya-content-hps" class="dash-lable d-flex align-items-center gap-1 rounded mb-0 fade-in"><!-- ajax isi di sini -->
  73.                             </p>
  74.                         </div>
  75.                     </div>
  76.                     <div class="mt-4" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Saving Terhadap HPS (%) diambil dari (Nilai Saving Terhadap HPS / Total HPS) * 100 Berdasarkan Filter Tahun Anggaran atau Tahun Kalender">
  77.                         <p class="mb-2 d-flex align-items-center justify-content-between">
  78.                             Saving(%) terhadap HPS
  79.                             <span>{{ res_dash['saving_thd_hps_persen'] }}%</span>
  80.                         </p>
  81.                         <div class="progress w-100" style="height: 6px;">
  82.                             <div class="progress-bar bg-grd-danger" style="width: {{ res_dash['saving_thd_hps_persen'] }}%"></div>
  83.                         </div>
  84.                     </div>
  85.                 </div>
  86.             </div>
  87.         </div>
  88.         <div class="col-xl-12 col-xxl-8 col-xxl-4 col-xxl-2 d-flex align-items-stretch">
  89.             <div class="card w-100 rounded-4">
  90.                 <div class="card-body">
  91.                     <div class="d-flex flex-column gap-3">
  92.                         <div class="d-flex align-items-start justify-content-between">
  93.                             <div class="">
  94.                                 <h5 class="mb-0">Komposisi PK dan Metode Pemilihan</h5>
  95.                                 <h7 class="mb-0">Dihitung berdasarkan paket selesai</h7>
  96.                             </div>
  97.                         </div>
  98.                     </div>
  99.                     <div class="position-relative">
  100.                         <div class="piechart-legend">
  101.                             {% set colors = ['#ff6a00', '#98ec2d', '#3494e6', '#8e44ad', '#f1c40f'] %}
  102.                             {% set total = 0 %}
  103.                             {% for row in res_dash['range_nilai_pk'] %}
  104.                                 {% set total = total + row.jumlah_pk %}
  105.                             {% endfor %}
  106.                             Total
  107.                         </div>
  108.                         <div
  109.                             class="d-flex align-items-center justify-content-between gap-3">
  110.                             <!-- Bagian Donut Chart (Nomor 1) -->
  111.                             <div id="chart5" style="flex: 1; min-width: 200px;"></div>
  112.                             <!-- Bagian Progress List (Nomor 2) -->
  113.                             <div class="d-flex flex-column gap-3" style="flex: 0.7; font-size: 0.85rem;">
  114.                                 {% for row in res_dash['range_nilai_pk'] %}
  115.                                     {% set persen = total ? ((row.jumlah_pk / total) * 100)|round(0) : 0 %}
  116.                                     <div>
  117.                                         <div class="d-flex justify-content-between mb-1">
  118.                                             <span class="d-flex align-items-center gap-2">
  119.                                                 <span class="material-icons-outlined fs-6" style="color: {{ colors[loop.index0] ?? '#000' }}">
  120.                                                     fiber_manual_record
  121.                                                 </span>
  122.                                                 {{ row.range_nilai }}
  123.                                             </span>
  124.                                             <span>{{ persen }}%</span>
  125.                                         </div>
  126.                                         <div class="progress" style="height: 6px;">
  127.                                             <div class="progress-bar" role="progressbar" style="width: {{ persen }}%; background-color: {{ colors[loop.index0] ?? '#000' }}" aria-valuenow="{{ persen }}" aria-valuemin="0" aria-valuemax="100"></div>
  128.                                         </div>
  129.                                     </div>
  130.                                 {% endfor %}
  131.                             </div>
  132.                         </div>
  133.                         {% set tender = res_dash['metode_tender'] %}
  134.                         {% set pl = res_dash['metode_pl'] %}
  135.                         {% set total = tender + pl %}
  136.                         {% set nilai_tender = res_dash['nilai_metode_tender'] + 0 %}
  137.                         {% set nilai_pl = res_dash['nilai_metode_pl'] + 0 %}
  138.                         {% set total_nilai = nilai_tender + nilai_pl %}
  139.                         <div class="d-flex flex-column flex-lg-row align-items-start justify-content-around border p-3 rounded-4 mt-3 gap-3">
  140.                             <!-- Tender -->
  141.                             <div class="d-flex align-items-center gap-4">
  142.                                 <div>
  143.                                     <p class="mb-0 data-attributes">
  144.                                         <span data-peity='{ "fill": ["#2196f3", "rgb(255 255 255 / 12%)"], "innerRadius": 32, "radius": 40 }'>{{tender}}/{{total}}</span>
  145.                                     </p>
  146.                                 </div>
  147.                                 <div>
  148.                                     <p class="mb-1 fs-6 fw-bold">Tender</p>
  149.                                     <h2 class="mb-0" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Jumlah PK diambil dari Kolom no_pk Berdasarkan Filter status_pr (approve,submit) Tahun Anggaran atau Tahun Kalender(tgl_approval_sppbj)">{{ tender }}</h2>
  150.                                     <p class="mb-0">
  151.                                         <span class="text-success me-2 fw-medium">
  152.                                             {{  total > 0 ? (tender / total * 100)|number_format(1, '.', ',') : 0 }}%
  153.                                         </span>
  154.                                         <span data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Paket Pengadaan diambil dari Kolom Total Nilai Berdasarkan Filter status_pr (approve,submit) Tahun Anggaran atau Tahun Kalender(tgl_approval_sppbj)">
  155.                                             {{(nilai_tender / 1000000000)|number_format(2, '.', ',')}}M
  156.                                         </span>
  157.                                     </p>
  158.                                 </div>
  159.                             </div>
  160.                             <div class="vr"></div>
  161.                             <!-- PL -->
  162.                             <div class="d-flex align-items-center gap-4">
  163.                                 <div>
  164.                                     <p class="mb-0 data-attributes">
  165.                                         <span data-peity='{ "fill": ["#ffd200", "rgb(255 255 255 / 12%)"], "innerRadius": 32, "radius": 40 }'>{{pl}}/{{total}}</span>
  166.                                     </p>
  167.                                 </div>
  168.                                 <div>
  169.                                     <p class="mb-1 fs-6 fw-bold">PL</p>
  170.                                     <h2 class="mb-0" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Jumlah PK diambil dari Kolom no_pk Berdasarkan Filter status_pr (approve,submit) Tahun Anggaran atau Tahun Kalender(tgl_approval_sppbj)">{{ pl }}</h2>
  171.                                     <p class="mb-0">
  172.                                         <span class="text-success me-2 fw-medium">
  173.                                             {{  total > 0 ? (pl / total * 100)|number_format(1, '.', ',') : 0 }}%
  174.                                         </span>
  175.                                         <span data-bs-toggle="tooltip" data-bs-placement="top" data-bs-theme="dark" title="Nilai Paket Pengadaan diambil dari Kolom Total Nilai Berdasarkan Filter status_pr (approve,submit) Tahun Anggaran atau Tahun Kalender(tgl_approval_sppbj)">
  176.                                             {{ (nilai_pl / 1000000000)|number_format(2, '.', ',') }}M
  177.                                         </span>
  178.                                     </p>
  179.                                 </div>
  180.                             </div>
  181.                         </div>
  182.                     </div>
  183.                 </div>
  184.             </div>
  185.         </div>
  186.         <div class="col-xl-12 col-xxl-6 col-xxl-4 col-xs-4 col-xxl-2 d-flex align-items-stretch">
  187.             <div class="card w-100 rounded-4">
  188.                 <div class="card-body">
  189.                     <div class="d-flex align-items-start justify-content-between mb-1">
  190.                         <div class="">
  191.                             <h5 class="mb-0">Nilai Realisasi dan Jumlah PK</h5>
  192.                             <p class="mb-0">Kantor Pusat dan Pabrik Gula</p>
  193.                         </div>
  194.                         
  195.                     </div>
  196.                     {# <div class="chart-container2"> #}
  197.                         <div id="chart_realisai_pg"></div>
  198.                     {# </div> #}
  199.                     {# <div class="text-center"> #}
  200.                         <p class="mb-0 font-12">hitung Jumlah PK dan Realisasi Kantor Pusat(HO) dan Pabrik Gula(PG) berdasarkan Tahun anggaran atau Tahun Kalender (Sesuai Filter)</p>
  201.                     {# </div> #}
  202.                 </div>
  203.             </div>
  204.         </div>
  205.         <div class="col-xl-12 col-xxl-6 col-xxl-4  col-xxl-2 d-flex align-items-stretch">
  206.             <div class="card w-100 rounded-4">
  207.                 <div class="card-body">
  208.                     <div class="d-flex align-items-start justify-content-between mb-1">
  209.                         <div class="">
  210.                             <h5 class="mb-0">Nilai Realisasi dan Jumlah PK</h5>
  211.                             <p class="mb-0">MKSO</p>
  212.                         </div>
  213.                         
  214.                     </div>
  215.                     <div id="chart_realisai_mkso"></div>
  216.                 {# {{ include('backend/dashboard/_chart_realisasi_efisiensi.html.twig', {res_kotak_bawah:res_kotak_bawah,group:group}) }} #}
  217.                     <p>hitung Jumlah PK dan Realisasi Kebun (MKSO) berdasarkan Tahun anggaran atau Tahun Kalender (Sesuai Filter)</p>
  218.                 </div>
  219.             </div>
  220.         </div>
  221.         <div class="col-lg-12 col-xxl-12 d-flex align-items-stretch">
  222.             <div class="card w-100 rounded-4">
  223.                 <div class="card-body">
  224.                 <div class="card-header p-3 bg-transparent">
  225.                     <div class="d-flex align-items-center justify-content-between">
  226.                         <div class="">
  227.                             <h5 class="mb-0">Realisasi dan Saving</h5>
  228.                         </div>
  229.                     </div>
  230.                 </div>
  231.                 <div id="table_realisasi"></div>
  232.                 {# {{ include('backend/dashboard/_table.html.twig', {res_kotak_tabel: res_kotak_tabel}) }} #}
  233.             </div>
  234.             </div>
  235.         </div>
  236.     </div>
  237. </div>
  238. <!--end overlay-->
  239. <script>
  240.         $(document).ready(function () {
  241. // chart 5
  242. var series = [{% for row in res_dash['range_nilai_pk'] %}{{ row.jumlah_pk }}{% if not loop.last %},{% endif %}{% endfor %}];
  243. var labels = [{% for row in res_dash['range_nilai_pk'] %}"{{ row.range_nilai }}"{% if not loop.last %},{% endif %}{% endfor %}];
  244. var colors = [{% for c in colors %}"{{ c }}"{% if not loop.last %},{% endif %}{% endfor %}];
  245. var options = {
  246. series: series,
  247. chart: {
  248. height: 290,
  249. type: 'donut'
  250. },
  251. labels: labels,
  252. colors: colors,
  253. legend: {
  254. show: false // ❌ matikan legend bawaan
  255. },
  256. dataLabels: {
  257. enabled: false // ❌ matikan label di luar slice
  258. },
  259. plotOptions: {
  260. pie: {
  261. donut: {
  262. size: "85%",
  263. labels: {
  264. show: true,
  265. name: {
  266. show: false
  267. }, // ❌ jangan tampilkan nama di tengah
  268. value: {
  269. show: true
  270. }, // ✅ hanya angka total/series
  271. total: {
  272. show: true,
  273. // label: 'Total',
  274. fontSize: '16px',
  275. color: '#fff',
  276. formatter: function (w) {
  277. return w.globals.seriesTotals.reduce((a, b) => a + b, 0);
  278. }
  279. }
  280. }
  281. }
  282. }
  283. }
  284. };
  285. var chart = new ApexCharts(document.querySelector("#chart5"), options);
  286. chart.render();
  287. // chart 6
  288. var seriesData6 = [{{ res_dash['metode_pl'] }}, {{ res_dash['metode_tender'] }}];
  289. var total6 = seriesData6.reduce((a, b) => a + b, 0);
  290. var options6 = {
  291. series: seriesData6,
  292. chart: {
  293. height: 290,
  294. type: 'donut'
  295. },
  296. labels: [
  297. "PL", "Tender"
  298. ],
  299. legend: {
  300. show: false
  301. },
  302. fill: {
  303. type: 'gradient',
  304. gradient: {
  305. shade: 'dark',
  306. gradientToColors: [
  307. '#ee0979', '#17ad37'
  308. ],
  309. shadeIntensity: 1,
  310. type: 'vertical',
  311. opacityFrom: 1,
  312. opacityTo: 1
  313. }
  314. },
  315. colors: [
  316. "#ff6a00", "#98ec2d"
  317. ],
  318. dataLabels: {
  319. enabled: false
  320. },
  321. plotOptions: {
  322. pie: {
  323. donut: {
  324. size: "85%",
  325. labels: {
  326. show: true,
  327. total: {
  328. show: true,
  329. label: 'Total',
  330. formatter: function () {
  331. return total6;
  332. }
  333. },
  334. name: {
  335. show: false
  336. },
  337. value: {
  338. show: false
  339. }
  340. }
  341. }
  342. }
  343. }
  344. };
  345. var chart6 = new ApexCharts(document.querySelector("#chart6"), options6);
  346. chart6.render();
  347. // === isi otomatis persen bawah ===
  348. document.addEventListener("DOMContentLoaded", function () {
  349. var plPercent = total6 ? ((seriesData6[0] / total6) * 100).toFixed(0) : 0;
  350. var tenderPercent = total6 ? ((seriesData6[1] / total6) * 100).toFixed(0) : 0;
  351. document.querySelector("#legend6-pl").innerText = plPercent + "%";
  352. document.querySelector("#legend6-tender").innerText = tenderPercent + "%";
  353. document.querySelector("#bar6-pl").style.width = plPercent + "%";
  354. document.querySelector("#bar6-tender").style.width = tenderPercent + "%";
  355. });
  356. });
  357. //table realisasi
  358. $(document).ready(function() {
  359.         let tahun        = "{{ tahun }}"; 
  360.         let tanggal_awal = "{{ tanggal_awal }}"; 
  361.         let tanggal_akhir= "{{ tanggal_akhir }}"; 
  362.         let sumber_dana  = "{{ sumber_dana }}"; 
  363.         let tipe_tahun   = "{{ tipe_tahun }}"; 
  364.         // table
  365.         $.ajax({
  366.             url: "{{ path('dashboard_table_realisasi') }}",
  367.             method: "POST",
  368.             data: {
  369.                 tahun: tahun,
  370.                 tanggal_awal: tanggal_awal,
  371.                 tanggal_akhir: tanggal_akhir,
  372.                 sumber_dana: sumber_dana,
  373.                 tipe_tahun: tipe_tahun
  374.             },
  375.             beforeSend: function() {
  376.                 // tampilkan loading
  377.                 $("#table_realisasi").html('<div class="text-center p-3"><div class="spinner-border text-primary" role="status"></div><br/>Loading...</div>');
  378.             },
  379.             success: function(html) {
  380.                 $("#table_realisasi").html(html);
  381.             }
  382.         });
  383.         // load pertama kali
  384.         $.ajax({
  385.             url: "{{ path('dashboard_chart_realisasi_efisiensi_pg') }}",
  386.             method: "POST",
  387.             data: {
  388.                 tahun: tahun,
  389.                 tanggal_awal: tanggal_awal,
  390.                 tanggal_akhir: tanggal_akhir,
  391.                 sumber_dana: sumber_dana,
  392.                 tipe_tahun: tipe_tahun
  393.             },
  394.             beforeSend: function() {
  395.                 // tampilkan loading
  396.                 $("#chart_realisai_pg").html('<div class="text-center p-3"><div class="spinner-border text-primary" role="status"></div><br/>Loading...</div>');
  397.             },
  398.             success: function(html) {
  399.                 $("#chart_realisai_pg").html(html);
  400.             }
  401.         });
  402.         // load pertama kali
  403.         $.ajax({
  404.             url: "{{ path('dashboard_chart_realisasi_efisiensi_mkso') }}",
  405.             method: "POST",
  406.             data: {
  407.                 tahun: tahun,
  408.                 tanggal_awal: tanggal_awal,
  409.                 tanggal_akhir: tanggal_akhir,
  410.                 sumber_dana: sumber_dana,
  411.                 tipe_tahun: tipe_tahun
  412.             },
  413.             beforeSend: function() {
  414.                 // tampilkan loading
  415.                 $("#chart_realisai_mkso").html('<div class="text-center p-3"><div class="spinner-border text-primary" role="status"></div><br/>Loading...</div>');
  416.             },
  417.             success: function(html) {
  418.                 $("#chart_realisai_mkso").html(html);
  419.             }
  420.         });
  421.         // load card_waktu_proses
  422.         $.ajax({
  423.             url: "{{ path('dashboard_card_waktu_proses') }}",
  424.             method: "POST",
  425.             data: {
  426.                 tahun: tahun,
  427.                 tanggal_awal: tanggal_awal,
  428.                 tanggal_akhir: tanggal_akhir,
  429.                 sumber_dana: sumber_dana,
  430.                 tipe_tahun: tipe_tahun
  431.             },
  432.             beforeSend: function() {
  433.                 // tampilkan loading
  434.                 $("#card_waktu_proses").html('<div class="text-center p-3"><div class="spinner-border text-primary" role="status"></div><br/>Loading...</div>');
  435.             },
  436.             success: function(html) {
  437.                 $("#card_waktu_proses").html(html);
  438.             }
  439.         });
  440.     });
  441.     </script>
  442.     <script>
  443.         $(function() {
  444.     let tahun        = "{{ tahun }}"; 
  445.     let tanggal_awal = "{{ tanggal_awal }}"; 
  446.     let tanggal_akhir= "{{ tanggal_akhir }}"; 
  447.     let sumber_dana  = "{{ sumber_dana }}"; 
  448.     let tipe_tahun   = "{{ tipe_tahun }}"; 
  449.     $("#flexSwitchCheckChecked").on("change", function() {
  450.         if ($(this).is(":checked")) {
  451.             // tampilkan div dan spinner
  452.             $(".filter_komparasi").removeClass("d-none");
  453.             $(".sebelumnya").removeClass("d-none");
  454.             $("#sebelumnya-content-anggaran")
  455.                 .attr("class", "dash-lable d-flex align-items-center gap-1 rounded mb-0")
  456.                 .html('<div class="spinner-border spinner-border-sm text-primary" role="status"></div>');
  457.             $("#sebelumnya-content-hps")
  458.                 .attr("class", "dash-lable d-flex align-items-center gap-1 rounded mb-0")
  459.                 .html('<div class="spinner-border spinner-border-sm text-primary" role="status"></div>');
  460.             $.ajax({
  461.                 url: "{{ path('dashboard_chart_perbandingan') }}",
  462.                 type: "POST",
  463.                 dataType: "json",
  464.                 data: {
  465.                     tahun: tahun,
  466.                     tanggal_awal: tanggal_awal,
  467.                     tanggal_akhir: tanggal_akhir,
  468.                     sumber_dana: sumber_dana,
  469.                     tipe_tahun: tipe_tahun
  470.                 },
  471.                 success: function(data) {
  472.                     let current = parseFloat(data.saving_thd_anggaran) / 1000000000;
  473.                     let last    = parseFloat(data.saving_thd_anggaran_sebelumnya) / 1000000000;
  474.                     let current_hps = parseFloat(data.saving_thd_hps) / 1000000000;
  475.                     let last_hps    = parseFloat(data.saving_thd_hps_sebelumnya) / 1000000000;
  476.                     let diff    = current - last;
  477.                     // format angka 2 digit
  478.                     // let formattedDiff = new Intl.NumberFormat('id-ID', {
  479.                     //     minimumFractionDigits: 2,
  480.                     //     maximumFractionDigits: 2
  481.                     // }).format(Math.abs(diff));
  482.                     let formattedDiff = new Intl.NumberFormat('id-ID', {
  483.                         minimumFractionDigits: 2,
  484.                         maximumFractionDigits: 2
  485.                     }).format(Math.abs(last));
  486.                     let formattedHps = new Intl.NumberFormat('id-ID', {
  487.                         minimumFractionDigits: 2,
  488.                         maximumFractionDigits: 2
  489.                     }).format(Math.abs(last_hps));
  490.                     // ikon & warna berdasarkan selisih
  491.                     // let icon = diff >= 0 ? "arrow_upward" : "arrow_downward";
  492.                     // let colorClass = diff >= 0 
  493.                     //     ? "text-success bg-success bg-opacity-10"
  494.                     //     : "text-danger bg-danger bg-opacity-10";
  495.                     let icon = last > current ? "arrow_upward" : "arrow_downward";
  496.                     let colorClass = last > current 
  497.                         ? "text-success bg-success bg-opacity-10"
  498.                         : "text-danger bg-danger bg-opacity-10";
  499.                     let icon_hps = last_hps > current_hps ? "arrow_upward" : "arrow_downward";
  500.                     let colorClass_hps = last_hps > current_hps 
  501.                         ? "text-success bg-success bg-opacity-10"
  502.                         : "text-danger bg-danger bg-opacity-10";
  503.                     $("#sebelumnya-content-anggaran")
  504.                         .attr("class", "dash-lable d-flex align-items-center gap-1 rounded mb-0 " + colorClass)
  505.                         .html('<span class="material-icons-outlined fs-6">' + icon + '</span>' + formattedDiff + ' M');
  506.                     $("#sebelumnya-content-hps")
  507.                         .attr("class", "dash-lable d-flex align-items-center gap-1 rounded mb-0 " + colorClass_hps)
  508.                         .html('<span class="material-icons-outlined fs-6">' + icon_hps + '</span>' + formattedHps + ' M');
  509.                 },
  510.                 error: function(xhr) {
  511.                     $("#sebelumnya-content-anggaran").html('<span class="text-danger">Error load data</span>');
  512.                     console.error(xhr.responseText);
  513.                     $("#sebelumnya-content-hps").html('<span class="text-danger">Error load data</span>');
  514.                     console.error(xhr.responseText);
  515.                 }
  516.             });
  517.         } else {
  518.             $(".filter_komparasi").addClass("d-none");
  519.             $(".sebelumnya").addClass("d-none");
  520.             $("#sebelumnya-content-anggaran").html("");
  521.             $("#sebelumnya-content-hps").html("");
  522.         }
  523.     });
  524. });
  525. </script>
  526. {% endblock %}