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))); }