Sql server 实施发票的增值税策略

Sql server 实施发票的增值税策略,sql-server,database-design,invoice,sales-tax,Sql Server,Database Design,Invoice,Sales Tax,在南非,增值税(VAT)与销售税几乎相同,目前固定为14%,但随时可能发生变化 我需要将增值税包括在由多个发票行组成的发票上(不可变)。每行引用一个带有布尔属性的产品,IsTaxable,并且几乎所有产品都应纳税 我不想将税前价格存储在数据库中,因为这只会使读取客户将要支付的实际价格变得困难,无论我在哪里显示这些价格,我都必须记住添加税。当增值税税率发生变化时,对于这一特定业务,所有价格自动变化是不可取的 因此,我认为逆向税收计算是一种可行的方法,而且可能并不罕见。发票总额是所有发票行总额的总和

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

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

我不想将税前价格存储在数据库中,因为这只会使读取客户将要支付的实际价格变得困难,无论我在哪里显示这些价格,我都必须记住添加税。当增值税税率发生变化时,对于这一特定业务,所有价格自动变化是不可取的

因此,我认为逆向税收计算是一种可行的方法,而且可能并不罕见。发票总额是所有发票行总额的总和,包括所有行折扣,并且应包含税费。因此,发票总额本身含税:

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

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

  • 在我的
    发票
    表中存储一个未更改的
    税款
    金额?或者
  • 是否为每个发票行存储税额,并在每次显示发票时计算发票税总额
  • 从DBA的角度来看,选项2似乎更安全,因为如果发票是手动更改的,则可以正确计算税款,但如果发票已经开具,则仍然存在不一致的问题。如果我坚持使用选项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;
    
    如果将其保存为视图,则应能够准确地重新打印动态计算的增值税值。如果有会计系统,您可以(也应该)导出与打印的数据完全相同的数据。
    通常,您应该将这些值保存为数据库中的字段值-但我知道如果您希望采用更动态的方法…

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

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