PruvaDoku

Berechtigungen

Ob der Arbeitsbereich für ein Modul bezahlt hat und was jeder Zustand erlaubt.

Eine Berechtigung hält fest, ob ein Arbeitsbereich ein Modul hat. Es gibt eine je Modul. Jede speichert das Paket, auf dem es gekauft wurde (Essentials, Operations, Professional, Complete oder Enterprise; ein Branchenpaket speichert das Paket, das seine Zahl an Pro-Modulen braucht; Safety Vision ist eine eigene Position, safety-vision, auf dem Kameramodul; Bestellungen vor dem 20. Oktober 2026 behalten Lite, Base, Standard oder Advanced), die SKU, einen Zustand und einen Schalter enabled, den der Owner steuert.

Zustände

ZustandHöchste Stufe, die jemand erhältWann
lockednoneNie gekauft oder nach Tag 30 abgelaufen. Neue Berechtigungen beginnen hier.
activewie gewährtBezahlt und aktuell.
gracewie gewährtZahlung fehlgeschlagen. Voller Zugriff für 7 Tage, während sie behoben wird.
read_onlyviewTag 8 bis Tag 30 nach einer fehlgeschlagenen Zahlung. Sie können lesen und exportieren, nicht ändern oder senden.

Nach der Sperre werden die Daten 90 Tage aufbewahrt.

Wenn der Inhaber ein Modul ausschaltet (enabled = false), erhält jeder dafür none, unabhängig vom Zustand. Ein Modul im Zustand locked lässt sich nicht einschalten.

Wer was ändern kann

  • Nur der Store kann das Paket, die SKU, den Zustand oder das Periodenende ändern. In diesem Build ist das der Demo-Checkout auf der Website, der eine signierte Nachricht an die App sendet.
  • Der Inhaber kann nur enabled umlegen, und nur wenn das Modul nicht locked ist.
  • Kein Benutzer, auch der Inhaber nicht, kann ein Modul freischalten, indem er die Datenbank bearbeitet. Die Spalten sind für angemeldete Benutzer nicht schreibbar.

Die Store-Nachricht

Der Demo-Checkout der Website baut einen Body wie diesen:

{ "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", … } }

Er signiert timestamp.body mit HMAC-SHA256 und einem gemeinsamen Geheimnis und sendet Zeitstempel und Signatur in den Headern x-pv-timestamp und x-pv-signature an /api/entitlements der App. Die App lehnt eine falsche Signatur ab und alles, was älter als 5 Minuten ist.

Das Geheimnis ist PRUVA_ENTITLEMENTS_SECRET. Im Demo-Modus außerhalb der Produktion wird ein fester lokaler Wert genutzt, wenn es nicht gesetzt ist. Der lokale Datenbankmodus schreibt mit der Service-Rolle, daher verlangt die App dort ein echtes Geheimnis: setzen Sie dasselbe PRUVA_ENTITLEMENTS_SECRET für die App und die Website. In der Produktion verweigert die Website das Signieren ohne es.

Auf dieser Seite