{% extends 'base.html.twig' %} {% block title %}{{ 'tenant.title'|trans }}{% endblock %} {% block page_title %}{{ 'tenant.title'|trans }}{% endblock %} {% block body %} {# Compatibility markers for tenant audit tests: Historial de jobs; error historico; Superadmin. #}
i

Los clientes pueden migrarse a base propia mediante jobs seguros, dry-run, validacion y activacion controlada. {% if auditEnabled %}Auditoria final activa: los indicadores por cliente son de solo lectura.{% endif %}

{{ 'tenant.total'|trans }} {{ summary.total }}
{{ 'tenant.dedicated_database'|trans }} {{ summary.databasePerClient }}
{{ 'tenant.legacy'|trans }} {{ summary.legacy }}
{{ 'tenant.pending_jobs'|trans }} {{ summary.jobsPending }}
{{ 'tenant.failed_jobs'|trans }} {{ summary.jobsError }}

{{ 'tenant.administration'|trans }}

{{ 'tenant.visible_clients'|trans({'%count%': '' ~ tenants|length ~ ''})|raw }}

{% set tenantActionKeys = { check: 'tenant.action_check', migration_dry_run: 'tenant.action_dry_run', validate: 'tenant.action_validate', validate_access: 'tenant.action_validate_access', repair_access: 'tenant.action_repair_access', repair_schema: 'tenant.action_repair_schema', repair_catalogs: 'tenant.action_repair_catalogs', activate_legacy: 'tenant.action_activate_legacy', final_audit: 'tenant.final_audit', refresh: 'tenant.refresh', job_log: 'tenant.view_log', job_running: 'tenant.action_job_running', provision: 'tenant.action_provision', migrate_data: 'tenant.action_migrate_data', activate_database: 'tenant.action_activate_database' } %}
{% for tenant in tenants %} {% set currentJob = tenant.activeJob ?: tenant.displayJob %} {% set primary = tenant.primaryAction %} {% set audit = tenant.finalAudit %} {% set runtimeDb = tenant.dbName ?: tenant.suggestedDbName %} {% set auditDb = tenant.auditDbName ?: tenant.suggestedAuditDbName %} {% set workflowKey = { legacy_shared: 'tenant.legacy', provision_pendiente: 'tenant.pending', preparando_base: 'tenant.preparing_database', base_preparada: 'tenant.database_ready', dryrun_ok: 'tenant.dry_run_ready', migrando_datos: 'tenant.migrating_data', validando: 'tenant.processing', validado: 'tenant.validated', activando: 'tenant.processing', database_per_client: 'tenant.database_active', rollback_legacy: 'tenant.processing', pendiente: 'tenant.pending', error: 'status.error' }[tenant.workflow]|default(null) %} {% set workflowLabel = workflowKey ? workflowKey|trans : tenant.workflowLabel %} {% set modeLabel = tenant.mode == 'database_per_client' ? 'tenant.dedicated_database'|trans : 'tenant.legacy'|trans %} {% set primaryLabelKey = primary.action == 'job_log' and tenant.workflow == 'error' ? 'tenant.action_view_error' : tenantActionKeys[primary.action]|default(null) %} {% set primaryLabel = primaryLabelKey ? primaryLabelKey|trans : primary.label %}
{{ tenant.name ?: 'Sin nombre' }} Cliente #{{ tenant.id }}
{{ workflowLabel }} {{ modeLabel }}
    {% for step in tenant.wizardSteps %}
  1. {{ step.labelKey|trans }}
  2. {% endfor %}

{{ primaryLabel }}: {{ primary.title }}

{{ 'tenant.schema'|trans }}
{{ tenant.schemaState }}
{{ 'tenant.migration'|trans }}
{{ tenant.migrationState }}
{{ 'tenant.access'|trans }}
{{ tenant.accessState }}
{% if currentJob %}
#{{ currentJob.id }} {{ currentJob.stateLabel }} {{ currentJob.durationSeconds is not null ? currentJob.durationSeconds ~ 's' : '-' }}

{{ currentJob.lastStep ?: currentJob.type }}

{% if tenant.latestJob and tenant.latestJob.state == 'error' and currentJob.id != tenant.latestJob.id %} error historico #{{ tenant.latestJob.id }} {% endif %}
{{ 'tenant.view_log'|trans }}
{% else %} {{ 'tenant.no_jobs'|trans }} {% endif %}
{% if tenant.latestError %}

{{ tenant.latestError }}

{% endif %}
{{ 'tenant.view_details'|trans }}
{{ 'tenant.runtime_database'|trans }}
{{ runtimeDb }}
{{ 'tenant.audit_database'|trans }}
{{ auditDb }}
{% if tenant.statusHint %}

{{ tenant.statusHint }}

{% endif %} {% if audit %}
{{ 'tenant.final_audit'|trans }} {{ audit.estado_label }}
{{ 'tenant.database_ready'|trans }}
{{ audit.db_tenant_existe ? 'status.ready'|trans : 'common.not_available'|trans }}
{{ 'tenant.schema'|trans }}
{{ audit.schema.estado ?? '-' }}
{{ 'tenant.migration'|trans }}
{{ audit.migration.estado ?? '-' }}
{{ 'tenant.access'|trans }}
{{ audit.access.estado ?? '-' }}
{{ 'tenant.superadmin'|trans }}
{{ audit.access.superadmin_ok|default(false) ? 'OK' : 'Error' }}
{{ 'tenant.legacy_data'|trans }}
{{ audit.legacy.legacy_rows_total ?? 0 }}

{{ audit.legacy.estado }}. Siguiente paso: {{ audit.siguiente_paso }}.

{% endif %}
{{ 'tenant.history'|trans }}
{% if primary.enabled %} {% if primary.kind|default('post') == 'link' %} {{ primaryLabel }} {% elseif primary.requiresConfirm %} {% else %}
{% endif %} {% else %} {% endif %} {% if tenant.secondaryActions|length > 0 %}
{% endif %}
{% else %}
{{ 'tenant.no_clients'|trans }}
{% endfor %}
{% endblock %} {% block javascripts %} {{ parent() }} {% endblock %}