es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué Price.php no calcula correctamente el precio final?

Intento obtener el precio final de un producto simple en un Plugin. El precio regular del producto es de 12.99, pero se ve afectado por una regla de precio de catálogo del 50%.
Todo funciona bien en el frontend. Allí se muestra con 6.50, pero cuando intento usarlo en un Plugin, siempre obtengo el precio regular.

Uso el método vendor/magento/module-catalog/Model/Product/Type/Price::getFinalPrice($qty, $product):

private function getFinalPriceForMyPlugin(array $product): float 
{
   /** @var Product $productEntity */
   $productEntity = $this->productRepository->get((string)$product['sku']);
   return (float) $this->price->getFinalPrice(1, $productEntity);
}

Estaba bastante seguro de que Price.php era responsable de calcular el precio final. Entonces, ¿por qué no funciona?

Por cierto, se borró la caché y se reindexó el índice.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en el hecho de que el método getFinalPriceForMyPlugin solo recibe el SKU del producto como un array y no considera la regla de precio del catálogo aplicada a él. Para obtener el precio final del producto con la regla de precio del catálogo aplicada en el backend, deberías pasar el objeto del producto con la regla aplicada.

    Una forma de lograr esto es cargar el modelo del producto utilizando el SKU del producto y luego aplicar la regla de precio del catálogo utilizando el método applyPriceRule() antes de pasarlo al método getFinalPrice().

    Aquí tienes una versión actualizada del método getFinalPriceForMyPlugin():

    private function getFinalPriceForMyPlugin(array $product): float 
    {
       /** @var Product $productEntity */
       $productEntity = $this->productRepository->get((string)$product['sku']);
       $productEntity->setCustomerGroupId(\Magento\Customer\Model\Group\AbstractGroup::NOT_LOGGED_IN_ID); // Establecer ID del grupo de clientes
       $productEntity->setData('request_path', $product['url']); // Establecer URL del producto
       $productEntity->setData('qty', 1); // Establecer cantidad del producto
    
       // Aplicar regla de precio del catálogo
       $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
       $rule = $objectManager->create('Magento\CatalogRule\Model\Rule');
       $rule->load(1); // Ingresar ID de la regla de precio del catálogo aquí
       $rule->applyPriceRule($productEntity, $productEntity->getPrice());
    
       // Obtener precio final
       return (float) $this->price->getFinalPrice(1, $productEntity);
    }
    

    Ten en cuenta que utilizar directamente el objectManager no es una buena práctica y deberías considerar reestructurar tu código para evitarlo. Además, deberás reemplazar el ID de la regla de precio del catálogo en el método load() con el correcto.

Comments are closed.