miércoles, 29 de octubre de 2025

Conexión entre odontograma y presupuesto

 Quiero que en el odontograma cuando marco que un diente tiene un problema, me siguiera los posibles tratamientos o dispositivos que se le pueden aplicar. Por ejemplo, si no me equivoco, para caries me sugeriría obturación y tratamiento de conducto. Después quiero que al seleccionar un correctivo específico se pueda indicar si está en estado para realizar o realizado. Y que dé la opción de cargar el correctivo en el presupuesto. Esto efectivamente conecta con la función presupuesto.


¡Absolutamente! Este es el flujo de trabajo central de cualquier sistema de gestión clínica u odontológica: Conectar el diagnóstico con el plan de tratamiento y la cotización (presupuesto).

Para implementar esta funcionalidad con React y Firestore (para la persistencia de datos), necesitarás un componente central que gestione el estado del diente, los posibles tratamientos y la fase de ejecución.

Voy a generar un único archivo React (OdontogramaApp.jsx) que simulará un solo diente (para simplificar la lógica) y un panel lateral. Este archivo contendrá:

  1. La Lógica de Sugerencia: Un mapeo de condiciones a tratamientos sugeridos.

  2. El Componente del Diente: Donde se selecciona el problema.

  3. El Panel de Tratamiento: Donde se elige la fase (Para Realizar / Realizado).

  4. La Integración con Firestore: Para guardar la información del plan de tratamiento y el estado.

Dado que esta es una aplicación compleja con gestión de estado y persistencia, usaré React con hooks y Tailwind CSS para la estética.

Mapeo de Problemas a Sugerencias

Usaremos un mapeo base para las sugerencias que mencionaste:

Problema (Diagnóstico)Sugerencias de Tratamiento
CariesEmpaste / Obturación, Tratamiento de Conducto, Corona
FracturaEmpaste / Obturación, Corona, Extracción
AusenciaImplante, Prótesis Fija, Prótesis Removible

Aquí tienes el código completo en un solo archivo React:

Voy a generar el archivo OdontogramaApp.jsx.

Previsualización (con audio):


 

Explicación del Funcionamiento

  1. Firebase Setup: El componente se inicializa con Firebase y se suscribe al estado del usuario.

  2. SUGGESTIONS_MAP: Define la lógica central que conecta un problem (ej. 'Caries') con un array de posibles treatment (ej. ['Empaste / Obturación', ...]).

  3. updateToothPlan (Persistencia): Esta función central encapsula la lógica para guardar cualquier cambio (problem, treatment, status, inBudget) en Firestore. Usa setDoc({ merge: true }) para actualizar solo los campos cambiados, manteniendo el resto de los datos.

  4. Flujo del Diente (Columna 1):

    • El usuario selecciona un Diagnóstico (ej. "Caries").

    • handleProblemSelect se llama, guarda el diagnóstico en Firestore y resetea los campos treatment y status.

  5. Sugerencias (Columna 2):

    • Al seleccionar un diagnóstico, el componente muestra automáticamente los botones de suggestedTreatments del mapa.

    • Al hacer clic en un tratamiento, se establece toothPlan.treatment y se inicializa el estado a "Para Realizar".

  6. Carga al Presupuesto (Columna 3):

    • El botón de presupuesto (CARGAR al Presupuesto) solo se activa si se ha seleccionado un tratamiento y un estado.

    • handleBudgetToggle invierte el valor de la propiedad inBudget en Firestore.

  7. Cálculo del Presupuesto:

    • Se utiliza un segundo onSnapshot (dentro del useEffect principal) que consulta la colección dental_plans filtrando solo por los documentos donde inBudget sea true.

    • Cada vez que un usuario añade o quita un tratamiento del presupuesto, Firestore actualiza esa consulta, y el budgetTotal se recalcula y se muestra al instante.


Perdón, no entiendo cuándo se actualiza toothPlan.

¡Esa es una excelente pregunta! En las aplicaciones de React que utilizan una base de datos en tiempo real como Firestore, la actualización del estado puede ser un poco diferente a la actualización de estado local tradicional.

Aquí te explico exactamente cuándo y cómo se actualiza toothPlan en el código:

El estado toothPlan se actualiza a través de dos mecanismos principales:

1. Actualización por Interacción del Usuario (Función updateToothPlan)

Esta es la forma en que los cambios se envían desde la aplicación a la base de datos (Firestore).

  • ¿Qué la dispara? La función updateToothPlan se llama cada vez que el usuario realiza una acción en la interfaz que debe guardarse:

    • Seleccionar un problema (handleProblemSelect).

    • Elegir un tratamiento (handleTreatmentSelect).

    • Cambiar el estado (handleStatusChange).

    • Cargar o remover del presupuesto (handleBudgetToggle).

  • ¿Cómo funciona?

    1. Cuando, por ejemplo, llamas updateToothPlan({ status: 'Realizado' }), la función envía una solicitud a Firestore para actualizar el documento de ese diente.

    2. ¡Espera! Aunque el código localmente ya sabe el nuevo estado, la variable de React toothPlan no se actualiza directamente en ese momento.

2. Actualización por Sincronización de Firestore (onSnapshot)

Esta es la forma en que los cambios confirmados en la base de datos regresan a la aplicación, garantizando que el estado local sea siempre el reflejo fiel del estado persistente (incluso si otro usuario o dispositivo lo hubiera cambiado).

  • ¿Qué la dispara? La función onSnapshot que definimos en el segundo useEffect:

    JavaScript
    // Dentro del useEffect (Se ejecuta al inicializar la DB y el usuario)
    const unsubscribePlan = onSnapshot(planRef, (docSnap) => {
        if (docSnap.exists()) {
            // ¡AQUÍ ESTÁ LA ACTUALIZACIÓN!
            setToothPlan(docSnap.data()); 
        } else {
            setToothPlan(INITIAL_TOOTH_DATA);
        }
    });
    // ...
    
  • ¿Cómo funciona?

    1. Cuando la aplicación inicia, onSnapshot se ejecuta y carga el estado inicial del diente.

    2. Cada vez que la base de datos (Firestore) detecta un cambio en el documento del diente (Tooth_14), automáticamente notifica a la aplicación.

    3. El callback de onSnapshot se ejecuta, toma los datos (docSnap.data()), y llama a setToothPlan(docSnap.data()).

    4. Este setToothPlan es lo que realmente actualiza el estado de React y provoca que todo el componente se re-renderice con el nuevo plan.

En Resumen (El Ciclo de Vida del Dato)

El ciclo de actualización es un circuito cerrado y asíncrono:

  1. Usuario Clic: Llama a updateToothPlan({...}).

  2. Base de Datos: El cambio se envía y se guarda en Firestore.

  3. Sincronización: Firestore notifica a onSnapshot que el documento ha cambiado.

  4. React Actualiza: onSnapshot llama a setToothPlan(), actualizando la interfaz.

Este patrón garantiza que tu estado local siempre esté "grounded" (arraigado) en lo que realmente está guardado en la base de datos.