Duda en lógica reserva de entradas online

eXtreM3

Hola, tengo desarrollado un sistema de venta de entradas online bastante curioso, y lo único que me falta es solventar un problemilla.

El flujo normal es este:

  • usuario selecciona cuántas entradas quiere (siempre y cuando haya stock)
  • usuario rellena sus datos y pulsa Comprar (botón que redirige a la pasarela de pago)
    - en este punto se ejecuta un script intermedio que hace una "prereserva", guardando datos de entradas, cliente y eso.
  • se redigire a la pasarela de pago
  • rellena todos los datos de la tarjeta y realiza la compra
  • se ejecuta en segundo plano el script que actualiza la base de datos con que las entradas han sido pagadas, etc.

Vale, ahora mi problema surge cuando tengo stock 5 por ejemplo para una entrada, y dos usuarios intentan comprar a la vez. En qué punto del proceso tengo que avisar al usuario que vaya por detrás de que ya no queda stock porque otro se le ha adelantado?

Es decir, sé lo que tengo que hacer pero no cómo hacerlo. En mi script intermedio (el punto que he puesto en cursiva) es donde guardo la información de lo que se compra, cantidades, etc. Digamos que llegado a ese punto, el usuario 1 (el que va por delante) ya tiene reservadas las 5 entradas hasta que finalice la compra, pero qué pasa si no finaliza y cierra el navegador al llegar a la pasarela de pago? No tengo manera de decirle a mi sistema, ya que la pasarela es un enlace externo, que el usuario no ha comprado nada porque no hay ningún tipo de respuesta...

Ayuda please ^^

m4andg4

Yo lo avisaría cuando complete el formulario y pulse Comprar. Si llegados a ese punto alguien se le ha adelantado, el script le avisaría.

1 respuesta
eXtreM3

#2 sí, pero qué pasa si el usuario que va por delante no finaliza el proceso de compra y cierra el navegador cuando se encuentra en la pasarela? Cómo restauro ese stock?

1 respuesta
m4andg4

#3 No aceptes el pedido hasta que lo confirme y finalice. Es decir, al stock solo le restas si le dan al botoncito de comprar. Si tienes stock 2 y hay comprando 20 solo véndeselo a los 2 primeros (o al primero que se lleve los 2). Al resto diles que se ha acabado.
Finaliza el proceso cuando finalice la compra.

Te voy a hacer una analogía de mi lógica para que quede un poquito más claro:

Imaginate una tienda con infinitos mostradores y un almacen común a todos, finito, con 2 manzanas en stock.

LLega un cliente y se coloca en un mostrador y pregunta si tienen manzanas, llega otro cliente a otro mostrador y directamente pide 2 manzanas. Logicamente y si todo va bien el que las ha pedido directamente las va a obtener antes y como consecuencia cuando el tendero del primer caso vaya a comprobar si tiene manzanas, verá que no le quedan y se lo comunicará al cliente.

2 respuestas
eZpit

Yo en páginas de vuelos veo que te hacen una reserva con un timeout. Es decir, en cuanto marcas los vuelos y le das a continuar (la página en la que ya empiezas a rellenar datos personales) esos vuelos te los garantizan a ti durante "X minutos". Si tardas mucho en finalizar la compra, normalmente te da un error de timeout y te hace volver a empezar, y en ese momento entiendo que si alguien se te cuela y son los últimos vuelos, se los reserva a el.

1 respuesta
Yandr0s

#1 como dice #5 , añadir un timeout a la " pre reserva" es lo mas sensato

eXtreM3

#4 esa lógica con artículos físicos es implacable. Pero si lo trasladamos a lo digital, se convertiría en un "en cuanto seleccione X entradas el stock se reduce" y eso no debe ser así.

De todas formas me vais ayudando, ya tengo claro que antes de llegar a la pasarela el que va por detrás tiene que saber si hay stock o no.

Iré comentando.

1 respuesta
RaymaN

Ponerte a rellenar datos personales y que al pasar al siguiente paso te diga tararí es una patada en los huevos. Si me pasa a mí no vuelvo a visitar la página.

DarkSoldier

#7 lo primero para mi sería seleccionar el producto, una vez seleccionado, pasas a los siguientes pasos con un timeout como comentan, si dos usuarios a la vez cogen lo mismo, siempre habrá alguien antes que le de a aceptar primero por lo que ya estarán reservados y el otro usuario tendrá que coger otra cosa

bLero

#1 Mecanismo del crédito bancario.

En este caso el crédito es el stock. Cuando un usuario quiere reservar 4 entradas (stock = 5), automáticamente se descuenta el stock a 1 y se guarda una pre-reserva con un timestamp.

El resto de usuarios en ese momento sólo verán stock de 1 entrada libre.

Si el primer usuario pierde sesión (timeout) o finalmente no realiza la reserva (cancela), se borra la pre-reserva y se suma el stock pre-reservado. Además tienes que tener un demonio que compruebe si han expirado las pre-reservas y realice lo mismo.

Vamos, un bloqueo de stock puro y duro.

Un timeout de 10 minutos es lo lógico en este tipo de casos.

1 respuesta
eXtreM3

Vale, ya lo tengo hecho. Entre las manzanas de #4 y los demonios de #10 ha quedado todo claro.

  • Los dos usuarios van seleccionando el stock límite.
  • El primero que pulsa Comprar es el que lleva preferencia y el stock baja automáticamente.

Cuando el 2º usuario pulsa Comprar se revisa de nuevo el stock, y si no hay pum, aviso.

Ahora, si el 1er usuario finaliza compra, todo guay. Si no finaliza, cada vez que se recarguen los stocks (porque un tercer usuario quiera comprar) se ejecuta un script que revisa los stocks según el timestamp de la compra inicial del usuario 1.

Gracias a todos ;)

1 1 respuesta
m4andg4

#11 Me gusta, pero me da pena por el usuario 2. El usuario 3 le va a quitar sus manzanas :((((((( jajaja es una coña. Tienes mi bendición.

Usuarios habituales

  • m4andg4
  • eXtreM3
  • bLero
  • DarkSoldier
  • RaymaN
  • Yandr0s
  • eZpit