84 lines
3.3 KiB
HTML
84 lines
3.3 KiB
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
<div class="toolbar">
|
|
<h1>{{ t('assets.import_title') }}</h1>
|
|
<div class="toolbar-actions"><a class="button button-secondary" href="/assets">← Zur Asset-Liste</a></div>
|
|
</div>
|
|
|
|
<section class="panel">
|
|
<form method="post" action="/assets/import" enctype="multipart/form-data">
|
|
<label>Kategorie
|
|
<select name="category_id" required>
|
|
{% for category in categories %}
|
|
<option value="{{ category.id }}" {% if selected and selected.id == category.id %}selected{% endif %}>{{ category.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
|
|
{% if selected %}
|
|
<p><a class="button button-secondary" href="/assets/import/template.xlsx?category_id={{ selected.id }}">{{ t('assets.import_template') }}</a></p>
|
|
{% endif %}
|
|
|
|
<label>Excel-Datei
|
|
<input type="file" name="file" accept=".xlsx" required>
|
|
</label>
|
|
|
|
<label class="checkbox-label">
|
|
<input class="checkbox" type="checkbox" name="import_only_active_fields" {% if import_only_active_fields %}checked{% endif %}>
|
|
Import only active fields
|
|
</label>
|
|
<p class="muted">
|
|
Standardmäßig werden alle bekannten und für den Excel-Import freigegebenen Felder übernommen,
|
|
auch wenn sie in der jeweiligen Kategorie nicht aktiv oder sichtbar sind.
|
|
Aktiviere diese Option nur, wenn der Import auf die aktiven Felder der Kategorie begrenzt werden soll.
|
|
</p>
|
|
|
|
<div class="form-actions">
|
|
<button type="submit" class="button button-secondary" name="import_mode" value="dry_run">🧪 Test-Import</button>
|
|
<button type="submit" class="button button-save" name="import_mode" value="import">{{ t('assets.import_start') }}</button>
|
|
</div>
|
|
<p class="muted">Der Test-Import prüft dieselbe Datei mit derselben Logik, führt aber am Ende einen vollständigen Datenbank-Rollback durch.</p>
|
|
</form>
|
|
</section>
|
|
|
|
{% if result %}
|
|
<section class="panel">
|
|
<h2>{% if result.dry_run %}Ergebnis des Test-Imports{% else %}Importergebnis{% endif %}</h2>
|
|
{% if result.dry_run %}
|
|
<div class="notice"><strong>Testlauf:</strong> Es wurden keine Daten gespeichert. Die Zähler und Zeilenergebnisse zeigen, was ein echter Import ausführen würde.</div>
|
|
{% endif %}
|
|
<dl class="config-list">
|
|
<dt>Neu angelegt</dt><dd>{{ result.created }}</dd>
|
|
<dt>Aktualisiert</dt><dd>{{ result.updated }}</dd>
|
|
<dt>Unverändert</dt><dd>{{ result.skipped }}</dd>
|
|
</dl>
|
|
{% if result.unknown_headers %}
|
|
<h3>Nicht erkannte Spalten</h3>
|
|
<p>{{ result.unknown_headers|join(', ') }}</p>
|
|
{% endif %}
|
|
{% if result.row_results %}
|
|
<h3>Ergebnis je Excel-Zeile</h3>
|
|
<div class="table-scroll">
|
|
<table class="data-table">
|
|
<thead><tr><th>Excel-Zeile</th><th>Asset-ID</th><th>Aktion</th><th>Begründung</th></tr></thead>
|
|
<tbody>
|
|
{% for row in result.row_results %}
|
|
<tr>
|
|
<td>{{ row.row }}</td>
|
|
<td>{{ row.asset_id }}</td>
|
|
<td>{{ row.action }}</td>
|
|
<td>{{ row.reason }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if result.errors %}
|
|
<h3>Fehlerübersicht</h3>
|
|
<ul>{% for error in result.errors %}<li>{{ error }}</li>{% endfor %}</ul>
|
|
{% endif %}
|
|
</section>
|
|
{% endif %}
|
|
{% endblock %}
|