Sprzedaż biletów na „duży stadion”

10

Chcę (potrzebuję) wprowadzić sprzedaż biletów na stadion.
Chodzi o to, aby pozwolić klientowi wybrać liczbę biletów (może to być ograniczenie, ale to nie jest duży problem. Myślę, że mogę to osiągnąć poprzez maksymalną dozwoloną liczbę sztuk w koszyku). Następnie klient musi wybrać swoje miejsca z mapy miejsc. Następnie proces kasy powinien przebiegać jak zwykle.
Czy ktoś zna rozszerzenie tego? Szukałem jednego, ale nie znalazłem takiego, który pasowałby do moich potrzeb. A może moje umiejętności w Google wymagają poprawy.
Jeśli nie ma rozszerzenia, niektóre wskazówki, jak to zrobić, byłyby świetne.
Jak dotąd moim pomysłem jest stworzenie produktu o nazwie „Bilet” z niektórymi niestandardowymi opcjami (sektor, rząd, numer miejsca i być może inne).
Strona widoku zostanie wykonana na zamówienie, więc opcje niestandardowe nie będą wyświetlane. Wybór biletu nastąpi w wyskakującym okienku lub nakładce i na podstawie tego wyboru zasymuluję niestandardowe opcje podczas dodawania do koszyka.
Mapa miejsc będzie przechowywana w tabeli, dzięki czemu mogę zaznaczyć zarezerwowane miejsca. Stadion jest zawsze taki sam, więc jedna mapa powinna wystarczyć.
To tyle na razie. Coś wydaje się brakować. Wszelkie wskazówki byłyby świetne.
[EDYCJA]
Istnieje możliwość stworzenia konfigurowalnego produktu z 3 atrybutami (sektor, numer wiersza i stanowiska, każda kombinacja jest dostępna w ilości 1, więc nie będą dostępne po zakupie), ale oznaczałoby to ponad 30 000 produktów (na zdarzenie). Naprawdę nie chcę tam iść. Trzymam to jako ostatnią desperacką ucieczkę.. (To już nie jest opcja, ponieważ spowoduje to poważny problem z wydajnością)

Marius
źródło

Odpowiedzi:

10

Zrobiłem coś takiego i jest to wymyślony przykład i zbyt uproszczony, aby zobaczyć, czy uważasz, że jest to realne rozwiązanie:

Jest to podobne do definiowania siatki sudoku, ale otwarte obszary siatki sudoku to otwarte miejsca:

$section1 = <<<SECTION

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

SECTION;

Ta tabela miejsc (siatka sudoku) jest przechowywana dla poszczególnych produktów. Każde wydarzenie to nowy produkt. Siatka jest aktualizowana, gdy ktoś doda do koszyka (lub dokona zakupów, w zależności od reguł biznesowych):

$section1 = <<<SECTION

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

SECTION;

Aby rozdzielić dostępność miejsc w swoim modelu zaplecza, jest to proste explode:

$chart = array();

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

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

Możemy zmienić się $chartw booleany:

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

Sprawdź, czy A14 jest dostępny (0 indeksowane, pamiętaj):

function checkAvailability($row,$seatnum){

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

}

Do góry nogami:

Wdrożenie jest wyjątkowo proste: atrybut dostępności miejsc jest analizowany przez model zaplecza. Jest to w zasadzie niestandardowy atrybut EAV. Możesz także ustawić ceny na podstawie sekcji. Każda sekcja to nowa jednostka SKU z nową ceną. Możesz zablokować miejsca na niektórych imprezach, a nie na innych. Ponadto nie trzeba nosić rzeczywistych zapasów, należy jedynie ustawić ilość na pozycji zamówienia sprzedaży podczas realizacji transakcji w celu ustalenia ceny.

Poziomy również będą działać, więc otrzymasz bezpłatne zniżki na zakup hurtowy; może to dotyczyć opcji niestandardowych.

Minusem:

Rezerwacja miejsca będzie twoim największym bólem głowy, ponieważ nie nosisz rzeczywistych zapasów; właśnie tam ta metoda się rozpada. Reguły biznesowe określają sposób blokowania / utrzymywania miejsc podczas realizacji transakcji.

philwinkle
źródło
1
+1 Łał. Jeśli ktoś kiedykolwiek napisze „Sztukę programowania Magento”, niech to będzie przykład.
kalenjordan
Przede wszystkim chcę powiedzieć, że czuję się jak idiota. Oczywiście ceny powinny być podzielone na sekcje. Myślę, że cena była na każdym miejscu. Nie! Jeśli chodzi o donwside, nie widzę żadnego. Mogę mieć prostą tabelę gospodarstwa zastrzeżonego / zakupili miejsc dla każdej imprezy z kolumnami event_id, sector, row, seat, status. Status może być „zarezerwowany”, „zakupiony”, „niedostępny”. W ten sposób można łatwo sprawdzić, czy ktoś zarezerwował miejsce 2 sekundy przed tobą. Zastanawiam się też nad stworzeniem nowego typu produktu (biletu na wydarzenie), więc upewnię się, że nie ma problemów z konfiguracją produktu. Dzięki za szczegóły
Marius
Twoje odpowiedzi łączą się w mojej głowie. Nadal jestem zaniepokojony problemami z wydajnością, ponieważ sprzedaż 30 000 biletów w ciągu 4-5 dni może bardzo obciążać serwery, ale to inna sprawa. Postaram się udostępnić to rozszerzenie społeczności, gdy będzie gotowe i jeśli dostanę „zielone światło” od klienta.
Marius
Bilety 30 tys. - czy to stadion NASCAR? :) Myślę, że posiadanie jednego produktu z biletem na sekcję, na zdarzenie (wydarzenia są konfiguracjami) znacznie zmniejszy rozmiar katalogu. Mniejszy ślad db następnie mieści się całkowicie w pamięci ...
philwinkle
1
@ philwinkle Wysłałem ci e-mail, ponieważ mieszkam w XX wieku i nie mam konta na Twitterze.
Marius
2

Zgadzam się, że konfigurowalne produkty nie są świetnym pomysłem, że siedzenie jest tak naprawdę wskaźnikiem, czy jest dostępny lub sprzedawany, a reprezentowanie tego za pomocą produktu Magento brzmi jak przesada.

Sugerowałbym niestandardowy moduł, który zawierałby tabelę rekordów dla każdego wydarzenia, bilety byłyby wtedy na to wydarzenie, a po utworzeniu wydarzenia powstałby prosty produkt do reprezentowania tego w sklepie. Możesz użyć atrybutu produktu, aby przechowywać odniesienie do zdarzenia i niestandardowe opcje wypełnione ze strony widoku przedniego, o której wspomniałeś, aby zapisać, które miejsce zostało zakupione.

Luke Collymore
źródło
Dzięki. +1. Twoja odpowiedź w połączeniu z odpowiedzią od philwinkle powinna przynajmniej doprowadzić mnie do właściwego kierunku.
Marius