From dff3c4471b0be1f46d194a97e5b7a777e4e7ba7e Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Fri, 3 Jul 2026 10:14:31 +0200 Subject: [PATCH] Tabelle anpassen --- main.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/main.py b/main.py index eb52f51..4ac73ca 100644 --- a/main.py +++ b/main.py @@ -169,10 +169,10 @@ def extract_invoice_items_pure_python(text): desc_lines.insert(0, prev_line) - # REPARATUR & OPTIMIERUNG FÜR BT-153 UND BT-154: + # OPTIMIERUNG: Fügt die restlichen Zeilen jetzt als sauberen Fließtext (" ") statt untereinander (\n) zusammen if desc_lines: - item_name = desc_lines[0].strip() # Die erste Zeile wird der prägnante Artikelname (BT-153) - item_description = "\n".join(desc_lines[1:]).strip() if len(desc_lines) > 1 else "" # Restliche Zeilen werden Zusatzbeschreibung (BT-154) + item_name = desc_lines[0].strip() + item_description = " ".join(desc_lines[1:]).strip() if len(desc_lines) > 1 else "" items.append({ "name": item_name, @@ -223,7 +223,6 @@ def generate_compliant_xrechnung(data): computed_due = (datetime.today() + timedelta(days=14)).strftime("%Y-%m-%d") ET.SubElement(root, f"{{{CBC}}}DueDate").text = computed_due - # ERWEITERT: Nutzt nun den flexiblen Code aus dem Dropdown-Menü (BT-3) ET.SubElement(root, f"{{{CBC}}}InvoiceTypeCode").text = str(data.get("invoice_type_code", "380")) if data.get("invoice_note") and str(data["invoice_note"]).strip() != "": @@ -320,7 +319,6 @@ def generate_compliant_xrechnung(data): ET.SubElement(monetary_total, f"{{{CBC}}}TaxInclusiveAmount", {"currencyID": "EUR"}).text = f"{data['total_gross_amount']:.2f}" ET.SubElement(monetary_total, f"{{{CBC}}}PayableAmount", {"currencyID": "EUR"}).text = f"{data['total_gross_amount']:.2f}" - # --- POSITIONEN SCHLEIFE --- for index, item in enumerate(data["items"], start=1): line = ET.SubElement(root, f"{{{CAC}}}InvoiceLine") ET.SubElement(line, f"{{{CBC}}}ID").text = str(index) @@ -334,11 +332,8 @@ def generate_compliant_xrechnung(data): ET.SubElement(line, f"{{{CBC}}}LineExtensionAmount", {"currencyID": "EUR"}).text = f"{item['total_amount']:.2f}" item_elem = ET.SubElement(line, f"{{{CAC}}}Item") - - # BT-153: Der prägnante Name der Dienstleistung/Ware ET.SubElement(item_elem, f"{{{CBC}}}Name").text = str(item.get("name", "Dienstleistung")) - # BT-154: Die detaillierte Zusatzbeschreibung if item.get("description") and str(item["description"]).strip() != "": ET.SubElement(item_elem, f"{{{CBC}}}Description").text = str(item["description"]).strip() @@ -510,26 +505,26 @@ with col2: r_city = st.text_input("Stadt (Kunde)", value=data.get("recipient_city", "")) # ========================================== -# 6. ENTKOPPELTES POSITIONEN FRONTEND (VOLLBREITE) +# 6. ENTKOPPELTES POSITIONEN FRONTEND (VOLLBREITE OBERFLÄCHE) # ========================================== -# Wir verlassen hier die Spalten-Einschränkung (col2) komplett, damit die Tabelle 100% Breite bekommt. if st.session_state.extracted_data: data = st.session_state.extracted_data st.markdown("### 3. Positionen") - # 🔥 NEU: Volle Container-Breite und saubere Spaltenskalierung ohne horizontales Quetschen + # 🔥 FIX: Feste Pixelbreiten für die Spalten konfigurieren und 'use_container_width=True' nutzen! + # Numerische Spalten bleiben kompakt (90px - 130px), Textspalten erhalten massiven Platz (250px - 500px). edited_items = st.data_editor( data.get("items", []), num_rows="dynamic", - use_container_width=True, # Nutzt die komplette Bildschirmbreite (Wide-Layout) + use_container_width=True, column_config={ - "name": st.column_config.TextColumn("Artikelname (BT-153)", width="medium", required=True), - "description": st.column_config.TextColumn("Zusatzbeschreibung (BT-154)", width="large"), - "quantity": st.column_config.NumberColumn("Menge", width="small", format="%.4f"), - "unit": st.column_config.TextColumn("Einheit", width="small"), - "unit_price": st.column_config.NumberColumn("Einzelpreis (€)", width="small", format="%.2f"), - "total_amount": st.column_config.NumberColumn("Gesamtbetrag (€)", width="small", format="%.2f", disabled=True) + "name": st.column_config.TextColumn("Artikelname (BT-153)", width=250, required=True), + "description": st.column_config.TextColumn("Zusatzbeschreibung (BT-154)", width=500), + "quantity": st.column_config.NumberColumn("Menge", width=90, format="%.4f"), + "unit": st.column_config.TextColumn("Einheit", width=90), + "unit_price": st.column_config.NumberColumn("Einzelpreis (€)", width=110, format="%.2f"), + "total_amount": st.column_config.NumberColumn("Gesamtbetrag (€)", width=130, format="%.2f", disabled=True) } ) @@ -575,7 +570,7 @@ st.markdown("---") st.caption( "📝 **Hinweise:**\n\n" "**Human-in-the-Loop:** " - "Das Tool dient als Automation-Assistent. Vor dem finalen XML-Export ist eine visuelle Endkontrolle der extrahierten Daten " + "Das Tool dient als Automations-Assistent. Vor dem finalen XML-Export ist eine visuelle Endkontrolle der extrahierten Daten " "(insbesondere Rechnungsnummer und Empfängeradresse) durch den Sachbearbeiter zwingend erforderlich.\n\n" "**GoBD-Konformität:** " "Das Tool generiert ausschließlich das strukturierte XML-Format. Für die Einhaltung der GoBD-Richtlinien "