diff --git a/VERSION b/VERSION index 8c57128..ef93bcc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.18 +2.2.19 diff --git a/app/emails/backend/router.py b/app/emails/backend/router.py index a4a2392..cba785a 100644 --- a/app/emails/backend/router.py +++ b/app/emails/backend/router.py @@ -9,7 +9,7 @@ from typing import List, Optional, Dict from pydantic import BaseModel from datetime import datetime, date -from app.core.database import execute_query, execute_insert, execute_update +from app.core.database import execute_query, execute_insert, execute_update, execute_query_single from app.services.email_processor_service import EmailProcessorService from app.services.email_workflow_service import email_workflow_service from app.services.ollama_service import ollama_service @@ -633,6 +633,33 @@ async def extract_vendor_suggestion(email_id: int): from app.core.config import settings own_cvr = getattr(settings, 'OWN_CVR', '') + # ── Hurtig genvej: brug allerede-udtrukket vendor-data fra PDF ────── + # (sat af email_analysis_service ved email-modtagelse, v2.2.18+) + pre_cvr = email.get('extracted_vendor_cvr') + pre_name = email.get('extracted_vendor_name') + if pre_cvr and pre_cvr != own_cvr and not is_placeholder_cvr(pre_cvr): + # Forsøg CVR-opslag i vendors-tabel + vendor_row = execute_query_single( + "SELECT id, name, cvr_number, phone, email, address FROM vendors WHERE cvr_number = %s", + (pre_cvr,) + ) + suggestion = { + "name": (vendor_row and vendor_row.get('name')) or pre_name or None, + "cvr_number": pre_cvr, + "phone": (vendor_row and vendor_row.get('phone')) or None, + "email": (vendor_row and vendor_row.get('email')) or None, + "address": (vendor_row and vendor_row.get('address')) or None, + "domain": None, + "source": "pdf_extraction", + "vendor_id": vendor_row.get('id') if vendor_row else None, + "confidence": 0.95, + } + logger.info( + f"⚡ Hurtig vendor-suggestion fra PDF-extraction for email {email_id}: " + f"CVR={pre_cvr}, vendor_id={suggestion['vendor_id']}" + ) + return suggestion + def resolve_file_path(raw_path: str) -> Optional[str]: """Løs relativ/absolut filsti — prøv /app-prefix i Docker""" import os diff --git a/app/emails/frontend/emails.html b/app/emails/frontend/emails.html index 308664d..d7f74d8 100644 --- a/app/emails/frontend/emails.html +++ b/app/emails/frontend/emails.html @@ -2347,6 +2347,26 @@ async function quickCreateVendor(emailId, senderName, senderEmail) { const resp = await fetch(`/api/v1/emails/${emailId}/extract-vendor-suggestion`, { method: 'POST' }); if (resp.ok) { const s = await resp.json(); + + // ── Hurtig genvej: leverandøren kendes allerede (vendor_id fra PDF) ── + if (s.vendor_id && s.source === 'pdf_extraction') { + bootstrap.Modal.getInstance(document.getElementById('quickCreateVendorModal')).hide(); + // Auto-link direkte + const linkResp = await fetch(`/api/v1/emails/${emailId}/link`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ supplier_id: s.vendor_id }) + }); + if (linkResp.ok) { + showSuccess(`Leverandør "${s.name || s.cvr_number}" auto-linket fra faktura-PDF`); + loadEmailDetail(parseInt(emailId)); + } else { + showError('Auto-link fejlede — åbner formularen'); + modal.show(); + } + return; + } + if (s.name && s.name !== senderName) document.getElementById('qvVendorName').value = s.name; if (s.cvr_number) document.getElementById('qvVendorCVR').value = s.cvr_number; if (s.phone) document.getElementById('qvVendorPhone').value = s.phone; @@ -2355,7 +2375,9 @@ async function quickCreateVendor(emailId, senderName, senderEmail) { if (s.email && !document.getElementById('qvVendorEmail').value) document.getElementById('qvVendorEmail').value = s.email; - const srcLabel = s.source === 'ai' ? '🤖 AI' : '🔍 Regex'; + const srcLabel = s.source === 'pdf_extraction' ? '📄 PDF-faktura' + : s.source === 'ai' ? '🤖 AI' + : '🔍 Regex'; document.getElementById('qvAiStatus').innerHTML = `${srcLabel} – felter preudfyldt`; } else {