add arcodange-email-ingest — Zoho Mail → Dolibarr supplier-invoice drafts
V8 — first inbound-side skill. Closes the loop from "bill arrives by email"
to "ready to enter in Dolibarr UI". Read-only at every layer.
What ships:
- arcodange-email-ingest/scripts/zoho-curl.sh OAuth wrapper with token cache
(50 min TTL, mode 600) — avoids
hitting Zoho OAuth rate limit on
every invocation.
- arcodange-email-ingest/scripts/email-list.sh List candidates in /Inbox/books
(where the books@ alias auto-
routes mail). --candidates-only
filter on supplier patterns or
attachments. --all-folders to
scan everything.
- arcodange-email-ingest/scripts/email-inspect.sh Pull message + attachments,
pdftotext on each PDF, heuristic
extract (supplier, ref, dates,
totals, VAT rate), emit Dolibarr
supplier-invoice draft JSON.
Architecture choice — Zoho API (not IMAP):
- books@arcodange.fr is an alias of gabrielradureau@arcodange.fr → one OAuth
refresh_token covers everything.
- Gmail folded in via forwarding (arcodange@gmail.com → books@) — no Google
API setup, no app-passwords, no second OAuth flow.
- Token-based auth, no SCA rabbit hole.
V8.0 baseline (in /Inbox/books):
- 3 candidates: Mistral AI facture, Anthropic Stripe receipt (Fwd Gmail),
INPI payment receipt (Fwd Gmail).
- Heuristic extraction is best-effort: works on amounts/refs for some
templates, misses others (Mistral PDF format, Stripe receipt layout).
- --save-pdf <DIR> lets the operator grab the PDFs for manual entry when
the heuristic falls short.
Rate-limit pitfall documented: Zoho OAuth refresh has an aggressive throttle
("too many requests continuously"). The cache file at $TMPDIR/zoho-access-$USER
(mode 600, 50 min TTL) prevents this; on 401 the wrapper auto-refreshes once
and retries.
V8.1+ ideas in SKILL.md out-of-scope:
- mark ingested emails (IMAP flag or Zoho label)
- body text extraction (inline-HTML invoices)
- per-template parsers or LLM-based extraction
- IMAP fallback for non-Zoho mailboxes
CLI: bin/arcodange email {list|inspect|curl} integrated.
Base updates: dolibarr/SKILL.md cross-link, dolibarr/README.md env schema
extended with ZOHO_CLIENT_ID/SECRET/REFRESH_TOKEN/DC.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
================================================================================
|
||||
Email 1775141901205014300
|
||||
================================================================================
|
||||
subject : Votre facture nº MSTRL-API-814045-001 de Mistral AI SAS
|
||||
from : no-reply@mistral.ai
|
||||
date : 2026-04-02
|
||||
attached : True
|
||||
|
||||
-- Attachment 1: invoice-MSTRL-API-814045-001.pdf (74377 bytes, 1771 chars extracted) --
|
||||
pdf_top_line = 'Facture'
|
||||
invoice_ref = 'API-814045-001'
|
||||
invoice_date_raw = None
|
||||
total_ht = None
|
||||
total_tva = None
|
||||
total_ttc = None
|
||||
vat_rate_pct = '20.0'
|
||||
|
||||
Suggested Dolibarr supplier-invoice draft entries:
|
||||
[
|
||||
{
|
||||
"supplier_hint": "Facture",
|
||||
"invoice_ref": "API-814045-001",
|
||||
"invoice_date": null,
|
||||
"total_ht": null,
|
||||
"total_tva": null,
|
||||
"total_ttc": null,
|
||||
"vat_rate_pct": "20.0",
|
||||
"source_email": "1775141901205014300",
|
||||
"source_attachment": "invoice-MSTRL-API-814045-001.pdf"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user