Out of stock y cambio de categoría en Magento mediante tareas programadas
28

sep

 

Out of stock y cambio de categoría en Magento mediante tareas programadas

Out of stock y cambio de categoría en Magento

En esta nueva entrada del blog especialista en Magento veremos como podemos programar de una forma sencilla que a una determinada hora los producto que definamos queden en el estado Out of stock y se muevan a la categoría que nos interese eliminándolos del resto de categorías a las que estaban asignados. Esta nueva entrada, se me ocurrió hace unos días tratando una personalización. Si bien, el caso que vamos a analizar no es ni mucho menos el mismo por el modelo de negocio, el producto de nuestro cliente final y la forma de abordar la solución. He creido conveniente tomar la base de la problemática, readaptarla, distorsionarla y ampliarla para, ya que de paso hacía una entrada al respecto de la misma, entrar en mas funcionalidades que creía útiles, interesantes y que podían aplicarse a un gran número de tiendas online.

Durante mi experiencia como consultor ecommerce especializado en Magento, he aprendido que, aunque cada cliente tiene sus propias particularidades dependiendo de su producto, el target al que este va dirigido, su enfoque de negocio, etc. La forma en que podemos plantear una solución, bien sea en Magento o en cualquier otra plataforma, ya sea de comercio electrónico, o no, se basa en unos conceptos comunes que cuanto mas dominemos y experimentemos con ellos mas nos harán crecer como profesionales y nos facilitarán encontrar soluciones de calidad a la hora de solventar los retos que se nos plantean.

Análisis del caso Out of stock en Magento y cambio de categoría: Necesidades del cliente

Para este caso, propongo el siguiente ejemplo práctico. Imaginemos un cliente que de entre toda su gama de productos simples dispone de algunos un tanto especiales. ¿Porqué especiales? Pues imaginemos que su proveedor puede asegurarle un stock inmediato hasta cierta fecha y a partir de la misma el producto de cara a nuestros clientes debe de aparecer como “Out of stock”, pues es muy poco probable que el producto vuelva a reponerse de inmediato o simplemente por que el producto no pueda ser adquirido por el método tradicional desde el comercio electrónico (realmente podemos imaginar la causa que queramos). Nuestro cliente, quiere que los productos sigan apareciendo en su tienda online, de cara a que los consumidores los puedan visualizar aunque no puedan ser adquiridos. Es mas, su intención es que estos productos especiales desaparezcan de las categorías en las que estaban asignadas inicialmente pasando a ubicarse, tras la fecha señalada por el proveedor en una categoría específica donde puedan ser encontrados de un forma rápida y sencilla manteniendo el resto de categorías de Magento “limpias” de productos Out of stock.

Resumiendo, las necesidades de nuestro cliente son:

1- Nuestro cliente necesita distinguir entre produtos simples “especiales” y normales.

2- Los productos especiales deden de poder marcarse con una fecha límite de disponibilidad.

3- A partir de esta fecha el stock del producto en Magento pasará a stock cero. El producto aparecerá como Out of Stock en Magento, se borrará de todas aquellas categorías a las que pertenecía anteriormente y pasará a ubicarse en una nueva categoría especial donde se ubicarán el resto de productos que cumplan con los mismos requisitos.

Análisis del caso Out of stock en Magento y cambio de categoría: Solución propuesta.

Una vez nuestro cliente nos hace llegar sus necesidades para personalizar su negocio. Tras analizarlo, debatirlo y estudiar posibilidades con él optamos por implementar la siguiente solución:

1- Nuestro cliente necesita distinguir entre produtos simples “especiales” y “normales”.

Para distinguir los productos simples especiales de los normales optamos por crear un nuevo atributo para los productos simples que pueda contener los valores Si/No. De esta forma podemos distinguir aquellos productos que tendrán el tratamiento especial de aquellos que no lo tengan para posteriormente distinguir entre aquellos que debemos de asignar la nueva categoría y actualizar a Out of Stock en Magento. Para ello creamos el atributo con el código interno “producto_caduco

2- Los productos especiales deben de poder marcarse con una fecha límite de disponibilidad.

