Скидка по счету: отрицательные позиции против внутренних свойств - PullRequest
1 голос
/ 23 апреля 2010

Должна ли скидка на позиции счета-фактуры и все счета-фактуры быть отрицательными позициями или отдельными свойствами счета-фактуры?

В аналогичном вопросе Если я включу список сборов / скидок в класс заказов или они будут отображаться в строках , то заказчик больше фокусируется на заказах , чем на счетах немного другой субъект хозяйствования). Предлагается, чтобы скидка составляла отдельно от позиций заказа, поскольку она не эквивалентна гонорару или продукту и может иметь другие требования к отчетности. Следовательно, скидка не должна быть просто отрицательной позицией.

Ранее я успешно использовал отрицательные позиции, чтобы четко указать и рассчитать скидку, но это кажется негибким и неточным с точки зрения бизнеса. Теперь я решил добавить скидку к каждой позиции вместе со скидкой на весь счет.

  • Это правильный способ сделать это?
  • Должен ли каждый предмет иметь свою собственную сумму и процент скидки?

Пример кода модели домена

Вот как выглядит моя модель домена, которая сопоставляется с репозиторием 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;
        }
    }
}

1 Ответ

1 голос
/ 23 апреля 2010

Отрицательные позиции

Как вы собираетесь обращаться с кредитами? Т.е. вы выставляете счет кому-то за три предмета, но два неисправны, поэтому вы отмените оплату за два неисправных предмета. Есть несколько способов сделать это. Одним из решений является кредит, который является вариантом счета-фактуры, за исключением того, что суммы возвращаются тому лицу, которому был выставлен счет. Если вы не разрешаете вводить отрицательные числа, вам нужно будет найти способ отдельно хранить кредиты или пометить счет как кредит. В этом более позднем сценарии они выставят еще один счет, помеченный как кредит. Другое решение, конечно, состоит в том, чтобы разрешить хранение отрицательных позиций. То, как обрабатываются кредиты, действительно определяет правильность использования отрицательных позиций.

Тарифы и скидки

Один из подходов состоит в том, чтобы разбить скидки и сборы на два типа:

  1. Скидки, которые распространяются на определенные позиции заказа
  2. Скидки, которые перечислены как элемент, но не относятся к конкретному элементу заказа.

Обратите внимание, что я не включаю скидку, которая применяется к заказу. Это намеренно. Каждая скидка или плата должна быть перечислена как элемент (но не обязательно относится к товару). Таким образом, каждая скидка и плата указана в источнике. Это препятствует тому, чтобы кто-то бросил на заказ скидку, по которой никто не может определить источник или авторизацию. То же самое можно сказать и о других сборах, кроме налога.

...