5

在南非,我们有增值税 (VAT),它与销售税几乎相同,目前固定为 14%,但随时可能发生变化。

我需要在由多个Invoice Lines组成的发票(不可变)上包含增值税。每行引用Product带有布尔属性的 a IsTaxable,并且几乎所有产品都应纳税。

我不想将税前价格存储在数据库中,因为这只会让人难以阅读客户将要支付的实际价格,而且在我显示这些价格的任何地方,我都必须记得加税。当增值税率确实发生变化时,对于这个特定的业务,所有价格都自动变化是不可取的。

因此,我认为反向税收计算是可行的方法,并且可能并不少见。发票总计是所有发票行总计的总和,其中包括任何行折扣并且应该是含税的。因此,发票总额本身是含税的:

TaxTotal = InvoiceTotal / (1 + TaxRate),

哪里InvoiceTotal是含税和TaxRate == 0.14

由于发票一旦发出就不能更改(它们是不可变的),我应该:

  1. Tax在我的表中存储一个Invoices不变的金额?或者...
  2. 为每个发票行存储一个税额,并在每次显示发票时计算发票税总额?

从 DBA 的角度来看,选项 2 似乎更安全,因为如果手动更改了发票,那么税款将被正确计算,如果发票已经开具,这仍然存在不一致的问题。如果我坚持使用选项 1,那么我将无法显示单个行项目的税款,但它可以更轻松地管理税款总额和进行汇总计算,尽管如果更改也会出现不一致。

我不能两者都做,因为那会重复数据。

  • 哪条路是正确的?或者反向计税是一个非常糟糕的主意?
4

3 回答 3

4

将税前值存储在数据库中,您还可以存储含税值并将其用于大多数用例。

我预见到的大问题是发票增值税的四舍五入规则。这些(至少在英国)非常严格,您的反向计算无法做到这一点。

此外,您需要逐项存储税款,因为增值税龙会希望您在退货时准确退还已支付的税款。在开始之前,您确实需要了解当地的销售税规则。

我的经验是,如果您的计算结果只差一分钱,您就会被拖垮计算会抓住你。

于 2010-12-07T10:11:19.973 回答
1

我完全同意詹姆斯安德森的观点!在德国,根据增值税计算的规则与英国一样严格。

我们必须按增值税百分比(我们有三种类型:0、7 和 19%)以两位数四舍五入来累加净值。在这个四舍五入的价值上,我们必须计算增值税。增值税必须四舍五入,并且必须在发票上显示。

但尽管如此,您仍可以存储含税价格。这取决于税收增加时净价格或最终价格是否保持不变。在德国,通常 B2B 净价格保持不变,但 B2C 最终价格保持不变——这取决于。

你可以这样计算:

with cPriceIncludingVAT as (
    select  InvoiceNo, VATPercentage,
            PriceIncludingVAT = cast(sum(amount * price) as decimal(12,2))
    from    InvoiceLines inner join VAT on VAT.VATID=InvoiceLines.VATID
    group by InvoiceNo, VATPercentage
),
cVATcalculated as (
    select  InvoiceNo, VATPercentage, PriceIncludingVAT,
            VAT = cast(PriceIncludingVAT * VATPercentage / 
                         (1+VATPercentage) as decimal(12,2))
    from    cVATcalculated
)
select    InvoiceNo, VATPercentage, PriceIncludingVAT, VAT,
          NetPrice = PriceIncludingVAT - VAT
from      cVATcalculated;

如果您将其保存为视图,您应该能够准确地重新打印动态计算的增值税值。当有一个会计系统时,您可以(并且应该)导出与您打印的完全相同的数据。通常你应该将这些值保存为数据库中的字段值 - 但我理解你是否想要一种更动态的方法......

于 2010-12-07T10:31:56.080 回答
0

其他答案很好,但正如 idevlop 所提到的,几乎可以肯定的是,在未来的某个时候,您将开始为不同类别的产品提供不同的费率。预先添加该功能将为您以后节省大量的心痛。去过也做过。

于 2010-12-07T11:21:42.737 回答