Al igual que en el caso anterior, para saber la “fecha de caducidad” del producto en la web optamos por crear un nuevo atributo “fecha_sinstock” de tipo fecha que nos servirá como referencia para saber cuales de los productos especiales todavía no están como Out of stock en Magento ni en la categoría correcta.

Es cierto, que para el caso que nos ocupa, podría obviar el primero de los atributos. Pues con el campo fecha, en caso de tener contenido ya podríamos detectar que le producto es caduco. No obstante, de cara a la explicación (y por que no, de cara a las futuras modificaciones del cliente en cuanto a sus necesidades) he preferido tener inicialmente un campo de control mas amplio (producto_caduco) para identificar que el producto es especial y otro de ejecución (fecha_sinstock) que me definirá cuando realizar las acciones concretas de actualización a Out of stock y cambio de categoría. Para que la gestión de esta información por parte del cliente en la ficha de producto sea mas cómoda he creado una nueva pestaña en la ficha de Magento con esta información. Así es como queda la ficha del producto:



Out of stock magento y cambio categoria atributos

3- A partir de esta fecha el stock del producto en Magento pasará a stock cero y estado Out of stock. El producto aparecerá como Out of Stock en Magento, se borrará de todas aquellas categorías a las que pertenecía anteriormente y pasará a ubicarse en una nueva categoría especial donde se ubicarán el resto de productos que cumplan con los mismos requisitos.

Los puntos uno y dos han sido configurados empleando únicamente el panel de administración de nuestra tienda online. Si bien, el proceso de pasar el producto a Out of stock y cambiarlo de categoría es un proceso que debe de ser programado por nosotros. Para ello, tras escuchar a nuestro cliente decidimos llevar a cabo una tarea programada la cual todos los días a una hora X acordada por nuestro cliente que ejecutará un script php que realizará las tareas requeridas por el cliente para su comercio electrónico. Procedemos a analizarlo detalladamente en le siguiente punto.

 

Out of stock y cambio de categoría mediante una tarea programada en Magento.

Para programar una tarea en nuestro servidor existen múltiples tutoriales, podéis ver un ejemplo de como editar el crontab en la misma wiki de magento. El script que debemos de ejecutar de forma síncrona una vez al día es el siguiente:

<?php
require_once 'app/Mage.php';
Mage::app('default');
$allProducts = Mage::getModel ('catalog/product' )->getCollection();
$caducos= $allProducts->addAttributeToFilter('producto_caduco', 130);
//130 es el valor de mi si en el atributo. Recordad que podemos obtener el id del atributo con
//herramientas como firebug en firefox o developer tools en Chrome. este valor es asigando por //Magento de orma que no olvideis actualizarlo al valor de vuestra instalación en concreto una
//vez creeis el atributo


 if ($caducos) {
 	echo ("Productos con control de caducidad de Stock:");
 	echo "<br>";
	echo "<br>";
	echo "----------------------------------------------------------------------------------------";
	//Muestro información por pantalla
	foreach ($caducos as $caduco) {
		$id=$caduco->getid();
		$nombre=Mage::getModel ('catalog/product' )->load($id)->getName();
		$fechasinstock=Mage::getModel ('catalog/product' )->load($id)->getFechaSinstock();;
		////////////////////////////////////
		echo "<br>";
		echo ("- Nombre: ".$nombre);
		echo "<br>";
		echo ("- Fecha Sin Stock: ".$fechasinstock);
		echo "<br>";
		echo "------------------------------------------------------------------------------------";
		echo "<br>";
		////////////////////////////////////
	}
 }

//Fecha horas minutos y segundos
//$hoy= date('Y-m-d H:i:s');

//Fecha tirando de Magento, muestra el mismo resultado en le echo que date('Y-m-d H:i:s');
$hoy = Mage::app()->getLocale()->date()
	->setTime('00:00:00')
	->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);

//////////////////////////////
echo "<br>";
echo ("La fecha actual es: ".$hoy);
echo "<br>";
echo "<br>";
////////////////////////////////////
// Filtro los marcados caducados con fecha igual o inferior a hoy.
// ->addAttributeToFilter('fecha_sinstock', array('lteq' => $hoy));
$caducados=Mage::getModel ('catalog/product' )->getCollection()
			->addAttributeToFilter('producto_caduco', 130)
			->addAttributeToFilter('fecha_sinstock', array('eq' => $hoy));
