106 lines
4.3 KiB
HTML
106 lines
4.3 KiB
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
<div class="back-row top">
|
|
<a class="big-btn small neutral" href="{{ url_for('leitstand_home') }}">← Zurück</a>
|
|
</div>
|
|
|
|
<div class="card compact">
|
|
<p class="hint">
|
|
Excel- (.xlsx) oder CSV-Datei mit den Spalten <strong>Maschine</strong>, <strong>man. Prio</strong>,
|
|
<strong>FA.-Nr.</strong>, <strong>Rest-Menge</strong>, <strong>Ist-Menge</strong>,
|
|
<strong>Artikel</strong> und <strong>Soll-pro-Stunde</strong> hochladen (weitere Spalten
|
|
wie Bezeichnung/Auftrag/Lieferdatum/Bemerkung werden ignoriert). Bei CSV werden
|
|
Trennzeichen (Komma/Semikolon/Tab) und Zahlformat (1.234,56 oder 1234.56)
|
|
automatisch erkannt.<br>
|
|
Aufträge für unbekannte Maschinen werden verworfen, bereits vorhandene
|
|
FA.-Nrn. bleiben unangetastet. Ist die Rest-Menge 0, wird der Auftrag direkt als
|
|
abgeschlossen angelegt.
|
|
</p>
|
|
<form method="post" action="{{ url_for('leitstand_import') }}" enctype="multipart/form-data" class="compact-form">
|
|
<div class="form-group">
|
|
<label for="datei">Excel- oder CSV-Datei</label>
|
|
<div class="dropzone" id="dropzone">
|
|
<input type="file" id="datei" name="datei" accept=".xlsx,.csv" required>
|
|
<div class="dropzone-text" id="dropzone-text">Datei hierher ziehen oder klicken zum Auswählen</div>
|
|
</div>
|
|
</div>
|
|
<div class="action-row compact">
|
|
<button type="submit" class="big-btn small primary">↑ Importieren</button>
|
|
</div>
|
|
</form>
|
|
<script>
|
|
(function () {
|
|
var zone = document.getElementById('dropzone');
|
|
var input = document.getElementById('datei');
|
|
var text = document.getElementById('dropzone-text');
|
|
if (!zone || !input || !text) return;
|
|
var standardtext = text.textContent;
|
|
|
|
['dragenter', 'dragover'].forEach(function (evtName) {
|
|
zone.addEventListener(evtName, function (e) {
|
|
e.preventDefault();
|
|
zone.classList.add('dragover');
|
|
});
|
|
});
|
|
zone.addEventListener('dragleave', function (e) {
|
|
e.preventDefault();
|
|
zone.classList.remove('dragover');
|
|
});
|
|
zone.addEventListener('drop', function (e) {
|
|
e.preventDefault();
|
|
zone.classList.remove('dragover');
|
|
var dateien = e.dataTransfer && e.dataTransfer.files;
|
|
if (dateien && dateien.length) {
|
|
// Datei aktiv aus dem Drop-Ereignis übernehmen (statt uns auf das
|
|
// native Standardverhalten des überlagerten <input> zu verlassen -
|
|
// das greift nicht zuverlässig, weil wir dragover/drop hier ohnehin
|
|
// abfangen müssen, um die Hervorhebung zu steuern).
|
|
input.files = dateien;
|
|
input.dispatchEvent(new Event('change', { bubbles: true }));
|
|
}
|
|
});
|
|
input.addEventListener('change', function () {
|
|
text.textContent = (input.files && input.files.length) ? input.files[0].name : standardtext;
|
|
});
|
|
})();
|
|
</script>
|
|
</div>
|
|
|
|
{% if ergebnis %}
|
|
<div class="card">
|
|
<h3>Ergebnis</h3>
|
|
<p>
|
|
{{ ergebnis.importiert|length }} importiert,
|
|
{{ ergebnis.uebersprungen_vorhanden|length }} bereits vorhanden (übersprungen),
|
|
{{ ergebnis.verworfen_maschine|length }} wegen unbekannter Maschine verworfen{% if ergebnis.fehlerhafte_zeilen %},
|
|
{{ ergebnis.fehlerhafte_zeilen|length }} fehlerhaft{% endif %}.
|
|
</p>
|
|
|
|
{% if ergebnis.importiert %}
|
|
<details open>
|
|
<summary>Importiert ({{ ergebnis.importiert|length }})</summary>
|
|
<ul>{% for z in ergebnis.importiert %}<li>{{ z }}</li>{% endfor %}</ul>
|
|
</details>
|
|
{% endif %}
|
|
{% if ergebnis.uebersprungen_vorhanden %}
|
|
<details>
|
|
<summary>Bereits vorhanden – übersprungen ({{ ergebnis.uebersprungen_vorhanden|length }})</summary>
|
|
<ul>{% for z in ergebnis.uebersprungen_vorhanden %}<li>{{ z }}</li>{% endfor %}</ul>
|
|
</details>
|
|
{% endif %}
|
|
{% if ergebnis.verworfen_maschine %}
|
|
<details>
|
|
<summary>Maschine unbekannt – verworfen ({{ ergebnis.verworfen_maschine|length }})</summary>
|
|
<ul>{% for z in ergebnis.verworfen_maschine %}<li>{{ z }}</li>{% endfor %}</ul>
|
|
</details>
|
|
{% endif %}
|
|
{% if ergebnis.fehlerhafte_zeilen %}
|
|
<details>
|
|
<summary>Fehlerhafte Zeilen ({{ ergebnis.fehlerhafte_zeilen|length }})</summary>
|
|
<ul>{% for z in ergebnis.fehlerhafte_zeilen %}<li>{{ z }}</li>{% endfor %}</ul>
|
|
</details>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|