Skip to Content

Schema: ai_invoice_processor

Schema: ai_invoice_processor

Technical Truth - Models, API endpoints, and data structures


Module Overview

Attribute Value
Technical Name ai_invoice_processor
Version 18.0.1.0.1
Total Models 4 regular + 1 transient inherit
Standalone Classes 1 (EmailInvoiceMonitor - not an Odoo model)
Total Controllers 0
API Endpoints 0 (uses scheduled actions)
Note Security file has 2 orphan rules for non-existent models

Models

ai.invoice.config (Primary Model)

Purpose: Stores configuration for AI invoice processing including OpenAI API settings, email server credentials, and processing preferences.

Field Type Required Description
name Char Yes Configuration name
active Boolean No Enable/disable this config
openai_api_key Char Yes OpenAI API key for GPT-4 Vision
openai_model Selection Yes Model: gpt-4o, gpt-4-vision-preview, gpt-4
max_tokens Integer No Maximum tokens for AI response (default: 2000)
temperature Float No AI creativity 0.0-1.0 (default: 0.1)
openai_timeout Integer No API timeout in seconds (default: 60)
email_server Char Yes IMAP server address (default: imap.gmail.com)
email_port Integer No IMAP port (default: 993)
email_username Char Yes Email login username
email_password Char Yes Email password/app password
email_folder Char No Folder to monitor (default: INBOX)
email_processed_folder Char No Move processed emails here
use_ssl Boolean No Use SSL connection (default: True)
auto_process Boolean No Enable automatic processing
confidence_threshold Float No Minimum confidence score (0-1, default: 0.8)
check_interval Integer No Check interval in minutes (default: 15)
max_daily_api_calls Integer No Daily API call limit (default: 1000)
default_expense_account_id Many2one No Default expense account
default_currency_id Many2one No Default currency
auto_create_suppliers Boolean No Auto-create new suppliers (default: True)
auto_validate_invoices Boolean No Auto-validate invoices (default: False)
attach_original_pdf Boolean No Attach PDF to invoice (default: True)
extract_line_items Boolean No Extract individual line items (default: True)
min_line_items Integer No Minimum line items required (default: 1)
require_vat_number Boolean No Require VAT number extraction
fallback_to_ocr Boolean No Use OCR if AI fails (default: True)
email_filter_keywords Text No Keywords to filter emails
excluded_senders Text No Email addresses to exclude
custom_ai_prompt Text No Custom instructions for AI
total_processed Integer No Statistics: total processed (readonly)
successful_extractions Integer No Statistics: successful (readonly)
failed_extractions Integer No Statistics: failed (readonly)
total_api_cost Float No Total API cost in $ (readonly)
last_processing_date Datetime No Last processing timestamp (readonly)
processing_log_ids One2many No Related processing logs

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| test_openai_connection() | Test OpenAI API connectivity | Notification action |
| test_email_connection() | Test IMAP email connection | Notification action |
| update_statistics() | Update processing stats | None |
| get_active_config() | Get first active config | ai.invoice.config record |
| cron_reset_daily_stats() | Reset daily counters, cleanup old logs | None |
| cron_health_check() | Check API and config health | None |

Relationships:
- default_expense_account_id → account.account (Many2one)
- default_currency_id → res.currency (Many2one)
- processing_log_ids → ai.processing.log (One2many)


ai.processing.log

Purpose: Tracks each invoice processing attempt with status, extracted data, errors, and created records.

Field Type Required Description
config_id Many2one Yes Parent configuration
email_subject Char No Email subject line
email_sender Char No Sender email address
pdf_filename Char No PDF attachment filename
received_date Datetime No Email received date
status Selection No processing / success / failed
supplier_name Char No Extracted supplier name
invoice_number Char No Extracted invoice number
invoice_total Float No Extracted total amount
processing_time Float No Processing duration in seconds
api_cost Float No API cost for this extraction
confidence_score Float No AI confidence score
extracted_data Text No Raw JSON extracted data
error_message Text No Error details if failed
created_invoice_id Many2one No Created Odoo invoice
supplier_id Many2one No Matched/created supplier

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| reprocess_invoice() | Retry failed extraction | Notification action |

Relationships:
- config_id → ai.invoice.config (Many2one)
- created_invoice_id → account.move (Many2one)
- supplier_id → res.partner (Many2one)


invoice.extractor

Purpose: AI-powered invoice data extraction engine using GPT-4 Vision. Handles universal extraction without supplier-specific templates.

Field Type Required Description
(no stored fields) - - Utility model with methods only

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| extract_invoice_data(pdf_content, supplier_id) | Universal AI extraction | dict of invoice data |
| create_supplier_invoice(extracted_data, pdf_attachment) | Create Odoo invoice | account.move record |
| _extract_with_gpt4_vision() | GPT-4 Vision extraction | dict or None |
| _extract_with_ocr_llm() | Fallback OCR + LLM | dict or None |
| _pdf_to_image() | Convert PDF to base64 image | string |
| _build_universal_prompt() | Generate AI extraction prompt | string |
| _standardize_extracted_data() | Normalize extracted data | dict |
| _find_or_create_supplier() | Match or create partner | res.partner record |


supplier.invoice.processor

Purpose: Main orchestrator that ties email monitoring and invoice creation together. Called by scheduled actions.

