Skip to content

Commit

Permalink
Refactored Invoice class
Browse files Browse the repository at this point in the history
  • Loading branch information
SissyManson committed Jun 16, 2024
1 parent 948a779 commit 18bb5f7
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 90 deletions.
95 changes: 45 additions & 50 deletions Invoice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,74 +14,69 @@ public Invoice(Vehicle vehicle)
Vehicle = vehicle;
}

decimal GetTotalPrice()
// checks if the vehicle is returned earlier to show additional messages
public bool IsEarlyReturn()
{
return Math.Round(Vehicle.GetTotalRentalCosts() + Vehicle.GetElapsedDaysInsurance(), 2);
return Vehicle.ReturnDate < Vehicle.EndDate;
}

public decimal GetTotalPrice()
{
return Math.Round(GetTotalRentalCosts() + GetElapsedDaysInsurance(), 2);
}
decimal GetDailyInsuranceDiscount()

public decimal GetDailyInsuranceDiscount()
{
return Math.Round(Vehicle.DailyInsuranceCost() - Vehicle.AdjustDailyInsuranceCost(), 2);
}
decimal GetEarlyReturnInsuranceDiscount()

public decimal GetEarlyReturnInsuranceDiscount()
{
return Math.Round(Vehicle.RemainingDays() * Vehicle.AdjustDailyInsuranceCost(), 2);
return Math.Round(RemainingDays() * Vehicle.AdjustDailyInsuranceCost(), 2);
}

bool IsEarlyReturn()

public decimal RemainingDays()
{
return Vehicle.ReturnDate < Vehicle.EndDate;
return (Vehicle.EndDate - Vehicle.ReturnDate).Days;
}
string ShowVehicleInfo()
{
if (Vehicle is Car car)
{
return $"\nA car that is valued at ${car.Value:N2}, and has a security rating of {car.SafetyRating}:\n";
}
if (Vehicle is Motorcycle moto)
{
return $"\nA motorcycle that is valued at ${moto.Value:N2}, and the driver is {moto.RiderAge} years old\n";

}
if (Vehicle is CargoVan van)
{
return $"\nA motorcycle that is valued at ${van.Value:N2}, and the driver has {van.DriverExperience} years of driving experience\n";
public decimal EarlyReturnDiscountForRent()
{
return (RemainingDays() * Vehicle.GetDailyRentalCost()) / 2;
}

}
return "";
decimal GetTotalRentCost()
{
return Vehicle.GetDailyRentalCost() * Vehicle.ReservationPeriod();
}

public void DisplayInvoice()
public decimal GetElapsedDaysInsurance()
{
Console.WriteLine(ShowVehicleInfo());
// insurance is full price for elapsed days and NOT paid for the remaining days
return Vehicle.AdjustDailyInsuranceCost() * Vehicle.ActualRentalPeriod();
}

Console.WriteLine("XXXXXXXXXX");
Console.WriteLine($"Date: {Vehicle.ReturnDate:yyyy-MM-dd}");
Console.WriteLine($"Customer Name: {Vehicle.CustomerName}");
Console.WriteLine($"Rented Vehicle: {Vehicle.Brand} {Vehicle.Model}");
Console.WriteLine();
Console.WriteLine($"Reservation start date: {Vehicle.StartDate:yyyy-MM-dd}");
Console.WriteLine($"Reservation start date: {Vehicle.EndDate:yyyy-MM-dd}");
Console.WriteLine($"Reserved rental days: {Vehicle.ReservationPeriod()} days");
Console.WriteLine();
Console.WriteLine($"Actual return date: {Vehicle.ReturnDate:yyyy-MM-dd}");
Console.WriteLine($"Actual rental days: {Vehicle.ActualRentalPeriod()} days");
Console.WriteLine();
Console.WriteLine($"Rental cost per day: ${Math.Round(Vehicle.GetDailyRentalCost(), 2)}");
Console.WriteLine($"Initial insurance per day: ${Math.Round(Vehicle.DailyInsuranceCost(), 2)}");
Console.WriteLine($"Insurance discount per day: ${GetDailyInsuranceDiscount()}");
Console.WriteLine($"Insurance per day: ${Math.Round(Vehicle.AdjustDailyInsuranceCost(), 2)}");
Console.WriteLine();
if (IsEarlyReturn())
public decimal GetTotalRentalCosts()
{
// full cost for the elapsed days and half for the rest, if returned ahead of time
if (Vehicle.ActualRentalPeriod() < Vehicle.ReservationPeriod())
{
Console.WriteLine($"Early return discount for rent: ${Math.Round(Vehicle.EarlyReturnDiscountForRent(), 2)}");
Console.WriteLine($"Early return discount for insurance: ${GetEarlyReturnInsuranceDiscount()}");
Console.WriteLine();
}
Console.WriteLine($"Total rent: ${Math.Round(Vehicle.GetTotalRentalCosts(), 2)}");
Console.WriteLine($"Total insurance: ${Math.Round(Vehicle.GetElapsedDaysInsurance(), 2)}");
Console.WriteLine($"Total: ${GetTotalPrice()}");
Console.WriteLine("XXXXXXXXXX");
// find how many days are left until the end date and apply discount
EarlyReturnDiscountForRent();
return GetTotalRentCost() - EarlyReturnDiscountForRent();

}

// calc full cost for the elapsed days
return GetTotalRentCost();
}


