public ProductCostsReport(ProductCostsReport costs)
 {
     Tax       = costs.Tax;
     Discounts = costs.Discounts;
     Expenses  = costs.Expenses;
     Total     = costs.Total;
 }
        public static ProductCostsReport CalculateTotal(this ProductCostsReport costs, IProduct product, IProductModifiersBuilder priceModifiers)
        {
            var finalPrice = (product.Price + costs.Tax + costs.Expenses - costs.Discounts)
                             .WithPrecision(priceModifiers.CalculationPrecision)
                             .WithFormat(priceModifiers.CurrencyFormat);

            return(costs.WithTotal(finalPrice));
        }
        public static ProductCostsReport CalculateExpenses(this ProductCostsReport costs, IProduct product, IProductModifiersBuilder priceModifiers)
        {
            var aditionalExpenses =
                priceModifiers
                .GetModifiersOfType <IExpense>()
                .SumExpenses(product)
                .WithPrecision(priceModifiers.CalculationPrecision);

            return(costs.WithExpenses(aditionalExpenses));
        }
        public static ProductCostsReport CalculateDiscounts(this ProductCostsReport costs, IProduct product, IProductModifiersBuilder priceModifiers)
        {
            decimal discountsSum =
                priceModifiers
                .GetDiscountsWithoutPrecedenceDiscount()
                .ApplyDiscountCalculationStrategy(priceModifiers.DiscountCalculationMode, product)
                .ApplyDiscountCap(priceModifiers.DiscountCap, product)
                .WithPrecision(priceModifiers.CalculationPrecision);

            return(costs.WithDiscounts(new Money(discountsSum)));
        }