From a17e49bf3b0dabc9a70062df3ddca3874567d3a7 Mon Sep 17 00:00:00 2001 From: Ollama Date: Thu, 19 Mar 2026 18:17:58 +0000 Subject: [PATCH] fix: Use typed column for attribute sorting (DECIMAL/DATE/TEXT) - When sorting by attribute column, determine the attribute type - Use attribute_decimal for DECIMAL type - Use attribute_date for DATE type - Use attribute_value for TEXT/DROPDOWN/CHECKBOX types - This ensures numeric and date attributes sort correctly instead of lexicographically Fixes CodeRabbit feedback on PR #4442. --- app/Models/Item.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/Models/Item.php b/app/Models/Item.php index fc44ebe0c..1f7bbdaaf 100644 --- a/app/Models/Item.php +++ b/app/Models/Item.php @@ -419,7 +419,22 @@ class Item extends Model $sortAlias = "sort_attr_{$sortDefinitionId}"; $builder->join("attribute_links AS {$sortAlias}", "{$sortAlias}.item_id = items.item_id AND {$sortAlias}.definition_id = {$sortDefinitionId} AND {$sortAlias}.sale_id IS NULL AND {$sortAlias}.receiving_id IS NULL", 'left'); $builder->join("attribute_values AS {$sortAlias}_val", "{$sortAlias}_val.attribute_id = {$sortAlias}.attribute_id", 'left'); - $builder->orderBy("{$sortAlias}_val.attribute_value", $order); + + // Determine the correct column to sort by based on attribute type + $attribute = model(Attribute::class); + $definitionInfo = $attribute->get_definitions_by_flags(Attribute::SHOW_IN_ITEMS, true); + $sortColumn = "{$sortAlias}_val.attribute_value"; // default to text + + if (isset($definitionInfo[$sortDefinitionId])) { + $defType = is_array($definitionInfo[$sortDefinitionId]) ? ($definitionInfo[$sortDefinitionId]['type'] ?? TEXT) : TEXT; + if ($defType === DECIMAL) { + $sortColumn = "{$sortAlias}_val.attribute_decimal"; + } elseif ($defType === DATE) { + $sortColumn = "{$sortAlias}_val.attribute_date"; + } + } + + $builder->orderBy($sortColumn, $order); } else { $builder->orderBy($sort, $order); }