不是很重要的业务人员,我不确定如何为我的应用程序(处理来自客户的应收账款)的发票设计数据结构(内存和数据库模式)。
我的问题涉及发票行项目。已经给出了项目具有名称或文本描述,每单位价格和数量值(因此每单位价格乘以数量给出总线数)。但是我不知道我应该如何计算每行折扣和税收,特别是当两者都可以表示为百分比或固定金额时,然后我需要考虑操作的顺序(是固定价格)在税收增加百分比之前或之后完成折扣?)。
这是我正在考虑的数据库架构:
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%
...其中,调整字段将输入的值解释为百分比或固定值,具体取决于是否存在'%'字符。
答案 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推动折扣政策,营销人员变幻无常。
哦,欢迎来到会计。 “它有多难?”