Venda de ingressos para o "grande estádio"

10

Eu quero (preciso) implementar uma venda de ingressos no estádio.
A idéia é permitir que o cliente escolha seu número de tickets (pode ser necessário limitar o limite, mas isso não é um grande problema. Acho que posso conseguir isso através da quantidade máxima permitida no carrinho). Depois disso, o cliente deve escolher seus assentos no mapa de assentos. Depois disso, o processo de checkout deve ocorrer normalmente.
Alguém sabe uma extensão para isso? Procurei um, mas não o encontrei para atender às minhas necessidades. Ou talvez minhas habilidades no Google precisem ser aprimoradas.
Se não houver extensão, algumas dicas sobre como fazê-lo seriam ótimas.
Até agora, minha ideia é criar um produto chamado 'Ticket' com algumas opções personalizadas (setor, linha, número do assento e talvez outras).
A página de visualização será personalizada, portanto as opções personalizadas não serão mostradas. A seleção do ticket ocorrerá em um pop-up ou sobreposição e, com base na seleção, simularei as opções personalizadas ao adicionar ao carrinho.
O mapa de assentos será mantido em uma mesa para que eu possa marcar os assentos reservados. O estádio é sempre o mesmo, portanto, um mapa deve ser suficiente.
É sobre isso até agora. Algo parece estar faltando. Qualquer ponteiro seria ótimo.
[EDIT]
Existe a possibilidade de criar um produto configurável com três atributos (setor, número de filas e assentos, cada combinação na quantidade disponível de 1, para que não estejam disponíveis após a compra), mas isso significaria mais de 30 mil produtos (por evento). Eu realmente não quero ir para lá. Estou mantendo isso como último recurso desesperado.. (Isso não é mais uma opção, pois resultará em um problema de desempenho huuuuge)

Marius
fonte

Respostas:

10

Eu fiz algo assim, e este é um exemplo artificial e simplificado demais para ver se você consideraria isso uma solução viável:

É semelhante à definição de uma grade de sudoku, mas as áreas abertas da grade de sudoku são assentos abertos:

$section1 = <<<SECTION

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

SECTION;

Esse gráfico de assentos (grade sudoku) é armazenado por produto. Todo evento é um novo produto. A grade é atualizada quando alguém adiciona ao carrinho (ou compras, dependendo das regras de negócios):

$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 a disponibilidade de assentos no seu modelo de back-end, é simples explode:

$chart = array();

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

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

Podemos $chartnos transformar em booleanos:

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

Verifique se A14 está disponível (0 indexado, lembre-se):

function checkAvailability($row,$seatnum){

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

}

Parte de cima:

A implementação é simples: seu atributo de disponibilidade de assentos é analisado por um modelo de back-end. É essencialmente um atributo EAV personalizado. Você também pode configurar os preços com base nas seções. Cada seção é um novo SKU com um novo preço. Você pode bloquear os assentos em alguns eventos e não em outros. Além disso, não é necessário transportar estoque real, apenas defina a quantidade no item do pedido de vendas durante a finalização da compra para determinar o preço.

As camadas funcionarão também, para que você obtenha descontos de compra em massa gratuitamente; isso pode ter sido uma preocupação com opções personalizadas.

Desvantagem:

A reserva de assentos será sua maior dor de cabeça, porque você não possui estoque real; é aí que esse método se desfaz. As regras comerciais determinarão como você trava / retém os assentos durante a finalização da compra.

philwinkle
fonte
1
+1 Woah. Se alguém já escreveu uma "A Arte da Programação em Magento", é melhor estar lá como um exemplo.
kalenjordan
Antes de tudo, quero dizer que me sinto um idiota. É claro que o preço deve estar nas seções. Em minha opinião, o preço estava em todos os assentos. D'oh! Quanto ao donwside, não vejo nenhum. Eu posso ter uma tabela simples segurando as reservadas / assentos comprados para todos os eventos com colunas event_id, sector, row, seat, status. O status pode ser 'reservado', 'comprado', 'não disponível'. Dessa forma, é fácil verificar se alguém reservou um assento 2 segundos antes de você. Também estou pensando em criar um novo tipo de produto (ticket de evento), para garantir que não haja problemas na configuração do produto. Obrigado pelos detalhes
Marius
Suas respostas são costuradas para juntar as peças do quebra-cabeça em minha mente. Ainda estou preocupado com o problema de desempenho, porque vender ingressos de 30 mil em 4-5 dias pode estressar muito os servidores, mas esse é um problema diferente. Tentarei disponibilizar esta extensão para a comunidade assim que ela terminar e se eu receber a 'luz verde' do cliente.
Marius
30k ingressos - este é um estádio da NASCAR? :) Acho que ter um único produto de ticket por seção, por evento (os eventos são configurações) reduzirá significativamente o tamanho do seu catálogo. A pegada db menor, então se encaixa espero inteiramente na memória ...
philwinkle
1
@philwinkle Enviei um e-mail para você porque moro no século 20 e não tenho uma conta no twitter.
Marius
2

Concordo que produtos configuráveis ​​não são uma ótima idéia, um assento é realmente apenas um indicador de se está disponível ou vendido e representá-lo com um produto Magento parece um exagero.

Sugiro um módulo personalizado que inclua uma tabela de registros para cada evento, os tickets serão para esse evento e, após a criação de um evento, um produto simples será criado para representá-lo na loja. Você pode usar um atributo de produto para manter a referência ao evento e às opções personalizadas preenchidas na página de visualização do front end mencionada para armazenar qual local foi comprado.

Luke Collymore
fonte
Obrigado. +1. Sua resposta combinada com a da philwinkle deve pelo menos me ajudar a começar na direção certa.
Marius