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)

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.


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.


Obrigado. +1. Sua resposta combinada com a da philwinkle deve pelo menos me ajudar a começar na direção certa.
— Marius
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.