Cómo actualizar masivamente la cantidad de stock de un lote de productos?

CristianRojas

New member
XNullUser
Joined
Dec 28, 2021
Messages
3
Reaction score
0
Points
1
NullCash
132
Buenas noches, estoy intentando desarrollar un script en php para un módulo de PrestaShop en su versión 1.7.6 que me permita recibir a través de una solicitud ajax (FrontController) un arreglo como el siguiente:
[
$id_stock_avaiblable_1 => $new_quantity_1,
$id_stock_avaiblable_2 => $new_quantity_2,
...
],
con el cual me gustaría actualizar en una única operación el conjunto de stocks contenidos en él. Hasta ahora, encontré el método src\PrestaShopBundle\Entity\Repository\StockRepository.php -> bulkUpdateStock, el que me permitiría hacer lo que necesito, sin embargo, aún no descubro cómo instanciar correctamente esta clase. ¿Algún consejo?, de antemano muchas gracias.
 

d-shilko

Well-known member
☆☆ Special ☆☆
☆ Pro ☆
Joined
Jun 10, 2021
Messages
2,542
Reaction score
1,535
Points
113
NullCash
4,194
Buenas noches, estoy intentando desarrollar un script en php para un módulo de PrestaShop en su versión 1.7.6 que me permita recibir a través de una solicitud ajax (FrontController) un arreglo como el siguiente:
[
$id_stock_avaiblable_1 => $new_quantity_1,
$id_stock_avaiblable_2 => $new_quantity_2,
...
],
con el cual me gustaría actualizar en una única operación el conjunto de stocks contenidos en él. Hasta ahora, encontré el método src\PrestaShopBundle\Entity\Repository\StockRepository.php -> bulkUpdateStock, el que me permitiría hacer lo que necesito, sin embargo, aún no descubro cómo instanciar correctamente esta clase. ¿Algún consejo?, de antemano muchas gracias.



1640677809194.png
 

CristianRojas

New member
XNullUser
Joined
Dec 28, 2021
Messages
3
Reaction score
0
Points
1
NullCash
132


View attachment 37523
Entiendo la diferencia entre /src/Core, /src/Adapter y /src/PrestaShopBundle, no es ese el problema, lo explicaré con más detalle a continuación.

Trabajo en la integración de un ERP (Random) y PrestaShop, uno de los puntos considerados por la integración es el nivel de stock de los productos. Cuando se producen movimientos en el stock de los productos en el ERP originados fuera de PrestaShop debido por ejemplo a traslados entre bodegas, compras, ventas, etc., estas variaciones de stock debo sincronizarlas con el stock físico (physical_stock) de PrestaShop, ya que el stock reservado (reserved_stock) existe sólo en el contexto de PrestaShop y está relacionado a los productos reservados en pedidos que aún no han sido despachados, mientras que el stock disponible (stock_available) no considera por diseño el stock reservado, entonces si el stock que proviene desde el ERP lo asigno al stock disponible duplicaría el stock reservado hasta el momento. En cambio, ya que el stock físico considera tanto el stock disponible como el stock reservado, el stock que proviene desde el ERP lo asigno al stock físico, el stock reservado se mantiene y el disponible variará en función de stock_available.quantity = stock_available.physical_quantity - stock_available.reserved_quantity.

