# Tasks: Mejoras de Rendimiento - Formularios de Contratos

**Feature Branch**: `009-mejoras-rendimiento-contratos`

**Input**: Design documents from `specs/009-mejoras-rendimiento-contratos/plan.md`

## Phase 1: User Story 1 - Carga instantánea del formulario (Priority: P1)

**Goal**: Permitir que el formulario se renderice inmediatamente sin bloquearse por la carga de la base completa de clientes.

- [ ] T001 [US1] En `app/Http/Controllers/ContratosController.php` (métodos de creación y edición), envolver la carga de `clientes` con `Inertia::lazy(fn () => $this->catalogoCache->getClientes())`.
- [ ] T002 [US1] En `resources/js/Pages/Eneon/Contratos/UniClienteUniPunto/Contrato.tsx`, añadir un `useEffect` para solicitar la carga de props diferidas: `router.reload({ only: ['clientes'] })`.
- [ ] T003 [US1] Replicar la carga diferida en las vistas variantes (ej. `MultiClienteMultiPunto.tsx`, `EditarContrato.tsx`).
- [ ] T004 [US1] Mostrar estado de carga (skeleton o spinner) en los dropdowns de clientes mientras los datos no estén disponibles.

---

## Phase 2: User Story 2 - Interacción fluida al rellenar campos (Priority: P2)

**Goal**: Evitar el congelamiento de la UI al desplegar catálogos grandes y al teclear búsquedas.

- [ ] T005 [P] [US2] Revisar el componente usado para seleccionar clientes (ej. `TypeaheadCliente.tsx` o selectores estándar en Contrato.tsx) e implementar un `useDebounce` de 300ms en el input de búsqueda.
- [ ] T006 [P] [US2] Modificar la renderización del dropdown de clientes para mostrar solo un subconjunto (paginación visual) o virtualizar la lista para que renderice instantáneamente.

---

## Phase 3: User Story 3 - Respuesta ágil al enviar (Priority: P3)

**Goal**: Prevenir el "doble clic" y dar feedback visual al usuario de que la petición se está procesando.

- [ ] T007 [P] [US3] En `resources/js/Pages/Eneon/Contratos/FormActions.tsx`, asegurarse de extraer o recibir el booleano `processing` del contexto de `useForm()`.
- [ ] T008 [US3] Ligar la prop `disabled` de los botones "Guardar" y "Tramitar" al estado `processing`.
- [ ] T009 [US3] Añadir un indicador visual de carga (ej. `<LoadingSpinner />` de los comunes) dentro del botón cuando `processing === true`.

---

## Dependencies & Execution Order

- **Phase 1 (US1)** debe realizarse primero, ya que altera la estructura de datos que recibe el frontend.
- **Phase 2 (US2)** puede realizarse en paralelo con la Phase 3.
- **Phase 3 (US3)** no tiene dependencias cruzadas y puede implementarse en paralelo tocando componentes de UI puros.