public void PrintInvoice()
{
InvoicePrinter printer = new ();
InvoicePrinter.DisplayInvoice(this);
}
}
}
65 changes: 65 additions & 0 deletions InvoicePrinter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Vehicle_Rental_System
{
internal class InvoicePrinter
{
private static string ShowVehicleInfo(Invoice invoice)
{
if (invoice.Vehicle is Car car)
{
return $"\nA car that is valued at ${car.Value:N2}, and has a security rating of {car.SafetyRating}:\n";
}
if (invoice.Vehicle is Motorcycle moto)
{
return $"\nA motorcycle that is valued at ${moto.Value:N2}, and the driver is {moto.RiderAge} years old\n";

}
if (invoice.Vehicle is CargoVan van)
{
return $"\nA cargo van that is valued at ${van.Value:N2}, and the driver has {van.DriverExperience} years of driving experience\n";

}
return "";
}

public static void DisplayInvoice(Invoice invoice)
{
Console.WriteLine(ShowVehicleInfo(invoice));

Console.WriteLine("XXXXXXXXXX");
Console.WriteLine($"Date: {invoice.Vehicle.ReturnDate:yyyy-MM-dd}");
Console.WriteLine($"Customer Name: {invoice.Vehicle.CustomerName}");
Console.WriteLine($"Rented Vehicle: {invoice.Vehicle.Brand} {invoice.Vehicle.Model}");
Console.WriteLine();
Console.WriteLine($"Reservation start date: {invoice.Vehicle.StartDate:yyyy-MM-dd}");
Console.WriteLine($"Reservation start date: {invoice.Vehicle.EndDate:yyyy-MM-dd}");
Console.WriteLine($"Reserved rental days: {invoice.Vehicle.ReservationPeriod()} days");
Console.WriteLine();
Console.WriteLine($"Actual return date: {invoice.Vehicle.ReturnDate:yyyy-MM-dd}");
Console.WriteLine($"Actual rental days: {invoice.Vehicle.ActualRentalPeriod()} days");
Console.WriteLine();
Console.WriteLine($"Rental cost per day: ${Math.Round(invoice.Vehicle.GetDailyRentalCost(), 2)}");
Console.WriteLine($"Initial insurance per day: ${Math.Round(invoice.Vehicle.DailyInsuranceCost(), 2)}");
Console.WriteLine($"Insurance discount per day: ${invoice.GetDailyInsuranceDiscount()}");
Console.WriteLine($"Insurance per day: ${Math.Round(invoice.Vehicle.AdjustDailyInsuranceCost(), 2)}");
Console.WriteLine();
if (invoice.IsEarlyReturn())
{
Console.WriteLine($"Early return discount for rent: ${Math.Round(invoice.EarlyReturnDiscountForRent(), 2)}");
Console.WriteLine($"Early return discount for insurance: ${invoice.GetEarlyReturnInsuranceDiscount()}");
Console.WriteLine();
}
Console.WriteLine($"Total rent: ${Math.Round(invoice.GetTotalRentalCosts(), 2)}");
Console.WriteLine($"Total insurance: ${Math.Round(invoice.GetElapsedDaysInsurance(), 2)}");
Console.WriteLine($"Total: ${invoice.GetTotalPrice()}");
Console.WriteLine("XXXXXXXXXX");

}

}
}
7 changes: 4 additions & 3 deletions Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ static void Main(string[] args)
Invoice MotorcycleInvoice = new (motorcycle);
Invoice CargoVanInvoice = new (cargoVan);

CarInvoice.DisplayInvoice();
MotorcycleInvoice.DisplayInvoice();
CargoVanInvoice.DisplayInvoice();
CarInvoice.PrintInvoice();
MotorcycleInvoice.PrintInvoice();
CargoVanInvoice.PrintInvoice();


Console.ReadLine();
}
Expand Down
40 changes: 3 additions & 37 deletions Vehicle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ namespace Vehicle_Rental_System
{
internal class Vehicle
{

public string CustomerName { get; set; }
public string Brand { get; set; }
public string Model { get; set; }
Expand All @@ -24,6 +25,7 @@ public Vehicle(string CustomerName, string Brand, string Model, decimal Value, D
this.ReturnDate = ReturnDate;
}


public int ReservationPeriod()
{
return (EndDate - StartDate).Days;
Expand All @@ -40,48 +42,12 @@ public int ActualRentalPeriod()
return ReservationPeriod();
}

public decimal RemainingDays()
{
return (EndDate - ReturnDate).Days;
}

public decimal EarlyReturnDiscountForRent()
{
return (RemainingDays() * GetDailyRentalCost()) / 2;
}

decimal GetTotalRentCost()
{
return GetDailyRentalCost() * ReservationPeriod();
}

public decimal GetElapsedDaysInsurance()
{
// insurance is full price for elapsed days and NOT paid for the remaining days
return AdjustDailyInsuranceCost() * ActualRentalPeriod();
}

public decimal GetTotalRentalCosts()
{
// full cost for the elapsed days and half for the rest, if returned ahead of time
if (ActualRentalPeriod() < ReservationPeriod())
{
// find how many days are left until the end date and apply discount
EarlyReturnDiscountForRent();
return GetTotalRentCost() - EarlyReturnDiscountForRent();

}

// calc full cost for the elapsed days
return GetTotalRentCost();
}

// virtual methods so it's possible to override them in the derived classes
#region Virtuals

public virtual decimal GetDailyRentalCost()
{
return Value / ActualRentalPeriod();
return 0m;
}

public virtual decimal DailyInsuranceCost()
Expand Down

0 comments on commit 18bb5f7

Please sign in to comment.