From 2589e0cf7c80f8f35f842d09dc1dd292db046a95 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Thu, 18 Jan 2024 14:29:45 +0800 Subject: [PATCH] Reduce queries when query for transaction table by saving 1 result into variable. The variable be use instead --- app/Services/Reports/KawalanStokService.php | 137 +++++++----------- tests/KawalanStokServiceTest.php | 153 ++++++++++++++++++++ 2 files changed, 203 insertions(+), 87 deletions(-) create mode 100644 tests/KawalanStokServiceTest.php diff --git a/app/Services/Reports/KawalanStokService.php b/app/Services/Reports/KawalanStokService.php index 1a5ff92..2e2c8f8 100644 --- a/app/Services/Reports/KawalanStokService.php +++ b/app/Services/Reports/KawalanStokService.php @@ -50,7 +50,7 @@ class KawalanStokService $gadaiini1 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') - ->where('t_gadai', '=>', $this->startDate)->where('t_gadai', '=<', $this->endDate) + ->where('t_gadai', '>=', $this->startDate)->where('t_gadai', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 1) ->where('nilaimarhun', '<=', 400.99) @@ -58,7 +58,7 @@ class KawalanStokService $gadaiini2 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') - ->where('t_gadai', '>=', $this->startDate)->where('t_gadai', '<=', $this->endDate) + ->where('t_gadai', '>=', $this->startDate)->where('t_gadai', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 401) ->where('nilaimarhun', '<=', 2000.99) @@ -66,7 +66,7 @@ class KawalanStokService $gadaiini3 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') - ->where('t_gadai', '>=', $this->startDate)->where('t_gadai', '<=', $this->endDate) + ->where('t_gadai', '>=', $this->startDate)->where('t_gadai', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 2001) ->where('nilaimarhun', '<=', 1000000) @@ -113,7 +113,7 @@ class KawalanStokService $tebusini1 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'T') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 1) ->where('nilaimarhun', '<=', 400.99) @@ -122,7 +122,7 @@ class KawalanStokService $tebusini2 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'T') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 401) ->where('nilaimarhun', '<=', 2000.99) @@ -131,7 +131,7 @@ class KawalanStokService $tebusini3 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'T') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 2001) ->where('nilaimarhun', '<=', 1000000) @@ -178,7 +178,7 @@ class KawalanStokService $lelongini1 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'L') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 1) ->where('nilaimarhun', '<=', 400.99) @@ -187,7 +187,7 @@ class KawalanStokService $lelongini2 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'L') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 401) ->where('nilaimarhun', '<=', 2000.99) @@ -196,7 +196,7 @@ class KawalanStokService $lelongini3 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'L') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 2001) ->where('nilaimarhun', '<=', 1000000) @@ -204,21 +204,10 @@ class KawalanStokService /*ansuran*/ - $ansuran1_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->where('trans.created_at', '<', $this->startDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); - - $ansuran1 = []; + $nomborRujukanAnsuran = $this->getFilteredNomborRujukanAnsuran(); $ansuran1 = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuran1_data) + ->whereIn('norujukan', $nomborRujukanAnsuran) ->where([['nilaimarhun', '>=', 1], ['nilaimarhun', '<=', 400.99], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->orWhere([['nilaimarhun', '>=', 1], ['nilaimarhun', '<=', 400.99], ['sttebus', '!=', ''], ['t_update', '>', $this->endDate], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -230,20 +219,10 @@ class KawalanStokService ->where('tarikh_bayaran', '<=', $this->startDate) ->get(); - $ansuranharini1_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->whereDate('trans.created_at', '>=', $this->startDate) - ->whereDate('trans.created_at', '<=', $this->endDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); + $nomborRujukanAnsuranHariIni = $this->getFilteredNomborRujukanAnsuranHariIni(); $ansuran1harini = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuranharini1_data) + ->whereIn('norujukan', $nomborRujukanAnsuranHariIni) ->where([['nilaimarhun', '>=', 1], ['nilaimarhun', '<=', 400.99], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -255,19 +234,8 @@ class KawalanStokService ->where('kodcaw', $this->kodCawangan) ->get(); - $ansuran2_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->where('trans.created_at', '<', $this->startDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); - $ansuran2 = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuran2_data) + ->whereIn('norujukan', $nomborRujukanAnsuran) ->where([['nilaimarhun', '>=', 401], ['nilaimarhun', '<=', 2000.99], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->orWhere([['nilaimarhun', '>=', 401], ['nilaimarhun', '<=', 2000.99], ['sttebus', '!=', ''], ['t_update', '>', $this->endDate], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -279,20 +247,8 @@ class KawalanStokService ->where('kodcaw', $this->kodCawangan) ->get(); - $ansuranharini2_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->whereDate('trans.created_at', '>=', $this->startDate) - ->whereDate('trans.created_at', '<=', $this->endDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); - $ansuran2harini = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuranharini2_data) + ->whereIn('norujukan', $nomborRujukanAnsuranHariIni) ->where([['nilaimarhun', '>=', 401], ['nilaimarhun', '<=', 2000.99], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -304,19 +260,8 @@ class KawalanStokService ->where('kodcaw', $this->kodCawangan) ->get(); - $ansuran3_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->where('trans.created_at', '<', $this->startDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); - $ansuran3 = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuran3_data) + ->whereIn('norujukan', $nomborRujukanAnsuran) ->where([['nilaimarhun', '>=', 2001], ['nilaimarhun', '<=', 1000000], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->orWhere([['nilaimarhun', '>=', 2001], ['nilaimarhun', '<=', 1000000], ['sttebus', '!=', ''], ['t_update', '>', $this->endDate], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -328,20 +273,8 @@ class KawalanStokService ->where('kodcaw', $this->kodCawangan) ->get(); - $ansuranharini3_data = TransaksiKeuntungan::on('mysql7') - ->leftJoin('transaction as trans', function ($join) { - $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); - $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); - }) - ->whereDate('trans.created_at', '>=', $this->startDate) - ->whereDate('trans.created_at', '<=', $this->endDate) - ->where('trans.trans_type', '=', 'A') - ->groupBy('trans.id') - ->where('trans.kodcaw', $this->kodCawangan) - ->pluck('trans.norujukan'); - $ansuran3harini = Gadai::on($cawangan['mysql']) - ->whereIn('norujukan', $ansuranharini3_data) + ->whereIn('norujukan', $nomborRujukanAnsuranHariIni) ->where([['nilaimarhun', '>=', 2001], ['nilaimarhun', '<=', 1000000], ['sttebus', ''], ['hargajualan', '<>', 'null']]) ->pluck('norujukan'); @@ -402,7 +335,7 @@ class KawalanStokService $hapuskiraini1 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'H') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 1) ->where('nilaimarhun', '<=', 400.99) @@ -411,7 +344,7 @@ class KawalanStokService $hapuskiraini2 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'H') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 401) ->where('nilaimarhun', '<=', 2000.99) @@ -420,7 +353,7 @@ class KawalanStokService $hapuskiraini3 = Gadai::on($cawangan['mysql']) ->selectRaw('COUNT(norujukan) AS bil, SUM(pinjaman) AS pinj') ->where('sttebus', 'H') - ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) + ->where('t_update', '>=', $this->startDate)->where('t_update', '<=', $this->endDate) ->where('tagpalsu', 0) ->where('nilaimarhun', '>=', 2001) ->where('nilaimarhun', '<=', 1000000) @@ -433,6 +366,36 @@ class KawalanStokService array_push($array_kawalanstok, ["ans1" => $arrayans1, "ans2" => $arrayans2, "ans3" => $arrayans3, "ansini1" => $arrayharinians1, "ansini2" => $arrayharinians2, "ansini3" => $arrayharinians3]); return response()->json($array_kawalanstok); + } + + private function getFilteredNomborRujukanAnsuran() + { + return TransaksiKeuntungan::on('mysql7') + ->leftJoin('transaction as trans', function ($join) { + $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); + $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); + }) + ->where('trans.created_at', '<', $this->startDate) + ->where('trans.trans_type', '=', 'A') + ->groupBy('trans.id') + ->where('trans.kodcaw', $this->kodCawangan) + ->pluck('trans.norujukan'); + + } + + private function getFilteredNomborRujukanAnsuranHariIni() + { + return TransaksiKeuntungan::on('mysql7') + ->leftJoin('transaction as trans', function ($join) { + $join->on('transaksi_keuntungan.norujukan', '=', 'trans.norujukan'); + $join->on('transaksi_keuntungan.tarikh_bayaran', '=', 'trans.created_at'); + }) + ->whereDate('trans.created_at', '>=', $this->startDate) + ->whereDate('trans.created_at', '<=', $this->endDate) + ->where('trans.trans_type', '=', 'A') + ->groupBy('trans.id') + ->where('trans.kodcaw', $this->kodCawangan) + ->pluck('trans.norujukan'); } diff --git a/tests/KawalanStokServiceTest.php b/tests/KawalanStokServiceTest.php new file mode 100644 index 0000000..b5a1119 --- /dev/null +++ b/tests/KawalanStokServiceTest.php @@ -0,0 +1,153 @@ +startDate = $this->startDate; + $request->endDate = $this->endDate; + $ringkasanHarianService = new KawalanStokService($this->kodCawangan, $request); + + $this->expectNotToPerformAssertions(); + return $ringkasanHarianService->getLaporanCawangan(); + + } + + public function test_how_many_seconds_both_methods_takes_to_complete() + { + $day1 = '2023-03-20'; + $day2 = '2023-03-21'; + + $function_execute_from_service = function () use ($day1, $day2) { + $request = new Request; + $request->startDate = $this->startDate; + $request->endDate = $this->startDate; + $ringkasanHarianService = new KawalanStokService($this->kodCawangan, $request); + + $this->expectNotToPerformAssertions(); + return $ringkasanHarianService->getLaporanCawangan(); + }; + + $function_execute_from_originated = function () { + (new GadaiController())->getLaporanKawalanStok($this->kodCawangan, $this->startDate); + }; + + $this->calculate_function_execution_time($function_execute_from_service, 'service'); + $this->calculate_function_execution_time($function_execute_from_originated, 'originated'); + + } + + public function test_both_method_produces_the_same_output() + { + + $function_execute_from_service = function () { + $request = new Request; + $request->startDate = $this->startDate; + $request->endDate = $this->startDate; + $ringkasanHarianService = new KawalanStokService($this->kodCawangan, $request); + + return $ringkasanHarianService->getLaporanCawangan(); + }; + + $function_execute_from_originated = function () { + return (new GadaiController())->getLaporanKawalanStok($this->kodCawangan, $this->startDate); + }; + + $outputOriginated = $function_execute_from_originated(); + $outputService = $function_execute_from_service(); + + $this->assertEquals($outputOriginated, $outputService); + } + + private function calculate_function_execution_time($test_function, $context) + { + + sleep(2); + + $startTime = hrtime(true); + + $output = $test_function(); + + $endTime = hrtime(true); + + $eta = $endTime - $startTime; + // convert nanoseconds to milliseconds + $eta /= 1e+6; + dump("Code block from $context was running for $eta milliseconds"); + + return $output; + + } + + public function test_both_method_produces_the_same_output_with_multiple_inputs() + { + + // Example usage to generate 50 random dates and store them in an array + $randomDatesArray = []; + + for ($i = 0; $i < 50; $i++) { + $maxDate = '2023-09-31'; // Adjust the maximum date as needed + $randomDatesArray[] = $this->generateRandomDate($maxDate)->toDateString(); + } + + + foreach ($randomDatesArray as $testDate) { + $function_execute_from_service = function () use ($testDate) { + $request = new Request; + $request->startDate = $testDate; + $request->endDate = $testDate; + $ringkasanHarianService = new KawalanStokService($this->kodCawangan, $request); + + return $ringkasanHarianService->getLaporanCawangan(); + }; + + $function_execute_from_originated = function () use ($testDate) { + return (new GadaiController())->getLaporanKawalanStok($this->kodCawangan, $testDate); + }; + + $outputOriginated = json_decode($function_execute_from_originated()->content()); + $outputService = json_decode($function_execute_from_service()->content()); + + + dump($testDate . ': Done test'); + $this->assertEquals($outputOriginated, $outputService); + + } + + } + + public function generateRandomDate($maxDate = null) + { + // Set a default range, for example, the last year + $startDate = Carbon::now()->subYear(); + + // If a maximum date is provided, use it; otherwise, use the current date + $endDate = $maxDate ? Carbon::parse($maxDate) : Carbon::now(); + + // Calculate the difference in seconds between start and end date + $differenceInSeconds = $endDate->diffInSeconds($startDate); + + // Generate a random number of seconds within the difference + $randomSeconds = mt_rand(0, $differenceInSeconds); + + // Add the random number of seconds to the start date + $randomDate = $startDate->copy()->addSeconds($randomSeconds); + + return $randomDate; + } + +}