Visión General
El sistema de facturación electrónica permite gestionar múltiples empresas desde una única instalación. Cada empresa puede tener sus propios usuarios, configuraciones, series de comprobantes y datos fiscales independientes.Modelo de Datos
Empresa
El modeloEmpresa representa una empresa registrada en el sistema:
app/Models/Empresa.php
Campos principales:
| Campo | Tipo | Descripción |
|---|---|---|
id_empresa | integer | Identificador único de la empresa (PK) |
ruc | string | RUC de la empresa |
razon_social | string | Razón social completa |
comercial | string | Nombre comercial |
direccion | string | Dirección fiscal |
email | string | Correo electrónico |
telefono | string | Teléfono principal |
user_sol | string | Usuario SOL para SUNAT |
clave_sol | string | Clave SOL para SUNAT |
logo | string | Ruta del logo de la empresa |
ubigeo | string | Código de ubigeo |
distrito | string | Distrito |
provincia | string | Provincia |
departamento | string | Departamento |
igv | decimal | Tasa de IGV (por defecto 18.00) |
estado | string | Estado de la empresa (1=activo, 0=inactivo) |
modo | string | Modo de operación (beta/producción) |
Relación con Usuarios
Cada usuario pertenece a una empresa específica a través del campoid_empresa en el modelo User:
Funcionamiento Multi-Empresa
Usuarios Administradores
Los usuarios conrol_id = 1 (Administradores) tienen privilegios especiales:
- Acceso a todas las empresas: Pueden ver y gestionar datos de cualquier empresa activa
- Cambio de empresa: Pueden cambiar de contexto entre empresas mediante el endpoint
switchEmpresa - Sin restricciones de permisos: Tienen acceso automático a todos los módulos
Usuarios Normales
Los usuarios con roles diferentes al administrador (rol_id != 1):
- Empresa fija: Solo pueden acceder a los datos de su empresa asignada (
id_empresa) - Permisos limitados: Sus acciones están controladas por el sistema de permisos
- Sin cambio de empresa: No pueden cambiar de contexto empresarial
Autenticación y Empresas
Login
Al iniciar sesión, el sistema retorna información sobre las empresas disponibles:- Admin (
rol_id = 1): Retorna todas las empresas activas (estado = '1') - Usuario normal: Retorna solo la empresa asignada al usuario
app/Http/Controllers/Api/AuthController.php:52-66
Cambiar de Empresa
Endpoint:POST /api/auth/switch-empresa
Parámetros:
- Solo disponible para usuarios administradores (
rol_id = 1) - La empresa debe existir y estar activa (
estado = '1') - Usuarios normales reciben error 403
app/Http/Controllers/Api/AuthController.php:169-204
Alcance de Datos por Empresa
Todas las tablas principales del sistema incluyen el campoid_empresa para filtrar datos por empresa:
- Ventas (
ventas.id_empresa) - Compras (
compras.id_empresa) - Productos (
producto.id_empresa) - Clientes (
cliente.id_empresa) - Proveedores (
proveedores.id_empresa) - Cotizaciones (
cotizaciones.id_empresa) - Guías de Remisión (
guias_remision.id_empresa) - Notas de Crédito/Débito (
notas_credito.id_empresa,notas_debito.id_empresa)
Ejemplo de Consulta
Archivos SUNAT por Empresa
Los archivos XML, CDR y certificados se almacenan organizados por RUC de empresa:config/sunat.php
Configuración de Empresa
Cada empresa puede tener configuraciones independientes:Credenciales SUNAT
- Usuario SOL:
user_sol- Usuario para webservices SUNAT - Clave SOL:
clave_sol- Contraseña para webservices SUNAT
Modo de Operación
- Beta: Para pruebas (usa RUC 20000000001)
- Producción: Para emisión real de comprobantes
Personalización
- Logo: Imagen que aparece en los comprobantes PDF
- Propaganda: Texto adicional para pie de comprobante
- Tipo de impresión: Configuración de formato de impresión
Endpoints de Empresas
Listar Empresas
Endpoint:GET /api/empresas
Respuesta:
Obtener Empresa
Endpoint:GET /api/empresas/{id}
Actualizar Empresa
Endpoint:POST /api/empresas/{id}
Nota: Usa POST en lugar de PUT/PATCH para soportar FormData con carga de logo.
Eliminar Logo
Endpoint:DELETE /api/empresas/{id}/logo
Mejores Prácticas
En Controladores
En Servicios
Validaciones
Consideraciones
Seguridad
- Aislamiento de datos: Cada empresa solo ve sus propios datos
- Validación estricta: Siempre verificar
id_empresaen consultas - Credenciales separadas: Cada empresa tiene sus propias credenciales SUNAT
Rendimiento
- Índices: Todas las tablas principales tienen índice en
id_empresa - Caché: Considerar cachear datos de empresa activa en sesión
Migración
- Si viene de un sistema mono-empresa, asegúrese de:
- Asignar
id_empresaa todos los registros existentes - Crear al menos una empresa en la tabla
empresas - Actualizar
id_empresaen usuarios existentes
- Asignar