Avoir plusieurs vues de magasin partagent la même plage de numéros de commande increment_id

13

Magento peut-il être configuré de manière à ce que plusieurs vues de magasin du même site Web puissent partager la mêmeincrement_id plage de numéros de commande ? Et si oui, comment?

Par exemple, avec une configuration à plusieurs magasins comme celle-ci dans 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

Maintenant, une nouvelle vue de magasin deltaest ajoutée:

store_id        code    website_id    group_id
       4       delta             1           1

En supposant que alphale dernier ID d'incrément de commande est actuellement 1000123, comment atteindre:

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

La même question se pose pour plusieurs vues de magasin partageant la même increment_idplage de numéros de facture et / ou partageant la même plage de increment_idnuméros de crédit .

Est-ce que Magento prend en charge ce prêt à l'emploi?

Jürgen Thelen
la source
Avec l'aide de @ alessandro-ronchi, j'ai implémenté la solution comme ceci. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e fonctionne très bien pour moi.
Michael

Réponses:

5

J'imagine que ce serait assez difficile. Les identifiants d'incrément sont stockés dans le eav_entity_storetableau et sans surprise, chaque magasin a sa propre entrée qui est mise à jour lorsqu'une commande (et devis, facture, etc.) est créée. Pour que tous les magasins utilisent le même incrémenteur, vous devez en quelque sorte réécrire cette logique afin qu'elle utilise la même ligne dans la base de données. L'impact que cela peut avoir sur d'autres zones du site est quelque chose d'autre qui devrait être pris en considération.

Richard Cleverley
la source
Je suis d'accord avec Richard.
Sylvain Rayé
Vous avez probablement raison, mais en exécutant ce code, toutes mes factures ont suivi la même séquence de numérosMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh
3

Vous pouvez remplacer les commandes, les envois, les factures et le modèle d'incrémentation des avoirs en réécrivant la classe "eav / entity_increment_numeric" fournissant une logique personnalisée dans un de vos modèles.

Jetez un œil aux classes ancêtres (Mage_Eav_Model_Entity_Increment_Numeric et Mage_Eav_Model_Entity_Increment_Abstract) afin de comprendre comment fournir votre propre logique.

Vous pouvez différencier la logique entre différentes entités en vérifiant le paramètre $ entityTypeCode de la fonction getNextId () que vous allez remplacer.

Une autre méthode (plus invasive) consiste à spécifier un modèle d'incrémentation différent pour chaque type d'entité en écrasant (via le script d'installation) la valeur de la colonne "increment_model" de la table "eav_entity_type". Personnellement, je préfère la solution de "réécriture" mentionnée ci-dessus.

Faites attention: les identifiants d'incrémentation ont une contrainte d'unicité dans les dernières versions de Magento, vous ne pouvez donc pas stocker le même identifiant d'incrémentation pour deux entités différentes du même type. En d'autres termes, vous ne pouvez pas avoir deux factures différentes avec le même identifiant d'incrément.

J'espère que cela aide.

Alessandro Ronchi
la source
J'ai regardé cela, mais je ne peux pas trouver getLastId()dans Mage_Eav_Model_Entity_Increment_Numericou dans une autre classe ou interface dans la hiérarchie. Btw, cela devrait être la réponse acceptée.
Michael
MISE À JOUR: Il suffit de réaliser qu'il est un ensemble immobilier sur le Varien_ObjectdeMage_Eav_Model_Entity_Type
Michael
2

En creusant plus profondément, j'ai réalisé que cela eav_entity_type.increment_per_storepourrait être utile.

Il est. Mais seulement dans le cas où vous souhaitez que toutes les vues de magasin (globalement, quel que soit le site Web dans lequel elles sont définies) de votre installation Magento partagent la même increment_idplage de numéros de commande .

Cela ne résout pas mon problème spécifique, mais peut-être que cela est utile à d'autres, alors c'est parti:

Pour activer le partage global de vos numéros de commande, définissez eav_entity_type.increment_per_storel'entité de commande sur 0,

Cela conduit à Mage_Eav_Model_Entity_Type::fetchNewIncrementId()utiliser store_id = 0lors du chargement de l' eav_entity_storeenregistrement de l'entité de commande, quelle que soit la vue de magasin à laquelle il appartient vraiment.

Si un tel enregistrement n'existe pas, Magento en crée un, à l'aide de store_idet increment_prefixde 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;
}

Cela devrait fonctionner pour tout type d'entité à l' aide du eav/entity_increment_numericmodèle, comme order, invoice, shipmentet creditmemo.

Sachez cependant que je n'ai pas encore trouvé de documentation officielle increment_per_store. Et qu'il n'y a aucune option dans le backend Magento vous permettant de configurer cela.

Cela peut ou non signifier qu'il n'est pas censé être utilisé officiellement.

À utiliser à vos risques et périls. Si vos changements font des ravages, ne me blâmez pas. Vous avez été prévenu ^^

Jürgen Thelen
la source
1

Il n'est pas pris en charge prêt à l'emploi. Je voulais également le faire une fois pour avoir une deuxième vue de magasin pour un test A / B partager le même increment_id du magasin d'origine.

J'ai essayé de faire correspondre ces 2 chiffres de la manière la plus simple quand il checkout_submit_all_afterest renvoyé, mais je me sentais très mal à l'aise, alors je l'ai laissé tomber. Je suppose qu'avec plus de vues de magasins et beaucoup de trafic, cela peut entraîner un véritable gâchis, vous devez donc approfondir la logique de Magentos.

mnp
la source
0

Solution:

Avoir une gamme de numéros de commande / facture / crédit, etc. différente est assez agréable, pour différents pays, ce qui signifie le plus souvent au niveau d'un groupe de magasins.

Mais avoir des plages de numéros différentes au niveau de la vue du magasin est une mauvaise chose si vous utilisez des vues du magasin pour différentes langues, ce qui pourrait être fait dans 90% des cas.

Heureusement, ce n'est pas si difficile comme proposé dans ce fil:

Ce que nous allons faire, c'est récupérer l' ID de vue de magasin par défaut au lieu d'utiliser l'ID de vue de magasin avec lequel la méthode est appelée . Nous le faisons en résolvant le groupe de magasins pour la vue de magasin actuelle et en récupérant son ID de vue de magasin par défaut. Ensuite, chaque vue de magasin d'un groupe de magasins spécifique utilise le même format de plage de numéros (celui de la vue de magasin par défaut).

Créez cette classe:

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;
    }

}

Ajoutez cette réécriture dans config.xml de votre module:

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

Si vous avez une meilleure façon, sans avoir à réécrire, diffusez les connaissances. S'amuser. Ne piratez pas le noyau.

Michael Leiss
la source
0

Utiliser sur magento2 ... SELECT * FROM sales_sequence_meta

Toutes les lignes sequence_table sont utilisées sur la même table d'incrément Exemple 'séquence_order_1' exemple: UPDATE sales_sequence_metaSET sequence_table= 'sequence_order_1'. où meta_id = ?? ()

Remarque: videz toutes les lignes liées au devis et à la facture précédentes OU utilisez-les sur la table sequence_value la plus élevée de ces tables (sequence_order_1, sequence_order_0, sequence_order_2)

Ziaur Rahaman
la source