税金、割引、合計金額の計算精度を変更

CS-Cart は、デフォルトでは小数点以下第2位を四捨五入します。

お客様が大量に商品をご購入される場合、商品価格や税率の値に小数点以下2桁が含まれる場合、税金や割引、合計金額の計算に10分の1や100の位の誤差が生じる可能性がありますが、以下の2ステップで計算精度を上げることができます。

ステップ 2が正しく機能するには、管理画面の上部メニューから「設定 > 注文手続き」の「税額の算出基準」を「小計」に設定する必要があります。
「税額の算出基準」が単価に基づいている場合、ステップ 1を完了するだけで計算の精度が向上しますが、その場合、PayPalの支払方法がECサイトやマーケットプレイスサイトで機能しなくなります。

ステップ 1. fn.common.php を変更する

CS-Cart app/functions ディレクトリにある fn.common.php ファイルを開き、次の行を探します。

$price = sprintf('%.' . $decimals . 'f', round((double) $price + 0.00000000001, $decimals));

管理画面の上部メニューから「設定 > 注文手続き」の「税額の算出基準」の設定に合わせて、次の行のいずれかに置き換えファイルを保存します。

小計の場合

$price = sprintf('%.' . $decimals . 'f', round((double) $price + 0.00000000001, 4));

単価の場合

$price = sprintf('%.' . 4 . 'f', round((double) $price + 0.00000000001, 4));

これにより、CS-Cart は小数点以下第4桁を四捨五入します。

この変更した「4」を希望の数値に置き換えることにより、任意の小数点以下の桁数を設定できます。

ステップ 2. PayPal ユーザー向けの変更

PayPal は、xx.xx (小数点以下2桁) の価格形式のみをサポートします。

計算精度を高めた上で、支払方法として PayPal を使用する場合は、次の変更を加えます。

以下の変更は、管理画面の上部メニューから「設定 > 注文手続き」の「税額の算出基準」を設定し、ステップ 1で説明したように fn.common.php ファイルを変更した場合にのみ機能します。

CS-Cart app/functions ディレクトリにある fn.common.php ファイルを開きます。

次のコードをファイルの末尾に追加してファイルを保存します。

function fn_format_price_paypal($price = 0)
{
     return sprintf("%.2f", round((double) $price + 0.00000000001, 2));
}
function fn_format_price_by_currency_paypal($price, $currency_from = CART_PRIMARY_CURRENCY, $currency_to = CART_SECONDARY_CURRENCY)
{
    $currencies = Registry::get('currencies');
    $currency_from = $currencies[$currency_from];
    $currency_to = $currencies[$currency_to];

    $result = fn_format_price_paypal($price / ($currency_to['coefficient'] / $currency_from['coefficient']), CART_SECONDARY_CURRENCY);

    /**
     * Update converted value
     *
     * @param float  $price         value to be converted
     * @param string $currency_from in what currency did we get the value
     * @param string $currency_to   in what currency should we send the result
     * @param float  $result        converted value
     */
    fn_set_hook('format_price_by_currency_paypal_post', $price, $currency_from, $currency_to, $result);

    return $result;
}

 CS-Cart の app/addons/paypal/payments ディレクトリにある paypal.php ファイルを開き、以下の行を変更します。

このコードを探して$paypal_shipping = fn_order_shipping_cost($order_info);
置き換える$paypal_shipping = fn_format_price_paypal(fn_order_shipping_cost($order_info));

fn_format_price のすべてのインスタンスを fn_format_price_paypal に置き換えます。

このコードを探してfn_format_price(
置き換えるfn_format_price_paypal(

fn_format_price_by_currency のすべてのインスタンスを fn_format_price_by_currency_paypal に置き換えます。

このコードを探してfn_format_price_by_currency(
置き換えるfn_format_price_by_currency_paypal(

ファイルを保存。

 CS-Cart の app/addons/paypal/payments ディレクトリにある全ての .php ファイルに対して以下の手順を実行します。

fn_format_price のすべてのインスタンスを fn_format_price_paypal に置き換えます。

このコードを探してfn_format_price(
置き換えるfn_format_price_paypal(

fn_format_price_by_currency のすべてのインスタンスを fn_format_price_by_currency_paypal に置き換えます。

このコードを探してfn_format_price_by_currency(
置き換えるfn_format_price_by_currency_paypal(

ファイルを保存。