Tener múltiples vistas de la tienda comparte el mismo rango de números increment_id de orden

13

¿Se puede configurar Magento de manera que las vistas de varias tiendas del mismo sitio web puedan compartir el mismoincrement_id rango de números de pedido ? Y si es así, ¿cómo?

Por ejemplo, con una configuración de varios pisos como esta en 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

Ahora deltase agrega una nueva vista de la tienda :

store_id        code    website_id    group_id
       4       delta             1           1

Suponiendo que alphael último ID de incremento de pedido actualmente es 1000123, cómo lograr:

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

La misma pregunta se increment_idaplica a las vistas de varias tiendas que comparten el mismo rango de números de factura y / o comparten el mismo rango de increment_idnúmeros de tarjeta de crédito .

¿Magento es compatible con este producto listo para usar?

Jürgen Thelen
fuente
Con la orientación de @ alessandro-ronchi, implementé la solución de esta manera. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e me funciona muy bien.
Michael

Respuestas:

5

Me imagino que esto sería bastante difícil. Los ID de incremento se almacenan en la eav_entity_storetabla y, como era de esperar, cada tienda tiene su propia entrada que se actualiza cuando se crea un pedido (y presupuesto, factura, etc.). Para que todas las tiendas usen el mismo incrementador, necesitaría reescribir de alguna manera esta lógica para que use la misma fila en la base de datos. El impacto que esto puede tener en otras áreas del sitio es algo más que debería considerarse.

Richard Cleverley
fuente
Estoy de acuerdo con Richard
Sylvain Rayé
Probablemente tenga razón, pero al ejecutar este código, todas mis facturas siguen una misma secuencia numéricaMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh,
3

Puede anular el modelo de incremento de pedidos, envíos, facturas y notas de crédito reescribiendo la clase "eav / entity_increment_numeric" que proporciona una lógica personalizada en un modelo suyo.

Eche un vistazo a las clases ancestrales (Mage_Eav_Model_Entity_Increment_Numeric y Mage_Eav_Model_Entity_Increment_Abstract) para comprender cómo proporcionar su propia lógica.

Puede diferenciar la lógica entre diferentes entidades marcando el parámetro $ entityTypeCode de la función getNextId () que anulará.

Otra forma (más invasiva) es la de especificar un modelo de incremento diferente para cada tipo de entidad sobrescribiendo (mediante script de instalación) el valor de la columna "increment_model" de la tabla "eav_entity_type". Personalmente, prefiero la solución de "reescritura" mencionada anteriormente.

Preste atención: los identificadores de incremento tienen una restricción de unicidad en las últimas versiones de Magento, por lo que no puede almacenar el mismo identificador de incremento para dos entidades diferentes del mismo tipo. En otras palabras, no puede tener dos facturas diferentes con el mismo ID de incremento.

Espero eso ayude.

Alessandro Ronchi
fuente
Mirado en esto, pero soy incapaz de encontrar getLastId()en Mage_Eav_Model_Entity_Increment_Numerico en cualquier otra clase o interfaz en la jerarquía. Por cierto, esta debería ser la respuesta aceptada.
Michael
ACTUALIZACIÓN: Sólo se dio cuenta de que es un conjunto de propiedades en la Varien_ObjectdeMage_Eav_Model_Entity_Type
Michael
2

Mientras cavaba más profundo, me di cuenta de que eav_entity_type.increment_per_storepuede ser útil.

Es. Pero solo para el caso, cuando desea que todas las vistas de la tienda (globalmente, sin importar en qué sitio web estén definidas) de su instalación de Magento compartan el mismo increment_idrango de números de pedido .

Esto no resuelve mi problema específico, pero tal vez sea útil para otros, así que aquí vamos:

Para activar el intercambio global de sus números de pedido, configure eav_entity_type.increment_per_storela entidad de pedido en 0,

Esto conduce al Mage_Eav_Model_Entity_Type::fetchNewIncrementId()uso store_id = 0al cargar el eav_entity_storeregistro de la entidad de pedido, sin importar a qué vista de la tienda pertenezca realmente.

Si no existe tal registro, Magento crea uno, usando store_idy increment_prefixde 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;
}

Esto debería funcionar para cualquier tipo de entidad utilizando el eav/entity_increment_numericmodelo, como order, invoice, shipmenty creditmemo.

Sin embargo, tenga en cuenta que increment_per_storetodavía no pude encontrar ninguna documentación oficial . Y que no hay ninguna opción en el backend de Magento que le permita configurar esto.

Esto puede o no significar que no se cree que se use oficialmente.

Úselo bajo su propio riesgo. Si tus cambios causan estragos, no me culpes. Has sido advertido ^^

Jürgen Thelen
fuente
1

No es compatible de fábrica. También quería hacer esto una vez para que una segunda vista de tienda para una Prueba A / B comparta el mismo increment_id de la tienda original.

Traté de hacer coincidir esos 2 números de la manera más simple cuando checkout_submit_all_afterse disparó, pero me sentí muy incómodo, así que lo dejé caer. Supongo que con más vistas de tienda y mucho tráfico, esto puede resultar en un verdadero desastre, por lo que debe profundizar en la lógica de Magentos.

mnp
fuente
0

Solución:

Tener un orden / factura / tarjeta de crédito diferente, etc., el rango de números es bastante bueno para diferentes países, lo que a menudo significa a nivel de grupo de tiendas.

Pero tener diferentes rangos de números en el nivel de vista de la tienda es algo malo si usa vistas de la tienda para diferentes idiomas, lo que podría hacerse en el 90% de los casos.

Afortunadamente no es tan difícil como se propone en este hilo:

Lo que vamos a hacer es buscar la ID de vista de tienda predeterminada en lugar de usar la ID de vista de tienda con la que se llama el método . Estamos haciendo esto resolviendo el grupo de tiendas para la vista de la tienda actual y buscando su ID de vista de tienda predeterminada. Luego, cada vista de la tienda de un grupo de tiendas específico utiliza el mismo formato de rango de números (el de la vista de la tienda predeterminada).

Crea esta clase:

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

}

Agregue esta reescritura a config.xml de su módulo:

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

Si tiene una mejor manera, sin tener que reescribir, difunda el conocimiento. Que te diviertas. No hackear el núcleo.

Michael Leiss
fuente
0

Usar en magento2 ... SELECCIONAR * DESDE sales_sequence_meta

Todas las filas de la tabla de secuencia se utilizan en la misma tabla de incremento Ejemplo 'secuencia_orden_1' ejemplo: sales_sequence_metaSET ACTUALIZACIÓN sequence_table= 'secuencia_orden_1'. donde meta_id = ?? ()

Nota: Vacíe todas las filas relacionadas con la cotización y la factura anteriores O use en la tabla de valor_secuencia más alta de estas tablas (secuencia_orden_1, secuencia_orden_0, secuencia_orden_2)

Ziaur Rahaman
fuente