Наличие нескольких представлений магазина с одним и тем же диапазоном идентификаторов приращения заказа


Можно ли настроить Magento таким образом, чтобы несколько представлений одного и того же веб-сайта могли использовать один и тот же диапазон номеров заказа increment_id? И если да, то как?

Например, с такой настройкой в нескольких магазинах, как эта, в 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

Теперь добавлен новый вид магазина delta:

store_id        code    website_id    group_id
       4       delta             1           1

Предполагая, что идентификатор последнего приращения заказа alpha в настоящее время равен 1000123, как достичь:

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

Один и тот же вопрос касается нескольких представлений магазина, разделяющих одно и то же счет-фактура increment_id диапазон номеров и/или совместное использование одного и того же диапазона номеров creditmemo increment_id.

Поддерживает ли Magento это готовое решение?

Author: Jürgen Thelen, 2013-01-30

6 answers

Я бы предположил, что это будет довольно сложно. Идентификаторы приращения хранятся в таблице eav_entity_store, и неудивительно, что в каждом магазине есть своя запись, которая обновляется при создании заказа (и предложения, счета-фактуры и т. Д.). Чтобы заставить все магазины использовать один и тот же инкремент, вам нужно будет каким-то образом переписать эту логику, чтобы она использовала одну и ту же строку в БД. То, какое влияние это может оказать на другие области сайта, - это еще кое-что, что необходимо будет рассмотреть.

 5
Author: Richard Cleverley, 2013-01-30 09:20:44

Вы можете переопределить модель увеличения заказов, отправок, счетов-фактур и кредитных нот, переписав класс "eav/entity_increment_numeric", предоставляющий пользовательскую логику в вашей модели.

Взгляните на классы предков (mage_eav_model_entity_increment_numeric и Mage_Eav_Model_Entity_Increment_Abstract), чтобы понять, как обеспечить свою собственную логику.

Вы можете различать логику между различными сущностями, проверив параметр $entitytypecode в Функцию getNextId() вы переопределите.

Другим (более агрессивным) способом является указание другой модели приращения для каждого типа сущности путем перезаписи (с помощью сценария установки) значения столбца "increment_model" таблицы "eav_entity_type". Лично я предпочитаю решение "переписать", упомянутое выше.

Обратите внимание: идентификаторы приращения имеют ограничение уникальности в последних версиях Magento, поэтому вы не можете хранить один и тот же идентификатор приращения для двух разных объектов одного и того же тип. Другими словами, у вас не может быть двух разных счетов-фактур с одинаковым идентификатором приращения.

Надеюсь, это поможет.

 3
Author: Alessandro Ronchi, 2013-01-30 11:49:50

Копая глубже, я понял, что eav_entity_type.increment_per_store может быть полезно.

Так и есть. Но только в том случае, если вы хотите, чтобы все представления магазина (глобально, независимо от того, на каком веб-сайте они определены) вашей установки Magento имели одинаковый порядок increment_id диапазон номеров.

Это не решает мою конкретную проблему, но, возможно, это полезно для некоторых других, поэтому мы начинаем:

Чтобы активировать глобальный обмен номерами ваших заказов, установите eav_entity_type.increment_per_store объекта заказа в 0 ,

Это приводит к Mage_Eav_Model_Entity_Type::fetchNewIncrementId() использованию store_id = 0 при загрузке записи eav_entity_store сущности заказа, независимо от того, к какому представлению хранилища она действительно принадлежит.

Если такой записи не существует, Magento создает ее, используя store_id и increment_prefix из 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;
}

Это должно работать для любого типа сущности, использующего модель eav/entity_increment_numeric, например order, invoice, shipment и creditmemo.

Имейте в виду, однако, что я пока не смог найти никакой официальной документации increment_per_store. И что в Magento нет выбора серверная часть, позволяющая вам настроить это.

Это может означать, а может и не означать, что он не считается официально используемым.

Используйте на свой страх и риск. Если ваши изменения приведут к хаосу, не вините меня. Вас предупредили^^

 2
Author: Jürgen Thelen, 2013-01-31 10:00:45

Он не поддерживается "из коробки". Я также хотел сделать это один раз, чтобы второй просмотр магазина для A/B-теста имел тот же идентификатор increment_id, что и в исходном магазине.

Я попытался сопоставить эти 2 числа простым способом, когда checkout_submit_all_after уволен, но мне было очень неудобно, поэтому я бросил его. Я думаю, что с большим количеством просмотров магазинов и большим трафиком это может привести к настоящему беспорядку, поэтому вам придется глубже копать в логике Magentos.

 1
Author: mnp, 2013-01-30 09:43:31

Решение:

Наличие разного заказа/счета/кредитной карты и т. Д.... Диапазон номеров довольно хорош для разных стран, что чаще всего означает на уровне группы магазинов.

Но иметь разные диапазоны номеров на уровне представления хранилища - это плохо, если вы используете представления хранилища для разных языков, что может быть сделано в 90% всех случаев.

К счастью, это не так сложно, как предлагается в этой теме:

Что мы собираемся сделать, так это принести идентификатор представления хранилища по умолчанию вместо использования идентификатора представления хранилища метод вызывается с помощью . Мы делаем это, разрешая группу магазинов для текущего представления магазина и извлекая ее идентификатор представления магазина по умолчанию. Затем каждое представление магазина определенной группы магазинов использует один и тот же формат диапазона номеров (тот, который используется в представлении магазина по умолчанию).

Создайте этот класс:

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

}

Добавьте это переписывание в config.xml вашего модуля:

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

Если у вас есть более приятный способ, без необходимости переписывать распространение знание. Повеселиться. Не взламывайте ядро.

 0
Author: Michael Leiss, 2015-04-24 15:33:32

Использовать на magento2... ВЫБЕРИТЕ * ИЗ sales_sequence_meta

Все строки таблицы последовательностей используются в одной и той же таблице приращений, Пример "последовательность порядков_1" пример: ОБНОВИТЬ sales_sequence_meta УСТАНОВИТЬ sequence_table = 'последовательность_заказ_1'. где мета_ид =?? ()

Примечание: Очистите всю предыдущую строку, связанную с предложением и счетом, ИЛИ используйте таблицу с наибольшим значением последовательности в этой таблице (sequence_order_1, sequence_order_0, sequence_order_2)

 0
Author: Ziaur Rahaman, 2020-02-16 11:00:12