fix: exclude OWN_CVR from AI vendor extraction v2.2.25

This commit is contained in:
Christian 2026-03-02 09:01:43 +01:00
parent aabd9f0069
commit 2ed3118c83
3 changed files with 42 additions and 5 deletions

View File

@ -1 +1 @@
2.2.24 2.2.25

View File

@ -2327,6 +2327,37 @@ async def reprocess_uploaded_file(file_id: int):
extracted_fields = llm_result extracted_fields = llm_result
confidence = llm_result.get('confidence', 0.75) confidence = llm_result.get('confidence', 0.75)
# Post-process: clear own CVR if AI mistakenly returned it
extracted_cvr = llm_result.get('vendor_cvr')
own_cvr = getattr(settings, 'OWN_CVR', '')
if extracted_cvr and own_cvr and str(extracted_cvr).replace('DK', '').strip() == str(own_cvr).strip():
logger.warning(f"⚠️ AI returned own CVR ({own_cvr}) as vendor_cvr - clearing it")
llm_result['vendor_cvr'] = None
extracted_cvr = None
# Try to find vendor in DB by extracted CVR or name (overrides detected_vendor_id)
if extracted_cvr:
cvr_clean = str(extracted_cvr).replace('DK', '').strip()
vendor_row = execute_query_single(
"SELECT id FROM vendors WHERE cvr_number = %s AND is_active = true",
(cvr_clean,))
if vendor_row:
vendor_id = vendor_row['id']
logger.info(f"✅ Matched vendor by CVR {cvr_clean}: vendor_id={vendor_id}")
execute_update(
"UPDATE incoming_files SET detected_vendor_id = %s WHERE file_id = %s",
(vendor_id, file_id))
if not vendor_id and llm_result.get('vendor_name'):
vendor_row = execute_query_single(
"SELECT id FROM vendors WHERE name ILIKE %s AND is_active = true ORDER BY id LIMIT 1",
(f"%{llm_result['vendor_name']}%",))
if vendor_row:
vendor_id = vendor_row['id']
logger.info(f"✅ Matched vendor by name '{llm_result['vendor_name']}': vendor_id={vendor_id}")
execute_update(
"UPDATE incoming_files SET detected_vendor_id = %s WHERE file_id = %s",
(vendor_id, file_id))
# Store AI extracted data in extractions table # Store AI extracted data in extractions table
extraction_id = execute_insert( extraction_id = execute_insert(
"""INSERT INTO extractions """INSERT INTO extractions

View File

@ -28,14 +28,20 @@ class OllamaService:
def _build_system_prompt(self) -> str: def _build_system_prompt(self) -> str:
"""Build Danish system prompt for invoice extraction with CVR""" """Build Danish system prompt for invoice extraction with CVR"""
return """Du er en ekspert i at læse og udtrække strukturerede data fra danske fakturaer, kreditnotaer og leverandørdokumenter. own_cvr = getattr(settings, 'OWN_CVR', '29522790')
own_cvr_rule = (
f"4b. KRITISK - LEVERANDØR CVR: CVR {own_cvr} er VORES eget CVR (køberen/modtageren). "
f"Sæt ALDRIG vendor_cvr til {own_cvr}! Leverandørens CVR er CVR-nummeret der hører til "
f"firmaet som har SENDT fakturaen (ikke modtageren).\n"
)
return ("""Du er en ekspert i at læse og udtrække strukturerede data fra danske fakturaer, kreditnotaer og leverandørdokumenter.
VIGTIGE REGLER: VIGTIGE REGLER:
1. Returner KUN gyldig JSON - ingen forklaring eller ekstra tekst 1. Returner KUN gyldig JSON - ingen forklaring eller ekstra tekst
2. Hvis et felt ikke findes, sæt det til null 2. Hvis et felt ikke findes, sæt det til null
3. Beregn confidence baseret hvor sikker du er hvert felt (0.0-1.0) 3. Beregn confidence baseret hvor sikker du er hvert felt (0.0-1.0)
4. Datoer skal være i format YYYY-MM-DD 4. Datoer skal være i format YYYY-MM-DD
5. DANSKE PRISFORMATER: """ + own_cvr_rule + """5. DANSKE PRISFORMATER:
- Tusind-separator kan være . (punkt) eller mellemrum: "5.965,18" eller "5 965,18" - Tusind-separator kan være . (punkt) eller mellemrum: "5.965,18" eller "5 965,18"
- Decimal-separator er , (komma): "1.234,56 kr" - Decimal-separator er , (komma): "1.234,56 kr"
- I JSON output skal du bruge . (punkt) som decimal: 1234.56 - I JSON output skal du bruge . (punkt) som decimal: 1234.56
@ -126,7 +132,7 @@ Output: {
"confidence": 0.95 "confidence": 0.95
}], }],
"confidence": 0.95 "confidence": 0.95
}""" }""")
async def extract_from_text(self, text: str) -> Dict: async def extract_from_text(self, text: str) -> Dict:
""" """