Jump to content

Prestashop no sabe multiplicar.


PepeFernandez

Recommended Posts

Buenas, cuando hago un pedido en la tienda y voy a ver los detalles del pedido me encuentro con lo siguiente:
image.thumb.png.7c615b0cd754a335f4437bff744df7c0.png

faltan 3 centimos en esa multiplicación. lo primero que hago es irme al tpl a ver de donde pinta esto y tal como espero lo saca todo de la variable $product, que será algo que ya ha guardado previamente:
 

<div class="col-sm-4 col-xs-9 details">
            {if $add_product_link}<a href="{$product.url}" target="_blank">{/if}
              <span>{$product.name}</span>
            {if $add_product_link}</a>{/if}
            {if is_array($product.customizations) && $product.customizations|count}
              {foreach from=$product.customizations item="customization"}
                <div class="customizations">
                  <a href="#" data-toggle="modal" data-target="#product-customizations-modal-{$customization.id_customization}">{l s='Product customization' d='Shop.Theme.Catalog'}</a>
                </div>
                <div class="modal fade customization-modal" id="product-customizations-modal-{$customization.id_customization}" tabindex="-1" role="dialog" aria-hidden="true">
                  <div class="modal-dialog" role="document">
                    <div class="modal-content">
                      <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="{l s='Close' d='Shop.Theme.Global'}">
                          <span aria-hidden="true">&times;</span>
                        </button>
                        <h4 class="modal-title">{l s='Product customization' d='Shop.Theme.Catalog'}</h4>
                      </div>
                      <div class="modal-body">
                        {foreach from=$customization.fields item="field"}
                          <div class="product-customization-line row">
                            <div class="col-sm-3 col-xs-4 label">
                              {$field.label}
                            </div>
                            <div class="col-sm-9 col-xs-8 value">
                              {if $field.type == 'text'}
                                {if (int)$field.id_module}
                                  {$field.text nofilter}
                                {else}
                                  {$field.text}
                                {/if}
                              {elseif $field.type == 'image'}
                                <img src="{$field.image.small.url}" loading="lazy">
                              {/if}
                            </div>
                          </div>
                        {/foreach}
                      </div>
                    </div>
                  </div>
                </div>
              {/foreach}
            {/if}
            {hook h='displayProductPriceBlock' product=$product type="unit_price"}
          </div>
          <div class="col-sm-6 col-xs-12 qty">
            <div class="row">
              <div class="col-xs-4 text-sm-center text-xs-left">{$product.price}</div>
              <div class="col-xs-4 text-sm-center">{$product.quantity}</div>
              <div class="col-xs-4 text-sm-center text-xs-right bold">{$product.total}</div>
            </div>
          </div>

Ahora estoy buscando a ver en que parte del backend hace la multiplicación y guarda los datos en la base de datos, porque claro, lo que estará pasando es que en la web muestra un precio redondeado, pero me estará multiplicando otro, el redondeo estará en el iva o en el neto del producto, pero vamos, me gutaría que los precios cuadrasen porque si no la gestoría va a estar llamando cada 2 por 3.

Alguien tiene idea de que ficheros hay que tocar? he visto alguno por src pero creo que tocar el core no es buena idea.

Link to comment
Share on other sites

vale, he conseguido hacer que funcione, pero me asaltan dudas, básicamente lo que he hecho ha sido en 2 funciones que tienen que ver con el calculo del precio cambiar los decimales de 6 a 2:
una la llama en src/Core/Cart/CartRow.php:
 

                $productPrices[$productPrice]['value'] = $this->priceCalculator->priceCalculation(
                    $shopId,
                    (int) $productId,
                    (int) $rowData['id_product_attribute'],
                    $countryId,
                    $stateId,
                    $zipCode,
                    $currencyId,
                    $groupId,
                    $quantity,
                    $computationParameters['withTaxes'],
                    2, //valor anterior 6
                    false,
                    true,
                    $this->useEcotax,
                    $specificPriceOutput,
                    true,
                    (int) $cart->id_customer ? (int) $cart->id_customer : null,
                    true,
                    (int) $cart->id,
                    $cartQuantity,
                    (int) $rowData['id_customization']
                );

y la otra ubicada en classes/Cart.php:
 

    private function getCartPriceFromCatalog(
        int $productId,
        int $combinationId,
        int $customizationId,
        bool $withTaxes,
        bool $useReduction,
        bool $withEcoTax,
        int $productQuantity,
        ?int $addressId,
        Context $shopContext,
        &$specificPriceOutput
    ): ?float {
        return Product::getPriceStatic(
            $productId,
            $withTaxes,
            $combinationId,
            2, //valor anterior 6
            null,
            false,
            $useReduction,
            $productQuantity,
            false,
            (int) $this->id_customer ? (int) $this->id_customer : null,
            (int) $this->id,
            $addressId,
            $specificPriceOutput,
            $withEcoTax,
            true,
            $shopContext,
            true,
            $customizationId
        );
    }

para esta última puedo hacer un override, pero para la otra, puedo hacer un override de un archivo del core? no entiendo muy bien porque prestashop mete los decimales en la función con un número así a pelo en lugar de usar una constante que se pueda editar en algún fichero de configuración, pero bueno, alguien me puede dar un poco de luz sobre este tema?

Link to comment
Share on other sites

El problema es por el redondeo de moneda.

El precio unitario tiene mas de 2 decimales lo que produce redondeo. Esto Prestashop lo lleva fatal. Yo vendo muchos productos con este problema en el precio, y la solución "fácil" es aumentar los decimales de la moneda, pero entonces, todas las cifras salen con más decimales y hay que tocar todas las plantillas para redondear los totales, facturas y demás a conveniencia.

La otra opción es usar un hook para que cuando vaya a mostrar un precio lo tratemos a conveniencia. En cualquier caso acabas teniendo que tocar los precios de todas las plantillas.

Espero te sirva

Link to comment
Share on other sites

On 5/14/2024 at 4:21 PM, Manuel_GT said:

El problema es por el redondeo de moneda.

El precio unitario tiene mas de 2 decimales lo que produce redondeo. Esto Prestashop lo lleva fatal. Yo vendo muchos productos con este problema en el precio, y la solución "fácil" es aumentar los decimales de la moneda, pero entonces, todas las cifras salen con más decimales y hay que tocar todas las plantillas para redondear los totales, facturas y demás a conveniencia.

La otra opción es usar un hook para que cuando vaya a mostrar un precio lo tratemos a conveniencia. En cualquier caso acabas teniendo que tocar los precios de todas las plantillas.

Espero te sirva

Buenas Manuel.

En primer lugar, muchas gracias por contestar. ¿podrías decirme que hook debo usar o que ficheros editar? la verdad es que no entiendo donde realiza la multiplicación, pero mira, esto es una muestra de la factura:
image.png.fc2927abf9e3a5cb4c83c7f735389370.png

pero el 20% de 471,26 es 94.252 que podría redondear a .25 o a.26, pero ahí faltan 3 centimos, he mirado en las tablas ps_order y ps_order_invoice y el dato del precio parece estar correcto, no tiene decimales raros:
image.png.1d1d082cf216d2ee01e202337d1bf016.pngimage.png.48d2d4401c23b88218bcbb34618ef4e1.png 
por lo que no entiendo  si mis tax son correctos y parece que también:
image.png.8934598666664d10242dc41b39a09fac.png

no debería simplemente multiplicar tota_products * (rate / 100) o algo así? no se porque salen resultados tan raros, en este se va de 3 centimos pero en otros se va de 20 centimos

Edited by PepeFernandez (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...