Frage

Should Rabatt auf Rechnungspositionen und ganze Rechnungen sein negative Positionen oder getrennte Eigenschaften eine Rechnung?

In einer ähnlichen Frage, Should I incorporate Liste der Gebühren / Abschläge in eine Ordnung Klasse oder sie seine itemlines , konzentriert sich die Fragesteller mehr auf Aufträge als Rechnungen (die einen leicht ist unterschiedliche Geschäftseinheit). Rabatt wird vorgeschlagen, sein getrennt von Auftragspositionen, da es nicht gleichbedeutend mit einer Gebühr oder ein Produkt ist und verschiedene Berichtspflichten hat. Daher Rabatt nicht einfach sollte eine negative Position sein.

Bisher habe ich erfolgreich eingesetzt negative Positionen zu zeigen deutlich, und berechnen Rabatt, aber das fühlt sich unflexibel und ungenau aus betriebswirtschaftlicher Sicht. Jetzt bin ich entscheiden Rabatt auf jede Position an, zusammen mit einer Rechnung weiter Rabatt.

  • Ist dies der richtige Weg, es zu tun?
  • Should jedes Element seinen eigenen Rabattbetrag und den Prozentsatz haben?

Domain Model Code-Beispiel

Dies ist, was mein Domain-Modell, das auf einen SQL-Repository abbildet, sieht aus wie:

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;
        }
    }
}
War es hilfreich?

Lösung

Negative Positionen

Wie werden Sie Kredite behandeln? Das heißt, Sie Rechnung jemand für drei Punkte, aber zwei sind fehlerhaft, so dass Sie die Ladung auf den beiden fehlerhaften Einzelteile umkehren. Es gibt ein paar Möglichkeiten, dies geschieht. Eine Lösung ist ein Kredit, ist eine Variante einer Rechnung der Ausnahme, dass die Beträge gutgeschrieben zurück auf die Person, an die die Rechnung ausgestellt wurde. Wenn Sie keine negativen Zahlen erlauben, dann müssen Sie separat ein Mittel zum Speichern von Gutschriften finden oder die Rechnung markieren als eine Kredit zu sein. In diesem letzteren Fall würden sie eine andere Rechnung ausstellen, gekennzeichnet als ein Kredit sein. Eine andere Lösung, natürlich, ist für die Speicherung von negativen Positionen zu ermöglichen. Wie Kredite behandelt werden, ist wirklich das, was wird bestimmen, ob die Verwendung von negativen Positionen ist der richtige Ansatz.

Gebühren und Rabatte

Ein Ansatz ist, Rabatte und Gebühren in zwei Typen zu brechen:

  1. Rabatte, die auf bestimmte Auftragspositionen
  2. anwenden
  3. Aktionen, die als ein Element aufgezählt werden, aber beziehen sich nicht auf einen bestimmten Auftragsposition.

Beachten Sie, dass ich nicht enthalten einen Rabatt, die die Reihenfolge gilt. Das ist beabsichtigt. Jeder Rabatt oder Gebühr würde als ein Element aufgezählt werden (aber nicht unbedingt auf ein Produkt anzuwenden). Auf diese Weise kann jeder Rabatt und Gebühr ist in der Quelle explizit. Das verhindert, dass jemand aus Werfen auf eine Bestellung einen Rabatt für die niemand die Quelle oder Genehmigung bestimmen kann. Das gleiche würde für Gebühren ausgenommen Steuer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top