Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions rambo-refactors/session-02/CalculatePrice/CalculatePrice.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Solution>
<Project Path="CalculatePrice/CalculatePrice.csproj" />
</Solution>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
108 changes: 108 additions & 0 deletions rambo-refactors/session-02/CalculatePrice/CalculatePrice/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Enter Base Price: must be more than 0");
decimal basePrice = decimal.Parse(Console.ReadLine()!);

Console.WriteLine("Enter Discount:");
decimal discount = decimal.Parse(Console.ReadLine()!);

Console.WriteLine("Enter Tax Ratio (example: 0.20):");
decimal taxRatio = decimal.Parse(Console.ReadLine()!);

Console.WriteLine("Is customer returning? (true/false):");
bool customerReturn = bool.Parse(Console.ReadLine()!);

// Precondition
if (basePrice < 0)
throw new ArgumentException("BasePrice must be non-negative");

var order = new Order(basePrice, discount);

var discountService = new DiscountService(order);

decimal priceAfterDiscount = discountService.CalculateDiscount(customerReturn);

var taxService = new TaxService();

var taxRequest = new CalculateTaxRequest(priceAfterDiscount, taxRatio);

decimal tax = taxService.CalculateTax(taxRequest);

decimal total = priceAfterDiscount + tax;

if (total < 0)
throw new Exception("Total cannot be less than zero");

Console.WriteLine("=================================");
Console.WriteLine($"Base Price: {basePrice}");
Console.WriteLine($"Discount: {discount}");
Console.WriteLine($"Price After Discount: {priceAfterDiscount}");
Console.WriteLine($"Tax: {tax}");
Console.WriteLine($"Final Total: {total}");
}
}

/* ======================= DOMAIN ======================= */

public record CalculateTaxRequest(decimal BasePrice, decimal TaxRatio);

public class TaxService
{
//invariant condition
private const decimal MaxTax = 25M;
private const decimal MinimumPrice = 50M;

public decimal CalculateTax(CalculateTaxRequest request)
{
if (request.BasePrice < MinimumPrice)
return 0;

decimal taxableAmount = request.BasePrice ;
decimal tax = taxableAmount * request.TaxRatio;

if (tax > MaxTax)
tax = MaxTax;

return tax;
}
}

public class DiscountService
{
//invariant condition
private const decimal LoyaltyDiscountRate = 0.05M;
private readonly Order _order;

public DiscountService(Order order)
{
_order = order;
}

public decimal CalculateDiscount(bool customerReturn)
{

if (customerReturn)
return _order.BasePrice - LoyaltyDiscount();

return _order.BasePrice - _order.Discount;
}

private decimal LoyaltyDiscount()
{
return _order.BasePrice * LoyaltyDiscountRate;
}
}

public class Order
{
public decimal BasePrice { get; }
public decimal Discount { get; }

public Order(decimal basePrice, decimal discount)
{
BasePrice = basePrice;
Discount = discount;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"CalculatePrice/1.0.0": {
"runtime": {
"CalculatePrice.dll": {}
}
}
}
},
"libraries": {
"CalculatePrice/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
Loading