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

13

Можно ли настроить 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диапазон номеров счетов и / или разделяющих один и тот же диапазон increment_idномеров creditmemo .

Поддерживает ли Magento это из коробки?

Юрген Телен
источник
Под руководством @ alessandro-ronchi я реализовал это решение следующим образом. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e прекрасно работает для меня.
Майкл

Ответы:

5

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

Ричард Клеверли
источник
Я согласен с Ричардом.
Сильвен Райе
Вы, вероятно, правы, но использование этого кода заставило все мои счета-фактуры следовать одной и той же последовательности чиселMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Джей Гош
3

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

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

Вы можете различать логику между различными объектами, проверив параметр $ entityTypeCode функции getNextId (), которую вы переопределите.

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

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

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

Алессандро Рончи
источник
Посмотрел это, но я не могу найти getLastId()в Mage_Eav_Model_Entity_Increment_Numericили в любом другом классе или интерфейсе в иерархии. Кстати, это должен быть принятый ответ.
Майкл
UPDATE: Просто понял , что это набор свойств на Varien_ObjectотMage_Eav_Model_Entity_Type
Michael
Реализовано это так: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
Майкл
2

Копая глубже, я понял, что это 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_prefixof 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 нет опции, позволяющей вам это настроить.

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

Используйте на свой риск. Если ваши изменения причиняют ущерб, не вините меня. Вы были предупреждены ^^

Юрген Телен
источник
1

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

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

MNP
источник
0

Решение:

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

Но иметь разные диапазоны номеров на уровне представления магазина - это плохо, если вы используете представления магазина для разных языков, что может быть сделано в 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

Используйте на magento2 ... SELECT * FROM sales_sequence_meta

Все строки sequence_table используются в одной и той же таблице приращений. Пример 'sequence_order_1' пример: UPDATE sales_sequence_meta SETsequence_table = 'sequence_order_1'. где meta_id = ?? ()

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

Зиаур Рахаман
источник