Field Type Required Description
(no stored fields) - - Utility model with methods only

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| process_email_invoices() | Main processing loop (called by cron) | None |
| cron_manual_test() | Manual test runner | bool |
| _fetch_invoice_emails() | Get emails with PDF attachments | list of dicts |


Scheduled Actions (Cron Jobs)

Name Model Method Interval Active
AI Invoice Email Monitor supplier.invoice.processor process_email_invoices() 15 minutes Yes
AI Invoice Daily Stats Reset ai.invoice.config cron_reset_daily_stats() 1 day Yes
AI Invoice System Health Check ai.invoice.config cron_health_check() 1 hour No
AI Invoice Manual Test supplier.invoice.processor cron_manual_test() 1 day No

Data Relationships Diagram

┌─────────────────────────────┐
│   ai.invoice.config         │
│                             │
│  - name                     │
│  - openai_api_key           │
│  - email_server/credentials │
│  - processing settings      │
│  - statistics               │
└──────────┬──────────────────┘
           │
           │ One2many (processing_log_ids)
           ▼
┌─────────────────────────────┐
│   ai.processing.log         │
│                             │
│  - config_id (M2O)          │◄────────────────┐
│  - email_subject            │                 │
│  - status                   │                 │
│  - extracted_data (JSON)    │                 │
│  - error_message            │                 │
└──────────┬──────────────────┘                 │
           │                                    │
           │ Many2one                           │
           ▼                                    │
┌─────────────────────────────┐    ┌───────────┴───────┐
│   account.move              │    │   res.partner     │
│   (Odoo Invoice)            │    │   (Supplier)      │
│                             │    │                   │
│  - created_invoice_id       │    │  - supplier_id    │
└─────────────────────────────┘    └───────────────────┘

Security Rules

Model Group Read Write Create Delete
ai.invoice.config account.group_account_user Yes No No No
ai.invoice.config account.group_account_manager Yes Yes Yes Yes
ai.invoice.config base.group_system Yes Yes Yes Yes
ai.processing.log account.group_account_user Yes No No No
ai.processing.log account.group_account_manager Yes Yes Yes Yes
ai.processing.log base.group_system Yes Yes Yes Yes
invoice.extractor base.group_system Yes Yes Yes Yes
supplier.invoice.processor base.group_system Yes Yes Yes Yes
invoice.ai.processor base.group_system Yes Yes Yes Yes
ai.configuration base.group_system Yes Yes Yes Yes

res.config.settings (Transient - Inherits)

Purpose: Adds quick setup fields to Odoo Settings for AI Invoice configuration.

File: models/ai_invoice_config.py

Field Type Required Description
ai_invoice_openai_key Char No Quick setup: OpenAI API Key
ai_invoice_email Char No Quick setup: Invoice email address
ai_invoice_email_password Char No Quick setup: Email password
ai_invoice_auto_process Boolean No Quick setup: Enable auto processing

Key Methods:
| Method | Purpose | Returns |
|--------|---------|---------|
| get_values() | Load values from active ai.invoice.config | dict |
| set_values() | Save values to ai.invoice.config (creates if needed) | None |


EmailInvoiceMonitor (Standalone Python Class - NOT an Odoo Model)

Purpose: Standalone email monitoring daemon that runs outside Odoo's ORM. Monitors inbox and creates invoices via XML-RPC.

File: models/email_monitor_processor.py

Method Purpose Returns
__init__(config) Initialize with config dict None
monitor_inbox() Main loop - monitors inbox continuously Never (loops forever)
_process_new_emails() Check and process new emails None
_process_single_email() Process one email message None
_extract_invoice_data() Extract via GPT-4 Vision dict or None
_create_odoo_invoice() Create invoice via XML-RPC invoice_id or None
_find_or_create_supplier() Find/create partner via XML-RPC partner_id or None
_pdf_to_image() Convert PDF to base64 JPEG string or None

Usage: Run as standalone script or import the class.


Orphan Security Rules (Models Don't Exist)

The following models are defined in ir.model.access.csv but do not exist in the codebase:

Model Status Recommendation
invoice.ai.processor Orphan - no code Remove from security file
ai.configuration Orphan - no code Remove from security file

Database Tables

Table Name Model Purpose
ai_invoice_config ai.invoice.config Configuration storage
ai_processing_log ai.processing.log Processing history

External API Integration

OpenAI GPT-4 Vision API

Endpoint: https://api.openai.com/v1/chat/completions

Request:

{
    "model": "gpt-4o",
    "messages": [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "<extraction prompt>"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "data:image/jpeg;base64,<image_data>"
                    }
                }
            ]
        }
    ],
    "max_tokens": 2000,
    "temperature": 0.1
}

Response (extracted data):

{
    "vendor_name": "ACME Corp",
    "vendor_vat": "US123456789",
    "invoice_number": "INV-2025-001",
    "invoice_date": "2025-01-15",
    "due_date": "2025-02-15",
    "currency": "USD",
    "total_amount": 1500.00,
    "total_untaxed": 1250.00,
    "total_tax": 250.00,
    "line_items": [
        {
            "description": "Consulting Services",
            "quantity": 10,
            "unit_price": 125.00,
            "total": 1250.00
        }
    ]
}

Change History

Date Change By
2025-01-26 Initial schema documentation CTO Module Docs Agent
2025-01-26 Corrected model count, documented res.config.settings inherit, EmailInvoiceMonitor standalone class, identified orphan security rules CTO Module Docs Review Agent (10/10)
Was this helpful?