Jump to content

[SOLUCIONADO] Prestashop no sabe multiplicar.


Recommended Posts

Posted (edited)

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.

Edited by PepeFernandez
the topic is solved (see edit history)
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

Posted (edited)
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

estoy haciendo pruebas y veo que cuanto mas productos hay, mas se descuadra, por ejemplo, un producto que vale 13,97 si en cantidad pongo 10 y el iva está en 21% me descuadra 3 centimos y si cojo 100 se van 30 centimos. (el 21% de 1397 = 293.37) tengo puesto lo del redondeo en el total, pero es como si me estuviera calculando el iva de cada uno redondeando mal y haciendo un += o algo por el estilo lo que acaba descuadrando.

image.thumb.png.d5aa1e257efd4b4a7ef4faf93401f98e.png

Link to comment
Share on other sites

Hola @PepeFernandez!

¿Has comprobado el tipo de redondeo que estas utilizando? A lo mejor el problema va por ahí.

¿Has probado a incrementar los decimales en la moneda? A ver si al menos las cifras te salen correctas. Luego solo sería tocar plantillas.

Link to comment
Share on other sites

Posted (edited)
13 hours ago, Manuel_GT said:

Hola @PepeFernandez!

¿Has comprobado el tipo de redondeo que estas utilizando? A lo mejor el problema va por ahí.

¿Has probado a incrementar los decimales en la moneda? A ver si al menos las cifras te salen correctas. Luego solo sería tocar plantillas.

Buenas Manuel,
Si, leí un caso parecido en el que tenían el redondeo en cada línea y lo solucionó poniendolo en total, he hecho lo mismo pero a mi no me ha funcionado.
image.thumb.png.b41096d18138d1baa16af45811a0df04.png
he probado a aumentar los decimales como me has sugerido y tampoco ha habido suerte:
image.thumb.png.1b494d939285d5a9def40a2ccd1a54fa.png

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

ya lo he solucionado, un archivo que se tocó tiene la siguiente llamada:
 

 if (null === $productPrices[$productPrice]['value']) {
                $productPrices[$productPrice]['value'] = $this->priceCalculator->priceCalculation(
                    $shopId,
                    (int) $productId,
                    (int) $rowData['id_product_attribute'],
                    $countryId,
                    $stateId,
                    $zipCode,
                    $currencyId,
                    $groupId,
                    $quantity,
                    $computationParameters['withTaxes'],
                    2, //valor original -> 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']
                );
            }

le he puesto su valor original y ya funciona, se tocaron unos archivos porque el carro no multiplicaba bien, pues se ve que este no era necesario tocarlo

Link to comment
Share on other sites

  • PepeFernandez changed the title to [SOLUCIONADO] Prestashop no sabe multiplicar.

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...