Add maintenance receipt extraction to the Python OCR microservice. Uses Gemini-primary extraction (send OCR text to Gemini for all field extraction) with regex cross-validation for structured fields (dates, amounts, odometer).
Scope
New MaintenanceReceiptExtractor class (mirrors FuelReceiptExtractor pattern)
Gemini prompt for maintenance receipt field extraction (service name, date, cost, shop name, parts/labor breakdown, odometer, vehicle info)
Regex cross-validation to validate/boost confidence on structured fields
New FastAPI endpoint: POST /extract/maintenance-receipt
Per-field confidence scores (0.0-1.0)
Reuse existing ReceiptExtractionResult dataclass and ReceiptExtractionResponse Pydantic model
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Relates to #16
Summary
Add maintenance receipt extraction to the Python OCR microservice. Uses Gemini-primary extraction (send OCR text to Gemini for all field extraction) with regex cross-validation for structured fields (dates, amounts, odometer).
Scope
MaintenanceReceiptExtractorclass (mirrorsFuelReceiptExtractorpattern)POST /extract/maintenance-receiptReceiptExtractionResultdataclass andReceiptExtractionResponsePydantic modelFiles
ocr/app/extractors/maintenance_receipt_extractor.py(NEW)ocr/app/patterns/maintenance_receipt_validation.py(NEW - cross-validation patterns)ocr/app/routers/extract.py(MODIFY - add new route)Technical Notes
FuelReceiptExtractorpattern: extract first (via Gemini), cross-validate second (via regex)manual_extractor.pypatternReceiptExtractionResultdataclass (genericdict[str, ExtractedField]supports arbitrary field keys)ReceiptExtractionResponsePydantic model (same response shape,receiptType: "maintenance")maintenance_receipt_validation.py(NOTmaintenance_receipt_patterns.pyto avoid collision with existingmaintenance_patterns.py)Acceptance Criteria
Milestone: Implementation Complete
Phase: Execution | Agent: Developer | Status: PASS
Summary
All three milestones implemented in a single commit (
90401dc):Milestone 1: Cross-validation patterns
ocr/app/patterns/maintenance_receipt_validation.py(NEW)MaintenanceReceiptValidatorclass with per-field validationdate_matcher(existing patterns)currency_matcher(existing patterns)MaintenanceReceiptValidationwith per-field confidence adjustmentsMilestone 2: Maintenance receipt extractor
ocr/app/extractors/maintenance_receipt_extractor.py(NEW)MaintenanceReceiptExtractorclass followingFuelReceiptExtractorpatternMilestone 3: New endpoint
ocr/app/routers/extract.py(MODIFIED)POST /extract/maintenance-receiptendpointReceiptExtractionResponsePydantic model (receiptType: "maintenance")/receiptendpoint validation pattern (400/413/422 errors)extractors/__init__.pyandpatterns/__init__.pyexportsTechnical Decisions
GeminiEngine)receipt_extractor.extract()for OCR, then replaces fields with Gemini resultsVerdict: PASS | Next: QR post-implementation review