foreach ($caducados as $producto_caduco) {
		$id=$producto_caduco->getid();
		$nombre=Mage::getModel ('catalog/product' )->load($id)->getName();
		//Mage:log("$nombre");
		echo "------------------------------------------------------------------------------------";
		echo "<br>";
		echo ("Estos son los nombres de tus PRODUCTOS CADUCADOS:  ".$nombre);
		echo "<br>";
		echo "<br>";
}
if ($caducados) {
	echo "Tienes productos caducados:";
	echo "<br>";
	echo "<br>";

	foreach ($caducados as $producto_caduco) {
		$id=$producto_caduco->getid();
		$producto=Mage::getModel ('catalog/product' )->load($id);
		//$producto->setProductoCaduco(129)->getResource()->saveAttribute($product, 'producto_caduco');
		
		//Nombre del producto
		$nombre=$producto->getName();

		////////////////////////////////
		//MUEVO A LA CATEGORÏA DESTINO//
		////////////////////////////////
		//El id de mi ategoría destino "Productos bajo petición" es el 37
		$catdestino[]= 37;
		//Obtengo las categorías donde está ubicado mi porducto
		$categorias=$producto->getCategoryIds();
		//Mage::log("Categorías iniciales");
		//Mage::log($categorias);
		$categorias = $catdestino;
		//Mage::log("Categorías finales");
		//Mage::log($categorias);
		//Asigno el producto a la categoría destino
 		$producto->setCategoryIds($categorias);
 		$producto->save();

    	echo "---El producto con id= ".$id."y nombre= ".$nombre." esta solo en la categoria Productos bajo Peticion ---";
    	echo "<br>";
    	////////////////////////////
    	////////RESETEO STOCK///////
		//$nombre=Mage::getModel ('catalog/product' )->load($id)->getName();
		//La idea es poner poner el producto caducado a stock cero 
		//para que no se pueda adquirir pero se vea en el front
		//$producto->setCategoryId($catdestino);
		//Actualizo el stock del producto a cero
    	$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($id);
    	$stockItem->setData('qty', 0);
		$stockItem->save();
		echo "---El producto con id= ".$id."y nombre= ".$nombre." tiene stock 0 ---";
   		echo "<br>";
   		echo "<br>";	
   		
   	}
 }

Os dejo aquí el fichero en cuestión para que podáis descargarlo:OutOfStockyCambioCat

Como podéis ver el php se encuentra altamente comentado, de forma que se puede identificar sin problemas que se realiza en cada parte del mismo además de mostrar por pantalla los datos recopilado en cada tramo del mismo. No olvidéis editar los ids de los valores de los atributos en caso de probarlo en otra instalación de Magento así como el id de la categoría destino. Procedamos a comentar las partes mas importantes del mismo:

- Identificación de los productos marcados con le atributo de control “producto_caduco” a ‘Si’:


$allProducts = Mage::getModel ('catalog/product' )->getCollection();
$caducos= $allProducts->addAttributeToFilter('producto_caduco', 130);
//130 es el valor de mi si en el atributo. Recordad que podemos obtener el id del atributo
// con herramientas como firebug en firefox o developer tools en Chrome.
//este valor es asignado por Magento de forma que no olvidéis actualizarlo al valor de //vuestra instalación en concreto una vez creéis el atributo

Como se comenta, el valor del filtrado del atributo “producto_caduco” a 130 es debido a que la opción Si tiene asignado este id:

Out of stock magento id campo control a si

- Asignación a la nueva categoría destino “Productos bajo petición” donde el producto se encontrará en estado de Out of Stock en Magento:


