如果发票可以作废,是否应该用作报价单?
我有一个从与 a或Invoices
关联的库存创建的表。我可以有一张表作为库存和发票之间的中途站,但感觉就像我会有重复的数据结构和逻辑只是为了处理“这是报价吗?” 少量。Job
Order
Quotes
从业务的角度来看,报价与发票不同:报价在承诺之前发送,发票在完成且付款到期后发送,但是如何在我的存储库和模型中表示这一点。
- 在数据库中存储和管理报价单和发票的优雅方式是什么?
编辑:表示Job
===Order
对于这个特定的实例。
我有一个从与 a或Invoices
关联的库存创建的表。我可以有一张表作为库存和发票之间的中途站,但感觉就像我会有重复的数据结构和逻辑只是为了处理“这是报价吗?” 少量。Job
Order
Quotes
从业务的角度来看,报价与发票不同:报价在承诺之前发送,发票在完成且付款到期后发送,但是如何在我的存储库和模型中表示这一点。
编辑:表示Job
===Order
对于这个特定的实例。
有3种方法:
将发票和报价存储在单独的表格中。
如果发票和报价单很少有重复的字段(否则,请使用选项 #3 和 3 个表),并且如果它们之间存在一对多或多对多的关系(对于 1-1,请使用选项#2),这是一个很好的设计)。
这也是一个不错的选择,如果当报价变成发票时两者之间的“共享”信息实际上会发生变化是很常见的(尽管其中一些变化应该使用单独的字段/表格来正确处理,例如应用折扣等。 .)。
当多个报价变成单张(或多张)发票时,显然需要对这个选项进行轻微的修改。这添加了第三个表,它是一组报价和一张发票(或一组发票,如果它变得如此复杂)之间的映射。
将它们存储在同一个表中,并带有额外的标志“发票或报价”以及两者中的任何额外字段。这可以通过不同行中的发票和报价单来完成,也可以通过它们共享行来完成(标志也具有“both”值)。
后者(同一行可以是发票和报价单)如果它们映射为 1 到 1是一个不错的选择,并且很少有字段可以区分两者。
前者(发票和报价的单独行)通常不是一个很好的设计,最好使用#3 或#1 选项。
有 3 个表,一个用于两者之间的公共字段,两个用于仅发票和仅报价。
如果发票和报价是 1-1 映射的,或者它们是 1-many 但许多发票中的每一个都具有完全相同的字段值,则这是一个不错的选择。否则,使用#1。
当多个报价变成一张发票时,可以对这个选项进行轻微的修改。这增加了第 4 个表,它是一组报价和一个发票(或一组发票,如果它变得那么复杂)之间的映射。同样,这里的假设是在所有链接/组合在一起的报价和发票之间有相当大的公共信息块,否则只需使用#1。
报价更类似于订单。我见过几个分销/零售系统,其订单表有一个名为 IsQuote 之类的布尔标志。这看起来很简单,因为它使将报价转化为订单变得微不足道。我从不喜欢它,因为来自报价的订单并不总是与报价完全相同。结果,像这样的系统会丢失一些有用的信息(即比较报价和订单的报告)。因此,我更喜欢报价表和订单表大致相同但分开的系统。在分销系统中,这通常会导致像 OrderHeader、OrderLine(与项目/库存表相关)、QuoteHeader 和 QuoteLine 这样的表。您可能还有一个表格来模拟一个报价可以映射到多个订单的关系。
发票通常来自订单。有时会在一张发票上对多个订单进行计费。例如,在某些情况下,我看到公司每月向他们的好客户开具账单。我还看到它以另一种方式工作,即在多张发票上开具多批货物的大订单(每批货物一张)。
最后,付款通常与发票有多对多的关系。有时,一笔付款涵盖多张发票。有时一张发票会分几次付款。
[为简单起见,忽略了单一产品和服务。]
销售报价是在时间窗口(日期范围)内以一定价格向另一方出售商品的建议。该资产不需要存在。您可以引用资产(商品)的规格。
报价应在某个时候到期,并且可能会或可能不会在到期前被接受。
销售订单是在某一日期以一定价格向另一方出售商品的承诺。它可以从接受的报价创建。
订单或报价可能有付款条款,例如“您可以在交货后 30 天向我们付款”。
订单可能针对尚不存在的商品(您出售商品,而不是资产)。也许你正在建造它。也许你会从别人那里买。
销售订单会导致实物资产的采购(从库存中获取、制造或购买),然后是实物资产的装运,这可能会也可能不会以交货结束。有时,客户“会要求”供应商取货。
Generally speaking, an asset has to be transferred before you can count the order line as revenue (this depends on your shipping terms, could be at shipment or delivery or in-between).
A sales order can be cancelled (for example, some industries have cooling-off periods).
A sales invoice is a request for payment for ordered products. It may happen prior to delivery, at delivery, or after delivery, or not really happen at all (such as if in line at McDonald's). An order may have one or more invoices, and an invoice may be for several orders.
An invoice hopefully leads to one or more payments, which are applied to an account. A payment often leads to one or more receipts of payment. A payment is not necessarily the same as revenue, if using accrual accounting.
我建议尽可能灵活。使用下表
作业表、发票表、报价表
在您的 Invoice Table 和 Quote Table 中,存储 Job Id,给它一个索引并创建一个外键约束。将聚集索引保留在报价 ID 和发票 ID 上。
在最后一个系统上,我处理报价和发票之间的唯一区别(就数据库而言)是表格上的一个标志,指示报价是否已被客户接受(此时生成了另一个相同的语句信息,但它是发票而不是报价)