Verkauf von Tickets für das „große Stadion“

10

Ich möchte (muss) einen Stadionkartenverkauf implementieren.
Die Idee ist, den Kunden seine Anzahl von Tickets auswählen zu lassen (eine Begrenzung kann erforderlich sein, aber dies ist kein großes Problem. Ich denke, ich kann dies durch die maximal zulässige Menge im Warenkorb erreichen). Danach muss der Kunde seine Plätze aus einem Sitzplan auswählen. Danach sollte der Checkout-Vorgang wie gewohnt ablaufen.
Kennt jemand eine Erweiterung dafür? Ich habe nach einem gesucht, aber keinen gefunden, der meinen Bedürfnissen entspricht. Oder vielleicht müssen meine Google-Kenntnisse verbessert werden.
Wenn es keine Erweiterung gibt, wären einige Hinweise dazu großartig.
Meine bisherige Idee ist es, ein Produkt namens "Ticket" mit einigen benutzerdefinierten Optionen (Sektor, Reihe, Sitznummer und möglicherweise andere) zu erstellen.
Die Ansichtsseite wird benutzerdefiniert erstellt, sodass die benutzerdefinierten Optionen nicht angezeigt werden. Die Ticketauswahl erfolgt in einem Popup oder Overlay. Basierend auf der Auswahl simuliere ich die benutzerdefinierten Optionen beim Hinzufügen zum Warenkorb.
Der Sitzplan wird in einer Tabelle aufbewahrt, damit ich die gebuchten Sitzplätze markieren kann. Das Stadion ist immer das gleiche, daher sollte eine Karte ausreichen.
Das war's schon soweit. Es scheint etwas zu fehlen. Alle Hinweise wären toll.
[BEARBEITEN]
Es besteht die Möglichkeit, ein konfigurierbares Produkt mit 3 Attributen zu erstellen (Sektor-, Zeilen- und Sitznummer, jede Kombination in Menge von 1 verfügbar, sodass sie nach dem Kauf nicht verfügbar sind). Dies würde jedoch mehr als 30.000 Produkte (pro Stück) bedeuten Veranstaltung). Ich möchte wirklich nicht dorthin gehen. Ich behalte dies als letzten verzweifelten Ausweg.. (Dies ist keine Option mehr, da dies zu einem enormen Leistungsproblem führt.)

Marius
quelle

Antworten:

10

Ich habe so etwas getan, und dies ist ein erfundenes Beispiel und zu stark vereinfacht, um zu sehen, ob Sie dies überhaupt als praktikable Lösung betrachten würden:

Es ist ähnlich wie beim Definieren eines Sudoku-Gitters, aber die offenen Bereiche des Sudoku-Gitters sind offene Plätze:

$section1 = <<<SECTION

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

SECTION;

Dieser Sitzplan (Sudoku-Raster) wird pro Produkt gespeichert. Jede Veranstaltung ist ein neues Produkt. Das Raster wird aktualisiert, wenn jemand in den Warenkorb legt (oder Einkäufe tätigt, abhängig von den Geschäftsregeln):

$section1 = <<<SECTION

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

SECTION;

Um die Verfügbarkeit von Sitzplätzen in Ihrem Backend-Modell zu trennen, ist es ganz einfach explode:

$chart = array();

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

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

Wir können uns $chartin Boolesche Werte verwandeln:

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

Überprüfen Sie, ob A14 verfügbar ist (0 indiziert, denken Sie daran):

function checkAvailability($row,$seatnum){

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

}

Oberseite:

Die Implementierung ist kinderleicht: Ihr Sitzplatzverfügbarkeitsattribut wird von einem Backend-Modell analysiert. Es ist im Wesentlichen ein benutzerdefiniertes EAV-Attribut. Sie können die Preisgestaltung auch anhand von Abschnitten einrichten. Jeder Abschnitt ist eine neue SKU mit einem neuen Preis. Sie können bei einigen Veranstaltungen Sitzplätze sperren und bei anderen nicht. Sie müssen auch kein echtes Inventar führen, sondern müssen nur die Menge auf dem Kundenauftragsposten während der Kaufabwicklung für die Preisgestaltung festlegen.

