Penyederhanaan Kode Konversi Bulanan dan Triwulan PHP Laravel ​

mungkin tidak terlalu mendalami matematik cuman beberapa berprogram selain butuh logika juga matematika tidak bisa di pungkiri, walau hanya di php yang kurang menarik tapi apa yang menarik adalah memahami dan problem solving menggunakan kebodohan alami otak,

sebenarnya sih dari awal bekerja di tahun 2018an saya sering menemukan metode perhitungan nilai yang biasanya tergantung dari kebutuhan dan ini biasanya sifatnya berubah-ubah, bisa jadi bulanan bisa jadi triwulan, dan semester.

dalam contoh kode berikut menghitung triwulan,

php
if($tw == 1) {
    $bku->where('tanggal', '>=', $register->tahun . '-01-01');
    $bku->where('tanggal', '<', $register->tahun . '-04-01');
} else if($tw == 2) {
    $bku->where('tanggal', '>=', $register->tahun . '-04-01');
    $bku->where('tanggal', '<', $register->tahun . '-07-01');
} else if($tw == 3) {
    $bku->where('tanggal', '>=', $register->tahun . '-07-01');
    $bku->where('tanggal', '<', $register->tahun . '-10-01');
} else if($tw == 4) {
    $bku->where('tanggal', '>=', $register->tahun . '-10-01');
    $bku->where('tanggal', '<=', $register->tahun . '-12-31');
}

yang sebenarnya adalah permintaan fitur dimana metode perhitungan awalnya berupa bulanan $bku->where(DB::raw('LEFT(tanggal::text, 7)'), $register->tahun . '-' . substr(str_replace('b', '0', $register->periode), 0, 2));

dalam record data yang metodenya berubah saya akan menyimpan informasi kolom dengan varchar maka secara fleksibel bisa memuat b1, b2, b3 untuk bulanan kemudian s1, s2, untuk semester, dan kau tebak tw1, tw2 untuk triwulan

dari potongan kode triwulan dengan if diatas bisa menghabiskan 13 line of code (LOC), cepat efektif dan dapat di pahami, tapi cara lebih efisien tanpa harus membuat 13 line copas yaitu perhitungan, rumusnya bagaimana yaitu dengan logika

ada runtutan angka yang berulang-ulang yaitu

  • tw1: bulan 1 - bulan 3
  • tw2: bulan 4 - bulan 6
  • tw3: bulan 7 - bulan 9
  • tw4: bulan 10 - bulan 12

maka dapat disimpulkan variabel yang nilainya berubah adalah dalam tw yaitu 1, 2, 3, 4, dan nilai dari parameter variabel tw tadi adalah bulan[0] : 1, 4, 7, 10, dan bulan[1]: 3, 6, 9, 12

angka tw[0] = 1 menjadi bulan[0][0] = 1 mungkin tw[0] * 1 = bulan[0] tapi tidak mungkin menjadi bulan[1] = 4 jika tw[1] * 1 dan begitu seterusnya, hanya saja bulan[1] sedikit menjanjikan, tw[0] * 3 akan menjadi 1 * 3 = 3 = bulan[1][1] dan berikutnya tw[1] * 3 akan menjadi 2 * 3 = 6 = bulan[2][1] dan seterusnya cukup sesuai, maka kita akan menggunakan ini,

mengingat hasil yang dibutuhkan bukan hanya bulan[*][1] tapi juga bulan[*][0], ada sedikit kemiripan yaitu cukup - 2 saja, maka dapat di sederhanakan menjadi:

php
$twf = $tw * 3 - 2;
$twt = $tw * 3;
$bku->where('tanggal', '>=', $register->tahun . '-' . $twf . '-01');
$bku->where('tanggal', '<', $register->tahun . '-' . $twt . '-01');

atau menjadi 3 line dengan konversi kolom periode

php
$bulan = (int)substr(str_replace('tw', '0', $register->periode), 0, 2) * 3;
$bku->where('tanggal', '>=', $register->tahun . '-' . $bulan - 2 . '-01');
$bku->where('tanggal', '<', $register->tahun . '-' . $bulan . '-01');

dan perbaikan sedikit bug ketika bulan 12:

php
$bku->where('tanggal', $bulan == 12 ? '<=' : '<', $register->tahun . '-' . $bulan . ($bulan == 12 ? '-31' : '-01'));

mungkin cukup demikian, seperti contoh potongan kode ini saya buat dua tahun lalu

php
$raktw = $rak->transform(function($r) use($dokumen) {
  $bulan_pengajuan = substr($dokumen->tanggal, 5, 2) ?: $dokumen->created_at->format('m');
  if(in_array($bulan_pengajuan, ['01', '02', '03'])) {
      $r->rak = $r->jan + $r->feb + $r->mar;
  }
  if(in_array($bulan_pengajuan, ['04', '05', '06'])) {
      $r->rak = $r->jan + $r->feb + $r->mar + $r->apr + $r->mei + $r->jun;
  }
  if(in_array($bulan_pengajuan, ['07', '08', '09'])) {
      $r->rak = $r->jan + $r->feb + $r->mar + $r->apr + $r->mei + $r->jun + $r->jul + $r->agu + $r->sep;
  }
  if(in_array($bulan_pengajuan, ['10', '11', '12'])) {
      $r->rak = $r->jan + $r->feb + $r->mar + $r->apr + $r->mei + $r->jun + $r->jul + $r->agu + $r->sep + $r->okt + $r->nov + $r->des;
  }
  return $r;
});

pertanyaan, mengapa perlu penyederhanaan? sebenernya kalau kamu dibayar dengan banyaknya jumlah line of code mungkin bisa menghindari hal ini, hanya saja beberapa bahasa pemrograman seperti golang, python memberikan kemudahan dari tooling seperti library atau fungsi bawaan dari pada menulis fungsi yang panjang?

secara pribadi sih dalam pengalaman menjadi programmer frontend ketika menggunakan nodejs kita butuh banyak sekali librari yang tanpa sadar folder node_modules menjadi folder terbesar di komputer anda, untuk menjawab pertanyaan tadi, saya tidak punya jawaban pasti hanya banyak yang bisa kita bahas untuk kedepan hari.

Dipublikasikan: 25/4/2026