Files
api_arrahn/app/Support/v2/Calculation.php
T
2026-09-20 10:32:10 +08:00

188 lines
6.0 KiB
PHP

<?php
namespace App\Support\v2;
use App\Feature;
use App\KadarRebet;
use App\KadarUpah;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;
class Calculation
{
protected $maks_margin = 80;
protected $one_percent = 1;
/* Start Calculation of Ujrah */
private function kiraanUjrah(float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0){
//periksa adakah kadar ujrah ini diberi percentage
if($kadarujrah >= 1){
return;
}
$ujrah = ($kadarujrah/100) * $nilaimarhun;
$formula_margin = ($this->maks_margin - $margin) / $this->maks_margin;
$ujrah_margin = $formula_margin * $kadarujrah;
$rebate_ujrah = $nilaimarhun*($ujrah_margin/100);
$ujrah_sebenar = $ujrah - $rebate_ujrah;
return $ujrah_sebenar;
}
private function kiraanOnePercent(float $pembiayaan = 0.0){
//periksa adakah pembiayaan adalah null atau kosong.
if($pembiayaan == 0 || $pembiayaan == null)
return;
$onepercent = ($this->one_percent/100) * $pembiayaan;
return $onepercent;
}
public function kiraanUjrahSebenar(float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0){
if($kadarujrah >= 1){
return;
}
$ujrah = ($kadarujrah/100) * $nilaimarhun;
$formula_margin = ($this->maks_margin - $margin) / $this->maks_margin;
$rebate_ujrah = $formula_margin * $ujrah;
$ujrah_sebenar = $ujrah - $rebate_ujrah;
return $ujrah_sebenar;
}
public function kiraanKeuntunganRebet(float $pembiayaan = 0.0,float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0, $kodcaw = null){
$this->one_percent = $this->getKadarUpah($nilaimarhun);
$onepercent = $this->kiraanOnePercent($pembiayaan);
$ujrah_sebenar = $this->kiraanUjrahSebenar($nilaimarhun,$kadarujrah,$margin);
$onepercent = (!empty($onepercent)) ? $this->getRoundedMethod($onepercent) : 0;
$ujrah_sebenar = (!empty($ujrah_sebenar)) ? $this->getRoundedMethod($ujrah_sebenar) : 0;
$keuntungan = $onepercent + $ujrah_sebenar;
$annur = $this->kiraanDiskaunAnnur($kodcaw, $pembiayaan, $keuntungan);
return [
'keuntungan' => $keuntungan,
'onepercent' => $onepercent,
'ujrah' => $ujrah_sebenar,
'diskaun' => $annur['diskaun'],
'kadarrebet' => $annur['kadarrebet'],
];
}
/**
* Annur promotional discount. Other cawangan get 0 unless rebet_annur is enabled.
*/
public function kiraanDiskaunAnnur($kodcaw, float $pembiayaan = 0.0, float $keuntungan = 0.0)
{
$empty = ['kadarrebet' => 0, 'diskaun' => 0];
try {
if (!$kodcaw || !Feature::enabled($kodcaw, Feature::REBET_ANNUR)) {
return $empty;
}
} catch (\Exception $e) {
return $empty;
}
$percent = $this->kiraanRebetAnnur($pembiayaan);
if ($percent <= 0 || $keuntungan <= 0) {
return ['kadarrebet' => $percent, 'diskaun' => 0];
}
return [
'kadarrebet' => $percent,
'diskaun' => $this->getRoundedMethod($keuntungan * ($percent / 100)),
];
}
private function kiraanRebetAnnur(float $pembiayaan = 0.0)
{
try {
if (!Schema::connection('mysql7')->hasTable('kadar_rebet')) {
return 0;
}
$kadarrebet = KadarRebet::on('mysql7')
->where('pembiayaan_min', '<=', $pembiayaan)
->where('pembiayaan_max', '>=', $pembiayaan)
->sum('kadarrebet');
return (float) $kadarrebet;
} catch (\Exception $e) {
return 0;
}
}
public function kiraanKeuntunganSebenar(float $pembiayaan = 0.0,float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0){
$this->one_percent = $this->getKadarUpah($nilaimarhun);
$onepercent = $this->kiraanOnePercent($pembiayaan);
$ujrah_sebenar = $this->kiraanUjrah($nilaimarhun,$kadarujrah,$margin);
$onepercent = (!empty($onepercent)) ? $this->getRoundedMethod($onepercent) : 0;
$ujrah_sebenar = (!empty($ujrah_sebenar)) ? $this->getRoundedMethod($ujrah_sebenar) : 0;
$keuntungan = $onepercent + $ujrah_sebenar;
return ['keuntungan' => $keuntungan,'onepercent' => $onepercent, 'ujrah' => $ujrah_sebenar];
}
public function getKadarUjrah(float $nilaimarhun = 0.0, $groupid) : Float{
$kadarujrah = KadarUpah::on('mysql7')->select('kadarujrah')->where([['min','<=',$nilaimarhun],['max','>=',$nilaimarhun]])->where('group_id',$groupid)->get()->toArray();
return isset($kadarujrah[0]) ? $kadarujrah[0]['kadarujrah'] : 0;
}
public function getKadarUpah(float $nilaimarhun = 0.0){
$kadarupah = KadarUpah::on('mysql7')->where([['min','<=',$nilaimarhun],['max','>=',$nilaimarhun]])->where('group_id',1)->first();
return isset($kadarupah) ? $kadarupah['kadaronepercent'] : 1;
}
public function getRoundedMethod(float $number = 0.0) : Float{
// $multiplied = number_format($number * 100,2);
// $floorResult = floor($multiplied);
// $number_string = number_format($floorResult/100,2);
$number_string = number_format(floor($number * 100)/100,2);
$rounded = substr($number_string, 0, -1);
$lastDigit = substr($number_string, -1);
if ($lastDigit >= 0 && $lastDigit <= 2) {
if(strpos($rounded,',')){
$rounded = str_replace(',','',$rounded);
}
return $rounded;
} elseif ($lastDigit >= 3 && $lastDigit <= 7) {
$rounded = $rounded . '5';
if(strpos($rounded,',')){
$rounded = str_replace(',','',$rounded);
}
return $rounded;
} else {
return round($number,PHP_ROUND_HALF_UP);
}
}
/* End of Line Calculation */
}