Sollen Skonti auf Rechnungsposten und ganze Rechnungen negative Einzelposten o separate Immobilien einer Rechnung?
In einer ähnlichen Frage, Soll ich die Liste der Gebühren/Rabatte in eine Auftragsklasse einbinden oder sollen sie Positionszeilen sein? konzentriert sich der Fragesteller mehr auf Bestellungen als Rechnungen (was eine etwas andere Geschäftseinheit ist). Der Rabatt wird vorgeschlagen als getrennt aus Auftragspositionen, da sie nicht mit einer Gebühr oder einem Produkt gleichzusetzen sind und möglicherweise anderen Meldepflichten unterliegen. Daher sollte der Rabatt nicht einfach ein negativer Posten sein.
Bisher habe ich mit Erfolg negative Einzelposten verwendet, um Skonti deutlich anzugeben und zu berechnen, aber dies erscheint mir aus geschäftlicher Sicht unflexibel und ungenau. Jetzt entscheide ich mich dafür, den Rabatt zu jeder einzelnen Position hinzuzufügen, zusammen mit einem rechnungsweiten Rabatt.
- Ist das der richtige Weg?
- Sollte jeder Artikel einen eigenen Rabattbetrag und -prozentsatz haben?
Domänenmodell Codebeispiel
Mein Domänenmodell, das einem SQL-Repository zugeordnet ist, sieht folgendermaßen aus:
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;
}
}
}