Posiadanie wielu widoków sklepu ma ten sam zakres numerów increment_id

13

Czy Magento można skonfigurować w taki sposób, aby wiele widoków sklepu tej samej strony internetowej mogło korzystać z tego samegoincrement_id zakresu numerów zamówień ? A jeśli tak, to w jaki sposób?

Na przykład przy konfiguracji multistore w następujący sposób 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

Teraz dodano nowy widok sklepu delta:

store_id        code    website_id    group_id
       4       delta             1           1

Przyjmując alpha, że identyfikator ostatniego zamówienia to obecnie 1000123, jak osiągnąć:

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

To samo pytanie dotyczy wielu widoków sklepu z tym samym increment_idzakresem numerów faktur i / lub z tym samym zakresem increment_idnumerów kredytu .

Czy Magento obsługuje to urządzenie od razu po wyjęciu z pudełka?

Jürgen Thelen
źródło
Pod kierunkiem @ alessandro-ronchi zaimplementowałem takie rozwiązanie. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e działa świetnie dla mnie.
Michael

Odpowiedzi:

5

Wyobrażam sobie, że byłoby to dość trudne. Identyfikatory inkrementów są przechowywane w eav_entity_storetabeli i nic dziwnego, że każdy sklep ma swój własny wpis, który jest aktualizowany po utworzeniu zamówienia (i wyceny, faktury itp.). Aby wszystkie sklepy korzystały z tego samego inkrementora, trzeba jakoś przepisać tę logikę, aby użyła tego samego wiersza w DB. Wpływ, jaki może to mieć na inne obszary witryny, należy wziąć pod uwagę.

Richard Cleverley
źródło
Zgadzam się z Richardem.
Sylvain Rayé,
Prawdopodobnie masz rację, ale uruchomienie tego kodu spowodowało, że wszystkie moje faktury mają tę samą sekwencję numerówMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh
3

Możesz zastąpić model przyrostu zamówień, wysyłek, faktur i faktur korygujących, przepisując klasę „eav / entity_increment_numeric”, zapewniając niestandardową logikę w swoim modelu.

Spójrz na klasy przodków (Mage_Eav_Model_Entity_Increment_Numeric i Mage_Eav_Model_Entity_Increment_Abstract), aby zrozumieć, jak zapewnić własną logikę.

Możesz rozróżnić logikę między różnymi jednostkami, sprawdzając parametr $ entityTypeCode funkcji getNextId (), którą zastąpisz.

Innym (bardziej inwazyjnym) sposobem jest określenie innego modelu przyrostu dla każdego typu encji poprzez zastąpienie (za pomocą skryptu instalacyjnego) wartości kolumny „increment_model” tabeli „typ eav_entity_type”. Osobiście wolę wspomniane wyżej rozwiązanie „przepisz”.

Zwróć uwagę: identyfikatory przyrostu mają ograniczenie unikatowości w najnowszych wersjach Magento, więc nie możesz przechowywać tego samego identyfikatora przyrostu dla dwóch różnych encji tego samego typu. Innymi słowy, nie możesz mieć dwóch różnych faktur z tym samym identyfikatorem przyrostu.

Mam nadzieję, że to pomoże.

Alessandro Ronchi
źródło
Wyglądało na to, ale jestem w stanie znaleźć getLastId()w Mage_Eav_Model_Entity_Increment_Numericlub w jakiejkolwiek innej klasy lub interfejsu w hierarchii. Przy okazji, to powinna być zaakceptowana odpowiedź.
Michael
AKTUALIZACJA: Właśnie zdałem sobie sprawę, że jest to właściwość ustawiona Varien_ObjectodMage_Eav_Model_Entity_Type
Michael
Zaimplementowano to w ten sposób: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
Michael
2

Podczas kopania głębiej zdałem sobie sprawę, że eav_entity_type.increment_per_storemoże to być pomocne.

