Пример #1
0
        static void ReportWithSelectiveDiscount()
        {
            Console.WriteLine("name:");
            var name = Console.ReadLine();

            Console.WriteLine("upc:");
            var upc = int.Parse(Console.ReadLine());

            Console.WriteLine("basePrice:");
            var basePrice = decimal.Parse(Console.ReadLine());

            Console.WriteLine("tax:");
            var tax = int.Parse(Console.ReadLine());

            int?universalDiscount = null;

            PrintYesNoQuestion("universalDiscount exists?",
                               () => {
                Console.WriteLine("discount:");
                universalDiscount = int.Parse(Console.ReadLine());
            },
                               () => {
                universalDiscount = null;
            });

            UpcDiscountDto upcDiscount = null;

            PrintYesNoQuestion("upcDiscount exists?",
                               () => {
                Console.WriteLine("discount:");
                var innerDiscount = int.Parse(Console.ReadLine());
                Console.WriteLine("upc:");
                var innerUpc = int.Parse(Console.ReadLine());
                upcDiscount  = new UpcDiscountDto(innerUpc, innerDiscount);
            },
                               () => {
                universalDiscount = null;
            });

            var calculatedProductDto   = new CalculateUseCase().Calculate(name, upc, basePrice, tax, universalDiscount, upcDiscount);
            var universalDiscountLabel = calculatedProductDto.UniversalDiscountAmount.HasValue
                                            ? $"; universal discount: ${calculatedProductDto.UniversalDiscountAmount.Value}"
                                            : "";
            var upcDiscountLabel = calculatedProductDto.UpcDiscountAmount.HasValue
                                            ? $"; upc discount: ${calculatedProductDto.UpcDiscountAmount.Value}"
                                            : "";
            var totalDiscountLabel = calculatedProductDto.TotalDiscountAmount.HasValue
                                            ? $"; total discount: ${calculatedProductDto.TotalDiscountAmount.Value}"
                                            : "";

            Console.WriteLine($"Tax amount = ${calculatedProductDto.TaxAmount}{universalDiscountLabel}{upcDiscountLabel}");
            Console.WriteLine($"New price: ${calculatedProductDto.CalculatedPrice}{totalDiscountLabel}");
        }
        public CalculatedProductDto Calculate(string name, int upc, decimal productPrice, int tax, int?universalDiscount, UpcDiscountDto upcDiscount)
        {
            var universalDiscountOption = universalDiscount.HasValue
                                                    ? FSharpOption <PriceCalculations.Discount> .Some(PriceCalculations.Discount.NewDiscount(universalDiscount.Value))
                                                    : FSharpOption <PriceCalculations.Discount> .None;

            var upcDiscountOption = upcDiscount != null
                                                    ? FSharpOption <PriceCalculations.UpcDiscount> .Some(new PriceCalculations.UpcDiscount(
                                                                                                             PriceCalculations.Discount.NewDiscount(upcDiscount.Discount),
                                                                                                             ProductUpc.NewProductUpc(upcDiscount.Upc)))
                                                    : FSharpOption <PriceCalculations.UpcDiscount> .None;

            Say.hello("from Say module");
            var pr = new Product(
                ProductName.NewProductName(name),
                ProductUpc.NewProductUpc(upc),
                ProductPriceModule.create(productPrice));
            var priceCalculationDto = PriceCalculations.calculatePrice(
                PriceCalculations.Tax.NewTax(tax),
                universalDiscountOption,
                upcDiscountOption,
                pr);

            return(new CalculatedProductDto(priceCalculationDto.upc.Item,
                                            name,
                                            ProductPriceModule.value(priceCalculationDto.basePrice),
                                            ProductPriceModule.value(priceCalculationDto.taxAmount),
                                            FSharpOption <ProductPrice> .get_IsSome(priceCalculationDto.universalDiscountAmount)
                                                ? ProductPriceModule.value(priceCalculationDto.universalDiscountAmount.Value) as decimal?
                                                : null,
                                            FSharpOption <ProductPrice> .get_IsSome(priceCalculationDto.upcDiscountAmount)
                                                ? ProductPriceModule.value(priceCalculationDto.upcDiscountAmount.Value) as decimal?
                                                : null,
                                            FSharpOption <ProductPrice> .get_IsSome(priceCalculationDto.totalDiscountAmount)
                                                ? ProductPriceModule.value(priceCalculationDto.totalDiscountAmount.Value) as decimal?
                                                : null,
                                            ProductPriceModule.value(priceCalculationDto.calculatedPrice)));
        }