import React, { useState } from "react"; import { DateTime } from "luxon"; function parseDate(input) { const [day, month, year] = input.split("/").map(Number); return DateTime.fromObject({ day, month, year }); } function isLeapYear(year) { return DateTime.fromObject({ year }).isInLeapYear; } function dayOfYear(date) { return date.ordinal; } function daysRemaining(date) { const total = isLeapYear(date.year) ? 366 : 365; return total - date.ordinal; } function frecuenciaSolar(date) { const base = DateTime.fromObject({ year: 1, month: 1, day: 1 }); return Math.floor(date.diff(base, "days").days) + 3; } function getAparato(date) { const year = date.year; const aparato = Math.floor((year - 1) / 4) + 1; const index = (year - 1) % 4; const tipo = ["ASUME", "ASIMILA", "DESAFIA", "DECIDE"][index] || "ASUME"; const colorMap = { ASUME: "text-blue-500", ASIMILA: "text-orange-500", DESAFIA: "text-red-500", DECIDE: "text-green-500" }; const color = colorMap[tipo] || "text-black"; return { aparato, tipo, color }; } const baseEstaciones = [ { id: "E1", param: 353, dias: 707, tema: "Conciencia de Separación" }, { id: "E2", param: 357, dias: 1064, tema: "Límite Interno – Pregunta Previa" }, { id: "E3", param: 358, dias: 1422, tema: "Comunicación Interna" }, { id: "E4", param: 359, dias: 1781, tema: "Conciencia del Error – Gestión espacio-tiempo" }, { id: "E5", param: 360, dias: 2141, tema: "Sentido Biológico – Interface entre Mi y Tú" }, { id: "E6", param: 361, dias: 2502, tema: "Comunicación Externa" }, { id: "E7", param: 362, dias: 2864, tema: "Límite Externo – Proyección Diseño" }, { id: "E8", param: 363, dias: 3227, tema: "Vista de Posibilidades – Potencial Diseño" }, { id: "E9", param: 353, dias: 3580, tema: "Finalidad – Membrana / Redefinición" } ]; const CeldaEstacion = ({ estacion }) => { if (!estacion.fp) { return (
{estacion.id}
); } return (
{`${estacion.id} (${estacion.param}-${estacion.dias})`}

{estacion.fs ? `FS: ${estacion.fs}` : "FRECUENCIA SOLAR"}

{estacion.fa ? `FA: ${estacion.fa}` : "F. ANULACIÓN"}

{estacion.fn ? `FN: -${estacion.fn}` : "F. NEGATIVA"}

{estacion.fp ? `FP: ${estacion.fp}` : "F. POSITIVA"}

{estacion.fecha ? estacion.fecha : "FECHA (1-ENE-LUN)"}

{estacion.aparato ? ( <> Aparato {estacion.aparato} – {estacion.tipo} ) : ( "APARATO – TIPO DE AÑO" )}
{estacion.fp_aparato && (

{`FA: ${estacion.fa_aparato}`}

{`FN: -${estacion.fn_aparato}`}

)} {estacion.fp_aparato && (

{`FP: ${estacion.fp_aparato}`}

{estacion.fecha_aparato}

)}

{estacion.tema}

); }; const CalculadorTUMI = () => { const [fechaNacimiento, setFechaNacimiento] = useState(""); const [estaciones, setEstaciones] = useState(baseEstaciones); const handleInputChange = (e) => { setFechaNacimiento(e.target.value); }; const handleCalcular = () => { try { const fechaBase = parseDate(fechaNacimiento); const nuevas = baseEstaciones.map((est) => { const fechaEst = fechaBase.plus({ days: est.dias }); const fp = dayOfYear(fechaEst); const fn = daysRemaining(fechaEst); const fa = Math.abs(fp - fn); const fs = frecuenciaSolar(fechaEst); const { aparato, tipo, color } = getAparato(fechaEst); const startAparato = DateTime.fromObject({ year: aparato * 4 - 3, month: 1, day: 1 }); const diasDesdeInicioAparato = Math.floor(fechaEst.diff(startAparato, "days").days); const fp_aparato = diasDesdeInicioAparato + 1; const fn_aparato = 1461 - fp_aparato; const fa_aparato = fp_aparato - fn_aparato; const fecha_aparato = fechaEst.setLocale("es").toFormat("dd-LLL-yyyy-ccc"); return { ...est, fp, fn, fa, fs, aparato, tipo, color, fecha: fechaEst.setLocale("es").toFormat("dd-LLL-yyyy-ccc"), fp_aparato, fn_aparato, fa_aparato, fecha_aparato }; }); setEstaciones(nuevas); } catch (err) { alert("Fecha inválida. Usa formato dd/mm/yyyy"); } }; const layout = [ ["E7", "E8", "E9"], ["E4", "E5", "E6"], ["E1", "E2", "E3"] ]; return (

Calculador de Estaciones del TUMI

{layout.flat().map((id) => { const est = estaciones.find((e) => e.id === id); return ; })}
); }; export default CalculadorTUMI;