ixiclinicDocs
DesarrolladoresApps del monorepo

Admin

Panel de operación del laboratorio (Lab OS) — Next.js 16 App Router, Tailwind 4, shadcn/ui. Route groups, server actions y rutas API internas.

El admin (apps/admin) es el panel de operación que usa cada laboratorio (el "Lab OS"): recepción, facturación, catálogo, resultados, inventario, caja, turnos, etc. Es una app por tenant: el usuario inicia sesión y trabaja sobre su laboratorio.

StackNext.js 16 (App Router), Tailwind 4, shadcn/ui
Puerto local3000
Producciónadmin.ixiclinic.com (Vercel)
Paquete@ixiclinic/admin

Nota: Esta versión de Next.js (16.2.1) tiene cambios de ruptura frente al conocimiento habitual. Antes de escribir código de Next, lee la guía relevante en node_modules/next/dist/docs/.

Route groups (apps/admin/src/app/)

La app usa route groups para separar layouts:

GrupoContenido
(auth)/login, register (sin sidebar).
(admin)/Gestión super-admin de tenants: admin/, admin/tenants, admin/support.
(dashboard)/El workspace principal del tenant (ver abajo).
(portal)/Redirección pública de QR: r/.
(public)/Vistas sin autenticación: kiosk/[id], screen/[id].

Secciones del (dashboard)

dashboard, billing (incluye la subsección fiscal billing/dgii), catalog, patients, orders, results, inventory, settings, qc, reports, doctors, import, website, appointments, samples, queue, companies, notifications, recetas, services, encuentros, actividades, y workspace/[id] (la pantalla del escritorio del Lab OS).

Comunicación con el API

Todo el acceso al API es server-side, vía apps/admin/src/lib/api-client.ts (apiGet, apiPost, apiPatch, apiPut, apiDelete). Las cabeceras de auth se inyectan desde cookies httpOnly y hay refresco automático de token ante un 401. No hay llamadas al API desde el cliente: toda la obtención de datos pasa por server actions.

Server actions (46)

Viven en apps/admin/src/actions/ — una por dominio. Por ejemplo: auth.ts, billing.ts, catalog.ts, orders.ts, results.ts, patients.ts, inventory.ts, cash.ts, queue.ts, notifications.ts, ecf.ts, encounters.ts, programs.ts, prescriptions.ts, printing.ts, chat.ts, impersonation.ts, preferences.ts, website.ts, slider.ts, etc.

Regla no negociable: no uses estado de cliente ni fetch desde el navegador para datos del API. Crea/usa una server action en apps/admin/src/actions/.

Rutas API de Next (apps/admin/src/app/api/)

Además de las server actions, el admin tiene rutas API de Next para tareas que no encajan en una action (generación de binarios, búsqueda):

RutaPara qué
results/[orderId]/pdf, results/qr/[qr]/pdfPDF de resultados (@react-pdf/renderer).
invoices/[invoiceId]/pdfPDF de factura.
cash/sessions/[sessionId]/pdfPDF de cierre de caja.
encounters/[encounterId]/pdfPDF del encuentro clínico.
templates/[id]/preview, templates/preview-draftPrevisualización de plantillas.
searchBúsqueda global.

Nota: La lógica fiscal e-CF (DGII) ya no vive en apps/admin/src/lib/dgii. La generación y firma del XML está en el módulo ecf del API; el admin solo tiene la action actions/ecf.ts y la UI en (dashboard)/billing/dgii.

UI stack

shadcn/ui (estilo base-nova) sobre @base-ui/react + Tailwind 4 + CVA (class-variance-authority). Los formularios usan react-hook-form con @hookform/resolvers/zod; las tablas usan @tanstack/react-table; los gráficos recharts; las notificaciones sonner. Tiempo real con socket.io-client. Los componentes se organizan por dominio en apps/admin/src/components/.

Los validadores Zod viven en apps/admin/src/lib/validators/ (auth, billing, catalog, insurance, inventory, orders, patient, qc, results), con z.infer para extraer los tipos.

Auth y middleware

El admin usa cookies httpOnly para los JWT. El control de acceso (auth + RBAC + allowlist de rutas públicas como /r, /kiosk, /screen) vive en apps/admin/src/proxy.ts (en Next 16 es proxy.ts, no middleware.ts). Detalle del flujo en Autenticación.

Añadir una pantalla

Para el paso a paso (ruta, action, validador, tabla), ver Añadir una pantalla al admin.

Build y despliegue

Despliega automáticamente en Vercel al hacer push a main. Ver Operaciones.

On this page