Receipt upload — auto-extracting expense items from photos

Instead of typing every expense item by hand, you can snap a photo of the receipt and let Turtini fill in the fields for you. Works for paper receipts, PDF invoices, and emailed order confirmations rendered as images.

How to upload:
1. Workforce → Expense Reports → open the report
2. Tap "Attach receipt" on a new or existing line item
3. Pick a source — phone camera, drag-and-drop into the browser, or file picker
4. The image uploads to your org's secure receipt storage and the platform's image-moderation pipeline runs in the background
5. Turtini sends the image to Claude Vision for structured extraction — vendor, date, total, category guess, and a one-line description pre-fill the item
6. Review and edit before saving — extraction is fast but not perfect

What gets extracted:
• Vendor / merchant name
• Date of purchase (YYYY-MM-DD)
• Total amount
• A category guess from: meals, travel, lodging, transportation, supplies, entertainment, utilities, software, other
• A short one-line description ready to drop into the form (e.g. "Client dinner at Nobu")
• A confidence level for the overall read — high, medium, or low

Files and limits:
• Image formats: standard image types (JPG, PNG, HEIC, WebP). SVGs are not accepted.
• Max size: 15 MB per receipt (enforced at upload by Storage rules).
• Each receipt lives under `expense-receipts/{orgId}/{reportId}/{itemId}_...` and is processed against that specific item.

When the AI is unsure:
• Individual fields that can't be read confidently come back as null — you'll see empty vendor or total and fill them in.
• The whole extraction is tagged with a confidence level so the UI can flag low-confidence reads for closer review.
• Unreadable images return an error and the item stays empty; re-take the photo with better lighting and try again.
• Hand-written receipts work, but accuracy drops — verify carefully.

Privacy and retention:
• Receipt photos live in your org's Storage bucket under `expense-receipts/{orgId}/...` — only authenticated org members can read them.
• The original image is kept alongside the expense item until the item is deleted, so a manager reviewing the report can always inspect the source.
• Images run through Google Cloud Vision SafeSearch like every other upload. A flagged image holds the item until an admin clears it.

Receipt OCR runs on Claude Vision (Anthropic). The model is called once per receipt — the extracted fields come back to the form, but nothing else is persisted by the OCR step itself.