Hilfe zur Selbsthilfe - Artikelsets + Lagerbestände

Thema wurde von DKG - Die Kleine Geschenkidee (Peter), 3. Januar 2018 erstellt.

  1. DKG - Die Kleine Geschenkidee (Peter)

    Registriert seit:
    2. Oktober 2017
    Beiträge:
    304
    Danke erhalten:
    159
    Danke vergeben:
    101
    Hi liebe Gambionauten,

    solange gambio noch keine Bundle Funktion hat, habe ich hier eine kleine Anleitung zur Überbrückung
    (bis gambio eine Bundle-funktion hat).
    [kopiert aus GX2 Feature Request - ja so lange wird es schon von vielen Usern gewollt und nicht umgesetzt]

    Wir verkaufen bei uns im Unternehmen Porzellan.
    Für uns sind Artikelsets ein Muss.

    Beispiel:
    30-teiliges Porzellanset,
    bestehend aus:
    6 x Frühstücksteller
    6 x Speiseteller
    6 x Suppenteller
    6 x Tasse
    6 x Untertasse

    Jetzt will ich natürlich dieses Set im Shop anlegen und natürlich auch das, sobald ein Set verkauft wird, bei den Einzelartikeln die entsprechende Menge abgezogen wird. Das meine Lagerbestände stimmen ist A & O. Wenn mal Wirtschaftsprüfung ist - dann stimmt alles.

    Für alle, die nicht auf die Bundle-Funktion warten wollen - und Programmierkenntnisse, Datenbankkenntnisse und Erfahrung mit der Erstellung von Cronjobs haben, hier eine kleine Anleitung wie ihr die Zeit bis dahin überbrücken könnt.
    Benutzung auf eigene Gefahr, ich übernehme keine Gewähr.
    Ich umreisse die Thematik auch nur, ohne Vorkenntnisse geht es nicht!
    Ich poste auch kaum Quelltext, bei mir steckt eine ganze
    selbstgeschriebene WaWi dahinter mit viel mehr
    Optionen und wir wollen es ja halbwegs übersichtlich halten ;)


    1. Anlegen einer Tabelle in der Shopdatenbank

    Lege eine Tabelle in der Shopdatenbank an, nenne sie z.B. "meine_kombiartikel".
    Folgende Spalten brauchst Du:

    kombi_id
    int(11) - Null = Nein - AUTO_INCREMENT

    products_model
    varchar 20 - Null = Nein

    ka_von_1 (steht für Kombiartikel von 1)
    varchar 20 - Null = Ja

    ka_menge_1
    int 2 (oder größer - kommt auf Eure Mengen / Sets an) - Null = Ja

    #########################

    An dieser Stelle wichtig:
    Überlegt Euch was das größte Set in Eurem Shop ist und wieviele verschiedene Artikel darin sind.
    Ihr müsst von der größten Anzahl verschiedener Artikel, welche in einem Eurer Sets zu finden sind, ausgehen.
    Falls Ihr Euch nicht sicher seit, legt lieber ein paar mehr Spalten an...
    Dementsprechend erstellt Ihr dann weitere Spalten, für jeden weiteren Einzelartikel im Set legst Du

    ka_von_?
    und
    ka_menge_?

    ...an.

    Das Fragezeichen natürlich durch eine Zahl ersetzen.

    Die Spalte products_model beinhaltet später die Artikelnummer des Sets,
    welche Ihr beim Anlegen des Sets angegeben habt im Feld Artikel-Nr.

    Jede Spalte ka_von_? enthält später die Artikelnummer
    eines Einzelartikels aus Eurem Shop, welcher im Set enthalten ist

    Jede Spalte ka_menge_? enthält später die Anzahl an
    Einheiten des zuvor angegeben Einzelartikels aus Eurem Shop.

    Erläuterung:
    Angenommen, mein 30-teiliges Porzellanset, welches ich oben beschrieben habe, ist das größte Set in meinem Shop.
    Es beinhaltet 5 verschiedene Artikel.
    Dann bräuchte ich folgende Spalten:

    ka_von_1
    ka_menge_1
    ka_von_2
    ka_menge_2
    ka_von_3
    ka_menge_3
    ka_von_4
    ka_menge_4
    ka_von_5
    ka_menge_5


    So könnte dann Euer erster Eintrag in der Tabelle aussehen:

    kombi_id :: 0

    products_model :: Set-Nr-001-30-teilig

    ka_von_1 :: Fruehstuecksteller001
    ka_menge_1 :: 6

    ka_von_2 :: Speiseteller001
    ka_menge_2 :: 6

    ka_von_3 :: Suppenteller001
    ka_menge_3 :: 6

    ka_von_4 :: Tasse001
    ka_menge_4 :: 6

    ka_von_5 :: Untertasse001
    ka_menge_5 :: 6


    #########################


    2. Erstellen eines PHP-Scripts um Datensätze in die zuvor erstellte Tabelle einzupflegen (optional)

    An dieser Stelle könnt Ihr Euch überlegen ob Ihr ein php Script mit html Form erstellt, mit dem Ihr Datensätze in die zuvor erstellte Tabelle einpflegt oder ob ihr (weil ihr vielleicht nicht viele Sets habt) die direkt über phpmyadmin einhämmert.

    Wer php / html kann, der kann sich da ein kleines Formular basteln, ich gehe an der Stelle nicht weiter darauf ein.

    Hinterlegt das Script in einem passwortgeschützten Bereich !!!



    #########################

    3. Erstellen eines PHP-Scripts um
    - Set-Bestellungen zu erkennen
    - anhand unserer Tabelle Lagerbestände von Einzelartikeln anzupassen (via Cronjob).

    Das ist der neben der Erstellung der Datenbanktabelle, der wichtigste Teil.

    Das php Script muss eine Datenbankabfrage enthalten mit virtueller Tabelle:

    Ihr fragt die Tabelle "meine_kombiartikel" ab und joint die Tabellen "orders" & "orders_products".
    Aus der Tabelle orders benötigen wir die Spalte "orders_status".
    Überlegt Euch, bei welchem Status Ihr mit dem Script in die Bestellung eingreifen wollt.
    Sinn macht der Bestellstatus "Bezahlt"
    (bei mir hat der die ID 200 - ermittelt die ID Eures Bezahlt-Status bitte selbst - habe bei mir viel geändert).

    So könnte die Abfrage aussehen:

    PHP:
    <?php

    $result 
    mysqli_query($link"SELECT
                                      meine_kombiartikel.kombi_id,
                                      meine_kombiartikel.products_model as setartikelnummer,
                                      meine_kombiartikel.ka_von_1 as einzelartikel_eins,
                                      meine_kombiartikel.ka_menge_1 as einzelartikel_eins_menge,
                                      meine_kombiartikel.ka_von_2 as einzelartikel_zwei,
                                      meine_kombiartikel.ka_menge_2 as einzelartikel_zwei_menge,
                                      meine_kombiartikel.ka_von_3 as einzelartikel_drei,
                                      meine_kombiartikel.ka_menge_3 as einzelartikel_drei_menge,
                                      meine_kombiartikel.ka_von_4 as einzelartikel_vier,
                                      meine_kombiartikel.ka_menge_4 as einzelartikel_vier_menge,
                                      meine_kombiartikel.ka_von_5 as einzelartikel_fuenf,
                                      meine_kombiartikel.ka_menge_5 as einzelartikel_fuenf_menge,
                                      orders.orders_status as bestellstatus,
                                      orders_products.products_model as katalogsetartikelnummer,
                                      orders_products.products_quantity as bestellmenge
                               FROM
                                      `meine_kombiartikel`
                               JOIN
                                      `orders`
                               JOIN
                                      `orders_products`
                               WHERE  meine_kombiartikel.products_model = orders_products.products_model
                               AND    orders.orders_id = orders_products.orders_id
                               AND    orders.orders_status = '200'"
    );

    ?>
    Überlegt Euch ggf. auch folgendes:
    Sobald Euer Script läuft, wollt Ihr sicherlich nicht das ein Lagermitarbeiter die Bestellung bearbeitet oder etwas daran ändert.
    Erstellt evtl. einen weiteren Status, z.B. "Finger weg - Script arbeitet" und setzt diesen ein solange das Script arbeitet, setzt ihn am besten in Signalfarbe rot und sagt es den Leuten auch nochmal: Rot = Finger weg.

    Was ich mir auch schon überlegt habe, wäre die Option das man den Button fürs Bearbeiten ausblendet
    in der Bestellübersicht von gambio. Einfach indem man...

    HTML:
    style="display:none"
    ...einfügt über eine Variable - solange das Script läuft.
    Der Fantasie sind keine Grenzen gesetzt....
    ...allerdings hab ich das bisher vermieden weil ich nicht im
    AdminCore rumpfuschen will und es beim
    nächsten Update wieder weg ist.

    Die Scripterstellung ist jedem Programmierer überlassen, das wäre zu aufwendig das nun im Detail zu erklären, dann säße ich morgen noch hier :cool:

    Was ich bei der Abfrage oben vergessen habe: die Lagerbestände der Einzelartikel, die müsst ihr noch joinen.
    Folgende Tabelle wäre zu joinen:
    products

    Folgende Spalten braucht ihr daraus:
    - products_model
    - products_quantity

    WICHTIG:

    Wenn das Set mehr als einmal bestellt wurde
    (products_quantity [ aus der Tabelle orders_products (bestellmenge) ] > 1),
    dann müsst Ihr die (Mengen-)Werte ka_menge_? aus unserer Tabelle natürlich multiplizieren mit der

    products_quantity

    aus der Tabelle "orders_products" (bestellmenge).

    Einfach gesagt müsst ihr folgendes tun:

    Menge aus unserer Tabelle x Bestellmenge = Abzuziehender Wert

    Lagerbestand Einzelartikel (products_quantity aus products)
    minus Abzuziehender Wert = Aktualisierter Lagerbestand Einzelartikel

    AUCH EXTREM WICHTIG:
    Nachdem Euer Script durchgelaufen ist, sollte der Bestellstatus nicht auf "Bezahlt" zurückgesetzt werden.
    Sonst läuft das Script endlos drüber und ihr habt ganz schnell Minusbestände bei Euren Artikeln.
    Erstellt z.B. einen Status "Freigabe" und setzt den am Ende Eures Scripts.


    #########################

    4. Erstellung eines Cronjobs

    Erstellt einen Cronjob mit dem ihr das zuvor erstellte PHP-Script aufruft.
    Je nachdem wie das bei Eurem Hosting möglich ist,
    entweder über die Serversoftware oder über Konsole.
    Ich lasse meinen Cronjob alle 2 Minuten durchjuckeln.

    TIPP:
    schlankes Script ohne HTML Output,
    soll ja schnell durchlaufen werden bei Aufruf durch den Cronjob.

    Mal ein kleiner Tipp am Rande,
    für alle die gerne viele Cronjobs nutzen und evtl. nur eine begrenzte
    Anzahl an Cronjobs erstellen können:
    Erstellt eine bash Datei für alle Cronjobs die im 2 Minuten-Takt laufen sollen:

    uebergeordnet-2m.sh

    Nicht vergessen: bash Dateien im Unix Format speichern.
    In dieser Datei geben wir unsere untergeordneten bash Dateien an:

    Code:
    #!/bin/bash
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-1.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-2.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-3.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-4.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-5.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-6.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-7.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-8.sh
    /bin/bash /var/customers/webs/XXX/xxxxxxxxxxxx.de/ow-crons/bash/unter-2m-9.sh
    Dann erstellt ihr untergeordnete bash Dateien:

    untergeordnet-2m-1.sh
    untergeordnet-2m-2.sh
    usw. ...

    In den untergeordneten bash Dateien könnt ihr nun Eure Cronbefehle eintragen.

    Code:
    #!/bin/bash
    /usr/bin/php /var/customers/webs/XXX/xxxxxxxxxxxxxx.de/ow-crons/meine-kombiartikel-einzelartikel-updaten.php
    Aufrufen über den Crontab oder die Serversoftware müsst ihr aber nur die

    uebergeordnet-2m.sh

    ..welche dann die untergeordneten aufruft.

    Übertreibt es aber nicht damit - Hoster sehen so etwas nicht gern,
    die setzen ja nicht aus Spaß Limits bei den Cronjobs (Fair-Use / Serverlast)

    #########################


    Ich hoffe ich konnte dem ein oder anderen programmiertechnisch Versierteren unter Euch eine kleine Anregung zur Übergangslösung bieten - bis gambio eine Bundle-Funktion hat.

    Greets
    Peter

    NACHTRAG:
    Wer natürlich auch den Set-Lagerbestand immer aktuell haben möchte,
    errechnet aus den Lagerbeständen der Einzelartikel, der macht sich noch ein weiteres kleines
    php Script, welches per Cronjob aufgerufen wird (z.B. alle 15 min), zieht sich die Einzelartikel
    aus unserer Tabelle, ruft deren Lagerbestände (products_quantity) in der Shop-Datenbanktabelle "products" auf und dividiert diese durch die Menge des Einzelartikels in unserem Set (ka_menge_?).

    --- Also auch hier wieder eine virtuelle Tabelle ---

    Die ermittelten Divionswerte abrunden auf Ganzzahlen (php floor oder php number_format).
    Für die ermittelten & abgerundeten Divisionswerte benutzt Ihr dann noch php min und schon habt ihr Euren
    Set-Lagerbestand ;):cool::rolleyes:

    ...und wer bei dieser Variante noch zuviel Schiss hat das er ein Set verkauft, dessen Bestandteile evtl. nicht genug auf Lager sind, der kann noch folgende Ideen umsetzen:
    - Cronjob in kleineren Abständen
    - eine weitere Spalte in "unserer" Tabelle "meine_kombiartikel":

    Nennt diese zum Beispiel "uevh" (Abkürzung für Überverkaufsverhinderer :D)
    und macht daraus eine int Spalte mit Null = Ja / Standard = 0

    Dann könnt ihr hier einen Wert eintragen, der zusätzlich von Eurem, wie ein wenig weiter oben beschriebenen, Set-Lagerbestand abgezogen wird.

    Beispiel:
    Ihr habt mit Eurem Script errechnet das noch 3 Sets zusammenstellbar wären
    - aus dem Bestand Eurer Einzelartikel.

    In eurer Spalte "uevh" habt Ihr den (Sicherheits-) Wert 1 eintragen.

    3 - 1 = 2

    PHP:
    $setlagerbestand $verfuegbaresets $uevh
    Die 2 könntet Ihr nun beim Set als Lagerbestand von Eurem Script eintragen lassen.
    Eigentlich sind 3 Sets Verfügbar - ihr bietet aber nur 2 zum Verkauf an - um Überverkäufe zu verhindern.

    Besonders Sinn macht das wenn Ihr magnalister im Einsatz habt und auf vielen Plattformen handelt.
    Dann habt ihr schnell mal einen Überverkauf - wenn Ihr
    a) magnalister nicht richtig konfiguriert habt (Lagerbestand abzüglich Wert X)
    b) bei einem solchen Script auch nicht vorausschauend programmiert habt

    NACHTRAG 2:
    An der Stelle möchte ich Sergey und Wilken von gambio
    nochmal widersprechen zu dem was sie hier im Topic
    zu dem Thema geschrieben haben.
    Ihr denkt um zuviel Ecken.
    Beim Anlegen eines Artikels würde es völlig reichen wenn da eine Checkbox ist
    um zu markieren das es sich bei diesem Artikel um einen Kombiartikel handelt.
    Den Artikel selbst legst Du an wie jeden anderen auch.
    In der Artikelbeschreibung geht man eh darauf ein was im Set alles enthalten ist, der Kunde kauft ja nicht die Katze im Sack.
    Also ist es nicht nötig was Eckiges in was Rundes zu bekommen.

    Sobald bei einem Artikel die Checkbox aktiviert ist - und somit eine 1 in der DB steht, greift an ganz anderer Stelle im Adminbereich, da ist Eurer Fantasie keine Grenze gesetzt (z.B. unter Artikel > Kombiartikel) , ein Script das auf und dort kann ich dann meine Deklaration des Sets hinterlegen, wie hier in meiner Tabelle "meine_kombiartikel" - dann vielleicht auch etwas eleganter programmiert.

    Ist bei einem Artikel die Checkbox aktiviert und man vergisst dann die Deklaration zu hinterlegen,
    kann ja z,B. im Admin Dashboard dann eine Meldung kommen:
    "Du hast noch X ausstehende Aufgaben" oder "Du hast vergessen ein Set zu deklarieren"....

    Denkt wiegesagt nicht um zuviel Ecken.
    Das aus Einzelartikeln wirklich automatisch ein Set erstellt wird - ist utopisch.
    Und daran (Zusammenführung von Daten) scheitern auch große Plattformen wie real / Hitmeister.
    Dort wird versucht, nach Vorbild von amazon, aus den Beschreibungen einzelner Händler eine eizigste Beschreibung zu machen. Mit haarsträubendem Ergebnis. Da stehen dann schon mal 2 oder mehr Produktbeschreibungen von 2 oder mehr Händlern einfach untereinandergeklatscht da:
    Den Anhang 20601 betrachten

    Bilder alle zusammengewürfelt.
    amazon hat das besser im Griff.

    Und der Preis eines Sets muss auch nicht aus den Preisen der Einzelartikel addiert werden.
    Ist doch völliger Humbug. Man legt doch Sets an um
    a) selber beim Versand zu sparen
    b) ein Teil der Ersparnis evtl. an den Kunden weiterzugeben.

    Also wird der Setpreis sich immer unterscheiden zu den Einzelpreisen....

    Und Posten-Sets (mehrere Einheiten des gleichen Artikels) sind kein Argument in dieser Diskussion,
    denn derjenige kann einfach Staffelpreise im Shop aktivieren und somit Posten-Sets anbieten.

    Und auch der gambio Code ist keine Argumentation bei dieser Diskussion.
    Wenn Du so argumentierst als Programmierer, dann hast Du Dich i.d.R. schon verrannt in
    Deiner Programmierung (siehst den Wald vor lauter Bäumen nicht) und musst das Ganze mal wieder mit Abstand betrachten.
    Betrachte Deine DB - dort hast Du alle Daten die Du brauchst.

    Bevor Ihr Euch also vielleicht in etwas verrennt, versucht es "einfacher" zu sehen.
    Erstmal einen Fiat hinbekommen statt gleich beim Porsche anzufangen.

    Zumal, wir reden hier wirklich von einfachsten mathematischen Rechnungen,
    alles kein Hexenwerk:


    ###

    Lagerbestand Einzelartikel =

    Alter Lagerbestand Einzelartikel
    minus Deklarierte Menge in Set x Bestellmenge
    = Neuer Lagerbestand Einzelartikel

    ###

    Lagerbestand Set =

    Alter Lagerbestand Set
    minus Ermittelte Mindestmenge minus Sicherheitswert (uevh)
    = Neuer Lagerbestand Set

    ###

    Tipp: macht keinen globalen Sicherheitswert (uevh)
    - man sollte das individuell pro Set einstellen können...

    ###



    LG