Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Carlos-Gnd/FERRED-Inventario-y-Ventas/llms.txt
Use this file to discover all available pages before exploring further.
El servidor de Ferred se configura a través de variables de entorno definidas en un archivo .env. Copia .env.example a apps/server/.env y completa los valores con las credenciales de tu proyecto en Supabase y un secreto JWT seguro.
cp .env.example apps/server/.env
Nunca incluyas el archivo .env en el control de versiones. Asegúrate de que .env esté en .gitignore antes de hacer cualquier commit. Las claves de Supabase y el JWT_SECRET son credenciales sensibles que otorgan acceso completo a tus datos.
Base de datos
Prisma requiere dos URLs distintas de Supabase: una para las queries de la aplicación a través de pgBouncer, y otra directa para las migraciones.
| Variable | Descripción | Ejemplo | Requerido |
|---|
DATABASE_URL | URL de conexión con pgBouncer (puerto 6543). Usada por la aplicación para todas las queries en tiempo real. | postgresql://postgres:<pass>@<host>:6543/<db>?pgbouncer=true | Sí |
DIRECT_URL | URL de conexión directa a Postgres (puerto 5432). Usada exclusivamente por prisma migrate. | postgresql://postgres:<pass>@<host>:5432/<db> | Sí (migraciones) |
Obtén ambas URLs desde el panel de Supabase en Settings → Database → Connection string. Usa la URL de pgBouncer (DATABASE_URL) para la aplicación y reserva la URL directa (DIRECT_URL) solo para ejecutar migraciones con Prisma. Esto evita agotar el límite de conexiones en entornos con muchos clientes concurrentes.
También puedes configurar las siguientes variables de Supabase para acceder a su API:
| Variable | Descripción | Ejemplo | Requerido |
|---|
SUPABASE_URL | URL del proyecto en Supabase. Disponible en Settings → API. | https://<proyecto>.supabase.co | Sí |
SUPABASE_ANON_KEY | Clave pública anónima de Supabase. | eyJ... | No |
SUPABASE_SERVICE_KEY | Clave de servicio con privilegios completos. Nunca exponer en el cliente. | eyJ... | Sí |
Autenticación
| Variable | Descripción | Ejemplo | Requerido |
|---|
JWT_SECRET | Cadena aleatoria usada para firmar y verificar tokens JWT. Debe tener al menos 32 caracteres. Rota esta clave si se filtra. | a3f8... (32+ chars) | Sí |
JWT_EXPIRES_IN | Tiempo de expiración de los tokens JWT. Acepta el formato de la librería jsonwebtoken (ej. "2h", "7d"). | 2h | No (default: 2h) |
CRYPTO_SECRET | Clave para cifrado interno de datos sensibles almacenados localmente. Al menos 32 caracteres. | b9c1... (32+ chars) | Sí |
DTE / Hacienda (El Salvador)
Las variables de DTE controlan la integración con el sistema de facturación electrónica del Ministerio de Hacienda de El Salvador. Si las dejas vacías, la aplicación opera en modo simulado sin emitir documentos reales.
| Variable | Descripción | Ejemplo | Requerido |
|---|
DTE_ENV | Entorno de emisión. Usa sandbox para pruebas y production cuando tengas credenciales reales del Ministerio. | sandbox | No (default: sandbox) |
DTE_SANDBOX_URL | URL del API de pruebas del Ministerio de Hacienda. | https://apitest.dtes.mh.gob.sv | No (default incluido) |
DTE_AUTH_TOKEN | Token de autenticación estático para el API de Hacienda (producción). Si está presente, se usa como Authorization: Bearer. | eyJ... | No |
DTE_SANDBOX_USER | Usuario para autenticación Basic en el entorno sandbox de Hacienda. | usuario@empresa.com | No |
DTE_SANDBOX_PASS | Contraseña para autenticación Basic en el entorno sandbox de Hacienda. | contraseña | No |
Si no configuras credenciales de Hacienda, las facturas quedan en estado SIMULADO. Son documentos locales válidos pero no enviados al Ministerio. El sistema funciona con normalidad; puedes reenviar los DTEs cuando tengas credenciales con POST /api/dte/:id/reenviar.
Servidor y SQLite
| Variable | Descripción | Ejemplo | Requerido |
|---|
PORT | Puerto en el que escucha el servidor Express. | 3001 | No (default: 3001) |
NODE_ENV | Entorno de ejecución. Afecta logs, manejo de errores y optimizaciones. | development | No (default: development) |
BRANCH_ID | Identificador numérico de la sucursal. Cada instalación de Electron debe usar un valor distinto. Determina el nombre del archivo SQLite local (ferred_branch{BRANCH_ID}.db). | 1 | No (default: 1) |
SQLITE_PATH | Ruta personalizada del archivo SQLite local. Electron lo sobreescribe automáticamente con app.getPath('userData'). Si no se define, se usa data/ferred_branch{BRANCH_ID}.db. | data/ferred_branch1.db | No |
OFFLINE_AUTH_MAX_DAYS | Días máximos sin sincronizar antes de rechazar el login offline. Protege contra sesiones indefinidas sin conexión a Supabase. | 30 | No (default: 30) |