ZUGFeRD
This commit is contained in:
parent
9c02b1a454
commit
068e6627d9
51
main.py
51
main.py
|
|
@ -20,6 +20,7 @@ if "invoice_counter" not in st.session_state:
|
||||||
# 1. API-CLIENT FÜR DAS vLLM-BACKEND
|
# 1. API-CLIENT FÜR DAS vLLM-BACKEND
|
||||||
# ==========================================
|
# ==========================================
|
||||||
class LLMClient:
|
class LLMClient:
|
||||||
|
"""Client für das vLLM-Backend (OpenAI-kompatibel) mit JSON-Schema-Unterstützung."""
|
||||||
|
|
||||||
def __init__(self, model="gemma431b", base_url="http://10.192.0.140:8002"):
|
def __init__(self, model="gemma431b", base_url="http://10.192.0.140:8002"):
|
||||||
self.model = model
|
self.model = model
|
||||||
|
|
@ -350,7 +351,9 @@ with col1:
|
||||||
uploaded_file = st.file_uploader("Wähle eine Rechnungs-PDF", type=["pdf"])
|
uploaded_file = st.file_uploader("Wähle eine Rechnungs-PDF", type=["pdf"])
|
||||||
pdf_text = ""
|
pdf_text = ""
|
||||||
if uploaded_file is not None:
|
if uploaded_file is not None:
|
||||||
doc = fitz.open(stream=uploaded_file.read(), filetype="pdf")
|
# Optimierung: Nutze getvalue(), damit die PDF-Bytes später für ZUGFeRD erhalten bleiben
|
||||||
|
pdf_data = uploaded_file.getvalue()
|
||||||
|
doc = fitz.open(stream=pdf_data, filetype="pdf")
|
||||||
for page in doc:
|
for page in doc:
|
||||||
pdf_text += page.get_text("text") + "\n"
|
pdf_text += page.get_text("text") + "\n"
|
||||||
st.success("PDF eingelesen!")
|
st.success("PDF eingelesen!")
|
||||||
|
|
@ -545,8 +548,14 @@ with col2:
|
||||||
with c_vat_ui: st.metric("MwSt-Gesamt (€)", f"{computed_vat_amount:.2f}")
|
with c_vat_ui: st.metric("MwSt-Gesamt (€)", f"{computed_vat_amount:.2f}")
|
||||||
with c_gross_ui: st.metric("Brutto-Zahlbetrag (€)", f"{computed_gross_amount:.2f}")
|
with c_gross_ui: st.metric("Brutto-Zahlbetrag (€)", f"{computed_gross_amount:.2f}")
|
||||||
|
|
||||||
|
# --- NEU: DYNAMISCHE EXPORT-SEKTION FÜR ZUGFeRD ODER XRECHNUNG ---
|
||||||
st.markdown("---")
|
st.markdown("---")
|
||||||
if st.button("🔒 XRechnung exportieren", type="primary", width="stretch"):
|
export_format = st.selectbox(
|
||||||
|
"💾 Export-Format wählen",
|
||||||
|
options=["XRechnung (Reines XML)", "ZUGFeRD (Hybrid-PDF mit eingebettetem XML)"],
|
||||||
|
help="XRechnung generiert eine reine XML-Datei. ZUGFeRD bettet dieses XML direkt in dein originales PDF-Dokument ein."
|
||||||
|
)
|
||||||
|
|
||||||
final_invoice_dict = {
|
final_invoice_dict = {
|
||||||
"invoice_type_code": selected_type_code,
|
"invoice_type_code": selected_type_code,
|
||||||
"invoice_number": inv_num, "invoice_date": inv_date, "delivery_date": inv_delivery,
|
"invoice_number": inv_num, "invoice_date": inv_date, "delivery_date": inv_delivery,
|
||||||
|
|
@ -561,7 +570,43 @@ with col2:
|
||||||
"service_end_date": s_end,
|
"service_end_date": s_end,
|
||||||
"invoice_note": i_note
|
"invoice_note": i_note
|
||||||
}
|
}
|
||||||
st.download_button(label="📥 Download XML", data=generate_compliant_xrechnung(final_invoice_dict), file_name=f"XRechnung_{inv_num}.xml", mime="text/xml")
|
|
||||||
|
xml_string = generate_compliant_xrechnung(final_invoice_dict)
|
||||||
|
|
||||||
|
if export_format == "XRechnung (Reines XML)":
|
||||||
|
st.download_button(
|
||||||
|
label="📥 XRechnung XML herunterladen",
|
||||||
|
data=xml_string,
|
||||||
|
file_name=f"XRechnung_{inv_num}.xml",
|
||||||
|
mime="text/xml",
|
||||||
|
type="primary",
|
||||||
|
use_container_width=True
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
# ZUGFeRD: Nutzt PyMuPDF, um das XML direkt in die hochgeladene PDF einzubetten
|
||||||
|
original_pdf_bytes = uploaded_file.getvalue()
|
||||||
|
doc = fitz.open(stream=original_pdf_bytes, filetype="pdf")
|
||||||
|
doc.embedded_file_add(
|
||||||
|
"factur-x.xml",
|
||||||
|
xml_string.encode("utf-8"),
|
||||||
|
filename="factur-x.xml",
|
||||||
|
desc="Factur-X/ZUGFeRD E-Invoice",
|
||||||
|
mimetype="text/xml"
|
||||||
|
)
|
||||||
|
zugferd_pdf_bytes = doc.write()
|
||||||
|
doc.close()
|
||||||
|
|
||||||
|
st.download_button(
|
||||||
|
label="📥 ZUGFeRD Hybrid-PDF herunterladen",
|
||||||
|
data=zugferd_pdf_bytes,
|
||||||
|
file_name=f"ZUGFeRD_{inv_num}.pdf",
|
||||||
|
mime="application/pdf",
|
||||||
|
type="primary",
|
||||||
|
use_container_width=True
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Fehler bei der ZUGFeRD-Generierung: {e}")
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# FOOTER
|
# FOOTER
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue