Habilitaciones
Si el espacio de trabajo ha pagado un módulo, y qué permite cada estado.
Una habilitación registra si un espacio de trabajo tiene un módulo. Hay una por módulo. Cada una registra el paquete con el que se compró (Essentials, Operations, Professional, Complete o Enterprise; un paquete sectorial registra el paquete que necesita su número de módulos Pro; Safety Vision es su propia línea, safety-vision, en el módulo de cámaras; los pedidos anteriores al 20 de octubre de 2026 conservan Lite, Base, Standard o Advanced), el SKU, un estado y un interruptor enabled que controla el propietario.
Estados
| Estado | Nivel más alto que obtiene cualquiera | Cuándo |
|---|---|---|
locked | none | Nunca comprado, o vencido después del día 30. Las habilitaciones nuevas empiezan aquí. |
active | según lo concedido | Pagado y vigente. |
grace | según lo concedido | El pago falló. Acceso completo durante 7 días mientras se corrige. |
read_only | view | Del día 8 al día 30 tras un pago fallido. Puede leer y exportar, no cambiar ni enviar. |
Después del bloqueo, los datos se guardan 90 días.
Si el propietario apaga un módulo (enabled = false), todo el mundo obtiene none para él, sea cual sea el estado. Un módulo locked no se puede activar.
Quién puede cambiar qué
- Solo la tienda puede cambiar el paquete, el SKU, el estado o el fin del periodo. En esta versión eso es el pago de demo del sitio, que envía un mensaje firmado a la aplicación.
- El propietario solo puede cambiar
enabled, y solo cuando el módulo no está bloqueado. - Ningún usuario, incluido el propietario, puede desbloquear un módulo editando la base de datos. Las columnas no se pueden escribir para los usuarios que han iniciado sesión.
El mensaje de la tienda
El pago de demo del sitio construye un cuerpo como este:
{ "orderId": "PV-…", "workspaceSlug": "aurora-marine", "sku": "tanker", "modules": ["noon", "emissions", "documents", "pms", "insurance"], "vessels": 4, "state": "active", "annualUsd": 57800, "oneOffUsd": 19944, "firstChargeUsd": 77744, "consent": { … }, "term": { … }, "trial": { … }, "chargeTodayUsd": 0, "payment": { "provider": "demo", "reference": "pm_demo_visa_4242", … } }Firma timestamp.body con HMAC-SHA256 usando un secreto compartido y envía la marca de tiempo y la firma en las cabeceras x-pv-timestamp y x-pv-signature a /api/entitlements en la aplicación. La aplicación rechaza una firma incorrecta y cualquier cosa de más de 5 minutos.
El secreto es PRUVA_ENTITLEMENTS_SECRET. En el modo demo fuera de producción se usa un valor local fijo cuando no está definido. El modo de base de datos local escribe con el rol de servicio, así que ahí la aplicación exige un secreto real: defina el mismo PRUVA_ENTITLEMENTS_SECRET para la aplicación y el sitio. En producción el sitio se niega a firmar sin él.
Niveles de acceso
none, view, edit y publish, definidos por persona y por módulo. En esta versión, a bordo y en tierra no se separan por buque.
Facturación y renovación
La prueba de 1 mes tras un depósito del 10 %, el contrato de 3 años con salida en el año 1, la facturación anual, la renovación, Cancelar prueba, Cancelar renovación, sin reembolsos del año ya iniciado, y qué guarda cada pedido.