1

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

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

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

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%

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

4

2 回答 2

3

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

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

也就是说,如果您想存储 20% 或 40% 之类的折扣。相应地调整你的公式。

那么发票总额将为总和(最终价格)*(100 + 税)* 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

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

于 2013-06-13T06:19:30.323 回答
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 推动折扣政策,而营销人员善变。

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

于 2013-06-14T04:31:40.990 回答