feat: unir dashboard y mapa general en una misma pantalla

This commit is contained in:
2026-10-05 14:13:01 -04:00
parent afbcc792ae
commit 69f26cb124
35 changed files with 1059 additions and 535 deletions
@@ -0,0 +1,43 @@
export interface FuelConfig {
rendimientoKmL: number | null;
precioPorLitro: number | null;
}
export function currencyForCountry(country: string | null | undefined): string {
const normalized = (country ?? '')
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/[^a-z0-9]/gi, '')
.toLowerCase();
if (!normalized) return '$';
if (['mexico', 'mx', 'cdmx', 'ciudaddemexico', 'mexicocity', 'estadosunidosmexicanos'].includes(normalized)) return 'MX$';
if (['republicadominicana', 'dominicana', 'rd', 'do', 'santodomingo'].includes(normalized)) return 'RD$';
return '$';
}
export function isFuelConfigured(config: FuelConfig): boolean {
return (
config.rendimientoKmL != null &&
config.precioPorLitro != null &&
Number.isFinite(config.rendimientoKmL) &&
Number.isFinite(config.precioPorLitro) &&
config.rendimientoKmL > 0 &&
config.precioPorLitro >= 0
);
}
export function fuelLiters(distanceKm: number, rendimientoKmL: number): number {
if (!Number.isFinite(distanceKm) || distanceKm <= 0) return 0;
if (!Number.isFinite(rendimientoKmL) || rendimientoKmL <= 0) return 0;
return distanceKm / rendimientoKmL;
}
export function fuelCost(distanceKm: number, config: FuelConfig): { liters: number; cost: number } {
if (!isFuelConfigured(config)) return { liters: 0, cost: 0 };
const liters = fuelLiters(distanceKm, config.rendimientoKmL as number);
return { liters, cost: liters * (config.precioPorLitro as number) };
}
export function formatFuelCost(cost: number, currency: string): string {
return `${currency} ${cost.toFixed(2)}`;
}