Маючи кілька представлень магазинів, мають однаковий діапазон номерів збільшення_порядку


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діапазону номерів кредитних пам'яток .

Чи підтримує Magento цей нестандартний пакет?


За вказівками від @ alessandro-ronchi я реалізував таке рішення. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e прекрасно працює для мене.
Майкл

Відповіді:


5

Я б міг уявити, що це буде досить складно. Ідентифікатор приросту зберігається в eav_entity_storeтаблиці, і не дивно, що кожен магазин має власний запис, який оновлюється, коли створюється замовлення (і котирування, рахунок-фактура тощо). Щоб усі магазини використовували один і той же інкремент, вам потрібно було б якось переписати цю логіку, щоб він використовував той самий рядок у БД. Що б це не міг врахувати, це може вплинути на інші ділянки сайту.


Я погоджуюся з Річардом.
Sylvain Rayé

Ви, мабуть, вірно, але за допомогою цього коду всі мої рахунки-фактури дотримуються однакової послідовності номерівMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh,

3

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

Погляньте на класи предків (Mage_Eav_Model_Entity_Increment_Numeric та Mage_Eav_Model_Entity_Increment_Ab Abstract), щоб зрозуміти, як надати власну логіку.

Ви можете розмежувати логіку між різними об'єктами, перевіривши параметр $ entitTypeCode функції getNextId (), яку ви будете переохоплювати.

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

Зверніть увагу: ідентифікаційні коефіцієнти збільшення мають унікальне обмеження в останніх версіях Magento, тому ви не можете зберігати один і той же ідентифікатор приросту для двох різних об'єктів одного типу. Іншими словами, ви не можете мати дві різні рахунки-фактури з однаковим ідентифікаційним збільшенням.

Сподіваюся, це допомагає.


Подивився на це , але я не можу знайти getLastId()в Mage_Eav_Model_Entity_Increment_Numericабо в будь-якому іншому класі або інтерфейс в ієрархії. До речі, це має бути прийнята відповідь.
Майкл

UPDATE: Просто зрозумів , що це набір властивостей на Varien_ObjectвідMage_Eav_Model_Entity_Type
Michael


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_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 немає жодної опції, яка дозволяє вам це налаштувати.

Це може означати, а може і не означати, що офіційно його не використовують.

Використовуйте на свій страх і ризик. Якщо ваші зміни спричинили хаос, не звинувачуйте мене. Вас попередили ^^


1

Він не підтримується поза коробкою. Я також хотів зробити це один раз, щоб мати другий перегляд магазину для тесту A / B, який має той самий набір_id від початкового магазину.

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


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

Усі рядки_послідовної таблиці використовуються в одній таблиці приросту Приклад "Приклад послідовності_порядок_1": UPDATE sales_sequence_metaSET sequence_table= 'послідовність_порядків_1' де meta_id = ?? ()

Примітка: Очистіть усі попередні рядки, пов’язані з котируваннями та рахунками-фактурами, АБО Використовуйте у таблиці найвищої послідовності_значення в цих таблицях (послідовність_порядок_1, послідовність_порядку_0, послідовність_порядку_2)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.