Pet*_*ron 5 sql-server database-design invoice sales-tax
在南非,我们有增值税(VAT),与销售税几乎相同,目前固定为14%,但可能随时变化.
我需要在由多个发票行组成的发票(不可变)上加入增值税.每行引用一个Product布尔属性,IsTaxable几乎所有产品都是应税的.
我不想在数据库中存储税前价格,因为这使得很难读出客户要支付的实际价格以及我显示这些价格的所有地方,然后我必须记住增税.当增值税率确实发生变化时,对于这个特定的业务,所有价格都不可能自动变化.
所以我认为反向税收计算是可行的方式,可能并不罕见.发票总额是所有发票行总计的总和,其中包括任何行折扣,并且应包含税.因此,发票总额本身是含税的:
TaxTotal = InvoiceTotal / (1 + TaxRate),
Run Code Online (Sandbox Code Playgroud)
在哪里InvoiceTotal含税和TaxRate == 0.14
由于发票一旦发出就无法更改(它们是不可变的),我应该:
Tax在我的Invoices表中存储一个不变的金额?要么...从DBA的角度来看,选项2看起来更安全,因为如果手动更改发票,那么税将被正确计算,但如果已经发出发票,这仍然存在不一致的问题.如果我坚持使用选项1,那么我就不能为单个项目显示税收,但它会使管理税收总额并使汇总计算更容易,但如果更改则也会出现不一致.
我无法做到这两点,因为这会复制数据.
将税前值存储在数据库中,您还可以存储含税值并将其用于大多数用例。
我预见到的大问题是发票上增值税的舍入规则。这些规则(至少在英国)非常严格,您的反向计算无法做到这一点。
此外,您还需要逐项存储税款,因为如果退回某件商品,增值税龙将希望您准确退还所缴纳的税款。在开始之前,您确实需要了解当地的销售税规则。
我的经验是,如果你的计算误差只有一分钱,你可能会被拖垮,而且,如果你接受了审计,你需要能够展示你是如何得出增值税数字的,所以不要存储你的数据中使用的任何东西。计算会让你出局。