【问题标题】:Invoice Discount: Negative line items vs Internal properties发票折扣:否定行项目与内部属性
【发布时间】:2011-02-11 13:56:27
【问题描述】:

发票项目和整个发票的折扣应该是发票的负行项目还是单独的属性

在类似的问题Should I incorporate list of fees/discounts into an order class or have them be itemlines 中,提问者更关注订单,而不是发票(这是一个略有不同的业务实体)。折扣建议与订单商品分开,因为它不等同于费用或产品,并且可能有不同的报告要求。因此,折扣不应该只是一个负面的订单项。

之前我已经成功地使用负订单项来清楚地指示和计算折扣,但从业务角度来看,这感觉不灵活且不准确。现在,我选择为每个订单项添加折扣以及发票范围的折扣。

  • 这是正确的做法吗?
  • 每件商品是否应该有自己的折扣金额和百分比?

域模型代码示例

这是映射到 SQL 存储库的域模型的样子:

public class Invoice
{
    public int ID { get; set; }
    public Guid JobID { get; set; }
    public string InvoiceNumber { get; set; }
    public Guid UserId { get; set; } // user who created it
    public DateTime Date { get; set; }

    public LazyList<InvoiceLine> InvoiceLines { get; set; }
    public LazyList<Payment> Payments { get; set; } // for payments received

    public boolean IsVoided { get; set; }   // Invoices are immutable.
                                            // To change: void -> new invoice.

    public decimal Total
    {
        get {
            return InvoiceLines.Sum(i => i.LineTotal);
        }
    }
}

public class InvoiceLine
{
    public int ID { get; set; }
    public int InvoiceID { get; set; }
    public string Title { get; set; }
    public decimal Quantity { get; set; }
    public decimal LineItemPrice { get; set; }

    public decimal DiscountPercent { get; set; } // line discount %?
    public decimal DiscountAmount { get; set; } // line discount amount?

    public decimal LineTotal {
        get {
            return (1.0M - DiscountPercent)
                    * (this.Quantity * (this.LineItemPrice))
                    - DiscountAmount;
        }
    }
}

【问题讨论】:

  • IsVoided 位添加到Invoice 类。
  • 编辑: 删除了每张发票的折扣,改为选择每行项目的折扣。更简单、等效且更易于跟踪。谢谢,托马斯。

标签: database-design business-logic invoice


【解决方案1】:

否定订单项

您将如何处理学分?即,您向某人开具了三件商品的发票,但其中两件有缺陷,因此您将撤销两件有缺陷的商品的费用。有几种方法可以做到这一点。一种解决方案是贷记,它是发票的一种变体,只是将金额贷记给发票的签发人。如果您不允许负数,那么您将需要找到一种方法来单独存储信用或将发票标记为信用。在后一种情况下,他们将开具另一张发票,标记为信用。当然,另一种解决方案是允许存储负订单项。如何处理赠金实际上将决定使用否定订单项是否是正确的方法。

费用和折扣

一种方法是将折扣和费用分为两种类型:

  1. 适用于特定订单商品的折扣
  2. 列举为商品但不适用于特定订单商品的折扣。

请注意,我不包含适用于订单的折扣。那是故意的。每个折扣或费用都必须作为一个项目列举(但不一定适用于产品)。这样,每个折扣和费用在其来源中都是明确的。这可以防止某人在订单上提供任何人都无法确定其来源或授权的折扣。税以外的费用也是如此。

【讨论】:

  • 我看到了两种处理客户退款的方法:1.) 发票应该是不可变的,因此我将取消发票并创建一个包含任何相关 +/- 付款的新发票考虑双向交易。 2.) 只需在Payments 表中创建一个负付款,该表跟踪给定发票的进出资金并将 cmets 添加到发票中。 (由于这个原因,您会注意到每张发票我没有IsPaid 位,因为可以从Payments 推断出转移的资金。)发票是发给客户的账单,因此它不应代表交易.
  • +1 我同意不提供发票范围的折扣,这相当于对每个行项目应用折扣并将总和总和。很好的简化。
  • @Thomas:我想听听您的 cmets 对您的回答的第一条评论。
  • @FreshCode - 正在努力。工作和上瘾并不总是很好:)
  • @FreshCode - 发票必须是不可变的,因为您需要记录所发出的内容(而且纸张有些不可变) 在我提供的示例中,您不能取消发票因为这三个项目中只有两个有问题。因此,您需要开具补偿发票或信用证。我已经看到 acctg 系统将积分作为一种付款方式和/或(在某些情况下两者兼而有之)一种发票形式。如果您采用付款路线,则意味着您需要可以为负数或标记为指示付款与收款的付款行项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2018-12-27
  • 2011-10-25
相关资源
最近更新 更多