This commit is contained in:
Aron Petau 2025-10-08 16:22:23 +02:00
parent 2d69d919a6
commit a6d498bda0
3 changed files with 271 additions and 18 deletions

View file

@ -1,6 +1,7 @@
import os
import asyncio
from io import BytesIO
from datetime import datetime
from nio import AsyncClient, UploadResponse, RoomSendResponse
@ -22,27 +23,67 @@ async def send_order(pdf_path: str, analysis: dict, room_id: str, name: str, com
if getattr(login_resp, "access_token", None) is None:
raise RuntimeError(f"Failed to login to Matrix: {login_resp}")
# Build German summary text
# Determine if document is color or B&W
has_color = analysis['total_area_color'] > 0
color_marker = "Farbe" if has_color else "SW"
# Generate new filename: ISO timestamp, name, price, color marker
# Format: YYYY-MM-DDTHHMM_Name_PriceEUR_ColorMarker.pdf
timestamp = datetime.now().strftime("%Y-%m-%dT%H%M")
# Sanitize name for filename (remove special chars, limit length)
safe_name = "".join(c for c in name if c.isalnum() or c in (' ', '-', '_')).strip()
safe_name = safe_name.replace(' ', '_')[:30] # Max 30 chars
# Use underscore instead of decimal point/comma for price
price_str = f"{analysis['grand_total']:.2f}".replace('.', '_')
new_filename = f"{timestamp}_{safe_name}_{price_str}EUR_{color_marker}.pdf"
# Build condensed German summary - focus on key info
summary_lines = [
f"📄 Datei: {analysis['filename']}",
f"👤 Name: {name}",
"=== NEUER DRUCKAUFTRAG ===",
"",
f"💰 Gesamtkosten: {analysis['grand_total']:.2f}",
f" - S/W: {analysis['total_area_black']:.2f} m² = {analysis['total_cost_black']:.2f}",
f" - Farbe: {analysis['total_area_color']:.2f} m² = {analysis['total_cost_color']:.2f}",
"",
"📝 Seitenübersicht:"
f"Name: {name}",
f"Preis: {analysis['grand_total']:.2f} EUR",
]
for page in analysis["pages"]:
seitenart = "Farbe" if page["is_color"] else "S/W"
# Add comment prominently if provided
if comment.strip():
summary_lines.extend([
"",
f"Kommentar:",
f"{comment.strip()}",
])
# Add compact breakdown
summary_lines.extend([
"",
"Details:",
])
if analysis['total_area_black'] > 0:
summary_lines.append(
f"Seite {page['page']}: {page['width_m']*1000:.0f}×{page['height_m']*1000:.0f} mm, "
f"{seitenart}, Kosten {page['cost']:.2f}"
f" - S/W: {analysis['total_area_black']:.2f} m2 -> {analysis['total_cost_black']:.2f} EUR"
)
if comment.strip():
summary_lines.append("\n💬 Nutzerkommentar:\n" + comment.strip())
if analysis['total_area_color'] > 0:
summary_lines.append(
f" - Farbe: {analysis['total_area_color']:.2f} m2 -> {analysis['total_cost_color']:.2f} EUR"
)
# Add page count summary
total_pages = len(analysis['pages'])
color_pages = sum(1 for p in analysis['pages'] if p['is_color'])
bw_pages = total_pages - color_pages
summary_lines.append(f" - Seiten: {total_pages} gesamt ({bw_pages} S/W, {color_pages} Farbe)")
# Optional: Add detailed page breakdown for small documents
if total_pages <= 5: # Only show details for small documents
summary_lines.append("")
summary_lines.append("Seiten:")
for page in analysis["pages"]:
seitenart = "Farbe" if page["is_color"] else "S/W"
summary_lines.append(
f" - S.{page['page']}: {page['width_m']*1000:.0f}x{page['height_m']*1000:.0f}mm, {seitenart}, {page['cost']:.2f} EUR"
)
summary_text = "\n".join(summary_lines)
@ -55,14 +96,14 @@ async def send_order(pdf_path: str, analysis: dict, room_id: str, name: str, com
if not (isinstance(text_resp, RoomSendResponse) and text_resp.event_id):
raise RuntimeError(f"Failed to send order summary: {text_resp}")
# Upload PDF
# Upload PDF with new filename
with open(pdf_path, "rb") as f:
pdf_bytes = f.read()
upload_resp, upload_err = await client.upload(
data_provider=BytesIO(pdf_bytes),
content_type="application/pdf",
filename=os.path.basename(pdf_path),
filename=new_filename, # Use generated filename
filesize=len(pdf_bytes),
)
@ -75,14 +116,14 @@ async def send_order(pdf_path: str, analysis: dict, room_id: str, name: str, com
message_type="m.room.message",
content={
"msgtype": "m.file",
"body": os.path.basename(pdf_path),
"body": new_filename, # Display new filename
"url": upload_resp.content_uri,
},
)
if not (isinstance(file_resp, RoomSendResponse) and file_resp.event_id):
raise RuntimeError(f"Failed to send PDF message: {file_resp}")
print(f"Text summary and PDF sent to room {room_id}")
print(f"Order sent to room {room_id} as {new_filename}")
finally:
await client.logout()