Se você já tentou ordenar resultados em um catálogo usando propriedades numéricas e acabou com valores truncados ou ordem inesperada, sabe o peso que isso tem no fluxo de checkout. O ENUM_ORDER_PROPERTY_DOUBLE foi criado exatamente para eliminar essas surpresas, permitindo que campos de preço, peso ou pontuação sejam tratados como números de ponto flutuante durante a ordenação. Vamos direto ao ponto: como configurar, onde ele falha e quais armadilhas evitar.
Quando e por que usar
- Objetivo: ordenar itens por valores que exigem precisão decimal (ex.: 12,99 € vs 12,9 €).
- Cenário real: listagem de produtos com descontos progressivos onde o preço final varia em centavos.
- Dificuldade comum: desenvolvedores costumam usar
ENUM_ORDER_PROPERTY_STRINGpor hábito, o que gera ordenação lexicográfica (“9,99” vem antes de “10,00”).
Passo a passo de implementação
- 1. Declare a propriedade no
order.propertiescom o tipoDOUBLE: - 2. No script de cálculo, assegure que o valor seja sempre salvo como
float(ex.:setProperty('final_price', $price);). - 3. No bloco de ordenação, use a constante:
order->setOrderBy(EnumOrderProperty::ENUM_ORDER_PROPERTY_DOUBLE, 'final_price', 'DESC');
Limitações técnicas
- Arredondamento interno do banco pode cortar casas decimais se a coluna for
DECIMAL(10,2)e o script enviar mais de duas casas. - Alguns provedores de hospedagem limitam a precisão de ponto flutuante a 4 dígitos, o que quebra ordenação em valores como 0,0001.
- Não funciona em filtros de texto puro; o campo deve estar indexado como numérico.
Exemplos práticos que revelam falhas
Imagine um marketplace de vinhos onde o preço varia de 19,95 a 199,99. Se o campo for tratado como string, “199,99” aparece antes de “20,00”. Ao mudar para ENUM_ORDER_PROPERTY_DOUBLE, a ordem se corrige, mas se algum registro ainda contiver vírgula ao invés de ponto (ex.: “19,95”), o banco rejeita o valor e o item desaparece da listagem.
Como contornar os problemas
- Padronize a notação decimal no input (substitua vírgulas por pontos via
str_replace). - Valide o tipo antes de salvar:
if (!is_float($value)) throw new Exception('Valor inválido'); - Reindexe a coluna após migrações de dados para garantir que todos os registros sejam reconhecidos como numéricos.
Objeções frequentes
“Preciso de performance, será que esse enum pesa?” A resposta curta: não significativamente. O custo extra vem da conversão de string para float na inserção, mas a ordenação em si utiliza índices numéricos, que são mais rápidos que comparações lexicográficas.
Insight final
Use ENUM_ORDER_PROPERTY_DOUBLE sempre que a ordem depender de precisão decimal. Se houver risco de dados inconsistentes, implemente uma rotina de limpeza antes de aplicar o enum. Assim você garante que a experiência do usuário não seja atrapalhada por uma classificação errada, e ainda mantém a performance do seu catálogo.
Para detalhes oficiais sobre a sintaxe, consulte a documentação do desenvolvedor.
Primeiros passos após a instalação
Logo depois de habilitar o módulo ENUM_ORDER_PROPERTY_DOUBLE, abra o painel de controle e localize a aba Configurações → Propriedades do Pedido. Crie uma nova propriedade e selecione o tipo DOUBLE no menu suspenso. Defina a precisão (número de casas decimais) e, se necessário, habilite a validação de intervalo para impedir valores fora do esperado.
Configuração inicial da propriedade numérica
- Nome interno:
ENUM_ORDER_PROPERTY_DOUBLE - Rótulo exibido: “Peso do Produto (kg)”
- Precisão: 2 casas decimais
- Valor mínimo: 0,01
- Valor máximo: 999,99
Esses parâmetros garantem que o campo aceite apenas números válidos e evita erros de arredondamento nas operações de cálculo.
Checklist operacional para evitar erros comuns
| Etapa | Verificação |
|---|---|
| 1. Criação da propriedade | Tipo = DOUBLE, precisão = 2 |
| 2. Definição de limites | Min = 0,01 – Max = 999,99 |
| 3. Teste de inserção | Inserir 0,005 → rejeitado |
| 4. Integração com cálculo de frete | Confirmar que o valor é usado em calcFreight() |
| 5. Validação no checkout | Campo obrigatório? Sim/Não |
Rotina recomendada para atualização de valores
Adote um ciclo semanal de revisão:
- Segunda‑feira: importação de novos SKUs com peso pré‑definido.
- Quarta‑feira: auditoria de pedidos pendentes para detectar valores fora do intervalo.
- Sexta‑feira: execução de script
recalcTotals()que recalcula subtotais usando o campo DOUBLE.
Essa sequência mantém a base de dados limpa e evita surpresas no cálculo de impostos ou frete.
Exemplo prático de uso em cálculo de frete
Considere a seguinte função PHP que utiliza a propriedade recém‑criada:
function calcFreight($orderId) { $weight = GetOrderProperty($orderId, 'ENUM_ORDER_PROPERTY_DOUBLE'); $base = 5.00; // tarifa fixa $rate = 0.75; // por kg return $base + ($weight * $rate); } Ao receber um pedido com peso = 2,30 kg, a função retornará 6,73 (R$ 6,73). O cálculo considera a precisão de duas casas decimais, eliminando diferenças de centavos que poderiam gerar disputas.
Sinais de progresso e métricas de produtividade
Monitore os indicadores abaixo para validar que a implementação está gerando valor:
- Taxa de erro de validação: < 0,5 % nas inserções.
- Tempo médio de cálculo de frete: < 30 ms.
- Redução de devoluções por peso incorreto: 12 % após 30 dias.
Quando esses números se estabilizarem, considere expandir o uso do tipo DOUBLE para outras propriedades, como “Volume (m³)” ou “Altura (cm)”.
⚠️ Dica: nunca desative a validação de intervalo. Sem limites, o campo aceita valores extremos que podem corromper relatórios financeiros.
Para aprofundar a documentação oficial e acessar exemplos avançados, visite a página de suporte.
Perfil ideal e limitações de ENUM_ORDER_PROPERTY_DOUBLE
Desenvolvedores que lidam com ordenação complexa de campos numéricos em APIs de e‑commerce encontrarão neste enum um aliado, mas ele não é a solução universal para todos os tipos de dados.
Quem realmente se beneficia?
- Back‑ends que precisam ordenar produtos por preço, peso ou dimensões com precisão de ponto flutuante.
- Integrações que exigem tipagem forte e evitam overflow de valores decimais.
- Equipes que já utilizam o framework Bitrix24 e seguem a convenção de enumerações para propriedades de ordem.
Perfis que podem ficar no prejuízo
- Projetos que manipulam apenas strings ou identificadores simples – o enum adiciona sobrecarga desnecessária.
- Aplicações que dependem de cálculos arbitrários em múltiplas moedas sem conversão prévia – o double pode gerar imprecisão.
- Desenvolvedores que não controlam a origem dos dados e precisam de validação robusta antes da ordenação.
Limitações práticas
- Precisão de 15‑16 dígitos significativos – valores maiores perdem exatidão.
- Incompatibilidade com bancos que armazenam decimais como string – necessidade de migração ou casting.
- Falta de suporte nativo a ordenação multicoluna; o enum só define a propriedade singular.
FAQ contextual
- Posso usar o enum para ordenar por “rating” que varia de 0,0 a 5,0? Sim, desde que o rating já esteja armazenado como double.
- E se o valor vier como string “12,30”? Converta antes; caso contrário, o enum rejeitará o input.
- É seguro em ambientes de alta concorrência? O enum em si não impede colisões – a lógica de bloqueio deve ser tratada separadamente.
Checklist rápido antes da adoção
| Critério | Verificação |
|---|---|
| Os campos são numéricos de ponto flutuante? | ✅ |
| O backend suporta double nativamente? | ✅ |
| Precisa de ordenação múltipla simultânea? | ❌ |
| Há risco de overflow com valores extremos? | ⚠️ |
Parecer editorial equilibrado
Em cenários onde a precisão decimal é crítica e a estrutura de dados já está alinhada ao padrão Bitrix, ENUM_ORDER_PROPERTY_DOUBLE entrega ordenação estável e código limpo. Fora desse ecossistema, a rigidez do tipo pode gerar retrabalho e perda de performance.
Mini cenários reais
- Loja de móveis: ordenar por peso (kg) para cálculo de frete – funciona perfeitamente.
- Marketplace de arte: ordenar por preço em moedas distintas sem conversão – gera imprecisão e requer camada extra.
Próximos passos
Teste o enum em um ambiente de staging com ao menos 10 000 registros. Meça latência de consulta e valide a integridade dos valores após migrações de dados.
Pronto para experimentar? Acesse a documentação oficial
