Kumpulan perubahan yang udah numpuk di working tree: refactor Setup (Gate/Vehicle/Member), rapihin memberin & stiker, service parking baru (ParkingUtilsServices, NetworkService), model/migration lot-parking & DHCP reservation, dan fitur baru Intercom (controller/model/migration/ view). ReportTransaksiController versi lokal ini WIP (~90%, masih didebug) - versi yang bener ada di server, jadi dikeluarin dari git (ditambahin ke .gitignore) biar gak numpuk nindihin punya server pas git pull di sana. Sekalian keluarin dump mentah tabel softseting (1.8MB, nyasar ke-commit), file .bak, dan arsip ad-hoc (api.tgz, c.zip) yang emang bukan source code. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01EAJc2mrpj2cSTe4oowLPzQ
148 lines
5.4 KiB
PHP
148 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Parking;
|
|
|
|
use App\Models\MasterTarif;
|
|
use App\Models\VehicleItem;
|
|
use Illuminate\Support\Facades\Log;
|
|
use function GuzzleHttp\json_encode;
|
|
|
|
class RateParkingService
|
|
{
|
|
public function parkingTimeCalc($vehicle, $times)
|
|
{
|
|
$duration = $times; ## Parse lama parkir berdasarkan detik
|
|
$tarifVehicle = MasterTarif::find($vehicle);
|
|
Log::info(json_encode($tarifVehicle));
|
|
$parkingPrice = 0; //Tarif pertama
|
|
Log::info("\n" . "------------------======== Starting tarif Begin ==============----------------------");
|
|
Log::info("Mulai perhitungan tarif dengan durasi : " . $duration . " (Rp. " . $parkingPrice . ")");
|
|
|
|
// Grace Periode
|
|
// waktu_gratis kesimpen dalam MENIT (sama kayak interval/waktu2/waktu_tarif
|
|
// di bawah), tapi $duration dalam DETIK -- makanya WAJIB dikali 60 dulu biar
|
|
// satuannya sama, sama kayak pola interval*60/waktu2*60/waktu_tarif*60 yang
|
|
// dipake di bagian lain fungsi ini.
|
|
// if ($duration < $tarifVehicle->waktu_gratis * 60) {
|
|
// Log::info("GP Rules : ");
|
|
// return $parkingPrice;
|
|
// } elseif (
|
|
// $tarifVehicle->waktu_gratis !== 0 &&
|
|
// $tarifVehicle->tarif_period !== 0
|
|
// ) {
|
|
// Log::info("GP Rules : ");
|
|
// $parkingPrice = $parkingPrice + $tarifVehicle->tarif_period;
|
|
// $duration = $duration - ($tarifVehicle->waktu_gratis * 60);
|
|
// Log::info(
|
|
// "Setelah GP : " .
|
|
// $parkingPrice .
|
|
// " Durasi parkir : " .
|
|
// $duration,
|
|
// );
|
|
// }
|
|
|
|
## Hitung Tarif pertama
|
|
$firstPrice = 0;
|
|
$firstDuration = $tarifVehicle->frek_interval * ($tarifVehicle->interval * 60);
|
|
Log::info("Firstime rules : " . $firstDuration);
|
|
// if ($duration >= $firstDuration) {
|
|
do {
|
|
$duration -= $tarifVehicle->interval * 60;
|
|
$parkingPrice += $tarifVehicle->tarif_interval;
|
|
$firstPrice++;
|
|
} while ($firstPrice < $tarifVehicle->frek_interval);
|
|
Log::info("Tarif jam pertama : " . $parkingPrice . " Sisa durasi : " . $duration);
|
|
// }
|
|
|
|
// Log::info($firstDuration);
|
|
## Hitung tarif kedua
|
|
$secondPrice = 1;
|
|
// Log::info($tarifVehicle->frek_waktu2 . ' - ' . $tarifVehicle->waktu2);
|
|
$secondDuration = $tarifVehicle->frek_waktu2 * ($tarifVehicle->waktu2 * 60);
|
|
if ($duration >= $secondDuration) {
|
|
Log::info("");
|
|
Log::info("Secondtime rules : " . $secondDuration);
|
|
Log::info($secondPrice);
|
|
do {
|
|
$duration -= $tarifVehicle->waktu2 * 60;
|
|
Log::info($parkingPrice);
|
|
Log::info($tarifVehicle->tarif);
|
|
$parkingPrice += $tarifVehicle->tarif;
|
|
$secondPrice++;
|
|
Log::info($secondPrice);
|
|
} while ($secondPrice < $tarifVehicle->frek_waktu2);
|
|
|
|
Log::info("Tarif jam kedua : " . $parkingPrice . " Sisa durasi : " . $duration);
|
|
}
|
|
|
|
$nextDuration = 0;
|
|
$lastDuration = $tarifVehicle->waktu_tarif * 60;
|
|
if ($lastDuration <= $duration) {
|
|
Log::info("");
|
|
Log::info("Sisa Durasi " . $duration);
|
|
do {
|
|
$duration -= $tarifVehicle->waktu_tarif * 60;
|
|
$parkingPrice += $tarifVehicle->tarif;
|
|
// $nextDuration++;
|
|
} while ($duration > 0);
|
|
Log::info("Tarif jam berikutnya : " . $parkingPrice . " Sisa durasi : " . $duration);
|
|
}
|
|
|
|
$tarifMaks = $tarifVehicle->maksimum;
|
|
|
|
if ($tarifMaks != 0) {
|
|
if ($parkingPrice > $tarifMaks) {
|
|
$parkingPrice = $tarifMaks;
|
|
}
|
|
}
|
|
|
|
Log::info(
|
|
"Tarif Parkir Anda : " .
|
|
// $parkingPrice .
|
|
" Sisa durasi : " .
|
|
$duration,
|
|
);
|
|
|
|
// if ($tarifVehicle->time_base_maks == 1) {
|
|
// if ($parkingPrice > $tarifVehicle->maksimum) {
|
|
// $parkingPrice = $tarifVehicle->maksimum;
|
|
// }
|
|
// }
|
|
|
|
return [$duration, $parkingPrice];
|
|
}
|
|
|
|
public function parkingDailysCalc($vehicle, $times)
|
|
{
|
|
if ($times < 86400) {
|
|
$parkingPrice = $this->parkingTimeCalc($vehicle, $times);
|
|
|
|
return $parkingPrice;
|
|
}
|
|
|
|
$tarifVehicle = MasterTarif::find($vehicle);
|
|
$parkingPrice = 0;
|
|
Log::info("Parameter tarif : " . json_encode($tarifVehicle));
|
|
Log::info("Memulai hitung tarif : " . $parkingPrice);
|
|
Log::info("Base time : " . $times);
|
|
if ($tarifVehicle->time_base == 1) {
|
|
$durationDailys = $tarifVehicle->time_base_maks * 60 * 60;
|
|
Log::info("Waktu 1 hari : " . $durationDailys);
|
|
$parkingDuration = $times;
|
|
do {
|
|
$parkingDuration -= $durationDailys;
|
|
$parkingPrice += $tarifVehicle->maksimum;
|
|
} while ($parkingDuration >= 86400);
|
|
|
|
$result = $this->parkingTimeCalc($vehicle, $parkingDuration);
|
|
$parkingDuration = $result[0];
|
|
$parkingPrice = $result[1];
|
|
}
|
|
|
|
Log::info("Sisa waktu : " . $parkingDuration);
|
|
Log::info("Tarif nya jadi : " . $parkingPrice);
|
|
|
|
return [$parkingDuration, (int) $parkingPrice];
|
|
}
|
|
}
|