= self::PERCENT_RANGE_MIN && intval($value) <= self::PERCENT_RANGE_MAX; } /** * Turns a raw input value into a storable value. * * @return string|null null means the value is empty or invalid */ public static function normalize($value): ?string { if (self::isCommission($value)) return self::COMMISSION; if ($value === '' || $value === null || !is_numeric($value)) return null; return (string) self::clamp(intval($value)); } /** * Clamps percentages to the allowed -35..35 range; fixed Toman amounts are left untouched. */ public static function clamp(int $value): int { if (!self::isPercent($value)) return $value; if ($value > self::MAX_PERCENT) return self::MAX_PERCENT; if ($value < self::MIN_PERCENT) return self::MIN_PERCENT; return $value; } public static function unitLabel($value): string { if (self::isCommission($value) || !is_numeric($value)) return 'درصد'; return self::isPercent($value) ? 'درصد' : 'تومان'; } }