| name | checkpoint-from-receipt |
| description | Create checkpoints from receipt photos using QR scanning, e-Kasa API, and GPS extraction (10-40s) |
Checkpoint from Receipt Skill
Purpose
Automatically create checkpoints from receipt photos using QR scanning, e-Kasa API, and GPS extraction.
When to Activate
- User pastes image (auto-detect)
- Keywords: "refuel", "fill up", "got gas", "checkpoint", "receipt"
- File extensions: .jpg, .png, .pdf
Instructions
Workflow: 3-Stage Orchestration
QR scan (2-5s) → e-Kasa API (5-30s) → GPS extraction (2-5s) → Checkpoint creation → Gap detection
Total time: 10-40 seconds typically
Stage 1: QR Code Scanning
- When image pasted: "📷 Receipt detected. Scanning QR code..."
- Call:
ekasa-api.scan_qr_code(multi-scale: 1x, 2x, 3x) - Progress:
- "Trying 1x scale..."
- "Trying 2x scale... Found!"
- Extract: receipt_id (e.g., "O-123456789ABC")
If QR not found:
- "QR code not detected. Try better lighting or different angle."
- Fallback: "What's the e-Kasa receipt ID? (starts with O-)"
Stage 2: e-Kasa API (SLOW - Show Progress!)
- Start: "🔄 Fetching from e-Kasa API... (may take up to 60s)"
- Call:
ekasa-api.fetch_receipt_data - Progress updates:
- 15s: "Still fetching... (15s elapsed)"
- 30s: "Almost there... (30s elapsed)"
- 45s: "Taking longer than usual... (45s elapsed)"
If timeout (60s):
- "⏱️ e-Kasa timed out. Options:"
- "1) Retry"
- "2) Manual entry (fuel type, liters, price)"
If success:
- Parse fuel items using Slovak patterns:
- "Diesel", "Nafta", "Motorová nafta"
- "Natural 95", "BA 95", "Benzín 95"
- "Natural 98", "BA 98", "Benzín 98"
- "LPG", "Autoplyn"
- Show: "✅ 52.3L Diesel @ €1.45/L = €75.84"
If multiple fuel items:
- List all items
- Ask: "Which fuel was for your vehicle?"
Stage 3: Dashboard Photo GPS
- Ask: "📸 Now paste dashboard photo for GPS location"
- Call:
dashboard-ocr.extract_metadata - Extract:
- GPS coordinates (latitude, longitude) from EXIF
- Timestamp from EXIF
- Odometer reading (OCR with confidence > 80%)
If GPS found:
- "📍 Location: 48.1486, 17.1077 (Bratislava)"
- Optional: Reverse geocode to show address
If no GPS:
- "📍 No GPS data found. Options:"
- "1) Enable location services and retake photo"
- "2) Enter GPS coordinates manually"
- "3) Enter address (I'll geocode it)"
If OCR odometer found:
- "📊 Detected odometer: 125,340 km (confidence: 92%)"
- "Is this correct? (yes/no)"
If OCR fails or low confidence:
- "What's the current odometer reading in kilometers?"
Stage 4: Create Checkpoint & Detect Gap
Combine data:
- Receipt: fuel_type, fuel_liters, price, vendor, receipt_id
- GPS: latitude, longitude, address (optional)
- Datetime: from receipt or dashboard photo
- Odometer: from OCR or user input
Slovak compliance check:
- Ask for driver name if missing
- Separate refuel timing from trip timing
- Note: Refuel location may differ from trip start/end
Call:
car-log-core.create_checkpointSuccess: "✅ Checkpoint created at 125,340 km!"
Auto-detect gap:
- Call:
car-log-core.detect_gap - If gap > 100km: "⚠️ Gap detected: 820 km over 7 days. Reconstruct trips?"
- If gap detected → Auto-trigger trip-reconstruction skill
- Call:
Timing Breakdown
- QR scan: 2-5 seconds
- e-Kasa API: 5-30 seconds (show progress!)
- GPS extraction: 1-2 seconds
- Checkpoint creation: 1 second
- Gap detection: 1 second
- Total: 10-40 seconds typically
Error Handling
QR Scan Failed
- Try multi-scale (1x, 2x, 3x)
- If all fail: Manual receipt ID entry
e-Kasa Timeout
- Show elapsed time
- Offer retry or manual entry
- Cache successful responses
No GPS
- Fallback to address geocoding
- Manual GPS entry
- Continue without location (warn about compliance)
Multiple Fuel Items
- List all items with prices
- Ask user to select correct one
Ambiguous Geocoding
- Show alternatives with confidence
- Ask user to select correct location
Slovak Compliance
Critical Requirements
- Driver name: Mandatory for tax deduction
- Refuel timing: Separate from trip start/end timing
- Location: Refuel station may differ from trip origin/destination
- L/100km format: Always use European standard
Data Storage
- Store
refuel_datetimeseparately from trip timing - Store
refuel_locationseparately from trip endpoints - Link checkpoint to trips via gap detection
Related Skills
Auto-triggers
- trip-reconstruction: If gap > 100km detected
- data-validation: Automatic validation after checkpoint creation
Links to
- vehicle-setup: If no vehicle registered
- report-generation: After sufficient checkpoints collected
For detailed examples: See GUIDE.md For MCP tools: See REFERENCE.md For timeout troubleshooting: See ../TROUBLESHOOTING.md