Mercadona tiene un bug de presentación en sus tickets?

Ticket de Mercadona

El otro día, al salir del supermercado, me fijé en que el ticket tenía algo raro. Había dos líneas para el mismo producto y en una tenía 2 unidades y en la otra 1 unidad. Aparentemente parecía un bug de presentación ya que los datos eran correctos. Pero como soy curioso quería saber qué había pasado exactamente, así que le pregunté a Claude y esto es lo que me dijo. 👇

Análisis del bug con Claude Code

Lo primero: las cuentas cuadran (2,99 al 21% y 2,25 al 10%), así que es un bug de presentación/agrupación, no de importes.

Las causas más probables, ordenadas por probabilidad:

1. La agrupación solo mira la última línea, no todo el carrito. Es el clásico: al insertar un artículo se hace if (ultimaLinea.codigo == nuevo.codigo) ultimaLinea.cantidad++ en vez de buscar en toda la lista. Basta con que entre medias pasara algo que rompiera la adyacencia —un artículo escaneado y luego anulado, una línea cancelada que no se imprime— para que la tercera lata abriera línea nueva. Encaja con que las dos líneas salgan juntas en el ticket: el render respeta el orden de inserción y la línea intermedia desapareció.

2. Dos caminos distintos de creación de línea. Multiplicador manual (tecla «x2» + escaneo) vs. escaneo suelto. Si el modelo distingue LineaConCantidad de LineaSimple, o marca un flag tipo cantidadIntroducidaManualmente, la clave de agrupación deja de ser solo el código de artículo y ya no fusionan.

3. Mismo texto, distinto EAN. La descripción del ticket va truncada a ~20 caracteres. Podrían ser dos referencias distintas (lote, formato, proveedor) que comparten descripción y PVP pero tienen código diferente. Aquí la agrupación funcionaría correctamente: agrupa por código, no por nombre, y son códigos distintos.

Para distinguir entre 1/2 y 3, mira el ticket digital en la app: si ahí aparecen con EAN distinto, no hay bug, hay dos referencias. Si el EAN es el mismo, es agrupación defectuosa en el TPV.

Y esta es una de las cosas que me molan de mi trabajo. Analizar y pensar en problemas de negocio, entender por qué pasan y cuáles pueden ser las posibles soluciones. En Spalopia me enfrento a este tipo de problemas a diario por lo que suele ser bastante entretenido.

Code Smell – Parámetros de tipo booleano

Cuando recibes un parámetro que o bien es de tipo bool o bien se comporta como un bool (por ejemplo un parámetro que representa un tipo de cliente donde solo existen dos tipos), es muy probable que esa función o método tenga más de una responsabilidad.

En este vídeo explicamos este code smell y como solucionarlo.

Conviértete en Pro de PHP – Late Static Binding

Atendiendo a lo que tradicionalmente conocemos como herencia, esperaríamos que si yo redefino una función o una constante en una clase hija, esta se va a sobreescribir. En PHP esto no sucede así dependiendo de como hagamos la llamada.

En este vídeo explico con varios ejemplos como funciona el Late Static Binding, que es la forma de solucionar este comportamiento inesperado.

Symfony promueve las buenas prácticas

El equipo de Symfony ha hecho una serie de cambios, versión tras versión, orientados a promover las buenas prácticas a través del buen uso del contenedor de inyección de dependencias y el principio de inversión de dependencias. En este vídeo vemos como algunos proyectos usaban malas prácticas en su código, porque podían hacerlo, y como ahora es realmente complicado seguir haciéndolo.

Conceptos necesarios para entender el vídeo:

Inyección de dependencias vs Inversión de dependencias vs Contenedor de inyección de dependencias

Explicación de las diferencias entre estos tres conceptos que a veces se confunden:

  • Inyección de dependencias
  • Inversión de dependencias
  • Contenedor de inyección de dependencias

Veremos que problemas tiene cada uno, coo resolverlos y cuando usarlos.

Dependencias iconos creados por juicy_fish – Flaticon

Repo de ejemplo

Enlaces relacionados:

Cómo Chat GPT-3 puede ayudar en la programación

El avance en la inteligencia artificial ha permitido el desarrollo de modelos de lenguaje de gran escala, como GPT-3, que pueden ayudar a los programadores a simplificar y mejorar su trabajo. En este artículo, exploraremos cómo Chat GPT-3 puede ser una herramienta valiosa para los programadores.

  1. Generación de código: Chat GPT-3 puede generar código en diferentes lenguajes de programación como Python, JavaScript, etc. simplemente describiéndole lo que quieres hacer. Esto puede ahorrar tiempo y esfuerzo a los programadores, especialmente cuando se trata de tareas repetitivas o simples.
  2. Resolución de errores: Cuando se enfrentan a errores en su código, los programadores a menudo buscan soluciones en línea. Chat GPT-3 puede ayudar a identificar y resolver estos errores, ahorrando tiempo y esfuerzo en la búsqueda de soluciones.
  3. Documentación: La documentación adecuada es esencial para la programación eficiente. Chat GPT-3 puede proporcionar información detallada sobre una biblioteca o una función específica que estés utilizando en tu proyecto, ahorrando tiempo en la búsqueda de la información adecuada.
  4. Sugerencias y soluciones: A veces, los programadores se enfrentan a desafíos en su trabajo y necesitan sugerencias y soluciones. Chat GPT-3 puede proporcionar soluciones a problemas específicos y sugerencias para mejorar el código, ayudando a los programadores a avanzar en su trabajo.
  5. Aprendizaje: La programación es un campo en constante evolución y es importante mantenerse actualizado con las últimas tecnologías y conceptos. Chat GPT-3 puede ser una herramienta valiosa para aprender nuevos conceptos y tecnologías de programación de manera rápida y efectiva.

En resumen, Chat GPT-3 puede ser una herramienta valiosa para los programadores, simplificando y mejorando su trabajo en tareas como la generación de código, la resolución de errores, la documentación, la proporción de sugerencias y soluciones, y el aprendizaje. ¡Prueba Chat GPT-3 hoy mismo y descubre cómo puede ayudarte como programador.