实施发票的销售税策略

时间:2010-12-07 08:05:09

标签: sql-server database-design invoice sales-tax

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

我需要在发票(包含多个发票行)的发票上加入增值税。每行引用一个带有布尔属性Product的{​​{1}},几乎所有产品都应纳税。

我不想将税前价格存储在数据库中,因为这使得很难读出客户要支付的实际价格以及我显示这些价格的所有地方,然后我必须记住添加税。当增值税率确实发生变化时,对于这个特定的业务,所有价格都不会自动变化。

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

IsTaxable

其中TaxTotal = InvoiceTotal / (1 + TaxRate), 含税且InvoiceTotal

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

  1. 在我的TaxRate == 0.14表格中存储一个Tax金额,该金额不会发生变化?或...
  2. 为每个发票行存储税额,并在每次显示发票时计算发票税总额?
  3. 从DBA的观点来看,选项2似乎更安全,因为如果手动更改发票,那么税将正确计算,如果已经发出发票,这仍然存在不一致的问题。如果我坚持使用选项1,那么我就不能为单个行项目显示税收,但它可以更轻松地管理税收总额并进行汇总计算,但如果更改也会出现不一致。

    我无法做到这两点,因为这会复制数据。

    • 哪种方式正确?或者反向税收计算是一个非常糟糕的主意?

3 个答案:

答案 0 :(得分:4)

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

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

此外,您还需要按项目存储税项,因为增值税龙将期望您在退回项目时准确退还已支付的税款。在开始之前,您确实需要掌握当地的销售税规则。

我的经验是,如果你的计算结果只差一分钱就可以拖过煤炭,如果你被审计,你需要能够证明你是如何达到增值税数字所以不存储任何东西在你的计算中使用会让你感到高兴。

答案 1 :(得分: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;

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

答案 2 :(得分:0)

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