{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import field, checkbox, pill, alert, empty_state, modal %} {% block page_title %}Lizenz {{ license.license_id[:12] }}…{% endblock %} {% block page_sub %} {{ license.customer_name }} · {{ type_labels.get(license.type, license.type) }} {% if license.role != 'customer' %}· {{ role_labels.get(license.role, license.role) }}{% endif %} {% endblock %} {% block breadcrumb %} {% endblock %} {% block topbar_extra %} {% if current_user.has('licenses.export') %} {{ icon('download', size=15) }} Datei {% endif %} {% endblock %} {% block content %} {% if state.revision_pending %} {{ alert('Es wurde eine neue Revision signiert, die der Kunde noch nicht abgeholt hat. Eine erreichbare Installation holt sie beim nächsten Heartbeat; eine Installation ohne Verbindung braucht dafür den Offline-Weg -- der Kunde findet ihn in seinem Portal.', 'warning', 'Revision ausstehend') }} {% endif %} {% if license.status == 'revoked' %} {{ alert('Diese Lizenz ist widerrufen. Der Client erfährt das beim nächsten Heartbeat und schaltet seine lizenzpflichtigen Funktionen ab.' ~ ((' Grund: ' ~ license.revoke_reason) if license.revoke_reason else ''), 'danger', 'Widerrufen') }} {% endif %}
{{ icon('shield', size=17) }} Zustand {% if license.status == 'active' %}{{ pill('aktiv', 'online') }} {% elif license.status == 'issued' %}{{ pill('ausgestellt', 'info') }} {% elif license.status == 'revoked' %}{{ pill('widerrufen', 'danger') }} {% else %}{{ pill('deaktiviert', '') }}{% endif %} {% if state.revision_pending %} {{ pill('Revision ausstehend', 'warning') }} {% endif %}
Lizenz-ID
{{ license.license_id }}
Revision
{{ license.seq }}
Ticket
{% if license.ticket_id %} {{ license.ticket_id[:12] }}… {% else %}kein Ticket (importiert){% endif %}
Module
{% if modules %} {% for module in modules %}{{ pill(module_labels.get(module, module), 'online') }}{% endfor %} {% else %}keine{% endif %}
Ausgestellt
{{ license.issued_at | dt }} von {{ license.created_by or '-' }}
Läuft ab
{% if license.lifetime %}{{ pill('unbefristet', 'online') }} {% else %} {{ license.expires_at | dt }} {% if state.is_expired %}{{ pill('abgelaufen', 'danger') }} {% elif state.color == 'red' %}{{ pill(state.days_left ~ ' Tage', 'danger') }} {% elif state.color == 'orange' %}{{ pill(state.days_left ~ ' Tage', 'warning') }} {% else %}{{ pill(state.days_left ~ ' Tage', 'online') }}{% endif %} {% endif %}
Maschine
{% if license.fingerprint %} {{ license.fingerprint }} {% else %}noch nicht gebunden{% endif %}
Host (gemeldet)
{{ license.hostname or '–' | safe }}
Aktiviert
{{ license.activated_at | dt }}
Letzter Heartbeat
{% if license.last_heartbeat_at %} {{ license.last_heartbeat_at | dt }} {% else %}nie{% endif %}
{% if current_user.has('licenses.edit') and license.status != 'revoked' %}
{{ icon('refresh', size=17) }} Nachträglich anpassen
Signiert eine neue Revision. Der Client erhält sie beim nächsten Heartbeat -- ohne erneute Aktivierung.
{% if license.role == 'customer' %}
Module
{% for module in all_modules %} {{ checkbox('modules', module_labels[module], value=module, checked=module in modules) }} {% endfor %}
{% endif %} {{ field('extend_days', 'Laufzeit verlängern (Tage)', type='number', placeholder='0', hint_text='Wird auf das aktülle Ablaufdatum aufgeschlagen.') }}
{% endif %}
{{ icon('transfer', size=17) }} Zustellungen
{{ deliveries | length }} Vorgänge
{% if deliveries %}
{% for entry in deliveries %} {% endfor %}
ZeitWegEmpfängerDurchDetail
{{ entry.delivered_at | dt }} {{ entry.channel }} {{ entry.recipient or '–' | safe }} {{ entry.delivered_by }} {{ entry.detail }}
{% else %} {{ empty_state('Noch nicht zugestellt', 'Die Datei wurde bisher nicht herausgegeben.', 'transfer') }} {% endif %}
{{ icon('file-text', size=17) }} Signiertes Dokument
Genau so, wie es signiert wurde -- jede Änderung bricht die Signatur
{{ icon('chevron-down', size=16) }}
{{ document_json }}
{% if current_user.has('licenses.export') %}
{{ icon('mail', size=17) }} Per E-Mail versenden
{% if mail_ready %}Über Microsoft Graph{% else %}Nicht konfiguriert{% endif %}
{{ field('recipient', 'Empfänger', value=license.contact_email, type='email', disabled=not mail_ready) }}
{% endif %} {% if current_user.has('licenses.edit') or current_user.has('licenses.delete') %}
{{ icon('alert', size=17) }} Lebenszyklus
{% if current_user.has('licenses.edit') and license.status != 'revoked' %}

Das Ticket bleibt offen -- eine neue Lizenz kann sofort ausgestellt werden. Genau so läuft ein Systemwechsel.

{% endif %} {% if current_user.has('licenses.delete') %}
{% endif %}
{% endif %}
{% endblock %} {% block dialogs %} {% if current_user.has('licenses.edit') and license.status != 'revoked' %} {% call modal('revoke-dialog', 'Lizenz widerrufen', license.customer_name, 'narrow') %}
{% endcall %} {% endif %} {% endblock %}