Esto está funcionando correctamente en producción actualmente, sin embargo, lo que busco es diseñar de la mejor manera estas operaciones a través de un módulo de PrestaShop, el cual a través de un FrontController recibe una solicitud ajax donde uno de los parámetros de la solicitud (Request->_POST['stock_quantity_changes']) es una entrada en formato de arreglo, por ejemplo:
[
$id_stock_avaiblable_1 => $new_quantity_1,
$id_stock_avaiblable_2 => $new_quantity_2,
...
],
con el cual me gustaría actualizar en una única operación el conjunto de stocks contenidos en él. Hasta ahora, encontré el método src/PrestaShopBundle/Entity/Repository/StockRepository.php -> bulkUpdateStock (https://github.com/PrestaShop/Prest...le/Entity/Repository/StockRepository.php#L102), el que me permitiría hacer lo que necesito, sin embargo, aún no descubro cómo instanciar correctamente esta clase (StockRepository). El método StockRepository->bulkUpdateStock recibe un conjunto de movimientos de stock (MovementsCollection) y con él, actualiza un conjunto de stocks disponibles, tanto en productos individuales como en pack's si es necesario, además, registra los movimientos de stock (StockMvt's), ejecuta el hook actionUpdateQuantity por cada stock modificado, elimina desde el caché el valor de cada stock modificado, todo esto lo pueden comprobar en PrestaShop/src/Core/Stock/StockManager.php -> updateQuantity (https://github.com/PrestaShop/Prest...ef510e1d/src/Core/Stock/StockManager.php#L153) y finalmente sincroniza el nivel de stock físico con el stock disponible + stock reservado. Me interesa utilizar toda esta lógica al actualizar un conjunto de stock's para adaptarme al funcionamiento de PrestaShop, ya que actualmente sólo actualizando los valores de la tabla stock_available no estoy registrando los StockMvt's, limpiando el caché ni ejecutando el hook actionUpdateQuantity.

En resumen, encontré la clase StockRepository la cual contiene el método bulkUpdateStock que me permitiría actualizar correctamente los niveles de un conjunto de stocks en una única operación, sin embargo, para instanciar esta clase se requieren un conjunto de parámetros cómo pueden verificar en https://github.com/PrestaShop/Prest...dle/Entity/Repository/StockRepository.php#L72, y hasta el momento no he encontrado en el código fuente ningún ejemplo de instanciación para esta clase, sólo he encontrado código que utiliza esta clase ya instanciada, como pueden verificar en src/PrestaShopBundle/Controller/Api/StockController.php (https://github.com/PrestaShop/Prest...undle/Controller/Api/StockController.php#L126). Así que la pregunta finalmente es, ¿Cómo puedo instanciar correctamente la clase StockRepository?, o, ¿Existe alguna alternativa para hacer lo que necesito?, saludos :)
Post automatically merged:

You can find this question written in English at https://stackoverflow.com/questions...ty-of-a-batch-of-products-in-prestashop-1-7-6
 
Last edited:

d-shilko

Well-known member
☆☆ Special ☆☆
☆ Pro ☆
Joined
Jun 10, 2021
Messages
2,542
Reaction score
1,535
Points
113
NullCash
4,194
Buenas noches, estoy intentando desarrollar un script en php para un módulo de PrestaShop en su versión 1.7.6 que me permita recibir a través de una solicitud ajax (FrontController) un arreglo como el siguiente:
[
$id_stock_avaiblable_1 => $new_quantity_1,
$id_stock_avaiblable_2 => $new_quantity_2,
...
],
con el cual me gustaría actualizar en una única operación el conjunto de stocks contenidos en él. Hasta ahora, encontré el método src\PrestaShopBundle\Entity\Repository\StockRepository.php -> bulkUpdateStock, el que me permitiría hacer lo que necesito, sin embargo, aún no descubro cómo instanciar correctamente esta clase. ¿Algún consejo?, de antemano muchas gracias.
One more time. You just want bulk(mass) change the products quantity by specific conditions? You simply want to update quantity by array "product_id" = "new quantity"? And for this task you want use Prestashop Bundle Entity? am I correct?
 

CristianRojas

New member
XNullUser
Joined
Dec 28, 2021
Messages
3
Reaction score
0
Points
1
NullCash
132
One more time. You just want bulk(mass) change the products quantity by specific conditions? You simply want to update quantity by array "product_id" = "new quantity"? And for this task you want use Prestashop Bundle Entity? am I correct?
Thanks for reply.

Yeah that's right. Currently, a timer is programmed that runs every 1 minute, which verifies the changes in the stock levels of the products in the ERP, then, the stocks that have changed must be synchronized with the physical stock and therefore with the available stock of the products in the PrestaShop store. In this process, every minute N modified stocks are identified, which make up a batch of N stocks to update, and to update this batch I would like to reuse the logic used by StockRepository-> bulkUpdateStock, which updates a set of available stocks, both in individual products as in pack's if necessary, in addition, it records the movements of stock (StockMvt's), executes the hook actionUpdateQuantity for each modified stock, removes from the cache the value of each modified stock, etc.
Post automatically merged:

I know the difference between /src/Core, /src/Adapter and /src/PrestaShopBundle, that's not the problem. Let me give you more details.

I work in the integration of an ERP (Random) and PrestaShop, one of the points considered by the integration is the stock level of the products. When there are movements in the stock of the products in the ERP originating outside of PrestaShop (for example, transfers between warehouses, purchases, external sales, etc.), these stock variations must be synchronized with the physical stock (physical_stock) of PrestaShop, because the reserved stock (stock_reserved) exists only in the PrestaShop context and is related to the reserved products in orders that have not yet been dispatched, while the available stock (stock_available) does not consider the reserved stock by design, then if the Stock that comes from the ERP is assigned to the available stock, the stock reserved until now would double. On the other hand, the physical stock considers both the available stock and the reserved stock, then the stock that comes from the ERP is assigned to the physical stock, the reserved stock is maintained and the available stock will vary depending on the following relation:
stock_available.quantity = stock_available.physical_quantity - stock_available.reserved_quantity

This is currently working correctly in production, however, what I am looking for is to design these operations in the best way through a PrestaShop module, which through a FrontController receives an ajax request where one of the request parameters (Request->_ POST['stock_quantity_changes']) is an input in array format, for example:
[
$id_stock_avaiblable_1 => $new_quantity_1,
$id_stock_avaiblable_2 => $new_quantity_2,
...
]
with which I would like to update the set of stocks that it contains in a single operation. So far, I found method src/PrestaShopBundle/Entity/Repository/StockRepository.php->bulkUpdateStock (https://github.com/PrestaShop/Prest...le/Entity/Repository/StockRepository.php#L102), that would allow me to do what I need, however I have not figured out how to create a proper instance of this class (StockRepository) yet. The StockRepository-> bulkUpdateStock method receives a set of stock movements (MovementsCollection) and with it, updates a set of available stocks, both in individual products and in pack's if necessary, in addition, records the stock movements (StockMvt's), executes the actionUpdateQuantity hook for each modified stock and removes the value of each modified stock from the cache, all this can be checked in /src/Core/Stock/StockManager.php->updateQuantity (https://github.com/PrestaShop/Prest...ef510e1d/src/Core/Stock/StockManager.php#L153). Finally the method bulkUpdateStock synchronize the level of physical stock with the available stock + reserved stock. I am interested in using all this logic when updating a set of stock to adapt it to PrestaShop's operation, since currently only updating the values of the stock_available table I am not registering the StockMvt's, cleaning the cache or executing the actionUpdateQuantity hook.
 
Last edited:

inmencidad

Member
XNullUser
Joined
Dec 20, 2021
Messages
73
Reaction score
2
Points
8
NullCash
6
Okay....
for those of us who do not know about programming,
There are already modules that perform this task, in the ADDONS section you will find a couple of them.

Greetings.
 

d-shilko

Well-known member
☆☆ Special ☆☆
☆ Pro ☆
Joined
Jun 10, 2021
Messages
2,542
Reaction score
1,535
Points
113
NullCash
4,194
Okay....
for those of us who do not know about programming,
There are already modules that perform this task, in the ADDONS section you will find a couple of them.

Greetings.
You have a point! Import/Export by cronjob.
 
Top