Ordenamiento Descendente Correcto en Administrar Ventas con DataTables Server-Side en JCPOS Ultimate

Uno de los puntos que más confusión genera al trabajar con DataTables en modo server-side es el ordenamiento por defecto. En el módulo Administrar Ventas de JCPOS Ultimate Punto de Venta, este tema cobra especial importancia, ya que el usuario espera ver siempre las ventas más recientes primero.

En esta publicación explicamos:

  • Por qué el ordenamiento descendente no parecía funcionar
  • Cómo maneja DataTables el orden en server-side
  • Dónde ocurre realmente el ordenamiento
  • Qué se ajustó para que el orden sea correcto
  • Recomendaciones para evitar este problema en el futuro

📁 Archivos involucrados

El flujo completo del listado de ventas utiliza dos archivos clave:

  • Vista:
    vistas/modulos/ventas.php
  • Backend DataTables:
    ajax/datatable-administrarVentas.ajax.php

Importante: No se modificó la vista ventas.php. El comportamiento correcto se logra entendiendo y respetando la lógica de DataTables server-side.


📊 El problema: “el orden no cambia”

Desde el lado del usuario, el síntoma era claro:

  • Se esperaba que la tabla se ordenara por la primera columna (ID)
  • En forma descendente (ventas más recientes arriba)
  • Pero el orden parecía no cambiar

Esto suele llevar a pensar erróneamente que:

  • El parámetro order no funciona
  • DataTables ignora la configuración
  • Existe un error en JavaScript

La realidad es otra.


⚠️ La clave: server-side cambia las reglas

Cuando DataTables funciona en modo normal (frontend), el ordenamiento se hace completamente en el navegador.

Pero cuando se activa:

serverSide: true

ocurre algo fundamental:

  • DataTables NO ordena los datos
  • Solo envía la instrucción de orden al servidor
  • El backend es quien decide el orden final

Por eso, aunque en JavaScript se indique:

order: [[0, "desc"]]

si el backend no respeta esa instrucción, el orden visual nunca cambiará.


📡 Qué envía realmente DataTables al backend

En cada petición AJAX, DataTables envía parámetros como:

  • order[0][column] → índice de la columna
  • order[0][dir] → asc / desc

En este caso:

  • Columna 0 → ID
  • Dirección → desc

Esto significa: “ordena por ID de forma descendente”


🔍 Por qué antes no se reflejaba el orden

El archivo datatable-administrarVentas.ajax.php recibe los parámetros de DataTables, pero:

  • El método ctrRangoFechasVentas() ya devuelve resultados
  • El orden puede venir definido internamente
  • Si no se aplica el ORDER BY dinámico, el resultado será siempre el mismo

Esto genera la sensación de que:

  • El DataTable “ignora” el orden

Cuando en realidad:

  • El backend está devolviendo los datos sin respetar la instrucción

✅ Qué se hizo para que el orden funcione correctamente

El cambio no fue visual ni estético, fue conceptual y estructural.

✔ Se respetó el flujo server-side

DataTables:

  • Envía la columna y dirección
  • No ordena nada por sí mismo

Backend:

  • Recibe los parámetros
  • Aplica el orden correcto
  • Devuelve los datos ya ordenados

✔ La primera columna (ID) quedó como referencia

Al usar el ID como columna principal:

  • Mayor ID = venta más reciente
  • Orden descendente = últimas ventas primero

Esto coincide con la expectativa natural del usuario.


📈 Beneficios del ordenamiento correcto

  • Mejor experiencia de usuario
  • Acceso inmediato a ventas recientes
  • Menos clics para buscar información
  • Coherencia con sistemas POS profesionales

💡 Recomendaciones técnicas

1️⃣ Siempre pensar en backend cuando uses server-side

Si no se ordena en el servidor, no se ordenará nunca.

2️⃣ Usar IDs autoincrementales como referencia

Facilitan ordenamiento y paginación.

3️⃣ No confiar solo en JavaScript

El JS solo indica la intención, no ejecuta el orden.

4️⃣ Mantener coherencia entre columnas

El índice de columna debe coincidir exactamente con el JSON.

5️⃣ Documentar estos cambios

Evita confusiones futuras al mantener el sistema.


📌 Conclusión

El ordenamiento descendente en Administrar Ventas no fue un simple ajuste visual, sino una correcta aplicación del flujo DataTables server-side.

Entender que el orden se decide en el backend marca la diferencia entre una tabla que “parece no funcionar” y un sistema profesional, escalable y confiable.

Documentado por Julio Leyva