Add fuelLog.receiptScan to FEATURE_TIERS with minTier pro, name Fuel Receipt Scan, upgrade prompt
useReceiptOcr.tsextractReceiptFromImage() calls /ocr/extract/receipt with optional receipt_type=fuel form field
Add tier gating check in FuelLogForm before showing ReceiptCameraButton (use useTierAccess)
Show UpgradeRequiredDialog when non-Pro user taps receipt scan button
Receipt camera button works on both mobile (camera capture) and desktop (file upload)
Receipt button renders correctly on mobile (320px) and desktop (1920px) viewports
Touch targets >= 44px for all interactive elements
Acceptance Criteria
Free tier users see disabled/locked receipt scan button with upgrade prompt
Pro+ users can capture receipt photo and see extraction results
Receipt extraction calls /ocr/extract/receipt
ReceiptOcrReviewModal displays all extracted fields with confidence indicators
User can edit all fields before accepting
Accepted fields populate fuel log form correctly
Works on mobile (camera capture) and desktop (file upload)
Touch targets >= 44px on mobile viewports
Tests
Test files: backend/src/core/config/feature-tiers.test.ts (extend existing)
Test type: unit
Scenarios:
Normal: Pro user accesses fuelLog.receiptScan
Edge: Free user denied access with correct upgrade prompt
Normal: Enterprise user inherits Pro access
Normal: Receipt button renders on mobile (320px) and desktop (1920px) viewports
Relates to #129
## Milestone 2: Tier Gating and Frontend Receipt OCR Flow
### Files
- `backend/src/core/config/feature-tiers.ts`
- `frontend/src/features/fuel-logs/hooks/useReceiptOcr.ts`
- `frontend/src/features/fuel-logs/components/FuelLogForm.tsx`
- `frontend/src/features/fuel-logs/components/ReceiptCameraButton.tsx`
**Flags**: needs conformance check (mobile + desktop)
### Requirements
- Add `fuelLog.receiptScan` to FEATURE_TIERS with minTier `pro`, name `Fuel Receipt Scan`, upgrade prompt
- `useReceiptOcr.ts` `extractReceiptFromImage()` calls `/ocr/extract/receipt` with optional `receipt_type=fuel` form field
- Add tier gating check in FuelLogForm before showing ReceiptCameraButton (use `useTierAccess`)
- Show UpgradeRequiredDialog when non-Pro user taps receipt scan button
- Receipt camera button works on both mobile (camera capture) and desktop (file upload)
- Receipt button renders correctly on mobile (320px) and desktop (1920px) viewports
- Touch targets >= 44px for all interactive elements
### Acceptance Criteria
- Free tier users see disabled/locked receipt scan button with upgrade prompt
- Pro+ users can capture receipt photo and see extraction results
- Receipt extraction calls /ocr/extract/receipt
- ReceiptOcrReviewModal displays all extracted fields with confidence indicators
- User can edit all fields before accepting
- Accepted fields populate fuel log form correctly
- Works on mobile (camera capture) and desktop (file upload)
- Touch targets >= 44px on mobile viewports
### Tests
- **Test files**: `backend/src/core/config/feature-tiers.test.ts` (extend existing)
- **Test type**: unit
- **Scenarios**:
- Normal: Pro user accesses fuelLog.receiptScan
- Edge: Free user denied access with correct upgrade prompt
- Normal: Enterprise user inherits Pro access
- Normal: Receipt button renders on mobile (320px) and desktop (1920px) viewports
All requirements for issue #140 were already implemented on the branch from prior sub-issue work (#135-#139). This milestone verified completeness and fixed one remaining gap.
Verification Results
Requirement
Status
Notes
fuelLog.receiptScan in FEATURE_TIERS (minTier: pro)
PASS
feature-tiers.ts:34-38
useReceiptOcr.ts calls /ocr/extract/receipt
PASS
useReceiptOcr.ts:151
Tier gating check in FuelLogForm
PASS
FuelLogForm.tsx:54-55, 227-238
UpgradeRequiredDialog for non-Pro users
PASS
FuelLogForm.tsx:456-461
Receipt camera button mobile + desktop
PASS
Responsive via variant prop
Button renders on mobile (320px) and desktop (1920px)
PASS
useMediaQuery responsive variants
Touch targets >= 44px
FIXED
c79b610 - Added minHeight/minWidth: 44 to all interactive elements
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 #129
Milestone 2: Tier Gating and Frontend Receipt OCR Flow
Files
backend/src/core/config/feature-tiers.tsfrontend/src/features/fuel-logs/hooks/useReceiptOcr.tsfrontend/src/features/fuel-logs/components/FuelLogForm.tsxfrontend/src/features/fuel-logs/components/ReceiptCameraButton.tsxFlags: needs conformance check (mobile + desktop)
Requirements
fuelLog.receiptScanto FEATURE_TIERS with minTierpro, nameFuel Receipt Scan, upgrade promptuseReceiptOcr.tsextractReceiptFromImage()calls/ocr/extract/receiptwith optionalreceipt_type=fuelform fielduseTierAccess)Acceptance Criteria
Tests
backend/src/core/config/feature-tiers.test.ts(extend existing)Milestone: Tier Gating and Frontend Receipt OCR Flow
Phase: Execution | Agent: Developer | Status: PASS
Implementation Summary
All requirements for issue #140 were already implemented on the branch from prior sub-issue work (#135-#139). This milestone verified completeness and fixed one remaining gap.
Verification Results
fuelLog.receiptScanin FEATURE_TIERS (minTier: pro)feature-tiers.ts:34-38useReceiptOcr.tscalls/ocr/extract/receiptuseReceiptOcr.ts:151FuelLogForm.tsx:54-55, 227-238FuelLogForm.tsx:456-461useMediaQueryresponsive variantsc79b610- Added minHeight/minWidth: 44 to all interactive elementsTests
feature-tiers.test.ts:54-56feature-tiers.test.ts:50-51feature-tiers.test.ts:58-59All 33 feature-tiers tests pass. 0 lint errors. 0 type-check errors.
Changes Made
c79b610- Touch target compliance: AddedminHeight: 44/minWidth: 44to ReceiptCameraButton (both variants), ReceiptOcrReviewModal action buttons, UpgradeRequiredDialog buttons and close iconVerdict: PASS | Next: QR post-implementation review