Skip to main content

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.
VariableDescripciónEjemploRequerido
DATABASE_URLURL 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
DIRECT_URLURL 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:
VariableDescripciónEjemploRequerido
SUPABASE_URLURL del proyecto en Supabase. Disponible en Settings → API.https://<proyecto>.supabase.co
SUPABASE_ANON_KEYClave pública anónima de Supabase.eyJ...No
SUPABASE_SERVICE_KEYClave de servicio con privilegios completos. Nunca exponer en el cliente.eyJ...

Autenticación

VariableDescripciónEjemploRequerido
JWT_SECRETCadena aleatoria usada para firmar y verificar tokens JWT. Debe tener al menos 32 caracteres. Rota esta clave si se filtra.a3f8... (32+ chars)
JWT_EXPIRES_INTiempo de expiración de los tokens JWT. Acepta el formato de la librería jsonwebtoken (ej. "2h", "7d").2hNo (default: 2h)
CRYPTO_SECRETClave para cifrado interno de datos sensibles almacenados localmente. Al menos 32 caracteres.b9c1... (32+ chars)

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.
VariableDescripciónEjemploRequerido
DTE_ENVEntorno de emisión. Usa sandbox para pruebas y production cuando tengas credenciales reales del Ministerio.sandboxNo (default: sandbox)
DTE_SANDBOX_URLURL del API de pruebas del Ministerio de Hacienda.https://apitest.dtes.mh.gob.svNo (default incluido)
DTE_AUTH_TOKENToken de autenticación estático para el API de Hacienda (producción). Si está presente, se usa como Authorization: Bearer.eyJ...No
DTE_SANDBOX_USERUsuario para autenticación Basic en el entorno sandbox de Hacienda.usuario@empresa.comNo
DTE_SANDBOX_PASSContraseña para autenticación Basic en el entorno sandbox de Hacienda.contraseñaNo
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

VariableDescripciónEjemploRequerido
PORTPuerto en el que escucha el servidor Express.3001No (default: 3001)
NODE_ENVEntorno de ejecución. Afecta logs, manejo de errores y optimizaciones.developmentNo (default: development)
BRANCH_IDIdentificador 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).1No (default: 1)
SQLITE_PATHRuta 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.dbNo
OFFLINE_AUTH_MAX_DAYSDías máximos sin sincronizar antes de rechazar el login offline. Protege contra sesiones indefinidas sin conexión a Supabase.30No (default: 30)

Build docs developers (and LLMs) love