# Plan: Receipt Scanning Workflow Improvements > **Context Handover Document** - Created for session continuity > **Date**: 2025-12-15 > **Status**: Ready for implementation ## Overview Improve the data-entry-app receipt scanning to: 1. Save supplier name, CUI, and OCR text in drafts 2. Make supplier validation assistive (not blocking) 3. Unify create/edit forms with OCR rescan capability 4. Fix image resize bug (>4000px) 5. **NEW: Extract payment methods (CARD/NUMERAR) from OCR** ## Requirements Summary - **Drafts**: Save `cui` + `partner_name` + `ocr_raw_text` + `payment_methods` from OCR - **Supplier match**: Auto-fill but editable (for assistance, not validation) - **No match**: Show warning only, allow saving draft - **Edit mode**: Allow OCR rescan on existing drafts - **Approval**: Requires valid `cui` only (NOT partner_id) - ROA has stored procedure for supplier lookup - **Image resize**: Cap at 4000px BEFORE upscaling - **Payment methods**: Extract CARD/NUMERAR amounts (after TOTAL LEI, before TOTAL TVA) --- ## Part 1: Backend Model & Database ### 1.1 Add Fields to Receipt Model **File**: `data-entry-app/backend/app/db/models/receipt.py` Add after line 66 (after `partner_name`): ```python cui: Optional[str] = Field(default=None, max_length=20) # Fiscal code from OCR ocr_raw_text: Optional[str] = Field(default=None) # Raw OCR text for debugging payment_methods: Optional[str] = Field(default=None, max_length=500) # JSON: [{"method":"CARD","amount":"50.00"}] ``` ### 1.2 Create Alembic Migration **File**: `data-entry-app/backend/migrations/versions/XXXX_add_ocr_fields.py` ```python def upgrade(): with op.batch_alter_table('receipts') as batch_op: batch_op.add_column(sa.Column('cui', sa.String(20), nullable=True)) batch_op.add_column(sa.Column('ocr_raw_text', sa.Text(), nullable=True)) batch_op.add_column(sa.Column('payment_methods', sa.String(500), nullable=True)) ``` ### 1.3 Update Pydantic Schemas **File**: `data-entry-app/backend/app/schemas/receipt.py` **Add PaymentMethodSchema** (after TvaEntrySchema ~line 75): ```python class PaymentMethodSchema(BaseModel): """Payment method entry (CARD/NUMERAR).""" method: str = Field(description="Payment method: CARD or NUMERAR") amount: Decimal = Field(description="Amount paid with this method") ``` **ReceiptBase** (after line 97): ```python cui: Optional[str] = Field(default=None, max_length=20) ocr_raw_text: Optional[str] = Field(default=None) payment_methods: Optional[List[PaymentMethodSchema]] = Field(default=None, description="Payment methods from OCR") ``` **ReceiptUpdate** (after line 125): ```python cui: Optional[str] = Field(default=None, max_length=20) ocr_raw_text: Optional[str] = Field(default=None) payment_methods: Optional[List[PaymentMethodSchema]] = Field(default=None) ``` **ReceiptResponse**: Add validator to parse `payment_methods` from JSON (similar to `parse_tva_breakdown`) --- ## Part 2: Fix Image Resize Bug **File**: `data-entry-app/backend/app/services/image_preprocessor.py` ### 2.1 Update `preprocess_light()` (after line 55) Add downscale BEFORE upscale: ```python # 2a. Scale DOWN if any side exceeds 4000px (PaddleOCR limit) height, width = gray.shape max_side = max(height, width) if max_side > 4000: scale = 4000 / max_side gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) height, width = gray.shape # 2b. Scale UP if too small if width < 1500: scale = 1500 / width gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) ``` ### 2.2 Update `preprocess_heavy()` (after line 82) Same downscale logic before the existing upscale at lines 85-88. --- ## Part 3: Backend OCR Endpoint - Return Raw Text **File**: `data-entry-app/backend/app/routers/ocr.py` Ensure the OCR extraction endpoint returns `raw_text` in the response (verify this is already included in the OCR service output). --- ## Part 4: Frontend Form Unification ### 4.1 Unify OCR Zone for Create & Edit **File**: `data-entry-app/frontend/src/views/receipts/ReceiptCreateView.vue` **Change line 19** from: ```vue