From 1fd17d4d07d25a810816e4e38ddc31ae72b8c91a Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Sun, 28 Dec 2025 00:17:11 +0100 Subject: Basic fare calculations for Galicia (Xunta) --- .../Services/Providers/RenfeTransitProvider.cs | 1 + .../Services/Providers/VitrasaTransitProvider.cs | 1 + .../Services/Providers/XuntaFareProvider.cs | 57 ++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 src/Costasdev.Busurbano.Backend/Services/Providers/XuntaFareProvider.cs (limited to 'src/Costasdev.Busurbano.Backend/Services/Providers') diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs index f114ec3..1793ada 100644 --- a/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs @@ -6,6 +6,7 @@ using SysFile = System.IO.File; namespace Costasdev.Busurbano.Backend.Services.Providers; +[Obsolete] public class RenfeTransitProvider : ITransitProvider { private readonly AppConfiguration _configuration; diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs index e54b66e..a736652 100644 --- a/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs @@ -10,6 +10,7 @@ using SysFile = System.IO.File; namespace Costasdev.Busurbano.Backend.Services.Providers; +[Obsolete] public class VitrasaTransitProvider : ITransitProvider { private readonly VigoTransitApiClient _api; diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/XuntaFareProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/XuntaFareProvider.cs new file mode 100644 index 0000000..7536c69 --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/XuntaFareProvider.cs @@ -0,0 +1,57 @@ +using System.Collections.Frozen; +using System.Globalization; +using CsvHelper; +using CsvHelper.Configuration.Attributes; + +namespace Costasdev.Busurbano.Backend.Services.Providers; + +public class PriceRecord +{ + [Name("conc_inicio")] public string Origin { get; set; } + [Name("conc_fin")] public string Destination { get; set; } + [Name("bonificacion")] public string? MetroArea { get; set; } + [Name("efectivo")] public decimal PriceCash { get; set; } + [Name("tpg")] public decimal PriceCard { get; set; } +} + +public class XuntaFareProvider +{ + private readonly FrozenDictionary<(string, string), PriceRecord> _priceMatrix; + + public XuntaFareProvider(IWebHostEnvironment env) + { + var filePath = Path.Combine(env.ContentRootPath, "Data", "xunta_fares.csv"); + + using var reader = new StreamReader(filePath); + using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + + // We do GroupBy first to prevent duplicates from throwing an exception + _priceMatrix = csv.GetRecords() + .GroupBy(record => (record.Origin, record.Destination)) + .ToFrozenDictionary( + group => group.Key, + group => group.First() + ); + } + + public PriceRecord? GetPrice(string origin, string destination) + { + var originMunicipality = origin[..5]; + var destinationMunicipality = destination[..5]; + + var valueOrDefault = _priceMatrix.GetValueOrDefault((originMunicipality, destinationMunicipality)); + + /* This happens in cases where traffic is forbidden (like inside municipalities with urban transit */ + if (valueOrDefault?.PriceCash == 0.0M) + { + valueOrDefault.PriceCash = 100; + } + + if (valueOrDefault?.PriceCard == 0.0M) + { + valueOrDefault.PriceCard = 100; + } + + return valueOrDefault; + } +} -- cgit v1.3