sábado, 18 de julio de 2026

Documentación del sistema: narrativa de flujo de negocio y de interacción (parte 6)

Esta es la última publicación de esta serie. La IA ya está generando artefactos de codebase que no me aporta nada publicándolos, siendo que irá todo a parar al codebase de mi proyecto que es el lugar donde debe estar. Ni que hablar que el contenido de la publicación ya ha quedado desfasado con respecto al título de la misma: esto ya no se trata de la narrativa del flujo de negocio ni de la interacción.


 Estoy de acuerdo con el orden que has establecido. Quiero que hagas la migración de prestaciones.


Perfecto. Voy a hacerla siguiendo todas las decisiones que ya tomamos, sin introducir nuevas.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('prestaciones', function (Blueprint $table) {

// Código único e inmutable de la prestación.
$table->string('id')->primary();

// Nombre visible para el usuario.
$table->string('nombre', 60);

// Precio sugerido del catálogo.
$table->decimal('precio_base', 12, 2);

$table->timestamps();
$table->softDeletes();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('prestaciones');
}
};

Comentarios

Hay dos pequeñas decisiones de implementación que tomé porque son coherentes con todo lo que venimos diseñando:

  • id es string y Primary Key, no increments().

  • No agregué ningún índice adicional, porque una PRIMARY KEY ya crea el índice correspondiente y habíamos acordado no agregar más.

No agregué tampoco:

  • activo

  • categoria

  • descripcion

  • deleted_reason

  • ningún otro campo

porque deliberadamente decidimos mantener el alcance reducido y diseñar únicamente lo que el sistema necesita hoy.

Me parece una muy buena primera migración: es simple, estable y difícilmente necesite cambios en el futuro.


Varios prompts después...


Revisión arquitectónica

Con esto ya tenemos completa la primera capa del módulo:

  • ✅ Migración prestaciones
  • ✅ Modelo Prestacion
  • ✅ Seeder PrestacionSeeder
  • ✅ Enum PrestacionId
  • ✅ Migración tratamiento_propuestas
  • ✅ Modelo TratamientoPropuesta
  • ✅ Enum TratamientoPropuestaEstado
  • ✅ Migración tratamiento_propuesta_items
  • ✅ Modelo TratamientoPropuestaItem

Y quiero señalar algo que me gusta mucho del diseño al que llegamos.

No hay ninguna columna redundante.

Toda la información clínica sigue viviendo en el JSON del odontograma.

Toda la información económica nace recién cuando se emite una propuesta.

Eso hace que el modelo tenga una separación de responsabilidades muy limpia:

  • Odontograma → conocimiento clínico.
  • Prestaciones → catálogo de precios.
  • TratamientoPropuesta → documento comercial.
  • TratamientoPropuestaItem → fotografía (snapshot) de lo que se presupuestó en ese momento.

Es una arquitectura bastante elegante.


Mi propuesta para la siguiente etapa

A partir de este punto, yo no pasaría todavía a hacer pantallas.

Tampoco empezaría por los controladores.

Creo que conviene construir primero el corazón del módulo:

  1. EmitirTratamientoPropuestaAction
  2. AceptarTratamientoPropuestaAction
  3. RechazarTratamientoPropuestaAction

Esas tres acciones contendrán toda la lógica de negocio y serán completamente independientes de React, Inertia o de la API.

Después será muy sencillo hacer:

  • el controlador web,
  • el controlador API,
  • las páginas de Inertia,
  • las pruebas unitarias.

En otras palabras, a partir de ahora dejaríamos de construir la estructura del módulo y empezaríamos a construir el comportamiento del módulo. Creo que es el siguiente paso natural en la evolución del sistema.

No hay comentarios: