Reduce queries when query for transaction table by saving 1 result into variable. The variable be use instead

This commit is contained in:
Afiq Hamzah
2024-01-18 14:29:45 +08:00
parent 5d754a1cc9
commit 2589e0cf7c
2 changed files with 203 additions and 87 deletions
+50 -87
View File
@@ -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');
}
+153
View File
@@ -0,0 +1,153 @@
<?php
use App\Http\Controllers\GadaiController;
use App\Services\Reports\KawalanStokService;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
class KawalanStokServiceTest extends TestCase
{
private $kodCawangan = 'kb2';
private $startDate = '2023-03-23';
private $endDate = '2023-03-23';
/**
* A basic test example.
*
* @return void
*/
public function test_have_errors()
{
$request = new Request;
$request->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;
}
}