The non-negotiable in your post is the whole project, so let me answer that first.
Exact catalog matching is not something you ask a language model to respect. It breaks the moment a reference is close but not identical. The way I would build it, the model never chooses a reference: it only reads the French request and extracts intent, quantities and attributes. The lookup against Getaz Miauton, Sanitas Troesch and Nussbaum is a deterministic search over your own catalog data, keyed on the supplier reference. No exact hit means the line comes back flagged as missing, with the closest candidates shown for a human to confirm. The model writes sentences, never prices.
I learned this the expensive way. An agent I run in production once offered a discount that did not exist, because the price list lived in the prompt. Now prices live in a database and a validation node builds every figure before the model ever sees it.
The 15% margin, the 95 CHF/h labour, the 45 CHF travel and the 8.1% VAT belong in that same place, configuration rather than prompt, so you can change a rate without anyone touching a workflow.
On the prototype: tell me which of the three suppliers to start with, and send me a sample of that catalog (even 30 lines) plus two or three real requests in French. I will send back something you can run yourself, a French request in and a PDF quote out, with exact references matched and missing items flagged instead of invented. That is the part worth testing, and everything else depends on it.
Where I am honest with you: I work in English, Portuguese and Spanish, not French. The model handles French input fine, but I cannot judge whether the technical wording of a quote reads right to a Swiss plumber, so someone on your side should sign off on that. And I have never worked with these three catalogs before.
Background: 31 n8n workflows in production, self-hosted, Postgres for state, plus a watchdog workflow that checks the others every 15 minutes and alerts before the client notices anything.