'boolean' ]; /** * Building function relationship (1:1) */ public function buildingFunction(): BelongsTo { return $this->belongsTo(BuildingFunction::class); } /** * Retribution calculations relationship (1:n) */ public function retributionCalculations(): HasMany { return $this->hasMany(RetributionCalculation::class); } /** * Scope: Active formulas only */ public function scopeActive($query) { return $query->where('is_active', true); } /** * Execute formula calculation */ public function calculate(float $luasBangunan, array $parameters): float { // Replace placeholders in formula with actual values $formula = $this->formula_expression; // Replace luas_bangunan $formula = str_replace('luas_bangunan', $luasBangunan, $formula); // Replace parameter values foreach ($parameters as $key => $value) { $formula = str_replace($key, $value, $formula); } // Evaluate the mathematical expression // Note: In production, use a safer math expression evaluator try { $result = eval("return $formula;"); return (float) $result; } catch (Exception $e) { throw new \Exception("Error calculating formula: " . $e->getMessage()); } } /** * Get formula with parameter placeholders replaced for display */ public function getDisplayFormula(array $parameters = []): string { $formula = $this->formula_expression; if (!empty($parameters)) { foreach ($parameters as $key => $value) { $formula = str_replace($key, "({$key}={$value})", $formula); } } return $formula; } /** * Validate formula expression */ public function validateFormula(): bool { // Basic validation - check if formula contains required elements $requiredElements = ['luas_bangunan']; foreach ($requiredElements as $element) { if (strpos($this->formula_expression, $element) === false) { return false; } } return true; } }