正确计算包括外币税在内的价格的方法

时间:2017-12-07 17:18:40

标签: e-commerce currency invoice accounting tax

我试图升级应用程序,以便我可以销往多个国家/地区。我将所有价格存储在数据库中的英镑不含税,最高可达4dp,我需要计算国家/地区货币的价格,包括税金。

我是否将价格乘以汇率与不含税的价格(选项1)相乘或计算包含税的金额,然后用汇率计算多倍(选项2)?在查看OpenCart如何计算它之后,我还添加了一个选项3,它类似于选项2,但在显示它时只进行了轮次。以下是所有3个选项的公式:

选项1:

  

回合((价格*汇率)/ 100 *(100 +税率))

选项2:

  

回合(回合(价格/ 100 *(100 +税率))*汇率)

选项3:

  

回合((价格/ 100 *(100 +税率))*汇率)

例如说我的产品价格为89.99。如果我想用汇率为1.5且税率为20%的货币显示。我会说:

选项1:

  

回合((89.99 * 1.5)/ 100 *(100 + 20))= 161.98

选项2:

  

回合(回合(89.99 / 100 *(100 + 20))* 1.5)= 161.99

选项3:

  

回合((89.99 / 100 *(100 + 20))* 1.5)= 161.98

我发现OpenCart总是将未计算的数字乘以最后的汇率。例如,他们计算行总数的公式是:

  

回合((价格/ 100 *(100 +税率))*数量*汇率)

因此,如果我要订购我的产品中的3件,那就是:

  

回合((89.99 / 100 *(100 + 20))* 3 * 1.5)= 485.95

我发现这样做的问题OpenCart的方法是用户将看到项目价格(含税)161.98和总计485.95。但是如果我说161.98 * 3我得到485.94,所以它没有正确总结。

重要的是,我认为这是正确的,因为你可以看到我最终会得到一分钱的问题。如果有人能让我知道哪种方式是正确的,或者如果没有一种方法可以提出替代方案,我会很感激。感谢

3 个答案:

答案 0 :(得分:1)

我无法告诉您正确的选项是什么,或者即使一个正确选项也是如此。但根据经验,我可以说,如果有多种选择可以做一件事,可以在软件中进行配置。在这种情况下,您可以轻松使用strategy pattern并使计算价格的策略可配置。客户可以选择他们想要的计算方式。

答案 1 :(得分:1)

正确的解决方案取决于您的业务。当您在不同国家/地区销售商品时,您很可能在这些国家/地区设有分支机构 - 您需要使用这些国家/地区的货币进行净价。这导致每个项目的净价格“翻译”为外币,然后将该净价格乘以该金额并乘以税率/百分比。

欧盟MOSS(当您在其他国家/地区提供服务时收费,或者例如下载软件时)会有所不同。您可以销售具有GBP定价的产品,但必须考虑您的消费者的当地税收因素。参见例如https://ec.europa.eu/taxation_customs/sites/taxation/files/resources/documents/taxation/vat/how_vat_works/telecom/one-stop-shop-guidelines_en.pdf

对于MOSS,我没有详细检查,但我希望您使用不同的公式,使用每个项目的本地GBP净价,乘以金额,乘以消费者的税率。这个税额仍然以英镑计算,然后应该与货币汇率相乘,我希望。

答案 2 :(得分:1)

由于所有变量都被舍入,除了Exchange Rate,我希望通常看起来像这个1.3462,我们可以编写这样的测试:

// I'm guessing you need it in PHP
$price = 89.99;
$quantity = 1;
$tax = 20;
$tax = $tax/100.0 + 1;
// $tax = 1.2
$exchangeRate = 1.5;

$totalPrice = $price*$quantity*$tax;                     // Test #1
$totalPriceRounded = round($price*$quantity*$tax,2);     // Test #2

echo $totalPrice.'<br/>'.$totalPriceRounded;

哪个会有这个输出:

107.988   // Test #1 <--- This is amount that needs to be paid to you and Great Britain
107.99    // Test #2 <--- rounded

现在,很明显金额存在差异,有哪些可供选择?由于您从英国收取物品,您希望以英镑获得您要求的全额金额,因此我们可以依赖该因素。最后,如果我理解正确的话,客户必须缴纳的税款是给英国征税的。

让我们检查外币的最终价格:

$totalPrice = round($totalPrice * $exchangeRate,2);
$totalPriceRounded = round($totalPriceRounded * $exchangeRate,2);

echo $totalPrice.'<br/>'.$totalPriceRounded;

哪个会有这个输出:

// Amount in foreign currency
161.98      // Test #1
161.99      // Test #2

如上所述,我们可以检查从外币计算回107.988 GBP时,哪一项会返回最接近GBP的值。

// To calculate the totalPrice back to price*tax*quantity in GBP
$totalPrice /= $exchangeRate;
$totalPriceRounded /= $exchangeRate;

echo $totalPrice.'<br/>'.$totalPriceRounded;

输出为:

// totalPrice in GBP currency
107.98666666667       // Test #1
107.99333333333       // Test #2

当我们分税时:

$totalPrice /= $tax;
$totalPriceRounded /= $tax;

echo $totalPrice.'<br/>'.$totalPriceRounded;

输出是:

// the amount you get in GBP currency
89.988888888889    // End result of Test #1
89.994444444444    // End result of Test #2

正如你所看到的那样,in this case,通过使用少量的round($price*$quantity*$tax*$exchangeRate, 2)你会减少,但是通过使用round(round($price*$quantity*$tax,2)*$exchangeRate, 2)你会再次获得更多,相同的价值。在其他一些情况下,差异可能与我们在这里得到的不同,可能是另一种方式。

<强>结论

  • 如果您拥有固定数量的产品,每个产品都有fixed prices,那么随着时间的推移,您将要么省钱(一笔不大的金额),要么收入超过您的收入(也是微不足道的数额)。结果取决于每种产品的受欢迎程度和价格(即round功能是向上还是向下),以及您选择的计算方式。根据产品的受欢迎程度,您可以手动调整每种产品的价格,以最大限度地减少一段时间内的损失/收益。

  • 如果您的产品有random prices,请假设您租用web servers且价格为$0.01/second。然后,您的损失/收益的期望值接近于零。并且购买的商品越多,它就越接近零。无论采用什么方法,你都不会在这里失去任何东西。有一次你赢了一次,你松了一些。

在我看来,我会将其标准化为一切:

$price = 4.47;
$quantity = 1.2    // lets say liters

// Even round the price before applying tax
$totalPrice = round($price * $quantity, 2);

因为如果你被迫显示所有不同的计算阶段,那么你将不得不围绕每一步。

但最精确的是使用它,因为丢失的信息最少:

// Round once at end
$totalPrice = round($price*$quantity*$tax*$exchangeRate, 2);

最后,这一切都取决于您如何设置产品价格或定价如何工作以选择使用哪种方法。我说它并不重要,我认为每家公司都会选择最适合自己的产品。

从法律上讲,一些国家/城市/等。有关如何计算这个的法律,你应该看看英国的法律来检查你的问题的有效程序。