3

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

在一个类似的问题中,我应该将费用/折扣列表合并到订单类中还是让它们成为 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;
        }
    }
}
4

1 回答 1

1

排除订单项

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

费用和折扣

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

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

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

于 2010-04-23T15:29:52.430 回答