diff options
| author | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-27 16:39:09 +0100 |
|---|---|---|
| committer | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-27 16:39:28 +0100 |
| commit | f81ff82f2a07f87f6eb4f43de49ede64215519e5 (patch) | |
| tree | 67b4f9ef1c94184e2e1a9878c6feed8dc30ebcb3 /src/Costasdev.Busurbano.Backend/Services/FareService.cs | |
| parent | ef2df90ffb195edcddd701511dc5953c7baa63af (diff) | |
Refactor route planner to use new GraphQL backend
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Services/FareService.cs')
| -rw-r--r-- | src/Costasdev.Busurbano.Backend/Services/FareService.cs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Costasdev.Busurbano.Backend/Services/FareService.cs b/src/Costasdev.Busurbano.Backend/Services/FareService.cs new file mode 100644 index 0000000..0e4fefc --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/FareService.cs @@ -0,0 +1,49 @@ +using Costasdev.Busurbano.Backend.Configuration; +using Costasdev.Busurbano.Backend.Types.Planner; +using Microsoft.Extensions.Options; + +namespace Costasdev.Busurbano.Backend.Services; + +public record FareResult(double CashFareEuro, double CardFareEuro); + +public class FareService +{ + private readonly AppConfiguration _config; + + public FareService(IOptions<AppConfiguration> config) + { + _config = config.Value; + } + + public FareResult CalculateFare(IEnumerable<Leg> legs) + { + var busLegs = legs.Where(l => l.Mode != null && l.Mode.ToUpper() != "WALK").ToList(); + + // Cash fare logic + // TODO: In the future, this should depend on the operator/feed + var cashFare = busLegs.Count * 1.63; // Defaulting to Vitrasa for now + + // Card fare logic (45-min transfer window) + int cardTicketsRequired = 0; + DateTime? lastTicketPurchased = null; + int tripsPaidWithTicket = 0; + + foreach (var leg in busLegs) + { + if (lastTicketPurchased == null || + (leg.StartTime - lastTicketPurchased.Value).TotalMinutes > 45 || + tripsPaidWithTicket >= 3) + { + cardTicketsRequired++; + lastTicketPurchased = leg.StartTime; + tripsPaidWithTicket = 1; + } + else + { + tripsPaidWithTicket++; + } + } + + return new FareResult(cashFare, cardTicketsRequired * 0.67); + } +} |
