Improve numeric condition handling in form logic checker

- Add robust numeric comparison for zero and negative numbers
- Implement safe numeric parsing and validation
- Enhance condition checking for numeric fields across PHP and JavaScript
- Add comprehensive test cases for edge case numeric comparisons
- Fix 'is_not_empty' operator logic in JavaScript condition checker
This commit is contained in:
Julien Nahum
2025-03-03 19:03:09 +08:00
parent 405ab64e41
commit cf4688d75e
3 changed files with 136 additions and 25 deletions

View File

@@ -81,6 +81,15 @@ class FormLogicConditionChecker
private function checkEquals($condition, $fieldValue): bool
{
// For numeric values, convert to numbers before comparison
if (
$this->areValidNumbers($condition, $fieldValue) &&
is_numeric($condition['value']) &&
is_numeric($fieldValue)
) {
return (float) $condition['value'] === (float) $fieldValue;
}
return $condition['value'] === $fieldValue;
}
@@ -152,24 +161,44 @@ class FormLogicConditionChecker
return $fieldValue == '' || $fieldValue == null || !$fieldValue;
}
/**
* Helper function to check if values are valid for numeric comparison
*/
private function areValidNumbers($condition, $fieldValue): bool
{
return isset($condition['value']) && $fieldValue !== null && $fieldValue !== '';
}
private function checkGreaterThan($condition, $fieldValue): bool
{
return $condition['value'] && $fieldValue && (float) $fieldValue > (float) $condition['value'];
if (!$this->areValidNumbers($condition, $fieldValue)) {
return false;
}
return (float) $fieldValue > (float) $condition['value'];
}
private function checkGreaterThanEqual($condition, $fieldValue): bool
{
return $condition['value'] && $fieldValue && (float) $fieldValue >= (float) $condition['value'];
if (!$this->areValidNumbers($condition, $fieldValue)) {
return false;
}
return (float) $fieldValue >= (float) $condition['value'];
}
private function checkLessThan($condition, $fieldValue): bool
{
return $condition['value'] && $fieldValue && (float) $fieldValue < (float) $condition['value'];
if (!$this->areValidNumbers($condition, $fieldValue)) {
return false;
}
return (float) $fieldValue < (float) $condition['value'];
}
private function checkLessThanEqual($condition, $fieldValue): bool
{
return $condition['value'] && $fieldValue && (float) $fieldValue <= (float) $condition['value'];
if (!$this->areValidNumbers($condition, $fieldValue)) {
return false;
}
return (float) $fieldValue <= (float) $condition['value'];
}
private function checkBefore($condition, $fieldValue): bool