111 lines
3.1 KiB
PHP
111 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class BuildingFunctionFormulaConfig extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
protected $fillable = [
|
|
'building_function_id',
|
|
'formula_id',
|
|
'floor_level',
|
|
'min_floor',
|
|
'max_floor',
|
|
'multiplier',
|
|
'is_active',
|
|
'priority',
|
|
'notes',
|
|
];
|
|
|
|
protected $casts = [
|
|
'multiplier' => 'decimal:4',
|
|
'is_active' => 'boolean',
|
|
'min_floor' => 'integer',
|
|
'max_floor' => 'integer',
|
|
'floor_level' => 'integer',
|
|
'priority' => 'integer',
|
|
];
|
|
|
|
/**
|
|
* Relationship to BuildingFunction
|
|
*/
|
|
public function buildingFunction()
|
|
{
|
|
return $this->belongsTo(BuildingFunction::class, 'building_function_id');
|
|
}
|
|
|
|
/**
|
|
* Relationship to MasterFormula
|
|
*/
|
|
public function formula()
|
|
{
|
|
return $this->belongsTo(MasterFormula::class, 'formula_id');
|
|
}
|
|
|
|
/**
|
|
* Scope untuk konfigurasi aktif
|
|
*/
|
|
public function scopeActive($query)
|
|
{
|
|
return $query->where('is_active', true);
|
|
}
|
|
|
|
/**
|
|
* Scope untuk mencari berdasarkan building function dan floor level
|
|
*/
|
|
public function scopeForBuildingAndFloor($query, $buildingFunctionId, $floorLevel)
|
|
{
|
|
return $query->where('building_function_id', $buildingFunctionId)
|
|
->where(function($q) use ($floorLevel) {
|
|
$q->where('floor_level', $floorLevel)
|
|
->orWhere('floor_level', 0) // 0 = berlaku untuk semua lantai
|
|
->orWhere(function($qq) use ($floorLevel) {
|
|
$qq->whereNotNull('min_floor')
|
|
->whereNotNull('max_floor')
|
|
->where('min_floor', '<=', $floorLevel)
|
|
->where('max_floor', '>=', $floorLevel);
|
|
});
|
|
})
|
|
->orderBy('priority', 'desc')
|
|
->orderBy('floor_level', 'desc'); // Prioritas: spesifik floor > range > semua lantai
|
|
}
|
|
|
|
/**
|
|
* Method untuk mendapatkan formula yang tepat untuk building function dan floor tertentu
|
|
*/
|
|
public static function getFormulaForBuildingAndFloor($buildingFunctionId, $floorLevel)
|
|
{
|
|
return self::active()
|
|
->forBuildingAndFloor($buildingFunctionId, $floorLevel)
|
|
->with('formula')
|
|
->first();
|
|
}
|
|
|
|
/**
|
|
* Method untuk check apakah floor level masuk dalam range
|
|
*/
|
|
public function isFloorInRange($floorLevel)
|
|
{
|
|
// Jika floor_level = 0, berlaku untuk semua lantai
|
|
if ($this->floor_level == 0) {
|
|
return true;
|
|
}
|
|
|
|
// Jika ada specific floor level
|
|
if ($this->floor_level == $floorLevel) {
|
|
return true;
|
|
}
|
|
|
|
// Jika ada range min-max
|
|
if (!is_null($this->min_floor) && !is_null($this->max_floor)) {
|
|
return $floorLevel >= $this->min_floor && $floorLevel <= $this->max_floor;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|