Le visualizzazioni di più negozi condividono lo stesso ordine intervallo_incremento numerico


13

Magento può essere configurato in modo tale che più viste dello store dello stesso sito Web possano condividere lo stessoincrement_id intervallo di numeri di ordini ? E se sì, come?

Ad esempio, con un'impostazione multistore come questa 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

Ora deltaviene aggiunta una nuova vista del negozio :

store_id        code    website_id    group_id
       4       delta             1           1

Supponendo alphache l'ID dell'incremento dell'ultimo ordine sia attualmente 1000123, come ottenere:

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

La stessa domanda vale per più punti vendita che condividono lo stesso increment_idintervallo di numeri di fattura e / o condividono lo stesso intervallo di increment_idnumeri di creditmemo .

Magento supporta questo out-of-the-box?


Con la guida di @ alessandro-ronchi ho implementato la soluzione in questo modo. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e funziona benissimo per me.
Michael,

Risposte:


5

Immagino che questo sarebbe abbastanza difficile. Gli ID di incremento sono memorizzati nella eav_entity_storetabella e, ovviamente, ogni negozio ha la propria voce che viene aggiornata quando viene creato un ordine (e preventivo, fattura ecc.). Per fare in modo che tutti i negozi utilizzino lo stesso incrementatore, è necessario in qualche modo riscrivere questa logica in modo che utilizzi la stessa riga nel DB. Piuttosto che impatto questo potrebbe avere su altre aree del sito è qualcos'altro che dovrebbe essere considerato.


Sono d'accordo con Richard.
Sylvain Rayé,

Probabilmente hai ragione, ma l'esecuzione di questo codice ha fatto sì che tutte le mie fatture seguissero la stessa sequenza numericaMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh

3

È possibile ignorare ordini, spedizioni, fatture e modello di incremento delle note di credito riscrivendo la classe "eav / entity_increment_numeric" che fornisce la logica personalizzata in un tuo modello.

Dai un'occhiata alle classi antenate (Mage_Eav_Model_Entity_Increment_Numeric e Mage_Eav_Model_Entity_Increment_Abstract) per capire come fornire la tua logica.

È possibile differenziare la logica tra entità diverse controllando il parametro $ entityTypeCode della funzione getNextId () che si sovrascriverà.

Un altro modo (più invasivo) è quello di specificare un diverso modello di incremento per ciascun tipo di entità sovrascrivendo (tramite lo script di installazione) il valore della colonna "increment_model" della tabella "eav_entity_type". Personalmente preferisco la soluzione di "riscrittura" di cui sopra.

Attenzione: gli ID di incremento hanno un vincolo di unicità nelle ultime versioni di Magento, quindi non è possibile memorizzare lo stesso ID di incremento per due entità diverse dello stesso tipo. In altre parole, non è possibile avere due fatture diverse con lo stesso ID incremento.

Spero che sia d'aiuto.


Considerato questo, ma non riesco a trovare getLastId()in Mage_Eav_Model_Entity_Increment_Numerico in qualsiasi altra classe o interfaccia nella gerarchia. A proposito, questa dovrebbe essere la risposta accettata.
Michael,

AGGIORNAMENTO: Ho appena realizzato che si tratta di una proprietà impostata Varien_ObjectdalMage_Eav_Model_Entity_Type
Michael


2

Mentre scavavo più a fondo, mi sono reso conto che eav_entity_type.increment_per_storepotrebbe essere utile.

È. Ma solo per il caso, quando si desidera che tutte le visualizzazioni dello store (a livello globale, indipendentemente dal sito Web in cui sono definite) dell'installazione di Magento, condividano lo stesso increment_idintervallo di numeri di ordine .

Questo non risolve il mio problema specifico, ma forse è utile per alcuni altri, quindi eccoci qui:

Per attivare la condivisione globale dei numeri dell'ordine, impostare eav_entity_type.increment_per_storel'entità ordine su 0,

Questo porta Mage_Eav_Model_Entity_Type::fetchNewIncrementId()all'utilizzo store_id = 0durante il caricamento del eav_entity_storerecord dell'entità ordine, indipendentemente dalla vista dello store a cui appartiene realmente.

Se tale record non esiste, Magento ne crea uno, usando store_ide increment_prefixdi 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;
}

Questo dovrebbe funzionare per qualsiasi tipo di entità utilizzando il eav/entity_increment_numericmodello, come order, invoice, shipmente creditmemo.

Ricorda però che non sono ancora riuscito a trovare alcuna documentazione ufficiale increment_per_store. E che non esiste alcuna opzione nel backend Magento che ti consenta di configurarlo.

Questo può o meno significare che non si pensa che sia usato ufficialmente.

Utilizzare a proprio rischio. Se i tuoi cambiamenti causano il caos, non incolparmi. Sei stato avvisato ^^


1

Non è supportato e pronto all'uso. Volevo anche farlo una volta per avere una seconda visualizzazione negozio per un test A / B condividere lo stesso increment_id dal negozio originale.

Ho provato ad abbinare quei 2 numeri nel modo semplice quando checkout_submit_all_afterviene sparato, ma mi sono sentito molto a disagio con esso, quindi l'ho lasciato cadere. Immagino che con più visualizzazioni di negozi e molto traffico questo possa causare un vero casino, quindi devi scavare più a fondo nella logica di Magentos.


0

Soluzione:

Avere un ordine diverso / fattura / creditmemo ecc ... l'intervallo di numeri è abbastanza bello, per diversi paesi, il che spesso significa a livello di gruppo di negozi.

Ma avere intervalli di numeri diversi a livello di visualizzazione dello store è una cosa negativa se si utilizzano le visualizzazioni dello store per lingue diverse, cosa che potrebbe essere fatta nel 90% di tutti i casi.

Fortunatamente non è così difficile come proposto in questa discussione:

Quello che faremo è recuperare l' id di visualizzazione negozio predefinito invece di utilizzare l'id di visualizzazione negozio con cui viene chiamato il metodo . Lo stiamo facendo risolvendo il gruppo di negozi per la vista negozio corrente e recuperando il suo ID vista negozio predefinito. Quindi, ogni visualizzazione di negozio di uno specifico gruppo di negozi utilizza lo stesso formato di intervallo di numeri (quello della visualizzazione di negozio predefinita).

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

}

Aggiungi questa riscrittura a config.xml del tuo modulo:

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

Se hai un modo migliore, senza dover riscrivere diffondere la conoscenza. Divertiti. Non hackerare il core.


0

Utilizzare su magento2 ... SELEZIONA * DA sales_sequence_meta

Tutte le righe sequenza_pagina vengono utilizzate sulla stessa tabella di incremento Esempio 'ordine sequenza__1' esempio: UPDATE sales_sequence_metaSET sequence_table= 'ordine sequenza_1'. dove meta_id = ?? ()

Nota: svuotare tutte le precedenti righe relative a preventivo e fattura OPPURE Utilizzare sulla tabella più alta sequenza_valore su queste tabelle (ordine_ordine_1, ordine_ordine_0, ordine_ordine_2)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.