Mehrere Geschäftsansichten teilen sich den gleichen Nummernbereich für order increment_id

13

Kann Magento so konfiguriert werden, dass mehrere Store-Ansichten derselben Website denselben Bestellnummernbereich teilenincrement_id können? Und wenn ja, wie?

Zum Beispiel mit einem Multistore-Setup wie diesem in core_store:

store_id        code    website_id    group_id
       0       admin             0           0
       1       alpha             1           1
       2       bravo             2           2
       3     charlie             2           2

Nun wird eine neue Geschäftsansicht deltahinzugefügt:

store_id        code    website_id    group_id
       4       delta             1           1

Unter alphader Annahme , dass die Inkrement-ID der letzten Bestellung derzeit 1000123 lautet, kann Folgendes erreicht werden:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

Dieselbe Frage gilt für mehrere Geschäftsansichten, die denselben Rechnungsnummernbereich increment_idund / oder denselben Kreditmemo- increment_idNummernbereich verwenden.

Unterstützt Magento dieses Out-of-the-Box?

Jürgen Thelen
quelle
Mit der Anleitung von @ alessandro-ronchi habe ich die Lösung so implementiert. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e funktioniert hervorragend für mich.
Michael

Antworten:

5

Ich würde mir vorstellen, dass dies ziemlich schwierig sein würde. Inkrementelle IDs werden in der eav_entity_storeTabelle gespeichert, und es überrascht nicht, dass jedes Geschäft einen eigenen Eintrag hat, der aktualisiert wird, wenn eine Bestellung (und ein Angebot, eine Rechnung usw.) erstellt wird. Um alle Stores dazu zu bringen, denselben Inkrementierer zu verwenden, müssten Sie diese Logik irgendwie neu schreiben, damit sie dieselbe Zeile in der DB verwendet. Welche Auswirkungen dies auf andere Bereiche der Website haben könnte, muss noch geprüft werden.

Richard Cleverley
quelle
Ich stimme Richard zu.
Sylvain Rayé
Sie haben wahrscheinlich Recht, aber wenn Sie diesen Code ausführen, folgen alle meine Rechnungen der gleichen ZahlenfolgeMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh,
3

Sie können das Inkrementmodell für Bestellungen, Lieferungen, Rechnungen und Gutschriften überschreiben, indem Sie die Klasse "eav / entity_increment_numeric" mit benutzerdefinierter Logik in einem Modell von Ihnen umschreiben.

Schauen Sie sich die Vorfahrklassen (Mage_Eav_Model_Entity_Increment_Numeric und Mage_Eav_Model_Entity_Increment_Abstract) an, um zu verstehen, wie Sie Ihre eigene Logik bereitstellen.

Sie können die Logik zwischen verschiedenen Entitäten unterscheiden, indem Sie den Parameter $ entityTypeCode der zu überschreibenden Funktion getNextId () überprüfen.

Eine andere (invasivere) Möglichkeit besteht darin, für jeden Entitätstyp ein anderes Inkrementmodell anzugeben, indem der Wert der Spalte "increment_model" der Tabelle "eav_entity_type" (über ein Installationsskript) überschrieben wird. Persönlich bevorzuge ich die oben erwähnte "Rewrite" -Lösung.

Beachten Sie: Inkrement-IDs unterliegen in den neuesten Magento-Versionen einer Eindeutigkeitsbeschränkung, sodass Sie nicht dieselbe Inkrement-ID für zwei verschiedene Entitäten desselben Typs speichern können. Mit anderen Worten, Sie können nicht zwei verschiedene Rechnungen mit derselben Inkrement-ID haben.

Ich hoffe es hilft.

Alessandro Ronchi
quelle
Sah in dieser , aber ich bin nicht in der Lage zu finden , getLastId()in Mage_Eav_Model_Entity_Increment_Numericoder in jeder anderen Klasse oder in der Hierarchie verbinden. Übrigens sollte dies die akzeptierte Antwort sein.
Michael
UPDATE: Ich habe gerade festgestellt, dass es sich um eine Unterkunft handelt, die am Varien_ObjectvonMage_Eav_Model_Entity_Type
Michael
2

Beim tieferen Graben wurde mir klar, dass eav_entity_type.increment_per_storedies hilfreich sein kann.

Es ist. Aber nur für den Fall, dass Sie möchten, dass alle Store-Ansichten (global, unabhängig von der Website, auf der sie definiert sind) Ihrer Magento-Installation denselben Bestellnummernbereich haben increment_id.

Dies löst mein spezifisches Problem nicht, aber vielleicht ist es für einige andere hilfreich.

Um die globale Freigabe Ihrer Bestellnummern zu aktivieren, setzen Sie eav_entity_type.increment_per_storedie Bestellentität auf 0,

Dies führt dazu Mage_Eav_Model_Entity_Type::fetchNewIncrementId(), dass store_id = 0beim Laden des eav_entity_storeDatensatzes die Entität der Bestellung verwendet wird, unabhängig davon, zu welcher Geschäftsansicht sie wirklich gehört.

Wenn kein solcher Datensatz vorhanden ist, erstellt Magento einen mit store_idund increment_prefixvon 0.