foreach ($caducados as $producto_caduco) {
		$id=$producto_caduco->getid();
		$producto=Mage::getModel ('catalog/product' )->load($id);
		//$producto->setProductoCaduco(129)->getResource()->saveAttribute($product, 'producto_caduco');
		}
		//Nombre del producto
		$nombre=$producto->getName();

		////////////////////////////////
		//MUEVO A LA CATEGORÍA DESTINO//
		////////////////////////////////
		//El id de mi categoría destino "Productos bajo petición" es el 37
		$catdestino[]= 37;
		//Obtengo las categorías donde está ubicado mi producto
		$categorias=$producto->getCategoryIds();
		//Mage::log("Categorías iniciales");
		//Mage::log($categorias);
		$categorias = $catdestino;
		//Mage::log("Categorías finales");
		//Mage::log($categorias);
		//Asigno el producto a la categoría destino
 		$producto->setCategoryIds($categorias);
		//Actualizo el valor de producto caduco a NO para que estos productos ya a cero y en la categoría correcta no se tengan presentes en las siguientes ejecuciones.
 		$producto->save();

- Para dejar el producto ya en la categoría asignada en Magento con el estado Out of Stock hacemos uso del siguiente código:


////////////////////////////
    	////////RESETEO STOCK///////
		//$nombre=Mage::getModel ('catalog/product' )->load($id)->getName();
		//La idea es poner poner el producto caducado a stock cero
		//para que no se pueda adquirir pero se vea en el front
		//$producto->setCategoryId($catdestino);
		//Actualizo el stock del producto a cero
    	$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($id);
    	$stockItem->setData('qty', 0);
		$stockItem->save();

Os dejo un video donde podéis ver el script funcionando y donde se pueden observar los mensaje informativo que aparecen por pantalla:

Si deseáis obtener mas información acerca de como personalizar vuestro negocio online no dejéis de visitar la sección de desarrollo Magento:


Magento

Pese a ser un script genérico, en él si se tratan ciertas partes muy interesantes como el filtrado de productos por atributos, la asignación a una nueva categoría y el cambio de stock de un producto. Es por ello, que espero que pueda resultaros de utilidad si tenéis en mente algún proceso síncrono para realizar alguna tarea concreta en vuestro ecommerce.

Resumen
Nombre
Out of stock y cambio de categoría en Magento: Paso a paso mediante una tarea programada
Autor
Descripción
Out of stock y cambio de categoría en Magento: Paso a paso mediante una tarea programada. Out of stock en ciertos productos y asignación a única categoría.
The following two tabs change content below.
Especialista en Magento y servicios ecommerce: Consultoría ecommerce, Optimización Magento, Desarrollo Magento, Integración Magento ERP y Posicionamiento SEO Magento.


4 Comments

  • yisell

    25. nov, 2014

    hola, quisiera que me ayudara lo que necesito es cambiar los id de las categorias de mi tienda en magento, ya que quiero importar un csv con muchos productos y vienen con ids distintos de los q tengo en mi tienda,, gracias espero pueda ayudarme

    • Jose Vicente Ribera

      01. dic, 2014

      Hola Yisell,
      Considero que sería mucho mas conveniente el proceso contrario, es decir, adaptar las categorías del fichero de datos a importar a las categorías de Magento.
      Un saludo.

  • Tino

    08. abr, 2015

    Hola Jose.
    Interesante la herramienta y util para algunos tipos de productos.
    Yo estoy estancado en una duda y a ver si me puedes ayudar.
    Magento cuando haces una venta de un producto el cual solo queda uno, te deja el stock en 0 y te lo pasa a fuera de stock, hasta ahí todo correcto. El problema es que cuando de ese producto se lo devuelves al cliente vuelve a quedar uno pero Magento no lo vuelve a pasar a Stock y se queda fuera de stock.
    Sabes si alguna manera de que lo haga automatico el pasarlo de fuera de stock a stock cuando aumentas el stock?
    Gracias

  • Jose Vicente Ribera

    10. abr, 2015

    Hola Tino,
    Creo que te refieres a la siguiente opción del panel de configuración de Magento:
    System->Configuration->Inventory->Stock Options->Set Items’ Status to be In Stock When Order is Cancelled.
    Habilitala a “Yes” y limpia la cache de Magento.
    Un saludo y gracias por tu comentario.

Deja un comentario
 

Tu email no será publicado. Campos obligatorios . *