Stufen funktionieren auch, sodass Sie kostenlose Mengenrabatte erhalten. Dies war möglicherweise ein Problem mit benutzerdefinierten Optionen.

Nachteil:

Die Sitzplatzreservierung wird Ihre größten Kopfschmerzen sein, da Sie kein tatsächliches Inventar führen. dort fällt diese Methode auseinander. Die Geschäftsregeln bestimmen, wie Sie Sitze während der Kaufabwicklung sperren / halten.

philwinkle
quelle
1
+1 Woah. Wenn jemand jemals eine "Kunst der Magento-Programmierung" schreibt, sollte dies besser als Beispiel dienen.
Kalenjordan
Zunächst möchte ich sagen, dass ich mich wie ein Idiot fühle. Natürlich sollte die Preisgestaltung nach Abschnitten erfolgen. Ich denke, der Preis war auf jedem Sitzplatz. D'oh!. Was die Donwside betrifft, sehe ich keine. Ich kann eine einfache Tabelle mit Spalten , den Vorbehalt / gekauft Sitze für jede Veranstaltung halten event_id, sector, row, seat, status. Der Status kann "reserviert", "gekauft", "nicht verfügbar" sein. Auf diese Weise können Sie leicht überprüfen, ob jemand 2 Sekunden vor Ihnen einen Sitzplatz reserviert hat. Ich denke auch darüber nach, einen neuen Produkttyp (Ereignisticket) zu erstellen, damit ich sicher bin, dass es keine Probleme bei der Produkteinrichtung gibt. Vielen Dank für die Details
Marius
Ihre Antworten scheinen die Puzzleteile in meinem Kopf zusammenzusetzen. Ich bin immer noch besorgt über Leistungsprobleme, da der Verkauf von 30.000 Tickets in 4-5 Tagen die Server stark belasten kann, aber dies ist ein anderes Problem. Ich werde versuchen, diese Erweiterung für die Community verfügbar zu machen, sobald sie fertig ist und wenn ich vom Kunden grünes Licht bekomme.
Marius
30.000 Tickets - ist das ein NASCAR-Stadion? :) Ich denke, dass ein einziges Ticketprodukt pro Abschnitt und Ereignis (Ereignisse sind Konfigurationen) Ihre Kataloggröße erheblich reduzieren wird. Der kleinere DB-Footprint passt dann hoffentlich ganz in die Erinnerung ...
Philwinkle
1
@philwinkle Ich habe dir eine E-Mail geschickt, weil ich im 20. Jahrhundert lebe und keinen Twitter-Account habe.
Marius
2

Ich bin damit einverstanden, dass konfigurierbare Produkte keine gute Idee sind. Ein Sitz ist wirklich nur ein Hinweis darauf, ob er verfügbar oder verkauft ist, und dies mit einem Magento-Produkt darzustellen, klingt nach Overkill.

Ich würde ein benutzerdefiniertes Modul vorschlagen, das eine Tabelle mit Datensätzen für jedes Ereignis enthält. Die Tickets sind dann für dieses Ereignis bestimmt, und bei der Erstellung eines Ereignisses wird ein einfaches Produkt erstellt, um dies im Geschäft darzustellen. Sie können ein Produktattribut verwenden, um den Verweis auf das Ereignis und die benutzerdefinierten Optionen zu speichern, die auf der von Ihnen erwähnten Front-End-Ansichtsseite ausgefüllt sind, um zu speichern, welcher Sitzplatz gekauft wurde.

Luke Collymore
quelle
Vielen Dank. +1. Ihre Antwort in Kombination mit der von Philwinkle sollte mich zumindest in die richtige Richtung bringen.
Marius