【问题标题】:Implementing a sales tax strategy for Invoices为发票实施销售税策略
【发布时间】:2011-05-21 10:38:52
【问题描述】:

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

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

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

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

TaxTotal = InvoiceTotal / (1 + TaxRate),

其中InvoiceTotal 是含税的,TaxRate == 0.14

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

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

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

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

  • 正确的方法是什么?或者反向计税真的是个坏主意?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    我的经验是,如果您的计算结果只差一分钱,您可能会被拖垮在你的计算中使用会抓住你。

    【讨论】:

    • +1。在欧洲,对于某些业务,不同的产品系列可能会有不同的费率,因此我将 FamilyId 存储在 Products 表中,将 TaxCode 存储在 Families 表中。费率存储在增值税表中。我还向客户添加了增值税类别,因为某些客户在某些情况下可能支付 0%。此外,一些发票可能在不同行包含不同的增值税率。
    【解决方案2】:

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

    我们必须按增值税百分比累计净值(我们有三种类型: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;
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多