Multivistas en Magento con la misma serie de facturación o pedido

En Magento, cuando queremos agregar alguna nueva funcionalidad, una de las formas de conseguirlo es ampliando las clases del núcleo (core).  Sin embargo, si realizamos las modificaciones directamente en el núcleo, cuando actualicemos nuestra versión de Magento perderemos los cambios, por lo que tendremos que recordar todas las modificaciones y volverlas a hacer, lo que puede suponer una tarea tediosa.

Para este tipo de tareas en Magento lo habitual es copiar el archivo a modificar desde la carpeta correspondiente dentro de /app/code/core/Mage hacia el directorio /app/code/local/Mage , y una vez allí realizar las modificaciones. Sin embargo nos encontramos con un nuevo inconveniente, si en una futura actualización de Magento el fichero que hemos copiado incluye alguna nueva funcionalidad no vamos a poder utilizarla sin tener que volver a hacer cambios.

La solución pasa por crear un nuevo módulo, que aunque a priori puede parecer un poco complejo, en el futuro nos evitará muchos dolores de cabeza.

En nuestro caso la modificación que vamos a realizar corresponde a las series de facturación, pedidos, etc. Si hacemos uso de las multitiendas en Magento (por ejemplo si tenemos configurada nuestra web en dos idiomas), tendremos para cada una de ellas un una serie diferente para los códigos de los pedidos (ocurre lo mismo con las facturas, abonos, etc…), por defecto: 10000001 y 20000001. En la mayoría de los casos lo ideal sería poder unificarlos en una única serie, así por ejemplo el nº de factura será siempre correlativo independientemente de que la compra se haga desde la versión española o la inglesa de nuestra web.

Si optáramos por modificar directamente el núcleo deberíamos utilizar el fichero /app/code/core/Mage/Eav/Model/Entity/Type.php, y reescribir la función fetchNewIncrementId. Pero en nuestro caso vamos a optar por la opción comentada de crear un módulo.

Comenzamos asignándole un nombre, en nuestro caso  Empresa y creamos una carpeta con ese nombre dentro de /app/code/local/.

Después creamos toda la jerarquía de carpetas correspondientes y agregamos el siguiente fichero en blanco: /app/code/local/Empresa/Eav/Model/Entity/Type.php.

Luego crearemos el fichero de configuración (config .xml) en /app/code/local/Empresa/etc con el siguiente contenido:

<config>
<modules>
<Empresa_Eav>
<version>1.0.1</version>
</Empresa_Eav>
</modules>
<global>
<models>
<eav>
<rewrite>
<entity_type>Empresa_Eav_Model_Entity_Type</entity_type>
</rewrite>
</eav>
</models>
</global>
</config>

A continuación modificamos el fichero Type.php creado previamente:


include('../Mage/ Eav/ Model/ Entity/ Type.php'); // ELIMINAR LOS ESPACIOS!!!

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

//MODIFICACIÓN:
$groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
$group = Mage::getModel('core/store_group')->load($groupId);
$storeId = $group->getDefaultStoreId();
//FIN MODIFICACIÓN:

// 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();

// Realizar increment_last_id
$this->_getResource()->commit();
} catch (Exception $e) {
$this->_getResource()->rollBack();
throw $e;
}

return $incrementId;
}

}

Con esto ya tendríamos el trabajo prácticamente terminado, sólo faltaría indicarle a Magento que el módulo ya está listo, para ello habría que crear el fichero /app / etc / modules / Empresa_Eav.xml con el siguiente contenido:

<config>
<modules>
<Empresa_Eav>
<active>true</active>
<codePool>local</codePool>
</Empresa_Eav>
</modules>
</config>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *