发票设计 - 每件商品的价格,税金和折扣

时间:2013-06-12 22:16:19

标签: database-design data-structures business-logic

不是很重要的业务人员,我不确定如何为我的应用程序(处理来自客户的应收账款)的发票设计数据结构(内存和数据库模式)。

我的问题涉及发票行项目。已经给出了项目具有名称或文本描述,每单位价格和数量值(因此每单位价格乘以数量给出总线数)。但是我不知道我应该如何计算每行折扣和税收,特别是当两者都可以表示为百分比或固定金额时,然后我需要考虑操作的顺序(是固定价格)在税收增加百分比之前或之后完成折扣?)。

这是我正在考虑的数据库架构:

InvoiceItems
    InvoiceId        bigint
    ProductId        bigint NULL       -- Optional reference to the product this item is generated from
    Description      nvarchar(255)
    PricePerUnit     money
    Quantity         decimal(9,4)
    AdjustmentBT     money NULL        -- before-tax fixed-value price adjustment 
    AdjustmentBTPerc decimal(9,4) NULL -- before-tax percentage price adjustment
    Tax              decimal(9,4) NULL -- tax as a percentage
    AdjustmentPT     money NULL        -- after-tax fixed-value price adjustment 
    AdjustmentPTPerc decimal(9,4) NULL -- after-tax percentage price adjustment 

所以行总数是这个函数:

LineTotal = ( ( ( ( ( PricePerUnit * Quantity ) + AdjustmentBT ) * AdjustmentBTPerc ) * Tax ) + AdjustmentBT ) * AdjustmentPTPerc

或者在RPN中:

LineTotal = PricePerUnit Quantity * AdjustmentBT + AdjustmentBTPerc * Tax * AdjustmentBT + AdjustmentPTPerc *

由于我根本不是处理发票的人,而且我正在编写此程序的人反馈有限,我不知道我是否过度思考。我需要提供足够的灵活性,但不要复杂 - 而且这种方法意味着每个发票项目将如下所示:

Description | PricePerUnit | Quantity | Before-tax Adjustment | Tax | Post-tax Adjustment | %computedTotal%

...其中,调整字段将输入的值解释为百分比或固定值,具体取决于是否存在'%'字符。

2 个答案:

答案 0 :(得分:3)

我假设税收对所有项目都是固定的,并且在发票末尾添加。如果每一行都有自己的折扣,那么每一行的最终价格将是

finalprice = quantity * unit cost for item * (100 - discount) * 0.01

如果你想存储20%或40%的折扣,那就是这样。相应地调整您的配方。

如果您以15%或20%的形式存储税款,则发票总额将为总和(最终价格)*(100 +税)* 0.01。

税收调整 - 可能是四舍五入 - 将在税后适用。

让我们说最终价格的总和是120.20,你有15%的税。这意味着计算的税率为120.20 * 0.15 = 18.03,意味着最终价格为138.23。据推测,你想把它降低到138.00。由于税务人员总是希望他的全额减税,这意味着税收将是(138.00 * 0.15)/1.15 = 18.00。因此调整将为0.20。这可以表示如下

total            : 120.20
rounding discount: -00.20
total pretax     : 120.00
tax (15%)        :  18:00
invoice total    : 138:00

我希望这很清楚。在我成为程序员之前,我曾经是一名会计师。

{额外} 如果您确实有不同的税额,请忽略我在下面的评论中写的内容。按以下方式按税率对订单行进行分组会更有效率

total for 15% tax: 120.20
tax (15%)        :  18.00
total for 0% tax :  26.50
grand total      : 164.70
rounding discount:   0.30
invoice total    : 165.00

就发票表中的字段而言,唯一需要存储的数字是舍入折扣。可以通过迭代订单行表来计算所有其他字段。通过存储要支付的总税额可以允许少量非正规化,但是如果你开始存储总数,你将会遇到问题 - 在上面的例子中,只有两种税率,但是如果发生的话,会发生什么?你有三个?这将打破第一个正常形式(存储重复组)。

答案 1 :(得分:0)

如果您没有得到客户关于“工作方式”的支持,那么您已经遇到了麻烦。一个简单的事实是,您对此部分应用程序没有“接受”标准,而且恰好相当重要。

你真的需要从他们那里得到更好的要求。

很多时候折扣是附加的,而不是成倍增加。

具体做法是:

$100 with a 10% discount (on sale) and 20% discount (coupon)

Discount total Additive: $100 * (10% + 20%) = $100 * 30% = $30 discount

Discount total Multiplied: 
    $100 * 10% * 20% =
    $100 * (100 - 10%) * (100 - 20%) =
    $100 * .90 * .80 =
    90 * .80 =
    $72 = $28 discount

因此,显然,了解这些案例的规则非常重要。

例如,税收几乎总是被添加。如果您有5%的州税和2%的地方税,您将获得5美元+ 2美元的税。

最好将折扣信息放入单独的表格中,并使用代码。

一个简单的表格:

discount_key - primary key
discount_code - code for humans
description - what kind of discount
percent_discount - percent of discount - OR - 
fixed_discount - Fixed amount discount
gl_acct_id - GL account to post discount amounts to.

然后将每个订单项(和发票...)绑定到折扣类型。原因在于,在许多情况下,折扣优惠(优惠券折扣10%折扣与开盘折扣10%折扣不同)。出于帐户目的,这些折扣往往会被单独跟踪。

您的纳税信息可能与该项目相关联。如果您只有一个税收辖区,则可以使用一个百分比金额,否则您将指向类似折扣表的表格。如果有多个司法管辖区,那么您将指向一个税务小组,该税务小组将成为个人税率列表的主人。

你应该有一个适用于整个发票的折扣(所有东西都有20%的折扣)。

最后,您将拥有一个详细信息表格,其中包含产品,数量,折扣代码,折扣总额,税金总额,行总额。这适用于打印发票。对于过帐,如果您有多种税,则必须重新计算个别税。对于每个订单项,您最好使用单独的税行。否则,您可以直接处理细节行号。

无论如何,真正需要的是,您需要从客户那里了解有关要求的更好理解。折扣是一个复杂的臭名昭着的领域。在我工作过的一个地方,我们每年重新打造折扣系统4年。 (但不要忘记保留旧代码,我们使用旧系统的旧发票!)这是因为MARKETING推动折扣政策,营销人员变幻无常。

哦,欢迎来到会计。 “它有多难?”