Venta de entradas para el "gran estadio"

10

Quiero (necesito) implementar una venta de entradas para el estadio.
La idea es dejar que el cliente elija su número de boletos (puede que sea necesario limitarlo, pero esto no es un gran problema. Creo que puedo lograrlo a través de la cantidad máxima permitida en el carrito). Después de eso, el cliente debe elegir sus asientos de un mapa de asientos. Después de eso, el proceso de pago debería ir como de costumbre.
¿Alguien sabe una extensión para esto? Busqué uno pero no encontré uno que se ajustara a mis necesidades. O tal vez mis habilidades de google necesitan mejorar.
Si no hay extensión, algunos consejos sobre cómo hacerlo sería genial.
Mi idea hasta ahora es crear un producto llamado 'Ticket' con algunas opciones personalizadas (sector, fila, número de asiento y tal vez otras).
La página de vista se personalizará, por lo que no se mostrarán las opciones personalizadas. La selección del boleto se realizará en una ventana emergente o superpuesta, y en función de la selección simularé las opciones personalizadas al agregar al carrito.
El mapa de asientos se mantendrá en una tabla para que pueda marcar los asientos reservados. El estadio es siempre el mismo, por lo que un mapa debería ser suficiente.
Eso es todo hasta ahora. Algo parece faltar. Cualquier punto sería genial.
[EDITAR]
Existe la posibilidad de crear un producto configurable con 3 atributos (sector, fila y número de asiento, cada combinación en cantidad disponible de 1 para que no estén disponibles una vez que se compran), pero esto significaría 30k + productos (por evento). Realmente no quiero ir allí. Lo mantendré como último recurso desesperado.. (Esto ya no es una opción porque resultará en un problema de rendimiento enorme)

Marius
fuente

Respuestas:

10

He hecho algo como esto, y este es un ejemplo artificial y simplificado en exceso para ver si incluso considerarías que es una solución viable:

Es similar a definir una cuadrícula de sudoku, pero las áreas abiertas de esa cuadrícula de sudoku son asientos abiertos:

$section1 = <<<SECTION

A,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
C,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
D,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
E,-,-,-,-,-,-,-,-,-,-,-,-

SECTION;

Esa tabla de asientos (cuadrícula de sudoku) se almacena por producto. Cada evento es un producto nuevo. La cuadrícula se actualiza cuando alguien agrega al carrito (o compra, según las reglas comerciales):

$section1 = <<<SECTION

A,-,-,x,-,-,-,-,-,x,-,-,x,x,x,x,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
B,-,-,-,-,-,-,-,-,-,-,-,-,-,x,-,-,-,-,-,-,-,-,-,-,-,-,-
C,-,-,-,-,-,x,x,x,-,x,-,x,-,-,-,-,-,-,-,-,-
D,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-
E,-,-,-,-,-,x,-,x,-,x,-,x

SECTION;

Para separar la disponibilidad de asientos en su modelo de back-end es simple explode:

$chart = array();

$section = trim(explode('\n', $product->getSeatingChart()));

foreach($section as $row){
    $seats = explode(',',$row);
    $rownum = array_shift($seats);
    $chart[$rownum] = $seats;
}

Podemos convertirnos $charten booleanos:

array_walk($chart,function(&$s){
    $s = $s == "-" ? true : false;
});

Compruebe si A14 está disponible (0 indexado, recuerde):

function checkAvailability($row,$seatnum){

    return $chart[$row][$seatnum-1] == true;

}

Al revés:

La implementación es muy simple: su atributo de disponibilidad de asientos se analiza mediante un modelo de back-end. Es esencialmente un atributo EAV personalizado. También puede configurar precios basados ​​en secciones. Cada sección es un nuevo SKU con un nuevo precio. Puede bloquear asientos en algunos eventos y no en otros. Además, no es necesario llevar un inventario real, solo establezca la cantidad en el artículo de pedido de ventas durante el pago para la fijación de precios.

Los niveles también funcionarán, por lo que obtendrá descuentos de compra a granel de forma gratuita; eso puede haber sido una preocupación con las opciones personalizadas.

Abajo:

La reserva de asientos será su mayor dolor de cabeza porque no tiene inventario real; ahí es donde este método se desmorona. Las reglas comerciales determinarán cómo bloquear / mantener los asientos durante el pago.

philwinkle
fuente
1
+1 Woah. Si alguien alguna vez escribe un "El arte de la programación de Magento", será mejor que este sea un ejemplo.
kalenjordan
Antes que nada quiero decir que me siento como un idiota. Por supuesto, el precio debe estar en secciones. Creo que el precio estaba en cada asiento. D'oh! En cuanto al lado del burro, no veo ninguno. Puedo tener una sencilla tabla que sostiene los asientos reservados / compradas por cada evento con columnas event_id, sector, row, seat, status. El estado puede ser 'reservado', 'comprado', 'no disponible'. De esta manera, parece fácil verificar que alguien reservó un asiento 2 segundos antes que usted. También estoy pensando en crear un nuevo tipo de producto (boleto de evento) para asegurarme de que no haya problemas en la configuración del producto. Gracias por los detalles
Marius
Tus respuestas parecen juntar las piezas del rompecabezas en mi mente. Todavía estoy preocupado por el problema de rendimiento, porque vender 30 mil tickets en 4-5 días puede estresar mucho a los servidores, pero este es un problema diferente. Intentaré hacer que esta extensión esté disponible para la comunidad una vez que esté hecha y si obtengo la "luz verde" del cliente.
Marius
30 mil entradas: ¿es este un estadio de NASCAR? :) Creo que tener un solo boleto de producto por sección, por evento (los eventos son configuraciones) reducirá significativamente el tamaño de su catálogo. La huella más pequeña db entonces espero que encaja por completo en la memoria ...
philwinkle
1
@philwinkle Te envié un correo electrónico porque vivo en el siglo XX y no tengo una cuenta de Twitter.
Marius
2

Estoy de acuerdo en que los productos configurables no son una gran idea, un asiento es realmente solo un indicador de si está disponible o vendido, y representar esto con un producto Magento suena como una exageración.

Sugeriría un módulo personalizado que incluiría una tabla de registros para cada Evento, las entradas serían para este Evento y, al crear un Evento, se crearía un producto simple para representarlo en la tienda. Puede usar un atributo de producto para contener la referencia al evento y las opciones personalizadas que aparecen en la página de vista frontal que menciona para almacenar qué asiento se compró.

Luke Collymore
fuente
Gracias. +1. Su respuesta combinada con la de philwinkle al menos debería ayudarme a comenzar en la dirección correcta.
Marius