To jest. Ale tylko w przypadku, gdy chcesz, aby wszystkie widoki sklepu (globalnie, bez względu na to, w której witrynie są zdefiniowane) Twojej instalacji Magento, aby miały ten sam increment_idzakres numerów zamówień .

To nie rozwiązuje mojego konkretnego problemu, ale może jest pomocne niektórym innym, więc zaczynamy:

Aby aktywować globalne udostępnianie numerów zamówień, ustaw eav_entity_type.increment_per_storejednostkę zamówienia na 0,

Prowadzi to do Mage_Eav_Model_Entity_Type::fetchNewIncrementId()użycia store_id = 0podczas ładowania eav_entity_storerekordu jednostki zamówienia, bez względu na to, do którego sklepu należy.

Jeśli nie ma takiego rekordu istnieje, Magento tworzy jedną, wykorzystując store_idi increment_prefixod 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;
}

To powinno działać dla każdego typu jednostki przy użyciu eav/entity_increment_numericmodelu, jak order, invoice, shipmenti creditmemo.

Pamiętaj jednak, że nie znalazłem jeszcze żadnej oficjalnej dokumentacji increment_per_store. I że nie ma opcji w backendzie Magento, która pozwala ci to skonfigurować.

Może to oznaczać, że nie jest oficjalnie używane.

Używaj na własne ryzyko. Jeśli twoje zmiany sieją spustoszenie, nie obwiniaj mnie. Zostałeś ostrzeżony ^^

Jürgen Thelen
źródło
1

Nie jest obsługiwany po wyjęciu z pudełka. Chciałem to zrobić raz, aby mieć drugi widok sklepu dla testu A / B współużytkującego ten sam increment_id z oryginalnego sklepu.

Próbowałem dopasować te 2 liczby w prosty sposób, kiedy checkout_submit_all_afterzostał wystrzelony, ale czułem się z nim bardzo nieswojo, więc upuściłem go. Wydaje mi się, że przy większej liczbie wyświetleń sklepu i dużym natężeniu ruchu może to doprowadzić do prawdziwego bałaganu, więc musisz zagłębić się w logikę Magentos.

mnp
źródło
0

Rozwiązanie:

Posiadanie odmiennego zamówienia / faktury / kredytu itp. ... zakres numerów jest całkiem niezły dla różnych krajów, co najczęściej oznacza na poziomie grupy sklepów.

Ale posiadanie różnych zakresów liczb na poziomie widoku sklepu jest złą rzeczą, jeśli używasz widoków sklepu dla różnych języków, co można zrobić w 90% wszystkich przypadków.

Na szczęście nie jest to takie trudne, jak zaproponowano w tym wątku:

Zamierzamy pobrać domyślny identyfikator widoku sklepu zamiast używać identyfikatora widoku sklepu, z którym wywoływana jest metoda . Robimy to, rozwiązując grupę sklepów dla bieżącego widoku sklepu i pobierając jej domyślny identyfikator widoku sklepu. Następnie każdy widok sklepu określonej grupy sklepów używa tego samego formatu zakresu liczb (ten z domyślnego widoku sklepu).

Utwórz tę klasę:

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

}

Dodaj to przepisanie do config.xml modułu:

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

Jeśli masz lepszy sposób, bez konieczności przepisywania, rozpowszechnij wiedzę. Baw się dobrze. Nie rąbaj rdzenia.

Michael Leiss
źródło
0

Użyj na magento2 ... WYBIERZ * OD sales_sequence_meta

Wszystkie wiersze tabeli sekwencji są używane w tej samej tabeli przyrostowej Przykład „ciąg_ sekwencji_1” przykład: sales_sequence_metaZESTAW AKTUALIZACJI sequence_table= „kolejność_ sekwencji_1”. gdzie meta_id = ?? ()

Uwaga: Opróżnij wszystkie poprzednie wiersze związane z wyceną i fakturą LUB Użyj w najwyższej tabeli sekwencja_w tej tabeli (kolejność__1, kolejność_0, kolejność_2)

Ziaur Rahaman
źródło