public function fetchNewIncrementId($storeId = null)
{
    if (!$this->getIncrementModel()) {
        return false;
    }

    if (!$this->getIncrementPerStore() || ($storeId === null)) {
        /**
         * store_id null we can have for entity from removed store
         */
        $storeId = 0;
    }

    // Start transaction to run SELECT ... FOR UPDATE
    $this->_getResource()->beginTransaction();

    $entityStoreConfig = Mage::getModel('eav/entity_store')
        ->loadByEntityStore($this->getId(), $storeId);

    if (!$entityStoreConfig->getId()) {
        $entityStoreConfig
            ->setEntityTypeId($this->getId())
            ->setStoreId($storeId)
            ->setIncrementPrefix($storeId)
            ->save();
    }

    $incrementInstance = Mage::getModel($this->getIncrementModel())
        ->setPrefix($entityStoreConfig->getIncrementPrefix())
        ->setPadLength($this->getIncrementPadLength())
        ->setPadChar($this->getIncrementPadChar())
        ->setLastId($entityStoreConfig->getIncrementLastId())
        ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
        ->setStoreId($entityStoreConfig->getStoreId());

    /**
     * do read lock on eav/entity_store to solve potential timing issues
     * (most probably already done by beginTransaction of entity save)
     */
    $incrementId = $incrementInstance->getNextId();
    $entityStoreConfig->setIncrementLastId($incrementId);
    $entityStoreConfig->save();

    // Commit increment_last_id changes
    $this->_getResource()->commit();

    return $incrementId;
}

Dies sollte für jeden Entitätstyp arbeiten , um die Verwendung von eav/entity_increment_numericModell, wie order, invoice, shipmentund creditmemo.

Beachten Sie jedoch, dass ich noch keine offizielle Dokumentation finden konnte increment_per_store. Und dass es im Magento-Backend keine Option gibt, mit der Sie dies konfigurieren können.

Dies kann bedeuten oder auch nicht, dass davon ausgegangen wird, dass es nicht offiziell verwendet wird.

Benutzung auf eigene Gefahr. Wenn Ihre Änderungen Chaos anrichten, beschuldigen Sie mich nicht. Du wurdest gewarnt ^^

Jürgen Thelen
quelle
1

Es wird nicht sofort unterstützt. Ich wollte dies auch einmal tun, damit eine zweite Storeview für einen A / B-Test dieselbe increment_id aus dem ursprünglichen Store verwendet.

Ich habe versucht, diese beiden Zahlen auf einfache Weise checkout_submit_all_afterzuzuordnen, als sie abgefeuert wurden, fühlte mich aber sehr unwohl und ließ sie fallen. Ich denke, mit mehr Storeviews und viel Verkehr kann dies zu einem echten Durcheinander führen, so dass Sie tiefer in die Magentos-Logik eintauchen müssen.

mnp
quelle
0

Lösung:

Unterschiedliche Bestell- / Rechnungs- / Gutschriftsnummern usw. sind für verschiedene Länder sehr nützlich, was meistens auf der Ebene einer Filialgruppe bedeutet.

Es ist jedoch eine schlechte Sache, unterschiedliche Nummernkreise auf der Ebene der Geschäftsansichten zu haben, wenn Sie Geschäftsansichten für verschiedene Sprachen verwenden, was in 90% aller Fälle der Fall sein kann.

Zum Glück ist es nicht so schwierig, wie in diesem Thread vorgeschlagen:

Wir werden die Standard-Geschäftsansichts-ID abrufen, anstatt die Geschäftsansichts-ID zu verwenden, mit der die Methode aufgerufen wird . Dazu wird die Geschäftsgruppe für die aktuelle Geschäftsansicht aufgelöst und die Standardgeschäftsansicht-ID abgerufen. Dann verwendet jede Geschäftsansicht einer bestimmten Geschäftsgruppe dasselbe Nummernkreisformat (das aus der Standardgeschäftsansicht).

Erstelle diese Klasse:

class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
    /**
     * Retreive new incrementId
     *
     * @param int $storeId
     * @return string
     * @throws Exception
     */
    public function fetchNewIncrementId($storeId = null)
    {
        if (!$this->getIncrementModel()) {
            return false;
        }

        if (!$this->getIncrementPerStore() || ($storeId === null)) {
            /**
             * store_id null we can have for entity from removed store
             */
            $storeId = 0;
        }

        //FIX START:
        $groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
        $group =  Mage::getModel('core/store_group')->load($groupId);
        $storeId = $group->getDefaultStoreId();
        //FIX END:

        // Start transaction to run SELECT ... FOR UPDATE
        $this->_getResource()->beginTransaction();

        try {

            $entityStoreConfig = Mage::getModel('eav/entity_store')
                ->loadByEntityStore($this->getId(), $storeId);

            if (!$entityStoreConfig->getId()) {
                $entityStoreConfig
                    ->setEntityTypeId($this->getId())
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($storeId)
                    ->save();
            }

            $incrementInstance = Mage::getModel($this->getIncrementModel())
                ->setPrefix($entityStoreConfig->getIncrementPrefix())
                ->setPadLength($this->getIncrementPadLength())
                ->setPadChar($this->getIncrementPadChar())
                ->setLastId($entityStoreConfig->getIncrementLastId())
                ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
                ->setStoreId($entityStoreConfig->getStoreId());

            /**
             * do read lock on eav/entity_store to solve potential timing issues
             * (most probably already done by beginTransaction of entity save)
             */
            $incrementId = $incrementInstance->getNextId();
            $entityStoreConfig->setIncrementLastId($incrementId);
            $entityStoreConfig->save();

            // Commit increment_last_id changes
            $this->_getResource()->commit();
        } catch (Exception $e) {
            $this->_getResource()->rollBack();
            throw $e;
        }

        return $incrementId;
    }

}

Fügen Sie diese Änderung zu config.xml Ihres Moduls hinzu:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

Wenn Sie einen schöneren Weg haben, ohne das Wissen umschreiben zu müssen, verbreiten Sie es. Habe Spaß. Hacke nicht den Kern.

Michael Leiss
quelle