Advertisement
nasrulkurniawan

prosentase

May 4th, 2024
890
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.57 KB | None | 0 0
  1. public function hitungTriwulan($perspective, $indikator, $iku, $instansi, $unor, $unitkerja, $tahun, $bulan, $inputnilai)
  2.     {
  3.         $decodedIds = [
  4.             Hashids::decode($perspective)[0] ?? null,
  5.             Hashids::decode($indikator)[0] ?? null,
  6.             Hashids::decode($iku)[0] ?? null,
  7.             Hashids::decode($instansi)[0] ?? null,
  8.             Hashids::decode($unor)[0] ?? null,
  9.             Hashids::decode($unitkerja)[0] ?? null
  10.         ];
  11.         list($iddecodeprs, $iddecodeind, $iddecodeiku, $iddecodei, $iddecodeun, $iddecodeuk) = $decodedIds;
  12.  
  13.         // #01 - Mapping bulan ke triwulan dan semester
  14.         $bulanTriwulan = [];
  15.         $bulanSemester = [];
  16.         for ($i = 1; $i <= 12; $i += 3) {
  17.             if ($bulan >= sprintf('%02d', $i) && $bulan <= sprintf('%02d', $i + 2)) {
  18.                 $bulanTriwulan = [sprintf('%02d', $i), sprintf('%02d', $i + 1), sprintf('%02d', $i + 2)];
  19.                 $bulanSemester = ($i <= 6) ? ['01', '02', '03', '04', '05', '06'] : ['07', '08', '09', '10', '11', '12'];
  20.                 break;
  21.             }
  22.         }
  23.  
  24.         $kinerjas = Kinerjaorganisasi::where('mkoperspective_id', $iddecodeprs)
  25.             ->where('mkoindikator_id', $iddecodeind)
  26.             ->where('mkoiku_id', $iddecodeiku)
  27.             ->where('instansi_id', $iddecodei)
  28.             ->where('unor_id', $iddecodeuk)
  29.             ->where('tahun', $tahun)
  30.             ->whereIn('bulan', $bulanTriwulan)
  31.             ->get()
  32.             ->keyBy('bulan');
  33.  
  34.         $nilaiTriwulan = 0;
  35.         foreach ($bulanTriwulan as $bln) {
  36.             $nilaiBulan = ($bulan == $bln) ? $inputnilai : ($kinerjas->get($bln)->nilai ?? 0);
  37.             $nilaiTriwulan += $nilaiBulan;
  38.         }
  39.  
  40.         $target = Mkorencanatarget::where([
  41.             ['instansi_id', $iddecodei],
  42.             ['unor_id', $iddecodeun],
  43.             ['unitkerja_id', $iddecodeuk],
  44.             ['mkoperspective_id', $iddecodeprs],
  45.             ['mkoindikator_id', $iddecodeind],
  46.             ['mkoiku_id', $iddecodeiku],
  47.             ['tahun', $tahun]
  48.         ])->first();
  49.  
  50.         $triwulanTargetField = $target->{"tw" . ceil(intval($bulan) / 3)};
  51.  
  52.         $prosentaseTriwulan = ($nilaiTriwulan / $triwulanTargetField) * 100;
  53.  
  54.         // #02 - Menentukan bulan-bulan untuk perhitungan akumulasi target sampai bulan yang dipilih
  55.         $lastMonthOfSelectedQuarter = end($bulanTriwulan);
  56.         $bulanSampaiTriwulanIni = range(1, intval($lastMonthOfSelectedQuarter));
  57.  
  58.         // Format bulan menjadi '01', '02', ..., '12'
  59.         $bulanSampaiTriwulanIni = array_map(function($month) {
  60.             return sprintf('%02d', $month);
  61.         }, $bulanSampaiTriwulanIni);
  62.  
  63.         // Load kinerja dari Januari hingga bulan terakhir di triwulan yang dipilih
  64.         $kinerjasSampaiTriwulanIni = Kinerjaorganisasi::where('mkoperspective_id', $iddecodeprs)
  65.             ->where('mkoindikator_id', $iddecodeind)
  66.             ->where('mkoiku_id', $iddecodeiku)
  67.             ->where('instansi_id', $iddecodei)
  68.             ->where('unor_id', $iddecodeuk)
  69.             ->where('tahun', $tahun)
  70.             ->whereIn('bulan', $bulanSampaiTriwulanIni)
  71.             ->get()
  72.             ->keyBy('bulan');
  73.  
  74.         // Menghitung nilai total dari Januari hingga bulan terakhir di triwulan yang dipilih
  75.         $nilaiTotalSampaiTriwulanIni = 0;
  76.         foreach ($bulanSampaiTriwulanIni as $bln) {
  77.             $nilTotalSampaiTriwulanIni = ($bulan == $bln) ? $inputnilai : ($kinerjasSampaiTriwulanIni->get($bln)->nilai ?? 0);
  78.             $nilaiTotalSampaiTriwulanIni += $nilTotalSampaiTriwulanIni;
  79.         }
  80.  
  81.         // Menghitung prosentase target dari Januari hingga bulan terakhir di triwulan yang dipilih
  82.         $triwulanTargetSampaiTriwulanIni = 0;
  83.         for ($i = 1; $i <= ceil(intval($bulan) / 3); $i++) {
  84.             $triwulanTargetSampaiTriwulanIni += $target->{"tw$i"};
  85.         }
  86.         $prosentaseTargetSampaiTriwulanIni = ($nilaiTotalSampaiTriwulanIni / $triwulanTargetSampaiTriwulanIni) * 100;
  87.  
  88.         // #03 - Menghitung nilai, target dan prosentasi semester
  89.         $semesterIndex = (intval($bulan) <= 6) ? 'sem1' : 'sem2';
  90.         $semesterTarget = floatval($target->{$semesterIndex} ?? 0);
  91.         $nilaiSemester = 0;
  92.         foreach ($bulanSemester as $bln) {
  93.             $nilaiSemester += ($bulan == $bln) ? $inputnilai : ($kinerjas->get($bln)->nilai ?? 0);
  94.         }
  95.         $prosentaseSemester = $semesterTarget ? ($nilaiSemester / $semesterTarget) * 100 : 0; // Menangani pembagian dengan nol
  96.  
  97.         // #04 - Menghitung nilai, target dan prosentase sampai semester ini
  98.  
  99.         // Menentukan bulan-bulan untuk perhitungan akumulasi target sampai semester yang dipilih
  100.         $lastMonthOfSelectedSemester = end($bulanSemester);
  101.         $bulanSampaiSemesterIni = range(1, intval($lastMonthOfSelectedSemester));
  102.  
  103.         // Format bulan menjadi '01', '02', ..., '12'
  104.         $bulanSampaiSemesterIni = array_map(function($month) {
  105.             return sprintf('%02d', $month);
  106.         }, $bulanSampaiSemesterIni);
  107.  
  108.         // Load kinerja dari Januari hingga bulan terakhir di semester yang dipilih
  109.         $kinerjasSampaiSemesterIni = Kinerjaorganisasi::where('mkoperspective_id', $iddecodeprs)
  110.             ->where('mkoindikator_id', $iddecodeind)
  111.             ->where('mkoiku_id', $iddecodeiku)
  112.             ->where('instansi_id', $iddecodei)
  113.             ->where('unor_id', $iddecodeuk)
  114.             ->where('tahun', $tahun)
  115.             ->whereIn('bulan', $bulanSampaiSemesterIni)
  116.             ->get()
  117.             ->keyBy('bulan');
  118.  
  119.         // Menghitung nilai total dari Januari hingga bulan terakhir di semester yang dipilih
  120.         $nilaiTotalSampaiSemesterIni = 0;
  121.         foreach ($bulanSampaiSemesterIni as $bln) {
  122.             $nilaiBulanSampaiSemesterIni = ($bulan == $bln) ? $inputnilai : ($kinerjasSampaiSemesterIni->get($bln)->nilai ?? 0);
  123.             $nilaiTotalSampaiSemesterIni += $nilaiBulanSampaiSemesterIni;
  124.         }
  125.  
  126.         // Menghitung target dan prosentase sampai semester ini
  127.         $semesterTargetField = $target->{$semesterIndex}; // 'sem1' atau 'sem2' tergantung bulan
  128.         $prosentaseTargetSampaiSemesterIni = ($nilaiTotalSampaiSemesterIni / $semesterTargetField) * 100;
  129.  
  130.  
  131.         // #05 - Menghitung nilai total tahunan dan prosentase tahunan
  132.         $nilaiTotalTahunan = 0;
  133.         for ($i = 1; $i <= 12; $i++) {
  134.             $bln = sprintf('%02d', $i);
  135.             $nilaiBulan = ($bulan == $bln) ? $inputnilai : ($kinerjas->get($bln)->nilai ?? 0);
  136.             $nilaiTotalTahunan += $nilaiBulan;
  137.         }
  138.  
  139.         $targetTahunan = floatval($target->tahunan); // Mengambil target tahunan dari database
  140.         $prosentaseTahunan = ($nilaiTotalTahunan / $targetTahunan) * 100; // Menghitung prosentase terhadap target tahunan
  141.  
  142.  
  143.         return response()->json([
  144.             'nilaiTriwulan' => $nilaiTriwulan,
  145.             'targetTriwulan' => $triwulanTargetField,
  146.             'targetTriwulanSampaiTriwulanIni' => $triwulanTargetSampaiTriwulanIni,
  147.             'prosentaseTriwulan' => round($prosentaseTriwulan, 2),
  148.             'prosentaseSampaiTriwulanIni' => round($prosentaseTargetSampaiTriwulanIni, 2),
  149.             'nilaiSemester' => $nilaiSemester,
  150.             'targetSemester' => $semesterTarget,
  151.             'prosentaseSemester' => round($prosentaseSemester, 2),
  152.             'nilaiTotalSampaiSemesterIni' => $nilaiTotalSampaiSemesterIni,
  153.             'prosentaseTargetSampaiSemesterIni' => round($prosentaseTargetSampaiSemesterIni, 2),
  154.             'targetTahunan' => $targetTahunan,
  155.             'prosentaseTahunan' => round($prosentaseTahunan, 2)
  156.         ]);
  157.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement