【问题标题】:Invoice design - per item price, tax, and discount发票设计 - 每件商品的价格、税金和折扣
【发布时间】:2013-06-09 04:54:46
【问题描述】:

作为一个商务人士,我不确定应该如何在我的应用程序(处理来自客户的应收账款)中设计发票的数据结构(内存和数据库架构)。

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

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

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%

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

【问题讨论】:

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


【解决方案1】:

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

您确实需要从他们那里得到更好的要求,以了解如何计算。

很多时候折扣是相加的,而不是相乘的。

具体来说:

$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 推动折扣政策,而营销人员善变。

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

【讨论】:

  • 谢谢,我没想到会以这种方式表示折扣。我没有从我的客户那里得到详细信息的原因是因为他现在实际上正在度假,我说我会在他回来时准备好原型,毫无疑问他会告诉我。
【解决方案2】:

我假设所有项目的税收都是不变的,并在发票末尾添加。如果每条线都可以有自己的折扣,那么每条线的最终价格将是

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

如果您想存储 20% 或 40% 之类的折扣。相应地调整您的公式。

那么发票总额将为 sum (finalprice) * (100 + tax) * 0.01,同样如果您以 15% 或 20% 的形式存储税款。

税收调整 - 大概是四舍五入 - 将在税后应用。

假设最终价格的总和为 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

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

【讨论】:

  • 我不确定税收是否统一,这就是为什么我添加了每件商品的税收,因为某些商品可能需要缴纳 20% 的增值税率,而其他商品则为 0% 或 10%速度。尽管如此,我可能会让事情变得过于复杂,为用户提供一个简单的单行价格可能会更好。
  • 如果您对每件商品单独征税,则将其视为对待每一行的折扣。正如我所写,税务人员想要他的全部削减,所以你仍然需要每行的总和(包括税),然后进行四舍五入。在会计方面,税收将是任何计算的,但四舍五入的折扣会减少收入。
猜你喜欢
  • 2020-09-16
  • 2019-07-09
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多